Arch: import IFC, move methods used by import and export to helper

This commit is contained in:
Bernd Hahnebach
2019-08-21 12:03:13 +02:00
parent 2390a219c0
commit 8c4856ebeb
3 changed files with 51 additions and 45 deletions

View File

@@ -39,11 +39,12 @@ import Draft
import Arch
import DraftVecUtils
import ArchIFCSchema
from DraftGeomUtils import vec
from importIFC import dd2dms
from importIFC import decode
import exportIFCHelper
from DraftGeomUtils import vec
from importIFCHelper import dd2dms
from importIFCHelper import decode
## @package exportIFC
# \ingroup ARCH

View File

@@ -30,7 +30,6 @@ __url__ = "http://www.freecadweb.org"
import six
import os
import math
import sys
import FreeCAD
import Part
@@ -139,41 +138,7 @@ structuralifcobjects = (
# ************************************************************************************************
# ********** some helper, used in import and export
def decode(filename,utf=False):
"turns unicodes into strings"
if six.PY2 and isinstance(filename,six.text_type):
# workaround since ifcopenshell currently can't handle unicode filenames
encoding = "utf8" if utf else sys.getfilesystemencoding()
filename = filename.encode(encoding)
return filename
def dd2dms(dd):
"converts decimal degrees to degrees,minutes,seconds"
dd = abs(dd)
minutes,seconds = divmod(dd*3600,60)
degrees,minutes = divmod(minutes,60)
if dd < 0:
degrees = -degrees
return (int(degrees),int(minutes),int(seconds))
def dms2dd(degrees, minutes, seconds, milliseconds=0):
"converts degrees,minutes,seconds to decimal degrees"
dd = float(degrees) + float(minutes)/60 + float(seconds)/(3600)
return dd
# ************************************************************************************************
# ********** duplicate methods ****************
# ********** duplicate methods, they are in importIFC and exportIFC ****************
# TODO get rid of this duplicate
def getPreferences():
@@ -225,7 +190,7 @@ def open(filename,skip=[],only=[],root=None):
"opens an IFC file in a new document"
docname = os.path.splitext(os.path.basename(filename))[0]
docname = decode(docname,utf=True)
docname = importIFCHelper.decode(docname,utf=True)
doc = FreeCAD.newDocument(docname)
doc.Label = docname
doc = insert(filename,doc.Name,skip,only,root)
@@ -265,7 +230,7 @@ def insert(filename,docname,skip=[],only=[],root=None):
# keeping global variable for debugging purposes
# global ifcfile
filename = decode(filename,utf=True)
filename = importIFCHelper.decode(filename,utf=True)
ifcfile = ifcopenshell.open(filename)
# get file scale
@@ -823,9 +788,9 @@ def insert(filename,docname,skip=[],only=[],root=None):
if product.RefElevation:
obj.Elevation = product.RefElevation * ifcscale
if product.RefLatitude:
obj.Latitude = dms2dd(*product.RefLatitude)
obj.Latitude = importIFCHelper.dms2dd(*product.RefLatitude)
if product.RefLongitude:
obj.Longitude = dms2dd(*product.RefLongitude)
obj.Longitude = importIFCHelper.dms2dd(*product.RefLongitude)
if product.SiteAddress:
if product.SiteAddress.AddressLines:
obj.Address = product.SiteAddress.AddressLines[0]

View File

@@ -1,10 +1,50 @@
import six
import sys
import math
import FreeCAD
import Arch
import ArchIFC
import math
import six
# ************************************************************************************************
# ********** some helper, used in import and export, or should stay together
def decode(filename,utf=False):
"turns unicodes into strings"
if six.PY2 and isinstance(filename,six.text_type):
# workaround since ifcopenshell currently can't handle unicode filenames
encoding = "utf8" if utf else sys.getfilesystemencoding()
filename = filename.encode(encoding)
return filename
# used in export
def dd2dms(dd):
"converts decimal degrees to degrees,minutes,seconds"
dd = abs(dd)
minutes,seconds = divmod(dd*3600,60)
degrees,minutes = divmod(minutes,60)
if dd < 0:
degrees = -degrees
return (int(degrees),int(minutes),int(seconds))
# used in import
def dms2dd(degrees, minutes, seconds, milliseconds=0):
"converts degrees,minutes,seconds to decimal degrees"
dd = float(degrees) + float(minutes)/60 + float(seconds)/(3600)
return dd
# ************************************************************************************************
# ********** some helper, mainly used in import
class ProjectImporter:
"""A helper class to create a FreeCAD Arch Project object"""