X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_BodyBuilder.cpp;h=383661d8642f75678ef6a7f92a55015e398f3455;hb=5c59bf6725e7e4855b5ca956475d705e2d5b014c;hp=2136750ba1dd6d235c3b928bad970039fcdd434f;hpb=fbb1d8a5ead180501e98acaf19acdda4880a2050;p=modules%2Fshaper.git diff --git a/src/Model/Model_BodyBuilder.cpp b/src/Model/Model_BodyBuilder.cpp index 2136750ba..383661d86 100755 --- a/src/Model/Model_BodyBuilder.cpp +++ b/src/Model/Model_BodyBuilder.cpp @@ -1,8 +1,22 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: Model_ResultBody.cpp -// Created: 08 Jul 2014 -// Author: Mikhail PONIKAROV +// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// +// 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 @@ -206,43 +220,7 @@ void Model_BodyBuilder::storeModified(const std::shared_ptr& theO if (aShapeNew.IsNull()) return; // null shape inside aBuilder.Modify(aShapeOld, aShapeNew); - if (theDecomposeSolidsTag && aShapeNew.ShapeType() == TopAbs_COMPOUND) { - // make sub elements as subs - - // register name if it is possible - TCollection_AsciiString aName; - if(!aBuilder.NamedShape()->IsEmpty()) { - Handle(TDataStd_Name) anAttr; - if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) { - aName = TCollection_AsciiString(anAttr->Get()).ToCString(); - } - } - - TopoDS_Iterator aSubIter(aShapeNew); - for(int aTag = theDecomposeSolidsTag; aSubIter.More(); aSubIter.Next()) { - const TopoDS_Shape& aShape = aSubIter.Value(); - Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(aShape, aShapeLab); - if(!aNS.IsNull() && !aNS->IsEmpty()) { - // This shape is already in document, don't add it. - continue; - } - TNaming_Builder aSubBuilder(aShapeLab.FindChild(aTag++)); - aSubBuilder.Generated(aSubIter.Value()); - if(!aName.IsEmpty()) { - TCollection_AsciiString aShapeType = aShape.ShapeType() == TopAbs_EDGE ? "_Edge_" : - aShape.ShapeType() == TopAbs_FACE ? "_Face_" : - aShape.ShapeType() == TopAbs_SOLID ? "_Solid_" : - "_Shape_"; - std::string aSolidName = - (aName + aShapeType + TCollection_AsciiString(aTag - theDecomposeSolidsTag)) - .ToCString(); - std::shared_ptr aDoc = - std::dynamic_pointer_cast(document()); - aDoc->addNamingName(aSubBuilder.NamedShape()->Label(), aSolidName); - TDataStd_Name::Set(aSubBuilder.NamedShape()->Label(), aSolidName.c_str()); - } - } - } else if(!aBuilder.NamedShape()->IsEmpty()) { + if(!aBuilder.NamedShape()->IsEmpty()) { Handle(TDataStd_Name) anAttr; if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) { std::string aName (TCollection_AsciiString(anAttr->Get()).ToCString()); @@ -384,7 +362,8 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes ( const int theTag, const std::string& theName, GeomAPI_DataMapOfShapeShape& theSubShapes, - const bool theIsStoreSeparate) + const bool theIsStoreSeparate, + const bool theIsStoreAsGenerated) { int anIndex = 1; int aTag = theTag; @@ -413,7 +392,13 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes ( GeomShapePtr aGeomNewShape(new GeomAPI_Shape()); aGeomNewShape->setImpl(new TopoDS_Shape(aNewShape)); if(!aRoot.IsSame(aNewShape) && aResultShape->isSubShape(aGeomNewShape)) { - builder(aTag)->Modify(aRoot,aNewShape); + if(theIsStoreAsGenerated) { + // Here we store shapes as generated, to avoid problem when one parent shape produce + // several child shapes. In this case naming could not determine which shape to select. + builder(aTag)->Generated(aRoot,aNewShape); + } else { + builder(aTag)->Modify(aRoot,aNewShape); + } if(isBuilt) { if(theIsStoreSeparate) { aStream.str(std::string());