From 11a4025c4be28f5bd7d40c7bfb0d05a0d33feff3 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Tue, 23 Dec 2014 17:34:56 -0200 Subject: [PATCH] Arch: Fixed Ifc explorer to work with recent ifcopenshell --- src/Mod/Arch/importIFC.py | 121 +++++++++++++++++++++++++++++--- src/Mod/Arch/importIFClegacy.py | 9 ++- 2 files changed, 118 insertions(+), 12 deletions(-) diff --git a/src/Mod/Arch/importIFC.py b/src/Mod/Arch/importIFC.py index 633040259..81f711fb6 100644 --- a/src/Mod/Arch/importIFC.py +++ b/src/Mod/Arch/importIFC.py @@ -83,22 +83,123 @@ END-ISO-10303-21; """ -def explore(filename=None): - "opens a dialog showing the contents of an IFC file" +def explore(filename=None,toplevel="IfcRoot"): + """explore([filename],[toplevel]): opens a dialog showing + the contents of an IFC file. If no filename is given, a dialog will + pop up to choose a file. toplevel (default IFcRoot) can be used to + limit the display to a certain category of objects and its derivates.""" + + p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch") + DEBUG = p.GetBool("ifcDebug",False) + + try: + import ifcopenshell + except: + if DEBUG: print "using legacy importer" + import importIFClegacy + return importIFClegacy.explore(filename) if not filename: from PySide import QtGui filename = QtGui.QFileDialog.getOpenFileName(QtGui.qApp.activeWindow(),'IFC files','*.ifc') if filename: filename = filename[0] - if filename: - import importIFClegacy - importIFClegacy.getConfig() - schema=importIFClegacy.getSchema() - importIFClegacy.DEBUG = DEBUG - d = importIFClegacy.explorer(filename,schema) - d.show() - return d + + from PySide import QtCore,QtGui + + if isinstance(filename,unicode): + import sys #workaround since ifcopenshell currently can't handle unicode filenames + filename = filename.encode(sys.getfilesystemencoding()) + + if not os.path.exists(filename): + print "File not found" + return + + ifcopenshell.clean() + ifc = ifcopenshell.open(filename) + tree = QtGui.QTreeWidget() + tree.setColumnCount(3) + tree.setWordWrap(True) + tree.header().setDefaultSectionSize(60) + tree.header().resizeSection(0,60) + tree.header().resizeSection(1,30) + tree.header().setStretchLastSection(True) + tree.headerItem().setText(0, "ID") + tree.headerItem().setText(1, "") + tree.headerItem().setText(2, "Item and Properties") + bold = QtGui.QFont() + bold.setWeight(75) + bold.setBold(True) + + for entity in ifc.by_type(toplevel): + item = QtGui.QTreeWidgetItem(tree) + if hasattr(entity,"id"): + item.setText(0,str(entity.id())) + if entity.is_a() in ["IfcWall","IfcWallStandardCase"]: + item.setIcon(1,QtGui.QIcon(":icons/Arch_Wall_Tree.svg")) + elif entity.is_a() in ["IfcColumn","IfcColumnStandardCase","IfcBeam","IfcBeamStandardCase","IfcSlab","IfcFooting","IfcPile","IfcTendon"]: + item.setIcon(1,QtGui.QIcon(":icons/Arch_Structure_Tree.svg")) + elif entity.is_a() in ["IfcSite"]: + item.setIcon(1,QtGui.QIcon(":icons/Arch_Site_Tree.svg")) + elif entity.is_a() in ["IfcBuilding"]: + item.setIcon(1,QtGui.QIcon(":icons/Arch_Building_Tree.svg")) + elif entity.is_a() in ["IfcBuildingStorey"]: + item.setIcon(1,QtGui.QIcon(":icons/Arch_Floor_Tree.svg")) + elif entity.is_a() in ["IfcWindow","IfcWindowStandardCase","IfcDoor","IfcDoorStandardCase"]: + item.setIcon(1,QtGui.QIcon(":icons/Arch_Window_Tree.svg")) + elif entity.is_a() in ["IfcRoof"]: + item.setIcon(1,QtGui.QIcon(":icons/Arch_Roof_Tree.svg")) + elif entity.is_a() in ["IfcExtrudedAreaSolid","IfcClosedShell"]: + item.setIcon(1,QtGui.QIcon(":icons/Tree_Part.svg")) + elif entity.is_a() in ["IfcFace"]: + item.setIcon(1,QtGui.QIcon(":icons/Draft_SwitchMode.svg")) + elif entity.is_a() in ["IfcArbitraryClosedProfileDef","IfcPolyloop"]: + item.setIcon(1,QtGui.QIcon(":icons/Draft_Draft.svg")) + item.setText(2,str(entity.is_a())) + item.setFont(2,bold); + + i = 0 + while True: + try: + argname = entity.wrapped_data.get_argument_name(i) + except: + break + else: + try: + argvalue = entity.wrapped_data.get_argument(i) + except: + print "Error in entity ",entity + break + else: + if not argname in ["Id", "GlobalId"]: + if isinstance(argvalue,ifcopenshell.ifc_wrapper.entity_instance): + t = "Entity #" + str(argvalue.id()) + ": " + str(argvalue.is_a()) + elif isinstance(argvalue,list): + t = "" + else: + t = str(argvalue) + t = " " + str(argname) + " : " + str(t) + item = QtGui.QTreeWidgetItem(tree) + item.setText(2,str(t)) + if isinstance(argvalue,list): + for argitem in argvalue: + if isinstance(argitem,ifcopenshell.ifc_wrapper.entity_instance): + t = "Entity #" + str(argitem.id()) + ": " + str(argitem.is_a()) + else: + t = argitem + t = " " + str(t) + item = QtGui.QTreeWidgetItem(tree) + item.setText(2,str(t)) + i += 1 + + d = QtGui.QDialog() + d.setObjectName("IfcExplorer") + d.setWindowTitle("Ifc Explorer") + d.resize(640, 480) + layout = QtGui.QVBoxLayout(d) + layout.addWidget(tree) + + d.exec_() return diff --git a/src/Mod/Arch/importIFClegacy.py b/src/Mod/Arch/importIFClegacy.py index 57e3b620f..e0ed479b4 100644 --- a/src/Mod/Arch/importIFClegacy.py +++ b/src/Mod/Arch/importIFClegacy.py @@ -1407,8 +1407,12 @@ class IfcSchema: def __init__(self, filename): self.filename = filename if not os.path.exists(filename): - raise ImportError("no IFCSchema file found!") - else: + p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro") + p = p.GetString("MacroPath","") + filename = p + os.sep + filename + if not os.path.exists(filename): + raise ImportError("no IFCSchema file found!") + self.file = open(self.filename) self.data = self.file.read() self.types = self.readTypes() @@ -1861,6 +1865,7 @@ def explorer(filename,schema="IFC2X3_TC1.exp"): t = " " + str(t) item = QtGui.QTreeWidgetItem(tree) item.setText(2,str(t)) + d = QtGui.QDialog() d.setObjectName("IfcExplorer") d.setWindowTitle("Ifc Explorer")