/
index.html
1080 lines (1014 loc) · 76.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>PSML - Python Solid Modeling Library — PSML documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="body" role="main">
<div class="section" id="module-psml">
<span id="psml-python-solid-modeling-library"></span><h1>PSML - Python Solid Modeling Library<a class="headerlink" href="#module-psml" title="Permalink to this headline">¶</a></h1>
<p>a library for generating <a class="reference external" href="https://www.openscad.org/">OpenSCAD</a> 3D models</p>
<p><a class="reference external" href="https://www.github.com/wovo/psml">https://www.github.com/wovo/psml</a></p>
<p>(c) Wouter van Ooijen (<a class="reference external" href="mailto:wouter.vanooijen%40hu.nl">wouter<span>.</span>vanooijen<span>@</span>hu<span>.</span>nl</a>)</p>
<p>Distributed under the Boost Software License, Version 1.0.</p>
<hr class="docutils" />
<p>This is a Python library (Python 3 required) for writing
3D model code that can be rendered and processed by <a class="reference external" href="https://www.openscad.org/">OpenSCAD</a>.</p>
<p>The library has a vector class.
A vector holds x, y and (optional) z numeric values.
A vector is used to specify (in 2D or 3D) a size,
a location, or a displacement, or sometimes just to hold 2 or 3 values.
A vector can be created from two or three values.
Two vectors can be added or subtracted.
A vector can multiplied with or divided by a numeric value.
When a function requires a vector, it can in most
cases be specified either by a vector value, or as 2 or 3
individual numeric parameters.</p>
<p>This library creates and manipulates 3D solid objects.
The image below shows the basic solid objects:
box, cylinder, cone, and sphere.</p>
<div class="figure align-default">
<img alt="_images/intro_bccs_128.png" src="_images/intro_bccs_128.png" />
</div>
<p>Basic flat (2D) objects are rectangle, circle, polygon, and text,
as shown in the next image.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/intro_rcpt_512.png"><img alt="_images/intro_rcpt_128.png" src="_images/intro_rcpt_128.png" /></a>
</div>
<p>A flat object can be extended into a solid object
by extruding it (in the z direction), while
optionally twisting it around the z axis in the process.
The cross shown below was extruded and twisted while
it was at the origin. The right circle was extruded and twisted
while it was just to the right of the origin.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/intro_extrude_512.png"><img alt="_images/intro_extrude_128.png" src="_images/intro_extrude_128.png" /></a>
</div>
<p>Objects and be added, subtracted and intersected
with the operators +, - and *.
The image below shows two separate cylinders, the addition of
these two cylinders, the second cylinder subtracted from the
first one, and the intersection of the two.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/intro_asi_512.png"><img alt="_images/intro_asi_128.png" src="_images/intro_asi_128.png" /></a>
</div>
<p>Manipulators can be applied to an object with the ** (power) operator.
Basic manipulators are vector, rotate, mirror, scale and resize.
The example below show an object unchanged, , shifted up,
rotated along the x axis, mirrored in the y-z plane (note the eyes),
scaled (by 2 in the y and z directions), and resized
(to fit in a cube).</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/intro_vrmsr_512.png"><img alt="_images/intro_vrmsr_128.png" src="_images/intro_vrmsr_128.png" /></a>
</div>
<p>The repeat2, repeat4 and repeat8 manipulators repeat their subject.
Repeat2 does this at the original location,
and shifted by the specified vector.
Repeat4 does this at the 4 corners of the rectangle
specified by the vector.
Repeat8 does this at the 8 corners of the box
specified by the vector.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/intro_repeat1_512.png"><img alt="_images/intro_repeat1_128.png" src="_images/intro_repeat1_128.png" /></a>
</div>
<p>The negative manipulator creates a dominant emptiness from its subject.
The image below shows at the left the addition of two normal pipes.
The result is not a usable pipe crossing because the walls of each
pipe will block the other pipe.
In the middle it shows the addition of two pipes of which the empty
interior is dominant. This produces a ‘successful’ pipe crossing.
But this also removes part of the vertical axle.
At the right the crossing was first made positive, which
reduces the dominant emptiness to an normal, and then the
vertical axle was added.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/intro_negatives1_512.png"><img alt="_images/intro_negatives1_128.png" src="_images/intro_negatives1_128.png" /></a>
</div>
<p>In the code examples solid objects are created.
What is not show is that such an object must be written to a
file to be processed by OpenSCAD, using a write() call.</p>
<p>This documentation is meant to be usable on its own,
without having to read the OpenSCAD documentation,
hence it is worded as if the library provides all the
functionality, while in fact it is in most cases just a thin layer
on top of the OpenSCAD language.</p>
<p>Some OpenSCAD features are not directly available in the library.
To compensate, a solid can be created from a string, which
is passed directly to OpenSCAD.
Likewise, a manipulator can be constructed from a lambda, which
gets the string representation of its subject as parameter.</p>
<p>The library has type hints.
The examples use <a class="reference external" href="https://pypi.org/project/typeguard/">typeguard</a> to check these hints.</p>
<hr class="docutils" />
<dl class="function">
<dt id="psml.apply">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">apply</code><span class="sig-paren">(</span><em class="sig-param">text: str, subject: Optional[shape]</em><span class="sig-paren">)</span> → Optional[shape]<a class="headerlink" href="#psml.apply" title="Permalink to this definition">¶</a></dt>
<dd><p>apply an OpenSCAD operation to a shape</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>text</strong> – the text of the OpenSCAD operation</p></li>
<li><p><strong>subject</strong> – the shape to which the operation is applied</p></li>
</ul>
</dd>
</dl>
<p>This function applies an OpenSCAD operation to a shape.
This can be useful for OpenSCAD operations that are not
otherwise available in the library.</p>
<p>For convenience, single quotes in the text are replaced by
double quotes (OpenSCAD uses double quotes).</p>
<p>Coloring and translation are available in the library,
but could be done with OpenSCAD functions as shown in the example.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_apply1_512.png"><img alt="_images/example_apply1_128.png" src="_images/example_apply1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">apply</span><span class="p">(</span> <span class="s2">"translate([10,0,0]) color('red')"</span><span class="p">,</span> <span class="n">box</span><span class="p">(</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">3</span> <span class="p">)</span> <span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.back">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">back</code><span class="sig-paren">(</span><em class="sig-param">v: float</em><span class="sig-paren">)</span> → psml.vector<a class="headerlink" href="#psml.back" title="Permalink to this definition">¶</a></dt>
<dd><p>vector that shifts back (away from you along the y axis) by v</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>v</strong> – the shift distance</p>
</dd>
</dl>
<p>Return vector( 0, v, 0 ):
a vector with y set to v, and x and z to 0.</p>
</dd></dl>
<dl class="function">
<dt id="psml.box">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">box</code><span class="sig-paren">(</span><em class="sig-param">x: Union[float, vector], y: Optional[float] = None, z: Optional[float] = None, rounding: float = 0</em><span class="sig-paren">)</span> → psml.shape<a class="headerlink" href="#psml.box" title="Permalink to this definition">¶</a></dt>
<dd><p>box shape</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>x</strong> – x size, or a vector which specifies all 3 sizes</p></li>
<li><p><strong>y</strong> – y size (omit when x is a vector)</p></li>
<li><p><strong>z</strong> – z size (omit when x is a vector)</p></li>
<li><p><strong>rounding</strong> – rounding radius (default: no rounding)</p></li>
</ul>
</dd>
</dl>
<p>The size of the box can be specified either by
three values x, y and z, or by a vector.
The box has its lower-left corner at the origin.
The rounding specifies the radius of the rounding
at the corners and edges.
The default rounding is 0, which yields sharp boundaries.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_box1_512.png"><img alt="_images/example_box1_128.png" src="_images/example_box1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">box</span><span class="p">(</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">10</span> <span class="p">)</span>
</pre></div>
</div>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_box2_512.png"><img alt="_images/example_box2_128.png" src="_images/example_box2_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">box</span><span class="p">(</span> <span class="n">vector</span><span class="p">(</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">10</span> <span class="p">),</span> <span class="n">rounding</span> <span class="o">=</span> <span class="mi">2</span> <span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.circle">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">circle</code><span class="sig-paren">(</span><em class="sig-param">*</em>, <em class="sig-param">radius: Optional[float] = None</em>, <em class="sig-param">diameter: Optional[float] = None</em>, <em class="sig-param">facets: Optional[float] = None</em><span class="sig-paren">)</span> → psml.shape<a class="headerlink" href="#psml.circle" title="Permalink to this definition">¶</a></dt>
<dd><p>circle shape</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>radius</strong> – the radius of the circle</p></li>
<li><p><strong>diameter</strong> – the diameter of the circle</p></li>
<li><p><strong>facets</strong> – number of circle facets</p></li>
</ul>
</dd>
</dl>
<p>The size of the circle is specified by either
its radius or its diameter.
The circle is in the x-y plane, with its center at the origin.
Optionally, the number of circle facets can be specified.
The default is the global variable number_of_circle_facets.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_circle1_512.png"><img alt="_images/example_circle1_128.png" src="_images/example_circle1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">circle</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">20</span> <span class="p">)</span>
</pre></div>
</div>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_circle2_512.png"><img alt="_images/example_circle2_128.png" src="_images/example_circle2_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">circle</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">20</span><span class="p">,</span> <span class="n">facets</span> <span class="o">=</span> <span class="mi">5</span> <span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.color">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">color</code><span class="sig-paren">(</span><em class="sig-param">r: Union[float, vector], g: Optional[float] = None, b: Optional[float] = None, alpha: float = 1.0</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.color" title="Permalink to this definition">¶</a></dt>
<dd><p>a color in RGB format</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>r</strong> – the r of the vector, or the full color vector</p></li>
<li><p><strong>g</strong> – (optional) the g of the color</p></li>
<li><p><strong>b</strong> – (optional) the b of the color</p></li>
<li><p><strong>alpha</strong> – (optional) the alpha value (opacity)</p></li>
</ul>
</dd>
</dl>
<p>The color is either specified as a single vector
parameter, or as separate r, g and b values.
When a single vector is specified, and alpha value
(if present) must be named parameter.</p>
<p>The individual color values must be in the range 0..255.</p>
<p>An alpha of 0 is full transparency, a value of 1 is a solid color.
A lower alpha makes the object more faintly colored.
It does not make it opaque (translucent).</p>
<p>Colors are visible in OpenSCAD preview, but NOT in after
rendering. Hence the examples below show previews, unlike
the other examples, which show the result of rendering.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_color1_512.png"><img alt="_images/example_color1_128.png" src="_images/example_color1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">color</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span> <span class="p">)</span> <span class="o">**</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span> <span class="p">)</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">30</span> <span class="p">)</span> <span class="o">**</span> <span class="n">color</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mf">0.5</span> <span class="p">)</span> <span class="o">**</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span> <span class="p">)</span> <span class="o">+</span>
<span class="n">back</span><span class="p">(</span> <span class="mi">20</span> <span class="p">)</span> <span class="o">**</span> <span class="n">color</span><span class="p">(</span> <span class="n">vector</span><span class="p">(</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span> <span class="p">),</span> <span class="n">alpha</span> <span class="o">=</span> <span class="mi">1</span> <span class="p">)</span> <span class="o">**</span> <span class="n">box</span><span class="p">(</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">10</span> <span class="p">)</span>
</pre></div>
</div>
<p>The color names in the World Wide Web consortium’s SVG color list
are available, both with PascalCase and in lowercase.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_color2_512.png"><img alt="_images/example_color2_128.png" src="_images/example_color2_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">MediumVioletRed</span> <span class="o">**</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span> <span class="p">)</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">30</span> <span class="p">)</span> <span class="o">**</span> <span class="n">blue</span> <span class="o">**</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span> <span class="p">)</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">60</span> <span class="p">)</span> <span class="o">**</span> <span class="n">mediumspringgreen</span> <span class="o">**</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span> <span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.cone">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">cone</code><span class="sig-paren">(</span><em class="sig-param">height: Union[float</em>, <em class="sig-param">vector</em>, <em class="sig-param">None] = None</em>, <em class="sig-param">*</em>, <em class="sig-param">radius1: Optional[float] = None</em>, <em class="sig-param">diameter1: Optional[float] = None</em>, <em class="sig-param">radius2: Optional[float] = None</em>, <em class="sig-param">diameter2: Optional[float] = None</em>, <em class="sig-param">facets: Optional[float] = None</em><span class="sig-paren">)</span> → psml.shape<a class="headerlink" href="#psml.cone" title="Permalink to this definition">¶</a></dt>
<dd><p>cone shape</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>height</strong> – the height of the cone,
or a vector that specifies the height and the two radiuses</p></li>
<li><p><strong>radius1</strong> – the radius of the cone at its bottom,</p></li>
<li><p><strong>radius2</strong> – the radius of the cone at its top</p></li>
<li><p><strong>diameter1</strong> – the diameter of the cone at its bottom,</p></li>
<li><p><strong>diameter2</strong> – the diameter of the cone at its top</p></li>
<li><p><strong>facets</strong> – number of circle facets</p></li>
</ul>
</dd>
</dl>
<p>The size of the cone is specified by its height,
its the radius or diameter at its base,
and its radius or diameter at its top.</p>
<p>Optionally, the number of circle facets can be specified.
The default is the global variable number_of_circle_facets.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_cone1_512.png"><img alt="_images/example_cone1_128.png" src="_images/example_cone1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cone</span><span class="p">(</span> <span class="n">radius1</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="n">radius2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">height</span> <span class="o">=</span> <span class="mi">20</span> <span class="p">)</span> \
<span class="o">+</span> <span class="n">right</span><span class="p">(</span> <span class="mi">35</span> <span class="p">)</span> <span class="o">**</span> <span class="n">cone</span><span class="p">(</span> <span class="n">vector</span><span class="p">(</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">10</span> <span class="p">))</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.cylinder">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">cylinder</code><span class="sig-paren">(</span><em class="sig-param">height: Union[float</em>, <em class="sig-param">vector</em>, <em class="sig-param">None] = None</em>, <em class="sig-param">*</em>, <em class="sig-param">radius: Optional[float] = None</em>, <em class="sig-param">diameter: Optional[float] = None</em>, <em class="sig-param">rounded_top: bool = False</em>, <em class="sig-param">facets: Optional[float] = None</em><span class="sig-paren">)</span> → psml.shape<a class="headerlink" href="#psml.cylinder" title="Permalink to this definition">¶</a></dt>
<dd><p>cylinder shape</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>height</strong> – the height of the cylinder,
or a vector that specifies the height and the radius</p></li>
<li><p><strong>radius</strong> – the radius of the cylinder</p></li>
<li><p><strong>diameter</strong> – the diameter of the circle</p></li>
<li><p><strong>rounded_top</strong> – whether the top is rounded (default: not)</p></li>
<li><p><strong>facets</strong> – number of circle facets</p></li>
</ul>
</dd>
</dl>
<p>The size of the cylinder is specified by its the radius
at its base, and its height.</p>
<p>Optionally, the number of circle facets can be specified.
The default is the global variable number_of_circle_facets.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_cylinder1_512.png"><img alt="_images/example_cylinder1_128.png" src="_images/example_cylinder1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cylinder</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="n">height</span> <span class="o">=</span> <span class="mi">20</span> <span class="p">)</span> \
<span class="o">+</span> <span class="n">right</span><span class="p">(</span> <span class="mi">35</span> <span class="p">)</span> <span class="o">**</span> <span class="n">cylinder</span><span class="p">(</span> <span class="n">vector</span><span class="p">(</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span> <span class="p">))</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.down">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">down</code><span class="sig-paren">(</span><em class="sig-param">v: float</em><span class="sig-paren">)</span> → psml.vector<a class="headerlink" href="#psml.down" title="Permalink to this definition">¶</a></dt>
<dd><p>vector that shifts down (along the z axis) by v</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>v</strong> – the shift distance</p>
</dd>
</dl>
<p>Return vector( 0, 0, -v ):
a vector with z set to v, and x and y to 0.</p>
</dd></dl>
<dl class="function">
<dt id="psml.dup2">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">dup2</code><span class="sig-paren">(</span><em class="sig-param">v: float</em><span class="sig-paren">)</span> → psml.vector<a class="headerlink" href="#psml.dup2" title="Permalink to this definition">¶</a></dt>
<dd><p>vector( v, v )</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>v</strong> – the value for x and y</p>
</dd>
</dl>
<p>Return a vector with both x and y set to v.</p>
</dd></dl>
<dl class="function">
<dt id="psml.dup3">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">dup3</code><span class="sig-paren">(</span><em class="sig-param">v: float</em><span class="sig-paren">)</span> → psml.vector<a class="headerlink" href="#psml.dup3" title="Permalink to this definition">¶</a></dt>
<dd><p>vector( v, v, v )</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>v</strong> – the value for x, y and z</p>
</dd>
</dl>
<p>Return a vector with x, y and z set to v.</p>
</dd></dl>
<dl class="function">
<dt id="psml.extrude">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">extrude</code><span class="sig-paren">(</span><em class="sig-param">height: float</em>, <em class="sig-param">twist: float = 0</em>, <em class="sig-param">scale: float = 1</em>, <em class="sig-param">facets: Optional[int] = None</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.extrude" title="Permalink to this definition">¶</a></dt>
<dd><p>extrude operator: extend a 2d object in the z direction</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>height</strong> – the height over which the object will be extruded</p></li>
<li><p><strong>twist</strong> – the degrees over which the object is rotated along
the z axis over its extrusion height (default: 0)</p></li>
<li><p><strong>scale</strong> – the scaling determines the relative size of the object
at its maximum extrusion height</p></li>
<li><p><strong>facets</strong> – number of steps used in the extrusion</p></li>
</ul>
</dd>
</dl>
<p>Optionally, the number of steps can be specified.
The default is the global variable number_of_extrude_facets.</p>
</dd></dl>
<dl class="function">
<dt id="psml.facets">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">facets</code><span class="sig-paren">(</span><em class="sig-param">numer_of_facets: int</em><span class="sig-paren">)</span> → None<a class="headerlink" href="#psml.facets" title="Permalink to this definition">¶</a></dt>
<dd><p>accuracy (number of facets) of circles, spheres and fonts</p>
<p>The default setting (32) is a compromise between speed and accuracy.</p>
<p>For quick rendering of complex designs
a lower value (10, or even 5) might be appropriate.</p>
<p>This function has effect on shapes that are created
after its call, so better call it before you create any elements.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_facets1_512.png"><img alt="_images/example_facets1_128.png" src="_images/example_facets1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cylinder</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="n">height</span> <span class="o">=</span> <span class="mi">20</span> <span class="p">)</span> \
<span class="o">+</span> <span class="n">vector</span><span class="p">(</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span> <span class="p">)</span> <span class="o">**</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span> <span class="p">)</span>
</pre></div>
</div>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_facets2_512.png"><img alt="_images/example_facets2_128.png" src="_images/example_facets2_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">facets</span><span class="p">(</span> <span class="mi">9</span> <span class="p">)</span>
<span class="n">cylinder</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="n">height</span> <span class="o">=</span> <span class="mi">20</span> <span class="p">)</span> \
<span class="o">+</span> <span class="n">vector</span><span class="p">(</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span> <span class="p">)</span> <span class="o">**</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span> <span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.front">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">front</code><span class="sig-paren">(</span><em class="sig-param">v: float</em><span class="sig-paren">)</span> → psml.vector<a class="headerlink" href="#psml.front" title="Permalink to this definition">¶</a></dt>
<dd><p>vector that shifts to the front (towards you along the y axis) by v</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>v</strong> – the shift distance</p>
</dd>
</dl>
<p>Return vector( 0, -v, 0 ):
a vector with y set to -v, and x and z to 0.</p>
</dd></dl>
<dl class="function">
<dt id="psml.hollow_box">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">hollow_box</code><span class="sig-paren">(</span><em class="sig-param">size: psml.vector</em>, <em class="sig-param">walls</em>, <em class="sig-param">rounding=0</em><span class="sig-paren">)</span> → psml.shape<a class="headerlink" href="#psml.hollow_box" title="Permalink to this definition">¶</a></dt>
<dd><p>a hollow box</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>size</strong> – size of the box (x, y, z )</p></li>
<li><p><strong>walls</strong> – wall thickness</p></li>
<li><p><strong>rounding</strong> – rounding diameter (default: no rounding)</p></li>
</ul>
</dd>
</dl>
<p>This is a hollow project enclosure box,
Use screw_and_nut_column() to place screw holes and recesses.
Use split() to separate it into a top and a bottom part.
(Or use project_enclosure() which does these things for you.)</p>
</dd></dl>
<dl class="data">
<dt id="psml.hull">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">hull</code><em class="property"> = <psml.modifier object></em><a class="headerlink" href="#psml.hull" title="Permalink to this definition">¶</a></dt>
<dd><p>convex hull</p>
<p>This manipulator creates the convex hull around its subject,
which can be 2D or 3D.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_hull1_512.png"><img alt="_images/example_hull1_128.png" src="_images/example_hull1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="o">=</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span> <span class="p">)</span> <span class="o">+</span> <span class="n">vector</span><span class="p">(</span> <span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">15</span> <span class="p">)</span> <span class="o">**</span> <span class="n">box</span><span class="p">(</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">6</span> <span class="p">)</span>
<span class="n">x</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">30</span> <span class="p">)</span> <span class="o">**</span> <span class="n">hull</span> <span class="o">**</span> <span class="n">x</span>
</pre></div>
</div>
</dd></dl>
<dl class="data">
<dt id="psml.identity">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">identity</code><em class="property"> = <psml.vector object></em><a class="headerlink" href="#psml.identity" title="Permalink to this definition">¶</a></dt>
<dd><p>modifier that doesn’t change its subject</p>
</dd></dl>
<dl class="function">
<dt id="psml.left">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">left</code><span class="sig-paren">(</span><em class="sig-param">v: float</em><span class="sig-paren">)</span> → psml.vector<a class="headerlink" href="#psml.left" title="Permalink to this definition">¶</a></dt>
<dd><p>vector that shifts left (along the x axis) by v</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>v</strong> – the shift distance</p>
</dd>
</dl>
<p>Return vector( -v, 0, 0 ):
a vector with x set to -v, and y and z to 0.</p>
</dd></dl>
<dl class="class">
<dt id="psml.m_screw">
<em class="property">class </em><code class="sig-prename descclassname">psml.</code><code class="sig-name descname">m_screw</code><span class="sig-paren">(</span><em class="sig-param">diameter</em>, <em class="sig-param">thread</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.m_screw" title="Permalink to this definition">¶</a></dt>
<dd><p>a metric (m3 etc.) screw</p>
</dd></dl>
<dl class="data">
<dt id="psml.minkowski">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">minkowski</code><em class="property"> = <psml.modifier object></em><a class="headerlink" href="#psml.minkowski" title="Permalink to this definition">¶</a></dt>
<dd><p>minkowski sum</p>
<p>This modifier computes the Minkowski sum of two or more
2D or 3D objects. It must be applied to a sum of objects.
When it is applied to something else (for instance
the result of applying a modifier) it is a no-op.</p>
<blockquote>
<div><div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_minkowski1_512.png"><img alt="_images/example_minkowski1_128.png" src="_images/example_minkowski1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="o">=</span> <span class="n">circle</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">5</span> <span class="p">)</span> <span class="o">+</span> <span class="n">rectangle</span><span class="p">(</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span> <span class="p">)</span> <span class="o">+</span> <span class="n">rectangle</span><span class="p">(</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">40</span> <span class="p">)</span>
<span class="n">m</span><span class="o">.</span><span class="n">write</span><span class="p">()</span>
</pre></div>
</div>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_minkowski2_512.png"><img alt="_images/example_minkowski2_128.png" src="_images/example_minkowski2_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="o">=</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">2</span> <span class="p">)</span> <span class="o">+</span> <span class="n">box</span><span class="p">(</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">5</span> <span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="n">right</span><span class="p">(</span> <span class="mi">20</span> <span class="p">)</span> <span class="o">**</span> <span class="n">minkowski</span> <span class="o">**</span> <span class="n">x</span>
</pre></div>
</div>
</div></blockquote>
</dd></dl>
<dl class="function">
<dt id="psml.mirror">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">mirror</code><span class="sig-paren">(</span><em class="sig-param">x: Union[float, vector], y: Optional[float] = None, z: Optional[float] = None</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.mirror" title="Permalink to this definition">¶</a></dt>
<dd><p>mirror operator: mirror an object in a planes</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>x</strong> – the x of the vector, or the full vector</p></li>
<li><p><strong>y</strong> – (optional) the y of the vector</p></li>
<li><p><strong>z</strong> – (optional) the z of the vector</p></li>
</ul>
</dd>
</dl>
<p>This modifier mirrors its subject in a plane through the origin.
The plane is specified by its normal vector (the vector
that is perpendicular to the mirror plane).</p>
<p>The vector is either specified as a single vector
parameter, or as separate x, y and z values.</p>
<p>The example shows a text, the same text mirrored in the
y-z plane, mirrored in the x-z plane, and mirrored in the x-y plane.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_mirror1_512.png"><img alt="_images/example_mirror1_128.png" src="_images/example_mirror1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="o">=</span> <span class="n">extrude</span><span class="p">(</span> <span class="mi">4</span> <span class="p">)</span> <span class="o">**</span> <span class="n">text</span><span class="p">(</span> <span class="s2">"Hello"</span><span class="p">,</span> <span class="n">height</span> <span class="o">=</span> <span class="mi">10</span> <span class="p">)</span>
<span class="n">x</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">70</span> <span class="p">)</span> <span class="o">**</span> <span class="n">mirror</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> <span class="p">)</span> <span class="o">**</span> <span class="n">x</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">80</span> <span class="p">)</span> <span class="o">**</span> <span class="n">mirror</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span> <span class="p">)</span> <span class="o">**</span> <span class="n">x</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">120</span> <span class="p">)</span> <span class="o">**</span> <span class="n">mirror</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span> <span class="p">)</span> <span class="o">**</span> <span class="n">x</span>
</pre></div>
</div>
</dd></dl>
<dl class="class">
<dt id="psml.modifier">
<em class="property">class </em><code class="sig-prename descclassname">psml.</code><code class="sig-name descname">modifier</code><span class="sig-paren">(</span><em class="sig-param">function</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.modifier" title="Permalink to this definition">¶</a></dt>
<dd><p>modifier that can be applied by **</p>
<p>A modifier is an object that can be applied to its
subject, a shape, using the ** operator.
A modifier is constructed by providing the function that
is to be applied.</p>
<p>The subject can be None instead of a shape,
in which case the result will also be None.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_modifier1_512.png"><img alt="_images/example_modifier1_128.png" src="_images/example_modifier1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">right10</span> <span class="o">=</span> <span class="n">modifier</span><span class="p">(</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">s</span> <span class="o">+</span> <span class="n">vector</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span> <span class="p">)</span> <span class="o">**</span> <span class="n">s</span> <span class="p">)</span>
<span class="n">right10</span> <span class="o">**</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">6</span> <span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="data">
<dt id="psml.negative">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">negative</code><em class="property"> = <psml.modifier object></em><a class="headerlink" href="#psml.negative" title="Permalink to this definition">¶</a></dt>
<dd><p>makes its subject a dominant negative</p>
<p>This manipulator makes its subject a dominant negative:
something that will not be filled.</p>
</dd></dl>
<dl class="function">
<dt id="psml.polygon">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">polygon</code><span class="sig-paren">(</span><em class="sig-param">points: Iterable[Union[vector, Tuple[float, float]]]</em><span class="sig-paren">)</span> → psml.shape<a class="headerlink" href="#psml.polygon" title="Permalink to this definition">¶</a></dt>
<dd><p>polygon shape</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>points</strong> – a list of 2d vectors or value pairs</p>
</dd>
</dl>
<p>A polygon is defined by the list of its edge points.
Each edge point can be specified by either a
vector or a pair of values.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_polygon1_512.png"><img alt="_images/example_polygon1_128.png" src="_images/example_polygon1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">polygon</span><span class="p">(</span> <span class="p">[</span>
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> <span class="p">],</span> <span class="p">[</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">0</span> <span class="p">],</span> <span class="p">[</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span> <span class="p">],</span> <span class="p">[</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">2</span> <span class="p">],</span>
<span class="p">[</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span> <span class="p">],</span> <span class="p">[</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span> <span class="p">],</span> <span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">3</span> <span class="p">],</span> <span class="p">[</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span> <span class="p">]</span> <span class="p">]</span> <span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="data">
<dt id="psml.positive">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">positive</code><em class="property"> = <psml.modifier object></em><a class="headerlink" href="#psml.positive" title="Permalink to this definition">¶</a></dt>
<dd><p>removes dominant negatives</p>
<p>The positive manipulator subtracts and removes
the dominant emptinesses in its subject, so an
solid can be placed in the space of what was a dominant emptiness.</p>
</dd></dl>
<dl class="function">
<dt id="psml.project_enclosure">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">project_enclosure</code><span class="sig-paren">(</span><em class="sig-param">size</em>, <em class="sig-param">walls</em>, <em class="sig-param">rounding=0</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.project_enclosure" title="Permalink to this definition">¶</a></dt>
<dd><p>a simple 2-part project enclosure</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>size</strong> – outer size of the enclosure (x, y, z )</p></li>
<li><p><strong>walls</strong> – wall thickness</p></li>
<li><p><strong>rounding</strong> – rounding diameter (default: no rounding)</p></li>
</ul>
</dd>
</dl>
<p>This is a simple 2-part project enclosure box.</p>
</dd></dl>
<dl class="function">
<dt id="psml.rectangle">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">rectangle</code><span class="sig-paren">(</span><em class="sig-param">x: Union[float, vector], y: Optional[float] = None, rounding: float = 0</em><span class="sig-paren">)</span> → psml.shape<a class="headerlink" href="#psml.rectangle" title="Permalink to this definition">¶</a></dt>
<dd><p>rectangle shape</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>x</strong> – x size, or a vector which specifies both sizes</p></li>
<li><p><strong>y</strong> – y size (omit when x is a vector)</p></li>
<li><p><strong>rounding</strong> – rounding radius (default: no rounding)</p></li>
</ul>
</dd>
</dl>
<p>The size of the rectangle can be specified either by
two values x and y, or by a vector.
The rectangle has its lower-left corner at the origin.
The rounding specifies the radius of the rounding
at the corners and edges.
The default rounding is 0, which yields sharp boundaries.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_rectangle1_512.png"><img alt="_images/example_rectangle1_128.png" src="_images/example_rectangle1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">rectangle</span><span class="p">(</span> <span class="n">vector</span><span class="p">(</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span> <span class="p">),</span> <span class="n">rounding</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">)</span>
<span class="c1"># or rectangle( 20, 30 )</span>
</pre></div>
</div>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_rectangle2_512.png"><img alt="_images/example_rectangle2_128.png" src="_images/example_rectangle2_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">rectangle</span><span class="p">(</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">3</span> <span class="p">)</span>
<span class="c1"># or rectangle( shift( 20, 30 ), rounding = 3 )</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.repeat2">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">repeat2</code><span class="sig-paren">(</span><em class="sig-param">x: Union[float, vector], y: Optional[float] = None, z: Optional[float] = None</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.repeat2" title="Permalink to this definition">¶</a></dt>
<dd><p>repeat at two positions</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>x</strong> – the x of the vector, or the full vector</p></li>
<li><p><strong>y</strong> – (optional) the y of the vector</p></li>
<li><p><strong>z</strong> – (optional) the z of the vector</p></li>
</ul>
</dd>
</dl>
<p>The vector is either specified as a single vector
parameter, or as separate x, y and z values.</p>
<p>This manipulator repeats its subject twice:
once at its original location,
and once shifted by the specified vector.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_repeat2_512.png"><img alt="_images/example_repeat2_128.png" src="_images/example_repeat2_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">repeat2</span><span class="p">(</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">10</span> <span class="p">)</span> <span class="o">**</span> <span class="n">cylinder</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span> <span class="n">height</span> <span class="o">=</span> <span class="mi">10</span> <span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.repeat4">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">repeat4</code><span class="sig-paren">(</span><em class="sig-param">x: Union[float, vector], y: Optional[float] = None</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.repeat4" title="Permalink to this definition">¶</a></dt>
<dd><p>repeat at four positions</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>x</strong> – the x of the vector, or the full vector</p></li>
<li><p><strong>y</strong> – (optional) the y of the vector</p></li>
</ul>
</dd>
</dl>
<p>The vector is either specified as a single vector
parameter, or as separate x and y values.</p>
<p>This manipulator repeats its subject at the
four corners of the rectangle specified by the parameters.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_repeat4_512.png"><img alt="_images/example_repeat4_128.png" src="_images/example_repeat4_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">repeat4</span><span class="p">(</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span> <span class="p">)</span> <span class="o">**</span> <span class="n">box</span><span class="p">(</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span> <span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.repeat8">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">repeat8</code><span class="sig-paren">(</span><em class="sig-param">x: Union[float, vector], y: Optional[float] = None, z: Optional[float] = None</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.repeat8" title="Permalink to this definition">¶</a></dt>
<dd><p>repeat at eight positions</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>x</strong> – the x of the vector, or the full vector</p></li>
<li><p><strong>y</strong> – (optional) the y of the vector</p></li>
<li><p><strong>z</strong> – (optional) the z of the vector</p></li>
</ul>
</dd>
</dl>
<p>The vector is either specified as a single vector
parameter, or as separate x, y and z values.</p>
<p>This manipulator repeats its subject at the corners
of the box specified by the parameters.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_repeat8_512.png"><img alt="_images/example_repeat8_128.png" src="_images/example_repeat8_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">repeat8</span><span class="p">(</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">8</span> <span class="p">)</span> <span class="o">**</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">3</span> <span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.resize">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">resize</code><span class="sig-paren">(</span><em class="sig-param">x: Union[float, vector], y: Optional[float] = None, z: Optional[float] = None</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.resize" title="Permalink to this definition">¶</a></dt>
<dd><p>resize operator: resize an object</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>x</strong> – the x of the vector, or the full vector</p></li>
<li><p><strong>y</strong> – (optional) the y of the vector</p></li>
<li><p><strong>z</strong> – (optional) the z of the vector</p></li>
</ul>
</dd>
</dl>
<p>The vector is either specified as a single vector
parameter, or as separate x, y and z values.</p>
<p>This manipulator resizes its subject to the sizes
indicated for the x, y and z direction.
A size of 0 keeps the size (in that direction) unchanged.
A size of None scales the size in that direction
with another non-0 non-None size.</p>
<p>The example below shows a text, and
the same text scaled to fit in a 30 by 10 rectangle.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_resize1_512.png"><img alt="_images/example_resize1_128.png" src="_images/example_resize1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">t</span> <span class="o">=</span> <span class="n">text</span><span class="p">(</span> <span class="s2">"hello world"</span> <span class="p">)</span>
<span class="n">t</span> <span class="o">+</span> <span class="n">back</span><span class="p">(</span> <span class="mi">10</span> <span class="p">)</span> <span class="o">**</span> <span class="n">resize</span><span class="p">(</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">10</span> <span class="p">)</span> <span class="o">**</span> <span class="n">t</span>
</pre></div>
</div>
<p>The example below shows a sphere, and
the same sphere scaled to size 40 in the x direction,
unchanged (size 10) ijn the y direction,
and z matching the x direction (scaled to 40).</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_resize2_512.png"><img alt="_images/example_resize2_128.png" src="_images/example_resize2_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">s</span> <span class="o">=</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span> <span class="p">)</span>
<span class="n">s</span> <span class="o">+</span> <span class="n">right</span><span class="p">(</span> <span class="mi">40</span> <span class="p">)</span> <span class="o">**</span> <span class="n">resize</span><span class="p">(</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span> <span class="p">)</span> <span class="o">**</span> <span class="n">s</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.right">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">right</code><span class="sig-paren">(</span><em class="sig-param">v: float</em><span class="sig-paren">)</span> → psml.vector<a class="headerlink" href="#psml.right" title="Permalink to this definition">¶</a></dt>
<dd><p>vector that shifts right (along the x axis) by v</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>v</strong> – the shift distance</p>
</dd>
</dl>
<p>Return the vector( v, 0, 0 ):
a vector with x set to v, and y and z to 0.</p>
</dd></dl>
<dl class="function">
<dt id="psml.rotate">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">rotate</code><span class="sig-paren">(</span><em class="sig-param">x: Union[float, vector], y: Optional[float] = None, z: Optional[float] = None</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.rotate" title="Permalink to this definition">¶</a></dt>
<dd><p>rotate operator: rotate an object around one or more axises</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>x</strong> – the x of the vector, or the full vector</p></li>
<li><p><strong>y</strong> – (optional) the y of the vector</p></li>
<li><p><strong>z</strong> – (optional) the z of the vector</p></li>
</ul>
</dd>
</dl>
<p>The vector is either specified as a single vector
parameter, or as separate x, y and z values.</p>
<p>This manipulator rotates its object along one or more axises,
by the specified amount in degrees.</p>
<p>The example below shows an object, and the same objects
rotated 45 degrees, first along the x axis, then along
the y axis, and lastly along the z axis.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_rotate1_512.png"><img alt="_images/example_rotate1_128.png" src="_images/example_rotate1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">c</span> <span class="o">=</span> <span class="n">cylinder</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="n">height</span> <span class="o">=</span> <span class="mi">30</span> <span class="p">)</span> <span class="o">+</span> <span class="n">vector</span><span class="p">(</span> <span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="o">-</span><span class="mi">20</span><span class="p">,</span> <span class="mi">0</span> <span class="p">)</span> \
<span class="o">**</span> <span class="n">box</span><span class="p">(</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">5</span> <span class="p">)</span>
<span class="n">m</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">c</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">30</span> <span class="p">)</span> <span class="o">**</span> <span class="n">rotate</span><span class="p">(</span> <span class="mi">45</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> <span class="p">)</span> <span class="o">**</span> <span class="n">c</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">60</span> <span class="p">)</span> <span class="o">**</span> <span class="n">rotate</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">45</span><span class="p">,</span> <span class="mi">0</span> <span class="p">)</span> <span class="o">**</span> <span class="n">c</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">100</span> <span class="p">)</span> <span class="o">**</span> <span class="n">rotate</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">45</span> <span class="p">)</span> <span class="o">**</span> <span class="n">c</span>
<span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.scale">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">scale</code><span class="sig-paren">(</span><em class="sig-param">x: Union[float, vector], y: Optional[float] = None, z: Optional[float] = None</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.scale" title="Permalink to this definition">¶</a></dt>
<dd><p>scale operator: scale an object in one or more directions</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>x</strong> – the x of the vector, or the full vector</p></li>
<li><p><strong>y</strong> – (optional) the y of the vector</p></li>
<li><p><strong>z</strong> – (optional) the z of the vector</p></li>
</ul>
</dd>
</dl>
<p>The vector is either specified as a single vector
parameter, or as separate x, y and z values.</p>
<p>This manipulator scales its subject by the factors
indicated for the x, y and z direction.
A factor of 1 retains the original size,
2 makes it twice at large, etc.</p>
<p>The example below shows a box, and the same box
scaled by 2 in the x direction, scaled by 2 in the y direction,
and scaled by 2 in the z direction.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_scale1_512.png"><img alt="_images/example_scale1_128.png" src="_images/example_scale1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">b</span> <span class="o">=</span> <span class="n">box</span><span class="p">(</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">40</span> <span class="p">)</span>
<span class="n">m</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">b</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">30</span> <span class="p">)</span> <span class="o">**</span> <span class="n">scale</span><span class="p">(</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span> <span class="p">)</span> <span class="o">**</span> <span class="n">b</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">70</span> <span class="p">)</span> <span class="o">**</span> <span class="n">scale</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span> <span class="p">)</span> <span class="o">**</span> <span class="n">b</span> <span class="o">+</span>
<span class="n">right</span><span class="p">(</span> <span class="mi">100</span> <span class="p">)</span> <span class="o">**</span> <span class="n">scale</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span> <span class="p">)</span> <span class="o">**</span> <span class="n">b</span>
<span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.screw_and_nut_column">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">screw_and_nut_column</code><span class="sig-paren">(</span><em class="sig-param">height</em>, <em class="sig-param">screw: psml.m_screw</em>, <em class="sig-param">wall=1</em><span class="sig-paren">)</span> → psml.shape<a class="headerlink" href="#psml.screw_and_nut_column" title="Permalink to this definition">¶</a></dt>
<dd><p>a screw and nut column</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>height</strong> – height of the column</p></li>
<li><p><strong>srew</strong> – screw (specifies diameter and thread lenghth)</p></li>
<li><p><strong>wall</strong> – wall thickness (default 1mm)</p></li>
</ul>
</dd>
</dl>
<p>This is a vertical screw-and-nut column for keeping two parts
of an enclosure together with a flat screw and a hex nut.
It is assumed to be spliced into the top and bottom parts.</p>
</dd></dl>
<dl class="class">
<dt id="psml.shape">
<em class="property">class </em><code class="sig-prename descclassname">psml.</code><code class="sig-name descname">shape</code><span class="sig-paren">(</span><em class="sig-param">positive: str</em>, <em class="sig-param">negative: str = ''</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.shape" title="Permalink to this definition">¶</a></dt>
<dd><p>2D or 3D shape</p>
<p>Shapes can be added, subtracted or intersected by using the
+, - or * operators.</p>
<dl class="method">
<dt id="psml.shape.write">
<code class="sig-name descname">write</code><span class="sig-paren">(</span><em class="sig-param">file_name='output.scad'</em><span class="sig-paren">)</span><a class="headerlink" href="#psml.shape.write" title="Permalink to this definition">¶</a></dt>
<dd><p>write the shape to the specified file</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>file_name</strong> – name of the file</p>
</dd>
</dl>
<p>This function prints the OpenSCAD representation of the
shape to the indicated file (default: output.scad).
That file can be opened in OpenSCAD
for visualization or export as to a .stl file.</p>
<p>If the file_name does not contain a “.”
the suffix “.scad” is appended.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># these lines have the same effect</span>
<span class="n">sphere</span><span class="p">(</span> <span class="mi">10</span> <span class="p">)</span><span class="o">.</span><span class="n">write</span><span class="p">()</span>
<span class="n">sphere</span><span class="p">(</span> <span class="mi">10</span> <span class="p">)</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="s2">"output"</span> <span class="p">)</span>
<span class="n">sphere</span><span class="p">(</span> <span class="mi">10</span> <span class="p">)</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="s2">"output.scad"</span> <span class="p">)</span>
</pre></div>
</div>
</dd></dl>
</dd></dl>
<dl class="function">
<dt id="psml.sphere">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">sphere</code><span class="sig-paren">(</span><em class="sig-param">radius: Optional[float] = None</em>, <em class="sig-param">diameter: Optional[float] = None</em>, <em class="sig-param">facets: Optional[float] = None</em><span class="sig-paren">)</span> → psml.shape<a class="headerlink" href="#psml.sphere" title="Permalink to this definition">¶</a></dt>
<dd><p>sphere shape</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>radius</strong> – the radius of the sphere</p></li>
<li><p><strong>diameter</strong> – the diameter of the sphere</p></li>
<li><p><strong>facets</strong> – number of sphere facets</p></li>
</ul>
</dd>
</dl>
<p>The size of the sphere is specified by either
its radius or its diameter.</p>
<p>Optionally, the number of sphere facets can be specified.
The default is the global variable number_of_sphere_facets.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_sphere1_512.png"><img alt="_images/example_sphere1_128.png" src="_images/example_sphere1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sphere</span><span class="p">(</span> <span class="mi">10</span> <span class="p">)</span> \
<span class="o">+</span> <span class="p">(</span> <span class="n">right</span><span class="p">(</span> <span class="mi">20</span> <span class="p">)</span> <span class="o">**</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">6</span> <span class="p">)</span> <span class="p">)</span> \
<span class="o">+</span> <span class="p">(</span> <span class="n">right</span><span class="p">(</span> <span class="mi">35</span> <span class="p">)</span> <span class="o">**</span> <span class="n">sphere</span><span class="p">(</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">4</span> <span class="p">))</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="psml.split_box">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">split_box</code><span class="sig-paren">(</span><em class="sig-param">b</em>, <em class="sig-param">s</em>, <em class="sig-param">h</em>, <em class="sig-param">d=<psml.vector object></em><span class="sig-paren">)</span><a class="headerlink" href="#psml.split_box" title="Permalink to this definition">¶</a></dt>
<dd><p>split an enclosure in top and bottom parts</p>
<p>This function splices a box into separate top and bottom parts,
which are placed next to each other
(default: 5 mm apart in x direction).</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>b</strong> – the box to splice</p></li>
<li><p><strong>s</strong> – the size of the box</p></li>
<li><p><strong>h</strong> – height at which the box is spliced</p></li>
<li><p><strong>d</strong> – distance between the parts</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="function">
<dt id="psml.text">
<code class="sig-prename descclassname">psml.</code><code class="sig-name descname">text</code><span class="sig-paren">(</span><em class="sig-param">txt: str</em>, <em class="sig-param">height: float = 5</em>, <em class="sig-param">facets: Optional[int] = None</em>, <em class="sig-param">args=''</em><span class="sig-paren">)</span> → psml.shape<a class="headerlink" href="#psml.text" title="Permalink to this definition">¶</a></dt>
<dd><p>text shape</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>txt</strong> – the text</p></li>
<li><p><strong>height</strong> – the letter height</p></li>
<li><p><strong>facets</strong> – number of facets used to draw the letters</p></li>
<li><p><strong>args</strong> – extra arguments</p></li>
</ul>
</dd>
</dl>
<p>Optionally, the number of facets can be specified.
The default is the global variable number_of_text_facets.</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_text1_512.png"><img alt="_images/example_text1_128.png" src="_images/example_text1_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">text</span><span class="p">(</span> <span class="s2">"Hello world"</span> <span class="p">)</span>
</pre></div>
</div>
<p>Optionally, a string of extra arguments can be specified.
Check the <a class="reference external" href="https://www.openscad.org/">OpenSCAD</a> documentation for the possible arguments.
For your convenience, single quotes in the arg string are
replaced by double quotes (OpenSCAD requires double quotes).</p>
<div class="figure align-default">
<a class="reference external image-reference" href="../examples/images/example_text2_512.png"><img alt="_images/example_text2_128.png" src="_images/example_text2_128.png" /></a>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">text</span><span class="p">(</span>
<span class="s2">"Mary had a little lamb"</span><span class="p">,</span>
<span class="n">facets</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span>
<span class="n">args</span> <span class="o">=</span> <span class="s2">"halign='center',valign='center'"</span>
<span class="p">)</span>
</pre></div>
</div>
<p>The horizontal size of a text depends on the specified height
the text itself, and on the font. This makes it difficult to
predict the size of a text. The resize operator can be
useful to scale a text to a know size.</p>
</dd></dl>
<dl class="function">