Skip to content

Commit 85bb180

Browse files
authored
Merge pull request #3126 from Wurschdhaud/enhance-convert-import-to-3d
Convert CAD Import to FreeForm/DirectShape – Robustness Improvements
2 parents f622cae + 02b7aeb commit 85bb180

File tree

2 files changed

+54
-36
lines changed
  • extensions/pyRevitTools.extension/pyRevit.tab/Project.panel/ptools.stack/Family.pulldown/Convert Imported 3D CAD.pushbutton

2 files changed

+54
-36
lines changed

extensions/pyRevitTools.extension/pyRevit.tab/Project.panel/ptools.stack/Family.pulldown/Convert Imported 3D CAD.pushbutton/bundle.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ tooltip:
1414
es_es: Convertir símbolo CAD importado a elementos de forma libre o DirectShape
1515
de_de: Konvertiert importierte CAD Objekte in FreeForm oder DirectShape Elemente
1616
pt_br: Converter Símbolo CAD Importado para Elementos FreeForm ou DirectShape
17-
is_beta: true
17+
is_beta:

extensions/pyRevitTools.extension/pyRevit.tab/Project.panel/ptools.stack/Family.pulldown/Convert Imported 3D CAD.pushbutton/script.py

Lines changed: 53 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,21 @@
1414
forms.check_familydoc(exitscript=True)
1515

1616
selection = revit.get_selection()
17+
if selection:
18+
cad_imports = [e for e in selection if isinstance(e, DB.ImportInstance)]
19+
if not cad_imports:
20+
forms.alert("No CAD import found in selection.", exitscript=True)
21+
cad_import = cad_imports[0]
22+
if len(cad_imports) > 1:
23+
forms.alert("Multiple CAD imports selected. Using the first one.")
24+
else:
25+
cad_import = revit.pick_element("Select an imported instance")
26+
if not cad_import:
27+
script.exit()
28+
if not isinstance(cad_import, DB.ImportInstance):
29+
forms.alert("Selected element is not a CAD import.", exitscript=True)
30+
1731

18-
cad_import = selection.first
1932
cad_trans = cad_import.GetTransform()
2033
cad_type = cad_import.Document.GetElement(cad_import.GetTypeId())
2134
cad_name = revit.query.get_name(cad_type)
@@ -29,43 +42,48 @@
2942
if isinstance(geo, DB.GeometryInstance):
3043
geo_elements.extend([x for x in geo.GetSymbolGeometry()])
3144

32-
solids = []
33-
for gel in geo_elements:
34-
logger.debug(gel)
35-
if isinstance(gel, DB.Solid):
36-
# if hasattr(gel, 'Volume') and gel.Volume > 0.0:
37-
solids.append(gel)
38-
elif isinstance(gel, DB.Mesh):
39-
builder = DB.TessellatedShapeBuilder()
40-
builder.OpenConnectedFaceSet(False)
45+
solid_count = 0
46+
mesh_count = 0
47+
with revit.Transaction("Convert CAD Import to FreeForm/DirectShape"):
48+
for gel in geo_elements:
49+
logger.debug(gel)
50+
if isinstance(gel, DB.Solid):
51+
# if hasattr(gel, 'Volume') and gel.Volume > 0.0:
52+
DB.FreeFormElement.Create(revit.doc, gel)
53+
solid_count += 1
54+
elif isinstance(gel, DB.Mesh):
55+
builder = DB.TessellatedShapeBuilder()
56+
builder.OpenConnectedFaceSet(False)
4157

42-
triangles = [gel.Triangle[x] for x in range(0, gel.NumTriangles)]
43-
for t in triangles:
44-
p1 = cad_trans.OfPoint(t.Vertex[0])
45-
p2 = cad_trans.OfPoint(t.Vertex[1])
46-
p3 = cad_trans.OfPoint(t.Vertex[2])
47-
tface = DB.TessellatedFace(List[DB.XYZ]([p1, p2, p3]),
48-
DB.ElementId.InvalidElementId)
49-
builder.AddFace(tface)
58+
triangles = [gel.Triangle[x] for x in range(0, gel.NumTriangles)]
59+
for t in triangles:
60+
p1 = cad_trans.OfPoint(t.Vertex[0])
61+
p2 = cad_trans.OfPoint(t.Vertex[1])
62+
p3 = cad_trans.OfPoint(t.Vertex[2])
63+
tface = DB.TessellatedFace(
64+
List[DB.XYZ]([p1, p2, p3]), DB.ElementId.InvalidElementId
65+
)
66+
builder.AddFace(tface)
5067

51-
builder.CloseConnectedFaceSet()
52-
builder.Target = DB.TessellatedShapeBuilderTarget.AnyGeometry
53-
builder.Fallback = DB.TessellatedShapeBuilderFallback.Mesh
54-
builder.Build()
68+
builder.CloseConnectedFaceSet()
69+
builder.Target = DB.TessellatedShapeBuilderTarget.AnyGeometry
70+
builder.Fallback = DB.TessellatedShapeBuilderFallback.Mesh
71+
builder.Build()
5572

56-
with revit.Transaction("Convert CAD Import to DirectShape"):
57-
ds = DB.DirectShape.CreateElement(
58-
revit.doc,
59-
family_cat.Id
60-
# DB.ElementId(DB.BuiltInCategory.OST_DataDevices)
61-
)
62-
ds.ApplicationId = 'B39107C3-A1D7-47F4-A5A1-532DDF6EDB5D'
63-
ds.ApplicationDataId = ''
73+
ds = DB.DirectShape.CreateElement(revit.doc, family_cat.Id)
74+
ds.ApplicationId = "B39107C3-A1D7-47F4-A5A1-532DDF6EDB5D"
75+
ds.ApplicationDataId = ""
6476
ds.SetShape(builder.GetBuildResult().GetGeometricalObjects())
6577
ds.Name = cad_name
78+
mesh_count += 1
6679

67-
68-
# create freeform from solids
69-
with revit.Transaction("Convert CAD Import to FreeFrom/DirectShape"):
70-
for solid in solids:
71-
DB.FreeFormElement.Create(revit.doc, solid)
80+
if not solid_count and not mesh_count:
81+
forms.alert(
82+
"No solids or meshes found in the CAD import. Nothing was converted.",
83+
exitscript=True,
84+
)
85+
logger.info(
86+
"Converted {} solids and {} meshes from {}".format(
87+
solid_count, mesh_count, cad_name
88+
)
89+
)

0 commit comments

Comments
 (0)