void BrepHandler::extractFace(const DirectoryEntry* de, bool orientWithSurface) { // spec says the surface can be: // parametric spline surface // ruled surface // surface of revolution // tabulated cylinder // rational b-spline surface // offset surface // plane surface // rccyl surface // rccone surface // spherical surface // toroidal surface debug("########################## E X T R A C T F A C E"); ParameterData params; _iges->getParameter(de->paramData(), params); Pointer surfaceDE = params.getPointer(1); int surf = extractSurface(_iges->getDirectoryEntry(surfaceDE)); int face = handleFace(orientWithSurface, surf); int numLoops = params.getInteger(2); bool isOuter = params.getLogical(3) || true; // outer is not set in IGES from Pro/E! for (int i = 4; (i-4) < numLoops; i++) { Pointer loopDE = params.getPointer(i); extractLoop(_iges->getDirectoryEntry(loopDE), isOuter, face); isOuter = false; } }
int BrepHandler::extractEdge(const DirectoryEntry* edgeListDE, int index) { EdgeKey k = make_pair(edgeListDE, index); EdgeMap::iterator i = edges.find(k); if (i == edges.end()) { Pointer initVertexList; Integer initVertexIndex; Pointer termVertexList; Integer termVertexIndex; debug("########################## E X T R A C T E D G E"); ParameterData params; _iges->getParameter(edgeListDE->paramData(), params); int paramIndex = (index-1)*5 + 2; Pointer msCurvePtr = params.getPointer(paramIndex); initVertexList = params.getPointer(paramIndex+1); initVertexIndex = params.getInteger(paramIndex+2); termVertexList = params.getPointer(paramIndex+3); termVertexIndex = params.getInteger(paramIndex+4); // extract the model space curves int mCurveIndex = extractCurve(_iges->getDirectoryEntry(msCurvePtr), false); // extract the vertices int initVertex = extractVertex(_iges->getDirectoryEntry(initVertexList), initVertexIndex); int termVertex = extractVertex(_iges->getDirectoryEntry(termVertexList), termVertexIndex); edges[k] = handleEdge(mCurveIndex, initVertex, termVertex); return edges[k]; } else { return i->second; } }
int BrepHandler::extractSurfaceOfRevolution(const ParameterData& params) { Pointer linePtr = params.getPointer(1); Pointer curvePtr = params.getPointer(2); double startAngle = params.getReal(3); double endAngle = params.getReal(4); // load the line (axis of revolution) int line = extractLine(linePtr); // load the curve (generatrix) int curve = extractCurve(_iges->getDirectoryEntry(curvePtr), false); return handleSurfaceOfRevolution(line, curve, startAngle, endAngle); }
void BrepHandler::extractBrep(const DirectoryEntry* de) { debug("########################### E X T R A C T B R E P"); ParameterData params; _iges->getParameter(de->paramData(), params); Pointer shell = params.getPointer(1); extractShell(_iges->getDirectoryEntry(shell), false, params.getLogical(2)); int numVoids = params.getInteger(3); if (numVoids <= 0) return; int index = 4; for (int i = 0; i < numVoids; i++) { shell = params.getPointer(index); extractShell(_iges->getDirectoryEntry(shell), true, params.getLogical(index+1)); index += 2; } }
int BrepHandler::extractLoop(const DirectoryEntry* de, bool isOuter, int face) { debug("########################## E X T R A C T L O O P"); ParameterData params; _iges->getParameter(de->paramData(), params); int loop = handleLoop(isOuter, face); int numberOfEdges = params.getInteger(1); int i = 2; // extract the edge uses! for (int _i = 0; _i < numberOfEdges; _i++) { bool isVertex = (1 == params.getInteger(i)) ? true : false; Pointer edgePtr = params.getPointer(i+1); int index = params.getInteger(i+2); // need to get the edge list, and extract the edge info int edge = extractEdge(_iges->getDirectoryEntry(edgePtr), index); bool orientWithCurve = params.getLogical(i+3); // handle this edge handleEdgeUse(edge, orientWithCurve); // deal with param-space curves (not generally included in Pro/E output) int numCurves = params.getInteger(i+4); int j = i+5; list<PSpaceCurve> pCurveIndices; for (int _j = 0; _j < numCurves; _j++) { // handle the param-space curves, which are generally not included in MSBO Logical iso = params.getLogical(j); Pointer ptr = params.getPointer(j+1); pCurveIndices.push_back(PSpaceCurve(_iges, this, iso, ptr)); j += 2; } i = j; } return loop; }
void BrepHandler::extractShell(const DirectoryEntry* de, bool isVoid, bool orientWithFace) { debug("########################### E X T R A C T S H E L L"); ParameterData params; _iges->getParameter(de->paramData(), params); handleShell(isVoid, orientWithFace); int numFaces = params.getInteger(1); for (int i = 1; i <= numFaces; i++) { Pointer facePtr = params.getPointer(i*2); bool orientWithSurface = params.getLogical(i*2+1); DirectoryEntry* faceDE = _iges->getDirectoryEntry(facePtr); extractFace(faceDE, orientWithSurface); } }