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
Jonathan Westhues 2009-06-08 18:04:15 -08:00
parent 603f47692e
commit ee6939a761
1 changed files with 66 additions and 20 deletions

View File

@ -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);
fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n", int thisFinish;
id, CO(sb->Start())); if(loop->l.NextAfter(sb) != NULL) {
fprintf(f, "#%d=VERTEX_POINT('',#%d);\n", id+1, id); fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n",
fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n", id, CO(sb->Finish()));
id+2, CO(sb->Finish())); fprintf(f, "#%d=VERTEX_POINT('',#%d);\n", id+1, id);
fprintf(f, "#%d=VERTEX_POINT('',#%d);\n", id+3, id+2); thisFinish = id + 1;
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",