Arch: Added .ifcjson export type

This commit is contained in:
Yorik van Havre
2020-11-27 13:09:34 +01:00
parent 15e661061c
commit c3b0af2d8d
2 changed files with 41 additions and 3 deletions

View File

@@ -22,6 +22,7 @@
# add import/export types
FreeCAD.addImportType("Industry Foundation Classes (*.ifc)","importIFC")
FreeCAD.addExportType("Industry Foundation Classes (*.ifc)","exportIFC")
FreeCAD.addExportType("Industry Foundation Classes - IFCJSON (*.ifcJSON)","exportIFC")
FreeCAD.addImportType("Wavefront OBJ - Arch module (*.obj)","importOBJ")
FreeCAD.addExportType("Wavefront OBJ - Arch module (*.obj)","importOBJ")
FreeCAD.addExportType("WebGL file (*.html)","importWebGL")

View File

@@ -195,6 +195,16 @@ def export(exportList, filename, colors=None, preferences=None):
"Visit https://wiki.freecadweb.org/IfcOpenShell "
"to learn about installing it.")
return
if filename.lower().endswith("json"):
import json
try:
from ifcjson import ifc2json5a
except:
try:
import ifc2json5a
except:
_err("Error: Unable to locate ifc2json5a module. Aborting.")
return
starttime = time.time()
@@ -1534,7 +1544,10 @@ def export(exportList, filename, colors=None, preferences=None):
filename = decode(filename)
ifcfile.write(filename)
if filename.lower().endswith("json"):
writeJson(filename,ifcfile)
else:
ifcfile.write(filename)
if preferences['STORE_UID']:
# some properties might have been changed
@@ -1542,7 +1555,7 @@ def export(exportList, filename, colors=None, preferences=None):
os.remove(templatefile)
if preferences['DEBUG'] and ifcbin.compress:
if preferences['DEBUG'] and ifcbin.compress and (not filename.lower().endswith("json")):
f = pyopen(filename,"r")
s = len(f.read().split("\n"))
f.close()
@@ -1637,7 +1650,7 @@ def getIfcTypeFromObj(obj):
if not "::" in ifctype:
ifctype = "Ifc" + ifctype
elif ifctype == "App::DocumentObjctGroup":
elif ifctype == "IfcApp::DocumentObjctGroup":
ifctype = "IfcGroup"
else:
# it makes no sense to return IfcPart::Cylinder for a Part::Cylinder
@@ -2364,6 +2377,7 @@ def getText(field,obj):
result = result.encode("utf8")
return result
def getAxisContext(ifcfile):
"""gets or creates an axis context"""
@@ -2379,6 +2393,7 @@ def getAxisContext(ifcfile):
nctx = ifcfile.createIfcGeometricRepresentationSubContext('Axis','Model',None,None,None,None,ctx,None,"MODEL_VIEW",None);
return nctx
def createAxis(ifcfile,obj,preferences):
"""Creates an axis for a given wall, if applicable"""
@@ -2391,3 +2406,25 @@ def createAxis(ifcfile,obj,preferences):
axis = ifcfile.createIfcShapeRepresentation(ctx,'Axis','Curve2D',[curve])
return axis
return None
def writeJson(filename,ifcfile):
"""writes an .ifcjson file"""
import json
try:
from ifcjson import ifc2json5a
except:
try:
import ifc2json5a
except:
print("Error: Unable to locate ifc2json5a module. Aborting.")
return
print("Converting IFC to JSON...")
jsonfile = ifc2json5a.IFC2JSON5a(ifcfile).spf2Json()
f = pyopen(filename,'w')
s = json.dumps(jsonfile,indent=4)
#print("json:",s)
f.write(s)
f.close()