X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOM%2FGEOM_SubShapeDriver.cxx;h=f7e08b58b4e7130458fcfc76c561ab1801d681b0;hb=c1d63ef1f803d255b61ee99fb618bf471add07f4;hp=24d80aad4c2f9d24a8232cdb1b5140242471e93e;hpb=424ee09297c24f76f1e2ca2279afa5941b243bbd;p=modules%2Fgeom.git diff --git a/src/GEOM/GEOM_SubShapeDriver.cxx b/src/GEOM/GEOM_SubShapeDriver.cxx index 24d80aad4..f7e08b58b 100644 --- a/src/GEOM/GEOM_SubShapeDriver.cxx +++ b/src/GEOM/GEOM_SubShapeDriver.cxx @@ -1,38 +1,40 @@ +// Copyright (C) 2007-2023 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 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, or (at your option) any later version. +// +// 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 "GEOM_SubShapeDriver.hxx" + +#include "GEOM_ISubShape.hxx" +#include "GEOM_Function.hxx" +#include "GEOM_Object.hxx" -#include - -#include -#include -#include -#include - -#include #include -#include - -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include -#include -#include -#include - -#include #include -#include - //======================================================================= //function : GEOM_SubShapeDriver @@ -46,7 +48,7 @@ GEOM_SubShapeDriver::GEOM_SubShapeDriver() //function : Execute //purpose : //======================================================================= -Standard_Integer GEOM_SubShapeDriver::Execute(TFunction_Logbook& log) const +Standard_Integer GEOM_SubShapeDriver::Execute(Handle(TFunction_Logbook)& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); @@ -67,85 +69,90 @@ Standard_Integer GEOM_SubShapeDriver::Execute(TFunction_Logbook& log) const TopoDS_Compound aCompound; TopoDS_Shape aShape; - if (anIndices->Length() == 1 && anIndices->Value(1) == -1) { //The empty subshape + if (anIndices->Length() == 1 && anIndices->Value(1) == -1) { //The empty sub-shape B.MakeCompound(aCompound); aShape = aCompound; - - } else { - + } + 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); + 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 { - - if (aMapOfShapes.Extent() < anIndices->Value(1)) + } + 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(1)); + aShape = aMapOfShapes.FindKey(anIndices->Value(i)); } } if (aShape.IsNull()) return 0; aFunction->SetValue(aShape); - - log.SetTouched(Label()); + log->SetTouched(Label()); return 1; } +//================================================================================ +/*! + * \brief Returns a name of creation operation and names and values of creation parameters + */ +//================================================================================ -//======================================================================= -//function : GEOM_SubShapeDriver_Type_ -//purpose : -//======================================================================= -Standard_EXPORT Handle_Standard_Type& GEOM_SubShapeDriver_Type_() +bool GEOM_SubShapeDriver:: +GetCreationInformation(std::string& theOperationName, + std::vector& theParams) { - - static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); - if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); - static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); - if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); - static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); - if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); - - - static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; - static Handle_Standard_Type _aType = new Standard_Type("GEOM_SubShapeDriver", - sizeof(GEOM_SubShapeDriver), - 1, - (Standard_Address)_Ancestors, - (Standard_Address)NULL); - - return _aType; -} - -//======================================================================= -//function : DownCast -//purpose : -//======================================================================= -const Handle(GEOM_SubShapeDriver) Handle(GEOM_SubShapeDriver)::DownCast(const Handle(Standard_Transient)& AnObject) -{ - Handle(GEOM_SubShapeDriver) _anOtherObject; - - if (!AnObject.IsNull()) { - if (AnObject->IsKind(STANDARD_TYPE(GEOM_SubShapeDriver))) { - _anOtherObject = Handle(GEOM_SubShapeDriver)((Handle(GEOM_SubShapeDriver)&)AnObject); - } + if (Label().IsNull()) return 0; + Handle(GEOM_Function) function = GEOM_Function::GetFunction(Label()); + GEOM_ISubShape aCI( function ); + + enum { GEOM_SUBSHAPE = 28, GEOM_GROUP = 37 }; + + TDF_Label aLabel = function->GetOwnerEntry(); + if (aLabel.IsRoot()) return false; + Handle(GEOM_Object) obj = GEOM_Object::GetObject( aLabel ); + if ( obj.IsNull() ) return false; + + switch ( obj->GetType() ) { + case GEOM_SUBSHAPE: + theOperationName = "EXPLODE"; + AddParam( theParams, "Main Object", aCI.GetMainShape() ); + AddParam( theParams, "Index", aCI.GetIndices() ); + break; + case GEOM_GROUP: + { + theOperationName = "GROUP_CREATE"; + TopAbs_ShapeEnum type = TopAbs_SHAPE; + { + TDF_Label aFreeLabel = obj->GetFreeLabel(); + Handle(TDataStd_Integer) anAttrib; + if(aFreeLabel.FindAttribute(TDataStd_Integer::GetID(), anAttrib)) + type = (TopAbs_ShapeEnum) anAttrib->Get(); + } + AddParam( theParams, "Shape Type", type ); + AddParam( theParams, "Main Shape", aCI.GetMainShape() ); + AddParam( theParams, "Indices", aCI.GetIndices() ); + break; } - - return _anOtherObject ; + default: + return false; + } + + return true; } + +IMPLEMENT_STANDARD_RTTIEXT (GEOM_SubShapeDriver,GEOM_BaseDriver)