1+
2+
3+ function Base. delete! (geo:: GeoModel , line:: Edge )
4+ filter! (!= (line), geo. edges)
5+
6+ p1 = line. points[1 ]
7+ p2 = line. points[end ]
8+
9+ filter! (!= (line), p1. edges)
10+ filter! (!= (line), p2. edges)
11+
12+ # check if line is between two coplanar faces
13+ if length (line. faces)== 2 && line. faces[1 ]. plane== line. faces[2 ]. plane
14+ s1 = line. faces[1 ] # to be deleted
15+ s2 = line. faces[2 ] # to be extended
16+
17+ holes = [ s1. loops[2 : end ]; s2. loops[2 : end ] ]
18+
19+ # get inner and outer lines
20+ innerlines = intersect (s1. loops[1 ]. edges, s2. loops[1 ]. edges)
21+ outerlines = setdiff (union (s1. loops[1 ]. edges, s2. loops[1 ]. edges), innerlines)
22+
23+ # find loop and update s2 outer loop
24+ loops = find_flat_loops (outerlines[1 ], lines= outerlines; exclude_inner_edges= false )
25+ loop = addloop! (geo, loops[1 ])
26+ s2. loops[1 ] = loop
27+
28+ # remove s1 from geo
29+ filter! (!= (s1), geo. faces)
30+ filter! (!= (s1. loops[1 ]), geo. loops)
31+
32+ # remove references to s1 in s1 lines and update with s2
33+ for lo in s1. loops
34+ for l in lo. darts
35+ l in innerlines && continue
36+ filter! (!= (s1), l. faces)
37+ push! (l. faces, s2)
38+ end
39+ end
40+
41+ # remove references to s1 and s2 in inner lines
42+ for l in innerlines
43+ filter! (!= (s1), l. faces)
44+ filter! (!= (s2), l. faces)
45+ end
46+
47+ # remove s1 from volumes associated to s2
48+ for v in s2. volumes
49+ filter! (!= (s1), v. faces)
50+ end
51+
52+ # fix holes
53+
54+ else
55+ # delete faces associated with that line
56+ for s in line. faces
57+ for lo in s. loops
58+ line in lo. darts && delete! (geo, s)
59+ end
60+ end
61+ end
62+ end
63+
64+
65+ function Base. delete! (geo:: GeoModel , face:: Face )
66+
67+ # remove face from geo
68+ filter! (!= (face), geo. faces)
69+
70+ if ! face. flat
71+ # delete loop if not flat face
72+ delete! (geo. loops, face. loops[1 ]) # todo: check
73+ else
74+ # Remove references and check for loop usage
75+ for loop in face. loops
76+ # remove face for each edge
77+ for dart in loop. darts
78+ filter! (!= (face), dart. edge. faces)
79+ end
80+
81+ # delete loop if not used elsewhere
82+ delete! (geo, loop)
83+ end
84+ end
85+
86+ # remove volumes that uses this face
87+ if length (face. volumes)== 1
88+ delete! (geo, face. volumes[1 ])
89+ elseif length (face. volumes)== 2 # join volumes
90+ v1 = face. volumes[1 ] # volume to be removed
91+ v2 = face. volumes[2 ] # volume to be extended
92+
93+ innerfaces = intersect (v1. faces, v2. faces)
94+ outerfaces = setdiff (union (v1. faces, v2. faces), innerfaces)
95+
96+ # update faces in v2
97+ v2. faces = outerfaces
98+
99+ # remove v1 from geo
100+ filter! (!= (v1), geo. volumes)
101+
102+ # remove references to v1 in v1 faces and update with v2
103+ for s in v1. faces
104+ s in innerfaces && continue
105+ filter! (!= (v1), s. volumes)
106+ push! (s. volumes, v2)
107+ end
108+
109+ # remove v1 and v2 from innerfaces
110+ for s in innerfaces
111+ filter! (!= (v1), s. volumes)
112+ filter! (!= (v2), s. volumes)
113+ end
114+ end
115+
116+ geo. quiet || println (" Deleted face $(face. id) " )
117+
118+ end
119+
120+
121+ function Base. delete! (geo:: GeoModel , loop:: Loop )
122+ # deletes a loop if not used by any face
123+
124+ found = false
125+ for f in geo. faces
126+ f. flat || continue
127+ if loop in f. loops
128+ found = true
129+ break
130+ end
131+ end
132+
133+ ! found && filter! (!= (loop), geo. loops)
134+
135+ end
136+
137+ function Base. delete! (geo:: GeoModel , v:: Volume )
138+ filter! (!= (v), geo. volumes)
139+
140+ # filter v from v faces
141+ for s in v. faces
142+ filter! (!= (v), s. volumes)
143+ end
144+
145+ geo. quiet || println (" Deleted volume $(v. id) " )
146+
147+ end
0 commit comments