void SShell::MakeSectionEdgesInto(Vector n, double d, SEdgeList *sel, SBezierList *sbl) { SSurface *s; for(s = surface.First(); s; s = surface.NextAfter(s)) { if(s->CoincidentWithPlane(n, d)) { s->MakeSectionEdgesInto(this, sel, sbl); } } }
void StepFileWriter::ExportSurfacesTo(char *file) { Group *g = SK.GetGroup(SS.GW.activeGroup); SShell *shell = &(g->runningShell); if(shell->surface.n == 0) { Error("The model does not contain any surfaces to export.%s", g->runningMesh.l.n > 0 ? "\n\nThe model does contain triangles from a mesh, but " "a triangle mesh cannot be exported as a STEP file. Try " "File -> Export Mesh... instead." : ""); return; } f = fopen(file, "wb"); if(!f) { Error("Couldn't write to '%s'", file); return; } WriteHeader(); WriteProductHeader(); ZERO(&advancedFaces); SSurface *ss; for(ss = shell->surface.First(); ss; ss = shell->surface.NextAfter(ss)) { if(ss->trim.n == 0) continue; // Get all of the loops of Beziers that trim our surface (with each // Bezier split so that we use the section as t goes from 0 to 1), and // the piecewise linearization of those loops in xyz space. SBezierList sbl; ZERO(&sbl); ss->MakeSectionEdgesInto(shell, NULL, &sbl); // Apply the export scale factor. ss->ScaleSelfBy(1.0/SS.exportScale); sbl.ScaleSelfBy(1.0/SS.exportScale); ExportSurface(ss, &sbl); sbl.Clear(); } fprintf(f, "#%d=CLOSED_SHELL('',(", id); int *af; for(af = advancedFaces.First(); af; af = advancedFaces.NextAfter(af)) { fprintf(f, "#%d", *af); if(advancedFaces.NextAfter(af) != NULL) fprintf(f, ","); } fprintf(f, "));\n"); fprintf(f, "#%d=MANIFOLD_SOLID_BREP('brep',#%d);\n", id+1, id); fprintf(f, "#%d=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#%d,#170),#168);\n", id+2, id+1); fprintf(f, "#%d=SHAPE_REPRESENTATION_RELATIONSHIP($,$,#169,#%d);\n", id+3, id+2); WriteFooter(); fclose(f); advancedFaces.Clear(); }