/* bool FeaturePartImportStep::MustExecute(void) { Base::Console().Log("PartBoxFeature::MustExecute()\n"); return false; } */ Standard_Integer FeatureImportIges::Execute(void) { Base::Console().Log("FeaturePartImportIges::Execute()\n"); /* cout << GetFloatProperty("x") << endl; cout << GetFloatProperty("y") << endl; cout << GetFloatProperty("z") << endl; cout << GetFloatProperty("l") << endl; cout << GetFloatProperty("h") << endl; cout << GetFloatProperty("w") << endl;*/ try{ IGESControl_Reader aReader; TopoDS_Shape aShape; std::string FileName = getPropertyString("FileName"); int i=_open(FileName.c_str(),O_RDONLY); if( i != -1) { _close(i); }else{ Base::Console().Log("FeaturePartImportIges::Execute() not able to open %s!\n",FileName.c_str()); return 1; } // just do show the wait cursor when the Gui is up Base::Sequencer().start("Load IGES", 1); Base::Sequencer().next(); // read iges-file if (aReader.ReadFile((const Standard_CString)FileName.c_str()) != IFSelect_RetDone) throw Base::Exception("IGES read failed (load file)"); // check iges-file (memory) //if (!aReader.Check(Standard_True)) // Base::Console().Warning( "IGES model contains errors! try loading anyway....\n" ); // make brep aReader.TransferRoots(); // one shape, who contain's all subshapes aShape = aReader.OneShape(); setShape(aShape); Base::Sequencer().stop(); } catch(...){ Base::Sequencer().halt(); Base::Console().Error("FeaturePartImportIges::Execute() failed!"); return 1; } return 0; }
TopoDS_Shape openIGES(char const *filename) { IGESControl_Reader reader; IFSelect_ReturnStatus status = reader.ReadFile(filename); assert(status == IFSelect_RetDone); reader.TransferRoots(); return reader.OneShape(); }
bool Translator::importIGES(const QString& file) { IGESControl_Reader reader; int status = reader.ReadFile(file.toUtf8().data()); if(status == IFSelect_RetDone) { reader.TransferRoots(); TopoDS_Shape shape = reader.OneShape(); m_doc->insert(shape, QFileInfo(file).baseName()); return true; } return false; }
Standard_Integer GeomImportExport::ReadIGES(const QString& aFileName, TopoDS_Shape& aShape) { IGESControl_Reader Reader; Standard_Integer status = Reader.ReadFile(aFileName.toAscii().data()); if (status != IFSelect_RetDone) return status; Reader.TransferRoots(); aShape = Reader.OneShape(); return status; }
TEST(IGESImportTestSuite, testImportIGES_1) { Standard_CString aFileName = (Standard_CString) iges_file_1; IGESControl_Reader Reader; int status = Reader.ReadFile(aFileName); ASSERT_EQ(status,IFSelect_RetDone); TopoDS_Shape tdsshape; if ( status == IFSelect_RetDone ) { Reader.TransferRoots(); tdsshape = Reader.OneShape(); } ASSERT_FALSE(tdsshape.IsNull()); }
int main(void) { TopoDS_Shape topoDSShape; IGESControl_Reader igesReader; IFSelect_ReturnStatus returnStatus = igesReader.ReadFile("./TestFiles/circuit-board-pcb-mock-example.snapshot.4/Buoy_Circuitbuoy.igs"); switch(returnStatus){ case IFSelect_RetDone: std::cout << "File read successful" << std::endl; break; default: std::cout << "File read not succesful!" << std::endl; exit(-1); } Standard_Boolean failsonly = Standard_False; IFSelect_PrintCount mode; igesReader.PrintCheckLoad(failsonly,mode); std::cout << "Mode: " << mode << std::endl; Standard_Integer ic = Interface_Static::IVal("read.iges.bspline.continuity"); std::cout << "ic: " << ic << std::endl; //All Entities: Handle_TColStd_HSequenceOfTransient list = igesReader.GiveList(); //All faces: //Handle_TColStd_HSequenceOfTransient list = igesReader.GiveList("iges-faces"); //Translate all entitites in one operation // for (Standard_Integer i = 1; i <= 425; i ++) { // Handle(Standard_Transient) ent = list.; // Standard_Boolean OK = reader.TransferEntity (ent); // } Standard_Integer nbtrans = igesReader.TransferList(list); std::cout << "Number of translations: " << nbtrans << std::endl; Standard_Integer nbs = igesReader.NbShapes(); std::cout << "Number of shapes: " << nbs << std::endl; TopoDS_Shape shape; // for(Standard_Integer i = 1; i <= nbs; i++){ // std::cout << "i: " << i << " ... "; // shape = igesReader.Shape(i); // std::cout << "successful!" << std::endl; // } TopoDS_Shape shape2 = igesReader.OneShape(); StlAPI_Writer stlWriter; stlWriter.Write(shape2, "./circuitBuoy.stl"); return EXIT_SUCCESS; }
SALOME_WNT_EXPORT TopoDS_Shape ImportIGES (const TCollection_AsciiString& theFileName, const TCollection_AsciiString& theFormatName, TCollection_AsciiString& theError, const TDF_Label& theShapeLabel) { IGESControl_Reader aReader; TopoDS_Shape aResShape; Interface_Static::SetCVal("xstep.cascade.unit","M"); try { IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString()); if (status == IFSelect_RetDone) { if( theFormatName == "IGES_UNIT" ) { Handle(IGESData_IGESModel) aModel = Handle(IGESData_IGESModel)::DownCast(aReader.Model()); gp_Pnt P(1.0,0.0,0.0); if(!aModel.IsNull()) { Handle(TCollection_HAsciiString) aUnitName = aModel->GlobalSection().UnitName(); //cout<<"aUnitName = "<<aUnitName->ToCString()<<endl; //cout<<"aUnitFlag = "<<aModel->GlobalSection().UnitFlag()<<endl; if( aUnitName->String()=="MM" ) { P = gp_Pnt(0.001,0.0,0.0); } else if( aUnitName->String()=="CM" ) { P = gp_Pnt(0.01,0.0,0.0); } } BRep_Builder B; TopoDS_Vertex V; B.MakeVertex(V,P,1.e-7); aResShape = V; return aResShape; } if( theFormatName == "IGES_SCALE" ) { //cout<<"need re-scale a model"<<endl; // set UnitFlag to 'meter' Handle(IGESData_IGESModel) aModel = Handle(IGESData_IGESModel)::DownCast(aReader.Model()); if(!aModel.IsNull()) { IGESData_GlobalSection aGS = aModel->GlobalSection(); aGS.SetUnitFlag(6); aModel->SetGlobalSection(aGS); } } MESSAGE("ImportIGES : all Geometry Transfer"); //OCC 5.1.2 porting // aReader.Clear(); // aReader.TransferRoots(false); aReader.ClearShapes(); aReader.TransferRoots(); MESSAGE("ImportIGES : count of shapes produced = " << aReader.NbShapes()); aResShape = aReader.OneShape(); // BEGIN: Store names of sub-shapes from file Handle(Interface_InterfaceModel) Model = aReader.WS()->Model(); Handle(XSControl_TransferReader) TR = aReader.WS()->TransferReader(); if (!TR.IsNull()) { Handle(Transfer_TransientProcess) TP = /*TransientProcess();*/TR->TransientProcess(); Standard_Integer nb = Model->NbEntities(); for (Standard_Integer i = 1; i <= nb; i++) { Handle(IGESData_IGESEntity) ent = Handle(IGESData_IGESEntity)::DownCast(Model->Value(i)); if (ent.IsNull() || ! ent->HasName()) continue; // find target shape Handle(Transfer_Binder) binder = TP->Find(ent); if (binder.IsNull()) continue; TopoDS_Shape S = TransferBRep::ShapeResult(binder); if (S.IsNull()) continue; // create label and set shape TDF_Label L; TDF_TagSource aTag; L = aTag.NewChild(theShapeLabel); TNaming_Builder tnBuild (L); tnBuild.Generated(S); // set a name TCollection_AsciiString string = ent->NameValue()->String(); string.LeftAdjust(); string.RightAdjust(); TCollection_ExtendedString str (string); TDataStd_Name::Set(L, str); } } // 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 aResShape; }
bool CShape::ImportSolidsFile(const wxChar* filepath, std::map<int, CShapeData> *index_map, HeeksObj* paste_into) { // only allow paste of solids at top level or to groups if(paste_into && paste_into->GetType() != GroupType)return false; // returns true, if suffix handled wxString wf(filepath); HeeksObj* add_to = &wxGetApp(); if(paste_into)add_to = paste_into; if(wf.EndsWith(_T(".stp")) || wf.EndsWith(_T(".STP")) || wf.EndsWith(_T(".step")) || wf.EndsWith(_T(".STEP"))) { char oldlocale[1000]; strcpy(oldlocale, setlocale(LC_NUMERIC, "C")); Standard_CString aFileName = (Standard_CString) (Ttc(filepath)); STEPControl_Reader Reader; int status = Reader.ReadFile( aFileName ); if ( status == IFSelect_RetDone ) { int num = Reader.NbRootsForTransfer(); for(int i = 1; i<=num; i++) { Handle_Standard_Transient root = Reader.RootForTransfer(i); Reader.TransferEntity(root); TopoDS_Shape rShape = Reader.Shape(i); if(index_map) { // change the id ( and any other data ), to the one in the step file index std::map<int, CShapeData>::iterator FindIt = index_map->find(i); if(FindIt != index_map->end()) { CShapeData& shape_data = FindIt->second; HeeksObj* new_object = MakeObject(rShape, _("STEP solid"), shape_data.m_solid_type, HeeksColor(191, 191, 191), 1.0f); if(new_object) { add_to->Add(new_object, NULL); shape_data.SetShape((CShape*)new_object); } } } else { HeeksObj* new_object = MakeObject(rShape, _("STEP solid"), SOLID_TYPE_UNKNOWN, HeeksColor(191, 191, 191), 1.0f); add_to->Add(new_object, NULL); } } } else{ wxMessageBox(_("STEP import not done!")); } setlocale(LC_NUMERIC, oldlocale); return true; } else if(wf.EndsWith(_T(".igs")) || wf.EndsWith(_T(".IGS")) || wf.EndsWith(_T(".iges")) || wf.EndsWith(_T(".IGES"))) { char oldlocale[1000]; strcpy(oldlocale, setlocale(LC_NUMERIC, "C")); Standard_CString aFileName = (Standard_CString) (Ttc(filepath)); // //#ifdef WIN32 //#ifdef UNICODE // // if the const char* filename is different to the original unicode filename, then copy the file to a temporary file with a simple name // if(stricmp(Ctt(aFileName), filepath)) // { // wxStandardPaths standard_paths; // wxFileName path( standard_paths.GetTempDir().c_str(), _("temp_iges.igs")); // copy_file; // to do // m_backup_file_name = path.GetFullPath(); //#endif //#endif IGESControl_Reader Reader; int status = Reader.ReadFile( aFileName ); if ( status == IFSelect_RetDone ) { Reader.TransferRoots(); TopoDS_Shape shape = Reader.OneShape(); HeeksObj* new_object = MakeObject(shape, _("IGES shape"), SOLID_TYPE_UNKNOWN, HeeksColor(191, 191, 191), 1.0f); add_to->Add(new_object, NULL); #if 0 Reader.TransferRoots(); int num_shapes = Reader.NbShapes(); if(num_shapes > 0) { BRepOffsetAPI_Sewing face_sewing (0.001); int shapes_added_for_sewing = 0; for(int j = 1; j<= num_shapes; j++) { TopoDS_Shape rShape = Reader.Shape(j); if(rShape.ShapeType() == TopAbs_EDGE) { HeeksObj* new_object = new CEdge(TopoDS::Edge(rShape)); add_to->Add(new_object, NULL); } else { face_sewing.Add (rShape); shapes_added_for_sewing++; } } if(shapes_added_for_sewing > 0) { face_sewing.Perform (); if(!face_sewing.SewedShape().IsNull()) { HeeksObj* new_object = MakeObject(face_sewing.SewedShape(), _("sewed IGES solid"), SOLID_TYPE_UNKNOWN, HeeksColor(191, 191, 191)); add_to->Add(new_object, NULL); } } } #endif } else{ wxMessageBox(_("IGES import not done!")); } setlocale(LC_NUMERIC, oldlocale); return true; } else if(wf.EndsWith(_T(".brep")) || wf.EndsWith(_T(".BREP"))) { char oldlocale[1000]; strcpy(oldlocale, setlocale(LC_NUMERIC, "C")); TopoDS_Shape shape; BRep_Builder builder; Standard_Boolean result = BRepTools::Read( shape,(char *) Ttc(filepath), builder ); if(result) { HeeksObj* new_object = MakeObject(shape, _("BREP solid"), SOLID_TYPE_UNKNOWN, HeeksColor(191, 191, 191), 1.0f); add_to->Add(new_object, NULL); } else{ wxMessageBox(_("STEP import not done!")); } setlocale(LC_NUMERIC, oldlocale); return true; } return false; }
void loadIGES(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; IGESControl_Controller::Init(); Message_MsgFile::LoadFromEnv("CSF_XSMessage","IGES"); Message_MsgFile::LoadFromEnv("CSF_SHMessageStd","SHAPEStd"); IGESControl_Reader reader; std::cout << filename << std::endl; reader.ReadFile(filename); reader.PrintCheckLoad(Standard_True,IFSelect_GeneralInfo); Standard_Integer NbRoots = reader.NbRootsForTransfer(); std::cout << "Number of Roots in the IGES File: " << NbRoots << std::endl; Standard_Integer NbTrans = reader.TransferRoots(); std::cout << "IGES 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, 1.0); 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); } } } }
int Part::ImportIgesParts(App::Document *pcDoc, const char* FileName) { try { Base::FileInfo fi(FileName); // read iges file // http://www.opencascade.org/org/forum/thread_20801/ IGESControl_Controller::Init(); Interface_Static::SetIVal("read.surfacecurve.mode",3); // load data exchange message files Message_MsgFile::LoadFromEnv("CSF_XSMessage","IGES"); // load shape healing message files Message_MsgFile::LoadFromEnv("CSF_SHMessageStd","SHAPEStd"); IGESControl_Reader aReader; if (aReader.ReadFile((const Standard_CString)FileName) != IFSelect_RetDone) throw Base::Exception("Error in reading IGES"); // check file conformity and output stats aReader.PrintCheckLoad(Standard_True,IFSelect_GeneralInfo); #if 1 std::string aName = fi.fileNamePure(); Handle_Message_ProgressIndicator pi = new ProgressIndicator(100); pi->NewScope(100, "Reading IGES file..."); pi->Show(); aReader.WS()->MapReader()->SetProgress(pi); // make model aReader.ClearShapes(); Standard_Integer nbRootsForTransfer = aReader.NbRootsForTransfer(); aReader.TransferRoots(); pi->EndScope(); // put all other free-flying shapes into a single compound Standard_Boolean emptyComp = Standard_True; BRep_Builder builder; TopoDS_Compound comp; builder.MakeCompound(comp); Standard_Integer nbShapes = aReader.NbShapes(); for (Standard_Integer i=1; i<=nbShapes; i++) { TopoDS_Shape aShape = aReader.Shape(i); if (!aShape.IsNull()) { if (aShape.ShapeType() == TopAbs_SOLID || aShape.ShapeType() == TopAbs_COMPOUND || aShape.ShapeType() == TopAbs_SHELL) { App::DocumentObject* obj = pcDoc->addObject("Part::Feature", aName.c_str()); static_cast<Part::Feature*>(obj)->Shape.setValue(aShape); } else { builder.Add(comp, aShape); 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); } #else // put all other free-flying shapes into a single compound Standard_Boolean emptyComp = Standard_True; BRep_Builder builder; TopoDS_Compound comp; builder.MakeCompound(comp); // get all entities Handle_TColStd_HSequenceOfTransient aRootList=aReader.GiveList("xst-transferrable-roots"); Base::SequencerLauncher seq("Reading IGES file...", aRootList->Length()); Standard_Integer j; for (j=1; j<=aRootList->Length(); j++) { seq.next(); Handle(IGESData_IGESEntity) igesEntity = Handle(IGESData_IGESEntity)::DownCast(aRootList->Value(j)); if (igesEntity.IsNull()) continue; // clear any old shape aReader.ClearShapes(); #ifdef _DEBUG std::string type = igesEntity->DynamicType()->Name(); (void)type; #endif // is it a group, singular sub-figure or solid? if (igesEntity->IsKind(STANDARD_TYPE(IGESBasic_Group)) || igesEntity->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure)) || igesEntity->IsKind(STANDARD_TYPE(IGESSolid_ManifoldSolid))) { try { if (aReader.TransferEntity(igesEntity)) { if (aReader.NbShapes()>0) { // get the shape std::string aName = fi.fileNamePure(); if (igesEntity->HasShortLabel()) { Handle(TCollection_HAsciiString) aLabel=igesEntity->ShortLabel(); aName = aLabel->ToCString(); } TopoDS_Shape aShape=aReader.OneShape(); App::DocumentObject* obj = pcDoc->addObject("Part::Feature", aName.c_str()); obj->Label.setValue(aName); static_cast<Part::Feature*>(obj)->Shape.setValue(aShape); int iColor; if (igesEntity->RankColor()>-1) { iColor = igesEntity->RankColor(); } } } } catch (Standard_Failure) { } } // normal shapes else { try { if (aReader.TransferEntity(igesEntity)) { if (aReader.NbShapes()>0) { TopoDS_Shape aShape=aReader.OneShape(); builder.Add(comp, aShape); emptyComp = Standard_False; } } } catch (Standard_Failure) { } } } 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); } #endif } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); throw Base::Exception(aFail->GetMessageString()); } return 0; }
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; }