Skip to content
This repository was archived by the owner on Mar 1, 2025. It is now read-only.

Commit 57637b6

Browse files
committed
BIM: NativeIFC: Support for types
1 parent 672819f commit 57637b6

File tree

7 files changed

+318
-69
lines changed

7 files changed

+318
-69
lines changed

src/Mod/BIM/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ SET(nativeifc_SRCS
187187
nativeifc/ifc_viewproviders.py
188188
nativeifc/__init__.py
189189
nativeifc/ifc_openshell.py
190+
nativeifc/ifc_types.py
190191
)
191192

192193
SOURCE_GROUP("" FILES ${Arch_SRCS})

src/Mod/BIM/Resources/Arch.qrc

Lines changed: 62 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,5 @@
11
<RCC>
22
<qresource>
3-
<file>icons/IFC/IfcBeam.svg</file>
4-
<file>icons/IFC/IfcBuilding.svg</file>
5-
<file>icons/IFC/IfcBuildingStorey.svg</file>
6-
<file>icons/IFC/IfcColumn.svg</file>
7-
<file>icons/IFC/IfcCovering.svg</file>
8-
<file>icons/IFC/IfcDoor.svg</file>
9-
<file>icons/IFC/IfcFooting.svg</file>
10-
<file>icons/IFC/IfcMember.svg</file>
11-
<file>icons/IFC/IfcPile.svg</file>
12-
<file>icons/IFC/IfcPlate.svg</file>
13-
<file>icons/IFC/IfcRailing.svg</file>
14-
<file>icons/IFC/IfcRamp.svg</file>
15-
<file>icons/IFC/IfcRoof.svg</file>
16-
<file>icons/IFC/IfcSite.svg</file>
17-
<file>icons/IFC/IfcSlab.svg</file>
18-
<file>icons/IFC/IfcStair.svg</file>
19-
<file>icons/IFC/IfcWall.svg</file>
20-
<file>icons/IFC/IfcWindow.svg</file>
213
<file>icons/Arch_3Views.svg</file>
224
<file>icons/Arch_Add.svg</file>
235
<file>icons/Arch_Axis.svg</file>
@@ -163,6 +145,67 @@
163145
<file>icons/techdraw-ArchView.svg</file>
164146
<file>icons/techdraw-PageDefault.svg</file>
165147
<file>icons/warning.svg</file>
148+
<file>icons/IFC/IfcBeam.svg</file>
149+
<file>icons/IFC/IfcBuilding.svg</file>
150+
<file>icons/IFC/IfcBuildingStorey.svg</file>
151+
<file>icons/IFC/IfcColumn.svg</file>
152+
<file>icons/IFC/IfcCovering.svg</file>
153+
<file>icons/IFC/IfcDoor.svg</file>
154+
<file>icons/IFC/IfcFooting.svg</file>
155+
<file>icons/IFC/IfcMember.svg</file>
156+
<file>icons/IFC/IfcPile.svg</file>
157+
<file>icons/IFC/IfcPlate.svg</file>
158+
<file>icons/IFC/IfcRailing.svg</file>
159+
<file>icons/IFC/IfcRamp.svg</file>
160+
<file>icons/IFC/IfcRoof.svg</file>
161+
<file>icons/IFC/IfcSite.svg</file>
162+
<file>icons/IFC/IfcSlab.svg</file>
163+
<file>icons/IFC/IfcStair.svg</file>
164+
<file>icons/IFC/IfcWall.svg</file>
165+
<file>icons/IFC/IfcWindow.svg</file>
166+
<file>translations/Arch_af.qm</file>
167+
<file>translations/Arch_ar.qm</file>
168+
<file>translations/Arch_be.qm</file>
169+
<file>translations/Arch_bg.qm</file>
170+
<file>translations/Arch_ca.qm</file>
171+
<file>translations/Arch_cs.qm</file>
172+
<file>translations/Arch_da.qm</file>
173+
<file>translations/Arch_de.qm</file>
174+
<file>translations/Arch_el.qm</file>
175+
<file>translations/Arch_es-AR.qm</file>
176+
<file>translations/Arch_es-ES.qm</file>
177+
<file>translations/Arch_eu.qm</file>
178+
<file>translations/Arch_fi.qm</file>
179+
<file>translations/Arch_fil.qm</file>
180+
<file>translations/Arch_fr.qm</file>
181+
<file>translations/Arch_gl.qm</file>
182+
<file>translations/Arch_hr.qm</file>
183+
<file>translations/Arch_hu.qm</file>
184+
<file>translations/Arch_id.qm</file>
185+
<file>translations/Arch_it.qm</file>
186+
<file>translations/Arch_ja.qm</file>
187+
<file>translations/Arch_ka.qm</file>
188+
<file>translations/Arch_kab.qm</file>
189+
<file>translations/Arch_ko.qm</file>
190+
<file>translations/Arch_lt.qm</file>
191+
<file>translations/Arch_nl.qm</file>
192+
<file>translations/Arch_no.qm</file>
193+
<file>translations/Arch_pl.qm</file>
194+
<file>translations/Arch_pt-BR.qm</file>
195+
<file>translations/Arch_pt-PT.qm</file>
196+
<file>translations/Arch_ro.qm</file>
197+
<file>translations/Arch_ru.qm</file>
198+
<file>translations/Arch_sk.qm</file>
199+
<file>translations/Arch_sl.qm</file>
200+
<file>translations/Arch_sr-CS.qm</file>
201+
<file>translations/Arch_sr.qm</file>
202+
<file>translations/Arch_sv-SE.qm</file>
203+
<file>translations/Arch_tr.qm</file>
204+
<file>translations/Arch_uk.qm</file>
205+
<file>translations/Arch_val-ES.qm</file>
206+
<file>translations/Arch_vi.qm</file>
207+
<file>translations/Arch_zh-CN.qm</file>
208+
<file>translations/Arch_zh-TW.qm</file>
166209
<file>ui/ArchMaterial.ui</file>
167210
<file>ui/ArchMultiMaterial.ui</file>
168211
<file>ui/ArchNest.ui</file>
@@ -190,6 +233,7 @@
190233
<file>ui/dialogClasses.ui</file>
191234
<file>ui/dialogClassification.ui</file>
192235
<file>ui/dialogConvertDocument.ui</file>
236+
<file>ui/dialogConvertType.ui</file>
193237
<file>ui/dialogCreateProject.ui</file>
194238
<file>ui/dialogCustomProperties.ui</file>
195239
<file>ui/dialogDiff.ui</file>
@@ -223,48 +267,5 @@
223267
<file>ui/preferences-ifc-export.ui</file>
224268
<file>ui/preferences-ifc.ui</file>
225269
<file>ui/preferencesNativeIFC.ui</file>
226-
<file>translations/Arch_af.qm</file>
227-
<file>translations/Arch_ar.qm</file>
228-
<file>translations/Arch_be.qm</file>
229-
<file>translations/Arch_bg.qm</file>
230-
<file>translations/Arch_ca.qm</file>
231-
<file>translations/Arch_cs.qm</file>
232-
<file>translations/Arch_da.qm</file>
233-
<file>translations/Arch_de.qm</file>
234-
<file>translations/Arch_el.qm</file>
235-
<file>translations/Arch_es-AR.qm</file>
236-
<file>translations/Arch_es-ES.qm</file>
237-
<file>translations/Arch_eu.qm</file>
238-
<file>translations/Arch_fi.qm</file>
239-
<file>translations/Arch_fil.qm</file>
240-
<file>translations/Arch_fr.qm</file>
241-
<file>translations/Arch_gl.qm</file>
242-
<file>translations/Arch_hr.qm</file>
243-
<file>translations/Arch_hu.qm</file>
244-
<file>translations/Arch_id.qm</file>
245-
<file>translations/Arch_it.qm</file>
246-
<file>translations/Arch_ja.qm</file>
247-
<file>translations/Arch_ka.qm</file>
248-
<file>translations/Arch_kab.qm</file>
249-
<file>translations/Arch_ko.qm</file>
250-
<file>translations/Arch_lt.qm</file>
251-
<file>translations/Arch_nl.qm</file>
252-
<file>translations/Arch_no.qm</file>
253-
<file>translations/Arch_pl.qm</file>
254-
<file>translations/Arch_pt-BR.qm</file>
255-
<file>translations/Arch_pt-PT.qm</file>
256-
<file>translations/Arch_ro.qm</file>
257-
<file>translations/Arch_ru.qm</file>
258-
<file>translations/Arch_sk.qm</file>
259-
<file>translations/Arch_sl.qm</file>
260-
<file>translations/Arch_sr-CS.qm</file>
261-
<file>translations/Arch_sr.qm</file>
262-
<file>translations/Arch_sv-SE.qm</file>
263-
<file>translations/Arch_tr.qm</file>
264-
<file>translations/Arch_uk.qm</file>
265-
<file>translations/Arch_val-ES.qm</file>
266-
<file>translations/Arch_vi.qm</file>
267-
<file>translations/Arch_zh-CN.qm</file>
268-
<file>translations/Arch_zh-TW.qm</file>
269270
</qresource>
270271
</RCC>
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>Dialog</class>
4+
<widget class="QDialog" name="Dialog">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>448</width>
10+
<height>161</height>
11+
</rect>
12+
</property>
13+
<property name="windowTitle">
14+
<string>Convert to IFC type</string>
15+
</property>
16+
<layout class="QVBoxLayout" name="verticalLayout">
17+
<item>
18+
<widget class="QLabel" name="label">
19+
<property name="sizePolicy">
20+
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
21+
<horstretch>0</horstretch>
22+
<verstretch>0</verstretch>
23+
</sizepolicy>
24+
</property>
25+
<property name="text">
26+
<string>This object will be converted to a %1 type. Types can be used to give common attributes and properties to several objects at once.</string>
27+
</property>
28+
<property name="wordWrap">
29+
<bool>true</bool>
30+
</property>
31+
</widget>
32+
</item>
33+
<item>
34+
<widget class="QCheckBox" name="checkKeepObject">
35+
<property name="text">
36+
<string>Keep original object. The object will adopt the new type</string>
37+
</property>
38+
</widget>
39+
</item>
40+
<item>
41+
<widget class="QDialogButtonBox" name="buttonBox">
42+
<property name="orientation">
43+
<enum>Qt::Horizontal</enum>
44+
</property>
45+
<property name="standardButtons">
46+
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
47+
</property>
48+
</widget>
49+
</item>
50+
</layout>
51+
</widget>
52+
<resources/>
53+
<connections>
54+
<connection>
55+
<sender>buttonBox</sender>
56+
<signal>accepted()</signal>
57+
<receiver>Dialog</receiver>
58+
<slot>accept()</slot>
59+
<hints>
60+
<hint type="sourcelabel">
61+
<x>248</x>
62+
<y>254</y>
63+
</hint>
64+
<hint type="destinationlabel">
65+
<x>157</x>
66+
<y>274</y>
67+
</hint>
68+
</hints>
69+
</connection>
70+
<connection>
71+
<sender>buttonBox</sender>
72+
<signal>rejected()</signal>
73+
<receiver>Dialog</receiver>
74+
<slot>reject()</slot>
75+
<hints>
76+
<hint type="sourcelabel">
77+
<x>316</x>
78+
<y>260</y>
79+
</hint>
80+
<hint type="destinationlabel">
81+
<x>286</x>
82+
<y>274</y>
83+
</hint>
84+
</hints>
85+
</connection>
86+
</connections>
87+
</ui>

src/Mod/BIM/nativeifc/ifc_objects.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222

2323
"""This module contains IFC object definitions"""
2424

25+
import FreeCAD
26+
translate = FreeCAD.Qt.translate
27+
2528

2629
class ifc_object:
2730
"""Base class for all IFC-based objects"""
@@ -52,6 +55,8 @@ def onChanged(self, obj, prop):
5255
self.rebuild_classlist(obj, setprops=True)
5356
elif prop == "Schema":
5457
self.edit_schema(obj, obj.Schema)
58+
elif prop == "Type":
59+
self.edit_type(obj)
5560
elif prop == "Group":
5661
self.edit_group(obj)
5762
elif obj.getGroupOfProperty(prop) == "IFC":
@@ -70,7 +75,7 @@ def onChanged(self, obj, prop):
7075
obj.ViewObject.signalChangeIcon()
7176
elif obj.getGroupOfProperty(prop) == "Geometry":
7277
self.edit_geometry(obj, prop)
73-
elif obj.getGroupOfProperty(prop) not in ["Base", "IFC", "", "Geometry"]:
78+
elif obj.getGroupOfProperty(prop) not in ["Base", "IFC", "", "Geometry", "PhysicalProperties"]:
7479
# Treat all property groups outside the default ones as Psets
7580
# print("DEBUG: editinog pset prop",prop)
7681
self.edit_pset(obj, prop)
@@ -246,6 +251,42 @@ def edit_group(self, obj):
246251
if newlist != obj.Group:
247252
obj.Group = newlist
248253

254+
def edit_type(self, obj):
255+
"""Edits the type of this object"""
256+
257+
from nativeifc import ifc_tools # lazy import
258+
from nativeifc import ifc_types
259+
260+
element = ifc_tools.get_ifc_element(obj)
261+
ifcfile = ifc_tools.get_ifcfile(obj)
262+
if not element or not ifcfile:
263+
return
264+
typerel = getattr(element, "IsTypedBy", None)
265+
if obj.Type:
266+
# verify the type is compatible -ex IFcWall in IfcWallType
267+
if obj.Type.Class != element.is_a() + "Type":
268+
t = translate("BIM","Error: Incompatible type")
269+
FreeCAD.Console.PrintError(obj.Label+": "+t+": "+obj.Type.Class+"\n")
270+
obj.Type = None
271+
return
272+
# change type
273+
new_type = ifc_tools.get_ifc_element(obj.Type)
274+
if not new_type:
275+
return
276+
for rel in typerel:
277+
if rel.RelatingType == new_type:
278+
return
279+
# assign the new type
280+
ifc_tools.api_run("type.assign_type",
281+
ifcfile,
282+
related_objects=[element],
283+
relating_type=new_type
284+
)
285+
elif typerel:
286+
# TODO remove type?
287+
# Not doing anything right now because an unset Type property could screw the ifc file
288+
pass
289+
249290

250291
class document_object:
251292
"""Holder for the document's IFC objects"""

src/Mod/BIM/nativeifc/ifc_tools.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,8 @@ def add_properties(
525525
obj.ShapeMode = shapemode
526526
if not obj.isDerivedFrom("Part::Feature"):
527527
obj.setPropertyStatus("ShapeMode", "Hidden")
528+
if ifcentity.is_a("IfcProduct"):
529+
obj.addProperty("App::PropertyLink", "Type", "IFC")
528530
attr_defs = ifcentity.wrapped_data.declaration().as_entity().all_attributes()
529531
try:
530532
info_ifcentity = ifcentity.get_info()
@@ -1190,7 +1192,7 @@ def get_subvolume(obj):
11901192
def create_relationship(old_obj, obj, parent, element, ifcfile, mode=None):
11911193
"""Creates a relationship between an IFC object and a parent IFC object"""
11921194

1193-
if isinstance(parent, FreeCAD.DocumentObject):
1195+
if isinstance(parent, (FreeCAD.DocumentObject, FreeCAD.Document)):
11941196
parent_element = get_ifc_element(parent)
11951197
else:
11961198
parent_element = parent
@@ -1373,15 +1375,18 @@ def migrate_schema(ifcfile, schema):
13731375
return newfile, table
13741376

13751377

1376-
def remove_ifc_element(obj):
1377-
"""removes the IFC data associated with an object"""
1378+
def remove_ifc_element(obj,delete_obj=False):
1379+
"""removes the IFC data associated with an object.
1380+
If delete_obj is True, the FreeCAD object is also deleted"""
13781381

13791382
# This function can become pure IFC
13801383

13811384
ifcfile = get_ifcfile(obj)
13821385
element = get_ifc_element(obj)
13831386
if ifcfile and element:
13841387
api_run("root.remove_product", ifcfile, product=element)
1388+
if delete_obj:
1389+
obj.Document.removeObject(obj.Name)
13851390
return True
13861391
return False
13871392

0 commit comments

Comments
 (0)