diff --git a/src/Mod/TechDraw/App/AppTechDrawPy.cpp b/src/Mod/TechDraw/App/AppTechDrawPy.cpp index eb49f06b28..fa069be5d1 100644 --- a/src/Mod/TechDraw/App/AppTechDrawPy.cpp +++ b/src/Mod/TechDraw/App/AppTechDrawPy.cpp @@ -41,14 +41,21 @@ #include #include +#include +#include + #include #include #include #include - #include +#include + #include "DrawProjectSplit.h" +#include "DrawViewPart.h" +#include "DrawViewPartPy.h" +#include "GeometryObject.h" #include "EdgeWalker.h" @@ -61,6 +68,8 @@ using Part::TopoShapePy; using Part::TopoShapeEdgePy; using Part::TopoShapeWirePy; +using Drawing::DXFOutput; + namespace TechDraw { class Module : public Py::ExtensionModule @@ -77,6 +86,9 @@ public: add_varargs_method("findShapeOutline",&Module::findShapeOutline, "wire = findShapeOutline(shape,scale,direction) -- Project shape in direction and find outer wire of result." ); + add_varargs_method("viewPartAsDxf",&Module::viewPartAsDxf, + "string = viewPartAsDxf(DrawViewPart) -- Return the edges of a DrawViewPart in Dxf format." + ); initialize("This is a module for making drawings"); // register with Python } virtual ~Module() {} @@ -289,6 +301,62 @@ private: } return Py::asObject(outerWire); } + + Py::Object viewPartAsDxf(const Py::Tuple& args) + { + PyObject *viewObj; + if (!PyArg_ParseTuple(args.ptr(), "O", &viewObj)) { + throw Py::Exception("expected (DrawViewPart)"); + } + Py::String dxfReturn; + + try { + App::DocumentObject* obj = 0; + TechDraw::DrawViewPart* dvp = 0; + Drawing::DXFOutput dxfOut; + std::string dxfText; + std::stringstream ss; + if (PyObject_TypeCheck(viewObj, &(TechDraw::DrawViewPartPy::Type))) { + obj = static_cast(viewObj)->getDocumentObjectPtr(); + dvp = static_cast(obj); + TechDrawGeometry::GeometryObject* go = dvp->getGeometryObject(); + TopoDS_Shape s = TechDrawGeometry::mirrorShape(go->getVisHard()); + ss << dxfOut.exportEdges(s); + s = TechDrawGeometry::mirrorShape(go->getVisOutline()); + ss << dxfOut.exportEdges(s); + if (dvp->SmoothVisible.getValue()) { + s = TechDrawGeometry::mirrorShape(go->getVisSmooth()); + ss << dxfOut.exportEdges(s); + } + if (dvp->SeamVisible.getValue()) { + s = TechDrawGeometry::mirrorShape(go->getVisSeam()); + ss << dxfOut.exportEdges(s); + } + if (dvp->HardHidden.getValue()) { + s = TechDrawGeometry::mirrorShape(go->getHidHard()); + ss << dxfOut.exportEdges(s); + s = TechDrawGeometry::mirrorShape(go->getHidOutline()); + ss << dxfOut.exportEdges(s); + } + if (dvp->SmoothHidden.getValue()) { + s = TechDrawGeometry::mirrorShape(go->getHidSmooth()); + ss << dxfOut.exportEdges(s); + } + if (dvp->SeamHidden.getValue()) { + s = TechDrawGeometry::mirrorShape(go->getHidSeam()); + ss << dxfOut.exportEdges(s); + } + // ss now contains all edges as Dxf + dxfReturn = Py::String(ss.str() + "\n0"); + } + } + catch (Base::Exception &e) { + throw Py::Exception(Base::BaseExceptionFreeCADError, e.what()); + } + + return dxfReturn; + } + }; PyObject* initModule() diff --git a/src/Mod/TechDraw/App/CMakeLists.txt b/src/Mod/TechDraw/App/CMakeLists.txt index 77b9757ae4..c2aac39361 100644 --- a/src/Mod/TechDraw/App/CMakeLists.txt +++ b/src/Mod/TechDraw/App/CMakeLists.txt @@ -24,6 +24,7 @@ set(TechDrawLIBS Measure Part Spreadsheet + Drawing ) generate_from_xml(DrawPagePy) diff --git a/src/Mod/TechDraw/App/DrawViewPart.h b/src/Mod/TechDraw/App/DrawViewPart.h index 279a68fcb1..cb974abab3 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.h +++ b/src/Mod/TechDraw/App/DrawViewPart.h @@ -110,7 +110,9 @@ public: const std::vector & getEdgeGeometry() const; const std::vector getVisibleFaceEdges() const; const std::vector & getFaceGeometry() const; + bool hasGeometry(void) const; + TechDrawGeometry::GeometryObject* getGeometryObject(void) const { return geometryObject; } TechDrawGeometry::BaseGeom* getProjEdgeByIndex(int idx) const; //get existing geom for edge idx in projection TechDrawGeometry::Vertex* getProjVertexByIndex(int idx) const; //get existing geom for vertex idx in projection diff --git a/src/Mod/TechDraw/App/GeometryObject.cpp b/src/Mod/TechDraw/App/GeometryObject.cpp index 70d74a4f5f..7602bbba9f 100644 --- a/src/Mod/TechDraw/App/GeometryObject.cpp +++ b/src/Mod/TechDraw/App/GeometryObject.cpp @@ -537,6 +537,10 @@ TopoDS_Shape TechDrawGeometry::mirrorShape(const TopoDS_Shape &input, double scale) { TopoDS_Shape transShape; + if (input.IsNull()) { + return transShape; + } + try { // Make tempTransform scale the object around it's centre point and // mirror about the Y axis diff --git a/src/Mod/TechDraw/App/GeometryObject.h b/src/Mod/TechDraw/App/GeometryObject.h index e2c3e5b4aa..d6a411edde 100644 --- a/src/Mod/TechDraw/App/GeometryObject.h +++ b/src/Mod/TechDraw/App/GeometryObject.h @@ -51,8 +51,8 @@ class Vertex; //! scales & mirrors a shape about a center TopoDS_Shape TechDrawExport mirrorShape(const TopoDS_Shape &input, - const gp_Pnt& inputCenter, - double scale); + const gp_Pnt& inputCenter = gp_Pnt(0.0,0.0,0.0), + double scale = 1.0); TopoDS_Shape TechDrawExport scaleShape(const TopoDS_Shape &input, double scale); @@ -95,6 +95,17 @@ public: void setParentName(std::string n); //for debug messages void pruneVertexGeom(Base::Vector3d center, double radius); + TopoDS_Shape getVisHard(void) { return visHard; } + TopoDS_Shape getVisOutline(void) { return visOutline; } + TopoDS_Shape getVisSmooth(void) { return visSmooth; } + TopoDS_Shape getVisSeam(void) { return visSeam; } + TopoDS_Shape getVisIso(void) { return visIso; } + TopoDS_Shape getHidHard(void) { return hidHard; } + TopoDS_Shape getHidOutline(void) { return hidOutline; } + TopoDS_Shape getHidSmooth(void) { return hidSmooth; } + TopoDS_Shape getHidSeam(void) { return hidSeam; } + TopoDS_Shape getHidIso(void) { return hidIso; } + protected: //HLR output TopoDS_Shape visHard; diff --git a/src/Mod/TechDraw/App/PreCompiled.h b/src/Mod/TechDraw/App/PreCompiled.h index face786af5..5639f90978 100644 --- a/src/Mod/TechDraw/App/PreCompiled.h +++ b/src/Mod/TechDraw/App/PreCompiled.h @@ -29,12 +29,14 @@ // Exporting of App classes #ifdef FC_OS_WIN32 # define TechDrawExport __declspec(dllexport) -# define PartExport __declspec(dllimport) -# define MeasureExport __declspec(dllimport) -# define MeshExport __declspec(dllimport) +# define DrawingExport __declspec(dllexport) +# define PartExport __declspec(dllimport) +# define MeasureExport __declspec(dllimport) +# define MeshExport __declspec(dllimport) # define SpreadsheetExport __declspec(dllimport) #else // for Linux # define TechDrawExport +# define DrawingExport # define MeasureExport # define PartExport # define MeshExport