void OccView::unhilight(TDF_Label label) { if(label.IsNull()) return; Handle(TPrsStd_AISPresentation) prs; if (label.FindAttribute(TPrsStd_AISPresentation::GetID(), prs)) m_document->context()->Unhilight(prs->GetAIS()); }
//======================================================================= //function : Execute //purpose : //======================================================================= Standard_Integer GEOM_SubShapeDriver::Execute(TFunction_Logbook& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); GEOM_ISubShape aCI (aFunction); TDF_Label aLabel = aCI.GetMainShape()->GetOwnerEntry(); if (aLabel.IsRoot()) return 0; Handle(GEOM_Object) anObj = GEOM_Object::GetObject(aLabel); if (anObj.IsNull()) return 0; TopoDS_Shape aMainShape = anObj->GetValue(); if (aMainShape.IsNull()) return 0; Handle(TColStd_HArray1OfInteger) anIndices = aCI.GetIndices(); if (anIndices.IsNull() || anIndices->Length() <= 0) return 0; BRep_Builder B; TopoDS_Compound aCompound; TopoDS_Shape aShape; if (anIndices->Length() == 1 && anIndices->Value(1) == -1) { //The empty sub-shape B.MakeCompound(aCompound); aShape = aCompound; } else { TopTools_IndexedMapOfShape aMapOfShapes; TopExp::MapShapes(aMainShape, aMapOfShapes); if (anIndices->Length() > 1) { B.MakeCompound(aCompound); for (int i = anIndices->Lower(); i <= anIndices->Upper(); i++) { if (aMapOfShapes.Extent() < anIndices->Value(i)) Standard_NullObject::Raise("GEOM_SubShapeDriver::Execute: Index is out of range"); TopoDS_Shape aSubShape = aMapOfShapes.FindKey(anIndices->Value(i)); if (aSubShape.IsNull()) continue; B.Add(aCompound,aSubShape); } aShape = aCompound; } else { int i = anIndices->Lower(); if (aMapOfShapes.Extent() < anIndices->Value(i)) Standard_NullObject::Raise("GEOM_SubShapeDriver::Execute: Index is out of range"); aShape = aMapOfShapes.FindKey(anIndices->Value(i)); } } if (aShape.IsNull()) return 0; aFunction->SetValue(aShape); log.SetTouched(Label()); return 1; }
//------------------------------------------------------------------------------ Handle(Sketcher_Object) Sketcher_Object::GetObject(TDF_Label& theLabel) { if (!theLabel.IsAttribute(GetObjectID())) return NULL; TCollection_AsciiString anEntry; TDF_Tool::Entry(theLabel, anEntry); Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(theLabel.Data()); if (aDoc.IsNull()) return NULL; return new Sketcher_Object(theLabel); }
//------------------------------------------------------------------------------ Sketcher_Object::Sketcher_Object(const TDF_Label& theEntry) :_Ax3(gp::XOY()) { if (theEntry.IsAttribute(GetObjectID())) _label = theEntry; else Standard_Failure::Raise("Label does not contain a valid Sketcher_Object"); }
// add a component at the given position and orientation bool PCBMODEL::AddComponent( const std::string& aFileName, const std::string aRefDes, bool aBottom, DOUBLET aPosition, double aRotation, TRIPLET aOffset, TRIPLET aOrientation ) { // first retrieve a label TDF_Label lmodel; if( !getModelLabel( aFileName, lmodel ) ) { std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * no model for filename '" << aFileName << "'\n"; wxLogMessage( "%s\n", ostr.str().c_str() ); return false; } // calculate the Location transform TopLoc_Location toploc; if( !getModelLocation( aBottom, aPosition, aRotation, aOffset, aOrientation, toploc ) ) { std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * no location data for filename '" << aFileName << "'\n"; wxLogMessage( "%s\n", ostr.str().c_str() ); return false; } // add the located sub-assembly TDF_Label llabel = m_assy->AddComponent( m_assy_label, lmodel, toploc ); if( llabel.IsNull() ) { std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * could not add component with filename '" << aFileName << "'\n"; wxLogMessage( "%s\n", ostr.str().c_str() ); return false; } // attach the RefDes name TCollection_ExtendedString refdes( aRefDes.c_str() ); TDataStd_Name::Set( llabel, refdes ); return true; }
void OccView::hilight(TDF_Label label) { if (m_detectedLabel != label) unhilight(m_detectedLabel); Handle(TPrsStd_AISPresentation) prs; if (label.FindAttribute(TPrsStd_AISPresentation::GetID(), prs)) { m_document->context()->Hilight(prs->GetAIS()); m_detectedLabel = label; } }
//======================================================================= //function : Execute //purpose : //======================================================================= Standard_Integer GEOMImpl_ScaleDriver::Execute(TFunction_Logbook& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); GEOMImpl_IScale aCI (aFunction); Standard_Integer aType = aFunction->GetType(); TopoDS_Shape aShape; if (aType == SCALE_SHAPE || aType == SCALE_SHAPE_COPY) { Handle(GEOM_Function) aRefShape = aCI.GetShape(); TopoDS_Shape aShapeBase = aRefShape->GetValue(); if (aShapeBase.IsNull()) return 0; gp_Pnt aP (0,0,0); Handle(GEOM_Function) aRefPoint = aCI.GetPoint(); if (!aRefPoint.IsNull()) { TopoDS_Shape aShapePnt = aRefPoint->GetValue(); if (aShapePnt.IsNull()) return 0; if (aShapePnt.ShapeType() != TopAbs_VERTEX) return 0; aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); } // Bug 6839: Check for standalone (not included in faces) degenerated edges TopTools_IndexedDataMapOfShapeListOfShape aEFMap; TopExp::MapShapesAndAncestors(aShapeBase, TopAbs_EDGE, TopAbs_FACE, aEFMap); Standard_Integer i, nbE = aEFMap.Extent(); for (i = 1; i <= nbE; i++) { TopoDS_Shape anEdgeSh = aEFMap.FindKey(i); if (BRep_Tool::Degenerated(TopoDS::Edge(anEdgeSh))) { const TopTools_ListOfShape& aFaces = aEFMap.FindFromIndex(i); if (aFaces.IsEmpty()) Standard_ConstructionError::Raise ("Scaling aborted : cannot scale standalone degenerated edge"); } } // Perform Scaling gp_Trsf aTrsf; aTrsf.SetScale(aP, aCI.GetFactor()); BRepBuilderAPI_Transform aBRepTrsf (aShapeBase, aTrsf, Standard_False); aShape = aBRepTrsf.Shape(); } else if (aType == SCALE_SHAPE_AFFINE || aType == SCALE_SHAPE_AFFINE_COPY) { Handle(GEOM_Function) aRefShape = aCI.GetShape(); Handle(GEOM_Function) aRefVector = aCI.GetVector(); TopoDS_Shape aShapeBase = aRefShape->GetValue(); TopoDS_Shape aShapeVector = aRefVector->GetValue(); if (aShapeBase.IsNull() || aShapeVector.IsNull()) return 0; if (aShapeVector.ShapeType() != TopAbs_EDGE) return 0; TopoDS_Edge anEdgeVector = TopoDS::Edge(aShapeVector); // Bug 6839: Check for standalone (not included in faces) degenerated edges TopTools_IndexedDataMapOfShapeListOfShape aEFMap; TopExp::MapShapesAndAncestors(aShapeBase, TopAbs_EDGE, TopAbs_FACE, aEFMap); Standard_Integer i, nbE = aEFMap.Extent(); for (i = 1; i <= nbE; i++) { TopoDS_Shape anEdgeSh = aEFMap.FindKey(i); if (BRep_Tool::Degenerated(TopoDS::Edge(anEdgeSh))) { const TopTools_ListOfShape& aFaces = aEFMap.FindFromIndex(i); if (aFaces.IsEmpty()) Standard_ConstructionError::Raise ("Scaling aborted : cannot scale standalone degenerated edge"); } } //Get axis gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdgeVector)); gp_Pnt aP2 = BRep_Tool::Pnt(TopExp::LastVertex(anEdgeVector)); gp_Dir aDir(gp_Vec(aP1, aP2)); gp_Ax2 anAx2(aP1, aDir); // Perform Scaling gp_GTrsf aGTrsf; aGTrsf.SetAffinity(anAx2, aCI.GetFactor()); BRepBuilderAPI_GTransform aBRepGTrsf(aShapeBase, aGTrsf, Standard_False); aShape = aBRepGTrsf.Shape(); } else if (aType == SCALE_SHAPE_AXES || aType == SCALE_SHAPE_AXES_COPY) { Handle(GEOM_Function) aRefShape = aCI.GetShape(); TopoDS_Shape aShapeBase = aRefShape->GetValue(); if (aShapeBase.IsNull()) return 0; bool isP = false; gp_Pnt aP (0,0,0); Handle(GEOM_Function) aRefPoint = aCI.GetPoint(); if (!aRefPoint.IsNull()) { TopoDS_Shape aShapePnt = aRefPoint->GetValue(); if (aShapePnt.IsNull()) return 0; if (aShapePnt.ShapeType() != TopAbs_VERTEX) return 0; aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); isP = true; } // Bug 6839: Check for standalone (not included in faces) degenerated edges TopTools_IndexedDataMapOfShapeListOfShape aEFMap; TopExp::MapShapesAndAncestors(aShapeBase, TopAbs_EDGE, TopAbs_FACE, aEFMap); Standard_Integer i, nbE = aEFMap.Extent(); for (i = 1; i <= nbE; i++) { TopoDS_Shape anEdgeSh = aEFMap.FindKey(i); if (BRep_Tool::Degenerated(TopoDS::Edge(anEdgeSh))) { const TopTools_ListOfShape& aFaces = aEFMap.FindFromIndex(i); if (aFaces.IsEmpty()) Standard_ConstructionError::Raise ("Scaling aborted : cannot scale standalone degenerated edge"); } } // Perform Scaling gp_GTrsf aGTrsf; gp_Mat rot (aCI.GetFactorX(), 0, 0, 0, aCI.GetFactorY(), 0, 0, 0, aCI.GetFactorZ()); aGTrsf.SetVectorialPart(rot); if (isP) { gp_Pnt anO (0,0,0); if (anO.Distance(aP) > Precision::Confusion()) { gp_GTrsf aGTrsfP0; aGTrsfP0.SetTranslationPart(anO.XYZ() - aP.XYZ()); gp_GTrsf aGTrsf0P; aGTrsf0P.SetTranslationPart(aP.XYZ()); //aGTrsf = aGTrsf0P * aGTrsf * aGTrsfP0; aGTrsf = aGTrsf0P.Multiplied(aGTrsf); aGTrsf = aGTrsf.Multiplied(aGTrsfP0); } } BRepBuilderAPI_GTransform aBRepGTrsf (aShapeBase, aGTrsf, Standard_False); if (!aBRepGTrsf.IsDone()) Standard_ConstructionError::Raise("Scaling not done"); aShape = aBRepGTrsf.Shape(); } else { } if (aShape.IsNull()) return 0; // Check shape validity BRepCheck_Analyzer ana (aShape, false); if (!ana.IsValid()) { ShapeFix_ShapeTolerance aSFT; aSFT.LimitTolerance(aShape,Precision::Confusion(),Precision::Confusion()); Handle(ShapeFix_Shape) aSfs = new ShapeFix_Shape(aShape); aSfs->SetPrecision(Precision::Confusion()); aSfs->Perform(); aShape = aSfs->Shape(); ana.Init(aShape, Standard_False); if (!ana.IsValid()) { Standard_CString anErrStr("Scaling aborted : non valid shape result"); #ifdef THROW_ON_INVALID_SH Standard_ConstructionError::Raise(anErrStr); #else MESSAGE(anErrStr); //further processing can be performed here //... //in case of failure of automatic treatment //mark the corresponding GEOM_Object as problematic TDF_Label aLabel = aFunction->GetOwnerEntry(); if (!aLabel.IsRoot()) { Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel); if (!aMainObj.IsNull()) aMainObj->SetDirty(Standard_True); } #endif } } aFunction->SetValue(aShape); log.SetTouched(Label()); return 1; }
static bool recurse_CascadeDoc(TDF_Label label, Handle_XCAFDoc_ShapeTool& shapeTool, TopLoc_Location& parentloc, int level, ChCascadeDoc::callback_CascadeDoc& mcallback) { TDF_LabelSequence child_labels; Standard_Boolean is_assembly; is_assembly = shapeTool->GetComponents(label, child_labels, 0); char mstring[200] = "no name"; Standard_PCharacter mchastr = mstring; // access name Handle_TDataStd_Name N; if (label.FindAttribute(TDataStd_Name::GetID(), N)) { N->Get().ToUTF8CString(mchastr); } TDF_Label reflabel; Standard_Boolean isref = shapeTool->GetReferredShape(label, reflabel); if (isref) // ..maybe it references some shape: the name is stored there... { Handle_TDataStd_Name N; if (reflabel.FindAttribute(TDataStd_Name::GetID(), N)) { N->Get().ToUTF8CString(mchastr); } } TopLoc_Location mloc = shapeTool->GetLocation(label); TopLoc_Location absloc = parentloc.Multiplied(mloc); // access shape and position TopoDS_Shape rShape; rShape = shapeTool->GetShape(label); if (!rShape.IsNull()) { // === call the callback! === if (!mcallback.ForShape(rShape, absloc, mstring, level, label)) return false; // (skip children recursion if returned false) } // Recurse all children !!! if (is_assembly) { for (Standard_Integer j = 1; j <= child_labels.Length(); j++) { TDF_Label clabel = child_labels.Value(j); recurse_CascadeDoc(clabel, shapeTool, absloc, (level + 1), mcallback); } } // If it is a reference, Recurse all children of reference if (isref) { TDF_LabelSequence refchild_labels; Standard_Boolean refis_assembly; refis_assembly = shapeTool->GetComponents(reflabel, refchild_labels, 0); for (Standard_Integer j = 1; j <= refchild_labels.Length(); j++) { TDF_Label clabel = refchild_labels.Value(j); recurse_CascadeDoc(clabel, shapeTool, absloc, (level + 1), mcallback); } } return true; }
//======================================================================= //function : Execute //purpose : //======================================================================= Standard_Integer GEOMImpl_DraftDriver::Execute(TFunction_Logbook& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); if(aFunction.IsNull()) return 0; GEOMImpl_IDraft aCI (aFunction); Standard_Integer aType = aFunction->GetType(); TopoDS_Shape aShape; TopoDS_Shape aPlaneShape; gp_Pln theNeutralPlane; gp_Dir theDirection; Handle(GEOM_Function) aRefShape = aCI.GetShape(); TopoDS_Shape aShapeBase = aRefShape->GetValue(); //get the reference plane and direction if (aType == DRAFT_BY_FACE_PLN_ANG) { Handle(GEOM_Function) aRefPlane = aCI.GetPlane(); if (aRefPlane.IsNull()) return 0; aPlaneShape = aRefPlane->GetValue(); } else if (aType == DRAFT_BY_FACE_STA_ANG) { GEOMImpl_ILocalOperations::GetSubShape(aShapeBase, aCI.GetStationary(), aPlaneShape); } if (aPlaneShape.IsNull() || aPlaneShape.ShapeType() != TopAbs_FACE) return 0; TopoDS_Face aFace = TopoDS::Face(aPlaneShape); Handle(Geom_Surface) surf = BRep_Tool::Surface(aFace); Handle(Geom_Plane) myPlane = Handle(Geom_Plane)::DownCast(surf); theNeutralPlane = myPlane->Pln(); theDirection = theNeutralPlane.Axis().Direction(); //compute the value Standard_Real theAngle = aCI.GetAngle(); int aLen = aCI.GetLength(); int ind = 1; int added = 0; BRepOffsetAPI_DraftAngle aDraft (aShapeBase); for (; ind <= aLen; ind++) { TopoDS_Shape aShapeFace; if (GEOMImpl_ILocalOperations::GetSubShape(aShapeBase, aCI.GetFace(ind), aShapeFace)) { TopoDS_Face aFace = TopoDS::Face(aShapeFace); aDraft.Add(aFace, theDirection, theAngle, theNeutralPlane); if (aDraft.AddDone()) added++; else aDraft.Remove(aFace); } } if (added == 0) StdFail_NotDone::Raise("None of the faces provided can be used for draft algo"); aDraft.Build(); if (!aDraft.IsDone()) { StdFail_NotDone::Raise("Draft can't be computed on the given shape with the given parameters"); } aShape = aDraft.Shape(); if (aShape.IsNull()) return 0; // Check shape validity BRepCheck_Analyzer ana (aShape, false); if (!ana.IsValid()) { Standard_CString anErrStr("Draft algorythm has produced an invalid shape result"); #ifdef THROW_ON_INVALID_SH Standard_ConstructionError::Raise(anErrStr); #else MESSAGE(anErrStr); //further processing can be performed here //... //in case of failure of automatic treatment //mark the corresponding GEOM_Object as problematic TDF_Label aLabel = aFunction->GetOwnerEntry(); if (!aLabel.IsRoot()) { Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel); if (!aMainObj.IsNull()) aMainObj->SetDirty(Standard_True); } #endif } aFunction->SetValue(aShape); log.SetTouched(Label()); return 1; }
bool PCBMODEL::getModelLabel( const std::string aFileName, TDF_Label& aLabel ) { MODEL_MAP::const_iterator mm = m_models.find( aFileName ); if( mm != m_models.end() ) { aLabel = mm->second; return true; } aLabel.Nullify(); Handle( TDocStd_Document ) doc; m_app->NewDocument( "MDTV-XCAF", doc ); FormatType modelFmt = fileType( aFileName.c_str() ); switch( modelFmt ) { case FMT_IGES: if( !readIGES( doc, aFileName.c_str() ) ) { std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * readIGES() failed on filename '" << aFileName << "'\n"; wxLogMessage( "%s\n", ostr.str().c_str() ); return false; } break; case FMT_STEP: if( !readSTEP( doc, aFileName.c_str() ) ) { std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * readSTEP() failed on filename '" << aFileName << "'\n"; wxLogMessage( "%s\n", ostr.str().c_str() ); return false; } break; // TODO: implement IDF and EMN converters default: return false; } aLabel = transferModel( doc, m_doc ); if( aLabel.IsNull() ) { std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * could not transfer model data from file '" << aFileName << "'\n"; wxLogMessage( "%s\n", ostr.str().c_str() ); return false; } // attach the PART NAME ( base filename: note that in principle // different models may have the same base filename ) wxFileName afile( aFileName.c_str() ); std::string pname( afile.GetName().ToUTF8() ); TCollection_ExtendedString partname( pname.c_str() ); TDataStd_Name::Set( aLabel, partname ); m_models.insert( MODEL_DATUM( aFileName, aLabel ) ); ++m_components; return true; }
//======================================================================= //function : Execute //purpose : //======================================================================= Standard_Integer GEOMImpl_PlateDriver::Execute(TFunction_Logbook& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); if(aFunction.IsNull()) return 0; GEOMImpl_IPlate aPI (aFunction); Standard_Integer aType = aFunction->GetType(); TopoDS_Shape aShape; if (aType == PLATE_BY_SHAPES_LIST) { int ind, aLen = aPI.GetLength(); if (aLen < 1) return 0; GeomPlate_BuildPlateSurface aPlate; Handle(GeomPlate_Surface) myPlateSurf; Handle(GEOM_Function) aRefInitialShape = aPI.GetInitialShape(); if (!aRefInitialShape.IsNull()) { TopoDS_Shape anInitialShape = aRefInitialShape->GetValue(); if (!anInitialShape.IsNull() && anInitialShape.ShapeType() == TopAbs_FACE) { aPlate.LoadInitSurface(BRep_Tool::Surface(TopoDS::Face(anInitialShape))); TopExp_Explorer exp (anInitialShape, TopAbs_EDGE); //in case we have an init surface we must pass all of it's edges as constrains for (; exp.More(); exp.Next()) { //otherwise exception is risen from the plate driver BRepAdaptor_Curve aCurve(TopoDS::Edge(exp.Current())); Handle(BRepAdaptor_HCurve) aHCurve = new BRepAdaptor_HCurve(aCurve); Handle(GeomPlate_CurveConstraint) aCrvConstr = new GeomPlate_CurveConstraint(aHCurve, DEFAULT_CONTINUITY); aPlate.Add(aCrvConstr); } } } for (ind = 1; ind <= aLen; ind++) { Handle(GEOM_Function) aRefShape = aPI.GetShape(ind); TopoDS_Shape aShape = aRefShape->GetValue(); if (aShape.ShapeType() == TopAbs_VERTEX) { //case a simple point gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); Handle(GeomPlate_PointConstraint) aPntConstr = new GeomPlate_PointConstraint(aP, DEFAULT_CONTINUITY); aPlate.Add(aPntConstr); } else { TopExp_Explorer exp (aShape, TopAbs_EDGE); //this case treats all cases where edges can be found Standard_Boolean hasEdge = Standard_False; for (; exp.More(); exp.Next()) { BRepAdaptor_Curve aCurve(TopoDS::Edge(exp.Current())); Handle(BRepAdaptor_HCurve) aHCurve = new BRepAdaptor_HCurve(aCurve); Handle(GeomPlate_CurveConstraint) aCrvConstr = new GeomPlate_CurveConstraint(aHCurve, DEFAULT_CONTINUITY); aPlate.Add(aCrvConstr); hasEdge = Standard_True; } if (!hasEdge) { //this case treats a compound of points exp.Init(aShape, TopAbs_VERTEX); for (; exp.More(); exp.Next()) { gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(exp.Current())); Handle(GeomPlate_PointConstraint) aPntConstr = new GeomPlate_PointConstraint(aP, DEFAULT_CONTINUITY); aPlate.Add(aPntConstr); } } } } aPlate.Perform(); if (!aPlate.IsDone()) Standard_ConstructionError::Raise("Plate surface cannot be created using the specific shapes !"); else myPlateSurf = aPlate.Surface(); GeomPlate_MakeApprox aMKS( myPlateSurf, Precision::Approximation(), DEFAULT_Nbmax, DEFAULT_dgmax, DEFAULT_dmax); BRepBuilderAPI_MakeFace MK (aMKS.Surface(), Precision::Confusion()); MK.Build(); if (!MK.IsDone()) Standard_ConstructionError::Raise("Plate topology cannot be created !"); else { aShape = MK.Shape(); BRepCheck_Analyzer ana (aShape, false); if (!ana.IsValid()) { Standard_CString anErrStr("Plate algorithm has produced an invalid shape result"); #ifdef THROW_ON_INVALID_SH Standard_ConstructionError::Raise(anErrStr); #else MESSAGE(anErrStr); //further processing can be performed here //... //in case of failure of automatic treatment //mark the corresponding GEOM_Object as problematic TDF_Label aLabel = aFunction->GetOwnerEntry(); if (!aLabel.IsRoot()) { Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel); if (!aMainObj.IsNull()) aMainObj->SetDirty(Standard_True); } #endif } } } if (aShape.IsNull()) return 0; aFunction->SetValue(aShape); log.SetTouched(Label()); return 1; }
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; }
bool PCBMODEL::getModelLabel( const std::string aFileName, TDF_Label& aLabel ) { MODEL_MAP::const_iterator mm = m_models.find( aFileName ); if( mm != m_models.end() ) { aLabel = mm->second; return true; } aLabel.Nullify(); Handle( TDocStd_Document ) doc; m_app->NewDocument( "MDTV-XCAF", doc ); FormatType modelFmt = fileType( aFileName.c_str() ); switch( modelFmt ) { case FMT_IGES: if( !readIGES( doc, aFileName.c_str() ) ) { std::ostringstream ostr; #ifdef __WXDEBUG__ ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; #endif /* __WXDEBUG */ ostr << " * readIGES() failed on filename '" << aFileName << "'\n"; wxLogMessage( "%s", ostr.str().c_str() ); return false; } break; case FMT_STEP: if( !readSTEP( doc, aFileName.c_str() ) ) { std::ostringstream ostr; #ifdef __WXDEBUG__ ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; #endif /* __WXDEBUG */ ostr << " * readSTEP() failed on filename '" << aFileName << "'\n"; wxLogMessage( "%s", ostr.str().c_str() ); return false; } break; case FMT_WRL: /* WRL files are preferred for internal rendering, * due to superior material properties, etc. * However they are not suitable for MCAD export. * * If a .wrl file is specified, attempt to locate * a replacement file for it. * * If a valid replacement file is found, the label * for THAT file will be associated with the .wrl file * */ { wxFileName wrlName( aFileName ); wxString basePath = wrlName.GetPath(); wxString baseName = wrlName.GetName(); // List of alternate files to look for // Given in order of preference // (Break if match is found) wxArrayString alts; // Step files alts.Add( "stp" ); alts.Add( "step" ); alts.Add( "STP" ); alts.Add( "STEP" ); alts.Add( "Stp" ); alts.Add( "Step" ); // IGES files alts.Add( "iges" ); alts.Add( "IGES" ); alts.Add( "igs" ); alts.Add( "IGS" ); //TODO - Other alternative formats? for( auto alt : alts ) { wxFileName altFile( basePath, baseName + "." + alt ); if( altFile.IsOk() && altFile.FileExists() ) { std::string altFileName = altFile.GetFullPath().ToStdString(); if( getModelLabel( altFileName, aLabel ) ) { return true; } } } } break; // TODO: implement IDF and EMN converters default: return false; } aLabel = transferModel( doc, m_doc ); if( aLabel.IsNull() ) { std::ostringstream ostr; #ifdef __WXDEBUG__ ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; #endif /* __WXDEBUG */ ostr << " * could not transfer model data from file '" << aFileName << "'\n"; wxLogMessage( "%s", ostr.str().c_str() ); return false; } // attach the PART NAME ( base filename: note that in principle // different models may have the same base filename ) wxFileName afile( aFileName.c_str() ); std::string pname( afile.GetName().ToUTF8() ); TCollection_ExtendedString partname( pname.c_str() ); TDataStd_Name::Set( aLabel, partname ); m_models.insert( MODEL_DATUM( aFileName, aLabel ) ); ++m_components; return true; }
//======================================================================= //function : Execute //purpose : //======================================================================= Standard_Integer GEOMImpl_ChamferDriver::Execute(TFunction_Logbook& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); GEOMImpl_IChamfer aCI (aFunction); Standard_Integer aType = aFunction->GetType(); TopoDS_Shape aShape; Handle(GEOM_Function) aRefShape = aCI.GetShape(); TopoDS_Shape aShapeBase = aRefShape->GetValue(); if (aType == CHAMFER_SHAPE_EDGES_2D) { BRepFilletAPI_MakeFillet2d fill; TopoDS_Face aFace; Standard_Boolean aWireFlag = Standard_False; if (aShapeBase.ShapeType() == TopAbs_FACE) aFace = TopoDS::Face(aShapeBase); else if (aShapeBase.ShapeType() == TopAbs_WIRE) { TopoDS_Wire aWire = TopoDS::Wire(aShapeBase); BRepBuilderAPI_MakeFace aMF(aWire); aMF.Build(); if (!aMF.IsDone()) { StdFail_NotDone::Raise("Cannot build initial face from given wire"); } aFace = aMF.Face(); aWireFlag = Standard_True; } else StdFail_NotDone::Raise("Base shape is neither a face or a wire !"); fill.Init(aFace); double aD1_2D = aCI.GetD1(); double aD2_2D = aCI.GetD2(); TopoDS_Shape aShapeFace1, aShapeFace2; if (GEOMImpl_ILocalOperations::GetSubShape(aShapeBase, aCI.Get2DEdge1(), aShapeFace1) && GEOMImpl_ILocalOperations::GetSubShape(aShapeBase, aCI.Get2DEdge2(), aShapeFace2)) { fill.AddChamfer(TopoDS::Edge(aShapeFace1), TopoDS::Edge(aShapeFace2), aD1_2D, aD2_2D); } else StdFail_NotDone::Raise("Cannot get 2d egde from sub-shape index!"); fill.Build(); if (!fill.IsDone()) { StdFail_NotDone::Raise("Chamfer can not be computed on the given shape with the given parameters"); } if (aWireFlag) { BRepBuilderAPI_MakeWire MW; TopExp_Explorer exp (fill.Shape(), TopAbs_EDGE); for (; exp.More(); exp.Next()) MW.Add(TopoDS::Edge(exp.Current())); MW.Build(); if (!MW.IsDone()) StdFail_NotDone::Raise("Resulting wire cannot be built"); aShape = MW.Shape(); } else aShape = fill.Shape(); } else { // Check the shape type. It have to be shell // or solid, or compsolid, or compound of these shapes. if (!isGoodForChamfer(aShapeBase)) { StdFail_NotDone::Raise ("Wrong shape. Must be shell or solid, or compsolid or compound of these shapes"); } BRepFilletAPI_MakeChamfer fill (aShapeBase); if (aType == CHAMFER_SHAPE_ALL) { // symmetric chamfer on all edges double aD = aCI.GetD(); TopTools_IndexedDataMapOfShapeListOfShape M; GEOMImpl_Block6Explorer::MapShapesAndAncestors(aShapeBase, TopAbs_EDGE, TopAbs_FACE, M); for (int i = 1; i <= M.Extent(); i++) { TopoDS_Edge E = TopoDS::Edge(M.FindKey(i)); TopoDS_Face F = TopoDS::Face(M.FindFromIndex(i).First()); if (!BRepTools::IsReallyClosed(E, F) && !BRep_Tool::Degenerated(E) && M.FindFromIndex(i).Extent() == 2) fill.Add(aD, E, F); } }else if (aType == CHAMFER_SHAPE_EDGE || aType == CHAMFER_SHAPE_EDGE_AD) { // chamfer on edges, common to two faces, with D1 on the first face TopoDS_Shape aFace1, aFace2; if (GEOMImpl_ILocalOperations::GetSubShape(aShapeBase, aCI.GetFace1(), aFace1) && GEOMImpl_ILocalOperations::GetSubShape(aShapeBase, aCI.GetFace2(), aFace2)) { TopoDS_Face F = TopoDS::Face(aFace1); // fill map of edges of the second face TopTools_MapOfShape aMap; TopExp_Explorer Exp2 (aFace2, TopAbs_EDGE); for (; Exp2.More(); Exp2.Next()) { aMap.Add(Exp2.Current()); } // find edges of the first face, common with the second face TopExp_Explorer Exp (aFace1, TopAbs_EDGE); for (; Exp.More(); Exp.Next()) { if (aMap.Contains(Exp.Current())) { TopoDS_Edge E = TopoDS::Edge(Exp.Current()); if (!BRepTools::IsReallyClosed(E, F) && !BRep_Tool::Degenerated(E)) { if ( aType == CHAMFER_SHAPE_EDGE ) { double aD1 = aCI.GetD1(); double aD2 = aCI.GetD2(); fill.Add(aD1, aD2, E, F); } else { double aD = aCI.GetD(); double anAngle = aCI.GetAngle(); if ( (anAngle > 0) && (anAngle < (Standard_PI/2)) ) fill.AddDA(aD, anAngle, E, F); } } } } } } else if (aType == CHAMFER_SHAPE_FACES || aType == CHAMFER_SHAPE_FACES_AD) { // chamfer on all edges of the selected faces, with D1 on the selected face // (on first selected face, if the edge belongs to two selected faces) int aLen = aCI.GetLength(); int ind = 1; TopTools_MapOfShape aMap; TopTools_IndexedDataMapOfShapeListOfShape M; GEOMImpl_Block6Explorer::MapShapesAndAncestors(aShapeBase, TopAbs_EDGE, TopAbs_FACE, M); for (; ind <= aLen; ind++) { TopoDS_Shape aShapeFace; if (GEOMImpl_ILocalOperations::GetSubShape(aShapeBase, aCI.GetFace(ind), aShapeFace)) { TopoDS_Face F = TopoDS::Face(aShapeFace); TopExp_Explorer Exp (F, TopAbs_EDGE); for (; Exp.More(); Exp.Next()) { if (!aMap.Contains(Exp.Current())) { TopoDS_Edge E = TopoDS::Edge(Exp.Current()); if (!BRepTools::IsReallyClosed(E, F) && !BRep_Tool::Degenerated(E) && M.FindFromKey(E).Extent() == 2) if (aType == CHAMFER_SHAPE_FACES) { double aD1 = aCI.GetD1(); double aD2 = aCI.GetD2(); fill.Add(aD1, aD2, E, F); } else { double aD = aCI.GetD(); double anAngle = aCI.GetAngle(); if ( (anAngle > 0) && (anAngle < (Standard_PI/2)) ) fill.AddDA(aD, anAngle, E, F); } } } } } } else if (aType == CHAMFER_SHAPE_EDGES || aType == CHAMFER_SHAPE_EDGES_AD) { // chamfer on selected edges with lenght param D1 & D2. int aLen = aCI.GetLength(); int ind = 1; TopTools_MapOfShape aMap; TopTools_IndexedDataMapOfShapeListOfShape M; GEOMImpl_Block6Explorer::MapShapesAndAncestors(aShapeBase, TopAbs_EDGE, TopAbs_FACE, M); for (; ind <= aLen; ind++) { TopoDS_Shape aShapeEdge; if (GEOMImpl_ILocalOperations::GetSubShape(aShapeBase, aCI.GetEdge(ind), aShapeEdge)) { TopoDS_Edge E = TopoDS::Edge(aShapeEdge); const TopTools_ListOfShape& aFacesList = M.FindFromKey(E); TopoDS_Face F = TopoDS::Face( aFacesList.First() ); if (aType == CHAMFER_SHAPE_EDGES) { double aD1 = aCI.GetD1(); double aD2 = aCI.GetD2(); fill.Add(aD1, aD2, E, F); } else { double aD = aCI.GetD(); double anAngle = aCI.GetAngle(); if ( (anAngle > 0) && (anAngle < (Standard_PI/2)) ) fill.AddDA(aD, anAngle, E, F); } } } } else { } fill.Build(); if (!fill.IsDone()) { StdFail_NotDone::Raise("Chamfer can not be computed on the given shape with the given parameters"); } aShape = fill.Shape(); } if (aShape.IsNull()) return 0; // Check shape validity BRepCheck_Analyzer ana (aShape, false); if (!ana.IsValid()) { // 08.07.2008 added by skl during fixing bug 19761 from Mantis ShapeFix_ShapeTolerance aSFT; aSFT.LimitTolerance(aShape, Precision::Confusion(), Precision::Confusion(), TopAbs_SHAPE); Handle(ShapeFix_Shape) aSfs = new ShapeFix_Shape(aShape); aSfs->Perform(); aShape = aSfs->Shape(); // fix SameParameter flag BRepLib::SameParameter(aShape, 1.E-5, Standard_True); ana.Init(aShape); if (!ana.IsValid()) { Standard_CString anErrStr("Chamfer algorithm has produced an invalid shape result"); #ifdef THROW_ON_INVALID_SH Standard_ConstructionError::Raise(anErrStr); #else MESSAGE(anErrStr); //further processing can be performed here //... //in case of failure of automatic treatment //mark the corresponding GEOM_Object as problematic TDF_Label aLabel = aFunction->GetOwnerEntry(); if (!aLabel.IsRoot()) { Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel); if (!aMainObj.IsNull()) aMainObj->SetDirty(Standard_True); } #endif } } aFunction->SetValue(aShape); log.SetTouched(Label()); return 1; }