Skip to content

Commit

Permalink
[IMP]Support Horiz/Vert Dims in DXF export
Browse files Browse the repository at this point in the history
  • Loading branch information
WandererFan committed Jan 23, 2020
1 parent 96bdea2 commit 7b90489
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 10 deletions.
4 changes: 2 additions & 2 deletions src/Mod/Import/App/ImpExpDxf.cpp
Expand Up @@ -758,7 +758,7 @@ void ImpExpDxfWrite::exportText(const char* text, Base::Vector3d position1, Base

void ImpExpDxfWrite::exportLinearDim(Base::Vector3d textLocn, Base::Vector3d lineLocn,
Base::Vector3d extLine1Start, Base::Vector3d extLine2Start,
char* dimText)
char* dimText, int type)
{
double text[3] = {0,0,0};
text[0] = textLocn.x;
Expand All @@ -776,7 +776,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);
writeLinearDim(text, line, ext1,ext2,dimText, type);
}

void ImpExpDxfWrite::exportAngularDim(Base::Vector3d textLocn, Base::Vector3d lineLocn,
Expand Down
2 changes: 1 addition & 1 deletion src/Mod/Import/App/ImpExpDxf.h
Expand Up @@ -83,7 +83,7 @@ namespace Import
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,
char* dimText);
char* dimText, int type);
void exportAngularDim(Base::Vector3d textLocn, Base::Vector3d lineLocn,
Base::Vector3d extLine1Start, Base::Vector3d extLine2Start,
Base::Vector3d apexPoint,
Expand Down
65 changes: 60 additions & 5 deletions src/Mod/Import/App/dxf.cpp
Expand Up @@ -1059,9 +1059,12 @@ void CDxfWrite::putArrow(Base::Vector3d arrowPos, Base::Vector3d barb1Pos, Base:
//***************************
//writeLinearDim
//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project
#define ALIGNED 0
#define HORIZONTAL 1
#define VERTICAL 2
void CDxfWrite::writeLinearDim(const double* textMidPoint, const double* lineDefPoint,
const double* extLine1, const double* extLine2,
const char* dimText)
const char* dimText, int type)
{
(*m_ssEntity) << " 0" << endl;
(*m_ssEntity) << "DIMENSION" << endl;
Expand Down Expand Up @@ -1093,8 +1096,15 @@ void CDxfWrite::writeLinearDim(const double* textMidPoint, const double* lineDef
(*m_ssEntity) << textMidPoint[1] << endl;
(*m_ssEntity) << " 31" << endl;
(*m_ssEntity) << textMidPoint[2] << endl;
(*m_ssEntity) << " 70" << endl;
(*m_ssEntity) << 1 << endl; // dimType1 = Aligned
if (type == ALIGNED) {
(*m_ssEntity) << " 70" << endl;
(*m_ssEntity) << 1 << endl; // dimType1 = Aligned
}
if ( (type == HORIZONTAL) ||
(type == VERTICAL) ) {
(*m_ssEntity) << " 70" << endl;
(*m_ssEntity) << 32 << endl; // dimType0 = Aligned + 32 (bit for unique block)?
}
// (*m_ssEntity) << " 71" << endl; // not R12
// (*m_ssEntity) << 1 << endl; // attachPoint ??1 = topleft
(*m_ssEntity) << " 1" << endl;
Expand All @@ -1118,11 +1128,22 @@ void CDxfWrite::writeLinearDim(const double* textMidPoint, const double* lineDef
(*m_ssEntity) << extLine2[1] << endl;
(*m_ssEntity) << " 34" << endl;
(*m_ssEntity) << extLine2[2] << endl;
if (m_version > 12) {
if (type == VERTICAL) {
(*m_ssEntity) << " 50" << endl;
(*m_ssEntity) << "90" << endl;
}
if ( (type == HORIZONTAL) ||
(type == VERTICAL) ) {
(*m_ssEntity) << "100" << endl;
(*m_ssEntity) << "AcDbRotatedDimension" << endl;
}
}

writeDimBlockPreamble();
writeLinearDimBlock(textMidPoint,lineDefPoint,
extLine1, extLine2,
dimText);
dimText, type);
writeBlockTrailer();
}

Expand Down Expand Up @@ -1419,7 +1440,7 @@ void CDxfWrite::writeBlockTrailer(void)
//added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project
void CDxfWrite::writeLinearDimBlock(const double* textMidPoint, const double* dimLine,
const double* e1Start, const double* e2Start,
const char* dimText)
const char* dimText, int type)
{
Base::Vector3d e1S(e1Start[0],e1Start[1],e1Start[2]);
Base::Vector3d e2S(e2Start[0],e2Start[1],e2Start[2]);
Expand All @@ -1431,6 +1452,40 @@ void CDxfWrite::writeLinearDimBlock(const double* textMidPoint, const double* di
Base::Vector3d X(1.0,0.0,0.0);
double angle = para.GetAngle(X);
angle = angle * 180.0 / M_PI;
if (type == ALIGNED) {
//NOP
} else if (type == HORIZONTAL) {
double x = e1Start[0];
double y = dimLine[1];
e1E = Base::Vector3d(x, y, 0.0);
x = e2Start[0];
e2E = Base::Vector3d(x, y, 0.0);
perp = Base::Vector3d(0, -1, 0); //down
para = Base::Vector3d(1, 0, 0); //right
if (dimLine[1] > e1Start[1]) {
perp = Base::Vector3d(0, 1, 0); //up
}
if (e1Start[0] > e2Start[0]) {
para = Base::Vector3d(-1, 0, 0); //left
}
angle = 0;
} else if (type == VERTICAL) {
double x = dimLine[0];
double y = e1Start[1];
e1E = Base::Vector3d(x, y, 0.0);
y = e2Start[1];
e2E = Base::Vector3d(x, y, 0.0);
perp = Base::Vector3d(1, 0, 0);
para = Base::Vector3d(0, 1, 0);
if (dimLine[0] < e1Start[0]) {
perp = Base::Vector3d(-1, 0, 0);
}
if (e1Start[1] > e2Start[1]) {
para = Base::Vector3d(0, -1, 0);
}
angle = 90;
}

double arrowLen = 5.0; //magic number
double arrowWidth = arrowLen/6.0/2.0; //magic number calc!

Expand Down
4 changes: 2 additions & 2 deletions src/Mod/Import/App/dxf.h
Expand Up @@ -201,10 +201,10 @@ class ImportExport CDxfWrite{
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* dimText, int type);
void writeLinearDimBlock(const double* textMidPoint, const double* lineDefPoint,
const double* extLine1, const double* extLine2,
const char* dimText);
const char* dimText, int type);
void writeAngularDim(const double* textMidPoint, const double* lineDefPoint,
const double* startExt1, const double* endExt1,
const double* startExt2, const double* endExt2,
Expand Down

0 comments on commit 7b90489

Please sign in to comment.