yapCAD 0.3.1__py2.py3-none-any.whl → 0.5.1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
yapcad/spline.py ADDED
@@ -0,0 +1,232 @@
1
+ """Spline helpers for yapCAD.
2
+
3
+ Provides evaluation and sampling routines for spline primitives defined in
4
+ :mod:`yapcad.geom`, including Catmull-Rom and NURBS curves.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from math import pow
10
+ from typing import Iterable, List, Sequence, Tuple
11
+
12
+ from yapcad.geom import point
13
+ from yapcad.geometry_utils import to_vec3
14
+
15
+ Vec3 = Tuple[float, float, float]
16
+
17
+
18
+ def is_catmullrom(curve) -> bool:
19
+ """Return ``True`` if *curve* is a Catmull-Rom spline definition."""
20
+
21
+ return isinstance(curve, list) and len(curve) == 3 and curve[0] == 'catmullrom'
22
+
23
+
24
+
25
+
26
+ def evaluate_catmullrom(curve, u: float) -> list:
27
+ """Evaluate a Catmull-Rom spline at parameter ``u`` in ``[0, 1]``."""
28
+
29
+ if not is_catmullrom(curve):
30
+ raise ValueError('curve is not a Catmull-Rom spline')
31
+ _, pts, meta = curve
32
+ ctrl = [point(p) for p in pts]
33
+ count = len(ctrl)
34
+ if count == 0:
35
+ raise ValueError('Catmull-Rom spline has no control points')
36
+ if count == 1:
37
+ return point(ctrl[0])
38
+
39
+ closed = bool(meta.get('closed', False))
40
+ segment_count = count if closed else count - 1
41
+ if segment_count <= 0:
42
+ return point(ctrl[-1])
43
+
44
+ u_clamped = max(0.0, min(1.0, float(u)))
45
+ span = u_clamped * segment_count
46
+ idx = int(span)
47
+ tau = span - idx
48
+ if idx >= segment_count:
49
+ idx = segment_count - 1
50
+ tau = 1.0
51
+
52
+ p0 = ctrl[(idx - 1) % count] if closed else ctrl[max(idx - 1, 0)]
53
+ p1 = ctrl[idx % count]
54
+ p2 = ctrl[(idx + 1) % count] if closed else ctrl[min(idx + 1, count - 1)]
55
+ p3 = ctrl[(idx + 2) % count] if closed else ctrl[min(idx + 2, count - 1)]
56
+
57
+ alpha = float(meta.get('alpha', 0.5))
58
+ return _catmullrom_point(p0, p1, p2, p3, alpha, tau)
59
+
60
+
61
+ def evaluate_nurbs(curve, u: float) -> list:
62
+ """Evaluate a NURBS curve at parameter ``u`` in ``[0, 1]``."""
63
+
64
+ if not is_nurbs(curve):
65
+ raise ValueError('curve is not a NURBS definition')
66
+ _, ctrl, meta = curve
67
+ degree = int(meta['degree'])
68
+ knots = meta['knots']
69
+ weights = meta['weights']
70
+ u_start = knots[degree]
71
+ u_end = knots[-degree - 1]
72
+ u_clamped = max(0.0, min(1.0, float(u)))
73
+ real_u = u_start + (u_end - u_start) * u_clamped
74
+ return _nurbs_point([point(p) for p in ctrl], weights, knots, degree, real_u)
75
+
76
+ def sample_catmullrom(curve, *, segments_per_span: int = 12) -> List[list]:
77
+ """Sample a Catmull-Rom spline into a list of :func:`point` values."""
78
+
79
+ if segments_per_span < 1:
80
+ raise ValueError('segments_per_span must be >= 1')
81
+ if not is_catmullrom(curve):
82
+ raise ValueError('curve is not a Catmull-Rom spline')
83
+
84
+ _, pts, meta = curve
85
+ alpha = float(meta.get('alpha', 0.5))
86
+ closed = bool(meta.get('closed', False))
87
+ ctrl = [point(p) for p in pts]
88
+ count = len(ctrl)
89
+ if count < 2:
90
+ raise ValueError('Catmull-Rom spline needs at least 2 control points')
91
+
92
+ samples: List[list] = []
93
+ segment_count = count if closed else count - 1
94
+ for i in range(segment_count):
95
+ p0 = ctrl[(i - 1) % count] if closed else ctrl[max(i - 1, 0)]
96
+ p1 = ctrl[i % count]
97
+ p2 = ctrl[(i + 1) % count] if closed else ctrl[min(i + 1, count - 1)]
98
+ p3 = ctrl[(i + 2) % count] if closed else ctrl[min(i + 2, count - 1)]
99
+
100
+ if not samples:
101
+ samples.append(point(p1))
102
+
103
+ for step in range(1, segments_per_span + 1):
104
+ tau = step / segments_per_span
105
+ samples.append(_catmullrom_point(p0, p1, p2, p3, alpha, tau))
106
+
107
+ return samples
108
+
109
+
110
+ def _catmullrom_point(p0, p1, p2, p3, alpha: float, tau: float) -> list:
111
+ v0 = to_vec3(p0)
112
+ v1 = to_vec3(p1)
113
+ v2 = to_vec3(p2)
114
+ v3 = to_vec3(p3)
115
+
116
+ def tj(ti: float, pa: Vec3, pb: Vec3) -> float:
117
+ delta = ((pb[0] - pa[0]) ** 2 + (pb[1] - pa[1]) ** 2 + (pb[2] - pa[2]) ** 2) ** 0.5
118
+ return ti + pow(delta, alpha)
119
+
120
+ t0 = 0.0
121
+ t1 = tj(t0, v0, v1)
122
+ t2 = tj(t1, v1, v2)
123
+ t3 = tj(t2, v2, v3)
124
+
125
+ if t2 - t1 < 1e-12:
126
+ return point(*v2, 1.0)
127
+
128
+ t = t1 + (t2 - t1) * tau
129
+
130
+ A1 = _catmull_blend(v0, v1, t0, t1, t)
131
+ A2 = _catmull_blend(v1, v2, t1, t2, t)
132
+ A3 = _catmull_blend(v2, v3, t2, t3, t)
133
+
134
+ B1 = _catmull_blend(A1, A2, t0, t2, t)
135
+ B2 = _catmull_blend(A2, A3, t1, t3, t)
136
+
137
+ C = _catmull_blend(B1, B2, t1, t2, t)
138
+ return point(C[0], C[1], C[2])
139
+
140
+
141
+ def _catmull_blend(a: Vec3, b: Vec3, t0: float, t1: float, t: float) -> Vec3:
142
+ denom = t1 - t0
143
+ if abs(denom) < 1e-12:
144
+ return b
145
+ w0 = (t1 - t) / denom
146
+ w1 = (t - t0) / denom
147
+ return (
148
+ a[0] * w0 + b[0] * w1,
149
+ a[1] * w0 + b[1] * w1,
150
+ a[2] * w0 + b[2] * w1,
151
+ )
152
+
153
+
154
+ def is_nurbs(curve) -> bool:
155
+ """Return ``True`` if *curve* is a NURBS definition."""
156
+
157
+ return isinstance(curve, list) and len(curve) == 3 and curve[0] == 'nurbs'
158
+
159
+
160
+ def sample_nurbs(curve, *, samples: int = 64) -> List[list]:
161
+ """Sample a NURBS curve into :func:`point` values."""
162
+
163
+ if samples < 2:
164
+ raise ValueError('samples must be >= 2')
165
+ if not is_nurbs(curve):
166
+ raise ValueError('curve is not a NURBS definition')
167
+
168
+ _, ctrl_points, meta = curve
169
+ degree = int(meta['degree'])
170
+ knots: Sequence[float] = meta['knots']
171
+ weights: Sequence[float] = meta['weights']
172
+ ctrl = [point(p) for p in ctrl_points]
173
+
174
+ u_start = knots[degree]
175
+ u_end = knots[-degree - 1]
176
+
177
+ samples_out: List[list] = []
178
+ for i in range(samples):
179
+ if i == samples - 1:
180
+ u = u_end
181
+ else:
182
+ u = u_start + (u_end - u_start) * (i / (samples - 1))
183
+ samples_out.append(_nurbs_point(ctrl, weights, knots, degree, u))
184
+ return samples_out
185
+
186
+
187
+ def _nurbs_point(ctrl: Sequence[list], weights: Sequence[float], knots: Sequence[float], degree: int, u: float) -> list:
188
+ n = len(ctrl) - 1
189
+ numerator = [0.0, 0.0, 0.0]
190
+ denominator = 0.0
191
+ for i in range(n + 1):
192
+ basis = _nip(i, degree, u, knots)
193
+ if basis == 0.0:
194
+ continue
195
+ w = weights[i] * basis
196
+ v = to_vec3(ctrl[i])
197
+ numerator[0] += w * v[0]
198
+ numerator[1] += w * v[1]
199
+ numerator[2] += w * v[2]
200
+ denominator += w
201
+ if denominator == 0.0:
202
+ return point(ctrl[0])
203
+ return point(numerator[0] / denominator, numerator[1] / denominator, numerator[2] / denominator)
204
+
205
+
206
+ def _nip(i: int, p: int, u: float, knots: Sequence[float]) -> float:
207
+ if p == 0:
208
+ if knots[i] <= u < knots[i + 1] or (u == knots[-1] and knots[i] < knots[i + 1]):
209
+ return 1.0
210
+ return 0.0
211
+
212
+ left = 0.0
213
+ denom = knots[i + p] - knots[i]
214
+ if denom != 0.0:
215
+ left = (u - knots[i]) / denom * _nip(i, p - 1, u, knots)
216
+
217
+ right = 0.0
218
+ denom = knots[i + p + 1] - knots[i + 1]
219
+ if denom != 0.0:
220
+ right = (knots[i + p + 1] - u) / denom * _nip(i + 1, p - 1, u, knots)
221
+
222
+ return left + right
223
+
224
+
225
+ __all__ = [
226
+ 'is_catmullrom',
227
+ 'sample_catmullrom',
228
+ 'evaluate_catmullrom',
229
+ 'is_nurbs',
230
+ 'sample_nurbs',
231
+ 'evaluate_nurbs',
232
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yapCAD
3
- Version: 0.3.1
3
+ Version: 0.5.1
4
4
  Summary: yet another procedural CAD and computational geometry system
5
5
  Author-email: Richard DeVaul <richard.devaul@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/rdevaul/yapCAD/
@@ -16,12 +16,17 @@ License-File: AUTHORS.rst
16
16
  Requires-Dist: ezdxf>=1.1
17
17
  Requires-Dist: pyglet<2,>=1.5
18
18
  Requires-Dist: mpmath>=1.2
19
+ Requires-Dist: numpy>=1.22
20
+ Requires-Dist: mapbox-earcut>=1.0.3
19
21
  Requires-Dist: pyobjc-core; platform_system == "Darwin"
20
22
  Requires-Dist: pyobjc-framework-Cocoa; platform_system == "Darwin"
21
23
  Requires-Dist: pyobjc-framework-Quartz; platform_system == "Darwin"
22
24
  Provides-Extra: tests
23
25
  Requires-Dist: pytest; extra == "tests"
24
26
  Requires-Dist: pytest-cov; extra == "tests"
27
+ Provides-Extra: meshcheck
28
+ Requires-Dist: trimesh>=4.0; extra == "meshcheck"
29
+ Requires-Dist: pymeshfix>=0.16; extra == "meshcheck"
25
30
  Dynamic: license-file
26
31
 
27
32
  **yapCAD**
@@ -35,6 +40,24 @@ python 3, now with a growing focus on 3D generative design and STL export
35
40
 
36
41
  **yapCAD** rocket example
37
42
 
43
+ .. note::
44
+
45
+ The 3D rocket demo above was produced in a single shot by
46
+ ``gpt-5-codex`` from the prompt::
47
+
48
+ Using what you know about yapCAD, I'd like you to create a demo that
49
+ builds a simple 3D model of a rocket, visualizes it using pyglet, and
50
+ then writes out the STL file. I'd like the rocket to have a cluster of
51
+ five engines, guidance fins, a cylindrical body with at least one
52
+ diameter transition before the payload fairing, and an aerodynamic
53
+ fairing. Can you do this for me?
54
+
55
+ .. figure:: images/RocketCutawaySTEP.png
56
+ :alt: **yapCAD** rocket cutaway STEP export
57
+
58
+ Internal layout generated with ``examples/rocket_cutaway_internal.py`` and
59
+ rendered from the exported STEP file in FreeCAD.
60
+
38
61
  what’s **yapCAD** for?
39
62
  ----------------------
40
63
 
@@ -50,10 +73,14 @@ geometry experiments.
50
73
  software status
51
74
  ---------------
52
75
 
53
- **yapCAD** is still very much in **beta**, although it is already being
54
- used by for professional engineering purposes. If you are using
55
- **yapCAD** in interesting ways, feel free to let us know in the `yapCAD
56
- discussions <https://github.com/rdevaul/yapCAD/discussions>`__ forum
76
+ **yapCAD** is in **active development** and is already being used for
77
+ professional engineering purposes. Recent improvements include robust 3D
78
+ boolean operations (union, intersection, difference) with proper normal
79
+ orientation and degenerate triangle filtering. The 0.5.x series focuses on
80
+ production-ready 3D workflows with validated STL and STEP export.
81
+
82
+ If you are using **yapCAD** in interesting ways, feel free to let us know in the
83
+ `yapCAD discussions <https://github.com/rdevaul/yapCAD/discussions>`__ forum
57
84
 
58
85
  **yapCAD** installation, documentation, and examples
59
86
  ----------------------------------------------------
@@ -87,8 +114,10 @@ PYTHONPATH includes the cloned top-level ``yapCAD`` directory. You will
87
114
  find the examples in the ``yapCAD/examples`` directory.
88
115
 
89
116
  For a fully worked 2D parametric design system, see the ``boxcut`` example.
90
- For a 3D generative example that builds a multi-stage rocket, visualises
91
- it, and exports STL, see ``examples/rocket_demo.py``.
117
+ For a 3D generative example that builds a multi-stage rocket, visualises it,
118
+ and exports STL, see ``examples/rocket_demo.py``. To explore the new stacking
119
+ and cutaway helpers while exporting STEP, run
120
+ ``examples/rocket_cutaway_internal.py`` whose output is shown above.
92
121
 
93
122
  documentation
94
123
  ~~~~~~~~~~~~~
@@ -97,7 +126,18 @@ Online **yapCAD** documentation can be found here:
97
126
  https://yapcad.readthedocs.io/en/latest/ — some module references lag
98
127
  behind the latest 3D-focused APIs, so you may want to build a local copy
99
128
  as described below to explore ``geometry_utils``, ``geometry_checks``,
100
- ``metadata``, and ``io.stl``.
129
+ ``metadata``, and the ``yapcad.io`` exporters. Highlights from the most
130
+ recent updates include:
131
+
132
+ * ``yapcad.geometry_utils`` and ``yapcad.triangulator`` – triangle helpers
133
+ backing the ear-cut tessellator and faceted exporters.
134
+ * ``yapcad.geom3d_util.stack_solids`` – quickly pack solids along an axis
135
+ using bounding boxes and optional ``space:<distance>`` directives.
136
+ * ``yapcad.geom3d_util.cutaway_solid_x`` – trim solids against a plane to
137
+ create sectional visualisations.
138
+ * ``yapcad.io.step``/``yapcad.io.stl`` – production-ready faceted exporters
139
+ suitable for interchange with FreeCAD, slicers, and other simulation tools.
140
+ STEP export supports multi-component assemblies with proper face orientation.
101
141
 
102
142
  To build the HTML **yapCAD** documentation locally, install the
103
143
  documentation dependencies and run Sphinx from the project root::
@@ -177,14 +217,18 @@ drawing file format. At present, **yapCAD** supports:
177
217
 
178
218
  * AutoCAD DXF output for two-dimensional drawings (via
179
219
  `ezdxf <https://github.com/mozman/ezdxf>`__).
180
- * STL export for 3D solids (via the new ``yapcad.io.stl`` module).
220
+ * STL and STEP export for 3D solids (via ``yapcad.io.stl`` and
221
+ ``yapcad.io.step`` modules).
181
222
  * OpenGL visualisation for 2D/3D geometries using
182
223
  `pyglet <https://github.com/pyglet/pyglet>`__.
224
+ * Modular 3D boolean operations supporting both native and external engines
225
+ (trimesh with Manifold/Blender backends).
183
226
 
184
- The 0.5.0 release lays the shared foundations (triangle utilities,
185
- metadata, validation checks, and STL export) that pave the way toward STEP
186
- support and a packaged, provenance-aware project model targeted for the
187
- forthcoming 1.0 release.
227
+ The 0.5.x series delivers robust 3D boolean operations, validated primitive
228
+ generation (sphere, cylinder, cone, tube, etc.), comprehensive mesh validation
229
+ tools, and production-ready export capabilities. These foundations pave the way
230
+ toward enhanced STEP support and a packaged, provenance-aware project model
231
+ targeted for the forthcoming 1.0 release.
188
232
 
189
233
  The foundations of **yapCAD** are grounded in decades of the author’s
190
234
  experience with graphics system programming, 3D CAD and simulation.
@@ -240,13 +284,17 @@ is a DXF example:
240
284
  dd.display()
241
285
 
242
286
  For a 3D example that generates a complete rocket assembly and exports
243
- STL::
287
+ STL and STEP::
244
288
 
245
289
  from pathlib import Path
246
290
  from examples.rocket_demo import build_rocket, export_stl
291
+ from yapcad.io.step import write_step
247
292
 
248
293
  components, assembly = build_rocket()
249
294
  export_stl(assembly, Path("rocket_demo.stl"))
295
+ write_step(assembly, Path("rocket_demo.step"))
296
+
297
+ There is also an advanced ``rocket_grid_demo.py`` example featuring grid fins, a linear exploded view, and simultaneous STL/STEP export.
250
298
 
251
299
  The **yapCAD** system isn’t just about rendering, of course, it’s about
252
300
  computational geometry. For example, if you want to calculate the
@@ -0,0 +1,32 @@
1
+ yapcad/__init__.py,sha256=CUEd7EOL-ne31ggDprsi4lwLWMV1SRV5KYqkuDTdxrQ,400
2
+ yapcad/combine.py,sha256=GXUH8viTW2hh937xggFi22FPJKB40NgZsJlvF4Rm-TM,4071
3
+ yapcad/drawable.py,sha256=8q_THd5Hc6smtAgb4kczYWG_7cjOA1YeEJxChnO0puE,31988
4
+ yapcad/ezdxf_drawable.py,sha256=o6Rei044ROkaniHZJwyBGtahaD3BU1927-AkFpPzqwE,5966
5
+ yapcad/geom.py,sha256=vly-FqZgiBaoN5XeFKgpcIVDGVkVJ-2RFAMXgbvexI0,109138
6
+ yapcad/geom3d.py,sha256=0RC6PS3ZjbQRMYVax-HShxXAKq2urVIXlyjGiVwzfyg,41225
7
+ yapcad/geom3d_util.py,sha256=Wf8aZaK04riqtD38MrbWJudl5gNvllFNIeK74EVgtgo,33019
8
+ yapcad/geom_util.py,sha256=LpiCUI7gaSIPHWKvrWQTalGwgHGp4m01YBiHe3EpTnQ,29888
9
+ yapcad/geometry.py,sha256=FcIF94a_usw04C0RDJDRDCCi44eya7lyahlU1Vw9wXM,16145
10
+ yapcad/geometry_checks.py,sha256=ABI0t5kls2HAidyyPp_EdoVqPxJAEtCWysPKvCeSK3s,2975
11
+ yapcad/geometry_utils.py,sha256=N_073tEV08AKjJRTeuNJMPjPgonFPUeiuh_jY7Xx7mA,3438
12
+ yapcad/mesh.py,sha256=QmPMeqdToyLztPupY8vSHQfrUz3UEBH1p8Pa9XFVPCg,1329
13
+ yapcad/metadata.py,sha256=6foSa_4N9-PO4kL8YchbXboXZZFjEcUSG6F1spwGCVE,3096
14
+ yapcad/octtree.py,sha256=MxyNMgozeLUBK5cC5_IC_9fK4BqSg4VeoKP389AUVmM,19793
15
+ yapcad/poly.py,sha256=y5cSiCbA-pCbkO5zIa9kVk2_00w7FkWxY380nK14wt4,16549
16
+ yapcad/pyglet_drawable.py,sha256=etgul99FOywq3rXf9uNu6cd59cECe4OMYX_ht5BcyMw,38424
17
+ yapcad/spline.py,sha256=f0ClanLQIUXIcQElgo5asgsx6W1Z8xJb9KHvrfseKPM,6983
18
+ yapcad/triangulator.py,sha256=hwxoxb564wZRYPEYbGiD-SDPu_x_SueYha0Kjmnu3Bo,3210
19
+ yapcad/xform.py,sha256=Qy_KYqbTcmspmKZfo-OGU_1Z3XRpL7p5buwc5uAzlvo,9537
20
+ yapcad/boolean/__init__.py,sha256=Q9_kUUk1OnBWdxoHGzXoIuA9l5X0IGtTe_snUfxYoxE,420
21
+ yapcad/boolean/native.py,sha256=pRqvuMkrnB6r7BLmNU73gH8P_xM9fktSEq8jqOAlypE,33114
22
+ yapcad/boolean/trimesh_engine.py,sha256=2CwsnZsW7GJLoEpIw33PlhZFhDPXm3wUo5pJRgYyyLQ,5567
23
+ yapcad/io/__init__.py,sha256=-OfsQgxQ08DjDXUKF9zuLFT6rhapZXSmXluh8m4_hu0,128
24
+ yapcad/io/step.py,sha256=sN19LSjAnr2E9KbT8yNuwBVBI2ZEeTYo8DL1cnXi2p8,11387
25
+ yapcad/io/stl.py,sha256=HNICfPz_CXYIbTP7d4spdSkMdmrt3d825MNzYA9ah9w,2596
26
+ yapcad-0.5.1.dist-info/licenses/AUTHORS.rst,sha256=JzvJA3p1aSIOTaaB3aCtB-ZrUQrVm869gdROUV5bRh8,84
27
+ yapcad-0.5.1.dist-info/licenses/LICENSE,sha256=NkGvciCD5MEHmCtnivAi2PqcEhBYAkSAarP-bWAoknM,1071
28
+ yapcad-0.5.1.dist-info/licenses/LICENSE.txt,sha256=FyT_Hxn5USuJ1Mu3-4Ou4T2x-Dzfiy06ZOnWkfdJ33o,1081
29
+ yapcad-0.5.1.dist-info/METADATA,sha256=gnE0OaZO6gryOzWJ2qfsoybo5k6orpp0wcPM8oAVLR0,24096
30
+ yapcad-0.5.1.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
31
+ yapcad-0.5.1.dist-info/top_level.txt,sha256=NAtnfsyeALrvhI63FGS3_TEUh26OKRvnm1_lCOOgjKA,7
32
+ yapcad-0.5.1.dist-info/RECORD,,
@@ -1,27 +0,0 @@
1
- yapcad/__init__.py,sha256=CUEd7EOL-ne31ggDprsi4lwLWMV1SRV5KYqkuDTdxrQ,400
2
- yapcad/combine.py,sha256=WhI3D9lSZFzu1HD68HGUTbNNrJsT4SeCl1MOcjxsa1k,2932
3
- yapcad/drawable.py,sha256=kPYbIhOD5MesmRSeXTiFJoE1UwVQWekoeu19athfH7Y,15843
4
- yapcad/ezdxf_drawable.py,sha256=o6Rei044ROkaniHZJwyBGtahaD3BU1927-AkFpPzqwE,5966
5
- yapcad/geom.py,sha256=bg_ayg1aovT17HwgFwoJ7HbvI2InEjii9Bvr8PoZ04g,105604
6
- yapcad/geom3d.py,sha256=c6MleS-AiCWdju_mtPzUd7vhzkoT5nlJvoz7yimwdwU,33415
7
- yapcad/geom3d_util.py,sha256=O-LUVqk2-BmFb-g-2ex44vHwKK_U4xCfqMY5Cevbvi8,15663
8
- yapcad/geom_util.py,sha256=GMfgCyXuv9J4mdOfkqxNZT7EZZFEMV_ZpVTfuol8ve8,26370
9
- yapcad/geometry.py,sha256=FcIF94a_usw04C0RDJDRDCCi44eya7lyahlU1Vw9wXM,16145
10
- yapcad/geometry_checks.py,sha256=ABI0t5kls2HAidyyPp_EdoVqPxJAEtCWysPKvCeSK3s,2975
11
- yapcad/geometry_utils.py,sha256=N_073tEV08AKjJRTeuNJMPjPgonFPUeiuh_jY7Xx7mA,3438
12
- yapcad/mesh.py,sha256=QmPMeqdToyLztPupY8vSHQfrUz3UEBH1p8Pa9XFVPCg,1329
13
- yapcad/metadata.py,sha256=6foSa_4N9-PO4kL8YchbXboXZZFjEcUSG6F1spwGCVE,3096
14
- yapcad/octtree.py,sha256=MxyNMgozeLUBK5cC5_IC_9fK4BqSg4VeoKP389AUVmM,19793
15
- yapcad/poly.py,sha256=y5cSiCbA-pCbkO5zIa9kVk2_00w7FkWxY380nK14wt4,16549
16
- yapcad/pyglet_drawable.py,sha256=etgul99FOywq3rXf9uNu6cd59cECe4OMYX_ht5BcyMw,38424
17
- yapcad/triangulator.py,sha256=hwxoxb564wZRYPEYbGiD-SDPu_x_SueYha0Kjmnu3Bo,3210
18
- yapcad/xform.py,sha256=Qy_KYqbTcmspmKZfo-OGU_1Z3XRpL7p5buwc5uAzlvo,9537
19
- yapcad/io/__init__.py,sha256=EDwSGx-0na9fZabaK57zrq3GwEtkwN5Vo_pTS-ZtuXQ,85
20
- yapcad/io/stl.py,sha256=HNICfPz_CXYIbTP7d4spdSkMdmrt3d825MNzYA9ah9w,2596
21
- yapcad-0.3.1.dist-info/licenses/AUTHORS.rst,sha256=JzvJA3p1aSIOTaaB3aCtB-ZrUQrVm869gdROUV5bRh8,84
22
- yapcad-0.3.1.dist-info/licenses/LICENSE,sha256=NkGvciCD5MEHmCtnivAi2PqcEhBYAkSAarP-bWAoknM,1071
23
- yapcad-0.3.1.dist-info/licenses/LICENSE.txt,sha256=FyT_Hxn5USuJ1Mu3-4Ou4T2x-Dzfiy06ZOnWkfdJ33o,1081
24
- yapcad-0.3.1.dist-info/METADATA,sha256=HBc4tviyXQPUCGdA3-nueViX7QVaBaNHM7YGbVEqOWU,21588
25
- yapcad-0.3.1.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
26
- yapcad-0.3.1.dist-info/top_level.txt,sha256=NAtnfsyeALrvhI63FGS3_TEUh26OKRvnm1_lCOOgjKA,7
27
- yapcad-0.3.1.dist-info/RECORD,,
File without changes