forked from CADacombs/rhinopython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathxBrepTrim.py
More file actions
108 lines (91 loc) · 4.21 KB
/
xBrepTrim.py
File metadata and controls
108 lines (91 loc) · 4.21 KB
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
"""
180530: Due to failures in senwIsoStatusIntersectingTrimPointAtStart, changed fRh0Tol (in all functions) from Rhino.RhinoMath.ZeroTolerance to 0.1 * sc.doc.ModelAbsoluteTolerance.
190413: Created by extracting functions from xBrep. Renamed a function.
190513: Moved a couple of functions to only script that currently uses them.
"""
import Rhino
import scriptcontext as sc
def endVertexOfEdgeTrim(rgTrim):
if rgTrim.IsReversed():
if rgTrim.Edge.StartVertex is not None:
return rgTrim.Edge.StartVertex
else:
if rgTrim.Edge.EndVertex is not None:
return rgTrim.Edge.EndVertex
def isSenw(rgTrim):
return (rgTrim.IsoStatus == Rhino.Geometry.IsoStatus.South or
rgTrim.IsoStatus == Rhino.Geometry.IsoStatus.East or
rgTrim.IsoStatus == Rhino.Geometry.IsoStatus.North or
rgTrim.IsoStatus == Rhino.Geometry.IsoStatus.West)
def isStartPointOnSenw(rgTrim):
pt = rgTrim.PointAtStart
face = rgTrim.Face
#fRh0Tol = Rhino.RhinoMath.ZeroTolerance
fRh0Tol = 0.1 * sc.doc.ModelAbsoluteTolerance
return (Rhino.RhinoMath.EpsilonEquals(pt.X, face.Domain(0).Min, fRh0Tol) or
Rhino.RhinoMath.EpsilonEquals(pt.X, face.Domain(0).Max, fRh0Tol) or
Rhino.RhinoMath.EpsilonEquals(pt.Y, face.Domain(1).Min, fRh0Tol) or
Rhino.RhinoMath.EpsilonEquals(pt.Y, face.Domain(1).Max, fRh0Tol))
return r
def previousNonSingularTrim(rgTrims_L, iTrim_Start, iTrim_Now):
"""
Find previous non-singular trim, using recursion if necessary.
"""
iTrim_Now = (iTrim_Now-1) % rgTrims_L.Count
if iTrim_Now == iTrim_Start: return None
if rgTrims_L[iTrim_Now].TrimType == Rhino.Geometry.BrepTrimType.Singular:
return previousNonSingularTrim(rgTrims_L, iTrim_Start, iTrim_Now)
else: return rgTrims_L[iTrim_Now]
def senwIsoStatusIntersectingTrimPointAtEnd(rgTrim):
"""
Returns: Tuple of values found or None.
"""
pt = rgTrim.PointAtEnd
face = rgTrim.Face
#fRh0Tol = Rhino.RhinoMath.ZeroTolerance
fRh0Tol = 0.1 * sc.doc.ModelAbsoluteTolerance
isoStatus = None
domainV = face.Domain(1)
if Rhino.RhinoMath.EpsilonEquals(pt.Y, domainV.Min, fRh0Tol):
isoStatus = Rhino.Geometry.IsoStatus.South
if Rhino.RhinoMath.EpsilonEquals(pt.Y, domainV.Max, fRh0Tol):
isoStatus = Rhino.Geometry.IsoStatus.North
domainU = face.Domain(0)
if Rhino.RhinoMath.EpsilonEquals(pt.X, domainU.Max, fRh0Tol):
if isoStatus is None: return (Rhino.Geometry.IsoStatus.East, )
else: return (isoStatus, Rhino.Geometry.IsoStatus.East)
if Rhino.RhinoMath.EpsilonEquals(pt.X, domainU.Min, fRh0Tol):
if isoStatus is None: return (Rhino.Geometry.IsoStatus.West, )
else: return (isoStatus, Rhino.Geometry.IsoStatus.West)
if isoStatus is None: return
else: return (isoStatus, )
def senwIsoStatusIntersectingTrimPointAtStart(rgTrim):
"""
Returns: Tuple of values found or None.
"""
pt = rgTrim.PointAtStart
face = rgTrim.Face
#fRh0Tol = Rhino.RhinoMath.ZeroTolerance
fRh0Tol = 0.1 * sc.doc.ModelAbsoluteTolerance
isoStatus = None
domainV = face.Domain(1)
if Rhino.RhinoMath.EpsilonEquals(pt.Y, domainV.Min, fRh0Tol):
isoStatus = Rhino.Geometry.IsoStatus.South
if Rhino.RhinoMath.EpsilonEquals(pt.Y, domainV.Max, fRh0Tol):
isoStatus = Rhino.Geometry.IsoStatus.North
domainU = face.Domain(0)
if Rhino.RhinoMath.EpsilonEquals(pt.X, domainU.Max, fRh0Tol):
if isoStatus is None: return (Rhino.Geometry.IsoStatus.East, )
else: return (isoStatus, Rhino.Geometry.IsoStatus.East)
if Rhino.RhinoMath.EpsilonEquals(pt.X, domainU.Min, fRh0Tol):
if isoStatus is None: return (Rhino.Geometry.IsoStatus.West, )
else: return (isoStatus, Rhino.Geometry.IsoStatus.West)
if isoStatus is None: return
else: return (isoStatus, )
def startVertexOfEdgeTrim(rgTrim):
if rgTrim.IsReversed():
if rgTrim.Edge.EndVertex is not None:
return rgTrim.Edge.EndVertex
else:
if rgTrim.Edge.StartVertex is not None:
return rgTrim.Edge.StartVertex