From 33c77a5462dd6141a44d93634b6d1e91974cd629 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Sat, 28 Apr 2018 15:33:09 -0400 Subject: [PATCH] Add View and Page Dxf export --- src/Mod/TechDraw/App/AppTechDrawPy.cpp | 175 ++++++++++++++++++++++++- src/Mod/TechDraw/App/CMakeLists.txt | 1 + src/Mod/TechDraw/App/PreCompiled.h | 2 + 3 files changed, 173 insertions(+), 5 deletions(-) diff --git a/src/Mod/TechDraw/App/AppTechDrawPy.cpp b/src/Mod/TechDraw/App/AppTechDrawPy.cpp index 512e5588d3..2a586131e0 100644 --- a/src/Mod/TechDraw/App/AppTechDrawPy.cpp +++ b/src/Mod/TechDraw/App/AppTechDrawPy.cpp @@ -24,11 +24,15 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include -# include -# include -# include -# include +#include +#include +#include +#include +#include +#include +#include +#include + #endif #include @@ -51,13 +55,19 @@ #include #include +#include #include "DrawProjectSplit.h" #include "DrawViewPart.h" #include "DrawViewPartPy.h" +#include "DrawPage.h" +#include "DrawPagePy.h" +#include "Geometry.h" #include "GeometryObject.h" #include "EdgeWalker.h" #include "DrawUtil.h" +#include "DrawProjGroup.h" +#include "DrawProjGroupItem.h" namespace TechDraw { @@ -68,6 +78,7 @@ using Part::TopoShape; using Part::TopoShapePy; using Part::TopoShapeEdgePy; using Part::TopoShapeWirePy; +using Import::ImpExpDxfWrite; namespace TechDraw { @@ -91,6 +102,12 @@ public: add_varargs_method("viewPartAsSvg",&Module::viewPartAsSvg, "string = viewPartAsSvg(DrawViewPart) -- Return the edges of a DrawViewPart in Svg format." ); + add_varargs_method("writeDXFView",&Module::writeDXFView, + "writeDXFView(view,filename): Exports a DrawViewPart to a DXF file." + ); + add_varargs_method("writeDXFPage",&Module::writeDXFPage, + "writeDXFPage(page,filename): Exports a DrawPage to a DXF file." + ); initialize("This is a module for making drawings"); // register with Python } virtual ~Module() {} @@ -437,6 +454,154 @@ private: return svgReturn; } + void write1ViewDxf( ImpExpDxfWrite& writer, TechDraw::DrawViewPart* dvp, bool alignPage) + { + TechDrawGeometry::GeometryObject* go = dvp->getGeometryObject(); + TopoDS_Shape s = TechDrawGeometry::mirrorShape(go->getVisHard()); + double offX = 0.0; + double offY = 0.0; + if (dvp->isDerivedFrom(TechDraw::DrawProjGroupItem::getClassTypeId())) { + TechDraw::DrawProjGroupItem* dpgi = static_cast(dvp); + TechDraw::DrawProjGroup* dpg = dpgi->getPGroup(); + if (dpg != nullptr) { + offX = dpg->X.getValue(); + offY = dpg->Y.getValue(); + } + } + double dvpX,dvpY; + if (alignPage) { + dvpX = dvp->X.getValue() + offX; + dvpY = dvp->Y.getValue() + offY; + } else { + dvpX = 0.0; + dvpY = 0.0; + } + gp_Trsf xLate; + xLate.SetTranslation(gp_Vec(dvpX,dvpY,0.0)); + BRepBuilderAPI_Transform mkTrf(s, xLate); + s = mkTrf.Shape(); + writer.exportShape(s); + s = TechDrawGeometry::mirrorShape(go->getVisOutline()); + mkTrf.Perform(s); + s = mkTrf.Shape(); + writer.exportShape(s); + if (dvp->SmoothVisible.getValue()) { + s = TechDrawGeometry::mirrorShape(go->getVisSmooth()); + mkTrf.Perform(s); + s = mkTrf.Shape(); + writer.exportShape(s); + } + if (dvp->SeamVisible.getValue()) { + s = TechDrawGeometry::mirrorShape(go->getVisSeam()); + mkTrf.Perform(s); + s = mkTrf.Shape(); + writer.exportShape(s); + } + if (dvp->HardHidden.getValue()) { + s = TechDrawGeometry::mirrorShape(go->getHidHard()); + mkTrf.Perform(s); + s = mkTrf.Shape(); + writer.exportShape(s); + s = TechDrawGeometry::mirrorShape(go->getHidOutline()); + mkTrf.Perform(s); + s = mkTrf.Shape(); + writer.exportShape(s); + } + if (dvp->SmoothHidden.getValue()) { + s = TechDrawGeometry::mirrorShape(go->getHidSmooth()); + mkTrf.Perform(s); + s = mkTrf.Shape(); + writer.exportShape(s); + } + if (dvp->SeamHidden.getValue()) { + s = TechDrawGeometry::mirrorShape(go->getHidSeam()); + mkTrf.Perform(s); + s = mkTrf.Shape(); + writer.exportShape(s); + } + } + + Py::Object writeDXFView(const Py::Tuple& args) + { + PyObject *viewObj; + char* name; + PyObject *alignObj = Py_True; + if (!PyArg_ParseTuple(args.ptr(), "Oet|O", &viewObj, "utf-8",&name,&alignObj)) { + throw Py::Exception("expected (view,path"); + } + + std::string filePath = std::string(name); + std::string layerName = "none"; + PyMem_Free(name); + bool align; + if (alignObj == Py_True) { + align = true; + } else { + align = false; + } + + try { + ImpExpDxfWrite writer(filePath); + writer.setLayerName(layerName); + App::DocumentObject* obj = 0; + TechDraw::DrawViewPart* dvp = 0; + if (PyObject_TypeCheck(viewObj, &(TechDraw::DrawViewPartPy::Type))) { + obj = static_cast(viewObj)->getDocumentObjectPtr(); + dvp = static_cast(obj); + + layerName = dvp->getNameInDocument(); + writer.setLayerName(layerName); + write1ViewDxf(writer,dvp,align); + } + } + catch (const Base::Exception& e) { + throw Py::RuntimeError(e.what()); + } + + return Py::None(); + } + + Py::Object writeDXFPage(const Py::Tuple& args) + { + PyObject *pageObj; + char* name; + if (!PyArg_ParseTuple(args.ptr(), "Oet", &pageObj, "utf-8",&name)) { + throw Py::Exception("expected (page,path"); + } + + std::string filePath = std::string(name); + std::string layerName = "none"; + PyMem_Free(name); + + try { + ImpExpDxfWrite writer(filePath); + writer.setLayerName(layerName); + + App::DocumentObject* obj = 0; + TechDraw::DrawViewPart* dvp = 0; + TechDraw::DrawPage* dp = 0; + if (PyObject_TypeCheck(pageObj, &(TechDraw::DrawPagePy::Type))) { + obj = static_cast(pageObj)->getDocumentObjectPtr(); + dp = static_cast(obj); + auto views = dp->getAllViews(); + for (auto& v: views) { + if (v->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { + dvp = static_cast(v); + layerName = dvp->getNameInDocument(); + writer.setLayerName(layerName); + write1ViewDxf(writer,dvp,true); + } + } + } + } + catch (const Base::Exception& e) { + throw Py::RuntimeError(e.what()); + } + + return Py::None(); + } + + }; PyObject* initModule() diff --git a/src/Mod/TechDraw/App/CMakeLists.txt b/src/Mod/TechDraw/App/CMakeLists.txt index 8a9d059160..bf3c634b97 100644 --- a/src/Mod/TechDraw/App/CMakeLists.txt +++ b/src/Mod/TechDraw/App/CMakeLists.txt @@ -25,6 +25,7 @@ set(TechDrawLIBS Part Spreadsheet Drawing + Import ) generate_from_xml(DrawPagePy) diff --git a/src/Mod/TechDraw/App/PreCompiled.h b/src/Mod/TechDraw/App/PreCompiled.h index 5639f90978..c6bd3b8a20 100644 --- a/src/Mod/TechDraw/App/PreCompiled.h +++ b/src/Mod/TechDraw/App/PreCompiled.h @@ -34,6 +34,7 @@ # define MeasureExport __declspec(dllimport) # define MeshExport __declspec(dllimport) # define SpreadsheetExport __declspec(dllimport) +# define ImportExport __declspec(dllimport) #else // for Linux # define TechDrawExport # define DrawingExport @@ -41,6 +42,7 @@ # define PartExport # define MeshExport # define SpreadsheetExport +# define ImportExport #endif #ifdef _PreComp_