Skip to content

Commit a39b579

Browse files
committed
GeoModel refactored
1 parent b0d9cf8 commit a39b579

33 files changed

+2907
-2536
lines changed

src/geo/add.jl

Lines changed: 408 additions & 0 deletions
Large diffs are not rendered by default.

src/geo/delete.jl

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
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

Comments
 (0)