DXF: export non-rational beziers as splines instead of pwl.
This commit is contained in:
parent
c469af6600
commit
3fdfca10f6
|
@ -62,6 +62,45 @@ public:
|
||||||
lv.Clear();
|
lv.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void makeKnotsFor(DRW_Spline *spline) {
|
||||||
|
// QCad/LibreCAD require this for some reason.
|
||||||
|
if(spline->degree == 3) {
|
||||||
|
spline->nknots = 8;
|
||||||
|
spline->knotslist.push_back(0.0);
|
||||||
|
spline->knotslist.push_back(0.0);
|
||||||
|
spline->knotslist.push_back(0.0);
|
||||||
|
spline->knotslist.push_back(0.0);
|
||||||
|
spline->knotslist.push_back(1.0);
|
||||||
|
spline->knotslist.push_back(1.0);
|
||||||
|
spline->knotslist.push_back(1.0);
|
||||||
|
spline->knotslist.push_back(1.0);
|
||||||
|
} else if(spline->degree == 2) {
|
||||||
|
spline->nknots = 6;
|
||||||
|
spline->knotslist.push_back(0.0);
|
||||||
|
spline->knotslist.push_back(0.0);
|
||||||
|
spline->knotslist.push_back(0.0);
|
||||||
|
spline->knotslist.push_back(1.0);
|
||||||
|
spline->knotslist.push_back(1.0);
|
||||||
|
spline->knotslist.push_back(1.0);
|
||||||
|
} else {
|
||||||
|
oops();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeSpline(SBezier *sb) {
|
||||||
|
bool isRational = sb->IsRational();
|
||||||
|
DRW_Spline spline;
|
||||||
|
spline.flags = (isRational) ? 0x04 : 0x08;
|
||||||
|
spline.degree = sb->deg;
|
||||||
|
spline.ncontrol = sb->deg + 1;
|
||||||
|
makeKnotsFor(&spline);
|
||||||
|
for(int i = 0; i <= sb->deg; i++) {
|
||||||
|
spline.controllist.push_back(new DRW_Coord(sb->ctrl[i].x, sb->ctrl[i].y, 0.0));
|
||||||
|
if(isRational) spline.weightlist.push_back(sb->weight[i]);
|
||||||
|
}
|
||||||
|
dxf->writeSpline(&spline);
|
||||||
|
}
|
||||||
|
|
||||||
void writeBezier(SBezier *sb) {
|
void writeBezier(SBezier *sb) {
|
||||||
Vector c;
|
Vector c;
|
||||||
Vector n = Vector::From(0.0, 0.0, 1.0);
|
Vector n = Vector::From(0.0, 0.0, 1.0);
|
||||||
|
@ -78,9 +117,15 @@ public:
|
||||||
if(dtheta < 0.0) swap(theta0, theta1);
|
if(dtheta < 0.0) swap(theta0, theta1);
|
||||||
|
|
||||||
writeArc(c, r, theta0, theta1);
|
writeArc(c, r, theta0, theta1);
|
||||||
|
} else if(sb->IsRational()) {
|
||||||
|
// Rational bezier
|
||||||
|
// We'd like to export rational beziers exactly, but the resulting DXF
|
||||||
|
// files can only be read by AutoCAD; LibreCAD/QCad simply do not
|
||||||
|
// implement the feature. So, export as piecewise linear for compatiblity.
|
||||||
|
writeBezierAsPwl(sb);
|
||||||
} else {
|
} else {
|
||||||
// Any other curve
|
// Any other curve
|
||||||
writeBezierAsPwl(sb);
|
writeSpline(sb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user