From 08a3e315ce00665aeca608cfc0baac6a02ab8100 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Wed, 27 Jun 2018 12:04:51 -0400 Subject: [PATCH] Add support for Dxf Export R14 spec --- src/Mod/Import/App/CMakeLists.txt | 25 + src/Mod/Import/App/ImpExpDxf.cpp | 77 +- src/Mod/Import/App/ImpExpDxf.h | 7 +- src/Mod/Import/App/dxf.cpp | 2675 ++++++++++++------------ src/Mod/Import/App/dxf.h | 114 +- src/Mod/Import/CMakeLists.txt | 12 +- src/Mod/Import/DxfPlate/blocks10.rub | 24 + src/Mod/Import/DxfPlate/blocks112.rub | 0 src/Mod/Import/DxfPlate/blocks114.rub | 0 src/Mod/Import/DxfPlate/classes14.rub | 48 + src/Mod/Import/DxfPlate/entities0.rub | 4 + src/Mod/Import/DxfPlate/entities12.rub | 4 + src/Mod/Import/DxfPlate/entities14.rub | 4 + src/Mod/Import/DxfPlate/header0.rub | 30 + src/Mod/Import/DxfPlate/header12.rub | 34 + src/Mod/Import/DxfPlate/header14.rub | 38 + src/Mod/Import/DxfPlate/objects14.rub | 26 + src/Mod/Import/DxfPlate/tables10.rub | 172 ++ src/Mod/Import/DxfPlate/tables112.rub | 72 + src/Mod/Import/DxfPlate/tables114.rub | 112 + src/Mod/Import/DxfPlate/tables20.rub | 4 + src/Mod/Import/DxfPlate/tables212.rub | 142 ++ src/Mod/Import/DxfPlate/tables214.rub | 278 +++ src/Mod/TechDraw/App/AppTechDrawPy.cpp | 7 +- 24 files changed, 2561 insertions(+), 1348 deletions(-) create mode 100644 src/Mod/Import/DxfPlate/blocks10.rub create mode 100644 src/Mod/Import/DxfPlate/blocks112.rub create mode 100644 src/Mod/Import/DxfPlate/blocks114.rub create mode 100644 src/Mod/Import/DxfPlate/classes14.rub create mode 100644 src/Mod/Import/DxfPlate/entities0.rub create mode 100644 src/Mod/Import/DxfPlate/entities12.rub create mode 100644 src/Mod/Import/DxfPlate/entities14.rub create mode 100644 src/Mod/Import/DxfPlate/header0.rub create mode 100644 src/Mod/Import/DxfPlate/header12.rub create mode 100644 src/Mod/Import/DxfPlate/header14.rub create mode 100644 src/Mod/Import/DxfPlate/objects14.rub create mode 100644 src/Mod/Import/DxfPlate/tables10.rub create mode 100644 src/Mod/Import/DxfPlate/tables112.rub create mode 100644 src/Mod/Import/DxfPlate/tables114.rub create mode 100644 src/Mod/Import/DxfPlate/tables20.rub create mode 100644 src/Mod/Import/DxfPlate/tables212.rub create mode 100644 src/Mod/Import/DxfPlate/tables214.rub diff --git a/src/Mod/Import/App/CMakeLists.txt b/src/Mod/Import/App/CMakeLists.txt index 1e88146fa5..75d8d01e63 100644 --- a/src/Mod/Import/App/CMakeLists.txt +++ b/src/Mod/Import/App/CMakeLists.txt @@ -68,6 +68,26 @@ SET(SCL_Resources ) SOURCE_GROUP("SCL" FILES ${SCL_Resources}) +SET(DXF_Plate + blocks10.rub + blocks112.rub + blocks114.rub + classes14.rub + entities0.rub + entities12.rub + entities14.rub + header0.rub + header12.rub + header14.rub + objects14.rub + tables10.rub + tables112.rub + tables114.rub + tables20.rub + tables212.rub + tables214.rub +) + generate_from_xml(StepShapePy) add_library(Import SHARED ${Import_SRCS}) @@ -82,6 +102,11 @@ fc_target_copy_resource(ImportPy ${CMAKE_BINARY_DIR}/Mod/Import ${SCL_Resources}) +fc_target_copy_resource(Import + ${CMAKE_SOURCE_DIR}/src/Mod/Import/DxfPlate + ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/Import/DxfPlate + ${DXF_Plate}) + SET_BIN_DIR(Import Import /Mod/Import) SET_PYTHON_PREFIX_SUFFIX(Import) diff --git a/src/Mod/Import/App/ImpExpDxf.cpp b/src/Mod/Import/App/ImpExpDxf.cpp index a3fba38907..54b1647437 100644 --- a/src/Mod/Import/App/ImpExpDxf.cpp +++ b/src/Mod/Import/App/ImpExpDxf.cpp @@ -327,19 +327,24 @@ point3D gPntTopoint3D(gp_Pnt& p) } ImpExpDxfWrite::ImpExpDxfWrite(std::string filepath) : - CDxfWrite(filepath.c_str()), - m_layerName("none") + CDxfWrite(filepath.c_str()) { - setOptionSource("User parameter:BaseApp/Preferences/Mod/Draft"); + setOptionSource("User parameter:BaseApp/Preferences/Mod/Import"); setOptions(); } +ImpExpDxfWrite::~ImpExpDxfWrite() +{ +} + void ImpExpDxfWrite::setOptions(void) { ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath(getOptionSource().c_str()); optionMaxLength = hGrp->GetFloat("maxsegmentlength",5.0); - optionPolyLine = hGrp->GetBool("DiscretizeEllipses",true); + optionPolyLine = hGrp->GetBool("DiscretizeEllipses",false); optionExpPoints = hGrp->GetBool("ExportPoints",false); + m_version = hGrp->GetInt("DxfVersionOut",14); + setDataDir(App::Application::getResourceDir() + "Mod/Import/DxfPlate/"); } void ImpExpDxfWrite::exportShape(const TopoDS_Shape input) @@ -365,13 +370,21 @@ 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) { + if ((optionPolyLine) && + (m_version >= 14) ) { + exportLWPoly(adapt); + } else if ((optionPolyLine) || + (m_version < 14) ) { exportPolyline(adapt); } else { exportEllipse(adapt); } } else { - if (optionPolyLine) { + if ((optionPolyLine) && + (m_version >= 14) ) { + exportLWPoly(adapt); + } else if ((optionPolyLine) || + (m_version < 14) ) { exportPolyline(adapt); } else { exportEllipseArc(adapt); @@ -379,7 +392,11 @@ void ImpExpDxfWrite::exportShape(const TopoDS_Shape input) } } else if (adapt.GetType() == GeomAbs_BSplineCurve) { - if (optionPolyLine) { + if ((optionPolyLine) && + (m_version >= 14) ) { + exportLWPoly(adapt); + } else if ((optionPolyLine) || + (m_version < 14) ) { exportPolyline(adapt); } else { exportBSpline(adapt); @@ -408,7 +425,7 @@ void ImpExpDxfWrite::exportShape(const TopoDS_Shape input) for (auto& p: uniquePts) { double point[3] = {0,0,0}; gPntToTuple(point, p); - WritePoint(point, getLayerName().c_str()); + writePoint(point); } } } @@ -448,7 +465,7 @@ void ImpExpDxfWrite::exportCircle(BRepAdaptor_Curve c) double radius = circ.Radius(); - WriteCircle(center, radius, getLayerName().c_str()); + writeCircle(center, radius); } void ImpExpDxfWrite::exportEllipse(BRepAdaptor_Curve c) @@ -466,8 +483,8 @@ void ImpExpDxfWrite::exportEllipse(BRepAdaptor_Curve c) double rotation = xaxis.AngleWithRef(gp_Dir(0, 1, 0), gp_Dir(0, 0, 1)); //2*M_PI = 6.28319 is invalid(doesn't display in LibreCAD), but 2PI = 6.28318 is valid! - //WriteEllipse(center, major, minor, rotation, 0.0, 2 * M_PI, true, getLayerName().c_str() ); - WriteEllipse(center, major, minor, rotation, 0.0, 6.28318, true, getLayerName().c_str() ); + //writeEllipse(center, major, minor, rotation, 0.0, 2 * M_PI, true ); + writeEllipse(center, major, minor, rotation, 0.0, 6.28318, true ); } void ImpExpDxfWrite::exportArc(BRepAdaptor_Curve c) @@ -493,7 +510,7 @@ void ImpExpDxfWrite::exportArc(BRepAdaptor_Curve c) double a = v3.DotCross(v1,v2); bool dir = (a < 0) ? true: false; - WriteArc(start, end, center, dir, getLayerName().c_str() ); + writeArc(start, end, center, dir ); } void ImpExpDxfWrite::exportEllipseArc(BRepAdaptor_Curve c) @@ -533,7 +550,7 @@ void ImpExpDxfWrite::exportEllipseArc(BRepAdaptor_Curve c) endAngle = -endAngle; } - WriteEllipse(center, major, minor, rotation, startAngle, endAngle, endIsCW, getLayerName().c_str()); + writeEllipse(center, major, minor, rotation, startAngle, endAngle, endIsCW); } void ImpExpDxfWrite::exportBSpline(BRepAdaptor_Curve c) @@ -574,6 +591,7 @@ void ImpExpDxfWrite::exportBSpline(BRepAdaptor_Curve c) sd.flag = spline->IsClosed(); sd.flag += spline->IsPeriodic()*2; sd.flag += spline->IsRational()*4; + sd.flag += 8; //planar spline sd.degree = spline->Degree(); sd.control_points = spline->NbPoles(); @@ -584,11 +602,22 @@ void ImpExpDxfWrite::exportBSpline(BRepAdaptor_Curve c) spline->D0(spline->LastParameter(),p); sd.endtan = gPntTopoint3D(p); - TColStd_Array1OfReal knotsequence(1,sd.knots); + //next bit is from DrawingExport.cpp (Dan Falk?). + Standard_Integer m = 0; + if (spline->IsPeriodic()) { + m = spline->NbPoles() + 2*spline->Degree() - spline->Multiplicity(1) + 2; + } + else { + for (int i=1; i<= spline->NbKnots(); i++) + m += spline->Multiplicity(i); + } + TColStd_Array1OfReal knotsequence(1,m); spline->KnotSequence(knotsequence); for (int i = knotsequence.Lower() ; i <= knotsequence.Upper(); i++) { - sd.knot.push_back(knotsequence(i)); + sd.knot.push_back(knotsequence(i)); } + sd.knots = knotsequence.Length(); + TColgp_Array1OfPnt poles(1,spline->NbPoles()); spline->Poles(poles); for (int i = poles.Lower(); i <= poles.Upper(); i++) { @@ -596,7 +625,7 @@ void ImpExpDxfWrite::exportBSpline(BRepAdaptor_Curve c) } //OCC doesn't have separate lists for control points and fit points. - WriteSpline(sd,getLayerName().c_str()); + writeSpline(sd); } void ImpExpDxfWrite::exportBCurve(BRepAdaptor_Curve c) @@ -615,7 +644,7 @@ void ImpExpDxfWrite::exportLine(BRepAdaptor_Curve c) gp_Pnt e = c.Value(l); double end[3] = {0,0,0}; gPntToTuple(end, e); - WriteLine(start, end, getLayerName().c_str()); + writeLine(start, end); } void ImpExpDxfWrite::exportLWPoly(BRepAdaptor_Curve c) @@ -639,7 +668,7 @@ void ImpExpDxfWrite::exportLWPoly(BRepAdaptor_Curve c) pd.Verts.push_back(gPntTopoint3D(p)); } pd.nVert = discretizer.NbPoints (); - WriteLWPolyLine(pd,getLayerName().c_str()); + writeLWPolyLine(pd); } } @@ -664,7 +693,7 @@ void ImpExpDxfWrite::exportPolyline(BRepAdaptor_Curve c) pd.Verts.push_back(gPntTopoint3D(p)); } pd.nVert = discretizer.NbPoints (); - WritePolyline(pd,getLayerName().c_str()); + writePolyline(pd); } } @@ -679,7 +708,7 @@ void ImpExpDxfWrite::exportText(const char* text, Base::Vector3d position1, Base location2[1] = position2.y; location2[2] = position2.z; - WriteText(text, location1, location2, size, just, getLayerName().c_str()); + writeText(text, location1, location2, size, just); } void ImpExpDxfWrite::exportLinearDim(Base::Vector3d textLocn, Base::Vector3d lineLocn, @@ -702,7 +731,7 @@ void ImpExpDxfWrite::exportLinearDim(Base::Vector3d textLocn, Base::Vector3d lin ext2[0] = extLine2Start.x; ext2[1] = extLine2Start.y; ext2[2] = extLine2Start.z; - WriteLinearDim(text, line, ext1,ext2,dimText, getLayerName().c_str()); + writeLinearDim(text, line, ext1,ext2,dimText); } void ImpExpDxfWrite::exportAngularDim(Base::Vector3d textLocn, Base::Vector3d lineLocn, @@ -730,7 +759,7 @@ void ImpExpDxfWrite::exportAngularDim(Base::Vector3d textLocn, Base::Vector3d li apex[0] = apexPoint.x; apex[1] = apexPoint.y; apex[2] = apexPoint.z; - WriteAngularDim(text, line, apex, ext1, apex, ext2, dimText, getLayerName().c_str()); + writeAngularDim(text, line, apex, ext1, apex, ext2, dimText); } void ImpExpDxfWrite::exportRadialDim(Base::Vector3d centerPoint, Base::Vector3d textLocn, @@ -749,7 +778,7 @@ void ImpExpDxfWrite::exportRadialDim(Base::Vector3d centerPoint, Base::Vector3d arc[0] = arcPoint.x; arc[1] = arcPoint.y; arc[2] = arcPoint.z; - WriteRadialDim(center, text, arc, dimText, getLayerName().c_str()); + writeRadialDim(center, text, arc, dimText); } @@ -769,5 +798,5 @@ void ImpExpDxfWrite::exportDiametricDim(Base::Vector3d textLocn, arc2[0] = arcPoint2.x; arc2[1] = arcPoint2.y; arc2[2] = arcPoint2.z; - WriteDiametricDim(text, arc1, arc2, dimText, getLayerName().c_str()); + writeDiametricDim(text, arc1, arc2, dimText); } diff --git a/src/Mod/Import/App/ImpExpDxf.h b/src/Mod/Import/App/ImpExpDxf.h index c04bc3f35e..c344f30724 100644 --- a/src/Mod/Import/App/ImpExpDxf.h +++ b/src/Mod/Import/App/ImpExpDxf.h @@ -73,13 +73,13 @@ namespace Import { public: ImpExpDxfWrite(std::string filepath); + ~ImpExpDxfWrite(); void exportShape(const TopoDS_Shape input); - std::string getLayerName() { return m_layerName; } - void setLayerName(std::string s) { m_layerName = s; } std::string getOptionSource() { return m_optionSource; } void setOptionSource(std::string s) { m_optionSource = s; } void setOptions(void); + void exportText(const char* text, Base::Vector3d position1, Base::Vector3d position2, double size, int just); void exportLinearDim(Base::Vector3d textLocn, Base::Vector3d lineLocn, Base::Vector3d extLine1Start, Base::Vector3d extLine2Start, @@ -110,8 +110,7 @@ namespace Import void exportLWPoly(BRepAdaptor_Curve c); //LWPolyline not supported in R12? void exportPolyline(BRepAdaptor_Curve c); - std::string m_layerName; - std::string m_optionSource; +// std::string m_optionSource; double optionMaxLength; bool optionPolyLine; bool optionExpPoints; diff --git a/src/Mod/Import/App/dxf.cpp b/src/Mod/Import/App/dxf.cpp index f8d8f16b9d..fdaf839f59 100644 --- a/src/Mod/Import/App/dxf.cpp +++ b/src/Mod/Import/App/dxf.cpp @@ -4,235 +4,742 @@ // modified 2018 wandererfan #include "PreCompiled.h" +#include +#include + #include +#include +#include +#include #include #include "dxf.h" using namespace std; -static const double Pi = 3.14159265358979323846264338327950288419716939937511; -CDxfWrite::CDxfWrite(const char* filepath) +Base::Vector3d toVector3d(const double* a) +{ + Base::Vector3d result; + result.x = a[0]; + result.y = a[1]; + result.z = a[2]; + return result; +} + +CDxfWrite::CDxfWrite(const char* filepath) : +//TODO: these should probably be parms in config file +m_entityHandle(0x300), +m_layerHandle(0x30), +m_blockHandle(0x210), +m_blkRecordHandle(0x110), +m_layerName("none") { // start the file m_fail = false; -#ifdef __WXMSW__ + m_version = 12; m_ofs = new ofstream(filepath, ios::out); -#else - m_ofs = new ofstream(filepath, ios::out); -#endif + m_ssBlock = new std::ostringstream(); + m_ssBlkRecord = new std::ostringstream(); + m_ssEntity = new std::ostringstream(); + m_ssLayer = new std::ostringstream(); + if(!(*m_ofs)){ m_fail = true; return; } m_ofs->imbue(std::locale("C")); - - writeHeaderSection(); - writeTablesSection(); - - // start - (*m_ofs) << " 0" << endl; - (*m_ofs) << "SECTION" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "ENTITIES" << endl; } CDxfWrite::~CDxfWrite() { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "ENDSEC" << endl; //end of entities section - - // write Blocks if exist - writeBlocksSection(); - if (!m_ssBlock.str().empty()) { -// (*m_ofs) << " 0" << endl; -// (*m_ofs) << "SECTION" << endl; -// (*m_ofs) << " 2" << endl; -// (*m_ofs) << "BLOCKS" << endl; - (*m_ofs) << m_ssBlock.str(); - } - (*m_ofs) << " 0" << endl; //end blocks section - (*m_ofs) << "ENDSEC" << endl; - - // end - (*m_ofs) << " 0" << endl; - (*m_ofs) << "EOF"; - delete m_ofs; } -void CDxfWrite::WriteLine(const double* s, const double* e, const char* layer_name) +void CDxfWrite::init(void) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "LINE" << endl; - (*m_ofs) << " 8" << endl; // Group code for layer name - (*m_ofs) << layer_name << endl; // Layer number - (*m_ofs) << " 10" << endl; // Start point of line - (*m_ofs) << s[0] << endl; // X in WCS coordinates - (*m_ofs) << " 20" << endl; - (*m_ofs) << s[1] << endl; // Y in WCS coordinates - (*m_ofs) << " 30" << endl; - (*m_ofs) << s[2] << endl; // Z in WCS coordinates - (*m_ofs) << " 11" << endl; // End point of line - (*m_ofs) << e[0] << endl; // X in WCS coordinates - (*m_ofs) << " 21" << endl; - (*m_ofs) << e[1] << endl; // Y in WCS coordinates - (*m_ofs) << " 31" << endl; - (*m_ofs) << e[2] << endl; // Z in WCS coordinates + writeHeaderSection(); + makeBlockRecordTableHead(); + makeBlockSectionHead(); + +} + +//! assemble pieces into output file +void CDxfWrite::endRun(void) +{ + makeLayerTable(); + makeBlockRecordTableBody(); + + writeClassesSection(); + writeTablesSection(); + writeBlocksSection(); + writeEntitiesSection(); + writeObjectsSection(); + + (*m_ofs) << " 0" << endl; + (*m_ofs) << "EOF"; } //*************************** -//WriteLWPolyLine (Note: LWPolyline might not be supported in R12 +//writeHeaderSection //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::WriteLWPolyLine(LWPolyDataOut pd, const char* layer_name) +void CDxfWrite::writeHeaderSection(void) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "LWPOLYLINE" << endl; - (*m_ofs) << " 8" << endl; // Group code for layer name - (*m_ofs) << layer_name << endl; // Layer name -// (*m_ofs) << "100" << endl; //100 groups are not part of R12 -// (*m_ofs) << "AcDbPolyline" << endl; - (*m_ofs) << " 90" << endl; - (*m_ofs) << pd.nVert << endl; // number of vertices - (*m_ofs) << " 70" << endl; - (*m_ofs) << pd.Flag << endl; - (*m_ofs) << " 43" << endl; - (*m_ofs) << pd.Width << endl; //Constant width opt - (*m_ofs) << " 38" << endl; - (*m_ofs) << pd.Elev << endl; // Elevation - (*m_ofs) << " 39" << endl; - (*m_ofs) << pd.Thick << endl; // Thickness - for (auto& p: pd.Verts) { - (*m_ofs) << " 10" << endl; // Vertices - (*m_ofs) << p.x << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << p.y << endl; + std::stringstream ss; + ss << "FreeCAD v" << FCVersionMajor << "." << FCVersionMinor << " " << FCRevision; + + //header & version + (*m_ofs) << "999" << endl; + (*m_ofs) << ss.str() << endl; + + //static header content + ss.str(""); + ss.clear(); + ss << "header" << m_version << ".rub"; + std::string fileSpec = m_dataDir + ss.str(); + std::ostringstream oss = getPlateFile(fileSpec); + (*m_ofs) << oss.str(); + +} + +//*************************** +//writeClassesSection +//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project +void CDxfWrite::writeClassesSection(void) +{ + if (m_version < 14) { + return; } + + //static classes section content + std::stringstream ss; + ss << "classes" << m_version << ".rub"; + std::string fileSpec = m_dataDir + ss.str(); + std::ostringstream oss = getPlateFile(fileSpec); + (*m_ofs) << oss.str(); +} + +//*************************** +//writeTablesSection +//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project +void CDxfWrite::writeTablesSection(void) +{ + //static tables section head end content + std::stringstream ss; + ss << "tables1" << m_version << ".rub"; + std::string fileSpec = m_dataDir + ss.str(); + std::ostringstream oss = getPlateFile(fileSpec); + (*m_ofs) << oss.str(); + + (*m_ofs) << (*m_ssLayer).str(); + + //static tables section tail end content + ss.str(""); + ss.clear(); + ss << "tables2" << m_version << ".rub"; + fileSpec = m_dataDir + ss.str(); + std::ostringstream oss2 = getPlateFile(fileSpec); + (*m_ofs) << oss2.str(); + + if (m_version > 12) { + (*m_ofs) << (*m_ssBlkRecord).str(); + (*m_ofs) << " 0" << endl; + (*m_ofs) << "ENDTAB" << endl; + } + (*m_ofs) << " 0" << endl; + (*m_ofs) << "ENDSEC" << endl; +} + +//*************************** +//makeLayerTable +//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project +void CDxfWrite::makeLayerTable(void) +{ + std::string tablehash = getLayerHandle(); + (*m_ssLayer) << " 0" << endl; + (*m_ssLayer) << "TABLE" << endl; + (*m_ssLayer) << " 2" << endl; + (*m_ssLayer) << "LAYER" << endl; + (*m_ssLayer) << " 5" << endl; + (*m_ssLayer) << tablehash << endl; + if (m_version > 12) { + (*m_ssLayer) << "330" << endl; + (*m_ssLayer) << 0 << endl; + (*m_ssLayer) << "100" << endl; + (*m_ssLayer) << "AcDbSymbolTable" << endl; + } + (*m_ssLayer) << " 70" << endl; + (*m_ssLayer) << m_layerList.size() + 1 << endl; + + (*m_ssLayer) << " 0" << endl; + (*m_ssLayer) << "LAYER" << endl; + (*m_ssLayer) << " 5" << endl; + (*m_ssLayer) << getLayerHandle() << endl; + if (m_version > 12) { + (*m_ssLayer) << "330" << endl; + (*m_ssLayer) << tablehash << endl; + (*m_ssLayer) << "100" << endl; + (*m_ssLayer) << "AcDbSymbolTableRecord" << endl; + (*m_ssLayer) << "100" << endl; + (*m_ssLayer) << "AcDbLayerTableRecord" << endl; + } + (*m_ssLayer) << " 2" << endl; + (*m_ssLayer) << "0" << endl; + (*m_ssLayer) << " 70" << endl; + (*m_ssLayer) << " 0" << endl; + (*m_ssLayer) << " 62" << endl; + (*m_ssLayer) << " 7" << endl; + (*m_ssLayer) << " 6" << endl; + (*m_ssLayer) << "CONTINUOUS" << endl; + + for (auto& l: m_layerList) { + (*m_ssLayer) << " 0" << endl; + (*m_ssLayer) << "LAYER" << endl; + (*m_ssLayer) << " 5" << endl; + (*m_ssLayer) << getLayerHandle() << endl; + if (m_version > 12) { + (*m_ssLayer) << "330" << endl; + (*m_ssLayer) << tablehash << endl; + (*m_ssLayer) << "100" << endl; + (*m_ssLayer) << "AcDbSymbolTableRecord" << endl; + (*m_ssLayer) << "100" << endl; + (*m_ssLayer) << "AcDbLayerTableRecord" << endl; + } + (*m_ssLayer) << " 2" << endl; + (*m_ssLayer) << l << endl; + (*m_ssLayer) << " 70" << endl; + (*m_ssLayer) << " 0" << endl; + (*m_ssLayer) << " 62" << endl; + (*m_ssLayer) << " 7" << endl; + (*m_ssLayer) << " 6" << endl; + (*m_ssLayer) << "CONTINUOUS" << endl; + } + (*m_ssLayer) << " 0" << endl; + (*m_ssLayer) << "ENDTAB" << endl; +} + +//*************************** +//makeBlockRecordTableHead +//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project +void CDxfWrite::makeBlockRecordTableHead(void) +{ + if (m_version < 14) { + return; + } + std::string tablehash = getBlkRecordHandle(); + m_saveBlockRecordTableHandle = tablehash; + (*m_ssBlkRecord) << " 0" << endl; + (*m_ssBlkRecord) << "TABLE" << endl; + (*m_ssBlkRecord) << " 2" << endl; + (*m_ssBlkRecord) << "BLOCK_RECORD" << endl; + (*m_ssBlkRecord) << " 5" << endl; + (*m_ssBlkRecord) << tablehash << endl; + (*m_ssBlkRecord) << "330" << endl; + (*m_ssBlkRecord) << "0" << endl; + (*m_ssBlkRecord) << "100" << endl; + (*m_ssBlkRecord) << "AcDbSymbolTable" << endl; + (*m_ssBlkRecord) << " 70" << endl; + (*m_ssBlkRecord) << (m_blockList.size() + 5) << endl; + + m_saveModelSpaceHandle = getBlkRecordHandle(); + (*m_ssBlkRecord) << " 0" << endl; + (*m_ssBlkRecord) << "BLOCK_RECORD" << endl; + (*m_ssBlkRecord) << " 5" << endl; + (*m_ssBlkRecord) << m_saveModelSpaceHandle << endl; + (*m_ssBlkRecord) << "330" << endl; + (*m_ssBlkRecord) << tablehash << endl; + (*m_ssBlkRecord) << "100" << endl; + (*m_ssBlkRecord) << "AcDbSymbolTableRecord" << endl; + (*m_ssBlkRecord) << "100" << endl; + (*m_ssBlkRecord) << "AcDbBlockTableRecord" << endl; + (*m_ssBlkRecord) << " 2" << endl; + (*m_ssBlkRecord) << "*MODEL_SPACE" << endl; +// (*m_ssBlkRecord) << " 1" << endl; +// (*m_ssBlkRecord) << " " << endl; + + m_savePaperSpaceHandle = getBlkRecordHandle(); + (*m_ssBlkRecord) << " 0" << endl; + (*m_ssBlkRecord) << "BLOCK_RECORD" << endl; + (*m_ssBlkRecord) << " 5" << endl; + (*m_ssBlkRecord) << m_savePaperSpaceHandle << endl; + (*m_ssBlkRecord) << "330" << endl; + (*m_ssBlkRecord) << tablehash << endl; + (*m_ssBlkRecord) << "100" << endl; + (*m_ssBlkRecord) << "AcDbSymbolTableRecord" << endl; + (*m_ssBlkRecord) << "100" << endl; + (*m_ssBlkRecord) << "AcDbBlockTableRecord" << endl; + (*m_ssBlkRecord) << " 2" << endl; + (*m_ssBlkRecord) << "*PAPER_SPACE" << endl; +// (*m_ssBlkRecord) << " 1" << endl; +// (*m_ssBlkRecord) << " " << endl; +} + +//*************************** +//makeBlockRecordTableBody +//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project +void CDxfWrite::makeBlockRecordTableBody(void) +{ + if (m_version < 14) { + return; + } + + int iBlkRecord = 0; + for (auto& b: m_blockList) { + (*m_ssBlkRecord) << " 0" << endl; + (*m_ssBlkRecord) << "BLOCK_RECORD" << endl; + (*m_ssBlkRecord) << " 5" << endl; + (*m_ssBlkRecord) << m_blkRecordList.at(iBlkRecord) << endl; + (*m_ssBlkRecord) << "330" << endl; + (*m_ssBlkRecord) << m_saveBlockRecordTableHandle << endl; + (*m_ssBlkRecord) << "100" << endl; + (*m_ssBlkRecord) << "AcDbSymbolTableRecord" << endl; + (*m_ssBlkRecord) << "100" << endl; + (*m_ssBlkRecord) << "AcDbBlockTableRecord" << endl; + (*m_ssBlkRecord) << " 2" << endl; + (*m_ssBlkRecord) << b << endl; +// (*m_ssBlkRecord) << " 70" << endl; +// (*m_ssBlkRecord) << " 0" << endl; + iBlkRecord++; + } +} + +//*************************** +//makeBlockSectionHead +//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project +void CDxfWrite::makeBlockSectionHead(void) +{ + (*m_ssBlock) << " 0" << endl; + (*m_ssBlock) << "SECTION" << endl; + (*m_ssBlock) << " 2" << endl; + (*m_ssBlock) << "BLOCKS" << endl; + (*m_ssBlock) << " 0" << endl; + (*m_ssBlock) << "BLOCK" << endl; + (*m_ssBlock) << " 5" << endl; + m_currentBlock = getBlockHandle(); + (*m_ssBlock) << m_currentBlock << endl; + if (m_version > 12) { + (*m_ssBlock) << "330" << endl; + (*m_ssBlock) << m_saveModelSpaceHandle << endl; + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbEntity" << endl; + } + (*m_ssBlock) << " 8" << endl; + (*m_ssBlock) << "0" << endl; + if (m_version > 12) { + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbBlockBegin" << endl; + } + (*m_ssBlock) << " 2" << endl; + (*m_ssBlock) << "*MODEL_SPACE" << endl; + (*m_ssBlock) << " 70" << endl; + (*m_ssBlock) << " 0" << endl; + (*m_ssBlock) << " 10" << endl; + (*m_ssBlock) << 0.0 << endl; + (*m_ssBlock) << " 20" << endl; + (*m_ssBlock) << 0.0 << endl; + (*m_ssBlock) << " 30" << endl; + (*m_ssBlock) << 0.0 << endl; + (*m_ssBlock) << " 3" << endl; + (*m_ssBlock) << "*MODEL_SPACE" << endl; + (*m_ssBlock) << " 1" << endl; + (*m_ssBlock) << " " << endl; + (*m_ssBlock) << " 0" << endl; + (*m_ssBlock) << "ENDBLK" << endl; + (*m_ssBlock) << " 5" << endl; + (*m_ssBlock) << getBlockHandle() << endl; + if (m_version > 12) { + (*m_ssBlock) << "330" << endl; + (*m_ssBlock) << m_saveModelSpaceHandle << endl; + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbEntity" << endl; + } + (*m_ssBlock) << " 8" << endl; + (*m_ssBlock) << "0" << endl; + if (m_version > 12) { + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbBlockEnd" << endl; + } + + (*m_ssBlock) << " 0" << endl; + (*m_ssBlock) << "BLOCK" << endl; + (*m_ssBlock) << " 5" << endl; + m_currentBlock = getBlockHandle(); + (*m_ssBlock) << m_currentBlock << endl; + if (m_version > 12) { + (*m_ssBlock) << "330" << endl; + (*m_ssBlock) << m_savePaperSpaceHandle << endl; + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbEntity" << endl; + (*m_ssBlock) << " 67" << endl; + (*m_ssBlock) << "1" << endl; + } + (*m_ssBlock) << " 8" << endl; + (*m_ssBlock) << "0" << endl; + if (m_version > 12) { + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbBlockBegin" << endl; + } + (*m_ssBlock) << " 2" << endl; + (*m_ssBlock) << "*PAPER_SPACE" << endl; + (*m_ssBlock) << " 70" << endl; + (*m_ssBlock) << " 0" << endl; + (*m_ssBlock) << " 10" << endl; + (*m_ssBlock) << 0.0 << endl; + (*m_ssBlock) << " 20" << endl; + (*m_ssBlock) << 0.0 << endl; + (*m_ssBlock) << " 30" << endl; + (*m_ssBlock) << 0.0 << endl; + (*m_ssBlock) << " 3" << endl; + (*m_ssBlock) << "*PAPER_SPACE" << endl; + (*m_ssBlock) << " 1" << endl; + (*m_ssBlock) << " " << endl; + (*m_ssBlock) << " 0" << endl; + (*m_ssBlock) << "ENDBLK" << endl; + (*m_ssBlock) << " 5" << endl; + (*m_ssBlock) << getBlockHandle() << endl; + if (m_version > 12) { + (*m_ssBlock) << "330" << endl; + (*m_ssBlock) << m_savePaperSpaceHandle << endl; + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbEntity" << endl; + (*m_ssBlock) << " 67" << endl; //paper_space flag + (*m_ssBlock) << " 1" << endl; + } + (*m_ssBlock) << " 8" << endl; + (*m_ssBlock) << "0" << endl; + if (m_version > 12) { + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbBlockEnd" << endl; + } +} + +ostringstream CDxfWrite::getPlateFile(std::string fileSpec) +{ + ostringstream outString; + Base::FileInfo fi(fileSpec); + if (!fi.isReadable()) { + Base::Console().Message("dxf unable to open %s!\n",fileSpec.c_str()); + } else { + string line; + ifstream inFile (fi.filePath().c_str()); + + while (!inFile.eof()) + { + getline(inFile,line); + if (!inFile.eof()) { + outString << line << '\n'; + } + } + } + return outString; +} + +std::string CDxfWrite::getEntityHandle(void) +{ + m_entityHandle++; + std::stringstream ss; + ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2); + ss << m_entityHandle; + return ss.str(); +} + +std::string CDxfWrite::getLayerHandle(void) +{ + m_layerHandle++; + std::stringstream ss; + ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2); + ss << m_layerHandle; + return ss.str(); +} + +std::string CDxfWrite::getBlockHandle(void) +{ + m_blockHandle++; + std::stringstream ss; + ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2); + ss << m_blockHandle; + return ss.str(); +} + +std::string CDxfWrite::getBlkRecordHandle(void) +{ + m_blkRecordHandle++; + std::stringstream ss; + ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2); + ss << m_blkRecordHandle; + return ss.str(); +} + +void CDxfWrite::addBlockName(std::string b, std::string h) +{ + m_blockList.push_back(b); + m_blkRecordList.push_back(h); +} + +void CDxfWrite::setLayerName(std::string s) +{ + m_layerName = s; + m_layerList.push_back(s); +} + +void CDxfWrite::writeLine(const double* s, const double* e) +{ + putLine(toVector3d(s),toVector3d(e),m_ssEntity, getEntityHandle(), m_saveModelSpaceHandle); +} + +void CDxfWrite::putLine(const Base::Vector3d s, const Base::Vector3d e, + std::ostringstream* outStream, const std::string handle, + const std::string ownerHandle) +{ + (*outStream) << " 0" << endl; + (*outStream) << "LINE" << endl; + (*outStream) << " 5" << endl; + (*outStream) << handle << endl; + if (m_version > 12) { + (*outStream) << "330" << endl; + (*outStream) << ownerHandle << endl; + (*outStream) << "100" << endl; + (*outStream) << "AcDbEntity" << endl; + } + (*outStream) << " 8" << endl; // Group code for layer name + (*outStream) << getLayerName() << endl; // Layer number + if (m_version > 12) { + (*outStream) << "100" << endl; + (*outStream) << "AcDbLine" << endl; + } + (*outStream) << " 10" << endl; // Start point of line + (*outStream) << s.x << endl; // X in WCS coordinates + (*outStream) << " 20" << endl; + (*outStream) << s.y << endl; // Y in WCS coordinates + (*outStream) << " 30" << endl; + (*outStream) << s.z << endl; // Z in WCS coordinates + (*outStream) << " 11" << endl; // End point of line + (*outStream) << e.x << endl; // X in WCS coordinates + (*outStream) << " 21" << endl; + (*outStream) << e.y << endl; // Y in WCS coordinates + (*outStream) << " 31" << endl; + (*outStream) << e.z << endl; // Z in WCS coordinates +} + + +//*************************** +//writeLWPolyLine (Note: LWPolyline might not be supported in R12 +//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project +void CDxfWrite::writeLWPolyLine(LWPolyDataOut pd) +{ + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "LWPOLYLINE" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + if (m_version > 12) { + (*m_ssEntity) << "330" << endl; + (*m_ssEntity) << m_saveModelSpaceHandle << endl; + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEntity" << endl; + } + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; //100 groups are not part of R12 + (*m_ssEntity) << "AcDbPolyline" << endl; + } + (*m_ssEntity) << " 8" << endl; // Group code for layer name + (*m_ssEntity) << getLayerName() << endl; // Layer name + (*m_ssEntity) << " 90" << endl; + (*m_ssEntity) << pd.nVert << endl; // number of vertices + (*m_ssEntity) << " 70" << endl; + (*m_ssEntity) << pd.Flag << endl; + (*m_ssEntity) << " 43" << endl; + (*m_ssEntity) << "0" << endl; //Constant width opt +// (*m_ssEntity) << pd.Width << endl; //Constant width opt +// (*m_ssEntity) << " 38" << endl; +// (*m_ssEntity) << pd.Elev << endl; // Elevation +// (*m_ssEntity) << " 39" << endl; +// (*m_ssEntity) << pd.Thick << endl; // Thickness + for (auto& p: pd.Verts) { + (*m_ssEntity) << " 10" << endl; // Vertices + (*m_ssEntity) << p.x << endl; + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << p.y << endl; + } for (auto& s: pd.StartWidth) { - (*m_ofs) << " 40" << endl; - (*m_ofs) << s << endl; // Start Width + (*m_ssEntity) << " 40" << endl; + (*m_ssEntity) << s << endl; // Start Width } for (auto& e: pd.EndWidth) { - (*m_ofs) << " 41" << endl; - (*m_ofs) << e << endl; // End Width + (*m_ssEntity) << " 41" << endl; + (*m_ssEntity) << e << endl; // End Width } for (auto& b: pd.Bulge) { // Bulge - (*m_ofs) << " 42" << endl; - (*m_ofs) << b << endl; + (*m_ssEntity) << " 42" << endl; + (*m_ssEntity) << b << endl; } - (*m_ofs) << "210" << endl; //Extrusion dir - (*m_ofs) << pd.Extr.x << endl; - (*m_ofs) << "220" << endl; - (*m_ofs) << pd.Extr.y << endl; - (*m_ofs) << "230" << endl; - (*m_ofs) << pd.Extr.z << endl; +// (*m_ssEntity) << "210" << endl; //Extrusion dir +// (*m_ssEntity) << pd.Extr.x << endl; +// (*m_ssEntity) << "220" << endl; +// (*m_ssEntity) << pd.Extr.y << endl; +// (*m_ssEntity) << "230" << endl; +// (*m_ssEntity) << pd.Extr.z << endl; } //*************************** -//WritePolyline +//writePolyline //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::WritePolyline(LWPolyDataOut pd, const char* layer_name) +void CDxfWrite::writePolyline(LWPolyDataOut pd) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "POLYLINE" << endl; - (*m_ofs) << " 8" << endl; - (*m_ofs) << layer_name << endl; // Layer name - (*m_ofs) << " 66" << endl; - (*m_ofs) << " 1" << endl; // vertices follow -// (*m_ofs) << "100" << endl; //100 groups are not part of R12 -// (*m_ofs) << "AcDbPolyline" << endl; - - (*m_ofs) << " 10" << endl; - (*m_ofs) << "0.0" << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << "0.0" << endl; - (*m_ofs) << " 30" << endl; - (*m_ofs) << "0.0" << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << "0" << endl; - for (auto& p: pd.Verts) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "VERTEX" << endl; - (*m_ofs) << " 8" << endl; - (*m_ofs) << layer_name << endl; // Layer name - (*m_ofs) << " 10" << endl; // Vertices - (*m_ofs) << p.x << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << p.y << endl; - (*m_ofs) << " 30" << endl; - (*m_ofs) << "0.0" << endl; + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "POLYLINE" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + if (m_version > 12) { + (*m_ssEntity) << "330" << endl; + (*m_ssEntity) << m_saveModelSpaceHandle << endl; + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEntity" << endl; } - (*m_ofs) << " 0" << endl; - (*m_ofs) << "SEQEND" << endl; - (*m_ofs) << " 8" << endl; - (*m_ofs) << layer_name << endl; + (*m_ssEntity) << " 8" << endl; + (*m_ssEntity) << getLayerName() << endl; // Layer name + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; //100 groups are not part of R12 + (*m_ssEntity) << "AcDbPolyline" << endl; + } + (*m_ssEntity) << " 66" << endl; + (*m_ssEntity) << " 1" << endl; // vertices follow + (*m_ssEntity) << " 10" << endl; + (*m_ssEntity) << "0.0" << endl; + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << "0.0" << endl; + (*m_ssEntity) << " 30" << endl; + (*m_ssEntity) << "0.0" << endl; + (*m_ssEntity) << " 70" << endl; + (*m_ssEntity) << "0" << endl; + for (auto& p: pd.Verts) { + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "VERTEX" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + (*m_ssEntity) << " 8" << endl; + (*m_ssEntity) << getLayerName() << endl; + (*m_ssEntity) << " 10" << endl; + (*m_ssEntity) << p.x << endl; + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << p.y << endl; + (*m_ssEntity) << " 30" << endl; + (*m_ssEntity) << "0.0" << endl; + } + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "SEQEND" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + (*m_ssEntity) << " 8" << endl; + (*m_ssEntity) << getLayerName() << endl; } -void CDxfWrite::WritePoint(const double* s, const char* layer_name) +void CDxfWrite::writePoint(const double* s) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "POINT" << endl; - (*m_ofs) << " 8" << endl; // Group code for layer name - (*m_ofs) << layer_name << endl; // Layer name -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbPoint" << endl; - (*m_ofs) << " 10" << endl; - (*m_ofs) << s[0] << endl; // X in WCS coordinates - (*m_ofs) << " 20" << endl; - (*m_ofs) << s[1] << endl; // Y in WCS coordinates - (*m_ofs) << " 30" << endl; - (*m_ofs) << s[2] << endl; // Z in WCS coordinates + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "POINT" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + if (m_version > 12) { + (*m_ssEntity) << "330" << endl; + (*m_ssEntity) << m_saveModelSpaceHandle << endl; + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEntity" << endl; + } + (*m_ssEntity) << " 8" << endl; // Group code for layer name + (*m_ssEntity) << getLayerName() << endl; // Layer name + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbPoint" << endl; + } + (*m_ssEntity) << " 10" << endl; + (*m_ssEntity) << s[0] << endl; // X in WCS coordinates + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << s[1] << endl; // Y in WCS coordinates + (*m_ssEntity) << " 30" << endl; + (*m_ssEntity) << s[2] << endl; // Z in WCS coordinates } -void CDxfWrite::WriteArc(const double* s, const double* e, const double* c, bool dir, const char* layer_name) +void CDxfWrite::writeArc(const double* s, const double* e, const double* c, bool dir) { double ax = s[0] - c[0]; double ay = s[1] - c[1]; double bx = e[0] - c[0]; double by = e[1] - c[1]; - double start_angle = atan2(ay, ax) * 180/Pi; - double end_angle = atan2(by, bx) * 180/Pi; + double start_angle = atan2(ay, ax) * 180/M_PI; + double end_angle = atan2(by, bx) * 180/M_PI; double radius = sqrt(ax*ax + ay*ay); if(!dir){ double temp = start_angle; start_angle = end_angle; end_angle = temp; } - (*m_ofs) << " 0" << endl; - (*m_ofs) << "ARC" << endl; - (*m_ofs) << " 8" << endl; // Group code for layer name - (*m_ofs) << layer_name << endl; // Layer number - (*m_ofs) << " 10" << endl; // Centre X - (*m_ofs) << c[0] << endl; // X in WCS coordinates - (*m_ofs) << " 20" << endl; - (*m_ofs) << c[1] << endl; // Y in WCS coordinates - (*m_ofs) << " 30" << endl; - (*m_ofs) << c[2] << endl; // Z in WCS coordinates - (*m_ofs) << " 40" << endl; // - (*m_ofs) << radius << endl; // Radius - (*m_ofs) << " 50" << endl; - (*m_ofs) << start_angle << endl; // Start angle - (*m_ofs) << " 51" << endl; - (*m_ofs) << end_angle << endl; // End angle + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "ARC" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + if (m_version > 12) { + (*m_ssEntity) << "330" << endl; + (*m_ssEntity) << m_saveModelSpaceHandle << endl; + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEntity" << endl; + } + (*m_ssEntity) << " 8" << endl; // Group code for layer name + (*m_ssEntity) << getLayerName() << endl; // Layer number +// (*m_ssEntity) << " 62" << endl; +// (*m_ssEntity) << " 0" << endl; + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbCircle" << endl; + } + (*m_ssEntity) << " 10" << endl; // Centre X + (*m_ssEntity) << c[0] << endl; // X in WCS coordinates + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << c[1] << endl; // Y in WCS coordinates + (*m_ssEntity) << " 30" << endl; + (*m_ssEntity) << c[2] << endl; // Z in WCS coordinates + (*m_ssEntity) << " 40" << endl; // + (*m_ssEntity) << radius << endl; // Radius + + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbArc" << endl; + } + (*m_ssEntity) << " 50" << endl; + (*m_ssEntity) << start_angle << endl; // Start angle + (*m_ssEntity) << " 51" << endl; + (*m_ssEntity) << end_angle << endl; // End angle } -void CDxfWrite::WriteCircle(const double* c, double radius, const char* layer_name) +void CDxfWrite::writeCircle(const double* c, double radius) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "CIRCLE" << endl; - (*m_ofs) << " 8" << endl; // Group code for layer name - (*m_ofs) << layer_name << endl; // Layer number - (*m_ofs) << " 10" << endl; // Centre X - (*m_ofs) << c[0] << endl; // X in WCS coordinates - (*m_ofs) << " 20" << endl; - (*m_ofs) << c[1] << endl; // Y in WCS coordinates - (*m_ofs) << " 30" << endl; - (*m_ofs) << c[2] << endl; // Z in WCS coordinates - (*m_ofs) << " 40" << endl; // - (*m_ofs) << radius << endl; // Radius + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "CIRCLE" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + if (m_version > 12) { + (*m_ssEntity) << "330" << endl; + (*m_ssEntity) << m_saveModelSpaceHandle << endl; + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEntity" << endl; + } + (*m_ssEntity) << " 8" << endl; // Group code for layer name + (*m_ssEntity) << getLayerName() << endl; // Layer number + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbCircle" << endl; + } + (*m_ssEntity) << " 10" << endl; // Centre X + (*m_ssEntity) << c[0] << endl; // X in WCS coordinates + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << c[1] << endl; // Y in WCS coordinates +// (*m_ssEntity) << " 30" << endl; +// (*m_ssEntity) << c[2] << endl; // Z in WCS coordinates + (*m_ssEntity) << " 40" << endl; // + (*m_ssEntity) << radius << endl; // Radius } -void CDxfWrite::WriteEllipse(const double* c, double major_radius, double minor_radius, double rotation, double start_angle, double end_angle, bool endIsCW, const char* layer_name ) +void CDxfWrite::writeEllipse(const double* c, double major_radius, double minor_radius, + double rotation, double start_angle, double end_angle, + bool endIsCW) { double m[3]; m[2]=0; @@ -246,435 +753,643 @@ void CDxfWrite::WriteEllipse(const double* c, double major_radius, double minor_ start_angle = end_angle; end_angle = temp; } - (*m_ofs) << " 0" << endl; - (*m_ofs) << "ELLIPSE" << endl; - (*m_ofs) << " 8" << endl; // Group code for layer name - (*m_ofs) << layer_name << endl; // Layer number - (*m_ofs) << " 10" << endl; // Centre X - (*m_ofs) << c[0] << endl; // X in WCS coordinates - (*m_ofs) << " 20" << endl; - (*m_ofs) << c[1] << endl; // Y in WCS coordinates - (*m_ofs) << " 30" << endl; - (*m_ofs) << c[2] << endl; // Z in WCS coordinates - (*m_ofs) << " 40" << endl; // - (*m_ofs) << ratio << endl; // Ratio - (*m_ofs) << " 11" << endl; // - (*m_ofs) << m[0] << endl; // Major X - (*m_ofs) << " 21" << endl; - (*m_ofs) << m[1] << endl; // Major Y - (*m_ofs) << " 31" << endl; - (*m_ofs) << m[2] << endl; // Major Z - // 210,220,230 extrusion direction X,Y,Z - (*m_ofs) << " 41" << endl; - (*m_ofs) << start_angle << endl; // Start angle (radians [0..2pi]) - (*m_ofs) << " 42" << endl; - (*m_ofs) << end_angle << endl; // End angle + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "ELLIPSE" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + if (m_version > 12) { + (*m_ssEntity) << "330" << endl; + (*m_ssEntity) << m_saveModelSpaceHandle << endl; + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEntity" << endl; + } + (*m_ssEntity) << " 8" << endl; // Group code for layer name + (*m_ssEntity) << getLayerName() << endl; // Layer number + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEllipse" << endl; + } + (*m_ssEntity) << " 10" << endl; // Centre X + (*m_ssEntity) << c[0] << endl; // X in WCS coordinates + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << c[1] << endl; // Y in WCS coordinates + (*m_ssEntity) << " 30" << endl; + (*m_ssEntity) << c[2] << endl; // Z in WCS coordinates + (*m_ssEntity) << " 11" << endl; // + (*m_ssEntity) << m[0] << endl; // Major X + (*m_ssEntity) << " 21" << endl; + (*m_ssEntity) << m[1] << endl; // Major Y + (*m_ssEntity) << " 31" << endl; + (*m_ssEntity) << m[2] << endl; // Major Z + (*m_ssEntity) << " 40" << endl; // + (*m_ssEntity) << ratio << endl; // Ratio +// (*m_ssEntity) << "210" << endl; //extrusion dir?? +// (*m_ssEntity) << "0" << endl; +// (*m_ssEntity) << "220" << endl; +// (*m_ssEntity) << "0" << endl; +// (*m_ssEntity) << "230" << endl; +// (*m_ssEntity) << "1" << endl; + (*m_ssEntity) << " 41" << endl; + (*m_ssEntity) << start_angle << endl; // Start angle (radians [0..2pi]) + (*m_ssEntity) << " 42" << endl; + (*m_ssEntity) << end_angle << endl; // End angle } //*************************** -//WriteSpline +//writeSpline //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::WriteSpline(SplineDataOut sd, const char* layer_name) +void CDxfWrite::writeSpline(SplineDataOut sd) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "SPLINE" << endl; - (*m_ofs) << " 8" << endl; // Group code for layer name - (*m_ofs) << layer_name << endl; // Layer name -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbEntity" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbSpline" << endl; - //normal 210,220,230 - (*m_ofs) << " 70" << endl; - (*m_ofs) << sd.flag << endl; //flags - (*m_ofs) << " 71" << endl; - (*m_ofs) << sd.degree << endl; - (*m_ofs) << " 72" << endl; - (*m_ofs) << sd.knots << endl; - (*m_ofs) << " 73" << endl; - (*m_ofs) << sd.control_points << endl; - (*m_ofs) << " 74" << endl; - (*m_ofs) << 0 << endl; + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "SPLINE" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + if (m_version > 12) { + (*m_ssEntity) << "330" << endl; + (*m_ssEntity) << m_saveModelSpaceHandle << endl; + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEntity" << endl; + } + (*m_ssEntity) << " 8" << endl; // Group code for layer name + (*m_ssEntity) << getLayerName() << endl; // Layer name + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbSpline" << endl; + } + (*m_ssEntity) << "210" << endl; + (*m_ssEntity) << "0" << endl; + (*m_ssEntity) << "220" << endl; + (*m_ssEntity) << "0" << endl; + (*m_ssEntity) << "230" << endl; + (*m_ssEntity) << "1" << endl; - (*m_ofs) << " 12" << endl; - (*m_ofs) << sd.starttan.x << endl; - (*m_ofs) << " 22" << endl; - (*m_ofs) << sd.starttan.y << endl; - (*m_ofs) << " 32" << endl; - (*m_ofs) << sd.starttan.z << endl; - (*m_ofs) << " 13" << endl; - (*m_ofs) << sd.endtan.x << endl; - (*m_ofs) << " 23" << endl; - (*m_ofs) << sd.endtan.y << endl; - (*m_ofs) << " 33" << endl; - (*m_ofs) << sd.endtan.z << endl; + (*m_ssEntity) << " 70" << endl; + (*m_ssEntity) << sd.flag << endl; //flags + (*m_ssEntity) << " 71" << endl; + (*m_ssEntity) << sd.degree << endl; + (*m_ssEntity) << " 72" << endl; + (*m_ssEntity) << sd.knots << endl; + (*m_ssEntity) << " 73" << endl; + (*m_ssEntity) << sd.control_points << endl; + (*m_ssEntity) << " 74" << endl; + (*m_ssEntity) << 0 << endl; + +// (*m_ssEntity) << " 12" << endl; +// (*m_ssEntity) << sd.starttan.x << endl; +// (*m_ssEntity) << " 22" << endl; +// (*m_ssEntity) << sd.starttan.y << endl; +// (*m_ssEntity) << " 32" << endl; +// (*m_ssEntity) << sd.starttan.z << endl; +// (*m_ssEntity) << " 13" << endl; +// (*m_ssEntity) << sd.endtan.x << endl; +// (*m_ssEntity) << " 23" << endl; +// (*m_ssEntity) << sd.endtan.y << endl; +// (*m_ssEntity) << " 33" << endl; +// (*m_ssEntity) << sd.endtan.z << endl; for (auto& k: sd.knot) { - (*m_ofs) << " 40" << endl; - (*m_ofs) << k << endl; + (*m_ssEntity) << " 40" << endl; + (*m_ssEntity) << k << endl; } for (auto& w : sd.weight) { - (*m_ofs) << " 41" << endl; - (*m_ofs) << w << endl; + (*m_ssEntity) << " 41" << endl; + (*m_ssEntity) << w << endl; } for (auto& c: sd.control) { - (*m_ofs) << " 10" << endl; - (*m_ofs) << c.x << endl; // X in WCS coordinates - (*m_ofs) << " 20" << endl; - (*m_ofs) << c.y << endl; // Y in WCS coordinates - (*m_ofs) << " 30" << endl; - (*m_ofs) << c.z << endl; // Z in WCS coordinates + (*m_ssEntity) << " 10" << endl; + (*m_ssEntity) << c.x << endl; // X in WCS coordinates + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << c.y << endl; // Y in WCS coordinates + (*m_ssEntity) << " 30" << endl; + (*m_ssEntity) << c.z << endl; // Z in WCS coordinates } for (auto& f: sd.fit) { - (*m_ofs) << " 11" << endl; - (*m_ofs) << f.x << endl; // X in WCS coordinates - (*m_ofs) << " 21" << endl; - (*m_ofs) << f.y << endl; // Y in WCS coordinates - (*m_ofs) << " 31" << endl; - (*m_ofs) << f.z << endl; // Z in WCS coordinates + (*m_ssEntity) << " 11" << endl; + (*m_ssEntity) << f.x << endl; // X in WCS coordinates + (*m_ssEntity) << " 21" << endl; + (*m_ssEntity) << f.y << endl; // Y in WCS coordinates + (*m_ssEntity) << " 31" << endl; + (*m_ssEntity) << f.z << endl; // Z in WCS coordinates } } //*************************** -//WriteVertex +//writeVertex //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::WriteVertex(double x, double y, double z, const char* layer_name) +void CDxfWrite::writeVertex(double x, double y, double z) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "VERTEX" << endl; - (*m_ofs) << " 8" << endl; - (*m_ofs) << layer_name << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbEntity" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbVertex" << endl; - (*m_ofs) << " 10" << endl; - (*m_ofs) << x << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << y << endl; - (*m_ofs) << " 30" << endl; - (*m_ofs) << z << endl; - (*m_ofs) << " 70" << endl; //flag - (*m_ofs) << 0 << endl; + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "VERTEX" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + if (m_version > 12) { + (*m_ssEntity) << "330" << endl; + (*m_ssEntity) << m_saveModelSpaceHandle << endl; + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEntity" << endl; + } + (*m_ssEntity) << " 8" << endl; + (*m_ssEntity) << getLayerName() << endl; + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbVertex" << endl; + } + (*m_ssEntity) << " 10" << endl; + (*m_ssEntity) << x << endl; + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << y << endl; + (*m_ssEntity) << " 30" << endl; + (*m_ssEntity) << z << endl; + (*m_ssEntity) << " 70" << endl; + (*m_ssEntity) << 0 << endl; +} + +void CDxfWrite::writeText(const char* text, const double* location1, const double* location2, + const double height, const int horizJust) +{ + putText(text, toVector3d(location1), toVector3d(location2), + height, horizJust, + m_ssEntity, getEntityHandle(), m_saveModelSpaceHandle); +} + +//*************************** +//putText +//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project +void CDxfWrite::putText(const char* text, const Base::Vector3d location1, const Base::Vector3d location2, + const double height, const int horizJust, + std::ostringstream* outStream, const std::string handle, + const std::string ownerHandle) +{ + (void) location2; + + (*outStream) << " 0" << endl; + (*outStream) << "TEXT" << endl; + (*outStream) << " 5" << endl; + (*outStream) << handle << endl; + if (m_version > 12) { + (*outStream) << "330" << endl; + (*outStream) << ownerHandle << endl; + (*outStream) << "100" << endl; + (*outStream) << "AcDbEntity" << endl; + } + (*outStream) << " 8" << endl; + (*outStream) << getLayerName() << endl; + if (m_version > 12) { + (*outStream) << "100" << endl; + (*outStream) << "AcDbText" << endl; + } +// (*outStream) << " 39" << endl; +// (*outStream) << 0 << endl; //thickness + (*outStream) << " 10" << endl; //first alignment point + (*outStream) << location1.x << endl; + (*outStream) << " 20" << endl; + (*outStream) << location1.y << endl; + (*outStream) << " 30" << endl; + (*outStream) << location1.z << endl; + (*outStream) << " 40" << endl; + (*outStream) << height << endl; + (*outStream) << " 1" << endl; + (*outStream) << text << endl; +// (*outStream) << " 50" << endl; +// (*outStream) << 0 << endl; //rotation +// (*outStream) << " 41" << endl; +// (*outStream) << 1 << endl; +// (*outStream) << " 51" << endl; +// (*outStream) << 0 << endl; + + (*outStream) << " 7" << endl; + (*outStream) << "STANDARD" << endl; //style +// (*outStream) << " 71" << endl; //default +// (*outStream) << "0" << endl; + (*outStream) << " 72" << endl; + (*outStream) << horizJust << endl; +//// (*outStream) << " 73" << endl; +//// (*outStream) << "0" << endl; + (*outStream) << " 11" << endl; //second alignment point + (*outStream) << location2.x << endl; + (*outStream) << " 21" << endl; + (*outStream) << location2.y << endl; + (*outStream) << " 31" << endl; + (*outStream) << location2.z << endl; +// (*outStream) << "210" << endl; +// (*outStream) << "0" << endl; +// (*outStream) << "220" << endl; +// (*outStream) << "0" << endl; +// (*outStream) << "230" << endl; +// (*outStream) << "1" << endl; + if (m_version > 12) { + (*outStream) << "100" << endl; + (*outStream) << "AcDbText" << endl; + } + +} + +void CDxfWrite::putArrow(Base::Vector3d arrowPos, Base::Vector3d barb1Pos, Base::Vector3d barb2Pos, + std::ostringstream* outStream, const std::string handle, + const std::string ownerHandle) +{ + (*outStream) << " 0" << endl; + (*outStream) << "SOLID" << endl; + (*outStream) << " 5" << endl; + (*outStream) << handle << endl; + if (m_version > 12) { + (*outStream) << "330" << endl; + (*outStream) << ownerHandle << endl; + (*outStream) << "100" << endl; + (*outStream) << "AcDbEntity" << endl; + } + (*outStream) << " 8" << endl; + (*outStream) << "0" << endl; + (*outStream) << " 62" << endl; + (*outStream) << " 0" << endl; + if (m_version > 12) { + (*outStream) << "100" << endl; + (*outStream) << "AcDbTrace" << endl; + } + (*outStream) << " 10" << endl; + (*outStream) << barb1Pos.x << endl; + (*outStream) << " 20" << endl; + (*outStream) << barb1Pos.y << endl; + (*outStream) << " 30" << endl; + (*outStream) << barb1Pos.z << endl; + (*outStream) << " 11" << endl; + (*outStream) << barb2Pos.x << endl; + (*outStream) << " 21" << endl; + (*outStream) << barb2Pos.y << endl; + (*outStream) << " 31" << endl; + (*outStream) << barb2Pos.z << endl; + (*outStream) << " 12" << endl; + (*outStream) << arrowPos.x << endl; + (*outStream) << " 22" << endl; + (*outStream) << arrowPos.y << endl; + (*outStream) << " 32" << endl; + (*outStream) << arrowPos.z << endl; + (*outStream) << " 13" << endl; + (*outStream) << arrowPos.x << endl; + (*outStream) << " 23" << endl; + (*outStream) << arrowPos.y << endl; + (*outStream) << " 33" << endl; + (*outStream) << arrowPos.z << endl; } //*************************** -//WriteText +//writeLinearDim //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::WriteText(const char* text, const double* location1, const double* location2, - const double height, const int horizJust, const char* layer_name) -{ - (*m_ofs) << " 0" << endl; - (*m_ofs) << "TEXT" << endl; - (*m_ofs) << " 8" << endl; - (*m_ofs) << layer_name << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbEntity" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbText" << endl; - (*m_ofs) << " 39" << endl; - (*m_ofs) << 0 << endl; //thickness - (*m_ofs) << " 10" << endl; //first alignment point - (*m_ofs) << location1[0] << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << location1[1] << endl; - (*m_ofs) << " 30" << endl; - (*m_ofs) << location1[2] << endl; - (*m_ofs) << " 40" << endl; - (*m_ofs) << height << endl; - (*m_ofs) << 1 << endl; - (*m_ofs) << text << endl; - (*m_ofs) << " 50" << endl; - (*m_ofs) << 0 << endl; //rotation - (*m_ofs) << " 7" << endl; - (*m_ofs) << "STANDARD" << endl; //style -// (*m_ofs) << " 71" << endl; //default -// (*m_ofs) << "0" << endl; - (*m_ofs) << " 72" << endl; - (*m_ofs) << horizJust << endl; - (*m_ofs) << " 73" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << " 11" << endl; //second alignment point - (*m_ofs) << location2[0] << endl; - (*m_ofs) << " 21" << endl; - (*m_ofs) << location2[1] << endl; - (*m_ofs) << " 31" << endl; - (*m_ofs) << location2[2] << endl; -} - -//*************************** -//WriteLinearDim -//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::WriteLinearDim(const double* textMidPoint, const double* lineDefPoint, +void CDxfWrite::writeLinearDim(const double* textMidPoint, const double* lineDefPoint, const double* extLine1, const double* extLine2, - const char* dimText, - const char* layer_name) -//const char* blockName, const int dimType, const int attachPoint, + const char* dimText) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "DIMENSION" << endl; - (*m_ofs) << " 8" << endl; - (*m_ofs) << layer_name << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbEntity" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbDimension" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "*" << layer_name << endl; // blockName - (*m_ofs) << " 10" << endl; //dimension line definition point - (*m_ofs) << lineDefPoint[0] << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << lineDefPoint[1] << endl; - (*m_ofs) << " 30" << endl; - (*m_ofs) << lineDefPoint[2] << endl; - (*m_ofs) << " 11" << endl; //text mid point - (*m_ofs) << textMidPoint[0] << endl; - (*m_ofs) << " 21" << endl; - (*m_ofs) << textMidPoint[1] << endl; - (*m_ofs) << " 31" << endl; - (*m_ofs) << textMidPoint[2] << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << 1 << endl; // dimType1 = Aligned -// (*m_ofs) << " 71" << endl; // not R12 -// (*m_ofs) << 1 << endl; // attachPoint ??1 = topleft - (*m_ofs) << " 1" << endl; - (*m_ofs) << dimText << endl; - (*m_ofs) << " 3" << endl; - (*m_ofs) << "STANDARD" << endl; //style + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "DIMENSION" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + if (m_version > 12) { + (*m_ssEntity) << "330" << endl; + (*m_ssEntity) << m_saveModelSpaceHandle << endl; + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEntity" << endl; + } + (*m_ssEntity) << " 8" << endl; + (*m_ssEntity) << getLayerName() << endl; + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbDimension" << endl; + } + (*m_ssEntity) << " 2" << endl; + (*m_ssEntity) << "*" << getLayerName() << endl; // blockName + (*m_ssEntity) << " 10" << endl; //dimension line definition point + (*m_ssEntity) << lineDefPoint[0] << endl; + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << lineDefPoint[1] << endl; + (*m_ssEntity) << " 30" << endl; + (*m_ssEntity) << lineDefPoint[2] << endl; + (*m_ssEntity) << " 11" << endl; //text mid point + (*m_ssEntity) << textMidPoint[0] << endl; + (*m_ssEntity) << " 21" << endl; + (*m_ssEntity) << textMidPoint[1] << endl; + (*m_ssEntity) << " 31" << endl; + (*m_ssEntity) << textMidPoint[2] << endl; + (*m_ssEntity) << " 70" << endl; + (*m_ssEntity) << 1 << endl; // dimType1 = Aligned +// (*m_ssEntity) << " 71" << endl; // not R12 +// (*m_ssEntity) << 1 << endl; // attachPoint ??1 = topleft + (*m_ssEntity) << " 1" << endl; + (*m_ssEntity) << dimText << endl; + (*m_ssEntity) << " 3" << endl; + (*m_ssEntity) << "STANDARD" << endl; //style //linear dims -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbAlignedDimension" << endl; - (*m_ofs) << " 13" << endl; - (*m_ofs) << extLine1[0] << endl; - (*m_ofs) << " 23" << endl; - (*m_ofs) << extLine1[1] << endl; - (*m_ofs) << " 33" << endl; - (*m_ofs) << extLine1[2] << endl; - (*m_ofs) << " 14" << endl; - (*m_ofs) << extLine2[0] << endl; - (*m_ofs) << " 24" << endl; - (*m_ofs) << extLine2[1] << endl; - (*m_ofs) << " 34" << endl; - (*m_ofs) << extLine2[2] << endl; + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbAlignedDimension" << endl; + } + (*m_ssEntity) << " 13" << endl; + (*m_ssEntity) << extLine1[0] << endl; + (*m_ssEntity) << " 23" << endl; + (*m_ssEntity) << extLine1[1] << endl; + (*m_ssEntity) << " 33" << endl; + (*m_ssEntity) << extLine1[2] << endl; + (*m_ssEntity) << " 14" << endl; + (*m_ssEntity) << extLine2[0] << endl; + (*m_ssEntity) << " 24" << endl; + (*m_ssEntity) << extLine2[1] << endl; + (*m_ssEntity) << " 34" << endl; + (*m_ssEntity) << extLine2[2] << endl; - writeDimBlockPreamble(layer_name); + writeDimBlockPreamble(); writeLinearDimBlock(textMidPoint,lineDefPoint, extLine1, extLine2, dimText); + writeBlockTrailer(); } //*************************** -//WriteAngularDim +//writeAngularDim //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::WriteAngularDim(const double* textMidPoint, const double* lineDefPoint, +void CDxfWrite::writeAngularDim(const double* textMidPoint, const double* lineDefPoint, const double* startExt1, const double* endExt1, const double* startExt2, const double* endExt2, - const char* dimText, - const char* layer_name) + const char* dimText) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "DIMENSION" << endl; - (*m_ofs) << " 8" << endl; - (*m_ofs) << layer_name << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbEntity" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbDimension" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "*" << layer_name << endl; // blockName + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "DIMENSION" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + if (m_version > 12) { + (*m_ssEntity) << "330" << endl; + (*m_ssEntity) << m_saveModelSpaceHandle << endl; + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEntity" << endl; + } + (*m_ssEntity) << " 8" << endl; + (*m_ssEntity) << getLayerName() << endl; + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbDimension" << endl; + } + (*m_ssEntity) << " 2" << endl; + (*m_ssEntity) << "*" << getLayerName() << endl; // blockName - (*m_ofs) << " 10" << endl; - (*m_ofs) << endExt2[0] << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << endExt2[1] << endl; - (*m_ofs) << " 30" << endl; - (*m_ofs) << endExt2[2] << endl; + (*m_ssEntity) << " 10" << endl; + (*m_ssEntity) << endExt2[0] << endl; + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << endExt2[1] << endl; + (*m_ssEntity) << " 30" << endl; + (*m_ssEntity) << endExt2[2] << endl; - (*m_ofs) << " 11" << endl; - (*m_ofs) << textMidPoint[0] << endl; - (*m_ofs) << " 21" << endl; - (*m_ofs) << textMidPoint[1] << endl; - (*m_ofs) << " 31" << endl; - (*m_ofs) << textMidPoint[2] << endl; + (*m_ssEntity) << " 11" << endl; + (*m_ssEntity) << textMidPoint[0] << endl; + (*m_ssEntity) << " 21" << endl; + (*m_ssEntity) << textMidPoint[1] << endl; + (*m_ssEntity) << " 31" << endl; + (*m_ssEntity) << textMidPoint[2] << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << 2 << endl; // dimType 2 = Angular 5 = Angular 3 point + (*m_ssEntity) << " 70" << endl; + (*m_ssEntity) << 2 << endl; // dimType 2 = Angular 5 = Angular 3 point // +32 for block?? (not R12) -// (*m_ofs) << " 71" << endl; // not R12 -// (*m_ofs) << 5 << endl; // attachPoint 5 = middle - (*m_ofs) << " 1" << endl; - (*m_ofs) << dimText << endl; - (*m_ofs) << " 3" << endl; - (*m_ofs) << "STANDARD" << endl; //style +// (*m_ssEntity) << " 71" << endl; // not R12? not required? +// (*m_ssEntity) << 5 << endl; // attachPoint 5 = middle + (*m_ssEntity) << " 1" << endl; + (*m_ssEntity) << dimText << endl; + (*m_ssEntity) << " 3" << endl; + (*m_ssEntity) << "STANDARD" << endl; //style //angular dims -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDb2LineAngularDimension" << endl; + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDb2LineAngularDimension" << endl; + } + (*m_ssEntity) << " 13" << endl; + (*m_ssEntity) << startExt1[0] << endl; + (*m_ssEntity) << " 23" << endl; + (*m_ssEntity) << startExt1[1] << endl; + (*m_ssEntity) << " 33" << endl; + (*m_ssEntity) << startExt1[2] << endl; - (*m_ofs) << " 13" << endl; - (*m_ofs) << startExt1[0] << endl; - (*m_ofs) << " 23" << endl; - (*m_ofs) << startExt1[1] << endl; - (*m_ofs) << " 33" << endl; - (*m_ofs) << startExt1[2] << endl; + (*m_ssEntity) << " 14" << endl; + (*m_ssEntity) << endExt1[0] << endl; + (*m_ssEntity) << " 24" << endl; + (*m_ssEntity) << endExt1[1] << endl; + (*m_ssEntity) << " 34" << endl; + (*m_ssEntity) << endExt1[2] << endl; - (*m_ofs) << " 14" << endl; - (*m_ofs) << endExt1[0] << endl; - (*m_ofs) << " 24" << endl; - (*m_ofs) << endExt1[1] << endl; - (*m_ofs) << " 34" << endl; - (*m_ofs) << endExt1[2] << endl; + (*m_ssEntity) << " 15" << endl; + (*m_ssEntity) << startExt2[0] << endl; + (*m_ssEntity) << " 25" << endl; + (*m_ssEntity) << startExt2[1] << endl; + (*m_ssEntity) << " 35" << endl; + (*m_ssEntity) << startExt2[2] << endl; - (*m_ofs) << " 15" << endl; - (*m_ofs) << startExt2[0] << endl; - (*m_ofs) << " 25" << endl; - (*m_ofs) << startExt2[1] << endl; - (*m_ofs) << " 35" << endl; - (*m_ofs) << startExt2[2] << endl; - - (*m_ofs) << " 16" << endl; - (*m_ofs) << lineDefPoint[0] << endl; - (*m_ofs) << " 26" << endl; - (*m_ofs) << lineDefPoint[1] << endl; - (*m_ofs) << " 36" << endl; - (*m_ofs) << lineDefPoint[2] << endl; - writeDimBlockPreamble(layer_name); + (*m_ssEntity) << " 16" << endl; + (*m_ssEntity) << lineDefPoint[0] << endl; + (*m_ssEntity) << " 26" << endl; + (*m_ssEntity) << lineDefPoint[1] << endl; + (*m_ssEntity) << " 36" << endl; + (*m_ssEntity) << lineDefPoint[2] << endl; + writeDimBlockPreamble(); writeAngularDimBlock(textMidPoint, lineDefPoint, startExt1, endExt1, startExt2, endExt2, dimText); + writeBlockTrailer(); } //*************************** -//WriteRadialDim +//writeRadialDim //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::WriteRadialDim(const double* centerPoint, const double* textMidPoint, +void CDxfWrite::writeRadialDim(const double* centerPoint, const double* textMidPoint, const double* arcPoint, - const char* dimText, - const char* layer_name) + const char* dimText) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "DIMENSION" << endl; - (*m_ofs) << " 8" << endl; - (*m_ofs) << layer_name << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbEntity" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbDimension" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "*" << layer_name << endl; // blockName - (*m_ofs) << " 10" << endl; // arc center point - (*m_ofs) << centerPoint[0] << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << centerPoint[1] << endl; - (*m_ofs) << " 30" << endl; - (*m_ofs) << centerPoint[2] << endl; - (*m_ofs) << " 11" << endl; //text mid point - (*m_ofs) << textMidPoint[0] << endl; - (*m_ofs) << " 21" << endl; - (*m_ofs) << textMidPoint[1] << endl; - (*m_ofs) << " 31" << endl; - (*m_ofs) << textMidPoint[2] << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << 4 << endl; // dimType 4 = Radius -// (*m_ofs) << " 71" << endl; // not R12 -// (*m_ofs) << 1 << endl; // attachPoint 5 = middle center - (*m_ofs) << " 1" << endl; - (*m_ofs) << dimText << endl; - (*m_ofs) << " 3" << endl; - (*m_ofs) << "STANDARD" << endl; //style + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "DIMENSION" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + if (m_version > 12) { + (*m_ssEntity) << "330" << endl; + (*m_ssEntity) << m_saveModelSpaceHandle << endl; + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEntity" << endl; + } + (*m_ssEntity) << " 8" << endl; + (*m_ssEntity) << getLayerName() << endl; + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbDimension" << endl; + } + (*m_ssEntity) << " 2" << endl; + (*m_ssEntity) << "*" << getLayerName() << endl; // blockName + (*m_ssEntity) << " 10" << endl; // arc center point + (*m_ssEntity) << centerPoint[0] << endl; + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << centerPoint[1] << endl; + (*m_ssEntity) << " 30" << endl; + (*m_ssEntity) << centerPoint[2] << endl; + (*m_ssEntity) << " 11" << endl; //text mid point + (*m_ssEntity) << textMidPoint[0] << endl; + (*m_ssEntity) << " 21" << endl; + (*m_ssEntity) << textMidPoint[1] << endl; + (*m_ssEntity) << " 31" << endl; + (*m_ssEntity) << textMidPoint[2] << endl; + (*m_ssEntity) << " 70" << endl; + (*m_ssEntity) << 4 << endl; // dimType 4 = Radius +// (*m_ssEntity) << " 71" << endl; // not R12 +// (*m_ssEntity) << 1 << endl; // attachPoint 5 = middle center + (*m_ssEntity) << " 1" << endl; + (*m_ssEntity) << dimText << endl; + (*m_ssEntity) << " 3" << endl; + (*m_ssEntity) << "STANDARD" << endl; //style //radial dims -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbRadialDimension" << endl; - (*m_ofs) << " 15" << endl; - (*m_ofs) << arcPoint[0] << endl; - (*m_ofs) << " 25" << endl; - (*m_ofs) << arcPoint[1] << endl; - (*m_ofs) << " 35" << endl; - (*m_ofs) << arcPoint[2] << endl; - (*m_ofs) << " 40" << endl; // leader length???? - (*m_ofs) << 0 << endl; + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbRadialDimension" << endl; + } + (*m_ssEntity) << " 15" << endl; + (*m_ssEntity) << arcPoint[0] << endl; + (*m_ssEntity) << " 25" << endl; + (*m_ssEntity) << arcPoint[1] << endl; + (*m_ssEntity) << " 35" << endl; + (*m_ssEntity) << arcPoint[2] << endl; + (*m_ssEntity) << " 40" << endl; // leader length???? + (*m_ssEntity) << 0 << endl; - writeDimBlockPreamble(layer_name); + writeDimBlockPreamble(); writeRadialDimBlock(centerPoint, textMidPoint, arcPoint, dimText); + writeBlockTrailer(); } //*************************** -//WriteDiametricDim +//writeDiametricDim //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::WriteDiametricDim(const double* textMidPoint, +void CDxfWrite::writeDiametricDim(const double* textMidPoint, const double* arcPoint1, const double* arcPoint2, - const char* dimText, - const char* layer_name) + const char* dimText) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "DIMENSION" << endl; - (*m_ofs) << " 8" << endl; - (*m_ofs) << layer_name << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbEntity" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbDimension" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "*" << layer_name << endl; // blockName - (*m_ofs) << " 10" << endl; - (*m_ofs) << arcPoint1[0] << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << arcPoint1[1] << endl; - (*m_ofs) << " 30" << endl; - (*m_ofs) << arcPoint1[2] << endl; - (*m_ofs) << " 11" << endl; //text mid point - (*m_ofs) << textMidPoint[0] << endl; - (*m_ofs) << " 21" << endl; - (*m_ofs) << textMidPoint[1] << endl; - (*m_ofs) << " 31" << endl; - (*m_ofs) << textMidPoint[2] << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << 3 << endl; // dimType 3 = Diameter -// (*m_ofs) << " 71" << endl; // not R12 -// (*m_ofs) << 5 << endl; // attachPoint 5 = middle center - (*m_ofs) << " 1" << endl; - (*m_ofs) << dimText << endl; - (*m_ofs) << " 3" << endl; - (*m_ofs) << "STANDARD" << endl; //style + (*m_ssEntity) << " 0" << endl; + (*m_ssEntity) << "DIMENSION" << endl; + (*m_ssEntity) << " 5" << endl; + (*m_ssEntity) << getEntityHandle() << endl; + if (m_version > 12) { + (*m_ssEntity) << "330" << endl; + (*m_ssEntity) << m_saveModelSpaceHandle << endl; + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbEntity" << endl; + } + (*m_ssEntity) << " 8" << endl; + (*m_ssEntity) << getLayerName() << endl; + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbDimension" << endl; + } + (*m_ssEntity) << " 2" << endl; + (*m_ssEntity) << "*" << getLayerName() << endl; // blockName + (*m_ssEntity) << " 10" << endl; + (*m_ssEntity) << arcPoint1[0] << endl; + (*m_ssEntity) << " 20" << endl; + (*m_ssEntity) << arcPoint1[1] << endl; + (*m_ssEntity) << " 30" << endl; + (*m_ssEntity) << arcPoint1[2] << endl; + (*m_ssEntity) << " 11" << endl; //text mid point + (*m_ssEntity) << textMidPoint[0] << endl; + (*m_ssEntity) << " 21" << endl; + (*m_ssEntity) << textMidPoint[1] << endl; + (*m_ssEntity) << " 31" << endl; + (*m_ssEntity) << textMidPoint[2] << endl; + (*m_ssEntity) << " 70" << endl; + (*m_ssEntity) << 3 << endl; // dimType 3 = Diameter +// (*m_ssEntity) << " 71" << endl; // not R12 +// (*m_ssEntity) << 5 << endl; // attachPoint 5 = middle center + (*m_ssEntity) << " 1" << endl; + (*m_ssEntity) << dimText << endl; + (*m_ssEntity) << " 3" << endl; + (*m_ssEntity) << "STANDARD" << endl; //style //diametric dims -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbDiametricDimension" << endl; - (*m_ofs) << " 15" << endl; - (*m_ofs) << arcPoint2[0] << endl; - (*m_ofs) << " 25" << endl; - (*m_ofs) << arcPoint2[1] << endl; - (*m_ofs) << " 35" << endl; - (*m_ofs) << arcPoint2[2] << endl; - (*m_ofs) << " 40" << endl; // leader length???? - (*m_ofs) << 0 << endl; + if (m_version > 12) { + (*m_ssEntity) << "100" << endl; + (*m_ssEntity) << "AcDbDiametricDimension" << endl; + } + (*m_ssEntity) << " 15" << endl; + (*m_ssEntity) << arcPoint2[0] << endl; + (*m_ssEntity) << " 25" << endl; + (*m_ssEntity) << arcPoint2[1] << endl; + (*m_ssEntity) << " 35" << endl; + (*m_ssEntity) << arcPoint2[2] << endl; + (*m_ssEntity) << " 40" << endl; // leader length???? + (*m_ssEntity) << 0 << endl; - writeDimBlockPreamble(layer_name); + writeDimBlockPreamble(); writeDiametricDimBlock(textMidPoint, arcPoint1, arcPoint2, dimText); + writeBlockTrailer(); } //*************************** -//WriteDimBlockPreamble +//writeDimBlockPreamble //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeDimBlockPreamble(const char* layer_name) +void CDxfWrite::writeDimBlockPreamble(void) { - m_ssBlock << " 0" << endl; - m_ssBlock << "BLOCK" << endl; - m_ssBlock << " 8" << endl; - m_ssBlock << layer_name << endl; - m_ssBlock << " 2" << endl; - m_ssBlock << "*" << layer_name << endl; // blockName - m_ssBlock << " 10" << endl; - m_ssBlock << 0.0 << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << 0.0 << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << 0.0 << endl; - m_ssBlock << " 3" << endl; - m_ssBlock << "*" << layer_name << endl; // blockName - m_ssBlock << " 70" << endl; - m_ssBlock << "1" << endl; + if (m_version > 12) { + std::string blockName("*"); + blockName += getLayerName(); + m_saveBlkRecordHandle = getBlkRecordHandle(); + addBlockName(blockName,m_saveBlkRecordHandle); + } + + m_currentBlock = getBlockHandle(); + (*m_ssBlock) << " 0" << endl; + (*m_ssBlock) << "BLOCK" << endl; + (*m_ssBlock) << " 5" << endl; + (*m_ssBlock) << m_currentBlock << endl; + if (m_version > 12) { + (*m_ssBlock) << "330" << endl; + (*m_ssBlock) << m_saveBlkRecordHandle << endl; + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbEntity" << endl; + } + (*m_ssBlock) << " 8" << endl; + (*m_ssBlock) << getLayerName() << endl; + if (m_version > 12) { + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbBlockBegin" << endl; + } + (*m_ssBlock) << " 2" << endl; + (*m_ssBlock) << "*" << getLayerName() << endl; // blockName + (*m_ssBlock) << " 70" << endl; + (*m_ssBlock) << " 1" << endl; + (*m_ssBlock) << " 10" << endl; + (*m_ssBlock) << 0.0 << endl; + (*m_ssBlock) << " 20" << endl; + (*m_ssBlock) << 0.0 << endl; + (*m_ssBlock) << " 30" << endl; + (*m_ssBlock) << 0.0 << endl; + (*m_ssBlock) << " 3" << endl; + (*m_ssBlock) << "*" << getLayerName() << endl; // blockName + (*m_ssBlock) << " 1" << endl; + (*m_ssBlock) << " " << endl; +} + +//*************************** +//writeBlockTrailer +//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project +void CDxfWrite::writeBlockTrailer(void) +{ + (*m_ssBlock) << " 0" << endl; + (*m_ssBlock) << "ENDBLK" << endl; + (*m_ssBlock) << " 5" << endl; + (*m_ssBlock) << getBlockHandle() << endl; + if (m_version > 12) { + (*m_ssBlock) << "330" << endl; + (*m_ssBlock) << m_saveBlkRecordHandle << endl; + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbEntity" << endl; + } +// (*m_ssBlock) << " 67" << endl; +// (*m_ssBlock) << "1" << endl; + (*m_ssBlock) << " 8" << endl; + (*m_ssBlock) << getLayerName() << endl; + if (m_version > 12) { + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbBlockEnd" << endl; + } } //*************************** @@ -693,161 +1408,39 @@ void CDxfWrite::writeLinearDimBlock(const double* textMidPoint, const double* di Base::Vector3d para = e1E - e2E; Base::Vector3d X(1.0,0.0,0.0); double angle = para.GetAngle(X); - angle = angle * 180.0 / Pi; + angle = angle * 180.0 / M_PI; double arrowLen = 5.0; //magic number double arrowWidth = arrowLen/6.0/2.0; //magic number calc! - m_ssBlock << " 0" << endl; - m_ssBlock << "LINE" << endl; //extension line 2 - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << e2Start[0] << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << e2Start[1] << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << e2Start[2] << endl; - m_ssBlock << " 11" << endl; - m_ssBlock << e2E.x << endl; - m_ssBlock << " 21" << endl; - m_ssBlock << e2E.y << endl; - m_ssBlock << " 31" << endl; - m_ssBlock << e2E.z << endl; + putLine(e2S, e2E, + m_ssBlock, getBlockHandle(), + m_saveBlkRecordHandle); - m_ssBlock << " 0" << endl; - m_ssBlock << "LINE" << endl; //extension line 1 - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << e1Start[0] << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << e1Start[1] << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << e1Start[2] << endl; - m_ssBlock << " 11" << endl; - m_ssBlock << e1E.x << endl; - m_ssBlock << " 21" << endl; - m_ssBlock << e1E.y << endl; - m_ssBlock << " 31" << endl; - m_ssBlock << e1E.z << endl; + putLine(e1S, e1E, + m_ssBlock, getBlockHandle(), + m_saveBlkRecordHandle); - m_ssBlock << " 0" << endl; - m_ssBlock << "LINE" << endl; //dimension line - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << e1E.x << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << e1E.y << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << e1E.z << endl; - m_ssBlock << " 11" << endl; - m_ssBlock << e2E.x << endl; - m_ssBlock << " 21" << endl; - m_ssBlock << e2E.y << endl; - m_ssBlock << " 31" << endl; - m_ssBlock << e2E.z << endl; + putLine(e1E, e2E, + m_ssBlock, getBlockHandle(), + m_saveBlkRecordHandle); - m_ssBlock << " 0" << endl; - m_ssBlock << "TEXT" << endl; //dim text - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 6" << endl; - m_ssBlock << "CONTINUOUS" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - - m_ssBlock << " 10" << endl; - m_ssBlock << textMidPoint[0] << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << textMidPoint[1] << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << textMidPoint[2] << endl; - m_ssBlock << " 40" << endl; - m_ssBlock << "3.5" << endl; - m_ssBlock << " 1" << endl; - m_ssBlock << dimText << endl; -// m_ssBlock << " 50" << endl; -// m_ssBlock << angle << endl; + putText(dimText,toVector3d(textMidPoint), toVector3d(dimLine),3.5,1, + m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); perp.Normalize(); para.Normalize(); Base::Vector3d arrowStart = e1E; Base::Vector3d barb1 = arrowStart + perp*arrowWidth - para*arrowLen; Base::Vector3d barb2 = arrowStart - perp*arrowWidth - para*arrowLen; - m_ssBlock << " 0" << endl; - m_ssBlock << "SOLID" << endl; //arrowhead 1 - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << barb1.x << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << barb1.y << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << barb1.z << endl; - m_ssBlock << " 11" << endl; - m_ssBlock << barb2.x << endl; - m_ssBlock << " 21" << endl; - m_ssBlock << barb2.y << endl; - m_ssBlock << " 31" << endl; - m_ssBlock << barb2.z << endl; - m_ssBlock << " 12" << endl; - m_ssBlock << e1E.x << endl; - m_ssBlock << " 22" << endl; - m_ssBlock << e1E.y << endl; - m_ssBlock << " 32" << endl; - m_ssBlock << e1E.z << endl; - m_ssBlock << " 13" << endl; - m_ssBlock << e1E.x << endl; - m_ssBlock << " 23" << endl; - m_ssBlock << e1E.y << endl; - m_ssBlock << " 33" << endl; - m_ssBlock << e1E.z << endl; + putArrow(arrowStart, barb1, barb2, + m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); + arrowStart = e2E; barb1 = arrowStart + perp*arrowWidth + para*arrowLen; barb2 = arrowStart - perp*arrowWidth + para*arrowLen; - m_ssBlock << " 0" << endl; - m_ssBlock << "SOLID" << endl; //arrowhead 2 - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << barb1.x << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << barb1.y << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << barb1.z << endl; - m_ssBlock << " 11" << endl; - m_ssBlock << barb2.x << endl; - m_ssBlock << " 21" << endl; - m_ssBlock << barb2.y << endl; - m_ssBlock << " 31" << endl; - m_ssBlock << barb2.z << endl; - m_ssBlock << " 12" << endl; - m_ssBlock << e2E.x << endl; - m_ssBlock << " 22" << endl; - m_ssBlock << e2E.y << endl; - m_ssBlock << " 32" << endl; - m_ssBlock << e2E.z << endl; - m_ssBlock << " 13" << endl; - m_ssBlock << e2E.x << endl; - m_ssBlock << " 23" << endl; - m_ssBlock << e2E.y << endl; - m_ssBlock << " 33" << endl; - m_ssBlock << e2E.z << endl; - - m_ssBlock << " 0" << endl; - m_ssBlock << "ENDBLK" << endl; + putArrow(arrowStart, barb1, barb2, + m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); } //*************************** @@ -870,58 +1463,56 @@ void CDxfWrite::writeAngularDimBlock(const double* textMidPoint, const double* l double span = fabs(endAngle - startAngle); double offset = span * 0.10; if (startAngle < 0) { - startAngle += 2.0 * Pi; + startAngle += 2.0 * M_PI; } if (endAngle < 0) { - endAngle += 2.0 * Pi; + endAngle += 2.0 * M_PI; } Base::Vector3d startOff(cos(startAngle + offset),sin(startAngle + offset),0.0); Base::Vector3d endOff(cos(endAngle - offset),sin(endAngle - offset),0.0); - startAngle = startAngle * 180.0 / Pi; - endAngle = endAngle * 180.0 / Pi; - + startAngle = startAngle * 180.0 / M_PI; + endAngle = endAngle * 180.0 / M_PI; + Base::Vector3d linePt(lineDefPoint[0],lineDefPoint[1],lineDefPoint[2]); double radius = (e2S - linePt).Length(); - m_ssBlock << " 0" << endl; - m_ssBlock << "ARC" << endl; //dimline arc - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << startExt2[0] << endl; //arc center - m_ssBlock << " 20" << endl; - m_ssBlock << startExt2[1] << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << startExt2[2] << endl; - m_ssBlock << " 40" << endl; - m_ssBlock << radius << endl; //radius - m_ssBlock << " 50" << endl; - m_ssBlock << startAngle << endl; //start angle - m_ssBlock << " 51" << endl; - m_ssBlock << endAngle << endl; //end angle + (*m_ssBlock) << " 0" << endl; + (*m_ssBlock) << "ARC" << endl; //dimline arc + (*m_ssBlock) << " 5" << endl; + (*m_ssBlock) << getBlockHandle() << endl; + if (m_version > 12) { + (*m_ssBlock) << "330" << endl; + (*m_ssBlock) << m_saveBlkRecordHandle << endl; + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbEntity" << endl; + } + (*m_ssBlock) << " 8" << endl; + (*m_ssBlock) << "0" << endl; +// (*m_ssBlock) << " 62" << endl; +// (*m_ssBlock) << " 0" << endl; + if (m_version > 12) { + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbCircle" << endl; + } + (*m_ssBlock) << " 10" << endl; + (*m_ssBlock) << startExt2[0] << endl; //arc center + (*m_ssBlock) << " 20" << endl; + (*m_ssBlock) << startExt2[1] << endl; + (*m_ssBlock) << " 30" << endl; + (*m_ssBlock) << startExt2[2] << endl; + (*m_ssBlock) << " 40" << endl; + (*m_ssBlock) << radius << endl; //radius + if (m_version > 12) { + (*m_ssBlock) << "100" << endl; + (*m_ssBlock) << "AcDbArc" << endl; + } + (*m_ssBlock) << " 50" << endl; + (*m_ssBlock) << startAngle << endl; //start angle + (*m_ssBlock) << " 51" << endl; + (*m_ssBlock) << endAngle << endl; //end angle - m_ssBlock << " 0" << endl; - m_ssBlock << "TEXT" << endl; //dim text - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 6" << endl; - m_ssBlock << "CONTINUOUS" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << textMidPoint[0] << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << textMidPoint[1] << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << textMidPoint[2] << endl; - m_ssBlock << " 40" << endl; - m_ssBlock << "3.5" << endl; - m_ssBlock << " 1" << endl; - m_ssBlock << dimText << endl; -// m_ssBlock << " 50" << endl; -// m_ssBlock << 0 << endl; + putText(dimText,toVector3d(textMidPoint), toVector3d(textMidPoint),3.5,1, + m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); e1.Normalize(); e2.Normalize(); @@ -932,133 +1523,37 @@ void CDxfWrite::writeAngularDimBlock(const double* textMidPoint, const double* l Base::Vector3d endTan = e1S + (startOff * radius); Base::Vector3d startTan = e2S + (endOff * radius); Base::Vector3d tanP1 = (arrow1Start - startTan).Normalize(); - Base::Vector3d perp1(-tanP1.y,tanP1.x,tanP1.z); + Base::Vector3d perp1(-tanP1.y,tanP1.x,tanP1.z); Base::Vector3d tanP2 = (arrow2Start - endTan).Normalize(); - Base::Vector3d perp2(-tanP2.y,tanP2.x,tanP2.z); + Base::Vector3d perp2(-tanP2.y,tanP2.x,tanP2.z); double arrowLen = 5.0; //magic number double arrowWidth = arrowLen/6.0/2.0; //magic number calc! Base::Vector3d barb1 = arrow1Start + perp1*arrowWidth - tanP1*arrowLen; Base::Vector3d barb2 = arrow1Start - perp1*arrowWidth - tanP1*arrowLen; - m_ssBlock << " 0" << endl; - m_ssBlock << "SOLID" << endl; //arrowhead 1 - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << barb1.x << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << barb1.y << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << barb1.z << endl; - m_ssBlock << " 11" << endl; - m_ssBlock << barb2.x << endl; - m_ssBlock << " 21" << endl; - m_ssBlock << barb2.y << endl; - m_ssBlock << " 31" << endl; - m_ssBlock << barb2.z << endl; - m_ssBlock << " 12" << endl; - m_ssBlock << arrow1Start.x << endl; - m_ssBlock << " 22" << endl; - m_ssBlock << arrow1Start.y << endl; - m_ssBlock << " 32" << endl; - m_ssBlock << arrow1Start.z << endl; - m_ssBlock << " 13" << endl; - m_ssBlock << arrow1Start.x << endl; - m_ssBlock << " 23" << endl; - m_ssBlock << arrow1Start.y << endl; - m_ssBlock << " 33" << endl; - m_ssBlock << arrow1Start.z << endl; + putArrow(arrow1Start, barb1, barb2, + m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); barb1 = arrow2Start + perp2*arrowWidth - tanP2*arrowLen; barb2 = arrow2Start - perp2*arrowWidth - tanP2*arrowLen; - m_ssBlock << " 0" << endl; - m_ssBlock << "SOLID" << endl; //arrowhead 2 - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << barb1.x << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << barb1.y << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << barb1.z << endl; - m_ssBlock << " 11" << endl; - m_ssBlock << barb2.x << endl; - m_ssBlock << " 21" << endl; - m_ssBlock << barb2.y << endl; - m_ssBlock << " 31" << endl; - m_ssBlock << barb2.z << endl; - m_ssBlock << " 12" << endl; - m_ssBlock << arrow2Start.x << endl; - m_ssBlock << " 22" << endl; - m_ssBlock << arrow2Start.y << endl; - m_ssBlock << " 32" << endl; - m_ssBlock << arrow2Start.z << endl; - m_ssBlock << " 13" << endl; - m_ssBlock << arrow2Start.x << endl; - m_ssBlock << " 23" << endl; - m_ssBlock << arrow2Start.y << endl; - m_ssBlock << " 33" << endl; - m_ssBlock << arrow2Start.z << endl; - - m_ssBlock << " 0" << endl; - m_ssBlock << "ENDBLK" << endl; + putArrow(arrow2Start, barb1, barb2, + m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); } //*************************** //writeRadialDimBlock //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeRadialDimBlock(const double* centerPoint, const double* textMidPoint, +void CDxfWrite::writeRadialDimBlock(const double* centerPoint, const double* textMidPoint, const double* arcPoint, const char* dimText) { - m_ssBlock << " 0" << endl; - m_ssBlock << "LINE" << endl; - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 6" << endl; - m_ssBlock << "CONTINUOUS" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << centerPoint[0] << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << centerPoint[1] << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << centerPoint[2] << endl; - m_ssBlock << " 11" << endl; - m_ssBlock << arcPoint[0] << endl; - m_ssBlock << " 21" << endl; - m_ssBlock << arcPoint[1] << endl; - m_ssBlock << " 31" << endl; - m_ssBlock << arcPoint[2] << endl; + putLine(toVector3d(centerPoint), toVector3d(arcPoint), + m_ssBlock, getBlockHandle(), + m_saveBlkRecordHandle); - m_ssBlock << " 0" << endl; - m_ssBlock << "TEXT" << endl; //dim text - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 6" << endl; - m_ssBlock << "CONTINUOUS" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << textMidPoint[0] << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << textMidPoint[1] << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << textMidPoint[2] << endl; - m_ssBlock << " 40" << endl; - m_ssBlock << "3.5" << endl; - m_ssBlock << " 1" << endl; - m_ssBlock << dimText << endl; -// m_ssBlock << " 50" << endl; -// m_ssBlock << 0 << endl; -// m_ssBlock << " 72" << endl; -// m_ssBlock << "1" << endl; + putText(dimText,toVector3d(textMidPoint), toVector3d(textMidPoint),3.5,1, + m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); Base::Vector3d c(centerPoint[0],centerPoint[1],centerPoint[2]); Base::Vector3d a(arcPoint[0],arcPoint[1],arcPoint[2]); @@ -1070,89 +1565,24 @@ void CDxfWrite::writeRadialDimBlock(const double* centerPoint, const double* tex Base::Vector3d arrowStart = a; Base::Vector3d barb1 = arrowStart + perp*arrowWidth - para*arrowLen; Base::Vector3d barb2 = arrowStart - perp*arrowWidth - para*arrowLen; - m_ssBlock << " 0" << endl; - m_ssBlock << "SOLID" << endl; //arrowhead 1 - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << barb1.x << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << barb1.y << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << barb1.z << endl; - m_ssBlock << " 11" << endl; - m_ssBlock << barb2.x << endl; - m_ssBlock << " 21" << endl; - m_ssBlock << barb2.y << endl; - m_ssBlock << " 31" << endl; - m_ssBlock << barb2.z << endl; - m_ssBlock << " 12" << endl; - m_ssBlock << a.x << endl; - m_ssBlock << " 22" << endl; - m_ssBlock << a.y << endl; - m_ssBlock << " 32" << endl; - m_ssBlock << a.z << endl; - m_ssBlock << " 13" << endl; - m_ssBlock << a.x << endl; - m_ssBlock << " 23" << endl; - m_ssBlock << a.y << endl; - m_ssBlock << " 33" << endl; - m_ssBlock << a.z << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << "ENDBLK" << endl; + putArrow(arrowStart, barb1, barb2, + m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); } //*************************** //writeDiametricDimBlock //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeDiametricDimBlock(const double* textMidPoint, +void CDxfWrite::writeDiametricDimBlock(const double* textMidPoint, const double* arcPoint1, const double* arcPoint2, const char* dimText) { - m_ssBlock << " 0" << endl; - m_ssBlock << "LINE" << endl; - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << arcPoint1[0] << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << arcPoint1[1] << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << arcPoint1[2] << endl; - m_ssBlock << " 11" << endl; - m_ssBlock << arcPoint2[0] << endl; - m_ssBlock << " 21" << endl; - m_ssBlock << arcPoint2[1] << endl; - m_ssBlock << " 31" << endl; - m_ssBlock << arcPoint2[2] << endl; + putLine(toVector3d(arcPoint1), toVector3d(arcPoint2), + m_ssBlock, getBlockHandle(), + m_saveBlkRecordHandle); - m_ssBlock << " 0" << endl; - m_ssBlock << "TEXT" << endl; //dim text - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 6" << endl; - m_ssBlock << "CONTINUOUS" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << textMidPoint[0] << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << textMidPoint[1] << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << textMidPoint[2] << endl; - m_ssBlock << " 40" << endl; - m_ssBlock << "3.5" << endl; - m_ssBlock << " 1" << endl; - m_ssBlock << dimText << endl; -// m_ssBlock << " 50" << endl; -// m_ssBlock << "0" << endl; -// m_ssBlock << " 72" << endl; -// m_ssBlock << "1" << endl; + putText(dimText,toVector3d(textMidPoint), toVector3d(textMidPoint),3.5,1, + m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); Base::Vector3d a1(arcPoint1[0],arcPoint1[1],arcPoint1[2]); Base::Vector3d a2(arcPoint2[0],arcPoint2[1],arcPoint2[2]); @@ -1164,373 +1594,16 @@ void CDxfWrite::writeDiametricDimBlock(const double* textMidPoint, Base::Vector3d arrowStart = a1; Base::Vector3d barb1 = arrowStart + perp*arrowWidth + para*arrowLen; Base::Vector3d barb2 = arrowStart - perp*arrowWidth + para*arrowLen; - m_ssBlock << " 0" << endl; - m_ssBlock << "SOLID" << endl; //arrowhead 1 - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << barb1.x << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << barb1.y << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << barb1.z << endl; - m_ssBlock << " 11" << endl; - m_ssBlock << barb2.x << endl; - m_ssBlock << " 21" << endl; - m_ssBlock << barb2.y << endl; - m_ssBlock << " 31" << endl; - m_ssBlock << barb2.z << endl; - m_ssBlock << " 12" << endl; - m_ssBlock << a1.x << endl; - m_ssBlock << " 22" << endl; - m_ssBlock << a1.y << endl; - m_ssBlock << " 32" << endl; - m_ssBlock << a1.z << endl; - m_ssBlock << " 13" << endl; - m_ssBlock << a1.x << endl; - m_ssBlock << " 23" << endl; - m_ssBlock << a1.y << endl; - m_ssBlock << " 33" << endl; - m_ssBlock << a1.z << endl; + + putArrow(arrowStart, barb1, barb2, + m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); arrowStart = a2; barb1 = arrowStart + perp*arrowWidth - para*arrowLen; barb2 = arrowStart - perp*arrowWidth - para*arrowLen; - m_ssBlock << " 0" << endl; - m_ssBlock << "SOLID" << endl; //arrowhead 2 - m_ssBlock << " 8" << endl; - m_ssBlock << "0" << endl; - m_ssBlock << " 62" << endl; - m_ssBlock << " 0" << endl; - m_ssBlock << " 10" << endl; - m_ssBlock << barb1.x << endl; - m_ssBlock << " 20" << endl; - m_ssBlock << barb1.y << endl; - m_ssBlock << " 30" << endl; - m_ssBlock << barb1.z << endl; - m_ssBlock << " 11" << endl; - m_ssBlock << barb2.x << endl; - m_ssBlock << " 21" << endl; - m_ssBlock << barb2.y << endl; - m_ssBlock << " 31" << endl; - m_ssBlock << barb2.z << endl; - m_ssBlock << " 12" << endl; - m_ssBlock << a2.x << endl; - m_ssBlock << " 22" << endl; - m_ssBlock << a2.y << endl; - m_ssBlock << " 32" << endl; - m_ssBlock << a2.z << endl; - m_ssBlock << " 13" << endl; - m_ssBlock << a2.x << endl; - m_ssBlock << " 23" << endl; - m_ssBlock << a2.y << endl; - m_ssBlock << " 33" << endl; - m_ssBlock << a2.z << endl; + putArrow(arrowStart, barb1, barb2, + m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); - m_ssBlock << " 0" << endl; - m_ssBlock << "ENDBLK" << endl; -} - -//TODO: how much of this header do we really need??? -//*************************** -//WriteHeaderSection -//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeHeaderSection(void) -{ - std::stringstream ss; - ss << "FreeCAD v" << FCVersionMajor << "." << FCVersionMinor << " " << FCRevision; - - //header & version - (*m_ofs) << "999" << endl; - (*m_ofs) << ss.str() << endl; - - (*m_ofs) << " 0" << endl; - (*m_ofs) << "SECTION" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "HEADER" << endl; - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$ACADVER" << endl; - (*m_ofs) << " 1" << endl; - (*m_ofs) << "AC1009" << endl; - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$INSBASE" << endl; - (*m_ofs) << " 10" << endl; - (*m_ofs) << 0.0 << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << 0.0 << endl; - (*m_ofs) << " 30" << endl; - (*m_ofs) << 0.0 << endl; - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$EXTMIN" << endl; - (*m_ofs) << " 10" << endl; - (*m_ofs) << 0.0 << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << 0.0 << endl; - (*m_ofs) << " 30" << endl; - (*m_ofs) << 0.0 << endl; - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$EXTMAX" << endl; - (*m_ofs) << " 10" << endl; - (*m_ofs) << 0.0 << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << 0.0 << endl; - (*m_ofs) << " 30" << endl; - (*m_ofs) << 0.0 << endl; - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$DIMSTYLE" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "STANDARD" << endl; - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$MEASUREMENT" << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << "1" << endl; - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$LIMMAX" << endl; - (*m_ofs) << " 10" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << "0" << endl; - - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$TEXTSIZE" << endl; - (*m_ofs) << " 40" << endl; - (*m_ofs) << "3.5" << endl; - - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$TEXTSTYLE" << endl; - (*m_ofs) << " 7" << endl; - (*m_ofs) << "STANDARD" << endl; - - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$DIMTXT" << endl; - (*m_ofs) << " 40" << endl; - (*m_ofs) << "3.5" << endl; - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$DIMTAD" << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << "1" << endl; - - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$DIMASZ" << endl; - (*m_ofs) << " 40" << endl; - (*m_ofs) << "3.5" << endl; - - (*m_ofs) << " 9" << endl; - (*m_ofs) << "$HANDLING" << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << "0" << endl; - - (*m_ofs) << " 0" << endl; - (*m_ofs) << "ENDSEC" << endl; - -// (*m_ofs) << " 0" << endl; //Classes are not R12 -// (*m_ofs) << "SECTION" << endl; -// (*m_ofs) << " 2" << endl; -// (*m_ofs) << "CLASSES" << endl; -// (*m_ofs) << " 0" << endl; -// (*m_ofs) << "ENDSEC" << endl; -} - -//*************************** -//WriteTablesSection -//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeTablesSection(void) -{ - (*m_ofs) << " 0" << endl; - (*m_ofs) << "SECTION" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "TABLES" << endl; - (*m_ofs) << " 0" << endl; - (*m_ofs) << "TABLE" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "VPORT" << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << " 0" << endl; - -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbSymbolTableRecord" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbViewportTableRecord" << endl; - - (*m_ofs) << " 0" << endl; - (*m_ofs) << "ENDTAB" << endl; - - (*m_ofs) << " 0" << endl; - (*m_ofs) << "TABLE" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "LTYPE" << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << " 1" << endl; - (*m_ofs) << " 0" << endl; - (*m_ofs) << "LTYPE" << endl; - -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbSymbolTableRecord" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDb??????TableRecord" << endl; - - (*m_ofs) << " 2" << endl; - (*m_ofs) << "CONTINUOUS" << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << " 0" << endl; - (*m_ofs) << " 3" << endl; - (*m_ofs) << "Solid line" << endl; - (*m_ofs) << " 72" << endl; - (*m_ofs) << " 65" << endl; - (*m_ofs) << " 73" << endl; - (*m_ofs) << " 0" << endl; - (*m_ofs) << " 40" << endl; - (*m_ofs) << "0.0" << endl; - (*m_ofs) << " 0" << endl; - (*m_ofs) << "ENDTAB" << endl; - - (*m_ofs) << " 0" << endl; - (*m_ofs) << "TABLE" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "STYLE" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbSymbolTable" << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << " 3" << endl; - (*m_ofs) << " 0" << endl; - (*m_ofs) << "STYLE" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbSymbolTableRecord" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbTextStyleTableRecord" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "STANDARD" << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << " 0" << endl; - (*m_ofs) << " 40" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << " 41" << endl; - (*m_ofs) << "1" << endl; - (*m_ofs) << " 50" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << " 71" << endl; - (*m_ofs) << " 0" << endl; - (*m_ofs) << " 42" << endl; - (*m_ofs) << "1" << endl; - (*m_ofs) << " 3" << endl; - (*m_ofs) << "TXT" << endl; - (*m_ofs) << " 0" << endl; - (*m_ofs) << "ENDTAB" << endl; - - (*m_ofs) << " 0" << endl; - (*m_ofs) << "TABLE" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "DIMSTYLE" << endl; - -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbSymbolTable" << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << " 1" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbDimStyleTable" << endl; -// (*m_ofs) << " 71" << endl; -// (*m_ofs) << " 1" << endl; - - (*m_ofs) << " 0" << endl; - (*m_ofs) << "DIMSTYLE" << endl; - -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbSymbolTableRecord" << endl; -// (*m_ofs) << "100" << endl; -// (*m_ofs) << "AcDbDimStyleTableRecord" << endl; - - (*m_ofs) << " 2" << endl; - (*m_ofs) << "STANDARD" << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << " 0" << endl; - (*m_ofs) << " 3" << endl; - (*m_ofs) << "" << endl; - (*m_ofs) << " 4" << endl; - (*m_ofs) << "" << endl; - (*m_ofs) << " 5" << endl; - (*m_ofs) << "" << endl; - (*m_ofs) << " 6" << endl; - (*m_ofs) << "" << endl; - (*m_ofs) << " 7" << endl; - (*m_ofs) << "" << endl; - (*m_ofs) << " 40" << endl; - (*m_ofs) << "1" << endl; - -//wf: don't know what these do, but seem to be necessary for import to ACAD - (*m_ofs) << " 41" << endl; - (*m_ofs) << "2.5" << endl; - (*m_ofs) << " 42" << endl; - (*m_ofs) << "0.625" << endl; - (*m_ofs) << " 43" << endl; - (*m_ofs) << "0.38" << endl; - (*m_ofs) << " 44" << endl; - (*m_ofs) << "1.25" << endl; - (*m_ofs) << " 45" << endl; - (*m_ofs) << "0.0" << endl; - (*m_ofs) << " 46" << endl; - (*m_ofs) << "0.0" << endl; - (*m_ofs) << " 47" << endl; - (*m_ofs) << "0.0" << endl; - (*m_ofs) << " 48" << endl; - (*m_ofs) << "0.0" << endl; - (*m_ofs) << "140" << endl; - (*m_ofs) << "2.5" << endl; - (*m_ofs) << "141" << endl; - (*m_ofs) << "0.09" << endl; - (*m_ofs) << "142" << endl; - (*m_ofs) << "0.0" << endl; - (*m_ofs) << "143" << endl; - (*m_ofs) << "25.4" << endl; - (*m_ofs) << "144" << endl; - (*m_ofs) << "1.0" << endl; - (*m_ofs) << "145" << endl; - (*m_ofs) << "0.0" << endl; - (*m_ofs) << "146" << endl; - (*m_ofs) << "1.0" << endl; - (*m_ofs) << "147" << endl; - (*m_ofs) << "0.625" << endl; - (*m_ofs) << " 71" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << " 72" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << " 73" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << " 74" << endl; - (*m_ofs) << "1" << endl; - (*m_ofs) << " 75" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << " 76" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << " 77" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << " 78" << endl; - (*m_ofs) << "1" << endl; - (*m_ofs) << "170" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << "171" << endl; - (*m_ofs) << "2" << endl; - (*m_ofs) << "172" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << "173" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << "174" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << "175" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << "176" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << "177" << endl; - (*m_ofs) << "0" << endl; - (*m_ofs) << "178" << endl; - (*m_ofs) << "0" << endl; - - (*m_ofs) << " 0" << endl; - (*m_ofs) << "ENDTAB" << endl; - - (*m_ofs) << " 0" << endl; - (*m_ofs) << "ENDSEC" << endl; } //*************************** @@ -1538,29 +1611,53 @@ void CDxfWrite::writeTablesSection(void) //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project void CDxfWrite::writeBlocksSection(void) { - (*m_ofs) << " 0" << endl; - (*m_ofs) << "SECTION" << endl; + if (m_version < 14) { + std::stringstream ss; + ss << "blocks1" << m_version << ".rub"; + std::string fileSpec = m_dataDir + ss.str(); + std::ostringstream oss = getPlateFile(fileSpec); + (*m_ofs) << oss.str(); + } + + //write blocks content + (*m_ofs) << (*m_ssBlock).str(); - (*m_ofs) << " 2" << endl; - (*m_ofs) << "BLOCKS" << endl; (*m_ofs) << " 0" << endl; - (*m_ofs) << "BLOCK" << endl; - (*m_ofs) << " 2" << endl; - (*m_ofs) << "$MODEL_SPACE" << endl; - (*m_ofs) << " 70" << endl; - (*m_ofs) << " 0" << endl; - (*m_ofs) << " 10" << endl; - (*m_ofs) << 0.0 << endl; - (*m_ofs) << " 20" << endl; - (*m_ofs) << 0.0 << endl; - (*m_ofs) << " 30" << endl; - (*m_ofs) << 0.0 << endl; - (*m_ofs) << " 3" << endl; - (*m_ofs) << "$MODEL_SPACE" << endl; - (*m_ofs) << " 1" << endl; - (*m_ofs) << "" << endl; + (*m_ofs) << "ENDSEC" << endl; +} + +//*************************** +//writeEntitiesSection +//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project +void CDxfWrite::writeEntitiesSection(void) +{ + std::stringstream ss; + ss << "entities" << m_version << ".rub"; + std::string fileSpec = m_dataDir + ss.str(); + std::ostringstream oss = getPlateFile(fileSpec); + (*m_ofs) << oss.str(); + + //write entities content + (*m_ofs) << (*m_ssEntity).str(); + + (*m_ofs) << " 0" << endl; - (*m_ofs) << "ENDBLK" << endl; + (*m_ofs) << "ENDSEC" << endl; +} + +//*************************** +//writeObjectsSection +//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project +void CDxfWrite::writeObjectsSection(void) +{ + if (m_version < 14) { + return; + } + std::stringstream ss; + ss << "objects" << m_version << ".rub"; + std::string fileSpec = m_dataDir + ss.str(); + std::ostringstream oss = getPlateFile(fileSpec); + (*m_ofs) << oss.str(); } CDxfRead::CDxfRead(const char* filepath) @@ -1811,7 +1908,7 @@ bool CDxfRead::ReadArc() double c[3]; // centre double z_extrusion_dir = 1.0; bool hidden = false; - + while(!((*m_ifs).eof())) { get_line(); @@ -1888,9 +1985,9 @@ bool CDxfRead::ReadArc() get_line(); break; case 230: - //Z extrusion direction for arc + //Z extrusion direction for arc get_line(); - ss.str(m_str); ss >> z_extrusion_dir; if(ss.fail()) return false; + ss.str(m_str); ss >> z_extrusion_dir; if(ss.fail()) return false; break; default: @@ -2471,7 +2568,7 @@ bool CDxfRead::ReadLwPolyLine() ss.str(m_str); ss >> y; y = mm(y); if(ss.fail()) return false; y_found = true; break; - case 38: + case 38: // elevation get_line(); ss.str(m_str); ss >> z; z = mm(z); if(ss.fail()) return false; @@ -2670,11 +2767,11 @@ void CDxfRead::OnReadArc(double start_angle, double end_angle, double radius, co temp[0] =c[0]; temp[1] =c[1]; temp[2] =c[2]; - s[0] = c[0] + radius * cos(start_angle * Pi/180); - s[1] = c[1] + radius * sin(start_angle * Pi/180); + s[0] = c[0] + radius * cos(start_angle * M_PI/180); + s[1] = c[1] + radius * sin(start_angle * M_PI/180); s[2] = c[2]; - e[0] = c[0] + radius * cos(end_angle * Pi/180); - e[1] = c[1] + radius * sin(end_angle * Pi/180); + e[0] = c[0] + radius * cos(end_angle * M_PI/180); + e[1] = c[1] + radius * sin(end_angle * M_PI/180); e[2] = c[2]; } else @@ -2682,12 +2779,12 @@ void CDxfRead::OnReadArc(double start_angle, double end_angle, double radius, co temp[0] =-c[0]; temp[1] =c[1]; temp[2] =c[2]; - - e[0] = -(c[0] + radius * cos(start_angle * Pi/180)); - e[1] = (c[1] + radius * sin(start_angle * Pi/180)); + + e[0] = -(c[0] + radius * cos(start_angle * M_PI/180)); + e[1] = (c[1] + radius * sin(start_angle * M_PI/180)); e[2] = c[2]; - s[0] = -(c[0] + radius * cos(end_angle * Pi/180)); - s[1] = (c[1] + radius * sin(end_angle * Pi/180)); + s[0] = -(c[0] + radius * cos(end_angle * M_PI/180)); + s[1] = (c[1] + radius * sin(end_angle * M_PI/180)); s[2] = c[2]; } @@ -2697,8 +2794,8 @@ void CDxfRead::OnReadArc(double start_angle, double end_angle, double radius, co void CDxfRead::OnReadCircle(const double* c, double radius, bool hidden){ double s[3]; double start_angle = 0; - s[0] = c[0] + radius * cos(start_angle * Pi/180); - s[1] = c[1] + radius * sin(start_angle * Pi/180); + s[0] = c[0] + radius * cos(start_angle * M_PI/180); + s[1] = c[1] + radius * sin(start_angle * M_PI/180); s[2] = c[2]; OnReadCircle(s, c, false, hidden); //false to change direction because otherwise the arc length is zero @@ -2740,12 +2837,12 @@ bool CDxfRead::ReadInsert() std::istringstream ss; ss.imbue(std::locale("C")); switch(n){ - case 0: + case 0: // next item found DerefACI(); - OnReadInsert(c, s, name, rot * Pi/180); + OnReadInsert(c, s, name, rot * M_PI/180); return(true); - case 8: + case 8: // Layer name follows get_line(); strcpy(m_layer_name, m_str); @@ -2832,12 +2929,12 @@ bool CDxfRead::ReadDimension() std::istringstream ss; ss.imbue(std::locale("C")); switch(n){ - case 0: + case 0: // next item found DerefACI(); - OnReadDimension(s, e, p, rot * Pi/180); + OnReadDimension(s, e, p, rot * M_PI/180); return(true); - case 8: + case 8: // Layer name follows get_line(); strcpy(m_layer_name, m_str); @@ -3082,7 +3179,7 @@ void CDxfRead::DoRead(const bool ignore_errors /* = false */ ) } continue; } // End if - then - + else if(!strcmp(m_str, "0")) { get_line(); @@ -3107,9 +3204,9 @@ void CDxfRead::DoRead(const bool ignore_errors /* = false */ ) printf("CDxfRead::DoRead() Failed to read layer\n"); //return; Some objects or tables can have "LAYER" as name... } - continue; + continue; } - + else if (!strcmp( m_str, "BLOCK" )) { if(!ReadBlockInfo()) { diff --git a/src/Mod/Import/App/dxf.h b/src/Mod/Import/App/dxf.h index 4b3fb6817b..049e7e31d8 100644 --- a/src/Mod/Import/App/dxf.h +++ b/src/Mod/Import/App/dxf.h @@ -3,6 +3,9 @@ // This program is released under the BSD license. See the file COPYING for details. // modified 2018 wandererfan +#ifndef _dxf_h_ +#define _dxf_h_ + #pragma once #include @@ -17,6 +20,8 @@ #include #include +#include + //Following is required to be defined on Ubuntu with OCC 6.3.1 #ifndef HAVE_IOSTREAM #define HAVE_IOSTREAM @@ -120,61 +125,115 @@ class CDxfWrite{ private: std::ofstream* m_ofs; bool m_fail; - std::stringstream m_ssBlock; + std::ostringstream* m_ssBlock; + std::ostringstream* m_ssBlkRecord; + std::ostringstream* m_ssEntity; + std::ostringstream* m_ssLayer; + +protected: + void putLine(const Base::Vector3d s, const Base::Vector3d e, + std::ostringstream* outStream, const std::string handle, + const std::string ownerHandle); + void putText(const char* text, const Base::Vector3d location1, const Base::Vector3d location2, + const double height, const int horizJust, + std::ostringstream* outStream, const std::string handle, + const std::string ownerHandle); + void putArrow(Base::Vector3d arrowPos, Base::Vector3d barb1Pos, Base::Vector3d barb2Pos, + std::ostringstream* outStream, const std::string handle, + const std::string ownerHandle); + + //! copy boiler plate file + std::ostringstream getPlateFile(std::string fileSpec); + void setDataDir(std::string s) { m_dataDir = s; } + std::string getEntityHandle(void); + std::string getLayerHandle(void); + std::string getBlockHandle(void); + std::string getBlkRecordHandle(void); + + std::string m_optionSource; + int m_version; + int m_entityHandle; + int m_layerHandle; + int m_blockHandle; + int m_blkRecordHandle; + + std::string m_saveModelSpaceHandle; + std::string m_savePaperSpaceHandle; + std::string m_saveBlockRecordTableHandle; + std::string m_saveBlkRecordHandle; + std::string m_currentBlock; + std::string m_dataDir; + std::string m_layerName; + std::vector m_layerList; + std::vector m_blockList; + std::vector m_blkRecordList; public: CDxfWrite(const char* filepath); ~CDxfWrite(); + + void init(void); + void endRun(void); bool Failed(){return m_fail;} +// void setOptions(void); +// bool isVersionValid(int vers); + std::string getLayerName() { return m_layerName; } + void setLayerName(std::string s); + void addBlockName(std::string s, std::string blkRecordHandle); - void WriteLine(const double* s, const double* e, const char* layer_name ); - void WritePoint(const double*, const char*); - void WriteArc(const double* s, const double* e, const double* c, bool dir, const char* layer_name ); - void WriteEllipse(const double* c, double major_radius, double minor_radius, - double rotation, double start_angle, double end_angle, bool endIsCW, - const char* layer_name); - void WriteCircle(const double* c, double radius, const char* layer_name ); - void WriteSpline(SplineDataOut sd, const char* layer_name); - void WriteLWPolyLine(LWPolyDataOut pd, const char* layer_name); - void WritePolyline(LWPolyDataOut pd, const char* layer_name); - void WriteVertex(double x, double y, double z, const char* layer_name); - void WriteText(const char* text, const double* location1, const double* location2, - const double height, const int horizJust, const char* layer_name); - void WriteLinearDim(const double* textMidPoint, const double* lineDefPoint, + void writeLine(const double* s, const double* e); + void writePoint(const double*); + void writeArc(const double* s, const double* e, const double* c, bool dir); + void writeEllipse(const double* c, double major_radius, double minor_radius, + double rotation, double start_angle, double end_angle, bool endIsCW); + void writeCircle(const double* c, double radius ); + void writeSpline(SplineDataOut sd); + void writeLWPolyLine(LWPolyDataOut pd); + void writePolyline(LWPolyDataOut pd); + void writeVertex(double x, double y, double z); + void writeText(const char* text, const double* location1, const double* location2, + const double height, const int horizJust); + void writeLinearDim(const double* textMidPoint, const double* lineDefPoint, const double* extLine1, const double* extLine2, - const char* dimText, - const char* layer_name); + const char* dimText); void writeLinearDimBlock(const double* textMidPoint, const double* lineDefPoint, const double* extLine1, const double* extLine2, const char* dimText); - void WriteAngularDim(const double* textMidPoint, const double* lineDefPoint, + void writeAngularDim(const double* textMidPoint, const double* lineDefPoint, const double* startExt1, const double* endExt1, const double* startExt2, const double* endExt2, - const char* dimText, - const char* layer_name); + const char* dimText); void writeAngularDimBlock(const double* textMidPoint, const double* lineDefPoint, const double* startExt1, const double* endExt1, const double* startExt2, const double* endExt2, const char* dimText); - void WriteRadialDim(const double* centerPoint, const double* textMidPoint, + void writeRadialDim(const double* centerPoint, const double* textMidPoint, const double* arcPoint, - const char* dimText, - const char* layer_name); + const char* dimText); void writeRadialDimBlock(const double* centerPoint, const double* textMidPoint, const double* arcPoint, const char* dimText); - void WriteDiametricDim(const double* textMidPoint, + void writeDiametricDim(const double* textMidPoint, const double* arcPoint1, const double* arcPoint2, - const char* dimText, - const char* layer_name); + const char* dimText); void writeDiametricDimBlock(const double* textMidPoint, const double* arcPoint1, const double* arcPoint2, const char* dimText); - void writeDimBlockPreamble(const char* layer_name); + void writeDimBlockPreamble(); + void writeBlockTrailer(void); + void writeHeaderSection(void); void writeTablesSection(void); void writeBlocksSection(void); + void writeEntitiesSection(void); + void writeObjectsSection(void); + void writeClassesSection(void); + + void makeLayerTable(void); + void makeBlockRecordTableHead(void); + void makeBlockRecordTableBody(void); + void makeBlockSectionHead(void); }; // derive a class from this and implement it's virtual functions @@ -247,3 +306,4 @@ public: std::string LayerName() const; }; +#endif diff --git a/src/Mod/Import/CMakeLists.txt b/src/Mod/Import/CMakeLists.txt index 383057edea..e48bb99e64 100644 --- a/src/Mod/Import/CMakeLists.txt +++ b/src/Mod/Import/CMakeLists.txt @@ -29,4 +29,14 @@ INSTALL( #${Import_QRC_SRCS} DESTINATION Mod/Import -) +) + +INSTALL( + DIRECTORY + App/DxfPlate + DESTINATION + ${CMAKE_INSTALL_DATADIR}/Mod/Import + FILES_MATCHING + PATTERN "*.rub*" +) + diff --git a/src/Mod/Import/DxfPlate/blocks10.rub b/src/Mod/Import/DxfPlate/blocks10.rub new file mode 100644 index 0000000000..31d5f12ed3 --- /dev/null +++ b/src/Mod/Import/DxfPlate/blocks10.rub @@ -0,0 +1,24 @@ + 0 +SECTION + 2 +BLOCKS + 0 +BLOCK + 5 +60 + 2 +*MODEL_SPACE + 70 + 0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*MODEL_SPACE + 1 + + 0 +ENDBLK diff --git a/src/Mod/Import/DxfPlate/blocks112.rub b/src/Mod/Import/DxfPlate/blocks112.rub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Mod/Import/DxfPlate/blocks114.rub b/src/Mod/Import/DxfPlate/blocks114.rub new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Mod/Import/DxfPlate/classes14.rub b/src/Mod/Import/DxfPlate/classes14.rub new file mode 100644 index 0000000000..d4ce483413 --- /dev/null +++ b/src/Mod/Import/DxfPlate/classes14.rub @@ -0,0 +1,48 @@ + 0 +SECTION + 2 +CLASSES + 0 +CLASS + 1 +ACDBDICTIONARYWDFLT + 2 +AcDbDictionaryWithDefault + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +XRECORD + 2 +AcDbXrecord + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +LWPOLYLINE + 2 +AcDbPolyline + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 1 + 0 +ENDSEC diff --git a/src/Mod/Import/DxfPlate/entities0.rub b/src/Mod/Import/DxfPlate/entities0.rub new file mode 100644 index 0000000000..bde0378aa3 --- /dev/null +++ b/src/Mod/Import/DxfPlate/entities0.rub @@ -0,0 +1,4 @@ + 0 +SECTION + 2 +ENTITIES diff --git a/src/Mod/Import/DxfPlate/entities12.rub b/src/Mod/Import/DxfPlate/entities12.rub new file mode 100644 index 0000000000..bde0378aa3 --- /dev/null +++ b/src/Mod/Import/DxfPlate/entities12.rub @@ -0,0 +1,4 @@ + 0 +SECTION + 2 +ENTITIES diff --git a/src/Mod/Import/DxfPlate/entities14.rub b/src/Mod/Import/DxfPlate/entities14.rub new file mode 100644 index 0000000000..bde0378aa3 --- /dev/null +++ b/src/Mod/Import/DxfPlate/entities14.rub @@ -0,0 +1,4 @@ + 0 +SECTION + 2 +ENTITIES diff --git a/src/Mod/Import/DxfPlate/header0.rub b/src/Mod/Import/DxfPlate/header0.rub new file mode 100644 index 0000000000..1f70a66346 --- /dev/null +++ b/src/Mod/Import/DxfPlate/header0.rub @@ -0,0 +1,30 @@ + 0 +SECTION + 2 +HEADER + 9 +$DIMSTYLE + 2 +STANDARD + 9 +$MEASUREMENT + 70 +1 + 9 +$TEXTSIZE + 40 +3.5 + 9 +$TEXTSTYLE + 7 +STANDARD + 9 +$DIMTXT + 40 +3.5 + 9 +$HANDLING + 70 +0 + 0 +ENDSEC diff --git a/src/Mod/Import/DxfPlate/header12.rub b/src/Mod/Import/DxfPlate/header12.rub new file mode 100644 index 0000000000..0e325a91d3 --- /dev/null +++ b/src/Mod/Import/DxfPlate/header12.rub @@ -0,0 +1,34 @@ + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1009 + 9 +$DWGCODEPAGE + 3 +ANSI_1252 + 9 +$TEXTSTYLE + 7 +STANDARD + 9 +$DIMSTYLE + 2 +STANDARD + 9 +$DIMTXSTY + 7 +STANDARD + 9 +$CMLSTYLE + 2 +STANDARD + 9 +$HANDLING + 70 +0 + 0 +ENDSEC diff --git a/src/Mod/Import/DxfPlate/header14.rub b/src/Mod/Import/DxfPlate/header14.rub new file mode 100644 index 0000000000..5253db1285 --- /dev/null +++ b/src/Mod/Import/DxfPlate/header14.rub @@ -0,0 +1,38 @@ + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1014 + 9 +$ACADMAINTVER + 70 + 9 + 9 +$DWGCODEPAGE + 3 +ANSI_1252 + 9 +$TEXTSTYLE + 7 +STANDARD + 9 +$DIMSTYLE + 2 +STANDARD + 9 +$DIMTXSTY + 7 +STANDARD + 9 +$CMLSTYLE + 2 +STANDARD + 9 +$HANDSEED + 5 +FFF + 0 +ENDSEC diff --git a/src/Mod/Import/DxfPlate/objects14.rub b/src/Mod/Import/DxfPlate/objects14.rub new file mode 100644 index 0000000000..8313b799b7 --- /dev/null +++ b/src/Mod/Import/DxfPlate/objects14.rub @@ -0,0 +1,26 @@ + 0 +SECTION + 2 +OBJECTS + 0 +DICTIONARY + 5 +500 +330 +0 +100 +AcDbDictionary + 3 +ACAD_GROUP +350 +501 + 0 +DICTIONARY + 5 +501 +330 +500 +100 +AcDbDictionary + 0 +ENDSEC diff --git a/src/Mod/Import/DxfPlate/tables10.rub b/src/Mod/Import/DxfPlate/tables10.rub new file mode 100644 index 0000000000..ee1f1ee811 --- /dev/null +++ b/src/Mod/Import/DxfPlate/tables10.rub @@ -0,0 +1,172 @@ + 0 +SECTION + 2 +TABLES + 0 +TABLE + 0 +VPORT + 2 +VPORT + 5 +20 + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 0 +LTYPE + 5 +22 + 2 +CONTINUOUS + 3 +Solid line + 70 + 0 + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +ENDTAB + 0 +TABLE + 0 +STYLE + 5 +26 + 2 +STANDARD + 3 +TXT + 70 + 3 + 5 +27 + 70 + 0 + 40 +0 + 41 +1 + 50 +0 + 71 + 0 + 42 +1 + 0 +ENDTAB + 0 +TABLE + 2 +DIMSTYLE + 5 +55 + 70 + 1 + 0 +DIMSTYLE +105 +56 + 2 +STANDARD + 70 + 0 + 40 + 1 + 41 +0.18 + 42 +0.0625 + 43 +0.38 + 44 +0.18 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0 + 49 +1 +140 +0.18 +141 +0.09 +142 +0.0 +143 +25.4 +144 +1.0 +145 +0.0 +146 +1.0 +147 +0.09 + 71 + 0 + 72 + 0 + 73 + 1 + 74 + 1 + 75 + 0 + 76 + 0 + 77 + 0 + 78 + 0 +170 + 0 +171 + 2 +172 + 0 +173 + 0 +174 + 0 +175 + 0 +176 + 0 +177 + 0 +178 +0 + 0 +ENDTAB + 0 +TABLE + 0 +LAYER + 2 +LAYER + 5 +28 + 70 + 1 + 5 +29 + 2 +0 + 70 + 0 + 62 + 7 + 6 +CONTINUOUS diff --git a/src/Mod/Import/DxfPlate/tables112.rub b/src/Mod/Import/DxfPlate/tables112.rub new file mode 100644 index 0000000000..4d9e1b1cf7 --- /dev/null +++ b/src/Mod/Import/DxfPlate/tables112.rub @@ -0,0 +1,72 @@ + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +VPORT + 5 +20 + 70 + 1 + 0 +ENDTAB + 0 +TABLE + 2 +LTYPE + 5 +22 + 70 + 1 + 0 +LTYPE + 5 +23 + 2 +BYLAYER + 70 + 0 + 3 +NORMAL + 72 + 65 + 73 +1 + 40 +1 + 0 +ENDTAB + 0 +TABLE + 2 +STYLE + 5 +24 + 70 + 1 + 0 +STYLE + 5 +26 + 2 +STANDARD + 3 +txt + 70 + 0 + 40 + 0 + 41 + 1 + 50 + 0 + 71 + 0 + 42 + 1 + 4 + + 0 +ENDTAB diff --git a/src/Mod/Import/DxfPlate/tables114.rub b/src/Mod/Import/DxfPlate/tables114.rub new file mode 100644 index 0000000000..0e82aa3567 --- /dev/null +++ b/src/Mod/Import/DxfPlate/tables114.rub @@ -0,0 +1,112 @@ + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +VPORT + 5 +20 +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +VPORT + 5 +21 +330 +20 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord + 2 +*ACTIVE + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +LTYPE + 5 +22 +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +LTYPE + 5 +23 +330 +21 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BYBLOCK + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +24 +330 +21 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BYLAYER + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +25 +330 +21 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CONTINUOUS + 70 + 0 + 3 +Solid line + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +ENDTAB diff --git a/src/Mod/Import/DxfPlate/tables20.rub b/src/Mod/Import/DxfPlate/tables20.rub new file mode 100644 index 0000000000..50a6d6ffb6 --- /dev/null +++ b/src/Mod/Import/DxfPlate/tables20.rub @@ -0,0 +1,4 @@ + 0 +ENDTAB + 0 +ENDSEC diff --git a/src/Mod/Import/DxfPlate/tables212.rub b/src/Mod/Import/DxfPlate/tables212.rub new file mode 100644 index 0000000000..25b5922ffe --- /dev/null +++ b/src/Mod/Import/DxfPlate/tables212.rub @@ -0,0 +1,142 @@ + 0 +TABLE + 2 +VIEW + 5 +50 + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +UCS + 5 +51 + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +APPID + 5 +52 + 70 + 3 + 0 +APPID + 5 +53 + 2 +ACAD + 70 + 0 + 0 +APPID + 5 +54 + 2 +FreeCAD + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +DIMSTYLE + 5 +55 + 70 + 2 + 0 +DIMSTYLE +105 +56 + 2 +STANDARD + 70 + 0 + 3 +0 + 4 +0 + 5 +0 + 6 +0 + 7 +0 + 40 + 1 + 41 +0.18 + 42 +0.0625 + 43 +0.38 + 44 +0.18 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0 +140 +0.18 +141 +0.09 +142 +0.0 +143 +25.4 +144 +1.0 +145 +0.0 +146 +1.0 +147 +0.09 + 71 + 0 + 72 + 0 + 73 + 1 + 74 + 1 + 75 + 0 + 76 + 0 + 77 + 0 + 78 + 0 +170 + 0 +171 + 2 +172 + 0 +173 + 0 +174 + 0 +175 + 0 +176 + 0 +177 + 0 +178 + 0 + 0 +ENDTAB diff --git a/src/Mod/Import/DxfPlate/tables214.rub b/src/Mod/Import/DxfPlate/tables214.rub new file mode 100644 index 0000000000..a3b91cb934 --- /dev/null +++ b/src/Mod/Import/DxfPlate/tables214.rub @@ -0,0 +1,278 @@ + 0 +TABLE + 2 +STYLE + 5 +60 +330 +0 +100 +AcDbSymbolTable + 70 + 2 + 0 +STYLE + 5 +61 +330 +60 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +STANDARD + 70 + 0 + 40 +0.0 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +2.5 + 3 +arial.ttf + 4 + + 0 +STYLE + 5 +62 +330 +60 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +ANNOTATIVE + 70 + 0 + 40 +0.0 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +2.5 + 3 +arial.ttf + 4 + + 0 +ENDTAB + 0 +TABLE + 2 +VIEW + 5 +63 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +UCS + 5 +64 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +APPID + 5 +65 +330 +0 +100 +AcDbSymbolTable + 70 + 2 + 0 +APPID + 5 +66 +330 +65 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD + 70 + 0 + 0 +APPID + 5 +67 +330 +65 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACADANNOTATIVE + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +DIMSTYLE + 5 +68 +330 +0 +100 +AcDbSymbolTable + 70 + 2 + 0 +DIMSTYLE +105 +69 +330 +68 +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord + 2 +STANDARD + 70 + 0 + 3 + + 4 + + 5 + + 6 + + 7 + + 40 +0.0 + 41 +2.5 + 42 +0.625 + 43 +3.75 + 44 +1.25 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 +140 +2.5 +141 +2.5 +142 +0.0 +143 +0.03937007874016 +144 +1.0 +145 +0.0 +146 +1.0 +147 +0.625 + 71 + 0 + 72 + 0 + 73 + 0 + 74 + 0 + 75 + 0 + 76 + 0 + 77 + 1 + 78 + 8 +170 + 0 +171 + 3 +172 + 1 +173 + 0 +174 + 0 +175 + 0 +176 + 0 +177 + 0 +178 + 0 +270 + 2 +271 + 2 +272 + 2 +273 + 2 +274 + 3 +340 +61 +275 + 0 +280 + 0 +281 + 0 +282 + 0 +283 + 0 +284 + 8 +285 + 0 +286 + 0 +287 + 3 +288 + 0 + 0 +ENDTAB diff --git a/src/Mod/TechDraw/App/AppTechDrawPy.cpp b/src/Mod/TechDraw/App/AppTechDrawPy.cpp index 97f775d4c2..e0e11c8a42 100644 --- a/src/Mod/TechDraw/App/AppTechDrawPy.cpp +++ b/src/Mod/TechDraw/App/AppTechDrawPy.cpp @@ -544,7 +544,7 @@ private: try { ImpExpDxfWrite writer(filePath); - writer.setLayerName(layerName); + writer.init(); App::DocumentObject* obj = 0; TechDraw::DrawViewPart* dvp = 0; if (PyObject_TypeCheck(viewObj, &(TechDraw::DrawViewPartPy::Type))) { @@ -555,6 +555,7 @@ private: writer.setLayerName(layerName); write1ViewDxf(writer,dvp,align); } + writer.endRun(); } catch (const Base::Exception& e) { throw Py::RuntimeError(e.what()); @@ -577,8 +578,7 @@ private: try { ImpExpDxfWrite writer(filePath); - writer.setLayerName(layerName); - + writer.init(); App::DocumentObject* obj = 0; TechDraw::DrawPage* dp = 0; if (PyObject_TypeCheck(pageObj, &(TechDraw::DrawPagePy::Type))) { @@ -686,6 +686,7 @@ private: } } } + writer.endRun(); } catch (const Base::Exception& e) { throw Py::RuntimeError(e.what());