Export Diametric Dim to Dxf

This commit is contained in:
wandererfan
2018-05-21 19:32:23 -04:00
parent 8115c8e80b
commit d4552fb11a
5 changed files with 90 additions and 13 deletions

View File

@@ -716,3 +716,22 @@ void ImpExpDxfWrite::exportRadialDim(Base::Vector3d centerPoint, Base::Vector3d
WriteRadialDim(center, text, arc, dimText, getLayerName().c_str());
}
void ImpExpDxfWrite::exportDiametricDim(Base::Vector3d textLocn,
Base::Vector3d arcPoint1, Base::Vector3d arcPoint2,
char* dimText)
{
double text[3] = {0,0,0};
text[0] = textLocn.x;
text[1] = textLocn.y;
text[2] = textLocn.z;
double arc1[3] = {0,0,0};
arc1[0] = arcPoint1.x;
arc1[1] = arcPoint1.y;
arc1[2] = arcPoint1.z;
double arc2[3] = {0,0,0};
arc2[0] = arcPoint2.x;
arc2[1] = arcPoint2.y;
arc2[2] = arcPoint2.z;
WriteDiametricDim(text, arc1, arc2, dimText, getLayerName().c_str());
}

View File

@@ -91,6 +91,10 @@ namespace Import
void exportRadialDim(Base::Vector3d centerPoint, Base::Vector3d textLocn,
Base::Vector3d arcPoint,
char* dimText);
void exportDiametricDim(Base::Vector3d textLocn,
Base::Vector3d arcPoint1, Base::Vector3d arcPoint2,
char* dimText);
static bool gp_PntEqual(gp_Pnt p1, gp_Pnt p2);
static bool gp_PntCompare(gp_Pnt p1, gp_Pnt p2);

View File

@@ -396,17 +396,6 @@ void CDxfWrite::WriteLinearDim(const double* textMidPoint, const double* lineDef
(*m_ofs) << extLine2[1] << endl;
(*m_ofs) << 34 << endl;
(*m_ofs) << extLine2[2] << endl;
////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;
// (*m_ofs) << lenLeader << endl;
////diametric dims
// (*m_ofs) << 100 << endl;
// (*m_ofs) << "AcDbRadialDimension" << endl;
@@ -546,6 +535,57 @@ void CDxfWrite::WriteRadialDim(const double* centerPoint, const double* textMidP
(*m_ofs) << 0 << endl;
}
//***************************
//WriteDiametricDim
//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project
void CDxfWrite::WriteDiametricDim(const double* textMidPoint,
const double* arcPoint1, const double* arcPoint2,
const char* dimText,
const char* layer_name)
{
(*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) << "*D1" << endl; // blockName *D1 ??
(*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;
(*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
//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;
}
CDxfRead::CDxfRead(const char* filepath)
{

View File

@@ -150,6 +150,10 @@ public:
const double* arcPoint,
const char* dimText,
const char* layer_name);
void WriteDiametricDim(const double* textMidPoint,
const double* arcPoint1, const double* arcPoint2,
const char* dimText,
const char* layer_name);
};
// derive a class from this and implement it's virtual functions

View File

@@ -631,7 +631,7 @@ private:
Base::Vector3d extLine2Start = Base::Vector3d(pts.second.x, -pts.second.y, 0.0) +
Base::Vector3d(parentX,parentY,0.0);
writer.exportLinearDim(textLocn, lineLocn, extLine1Start, extLine2Start, dimText);
}else if (dvd->Type.isValue("Angle")) {
} else if (dvd->Type.isValue("Angle")) {
Base::Vector3d textLocn(dvd->X.getValue() + parentX, dvd->Y.getValue() + parentY, 0.0);
Base::Vector3d lineLocn(dvd->X.getValue() + parentX, dvd->Y.getValue() + parentY,0.0);
anglePoints pts = dvd->getAnglePoints();
@@ -651,7 +651,7 @@ private:
end1 = end1 + parentPos;
end2 = end2 + parentPos;
writer.exportAngularDim(textLocn, lineLocn, end1, end2, apex, dimText);
}else if (dvd->Type.isValue("Radius")) {
} else if (dvd->Type.isValue("Radius")) {
Base::Vector3d textLocn(dvd->X.getValue() + parentX, dvd->Y.getValue() + parentY, 0.0);
arcPoints pts = dvd->getArcPoints();
Base::Vector3d center = pts.center;
@@ -661,6 +661,16 @@ private:
center = center + parentPos;
arcPoint = arcPoint + parentPos;
writer.exportRadialDim(center, textLocn, arcPoint, dimText);
} else if(dvd->Type.isValue("Diameter")){
Base::Vector3d textLocn(dvd->X.getValue() + parentX, dvd->Y.getValue() + parentY, 0.0);
arcPoints pts = dvd->getArcPoints();
Base::Vector3d end1 = pts.onCurve.first;
end1.y = -end1.y;
Base::Vector3d end2 = pts.onCurve.second;
end2.y = -end2.y;
end1 = end1 + parentPos;
end2 = end2 + parentPos;
writer.exportDiametricDim(textLocn, end1, end2, dimText);
}
}
}