Skip to content

Commit 41bea3f

Browse files
committed
WIP: almost there, need packaging the new algorithm in the itnernal df joint detector function
1 parent d7349fb commit 41bea3f

File tree

2 files changed

+135
-281
lines changed

2 files changed

+135
-281
lines changed

src/gh/components/DF_xml_exporter/code.py

Lines changed: 77 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -38,120 +38,92 @@ def RunScript(self,
3838
################
3939
########################################
4040

41-
# TODO: test
42-
o_debug = []
41+
# # TODO: test
42+
# breps_repaired = []
43+
# for brep in i_breps:
4344

44-
# mass_ctrs = []
45-
# crt_brep = i_breps[5]
46-
breps_repaired = []
47-
for brep in i_breps:
4845

49-
# convert mesh to brep object
50-
mesh=Rhino.Geometry.Mesh()
51-
mesh_parts=Rhino.Geometry.Mesh.CreateFromBrep(
52-
brep,
53-
Rhino.Geometry.MeshingParameters.Coarse)
54-
for mesh_part in mesh_parts: mesh.Append(mesh_part)
55-
mesh.Compact()
56-
mesh.MergeAllCoplanarFaces(Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance, True)
57-
# o_debug.append(mesh)
58-
59-
# get the obb
60-
df_mesh = diffCheck.df_cvt_bindings.cvt_rhmesh_2_dfmesh(mesh)
61-
df_cloud = df_mesh.sample_points_uniformly(200)
62-
df_OBB = df_cloud.get_tight_bounding_box()
63-
rh_OBB = diffCheck.df_cvt_bindings.cvt_dfOBB_2_rhbrep(df_OBB)
64-
65-
# check if the OBB is closed
66-
# print(f"OBB is closed: {rh_OBB.IsSolid}") # FIXME: brep is not closed
67-
# o_debug.append(rh_OBB)
68-
69-
# get OBB_center
70-
rh_OBB_center = rh_OBB.GetBoundingBox(True).Center
71-
# o_debug.append(rh_OBB_center)
72-
73-
# local axis system get the longest/shortes edge of the rh_OBB with a lambda function
74-
edges = rh_OBB.Edges
75-
edge_lengths = [edge.GetLength() for edge in edges]
76-
longest_edge = edges[edge_lengths.index(max(edge_lengths))]
77-
shortest_edge = edges[edge_lengths.index(min(edge_lengths))]
78-
79-
# scale the box in the longest edge direction by 1.5 from center on both directions
80-
rh_OBB_zaxis = rg.Vector3d(longest_edge.PointAt(1) - longest_edge.PointAt(0))
81-
rh_OBB_plane = rg.Plane(rh_OBB_center, rh_OBB_zaxis)
82-
scale_factor = 0.09
83-
xform = rg.Transform.Scale(
84-
rh_OBB_plane,
85-
1-scale_factor,
86-
1-scale_factor,
87-
1+scale_factor
88-
)
89-
rh_OBB.Transform(xform)
90-
91-
# get all the centers of the faces
92-
# face_centers = []
93-
faces = {}
94-
for idx, face in enumerate(brep.Faces):
95-
face_center = rg.AreaMassProperties.Compute(face).Centroid
96-
if rh_OBB.IsPointInside(face_center, sc.doc.ModelAbsoluteTolerance, True):
97-
# face_centers.append(face_center)
98-
faces[idx] = (face, True)
99-
# o_debug.append(brep.Faces[idx])
100-
else:
101-
faces[idx] = (face, False)
102-
# o_debug.append(brep.Faces[idx])
103-
104-
face_jointid = {} # face : joint id (int)
105-
joint_counter = 0
106-
for key, value in faces.items():
107-
# print(f"Face {key} is inside: {value[1]}")
108-
if value[1]:
109-
face_jointid[key] = joint_counter
110-
adjacent_faces = value[0].AdjacentFaces()
111-
for adj_face in adjacent_faces:
112-
if faces[adj_face][1]:
113-
face_jointid[value] = joint_counter
114-
joint_counter += 1
115-
else:
116-
face_jointid[value] = None
117-
118-
o_sides = [faces[key][0] for key, value in faces.items() if not value[1]]
119-
o_joints = [faces[key][0] for key, value in faces.items() if value[1]]
120-
121-
122-
123-
124-
# get the faces that are t
46+
# # brep vertices to cloud
47+
# df_cloud = diffCheck.diffcheck_bindings.dfb_geometry.DFPointCloud()
48+
# brep_vertices = []
49+
# for vertex in brep.Vertices:
50+
# brep_vertices.append(np.array([vertex.Location.X, vertex.Location.Y, vertex.Location.Z]).reshape(3, 1))
51+
# df_cloud.points = brep_vertices
52+
53+
# df_OBB = df_cloud.get_tight_bounding_box()
54+
# rh_OBB = diffCheck.df_cvt_bindings.cvt_dfOBB_2_rhbrep(df_OBB)
55+
56+
# # scale the box in the longest edge direction by 1.5 from center on both directions
57+
# rh_OBB_center = rh_OBB.GetBoundingBox(True).Center
58+
# edges = rh_OBB.Edges
59+
# edge_lengths = [edge.GetLength() for edge in edges]
60+
# longest_edge = edges[edge_lengths.index(max(edge_lengths))]
61+
# shortest_edge = edges[edge_lengths.index(min(edge_lengths))]
62+
63+
# rh_OBB_zaxis = rg.Vector3d(longest_edge.PointAt(1) - longest_edge.PointAt(0))
64+
# rh_OBB_plane = rg.Plane(rh_OBB_center, rh_OBB_zaxis)
65+
# scale_factor = 0.09
66+
# xform = rg.Transform.Scale(
67+
# rh_OBB_plane,
68+
# 1-scale_factor,
69+
# 1-scale_factor,
70+
# 1+scale_factor
71+
# )
72+
# rh_OBB.Transform(xform)
73+
74+
# # check if face's centers are inside the OBB
75+
# faces = {}
76+
# for idx, face in enumerate(brep.Faces):
77+
# face_center = rg.AreaMassProperties.Compute(face).Centroid
78+
# if rh_OBB.IsPointInside(face_center, sc.doc.ModelAbsoluteTolerance, True):
79+
# faces[idx] = (face, True)
80+
# else:
81+
# faces[idx] = (face, False)
82+
83+
# face_jointid = {} # face : joint id (int) or None
84+
# joint_counter = 0
85+
# for key, value in faces.items():
86+
# if value[1]:
87+
# face_jointid[key] = joint_counter
88+
# adjacent_faces = value[0].AdjacentFaces()
89+
# for adj_face in adjacent_faces:
90+
# if faces[adj_face][1]:
91+
# face_jointid[value] = joint_counter
92+
# joint_counter += 1
93+
# else:
94+
# face_jointid[value] = None
95+
96+
# faces_data = []
97+
# for key, value in faces.items():
98+
# faces_data.append((value[0], value[1]))
99+
# print(faces_data)
100+
101+
# o_sides = [faces[key][0] for key, value in faces.items() if not value[1]]
102+
# o_joints = [faces[key][0] for key, value in faces.items() if value[1]]
125103

126104

127-
########################################
128105

129-
# for f in crt_brep.Faces:
130-
# mass_ctr = rg.AreaMassProperties.Compute(f).Centroid
131-
# is_inside : bool = aabb.Contains(mass_ctr, strict=True)
132-
# print(f"Face {f} is inside: {is_inside}")
133-
# if is_inside:
134-
# mass_ctrs.append(mass_ctr)
135-
# o_debug = mass_ctrs
136106

137-
# # beams
138-
# beams: typing.List[DFBeam] = []
139-
# for brep in i_breps:
140-
# beam = DFBeam.from_brep(brep)
141-
# beams.append(beam)
107+
########################################
108+
109+
# beams
110+
beams: typing.List[DFBeam] = []
111+
for brep in i_breps:
112+
beam = DFBeam.from_brep(brep)
113+
beams.append(beam)
142114

143-
# # assembly
144-
# assembly1 = DFAssembly(beams, i_assembly_name)
115+
# assembly
116+
assembly1 = DFAssembly(beams, i_assembly_name)
145117

146-
# # dump the xml
147-
# xml: str = assembly1.to_xml()
148-
# if i_dump:
149-
# assembly1.dump_xml(xml, i_export_dir)
150-
# o_xml = xml
118+
# dump the xml
119+
xml: str = assembly1.to_xml()
120+
if i_dump:
121+
assembly1.dump_xml(xml, i_export_dir)
122+
o_xml = xml
151123

152-
# # show the joint/side faces
153-
# o_joints = [jf.to_brep() for jf in assembly1.all_joint_faces]
154-
# o_sides = [sf.to_brep() for sf in assembly1.all_side_faces]
124+
# show the joint/side faces
125+
o_joints = [jf.to_brep() for jf in assembly1.all_joint_faces]
126+
o_sides = [sf.to_brep() for sf in assembly1.all_side_faces]
155127

156128
return o_xml, o_joints, o_sides, o_debug
157129

0 commit comments

Comments
 (0)