diff --git a/src/Mod/Import/App/AppImportPy.cpp b/src/Mod/Import/App/AppImportPy.cpp index 0aacf3b16b..b32c5e4084 100644 --- a/src/Mod/Import/App/AppImportPy.cpp +++ b/src/Mod/Import/App/AppImportPy.cpp @@ -95,10 +95,10 @@ public: "readDXF(filename,[document,ignore_errors]): Imports a DXF file into the given document. ignore_errors is True by default." ); add_varargs_method("writeDXFShape",&Module::writeDXFShape, - "writeDXFShape([shape],filename): Exports Shape(s) to a DXF file." + "writeDXFShape([shape],filename [version,usePolyline,optionSource]): Exports Shape(s) to a DXF file." ); add_varargs_method("writeDXFObject",&Module::writeDXFObject, - "writeDXFObject([objects],filename): Exports DocumentObject(s) to a DXF file." + "writeDXFObject([objects],filename [,version,usePolyline,optionSource]): Exports DocumentObject(s) to a DXF file." ); initialize("This module is the Import module."); // register with Python } @@ -385,21 +385,44 @@ private: const char* optionSource = nullptr; char* defaultOptions = "User parameter:BaseApp/Preferences/Mod/Import"; char* useOptionSource = nullptr; + int versionParm = -1; + bool versionOverride = false; + bool polyOverride = false; + PyObject *usePolyline = Py_False; - if (PyArg_ParseTuple(args.ptr(), "O!et|s", &(PyList_Type) ,&shapeObj, "utf-8",&fname, &optionSource)) { + //handle list of shapes + if (PyArg_ParseTuple(args.ptr(), "O!et|iOs", &(PyList_Type) , + &shapeObj, + "utf-8", + &fname, + &versionParm, + &usePolyline, + &optionSource)) { filePath = std::string(fname); layerName = "none"; PyMem_Free(fname); + if ((versionParm == 12) or + (versionParm == 14)) { + versionOverride = true; + } + if (usePolyline == Py_True) { + polyOverride = true; + } if (optionSource) { strcpy(useOptionSource,optionSource); } else { useOptionSource = defaultOptions; } + try { ImpExpDxfWrite writer(filePath); writer.setOptionSource(useOptionSource); writer.setOptions(); + if (versionOverride) { + writer.setVersion(versionParm); + } + writer.setPolyOverride(true); writer.setLayerName(layerName); writer.init(); Py::Sequence list(shapeObj); @@ -415,25 +438,40 @@ private: catch (const Base::Exception& e) { throw Py::RuntimeError(e.what()); } - } else if (PyArg_ParseTuple(args.ptr(), "O!et|s", + + } else if (PyArg_ParseTuple(args.ptr(), "O!et|iOs", &(Part::TopoShapePy::Type) , &shapeObj, "utf-8", &fname, + &versionParm, + &usePolyline, &optionSource)) { filePath = std::string(fname); layerName = "none"; PyMem_Free(fname); + if ((versionParm == 12) or + (versionParm == 14)) { + versionOverride = true; + } + if (usePolyline == Py_True) { + polyOverride = true; + } if (optionSource) { strcpy(useOptionSource,optionSource); } else { useOptionSource = defaultOptions; } + try { ImpExpDxfWrite writer(filePath); writer.setOptionSource(useOptionSource); writer.setOptions(); + if (versionOverride) { + writer.setVersion(versionParm); + } + writer.setPolyOverride(polyOverride); writer.setLayerName(layerName); writer.init(); Part::TopoShape* obj = static_cast(shapeObj)->getTopoShapePtr(); @@ -459,22 +497,44 @@ private: const char* optionSource = nullptr; char* defaultOptions = "User parameter:BaseApp/Preferences/Mod/Import"; char* useOptionSource = nullptr; + int versionParm = -1; + bool versionOverride = false; + bool polyOverride = false; + PyObject *usePolyline = Py_False; - - if (PyArg_ParseTuple(args.ptr(), "O!et|s", &(PyList_Type) ,&docObj, "utf-8",&fname, &optionSource)) { - filePath = std::string(fname); + if (PyArg_ParseTuple(args.ptr(), "O!et|iOs", &(PyList_Type) , + &docObj, + "utf-8", + &fname, + &versionParm, + &usePolyline, + &optionSource)) { + filePath = std::string(fname); layerName = "none"; PyMem_Free(fname); + if ((versionParm == 12) or + (versionParm == 14)) { + versionOverride = true; + } + if (usePolyline == Py_True) { + polyOverride = true; + } + if (optionSource) { strcpy(useOptionSource,optionSource); } else { useOptionSource = defaultOptions; } + try { ImpExpDxfWrite writer(filePath); writer.setOptionSource(useOptionSource); writer.setOptions(); + if (versionOverride) { + writer.setVersion(versionParm); + } + writer.setPolyOverride(polyOverride); writer.setLayerName(layerName); writer.init(); Py::Sequence list(docObj); @@ -494,25 +554,40 @@ private: catch (const Base::Exception& e) { throw Py::RuntimeError(e.what()); } - } else if (PyArg_ParseTuple(args.ptr(), "O!et|s", + } else if (PyArg_ParseTuple(args.ptr(), "O!et|iOs", &(Part::PartFeaturePy::Type) , &docObj, "utf-8", &fname, + &versionParm, + &usePolyline, &optionSource)) { filePath = std::string(fname); layerName = "none"; PyMem_Free(fname); + if ((versionParm == 12) or + (versionParm == 14)) { + versionOverride = true; + } + if (usePolyline == Py_True) { + polyOverride = true; + } + if (optionSource) { strcpy(useOptionSource,optionSource); } else { useOptionSource = defaultOptions; } + try { ImpExpDxfWrite writer(filePath); writer.setOptionSource(useOptionSource); writer.setOptions(); + if (versionOverride) { + writer.setVersion(versionParm); + } + writer.setPolyOverride(true); writer.setLayerName(layerName); writer.init(); App::DocumentObject* obj = static_cast(docObj)->getDocumentObjectPtr(); diff --git a/src/Mod/Import/App/ImpExpDxf.cpp b/src/Mod/Import/App/ImpExpDxf.cpp index 54b1647437..52b1f13270 100644 --- a/src/Mod/Import/App/ImpExpDxf.cpp +++ b/src/Mod/Import/App/ImpExpDxf.cpp @@ -341,9 +341,10 @@ void ImpExpDxfWrite::setOptions(void) { ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath(getOptionSource().c_str()); optionMaxLength = hGrp->GetFloat("maxsegmentlength",5.0); - optionPolyLine = hGrp->GetBool("DiscretizeEllipses",false); optionExpPoints = hGrp->GetBool("ExportPoints",false); m_version = hGrp->GetInt("DxfVersionOut",14); + optionPolyLine = hGrp->GetBool("DiscretizeEllipses",false); + m_polyOverride = hGrp->GetBool("DiscretizeEllipses",false); setDataDir(App::Application::getResourceDir() + "Mod/Import/DxfPlate/"); } @@ -370,37 +371,66 @@ void ImpExpDxfWrite::exportShape(const TopoDS_Shape input) gp_Pnt s = adapt.Value(f); gp_Pnt e = adapt.Value(l); if (fabs(l-f) > 1.0 && s.SquareDistance(e) < 0.001) { - if ((optionPolyLine) && - (m_version >= 14) ) { - exportLWPoly(adapt); - } else if ((optionPolyLine) || - (m_version < 14) ) { - exportPolyline(adapt); - } else { + if (m_polyOverride) { + if (m_version >= 14) { + exportLWPoly(adapt); + } else { //m_version < 14 + exportPolyline(adapt); + } + } else if (optionPolyLine) { + if (m_version >= 14) { + exportLWPoly(adapt); + } else { //m_version < 14 + exportPolyline(adapt); + } + } else { //no overrides, do what's right! + if (m_version < 14) { + exportPolyline(adapt); + } else { exportEllipse(adapt); + } } - } else { - if ((optionPolyLine) && - (m_version >= 14) ) { - exportLWPoly(adapt); - } else if ((optionPolyLine) || - (m_version < 14) ) { - exportPolyline(adapt); - } else { - exportEllipseArc(adapt); + } else { // it's an arc + if (m_polyOverride) { + if (m_version >= 14) { + exportLWPoly(adapt); + } else { //m_version < 14 + exportPolyline(adapt); + } + } else if (optionPolyLine) { + if (m_version >= 14) { + exportLWPoly(adapt); + } else { //m_version < 14 + exportPolyline(adapt); + } + } else { //no overrides, do what's right! + if (m_version < 14) { + exportPolyline(adapt); + } else { + exportEllipseArc(adapt); + } } } - } else if (adapt.GetType() == GeomAbs_BSplineCurve) { - if ((optionPolyLine) && - (m_version >= 14) ) { - exportLWPoly(adapt); - } else if ((optionPolyLine) || - (m_version < 14) ) { - exportPolyline(adapt); - } else { - exportBSpline(adapt); - } + if (m_polyOverride) { + if (m_version >= 14) { + exportLWPoly(adapt); + } else { //m_version < 14 + exportPolyline(adapt); + } + } else if (optionPolyLine) { + if (m_version >= 14) { + exportLWPoly(adapt); + } else { //m_version < 14 + exportPolyline(adapt); + } + } else { //no overrides, do what's right! + if (m_version < 14) { + exportPolyline(adapt); + } else { + exportBSpline(adapt); + } + } } else if (adapt.GetType() == GeomAbs_BezierCurve) { exportBCurve(adapt); } else if (adapt.GetType() == GeomAbs_Line) { diff --git a/src/Mod/Import/App/dxf.cpp b/src/Mod/Import/App/dxf.cpp index 4a05052a06..a9f6e64498 100644 --- a/src/Mod/Import/App/dxf.cpp +++ b/src/Mod/Import/App/dxf.cpp @@ -63,7 +63,6 @@ void CDxfWrite::init(void) writeHeaderSection(); makeBlockRecordTableHead(); makeBlockSectionHead(); - } //! assemble pieces into output file diff --git a/src/Mod/Import/App/dxf.h b/src/Mod/Import/App/dxf.h index 9349a2cc97..1e6bb5dbe2 100644 --- a/src/Mod/Import/App/dxf.h +++ b/src/Mod/Import/App/dxf.h @@ -156,6 +156,7 @@ protected: int m_layerHandle; int m_blockHandle; int m_blkRecordHandle; + bool m_polyOverride; std::string m_saveModelSpaceHandle; std::string m_savePaperSpaceHandle; @@ -180,6 +181,8 @@ public: // bool isVersionValid(int vers); std::string getLayerName() { return m_layerName; } void setLayerName(std::string s); + void setVersion(int v) { m_version = v;} + void setPolyOverride(bool b) { m_polyOverride = b; } void addBlockName(std::string s, std::string blkRecordHandle); void writeLine(const double* s, const double* e);