int Part::ImportStepParts(App::Document *pcDoc, const char* Name) { STEPControl_Reader aReader; TopoDS_Shape aShape; Base::FileInfo fi(Name); if (!fi.exists()) { std::stringstream str; str << "File '" << Name << "' does not exist!"; throw Base::Exception(str.str().c_str()); } std::string encodednamestr = encodeFilename(std::string(Name)); const char * encodedname = encodednamestr.c_str(); if (aReader.ReadFile((Standard_CString)encodedname) != IFSelect_RetDone) { throw Base::Exception("Cannot open STEP file"); } Handle_Message_ProgressIndicator pi = new ProgressIndicator(100); aReader.WS()->MapReader()->SetProgress(pi); pi->NewScope(100, "Reading STEP file..."); pi->Show(); // Root transfers Standard_Integer nbr = aReader.NbRootsForTransfer(); //aReader.PrintCheckTransfer (failsonly, IFSelect_ItemsByEntity); for (Standard_Integer n = 1; n<= nbr; n++) { Base::Console().Log("STEP: Transferring Root %d\n",n); aReader.TransferRoot(n); } pi->EndScope(); // Collecting resulting entities Standard_Integer nbs = aReader.NbShapes(); if (nbs == 0) { throw Base::Exception("No shapes found in file "); } else { //Handle(StepData_StepModel) Model = aReader.StepModel(); //Handle_XSControl_WorkSession ws = aReader.WS(); //Handle_XSControl_TransferReader tr = ws->TransferReader(); std::map<int, Quantity_Color> hash_col; //ReadColors(aReader.WS(), hash_col); //ReadNames(aReader.WS()); for (Standard_Integer i=1; i<=nbs; i++) { Base::Console().Log("STEP: Transferring Shape %d\n",i); aShape = aReader.Shape(i); // load each solid as an own object TopExp_Explorer ex; for (ex.Init(aShape, TopAbs_SOLID); ex.More(); ex.Next()) { // get the shape const TopoDS_Solid& aSolid = TopoDS::Solid(ex.Current()); std::string name = fi.fileNamePure(); //Handle_Standard_Transient ent = tr->EntityFromShapeResult(aSolid, 3); //if (!ent.IsNull()) { // name += ws->Model()->StringLabel(ent)->ToCString(); //} Part::Feature *pcFeature; pcFeature = static_cast<Part::Feature*>(pcDoc->addObject("Part::Feature", name.c_str())); pcFeature->Shape.setValue(aSolid); // This is a trick to access the GUI via Python and set the color property // of the associated view provider. If no GUI is up an exception is thrown // and cleared immediately std::map<int, Quantity_Color>::iterator it = hash_col.find(aSolid.HashCode(INT_MAX)); if (it != hash_col.end()) { try { Py::Object obj(pcFeature->getPyObject(), true); Py::Object vp(obj.getAttr("ViewObject")); Py::Tuple col(3); col.setItem(0, Py::Float(it->second.Red())); col.setItem(1, Py::Float(it->second.Green())); col.setItem(2, Py::Float(it->second.Blue())); vp.setAttr("ShapeColor", col); //Base::Console().Message("Set color to shape\n"); } catch (Py::Exception& e) { e.clear(); } } } // load all non-solids now for (ex.Init(aShape, TopAbs_SHELL, TopAbs_SOLID); ex.More(); ex.Next()) { // get the shape const TopoDS_Shell& aShell = TopoDS::Shell(ex.Current()); std::string name = fi.fileNamePure(); //Handle_Standard_Transient ent = tr->EntityFromShapeResult(aShell, 3); //if (!ent.IsNull()) { // name += ws->Model()->StringLabel(ent)->ToCString(); //} Part::Feature *pcFeature = static_cast<Part::Feature*>(pcDoc->addObject("Part::Feature", name.c_str())); pcFeature->Shape.setValue(aShell); } // put all other free-flying shapes into a single compound Standard_Boolean emptyComp = Standard_True; BRep_Builder builder; TopoDS_Compound comp; builder.MakeCompound(comp); for (ex.Init(aShape, TopAbs_FACE, TopAbs_SHELL); ex.More(); ex.Next()) { if (!ex.Current().IsNull()) { builder.Add(comp, ex.Current()); emptyComp = Standard_False; } } for (ex.Init(aShape, TopAbs_WIRE, TopAbs_FACE); ex.More(); ex.Next()) { if (!ex.Current().IsNull()) { builder.Add(comp, ex.Current()); emptyComp = Standard_False; } } for (ex.Init(aShape, TopAbs_EDGE, TopAbs_WIRE); ex.More(); ex.Next()) { if (!ex.Current().IsNull()) { builder.Add(comp, ex.Current()); emptyComp = Standard_False; } } for (ex.Init(aShape, TopAbs_VERTEX, TopAbs_EDGE); ex.More(); ex.Next()) { if (!ex.Current().IsNull()) { builder.Add(comp, ex.Current()); emptyComp = Standard_False; } } if (!emptyComp) { std::string name = fi.fileNamePure(); Part::Feature *pcFeature = static_cast<Part::Feature*>(pcDoc->addObject ("Part::Feature", name.c_str())); pcFeature->Shape.setValue(comp); } } } return 0; }
IFSelect_ReturnStatus GeomImportExport::ReadSTEP(const QString& aFileName, TopoDS_Shape& aSequenceOfShape) { TopoDS_Shape aShape; TopoDS_Compound comp; BRep_Builder builder; builder.MakeCompound( comp ); STEPControl_Reader aReader; IFSelect_ReturnStatus status = aReader.ReadFile(aFileName.toAscii().data()); if (status == IFSelect_RetDone) { Standard_CString LogFileName = "ReadStepFile.log"; Interface_TraceFile::SetDefault(2,LogFileName,Standard_True); Standard_Boolean failsonly = Standard_False; aReader.PrintCheckLoad (failsonly, IFSelect_ItemsByEntity); // Root transfers Standard_Integer nbr = aReader.NbRootsForTransfer(); aReader.PrintCheckTransfer (failsonly, IFSelect_ItemsByEntity); for ( Standard_Integer n = 1; n<= nbr; n++) { Standard_Boolean ok = aReader.TransferRoot(n); // Collecting resulting entities Standard_Integer nbs = aReader.NbShapes(); if (nbs == 0) { aSequenceOfShape.Nullify(); return IFSelect_RetVoid; } else { for (Standard_Integer i =1; i<=nbs; i++) { aShape=aReader.Shape(i); builder.Add( comp, aShape ); } } } } else{ aSequenceOfShape.Nullify(); } aSequenceOfShape = comp; return status; }
int OCCTools::readSTEP(const char *filename, std::vector<OCCBase *>& shapes) { try { STEPControl_Reader aReader; Interface_Static::SetCVal("xstep.cascade.unit","M"); Interface_Static::SetIVal("read.step.nonmanifold", 1); if (aReader.ReadFile(filename) != IFSelect_RetDone) { StdFail_NotDone::Raise("Failed to read STEP file"); } // Root transfers int nbr = aReader.NbRootsForTransfer(); for (int n = 1; n<= nbr; n++) { aReader.TransferRoot(n); } // Collecting resulting entities int nbs = aReader.NbShapes(); if (nbs == 0) return 1; for (int i=1; i<=nbs; i++) { const TopoDS_Shape& aShape = aReader.Shape(i); extractShape(aShape, shapes); } } catch(Standard_Failure &err) { Handle_Standard_Failure e = Standard_Failure::Caught(); const Standard_CString msg = e->GetMessageString(); //printf("ERROR: %s\n", e->GetMessageString()); if (msg != NULL && strlen(msg) > 1) { setErrorMessage(msg); } else { setErrorMessage("Failed to read STEP file"); } return 0; } return 1; }
bool Translator::importSTEP(const QString& file) { STEPControl_Reader reader; IFSelect_ReturnStatus status = reader.ReadFile(file.toUtf8().data()); if(status == IFSelect_RetDone) { reader.PrintCheckLoad(false, IFSelect_ItemsByEntity); int nbr = reader.NbRootsForTransfer(); reader.PrintCheckTransfer(false, IFSelect_ItemsByEntity); for (Standard_Integer n = 1; n <= nbr; n++) { bool ok = reader.TransferRoot(n); int nbs = reader.NbShapes(); if (!ok || nbs == 0) continue; else if (nbr == 1 && nbs == 1) { TopoDS_Shape shape = reader.OneShape(); if (shape.ShapeType() == TopAbs_COMPOUND) { for (TopoDS_Iterator It(shape); It.More(); It.Next()) m_doc->insert(It.Value(), QFileInfo(file).baseName()); break; } } for (Standard_Integer i = 1; i <= nbs; i++) { TopoDS_Shape shape = reader.Shape(i); if (!shape.IsNull()) m_doc->insert(shape, QFileInfo(file).baseName()); } } return true; } return false; }
void CMainFrame::OnFileOpen() { // TODO: 在此添加命令处理程序代码 // TODO: 在此添加命令处理程序代码 CFileDialog dialog( TRUE, // TRUE for FileOpen, FALSE for FileSaveAs NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, TEXT("STEP file(*.step;*.stp)|*.step;*.stp|All Files (*.*)|*.*||"), this); if (dialog.DoModal() == IDOK) { CString filePath = dialog.GetPathName(); char file_str[1024] = {0}; WideCharToMultiByte(CP_ACP, 0, filePath.GetString(), filePath.GetLength(), file_str, 1024, NULL, NULL); SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); SetStatus(_T("加载文件中...")); STEPControl_Reader reader; if (reader.ReadFile(file_str) != IFSelect_RetDone) { AfxMessageBox(_T("文件打开错误!")); SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); ResetStatus(); return; } SetStatus(_T("模型转换")); Handle(AIS_InteractiveContext) m_context = ((CMCApp*)AfxGetApp())->GetAISContext(); Standard_Integer nbRoots = reader.NbRootsForTransfer(); cout << "Number of roots in STEP file: " << nbRoots << endl; Standard_Integer NbTrans = reader.TransferRoots(); // translates all transferable roots, and returns the number of //successful translations cout << "STEP roots transferred: " << NbTrans << endl; Standard_Integer NbShapes = reader.NbShapes(); cout << "Number of resulting shapes is: " << NbShapes << endl; m_rootTopoShape = reader.Shape();// reader.OneShape(); if (!m_rootTopoShape.IsNull()) { if (m_context->HasOpenedContext()) m_context->CloseAllContexts(); m_context->RemoveAll(); TopAbs_ShapeEnum shapeType = m_rootTopoShape.ShapeType(); if (shapeType == TopAbs_COMPOUND) { Quantity_NameOfColor colors[] = { Quantity_NOC_RED, Quantity_NOC_SKYBLUE, Quantity_NOC_SALMON, Quantity_NOC_GREEN, Quantity_NOC_ORANGE, Quantity_NOC_DEEPSKYBLUE1, Quantity_NOC_GOLD, Quantity_NOC_CYAN4, Quantity_NOC_DEEPPINK4, Quantity_NOC_INDIANRED, Quantity_NOC_BROWN }; Standard_Integer i=0; for (TopExp_Explorer solidExp(m_rootTopoShape, TopAbs_SOLID); solidExp.More(); solidExp.Next(), ++i) { TopoDS_Shape solid = TopoDS::Solid(solidExp.Current()); for (TopExp_Explorer faceExp(solid, TopAbs_FACE); faceExp.More(); faceExp.Next()) { //Geom_BezierSurface //Geom_Geometry *g; //g->GetType(); } Handle(AIS_Shape) aisShape = new AIS_Shape(solid); m_context->SetDisplayMode(aisShape, 1, Standard_False); m_context->Display(aisShape, Standard_False); m_context->SetWidth(aisShape, 2, Standard_False); m_context->SetMaterial(aisShape, Graphic3d_NOM_PLASTIC, Standard_False); m_context->SetColor(aisShape, colors[i % (sizeof(colors) / sizeof(Quantity_NameOfColor))], Standard_False); } } else { m_rootAISShape = new AIS_Shape(m_rootTopoShape); //m_context->SetColor(m_rootAISShape, Quantity_NOC_SALMON); //m_context->SetMaterial(m_rootAISShape, Graphic3d_NOM_METALIZED); m_context->SetDisplayMode(m_rootAISShape, true); m_context->Display(m_rootAISShape); m_context->SetSelectionMode(m_rootAISShape, 4); m_context->SetHilightColor(Quantity_NOC_LIGHTBLUE); } SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); } else { SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); AfxMessageBox(_T("模型为空!")); } SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); ResetStatus(); m_wndView.Reset(); } }
void loadSTEP(char* filename) { if(!filename) return; std::cout << "test" << std::endl; boost::interprocess::managed_shared_memory segment(boost::interprocess::open_only, "OCCSharedMem"); TestFaces *m_trisp = segment.find<TestFaces>("m_tris").first; //TestFaces *m_facesp = segment.find<TestFaces>("m_faces").first; Vector3DfAllocator vector3df_alloc_inst(segment.get_segment_manager()); TestFace *m_facep = segment.construct<TestFace>("m_facep")(vector3df_alloc_inst); std::cout << "connected to shared mem" << std::endl; std::cout << filename << std::endl; //STEPControl_Reader *readerp = new STEPControl_Reader; STEPControl_Reader reader; std::cout << filename << std::endl; reader.ReadFile(filename); Standard_Integer NbRoots = reader.NbRootsForTransfer(); std::cout << "Number of Roots in the STEP File: " << NbRoots << std::endl; Standard_Integer NbTrans = reader.TransferRoots(); std::cout << "STEP roots transferred: " << NbTrans << std::endl; std::cout << "Number of resulting shapes is: " << reader.NbShapes() << std::endl; TopoDS_Shape resulting_shape = reader.OneShape(); // gp_Trsf theTrans; // gp_Axl Axis = gp_Axl(gp_Pnt(200,60,60),gp_Dir(0.,1.,0.)); // theTrans.SetRotation(Axis,30*PI/180); // Rotation of 30 degrees // BRepBuilderAPI_Transform myBRepTransformation(resulting_shape,theTrans,true); // TopoDS_Shape TransformedShape = myBRepTransformation.Shape(); TopoDS_Iterator topo_iter; //m_topodsshapes.push_back(resulting_shape); // BRepMesh::Mesh(resulting_shape, 0.05); TopExp_Explorer faceExp(resulting_shape, TopAbs_FACE); for(; faceExp.More(); faceExp.Next()) { // TopExp_Explorer vertexExp(faceExp.Current(), TopAbs_VERTEX); //int f_n = 0; TopLoc_Location L = faceExp.Current().Location(); BRepMesh::Mesh(faceExp.Current(), .1); Handle (Poly_Triangulation) facing = BRep_Tool::Triangulation(TopoDS::Face(faceExp.Current()),L); // const Poly_Array1OfTriangle & triangles = facing->Triangles(); // const TColgp_Array1OfPnt & nodes = facing->Nodes(); // std::cout << "opencascaded: facing->NbTriangles() = " << facing->NbTriangles() << std::endl; if (!facing.IsNull()) { TopExp_Explorer vertexExp(faceExp.Current(), TopAbs_VERTEX); //int f_n = 0; //TopLoc_Location L = faceExp.Current().Location(); // BRepMesh::Mesh(faceExp.Current(), .1); // Handle (Poly_Triangulation) facing = BRep_Tool::Triangulation(TopoDS::Face(faceExp.Current()),L); const Poly_Array1OfTriangle & triangles = facing->Triangles(); const TColgp_Array1OfPnt & nodes = facing->Nodes(); std::cout << "opencascaded: facing->NbTriangles() = " << facing->NbTriangles() << std::endl; for ( int i=facing->NbTriangles(); i >= 1; --i ) { m_facep->clear(); Poly_Triangle triangle = triangles(i); Standard_Integer node1,node2,node3; triangle.Get(node1, node2, node3); gp_Pnt v1 = nodes(node1).Transformed(L); gp_Pnt v2 = nodes(node2).Transformed(L); gp_Pnt v3 = nodes(node3).Transformed(L); m_facep->push_back(Vector3Df(v1.X(), v1.Y(), v1.Z())); m_facep->push_back(Vector3Df(v2.X(), v2.Y(), v2.Z())); m_facep->push_back(Vector3Df(v3.X(), v3.Y(), v3.Z())); m_trisp->push_back(*m_facep); } } /* for(; vertexExp.More(); vertexExp.Next()) { m_facep->clear(); const TopoDS_Vertex& aVertex = TopoDS::Vertex(vertexExp.Current()); //TopoDS_Edge edge = TopoDS::Edge(shape); TopLoc_Location location; Standard_Real pFirst, pLast; //Handle(Geom_Curve) curve = BRep_Tool::Curve(anEdge, location, pFirst, pLast); //std::cout << "pFirst = " << pFirst << std::endl; gp_Pnt p = BRep_Tool::Pnt(aVertex); std::cout << "Vector3Df(" << p.X() << ", " << p.Y() << ", " << p.Z() << std::endl; //points.push_back(Vector3Df(p.X()/1000.0, p.Y()/1000.0, p.Z()/1000.0)); m_facep->push_back(Vector3Df(p.X()/1000.0, p.Y()/1000.0, p.Z()/1000.0)); // TopLoc_Location L; // Handle (Poly_Triangulation) facing = BRep_Tool::Triangulation(aFace,L); // if(!(facing.IsNull()))std::cout << "Number of Triangles in Face #" << f_n << ": " << facing->NbTriangles() << std::endl; // f_n++; } m_facesp->push_back(*m_facep); */ } //std::cout << " opencascaded: m_trisp->size()" << m_trisp->size() << std::endl; // segment.destroy<TestFaces>("m_tris"); }
STEPIMPORT_EXPORT TopoDS_Shape ImportSTEP (const TCollection_AsciiString& theFileName, const TCollection_AsciiString& /*theFormatName*/, TCollection_AsciiString& theError, const TDF_Label& theShapeLabel) { MESSAGE("Import STEP model from file " << theFileName.ToCString()); // Set "C" numeric locale to save numbers correctly //Kernel_Utils::Localizer loc; TopoDS_Shape aResShape; //VRV: OCC 4.0 migration STEPControl_Reader aReader; //VSR: 16/09/09: Convert to METERS Interface_Static::SetCVal("xstep.cascade.unit","M"); Interface_Static::SetIVal("read.step.ideas", 1); Interface_Static::SetIVal("read.step.nonmanifold", 1); //VRV: OCC 4.0 migration TopoDS_Compound compound; BRep_Builder B; B.MakeCompound(compound); try { #if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; #endif IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString()); if (status == IFSelect_RetDone) { Standard_Boolean failsonly = Standard_False; aReader.PrintCheckLoad(failsonly, IFSelect_ItemsByEntity); /* Root transfers */ Standard_Integer nbr = aReader.NbRootsForTransfer(); aReader.PrintCheckTransfer(failsonly, IFSelect_ItemsByEntity); for (Standard_Integer n = 1; n <= nbr; n++) { Standard_Boolean ok = aReader.TransferRoot(n); /* Collecting resulting entities */ Standard_Integer nbs = aReader.NbShapes(); if (!ok || nbs == 0) { // THROW_SALOME_CORBA_EXCEPTION("Exception catched in GEOM_Gen_i::ImportStep", SALOME::BAD_PARAM); continue; // skip empty root } /* For a single entity */ else if (nbr == 1 && nbs == 1) { aResShape = aReader.Shape(1); // ATTENTION: this is a workaround for mantis issue 0020442 remark 0010776 // It should be removed after patching OCCT for bug OCC22436 // (fix for OCCT is expected in service pack next to OCCT6.3sp12) if (aResShape.ShapeType() == TopAbs_COMPOUND) { int nbSub1 = 0; TopoDS_Shape currShape; TopoDS_Iterator It (aResShape, Standard_True, Standard_True); for (; It.More(); It.Next()) { nbSub1++; currShape = It.Value(); } if (nbSub1 == 1) aResShape = currShape; } // END workaround break; } for (Standard_Integer i = 1; i <= nbs; i++) { TopoDS_Shape aShape = aReader.Shape(i); if (aShape.IsNull()) { // THROW_SALOME_CORBA_EXCEPTION("Null shape in GEOM_Gen_i::ImportStep", SALOME::BAD_PARAM) ; //return aResShape; continue; } else { B.Add(compound, aShape); } } } if (aResShape.IsNull()) aResShape = compound; // BEGIN: Store names of sub-shapes from file TopTools_IndexedMapOfShape anIndices; TopExp::MapShapes(aResShape, anIndices); Handle(Interface_InterfaceModel) Model = aReader.WS()->Model(); Handle(XSControl_TransferReader) TR = aReader.WS()->TransferReader(); if (!TR.IsNull()) { Handle(Transfer_TransientProcess) TP = TR->TransientProcess(); Handle(Standard_Type) tPD = STANDARD_TYPE(StepBasic_ProductDefinition); Handle(Standard_Type) tShape = STANDARD_TYPE(StepShape_TopologicalRepresentationItem); Handle(Standard_Type) tGeom = STANDARD_TYPE(StepGeom_GeometricRepresentationItem); Standard_Integer nb = Model->NbEntities(); for (Standard_Integer ie = 1; ie <= nb; ie++) { Handle(Standard_Transient) enti = Model->Value(ie); Handle(TCollection_HAsciiString) aName; if ( enti->IsKind( tShape ) || enti->IsKind(tGeom)) { aName = Handle(StepRepr_RepresentationItem)::DownCast(enti)->Name(); } else if (enti->DynamicType() == tPD) { Handle(StepBasic_ProductDefinition) PD = Handle(StepBasic_ProductDefinition)::DownCast(enti); if (PD.IsNull()) continue; Handle(StepBasic_Product) Prod = PD->Formation()->OfProduct(); aName = Prod->Name(); } else { continue; } if ( aName->UsefullLength() < 1 ) continue; // skip 'N0NE' name if ( aName->UsefullLength() == 4 && toupper (aName->Value(1)) == 'N' && toupper (aName->Value(2)) == 'O' && toupper (aName->Value(3)) == 'N' && toupper (aName->Value(4)) == 'E') continue; // special check to pass names like "Open CASCADE STEP translator 6.3 1" TCollection_AsciiString aSkipName ("Open CASCADE STEP translator"); if (aName->Length() >= aSkipName.Length()) { if (aName->String().SubString(1, aSkipName.Length()).IsEqual(aSkipName)) continue; } TCollection_ExtendedString aNameExt (aName->ToCString()); // find target shape Handle(Transfer_Binder) binder = TP->Find(enti); if (binder.IsNull()) continue; TopoDS_Shape S = TransferBRep::ShapeResult(binder); if (S.IsNull()) continue; // as PRODUCT can be included in the main shape // several times, we look here for all iclusions. Standard_Integer isub, nbSubs = anIndices.Extent(); for (isub = 1; isub <= nbSubs; isub++) { TopoDS_Shape aSub = anIndices.FindKey(isub); if (aSub.IsPartner(S)) { TDF_Label L; if (enti->IsKind(tGeom)) { // check all named shapes using iterator TDF_ChildIDIterator anIt (theShapeLabel, TDataStd_Name::GetID(), Standard_True); for (; anIt.More(); anIt.Next()) { Handle(TDataStd_Name) nameAttr = Handle(TDataStd_Name)::DownCast(anIt.Value()); if (nameAttr.IsNull()) continue; TDF_Label Lab = nameAttr->Label(); Handle(TNaming_NamedShape) shAttr; if (Lab.FindAttribute(TNaming_NamedShape::GetID(), shAttr) && shAttr->Get().IsEqual(aSub)) L = Lab; } } // create label and set shape if (L.IsNull()) { TDF_TagSource aTag; L = aTag.NewChild(theShapeLabel); TNaming_Builder tnBuild (L); //tnBuild.Generated(S); tnBuild.Generated(aSub); } // set a name TDataStd_Name::Set(L, aNameExt); } } } } // END: Store names } else { // switch (status) { // case IFSelect_RetVoid: // theError = "Nothing created or No data to process"; // break; // case IFSelect_RetError: // theError = "Error in command or input data"; // break; // case IFSelect_RetFail: // theError = "Execution was run, but has failed"; // break; // case IFSelect_RetStop: // theError = "Execution has been stopped. Quite possible, an exception was raised"; // break; // default: // break; // } theError = "Wrong format of the imported file. Can't import file."; aResShape.Nullify(); } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); theError = aFail->GetMessageString(); aResShape.Nullify(); } // Return previous locale return aResShape; }
int EG_loadModel(egObject *context, int bflg, const char *name, egObject **model) { int i, j, stat, outLevel, len, nattr, egads = 0; egObject *omodel, *aobj; TopoDS_Shape source; egadsModel *mshape = NULL; FILE *fp; *model = NULL; if (context == NULL) return EGADS_NULLOBJ; if (context->magicnumber != MAGIC) return EGADS_NOTOBJ; if (context->oclass != CONTXT) return EGADS_NOTCNTX; outLevel = EG_outLevel(context); if (name == NULL) { if (outLevel > 0) printf(" EGADS Warning: NULL Filename (EG_loadModel)!\n"); return EGADS_NONAME; } /* does file exist? */ fp = fopen(name, "r"); if (fp == NULL) { if (outLevel > 0) printf(" EGADS Warning: File %s Not Found (EG_loadModel)!\n", name); return EGADS_NOTFOUND; } fclose(fp); /* find extension */ len = strlen(name); for (i = len-1; i > 0; i--) if (name[i] == '.') break; if (i == 0) { if (outLevel > 0) printf(" EGADS Warning: No Extension in %s (EG_loadModel)!\n", name); return EGADS_NODATA; } if ((strcasecmp(&name[i],".step") == 0) || (strcasecmp(&name[i],".stp") == 0)) { /* STEP files */ STEPControl_Reader aReader; IFSelect_ReturnStatus status = aReader.ReadFile(name); if (status != IFSelect_RetDone) { if (outLevel > 0) printf(" EGADS Error: STEP Read of %s = %d (EG_loadModel)!\n", name, status); return EGADS_NOLOAD; } // inspect the root transfers if (outLevel > 2) aReader.PrintCheckLoad(Standard_False, IFSelect_ItemsByEntity); int nroot = aReader.NbRootsForTransfer(); if (outLevel > 1) printf(" EGADS Info: %s Entries = %d\n", name, nroot); for (i = 1; i <= nroot; i++) { Standard_Boolean ok = aReader.TransferRoot(i); if ((!ok) && (outLevel > 0)) printf(" EGADS Warning: Transfer %d/%d is not OK!\n", i, nroot); } int nbs = aReader.NbShapes(); if (nbs <= 0) { if (outLevel > 0) printf(" EGADS Error: %s has No Shapes (EG_loadModel)!\n", name); return EGADS_NOLOAD; } if (outLevel > 1) printf(" EGADS Info: %s has %d Shape(s)\n", name, nbs); TopoDS_Compound compound; BRep_Builder builder3D; builder3D.MakeCompound(compound); for (i = 1; i <= nbs; i++) { TopoDS_Shape aShape = aReader.Shape(i); builder3D.Add(compound, aShape); } source = compound; } else if ((strcasecmp(&name[i],".iges") == 0) || (strcasecmp(&name[i],".igs") == 0)) { /* IGES files */ IGESControl_Reader iReader; Standard_Integer stats = iReader.ReadFile(name); if (stats != IFSelect_RetDone) { if (outLevel > 0) printf(" EGADS Error: IGES Read of %s = %d (EG_loadModel)!\n", name, stats); return EGADS_NOLOAD; } iReader.TransferRoots(); int nbs = iReader.NbShapes(); if (nbs <= 0) { if (outLevel > 0) printf(" EGADS Error: %s has No Shapes (EG_loadModel)!\n", name); return EGADS_NOLOAD; } if (outLevel > 1) printf(" EGADS Info: %s has %d Shape(s)\n", name, nbs); TopoDS_Compound compound; BRep_Builder builder3D; builder3D.MakeCompound(compound); for (i = 1; i <= nbs; i++) { TopoDS_Shape aShape = iReader.Shape(i); builder3D.Add(compound, aShape); } source = compound; } else if ((strcasecmp(&name[i],".brep") == 0) || (strcasecmp(&name[i],".egads") == 0)) { /* Native OCC file */ if (strcasecmp(&name[i],".egads") == 0) egads = 1; BRep_Builder builder; if (!BRepTools::Read(source, name, builder)) { if (outLevel > 0) printf(" EGADS Warning: Read Error on %s (EG_loadModel)!\n", name); return EGADS_NOLOAD; } } else { if (outLevel > 0) printf(" EGADS Warning: Extension in %s Not Supported (EG_loadModel)!\n", name); return EGADS_NODATA; } int nWire = 0; int nFace = 0; int nSheet = 0; int nSolid = 0; TopExp_Explorer Exp; for (Exp.Init(source, TopAbs_WIRE, TopAbs_FACE); Exp.More(); Exp.Next()) nWire++; for (Exp.Init(source, TopAbs_FACE, TopAbs_SHELL); Exp.More(); Exp.Next()) nFace++; for (Exp.Init(source, TopAbs_SHELL, TopAbs_SOLID); Exp.More(); Exp.Next()) nSheet++; for (Exp.Init(source, TopAbs_SOLID); Exp.More(); Exp.Next()) nSolid++; if (outLevel > 1) printf("\n EGADS Info: %s has %d Solids, %d Sheets, %d Faces and %d Wires\n", name, nSolid, nSheet, nFace, nWire); int nBody = nWire+nFace+nSheet+nSolid; if (nBody == 0) { source.Nullify(); if (outLevel > 0) printf(" EGADS Warning: Nothing found in %s (EG_loadModel)!\n", name); return EGADS_NODATA; } mshape = new egadsModel; mshape->shape = source; mshape->nbody = nBody; mshape->bodies = new egObject*[nBody]; for (i = 0; i < nBody; i++) { stat = EG_makeObject(context, &mshape->bodies[i]); if (stat != EGADS_SUCCESS) { for (int j = 0; j < i; j++) { egObject *obj = mshape->bodies[j]; egadsBody *pbody = (egadsBody *) obj->blind; delete pbody; EG_deleteObject(mshape->bodies[j]); } delete [] mshape->bodies; delete mshape; return stat; } egObject *pobj = mshape->bodies[i]; egadsBody *pbody = new egadsBody; pbody->nodes.objs = NULL; pbody->edges.objs = NULL; pbody->loops.objs = NULL; pbody->faces.objs = NULL; pbody->shells.objs = NULL; pbody->senses = NULL; pobj->blind = pbody; } i = 0; for (Exp.Init(mshape->shape, TopAbs_WIRE, TopAbs_FACE); Exp.More(); Exp.Next()) { egObject *obj = mshape->bodies[i++]; egadsBody *pbody = (egadsBody *) obj->blind; pbody->shape = Exp.Current(); } for (Exp.Init(mshape->shape, TopAbs_FACE, TopAbs_SHELL); Exp.More(); Exp.Next()) { egObject *obj = mshape->bodies[i++]; egadsBody *pbody = (egadsBody *) obj->blind; pbody->shape = Exp.Current(); } for (Exp.Init(mshape->shape, TopAbs_SHELL, TopAbs_SOLID); Exp.More(); Exp.Next()) { egObject *obj = mshape->bodies[i++]; egadsBody *pbody = (egadsBody *) obj->blind; pbody->shape = Exp.Current(); } for (Exp.Init(mshape->shape, TopAbs_SOLID); Exp.More(); Exp.Next()) { egObject *obj = mshape->bodies[i++]; egadsBody *pbody = (egadsBody *) obj->blind; pbody->shape = Exp.Current(); } stat = EG_makeObject(context, &omodel); if (stat != EGADS_SUCCESS) { source.Nullify(); for (i = 0; i < nBody; i++) { egObject *obj = mshape->bodies[i]; egadsBody *pbody = (egadsBody *) obj->blind; delete pbody; EG_deleteObject(mshape->bodies[i]); } delete [] mshape->bodies; delete mshape; return stat; } omodel->oclass = MODEL; omodel->blind = mshape; EG_referenceObject(omodel, context); for (i = 0; i < nBody; i++) { egObject *pobj = mshape->bodies[i]; egadsBody *pbody = (egadsBody *) pobj->blind; pobj->topObj = omodel; if (((bflg&1) == 0) && (egads == 0)) EG_splitPeriodics(pbody); stat = EG_traverseBody(context, i, pobj, omodel, pbody); if (stat != EGADS_SUCCESS) { mshape->nbody = i; EG_destroyTopology(omodel); delete [] mshape->bodies; delete mshape; return stat; } } *model = omodel; if (egads == 0) return EGADS_SUCCESS; /* get the attributes from the EGADS files */ fp = fopen(name, "r"); if (fp == NULL) { printf(" EGADS Info: Cannot reOpen %s (EG_loadModel)!\n", name); return EGADS_SUCCESS; } char line[81]; for (;;) { line[0] = line[1] = ' '; if (fgets(line, 81, fp) == NULL) break; if ((line[0] == '#') && (line[1] == '#')) break; } // got the header if ((line[0] == '#') && (line[1] == '#')) { if (outLevel > 1) printf(" Header = %s\n", line); // get number of model attributes fscanf(fp, "%d", &nattr); if (nattr != 0) EG_readAttrs(omodel, nattr, fp); for (i = 0; i < nBody; i++) { int otype, oindex; int rsolid, rshell, rface, rloop, redge, rnode; int nsolid, nshell, nface, nloop, nedge, nnode; fscanf(fp, " %d %d %d %d %d %d %d", &rsolid, &rshell, &rface, &rloop, &redge, &rnode, &nattr); if (outLevel > 2) printf(" read = %d %d %d %d %d %d %d\n", rsolid, rshell, rface, rloop, redge, rnode, nattr); egObject *pobj = mshape->bodies[i]; egadsBody *pbody = (egadsBody *) pobj->blind; nnode = pbody->nodes.map.Extent(); nedge = pbody->edges.map.Extent(); nloop = pbody->loops.map.Extent(); nface = pbody->faces.map.Extent(); nshell = pbody->shells.map.Extent(); nsolid = 0; if (pobj->mtype == SOLIDBODY) nsolid = 1; if ((nnode != rnode) || (nedge != redge) || (nloop != rloop) || (nface != rface) || (nshell != rshell) || (nsolid != rsolid)) { printf(" EGADS Info: %d %d, %d %d, %d %d, %d %d, %d %d, %d %d", nnode, rnode, nedge, redge, nloop, rloop, nface, rface, nshell, rshell, nsolid, rsolid); printf(" MisMatch on Attributes (EG_loadModel)!\n"); fclose(fp); return EGADS_SUCCESS; } // got the correct body -- transfer the attributes if (nattr != 0) EG_readAttrs(pobj, nattr, fp); for (;;) { j = fscanf(fp, "%d %d %d\n", &otype, &oindex, &nattr); if (outLevel > 2) printf(" %d: attr header = %d %d %d\n", j, otype, oindex, nattr); if (j != 3) break; if (otype == 0) break; if (otype == 1) { aobj = pbody->shells.objs[oindex]; } else if (otype == 2) { aobj = pbody->faces.objs[oindex]; } else if (otype == 3) { aobj = pbody->loops.objs[oindex]; } else if (otype == 4) { aobj = pbody->edges.objs[oindex]; } else { aobj = pbody->nodes.objs[oindex]; } EG_readAttrs(aobj, nattr, fp); } } } else { printf(" EGADS Info: EGADS Header not found in %s (EG_loadModel)!\n", name); return EGADS_SUCCESS; } fclose(fp); return EGADS_SUCCESS; }