yapCAD 0.5.0__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/boolean/__init__.py +21 -0
- yapcad/boolean/native.py +1012 -0
- yapcad/boolean/trimesh_engine.py +155 -0
- yapcad/combine.py +52 -14
- yapcad/drawable.py +404 -26
- yapcad/geom.py +116 -0
- yapcad/geom3d.py +237 -7
- yapcad/geom3d_util.py +486 -30
- yapcad/geom_util.py +160 -61
- yapcad/io/__init__.py +2 -1
- yapcad/io/step.py +323 -0
- yapcad/spline.py +232 -0
- {yapcad-0.5.0.dist-info → yapcad-0.5.1.dist-info}/METADATA +60 -14
- yapcad-0.5.1.dist-info/RECORD +32 -0
- yapcad-0.5.0.dist-info/RECORD +0 -27
- {yapcad-0.5.0.dist-info → yapcad-0.5.1.dist-info}/WHEEL +0 -0
- {yapcad-0.5.0.dist-info → yapcad-0.5.1.dist-info}/licenses/AUTHORS.rst +0 -0
- {yapcad-0.5.0.dist-info → yapcad-0.5.1.dist-info}/licenses/LICENSE +0 -0
- {yapcad-0.5.0.dist-info → yapcad-0.5.1.dist-info}/licenses/LICENSE.txt +0 -0
- {yapcad-0.5.0.dist-info → yapcad-0.5.1.dist-info}/top_level.txt +0 -0
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.5.
|
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/
|
@@ -24,6 +24,9 @@ Requires-Dist: pyobjc-framework-Quartz; platform_system == "Darwin"
|
|
24
24
|
Provides-Extra: tests
|
25
25
|
Requires-Dist: pytest; extra == "tests"
|
26
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"
|
27
30
|
Dynamic: license-file
|
28
31
|
|
29
32
|
**yapCAD**
|
@@ -37,6 +40,24 @@ python 3, now with a growing focus on 3D generative design and STL export
|
|
37
40
|
|
38
41
|
**yapCAD** rocket example
|
39
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
|
+
|
40
61
|
what’s **yapCAD** for?
|
41
62
|
----------------------
|
42
63
|
|
@@ -52,10 +73,14 @@ geometry experiments.
|
|
52
73
|
software status
|
53
74
|
---------------
|
54
75
|
|
55
|
-
**yapCAD** is
|
56
|
-
|
57
|
-
|
58
|
-
|
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
|
59
84
|
|
60
85
|
**yapCAD** installation, documentation, and examples
|
61
86
|
----------------------------------------------------
|
@@ -89,8 +114,10 @@ PYTHONPATH includes the cloned top-level ``yapCAD`` directory. You will
|
|
89
114
|
find the examples in the ``yapCAD/examples`` directory.
|
90
115
|
|
91
116
|
For a fully worked 2D parametric design system, see the ``boxcut`` example.
|
92
|
-
For a 3D generative example that builds a multi-stage rocket, visualises
|
93
|
-
|
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.
|
94
121
|
|
95
122
|
documentation
|
96
123
|
~~~~~~~~~~~~~
|
@@ -99,7 +126,18 @@ Online **yapCAD** documentation can be found here:
|
|
99
126
|
https://yapcad.readthedocs.io/en/latest/ — some module references lag
|
100
127
|
behind the latest 3D-focused APIs, so you may want to build a local copy
|
101
128
|
as described below to explore ``geometry_utils``, ``geometry_checks``,
|
102
|
-
``metadata``, and ``io.
|
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.
|
103
141
|
|
104
142
|
To build the HTML **yapCAD** documentation locally, install the
|
105
143
|
documentation dependencies and run Sphinx from the project root::
|
@@ -179,14 +217,18 @@ drawing file format. At present, **yapCAD** supports:
|
|
179
217
|
|
180
218
|
* AutoCAD DXF output for two-dimensional drawings (via
|
181
219
|
`ezdxf <https://github.com/mozman/ezdxf>`__).
|
182
|
-
* STL export for 3D solids (via
|
220
|
+
* STL and STEP export for 3D solids (via ``yapcad.io.stl`` and
|
221
|
+
``yapcad.io.step`` modules).
|
183
222
|
* OpenGL visualisation for 2D/3D geometries using
|
184
223
|
`pyglet <https://github.com/pyglet/pyglet>`__.
|
224
|
+
* Modular 3D boolean operations supporting both native and external engines
|
225
|
+
(trimesh with Manifold/Blender backends).
|
185
226
|
|
186
|
-
The 0.5.
|
187
|
-
|
188
|
-
|
189
|
-
|
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.
|
190
232
|
|
191
233
|
The foundations of **yapCAD** are grounded in decades of the author’s
|
192
234
|
experience with graphics system programming, 3D CAD and simulation.
|
@@ -242,13 +284,17 @@ is a DXF example:
|
|
242
284
|
dd.display()
|
243
285
|
|
244
286
|
For a 3D example that generates a complete rocket assembly and exports
|
245
|
-
STL::
|
287
|
+
STL and STEP::
|
246
288
|
|
247
289
|
from pathlib import Path
|
248
290
|
from examples.rocket_demo import build_rocket, export_stl
|
291
|
+
from yapcad.io.step import write_step
|
249
292
|
|
250
293
|
components, assembly = build_rocket()
|
251
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.
|
252
298
|
|
253
299
|
The **yapCAD** system isn’t just about rendering, of course, it’s about
|
254
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,,
|
yapcad-0.5.0.dist-info/RECORD
DELETED
@@ -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.5.0.dist-info/licenses/AUTHORS.rst,sha256=JzvJA3p1aSIOTaaB3aCtB-ZrUQrVm869gdROUV5bRh8,84
|
22
|
-
yapcad-0.5.0.dist-info/licenses/LICENSE,sha256=NkGvciCD5MEHmCtnivAi2PqcEhBYAkSAarP-bWAoknM,1071
|
23
|
-
yapcad-0.5.0.dist-info/licenses/LICENSE.txt,sha256=FyT_Hxn5USuJ1Mu3-4Ou4T2x-Dzfiy06ZOnWkfdJ33o,1081
|
24
|
-
yapcad-0.5.0.dist-info/METADATA,sha256=mWZ0DsMbSzQc7KiStxZIsGzsyEVCr9dor9KnrDtH2m0,21651
|
25
|
-
yapcad-0.5.0.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
|
26
|
-
yapcad-0.5.0.dist-info/top_level.txt,sha256=NAtnfsyeALrvhI63FGS3_TEUh26OKRvnm1_lCOOgjKA,7
|
27
|
-
yapcad-0.5.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|