// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License. // // This library is distributed in the hope that it will be useful // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include #include #include #include #include #include #include #include #include #include #include #include #include #include "utilities.h" #include #include #include #include #include #include #include #include #include #include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC //============================================================================= /*! * constructor: */ //============================================================================= GEOMImpl_ILocalOperations::GEOMImpl_ILocalOperations (GEOM_Engine* theEngine, int theDocID) : GEOM_IOperations(theEngine, theDocID) { MESSAGE("GEOMImpl_ILocalOperations::GEOMImpl_ILocalOperations"); } //============================================================================= /*! * destructor */ //============================================================================= GEOMImpl_ILocalOperations::~GEOMImpl_ILocalOperations() { MESSAGE("GEOMImpl_ILocalOperations::~GEOMImpl_ILocalOperations"); } //============================================================================= /*! * MakeFilletAll */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeFilletAll (Handle(GEOM_Object) theShape, double theR) { SetErrorCode(KO); //Add a new Fillet object Handle(GEOM_Object) aFillet = GetEngine()->AddObject(GetDocID(), GEOM_FILLET); //Add a new Fillet function Handle(GEOM_Function) aFunction = aFillet->AddFunction(GEOMImpl_FilletDriver::GetID(), FILLET_SHAPE_ALL); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_FilletDriver::GetID()) return NULL; GEOMImpl_IFillet aCI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) return NULL; aCI.SetShape(aRefShape); aCI.SetR(theR); //Compute the Fillet value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Fillet driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump(aFunction) << aFillet << " = geompy.MakeFilletAll(" << theShape << ", " << theR << ")"; SetErrorCode(OK); return aFillet; } //============================================================================= /*! * MakeFilletEdges */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeFilletEdges (Handle(GEOM_Object) theShape, double theR, std::list theEdges) { SetErrorCode(KO); //Add a new Fillet object Handle(GEOM_Object) aFillet = GetEngine()->AddObject(GetDocID(), GEOM_FILLET); //Add a new Fillet function Handle(GEOM_Function) aFunction = aFillet->AddFunction(GEOMImpl_FilletDriver::GetID(), FILLET_SHAPE_EDGES); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_FilletDriver::GetID()) return NULL; GEOMImpl_IFillet aCI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) return NULL; aCI.SetShape(aRefShape); aCI.SetR(theR); int aLen = theEdges.size(); aCI.SetLength(aLen); int ind = 1; std::list::iterator it = theEdges.begin(); for (; it != theEdges.end(); it++, ind++) { aCI.SetEdge(ind, (*it)); } //Compute the Fillet value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Fillet driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump pd (aFunction); pd << aFillet << " = geompy.MakeFillet(" << theShape << ", " << theR << ", geompy.ShapeType[\"EDGE\"], ["; it = theEdges.begin(); pd << (*it++); while (it != theEdges.end()) { pd << ", " << (*it++); } pd << "])"; SetErrorCode(OK); return aFillet; } //============================================================================= /*! * MakeFilletEdges R1 R2 */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeFilletEdgesR1R2 (Handle(GEOM_Object) theShape, double theR1, double theR2, std::list theEdges) { SetErrorCode(KO); //Add a new Fillet object Handle(GEOM_Object) aFillet = GetEngine()->AddObject(GetDocID(), GEOM_FILLET); //Add a new Fillet function Handle(GEOM_Function) aFunction = aFillet->AddFunction(GEOMImpl_FilletDriver::GetID(), FILLET_SHAPE_EDGES_2R); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_FilletDriver::GetID()) return NULL; GEOMImpl_IFillet aCI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) return NULL; aCI.SetShape(aRefShape); aCI.SetR1(theR1); aCI.SetR2(theR2); int aLen = theEdges.size(); aCI.SetLength(aLen); int ind = 1; std::list::iterator it = theEdges.begin(); for (; it != theEdges.end(); it++, ind++) { aCI.SetEdge(ind, (*it)); } //Compute the Fillet value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Fillet driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump pd (aFunction); pd << aFillet << " = geompy.MakeFilletR1R2(" << theShape << ", " << theR1 << ", " < theFaces) { SetErrorCode(KO); //Add a new Fillet object Handle(GEOM_Object) aFillet = GetEngine()->AddObject(GetDocID(), GEOM_FILLET); //Add a new Fillet function Handle(GEOM_Function) aFunction = aFillet->AddFunction(GEOMImpl_FilletDriver::GetID(), FILLET_SHAPE_FACES); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_FilletDriver::GetID()) return NULL; GEOMImpl_IFillet aCI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) return NULL; aCI.SetShape(aRefShape); aCI.SetR(theR); int aLen = theFaces.size(); aCI.SetLength(aLen); int ind = 1; std::list::iterator it = theFaces.begin(); for (; it != theFaces.end(); it++, ind++) { aCI.SetFace(ind, (*it)); } //Compute the Fillet value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Fillet driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump pd (aFunction); pd << aFillet << " = geompy.MakeFillet(" << theShape << ", " << theR << ", geompy.ShapeType[\"FACE\"], ["; it = theFaces.begin(); pd << (*it++); while (it != theFaces.end()) { pd << ", " << (*it++); } pd << "])"; SetErrorCode(OK); return aFillet; } //============================================================================= /*! * MakeFilletFaces R1 R2 */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeFilletFacesR1R2 (Handle(GEOM_Object) theShape, double theR1, double theR2, std::list theFaces) { SetErrorCode(KO); //Add a new Fillet object Handle(GEOM_Object) aFillet = GetEngine()->AddObject(GetDocID(), GEOM_FILLET); //Add a new Fillet function Handle(GEOM_Function) aFunction = aFillet->AddFunction(GEOMImpl_FilletDriver::GetID(), FILLET_SHAPE_FACES_2R); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_FilletDriver::GetID()) return NULL; GEOMImpl_IFillet aCI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) return NULL; aCI.SetShape(aRefShape); aCI.SetR1(theR1); aCI.SetR2(theR2); int aLen = theFaces.size(); aCI.SetLength(aLen); int ind = 1; std::list::iterator it = theFaces.begin(); for (; it != theFaces.end(); it++, ind++) { aCI.SetFace(ind, (*it)); } //Compute the Fillet value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Fillet driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump pd (aFunction); pd << aFillet << " = geompy.MakeFilletR1R2(" << theShape << ", " << theR1 << ", " << theR2 << ", geompy.ShapeType[\"FACE\"], ["; it = theFaces.begin(); pd << (*it++); while (it != theFaces.end()) { pd << ", " << (*it++); } pd << "])"; SetErrorCode(OK); return aFillet; } //============================================================================= /*! * MakeChamferAll */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeChamferAll (Handle(GEOM_Object) theShape, double theD) { SetErrorCode(KO); //Add a new Chamfer object Handle(GEOM_Object) aChamfer = GetEngine()->AddObject(GetDocID(), GEOM_CHAMFER); //Add a new Chamfer function Handle(GEOM_Function) aFunction = aChamfer->AddFunction(GEOMImpl_ChamferDriver::GetID(), CHAMFER_SHAPE_ALL); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_ChamferDriver::GetID()) return NULL; GEOMImpl_IChamfer aCI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) return NULL; aCI.SetShape(aRefShape); aCI.SetD(theD); //Compute the Chamfer value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Chamfer driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump(aFunction) << aChamfer << " = geompy.MakeChamferAll(" << theShape << ", " << theD << ")"; SetErrorCode(OK); return aChamfer; } //============================================================================= /*! * MakeChamferEdge */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeChamferEdge (Handle(GEOM_Object) theShape, double theD1, double theD2, int theFace1, int theFace2) { SetErrorCode(KO); //Add a new Chamfer object Handle(GEOM_Object) aChamfer = GetEngine()->AddObject(GetDocID(), GEOM_CHAMFER); //Add a new Chamfer function Handle(GEOM_Function) aFunction = aChamfer->AddFunction(GEOMImpl_ChamferDriver::GetID(), CHAMFER_SHAPE_EDGE); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_ChamferDriver::GetID()) return NULL; GEOMImpl_IChamfer aCI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) return NULL; aCI.SetShape(aRefShape); aCI.SetD1(theD1); aCI.SetD2(theD2); aCI.SetFace1(theFace1); aCI.SetFace2(theFace2); //Compute the Chamfer value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Chamfer driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump(aFunction) << aChamfer << " = geompy.MakeChamferEdge(" << theShape << ", " << theD1 << ", " << theD2 << ", " << theFace1 << ", " << theFace2 << ")"; SetErrorCode(OK); return aChamfer; } //============================================================================= /*! * MakeChamferEdgeAD */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeChamferEdgeAD (Handle(GEOM_Object) theShape, double theD, double theAngle, int theFace1, int theFace2) { SetErrorCode(KO); //Add a new Chamfer object Handle(GEOM_Object) aChamfer = GetEngine()->AddObject(GetDocID(), GEOM_CHAMFER); //Add a new Chamfer function Handle(GEOM_Function) aFunction = aChamfer->AddFunction(GEOMImpl_ChamferDriver::GetID(), CHAMFER_SHAPE_EDGE_AD); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_ChamferDriver::GetID()) return NULL; GEOMImpl_IChamfer aCI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) return NULL; aCI.SetShape(aRefShape); aCI.SetD(theD); aCI.SetAngle(theAngle); aCI.SetFace1(theFace1); aCI.SetFace2(theFace2); //Compute the Chamfer value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Chamfer driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump(aFunction) << aChamfer << " = geompy.MakeChamferEdgeAD(" << theShape << ", " << theD << ", " << theAngle << ", " << theFace1 << ", " << theFace2 << ")"; SetErrorCode(OK); return aChamfer; } //============================================================================= /*! * MakeChamferFaces */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeChamferFaces (Handle(GEOM_Object) theShape, double theD1, double theD2, std::list theFaces) { SetErrorCode(KO); //Add a new Chamfer object Handle(GEOM_Object) aChamfer = GetEngine()->AddObject(GetDocID(), GEOM_CHAMFER); //Add a new Chamfer function Handle(GEOM_Function) aFunction = aChamfer->AddFunction(GEOMImpl_ChamferDriver::GetID(), CHAMFER_SHAPE_FACES); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_ChamferDriver::GetID()) return NULL; GEOMImpl_IChamfer aCI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) return NULL; aCI.SetShape(aRefShape); aCI.SetD1(theD1); aCI.SetD2(theD2); int aLen = theFaces.size(); aCI.SetLength(aLen); int ind = 1; std::list::iterator it = theFaces.begin(); for (; it != theFaces.end(); it++, ind++) { aCI.SetFace(ind, (*it)); } //Compute the Chamfer value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Chamfer driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump pd (aFunction); pd << aChamfer << " = geompy.MakeChamferFaces(" << theShape << ", " << theD1 << ", " << theD2 << ", ["; it = theFaces.begin(); pd << (*it++); while (it != theFaces.end()) { pd << ", " << (*it++); } pd << "])"; SetErrorCode(OK); return aChamfer; } //============================================================================= /*! * MakeChamferFacesAD */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeChamferFacesAD (Handle(GEOM_Object) theShape, double theD, double theAngle, std::list theFaces) { SetErrorCode(KO); //Add a new Chamfer object Handle(GEOM_Object) aChamfer = GetEngine()->AddObject(GetDocID(), GEOM_CHAMFER); //Add a new Chamfer function Handle(GEOM_Function) aFunction = aChamfer->AddFunction(GEOMImpl_ChamferDriver::GetID(), CHAMFER_SHAPE_FACES_AD); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_ChamferDriver::GetID()) return NULL; GEOMImpl_IChamfer aCI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) return NULL; aCI.SetShape(aRefShape); aCI.SetD(theD); aCI.SetAngle(theAngle); int aLen = theFaces.size(); aCI.SetLength(aLen); int ind = 1; std::list::iterator it = theFaces.begin(); for (; it != theFaces.end(); it++, ind++) { aCI.SetFace(ind, (*it)); } //Compute the Chamfer value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Chamfer driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump pd (aFunction); pd << aChamfer << " = geompy.MakeChamferFacesAD(" << theShape << ", " << theD << ", " << theAngle << ", ["; it = theFaces.begin(); pd << (*it++); while (it != theFaces.end()) { pd << ", " << (*it++); } pd << "])"; SetErrorCode(OK); return aChamfer; } //============================================================================= /*! * MakeChamferEdges */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeChamferEdges (Handle(GEOM_Object) theShape, double theD1, double theD2, std::list theEdges) { SetErrorCode(KO); //Add a new Chamfer object Handle(GEOM_Object) aChamfer = GetEngine()->AddObject(GetDocID(), GEOM_CHAMFER); //Add a new Chamfer function Handle(GEOM_Function) aFunction = aChamfer->AddFunction(GEOMImpl_ChamferDriver::GetID(), CHAMFER_SHAPE_EDGES); if (aFunction.IsNull()) { MESSAGE ( "Edges Function is NULL!!!" ); return NULL;} //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_ChamferDriver::GetID()) { MESSAGE ( "Chamfer Driver is NULL!!!" ); return NULL; } GEOMImpl_IChamfer aCI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) { MESSAGE ("Shape is NULL!!!"); return NULL;} aCI.SetShape(aRefShape); aCI.SetD1(theD1); aCI.SetD2(theD2); int aLen = theEdges.size(); aCI.SetLength(aLen); int ind = 1; std::list::iterator it = theEdges.begin(); for (; it != theEdges.end(); it++, ind++) { aCI.SetEdge(ind, (*it)); } //Compute the Chamfer value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Chamfer driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump pd (aFunction); pd << aChamfer << " = geompy.MakeChamferEdges(" << theShape << ", " << theD1 << ", " << theD2 << ", ["; it = theEdges.begin(); pd << (*it++); while (it != theEdges.end()) { pd << ", " << (*it++); } pd << "])"; SetErrorCode(OK); return aChamfer; } //============================================================================= /*! * MakeChamferEdgesAD */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeChamferEdgesAD (Handle(GEOM_Object) theShape, double theD, double theAngle, std::list theEdges) { SetErrorCode(KO); //Add a new Chamfer object Handle(GEOM_Object) aChamfer = GetEngine()->AddObject(GetDocID(), GEOM_CHAMFER); //Add a new Chamfer function Handle(GEOM_Function) aFunction = aChamfer->AddFunction(GEOMImpl_ChamferDriver::GetID(), CHAMFER_SHAPE_EDGES_AD); if (aFunction.IsNull()) { MESSAGE ( "Edges Function is NULL!!!" ); return NULL; } //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_ChamferDriver::GetID()) { MESSAGE("Chamfer Driver is NULL!!!"); return NULL;} GEOMImpl_IChamfer aCI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) { MESSAGE ("Shape is NULL!!!"); return NULL;} aCI.SetShape(aRefShape); aCI.SetD(theD); aCI.SetAngle(theAngle); int aLen = theEdges.size(); aCI.SetLength(aLen); int ind = 1; std::list::iterator it = theEdges.begin(); for (; it != theEdges.end(); it++, ind++) { aCI.SetEdge(ind, (*it)); } //Compute the Chamfer value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Chamfer driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump pd (aFunction); pd << aChamfer << " = geompy.MakeChamferEdgesAD(" << theShape << ", " << theD << ", " << theAngle << ", ["; it = theEdges.begin(); pd << (*it++); while (it != theEdges.end()) { pd << ", " << (*it++); } pd << "])"; SetErrorCode(OK); return aChamfer; } //============================================================================= /*! * Archimede */ //============================================================================= Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeArchimede (Handle(GEOM_Object) theShape, double theWeight, double theWaterDensity, double theMeshingDeflection) { SetErrorCode(KO); //Add a new Archimede object Handle(GEOM_Object) aChamfer = GetEngine()->AddObject(GetDocID(), GEOM_ARCHIMEDE); //Add a new Archimede function Handle(GEOM_Function) aFunction = aChamfer->AddFunction(GEOMImpl_ArchimedeDriver::GetID(), ARCHIMEDE_TYPE); if (aFunction.IsNull()) return NULL; //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_ArchimedeDriver::GetID()) return NULL; GEOMImpl_IArchimede aAI (aFunction); Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); if (aRefShape.IsNull()) return NULL; aAI.SetBasicShape(aRefShape); aAI.SetWeight(theWeight); aAI.SetDensity(theWaterDensity); aAI.SetDeflection(theMeshingDeflection); //Compute the Archimede value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif if (!GetSolver()->ComputeFunction(aFunction)) { SetErrorCode("Archimede driver failed"); return NULL; } } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } //Make a Python command GEOM::TPythonDump(aFunction) << aChamfer << " = geompy.Archimede(" << theShape << ", " << theWeight << ", " << theWaterDensity << ", " << theMeshingDeflection << ")"; SetErrorCode(OK); return aChamfer; } //============================================================================= /*! * GetSubShape */ //============================================================================= bool GEOMImpl_ILocalOperations::GetSubShape (const TopoDS_Shape& theShape, const int theIndex, TopoDS_Shape& theSubShape) { if (theShape.IsNull() || theIndex < 1) return false; TopTools_IndexedMapOfShape anIndices; TopExp::MapShapes(theShape, anIndices); if (theIndex > anIndices.Extent()) return false; theSubShape = anIndices.FindKey(theIndex); return true; } //============================================================================= /*! * GetSubShapeIndex */ //============================================================================= Standard_Integer GEOMImpl_ILocalOperations::GetSubShapeIndex (Handle(GEOM_Object) theShape, Handle(GEOM_Object) theSubShape) { SetErrorCode(KO); Standard_Integer anInd = -1; GEOM_Engine* anEngine = GetEngine(); //GEOMImpl_Gen* aGen = dynamic_cast(anEngine); GEOMImpl_Gen* aGen = (GEOMImpl_Gen*)anEngine; if (aGen) { GEOMImpl_IShapesOperations* anIShapesOperations = aGen->GetIShapesOperations(GetDocID()); anInd = anIShapesOperations->GetSubShapeIndex(theShape, theSubShape); SetErrorCode(anIShapesOperations->GetErrorCode()); } return anInd; }