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; }
Standard_Boolean ShHealOper_RemoveFace::removeFaces(const TopoDS_Solid& theShape, TopoDS_Shape& theNewShape) { Standard_Boolean isDone = Standard_False; TopoDS_Solid aSol; BRep_Builder aB; aB.MakeSolid(aSol); TopoDS_Compound aComp; aB.MakeCompound(aComp); Standard_Boolean isAddSol = Standard_False, isAddComp = Standard_False; //firslty faces will be deleted from each shell. TopoDS_Iterator aItSol(theShape,Standard_False); for( ; aItSol.More(); aItSol.Next()) { TopoDS_Shape aSh = aItSol.Value(); TopoDS_Shape aNewShape; if(removeFaces(aSh,aNewShape)) isDone = Standard_True; if(aNewShape.IsNull()) continue; else if(aNewShape.ShapeType() == TopAbs_SHELL ) { aB.Add(aSol,aNewShape); isAddSol = Standard_True; } else { aB.Add(aComp,aNewShape); isAddComp = Standard_True; } } if(isDone) { //for getting correct solids class ShapeFix_Solid will be used. if(isAddSol) { Handle(ShapeFix_Solid) aSfSol = new ShapeFix_Solid(aSol); aSfSol->FixShellMode()= Standard_False; aSfSol->Perform(); TopoDS_Shape aresSol = aSfSol->Shape(); if(!isAddComp) theNewShape = aresSol; else aB.Add(aComp,aresSol); } else if(isAddComp) theNewShape = aComp; else theNewShape.Nullify(); } else theNewShape = theShape; return isDone; }
bool IfcGeom::Kernel::convert(const IfcSchema::IfcExtrudedAreaSolid* l, TopoDS_Shape& shape) { const double height = l->Depth() * getValue(GV_LENGTH_UNIT); if (height < getValue(GV_PRECISION)) { Logger::Message(Logger::LOG_ERROR, "Non-positive extrusion height encountered for:", l->entity); return false; } TopoDS_Shape face; if ( !convert_face(l->SweptArea(),face) ) return false; gp_Trsf trsf; IfcGeom::Kernel::convert(l->Position(),trsf); gp_Dir dir; convert(l->ExtrudedDirection(),dir); shape.Nullify(); if (face.ShapeType() == TopAbs_COMPOUND) { // For compounds (most likely the result of a IfcCompositeProfileDef) // create a compound solid shape. TopExp_Explorer exp(face, TopAbs_FACE); TopoDS_CompSolid compound; BRep_Builder builder; builder.MakeCompSolid(compound); int num_faces_extruded = 0; for (; exp.More(); exp.Next(), ++num_faces_extruded) { builder.Add(compound, BRepPrimAPI_MakePrism(exp.Current(), height*dir)); } if (num_faces_extruded) { shape = compound; } } if (shape.IsNull()) { shape = BRepPrimAPI_MakePrism(face, height*dir); } // IfcSweptAreaSolid.Position (trsf) is an IfcAxis2Placement3D // and therefore has a unit scale factor shape.Move(trsf); return ! shape.IsNull(); }
bool ChCascadeDoc::GetNamedShape(TopoDS_Shape& mshape, char* name, bool set_location_to_root, bool get_multiple) { callback_CascadeDoc_getnamed aselector(name); this->ScanCascadeShapes(aselector); if (aselector.res_found) { if (get_multiple) mshape = aselector.res_comp; else mshape = aselector.res_shape; return true; } else { mshape.Nullify(); return false; } }
Standard_Boolean ShHealOper_RemoveFace::removeFaces(const TopoDS_Shell& theShell, TopoDS_Shape& theNewShape) { Standard_Boolean aIsRemove = Standard_False; //TopoDS_Shape aShape = myReShape->Apply(theShape); //removing faces from shell. TopoDS_Iterator aIterFaces(theShell,Standard_False); for(; aIterFaces.More() && myMapFaces.Extent(); aIterFaces.Next()) { if(!myMapFaces.Contains(aIterFaces.Value())) continue; TopoDS_Face aFace = TopoDS::Face( aIterFaces.Value()); removePCurve(aFace); aIsRemove = Standard_True; myContext->Remove(aFace); myMapFaces.Remove(aFace); } if(aIsRemove) { TopoDS_Shape aNewShape = myContext->Apply(theShell); //avoiding empty shell and shell containing one face. TopoDS_Shape aresShape = getResultShell(aNewShape); if(aresShape.IsNull()) { myContext->Remove(aNewShape); theNewShape.Nullify(); } else if(aresShape.ShapeType() == TopAbs_FACE) { myContext->Replace(aNewShape,aresShape); theNewShape = aresShape; } else if(aresShape.ShapeType() == TopAbs_SHELL) { //obtaining correct shell or compound with help class ShapeFix_Shell. Standard_Boolean isManifShell = isManifold(theShell); Handle(ShapeFix_Shell) aFixShell = new ShapeFix_Shell; aFixShell->FixFaceOrientation(TopoDS::Shell(aresShape),Standard_True,!isManifShell); TopoDS_Shape aFixShape = aFixShell->Shape(); TopoDS_Shape areplShape; isReplace(aFixShape,areplShape); myContext->Replace(aNewShape,areplShape); theNewShape = areplShape; } } else theNewShape = theShell; return aIsRemove; }
bool IfcGeom::Kernel::convert(const IfcSchema::IfcExtrudedAreaSolid* l, TopoDS_Shape& shape) { TopoDS_Shape face; if ( !convert_face(l->SweptArea(),face) ) return false; const double height = l->Depth() * getValue(GV_LENGTH_UNIT); gp_Trsf trsf; IfcGeom::Kernel::convert(l->Position(),trsf); gp_Dir dir; convert(l->ExtrudedDirection(),dir); shape.Nullify(); if (face.ShapeType() == TopAbs_COMPOUND) { // For compounds (most likely the result of a IfcCompositeProfileDef) // create a compound solid shape. TopExp_Explorer exp(face, TopAbs_FACE); TopoDS_CompSolid compound; BRep_Builder builder; builder.MakeCompSolid(compound); int num_faces_extruded = 0; for (; exp.More(); exp.Next(), ++num_faces_extruded) { builder.Add(compound, BRepPrimAPI_MakePrism(exp.Current(), height*dir)); } if (num_faces_extruded) { shape = compound; } } if (shape.IsNull()) { shape = BRepPrimAPI_MakePrism(face, height*dir); } shape.Move(trsf); return ! shape.IsNull(); }
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 GraphicImporter::import() { bool success = false; if ( m_fileName.empty() ) { TopoDS_Shape shape; if ( m_shapeName.compare( "cube" ) == 0 ) { shape = OCCPartFactory::makeCube( 10, 10, 10 ); } if ( m_shapeName.compare( "cylinder" ) == 0 ) { shape = OCCPartFactory::makeCylinder( 5, 10 ); } if ( m_shapeName.compare( "bottle" ) == 0 ) { try { shape = OCCPartFactory::makeBottle( 50, 70, 30 ); } catch ( Standard_ConstructionError ) { shape.Nullify(); display_message( WARNING_MESSAGE, "Houston, we have a problem with the bottle" ); } } m_transformer->mapShape( shape ); if ( !shape.IsNull() ) success = true; } else { FileImportExport::FileFormat format = FileImportExport::FormatUnknown; FileImportExport reader; if ( m_fileName.rfind( ".brep" ) != std::string::npos || m_fileName.rfind( ".rle" ) != std::string::npos ) { format = FileImportExport::FormatBREP; } else if ( m_fileName.rfind( ".step" ) != std::string::npos || m_fileName.rfind( ".stp" ) != std::string::npos ) { format = FileImportExport::FormatSTEP; } else if ( m_fileName.rfind( ".iges" ) != std::string::npos || m_fileName.rfind( ".igs" ) != std::string::npos ) { format = FileImportExport::FormatIGES; } clock_t start, end; start = clock(); Handle_TopTools_HSequenceOfShape shapes; if ( reader.readModel( m_fileName, format ) ) { end = clock(); printf( "File read took %.2f seconds\n", ( end - start ) / double( CLOCKS_PER_SEC ) ); start = clock(); if ( reader.hasXDEInformation() ) m_transformer->mapShapes( reader.xDEInformation() ); else m_transformer->mapShapes( reader.sequenceOfShapes() ); end = clock(); printf( "Shape mapping took %.2f seconds\n", ( end - start ) / double( CLOCKS_PER_SEC ) ); success = true; } } return success; }
void mrb_siren_shape_final(mrb_state* mrb, void* p) { TopoDS_Shape* s = static_cast<TopoDS_Shape*>(p); s->Nullify(); }
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; }
Standard_Boolean ShHealOper_RemoveFace::removeFaces(const TopoDS_Shape& theShape, TopoDS_Shape& theNewShape) { Standard_Boolean isDone = Standard_False; TopAbs_ShapeEnum aType = theShape.ShapeType(); theNewShape = theShape; if(!myMapFaces.Extent()) return isDone; if( aType == TopAbs_WIRE || aType == TopAbs_EDGE || aType == TopAbs_VERTEX) return isDone; if(aType == TopAbs_FACE && myMapFaces.Contains(theShape)) { removePCurve(TopoDS::Face(theShape)); myContext->Remove(theShape); myMapFaces.Remove(theShape); //theNewShape = TopoDS_Shape(); theNewShape.Nullify(); isDone = Standard_True; } else if(aType == TopAbs_SHELL) { isDone = removeFaces(TopoDS::Shell(theShape),theNewShape); return isDone; } else if(aType == TopAbs_SOLID) { isDone = removeFaces(TopoDS::Solid(theShape),theNewShape); myContext->Replace(theShape,theNewShape); } else if(aType == TopAbs_COMPSOLID) { //in the case of compsolid method for removing faces for solid //will be used. TopExp_Explorer aExpShell(theShape,TopAbs_SHELL); TopoDS_Solid aSol; BRep_Builder aB; aB.MakeSolid(aSol); for( ; aExpShell.More(); aExpShell.Next()) { aB.Add(aSol,aExpShell.Current()); } TopoDS_Shape aNewShape; isDone = removeFaces(aSol,aNewShape); if(isDone) myContext->Replace(theShape,theNewShape); } else if(aType == TopAbs_COMPOUND) { //in the case of compounf faces will be removed from each part of compound separately TopoDS_Compound aComp; TopoDS_Iterator aItShape(theShape,Standard_False); BRep_Builder aB; aB.MakeCompound(aComp); Standard_Integer nbs =0; for( ; aItShape.More() ; aItShape.Next()) { TopoDS_Shape aNShape; if( removeFaces(aItShape.Value(),aNShape)) { isDone = Standard_True; myContext->Replace(aItShape.Value(),aNShape); } if(!aNShape.IsNull()) { aB.Add(aComp,aNShape); nbs++; } } if(isDone) { if(nbs) theNewShape = aComp; else theNewShape =TopoDS_Shape(); myContext->Replace(theShape,theNewShape); } } return isDone; }
//---------------------------------------------------------------- // Function: TopoDS_Shape level function to update the core Body // for any Boolean operation of the body. // Author: Jane Hu //---------------------------------------------------------------- CubitStatus OCCBody::update_OCC_entity(TopoDS_Shape& old_shape, TopoDS_Shape& new_shape, BRepBuilderAPI_MakeShape *op, LocOpe_SplitShape* sp) { //set the Shells TopTools_IndexedMapOfShape M; TopExp::MapShapes(old_shape, TopAbs_SOLID, M); TopTools_IndexedMapOfShape M_new; TopExp::MapShapes(new_shape, TopAbs_SOLID, M_new); TopTools_ListOfShape shapes; TopoDS_Shape shape; CubitBoolean updated = CUBIT_FALSE; if(!old_shape.IsNull() && old_shape.ShapeType() == TopAbs_COMPOUND && !new_shape.IsNull() && new_shape.ShapeType() == TopAbs_COMPOUND && !old_shape.IsSame(new_shape)) { //By updating underling solids, shells etc., the old_shape will get changed. //trying to make sure the the number of each entity in the old and new //shapes are the same, which means that nothing is delete, that we can //update the map here. Otherwise, when deleting solids, it'll delete the //the old body and create new body. This is Ok for general boolean operation //except imprint when booleans are called, usually the original body are // supposed to be kept. updated = CUBIT_TRUE; OCCQueryEngine::instance()->update_OCC_map(old_shape, new_shape); } DLIList<int> new_solid_nums; DLIList<int> unfound_nums; for(int ii=1; ii<=M.Extent(); ii++) { TopoDS_Solid solid = TopoDS::Solid(M(ii)); TopTools_ListOfShape shapes; if(op) { shapes.Assign(op->Modified(solid)); if(shapes.Extent() == 0) shapes.Assign(op->Generated(solid)); } else if(sp) shapes.Assign(sp->DescendantShapes(solid)); if (shapes.Extent() == 1) shape = shapes.First(); else if(shapes.Extent() > 1) { //update all attributes first. TopTools_ListIteratorOfListOfShape it; it.Initialize(shapes); for(; it.More(); it.Next()) { shape = it.Value(); OCCQueryEngine::instance()->copy_attributes(solid, shape); } shape = shapes.First(); } else if(op->IsDeleted(solid)) { if (M_new.Extent()== 1 && ii == 1) shape = M_new(1); else if(M_new.Extent()== 1 && ii > 1) shape.Nullify(); else if(M_new.Extent() > 1) { GProp_GProps myProps; BRepGProp::VolumeProperties(solid, myProps); double bf_mass = myProps.Mass(); gp_Pnt old_center = myProps.CentreOfMass(); CubitBoolean found = CUBIT_FALSE; for(int l = 1; l <= M_new.Extent(); l++) { BRepGProp::VolumeProperties(M_new(l), myProps); double af_mass = myProps.Mass(); double dTol = OCCQueryEngine::instance()->get_sme_resabs_tolerance(); if(fabs(bf_mass-af_mass) < dTol) //unchanged { gp_Pnt new_center = myProps.CentreOfMass(); if(new_center.IsEqual(old_center, dTol)) { found = CUBIT_TRUE; shape = M_new(l); new_solid_nums.append(l); break; } } } if(!found) { unfound_nums.append(ii); continue; } } else shape.Nullify(); } else { shape = solid; continue; } if(shapes.Extent() > 0 || (op && op->IsDeleted(solid))) OCCLump::update_OCC_entity(solid, shape, op, sp); } if( unfound_nums.size() == 1 ) { TopoDS_Solid solid = TopoDS::Solid(M(unfound_nums.get())); for(int kk = 1; kk <= M_new.Extent(); kk++) { if(!new_solid_nums.move_to(kk)) { shape = M_new(kk); break; } } OCCLump::update_OCC_entity(solid, shape, op, sp); } else if(unfound_nums.size() > 1) { shape.Nullify(); for(int kk = 1; kk <=unfound_nums.size(); kk++) { TopoDS_Solid solid = TopoDS::Solid(M(unfound_nums.get_and_step())); OCCLump::update_OCC_entity(solid, shape, op, sp); } } if(!old_shape.IsSame(new_shape) && !updated) OCCQueryEngine::instance()->update_OCC_map(old_shape, new_shape); return CUBIT_SUCCESS; }
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; }