Add support for Dxf Export R14 spec

This commit is contained in:
wandererfan
2018-06-27 12:04:51 -04:00
committed by Yorik van Havre
parent 7eead64bb2
commit 08a3e315ce
24 changed files with 2561 additions and 1348 deletions

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -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;

File diff suppressed because it is too large Load Diff

View File

@@ -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 <algorithm>
@@ -17,6 +20,8 @@
#include <string.h>
#include <math.h>
#include <Base/Vector3D.h>
//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<std::string> m_layerList;
std::vector<std::string> m_blockList;
std::vector<std::string> 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