Output rational b-spline curves and surfaces in the STEP file, and
make sure that our edge loops are exactly (considering only the vertex id) closed. [git-p4: depot-paths = "//depot/solvespace/": change = 1976]solver
parent
603f47692e
commit
ee6939a761
|
@ -62,15 +62,26 @@ void StepFileWriter::WriteHeader(void) {
|
||||||
int StepFileWriter::ExportCurve(SBezier *sb) {
|
int StepFileWriter::ExportCurve(SBezier *sb) {
|
||||||
int i, ret = id;
|
int i, ret = id;
|
||||||
|
|
||||||
fprintf(f, "#%d=B_SPLINE_CURVE_WITH_KNOTS('',%d,(",
|
fprintf(f, "#%d=(\n", ret);
|
||||||
ret, sb->deg, (sb->deg + 1), (sb->deg + 1));
|
fprintf(f, "BOUNDED_CURVE()\n");
|
||||||
|
fprintf(f, "B_SPLINE_CURVE(%d,(", sb->deg);
|
||||||
for(i = 0; i <= sb->deg; i++) {
|
for(i = 0; i <= sb->deg; i++) {
|
||||||
fprintf(f, "#%d", ret + i + 1);
|
fprintf(f, "#%d", ret + i + 1);
|
||||||
if(i != sb->deg) fprintf(f, ",");
|
if(i != sb->deg) fprintf(f, ",");
|
||||||
}
|
}
|
||||||
fprintf(f, "),.UNSPECIFIED.,.F.,.F.,(%d, %d),",
|
fprintf(f, "),.UNSPECIFIED.,.F.,.F.)\n");
|
||||||
|
fprintf(f, "B_SPLINE_CURVE_WITH_KNOTS((%d,%d),",
|
||||||
(sb->deg + 1), (sb-> deg + 1));
|
(sb->deg + 1), (sb-> deg + 1));
|
||||||
fprintf(f, "(0.000,1.000),.UNSPECIFIED.);\n");
|
fprintf(f, "(0.000,1.000),.UNSPECIFIED.)\n");
|
||||||
|
fprintf(f, "CURVE()\n");
|
||||||
|
fprintf(f, "GEOMETRIC_REPRESENTATION_ITEM()\n");
|
||||||
|
fprintf(f, "RATIONAL_B_SPLINE_CURVE((");
|
||||||
|
for(i = 0; i <= sb->deg; i++) {
|
||||||
|
fprintf(f, "%.10f", sb->weight[i]);
|
||||||
|
if(i != sb->deg) fprintf(f, ",");
|
||||||
|
}
|
||||||
|
fprintf(f, "))\n");
|
||||||
|
fprintf(f, "REPRESENTATION_ITEM('')\n);\n");
|
||||||
|
|
||||||
for(i = 0; i <= sb->deg; i++) {
|
for(i = 0; i <= sb->deg; i++) {
|
||||||
fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n",
|
fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n",
|
||||||
|
@ -84,28 +95,46 @@ int StepFileWriter::ExportCurve(SBezier *sb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int StepFileWriter::ExportCurveLoop(SBezierLoop *loop, bool inner) {
|
int StepFileWriter::ExportCurveLoop(SBezierLoop *loop, bool inner) {
|
||||||
|
if(loop->l.n < 1) oops();
|
||||||
|
|
||||||
List<int> listOfTrims;
|
List<int> listOfTrims;
|
||||||
ZERO(&listOfTrims);
|
ZERO(&listOfTrims);
|
||||||
|
|
||||||
SBezier *sb;
|
SBezier *sb = &(loop->l.elem[loop->l.n - 1]);
|
||||||
|
|
||||||
|
// Generate "exactly closed" contours, with the same vertex id for the
|
||||||
|
// finish of a previous edge and the start of the next one. So we need
|
||||||
|
// the finish of the last Bezier in the loop before we start our process.
|
||||||
|
fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n",
|
||||||
|
id, CO(sb->Finish()));
|
||||||
|
fprintf(f, "#%d=VERTEX_POINT('',#%d);\n", id+1, id);
|
||||||
|
int lastFinish = id + 1, prevFinish = lastFinish;
|
||||||
|
id += 2;
|
||||||
|
|
||||||
for(sb = loop->l.First(); sb; sb = loop->l.NextAfter(sb)) {
|
for(sb = loop->l.First(); sb; sb = loop->l.NextAfter(sb)) {
|
||||||
int curveId = ExportCurve(sb);
|
int curveId = ExportCurve(sb);
|
||||||
|
|
||||||
|
int thisFinish;
|
||||||
|
if(loop->l.NextAfter(sb) != NULL) {
|
||||||
fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n",
|
fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n",
|
||||||
id, CO(sb->Start()));
|
id, CO(sb->Finish()));
|
||||||
fprintf(f, "#%d=VERTEX_POINT('',#%d);\n", id+1, id);
|
fprintf(f, "#%d=VERTEX_POINT('',#%d);\n", id+1, id);
|
||||||
fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n",
|
thisFinish = id + 1;
|
||||||
id+2, CO(sb->Finish()));
|
id += 2;
|
||||||
fprintf(f, "#%d=VERTEX_POINT('',#%d);\n", id+3, id+2);
|
} else {
|
||||||
|
thisFinish = lastFinish;
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(f, "#%d=EDGE_CURVE('',#%d,#%d,#%d,%s);\n",
|
fprintf(f, "#%d=EDGE_CURVE('',#%d,#%d,#%d,%s);\n",
|
||||||
id+4, id+1, id+3, curveId, ".T.");
|
id, prevFinish, thisFinish, curveId, ".T.");
|
||||||
fprintf(f, "#%d=ORIENTED_EDGE('',*,*,#%d,.T.);\n",
|
fprintf(f, "#%d=ORIENTED_EDGE('',*,*,#%d,.T.);\n",
|
||||||
id+5, id+4);
|
id+1, id);
|
||||||
|
|
||||||
int oe = id+5;
|
int oe = id+1;
|
||||||
listOfTrims.Add(&oe);
|
listOfTrims.Add(&oe);
|
||||||
|
id += 2;
|
||||||
|
|
||||||
id += 6;
|
prevFinish = thisFinish;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(f, "#%d=EDGE_LOOP('',(", id);
|
fprintf(f, "#%d=EDGE_LOOP('',(", id);
|
||||||
|
@ -129,8 +158,9 @@ int StepFileWriter::ExportCurveLoop(SBezierLoop *loop, bool inner) {
|
||||||
void StepFileWriter::ExportSurface(SSurface *ss) {
|
void StepFileWriter::ExportSurface(SSurface *ss) {
|
||||||
int i, j, srfid = id;
|
int i, j, srfid = id;
|
||||||
|
|
||||||
fprintf(f, "#%d=B_SPLINE_SURFACE_WITH_KNOTS('',%d,%d,(",
|
fprintf(f, "#%d=(\n", srfid);
|
||||||
srfid, ss->degm, ss->degn);
|
fprintf(f, "BOUNDED_SURFACE()\n");
|
||||||
|
fprintf(f, "B_SPLINE_SURFACE(%d,%d,(", ss->degm, ss->degn);
|
||||||
for(i = 0; i <= ss->degm; i++) {
|
for(i = 0; i <= ss->degm; i++) {
|
||||||
fprintf(f, "(");
|
fprintf(f, "(");
|
||||||
for(j = 0; j <= ss->degn; j++) {
|
for(j = 0; j <= ss->degn; j++) {
|
||||||
|
@ -140,10 +170,26 @@ void StepFileWriter::ExportSurface(SSurface *ss) {
|
||||||
fprintf(f, ")");
|
fprintf(f, ")");
|
||||||
if(i != ss->degm) fprintf(f, ",");
|
if(i != ss->degm) fprintf(f, ",");
|
||||||
}
|
}
|
||||||
fprintf(f, "),.UNSPECIFIED.,.F.,.F.,.F.,(%d,%d),(%d,%d),",
|
fprintf(f, "),.UNSPECIFIED.,.F.,.F.,.F.)\n");
|
||||||
|
fprintf(f, "B_SPLINE_SURFACE_WITH_KNOTS((%d,%d),(%d,%d),",
|
||||||
(ss->degm + 1), (ss->degm + 1),
|
(ss->degm + 1), (ss->degm + 1),
|
||||||
(ss->degn + 1), (ss->degn + 1));
|
(ss->degn + 1), (ss->degn + 1));
|
||||||
fprintf(f, "(0.000,1.000),(0.000,1.000),.UNSPECIFIED.);\n");
|
fprintf(f, "(0.000,1.000),(0.000,1.000),.UNSPECIFIED.)\n");
|
||||||
|
fprintf(f, "GEOMETRIC_REPRESENTATION_ITEM()\n");
|
||||||
|
fprintf(f, "RATIONAL_B_SPLINE_SURFACE((");
|
||||||
|
for(i = 0; i <= ss->degm; i++) {
|
||||||
|
fprintf(f, "(");
|
||||||
|
for(j = 0; j <= ss->degn; j++) {
|
||||||
|
fprintf(f, "%.10f", ss->weight[i][j]);
|
||||||
|
if(j != ss->degn) fprintf(f, ",");
|
||||||
|
}
|
||||||
|
fprintf(f, ")");
|
||||||
|
if(i != ss->degm) fprintf(f, ",");
|
||||||
|
}
|
||||||
|
fprintf(f, "))\n");
|
||||||
|
fprintf(f, "REPRESENTATION_ITEM('')\n");
|
||||||
|
fprintf(f, "SURFACE()\n");
|
||||||
|
fprintf(f, ");\n");
|
||||||
|
|
||||||
for(i = 0; i <= ss->degm; i++) {
|
for(i = 0; i <= ss->degm; i++) {
|
||||||
for(j = 0; j <= ss->degn; j++) {
|
for(j = 0; j <= ss->degn; j++) {
|
||||||
|
@ -312,7 +358,7 @@ void StepFileWriter::ExportTo(char *file) {
|
||||||
if(advancedFaces.NextAfter(af) != NULL) fprintf(f, ",");
|
if(advancedFaces.NextAfter(af) != NULL) fprintf(f, ",");
|
||||||
}
|
}
|
||||||
fprintf(f, "));\n");
|
fprintf(f, "));\n");
|
||||||
fprintf(f, "#%d=MANIFOLD_SOLID_BREP('brep_1',#%d);\n", id+1, id);
|
fprintf(f, "#%d=MANIFOLD_SOLID_BREP('brep',#%d);\n", id+1, id);
|
||||||
fprintf(f, "#%d=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#%d,#170),#168);\n",
|
fprintf(f, "#%d=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#%d,#170),#168);\n",
|
||||||
id+2, id+1);
|
id+2, id+1);
|
||||||
fprintf(f, "#%d=SHAPE_REPRESENTATION_RELATIONSHIP($,$,#169,#%d);\n",
|
fprintf(f, "#%d=SHAPE_REPRESENTATION_RELATIONSHIP($,$,#169,#%d);\n",
|
||||||
|
|
Loading…
Reference in New Issue