# SPDX-License-Identifier: LGPL-2.1-or-later # **************************************************************************** # * Copyright (c) 2018 Maurice * # * * # * StepZ Import Export compressed STEP files for FreeCAD * # * License: LGPLv2+ * # * * # **************************************************************************** # workaround for unicode in gzipping filename # OCC7 doesn't support non-ASCII characters at the moment # https://forum.freecad.org/viewtopic.php?t=20815 import FreeCAD import FreeCADGui import shutil import os import re import ImportGui import PySide from PySide import QtCore from PySide import QtGui import tempfile ___stpZversion___ = "1.4.0" # support both gz and zipfile archives # Catia seems to use gz, Inventor zipfile # improved import, open and export import gzip as gz import builtins import importlib import zipfile as zf # import stepZ; import importlib; importlib.reload(stepZ); stepZ.open(u"C:/Temp/brick.stpz") def mkz_string(input): if isinstance(input, str): return input else: input = input.encode("utf-8") return input #### def mkz_unicode(input): if isinstance(input, str): return input else: input = input.decode("utf-8") return input #### def sayz(msg): FreeCAD.Console.PrintMessage(msg) FreeCAD.Console.PrintMessage("\n") #### def sayzw(msg): FreeCAD.Console.PrintWarning(msg) FreeCAD.Console.PrintWarning("\n") #### def sayzerr(msg): FreeCAD.Console.PrintError(msg) FreeCAD.Console.PrintWarning("\n") #### def import_stpz(fn, fc, doc): # sayz(fn) ext = os.path.splitext(os.path.basename(fn))[1] fname = os.path.splitext(os.path.basename(fn))[0] basepath = os.path.split(fn)[0] filepath = os.path.join(basepath, fname + ".stp") tempdir = tempfile.gettempdir() # get the current temporary directory tempfilepath = os.path.join(tempdir, fname + ".stp") with builtins.open(tempfilepath, "wb") as f: # py3 f.write(fc) # ImportGui.insert(filepath) if doc is None: ImportGui.open(tempfilepath) else: ImportGui.open(tempfilepath, doc.Name) FreeCADGui.SendMsgToActiveView("ViewFit") try: os.remove(tempfilepath) except OSError: sayzerr("error on removing " + tempfilepath + " file") ### def open(filename, doc=None): if zf.is_zipfile(filename): with zf.ZipFile(filename, "r") as fz: file_names = fz.namelist() for fn in file_names: sayz(fn) with fz.open(fn) as zfile: file_content = zfile.read() import_stpz(filename, file_content, doc) else: with gz.open(filename, "rb") as f: fnm = os.path.splitext(os.path.basename(filename))[0] sayz(fnm) file_content = f.read() import_stpz(filename, file_content, doc) #### def insert(filename, doc): doc = FreeCAD.ActiveDocument open(filename, doc) #### def export(objs, filename): """exporting to file folder""" # sayz(filename) sayz("stpZ version " + ___stpZversion___) ext = os.path.splitext(os.path.basename(filename))[1] fname = os.path.splitext(os.path.basename(filename))[0] basepath = os.path.split(filename)[0] tempdir = tempfile.gettempdir() # get the current temporary directory filepath = os.path.join(basepath, fname) + ".stp" filepath_base = os.path.join(basepath, fname) namefpath = os.path.join(basepath, fname) outfpath = os.path.join(basepath, fname) + ".stpZ" outfpathT = os.path.join(tempdir, fname) + ".stpZ" outfpath_stp = os.path.join(basepath, fname) + ".stp" outfpathT_stp = os.path.join(tempdir, fname) + ".stp" outfpath_base = basepath # outfpath_str = mkz_string(os.path.join(basepath,fname)) outfpath_str = os.path.join(basepath, fname) + ".stp" outfpathT_str = os.path.join(tempdir, fname) + ".stp" if os.path.exists(outfpathT_stp): os.remove(outfpathT_stp) sayzw("Old temp file with the same name removed '" + outfpathT_stp + "'") ImportGui.export(objs, outfpathT_stp) with builtins.open(outfpathT_stp, "rb") as f_in: file_content = f_in.read() new_f_content = file_content f_in.close() with gz.open(outfpathT_str, "wb") as f_out: f_out.write(new_f_content) f_out.close() if os.path.exists(outfpath): shutil.move(outfpathT_str, outfpath) # os.remove(outfpathT_stp) else: shutil.move(outfpathT_str, outfpath) # os.remove(outfpathT_stp) ####