X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultPart.cpp;h=fb3eb3bed05b69273ecb6673fa0f0f6bdf2578dd;hb=81baa77e52cb1ade2bfbe5b21e893cc34b03c323;hp=2beb5f56213aa4cfca6d278abfa126cf349aa37c;hpb=9f8379064ab359da1eda4c3a258a8e67ee2c7f7a;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultPart.cpp b/src/Model/Model_ResultPart.cpp index 2beb5f562..fb3eb3bed 100644 --- a/src/Model/Model_ResultPart.cpp +++ b/src/Model/Model_ResultPart.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: ModelAPI_ResultPart.cpp -// Created: 07 Jul 2014 -// Author: Mikhail PONIKAROV +// Copyright (C) 2014-2020 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 #include @@ -19,9 +32,14 @@ #include #include #include +#include #include +#include + +#include + #include #include #include @@ -40,17 +58,21 @@ void Model_ResultPart::initAttributes() data()->addAttribute(COLOR_ID(), ModelAPI_AttributeIntArray::typeId()); data()->addAttribute(BASE_REF_ID(), ModelAPI_AttributeReference::typeId()); data()->addAttribute(DEFLECTION_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(TRANSPARENCY_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(ISO_LINES_ID(), ModelAPI_AttributeIntArray::typeId()); - if (aDocRef->isInitialized() && // initialized immideately means already exist and will be loaded + if (aDocRef->isInitialized() && // initialized immediately means already exist and will be loaded !Model_Application::getApplication()->hasDocument(aDocRef->docId())) Model_Application::getApplication()->setLoadByDemand(data()->name(), aDocRef->docId()); } std::shared_ptr Model_ResultPart::partDoc() { - if (myTrsf.get() && baseRef().get()) { // the second condition is to to #2035 + if (myTrsf.get() && baseRef().get()) { // the second condition is due to #2035 return baseRef()->partDoc(); } + if (!data()->isValid()) + return DocumentPtr(); DocumentPtr aRes = data()->document(DOC_REF())->value(); return aRes; } @@ -73,13 +95,14 @@ void Model_ResultPart::activate() SessionPtr aMgr = ModelAPI_Session::get(); if (!aMgr->isOperation()) { // open transaction even document is not created to set current docs in setActiveDocument - aMgr->startOperation("Activation"); + std::string aMsg = "Activation " + Locale::Convert::toString(data()->name()); + aMgr->startOperation(aMsg); isNewTransaction = true; } if (!aDocRef->value().get()) { // create (or open) a document if it is not yet created Handle(Model_Application) anApp = Model_Application::getApplication(); - if (anApp->isLoadByDemand(data()->name())) { - anApp->loadDocument(data()->name(), aDocRef->docId()); // if it is just ne part, load may fail + if (anApp->isLoadByDemand(data()->name(), aDocRef->docId())) { + anApp->loadDocument(data()->name(), aDocRef->docId()); // if it is just new part, load fails } else { anApp->createDocument(aDocRef->docId()); } @@ -97,9 +120,25 @@ void Model_ResultPart::activate() } } + +void Model_ResultPart::loadPart() +{ + std::shared_ptr aDocRef = data()->document(DOC_REF()); + if (!aDocRef->value().get()) { // create (or open) a document if it is not yet created + Handle(Model_Application) anApp = Model_Application::getApplication(); + if (anApp->isLoadByDemand(data()->name(), aDocRef->docId())) { + anApp->loadDocument(data()->name(), aDocRef->docId()); // if it is just new part, load fails + } + else { + anApp->createDocument(aDocRef->docId()); + } + } +} + + std::shared_ptr Model_ResultPart::original() { - if (myTrsf.get() && baseRef().get()) { // the second condition is to to #2035 + if (myTrsf.get() && baseRef().get()) { // the second condition is due to #2035 return baseRef()->original(); } return std::dynamic_pointer_cast(data()->owner()); @@ -124,7 +163,7 @@ bool Model_ResultPart::setDisabled(std::shared_ptr theThis, if (!myTrsf.get()) { // disable of base result part DocumentPtr aDoc = Model_ResultPart::partDoc(); if (aDoc.get() && aDoc->isOpened()) { - // make the current feature the last in any case: to update shapes defore deactivation too + // make the current feature the last in any case: to update shapes before deactivation too int aSize = aDoc->size(ModelAPI_Feature::group()); FeaturePtr aLastFeature; if (aSize) @@ -150,20 +189,42 @@ bool Model_ResultPart::setDisabled(std::shared_ptr theThis, return false; } +static GeomShapePtr transformShape(const GeomShapePtr theShape, const gp_Trsf& theTrsf) +{ + GeomShapePtr aResult(new GeomAPI_Shape); + if (theTrsf.ScaleFactor() > 0) { + // just update the location of the shape in case of affine transformation + TopoDS_Shape aShape = theShape->impl(); + if (!aShape.IsNull()) { + aShape.Move(theTrsf); + aResult->setImpl(new TopoDS_Shape(aShape)); + } + } + else { + // all other transformations will modify the shape + GeomTrsfPtr aTrsf = std::make_shared(new gp_Trsf(theTrsf)); + GeomAlgoAPI_Transform aTransform(theShape, aTrsf); + aResult = aTransform.shape(); + } + return aResult; +} + std::shared_ptr Model_ResultPart::shape() { std::shared_ptr aResult(new GeomAPI_Shape); if (myShape.IsNull()) { // shape is not produced yet, create it + SessionPtr aMgr = ModelAPI_Session::get(); + bool aToSendUpdate = aMgr->isOperation(); // inside of operation may send an update event if (myTrsf.get()) { // get shape of the base result and apply the transformation ResultPtr anOrigResult = baseRef(); std::shared_ptr anOrigShape = anOrigResult->shape(); if (anOrigShape.get()) { - TopoDS_Shape aShape = anOrigShape->impl(); - if (!aShape.IsNull()) { - aShape.Move(*(myTrsf.get())); - myShape = aShape; - aResult->setImpl(new TopoDS_Shape(aShape)); - } + aResult = transformShape(anOrigShape, *myTrsf); + myShape = aResult->impl(); + } + if (!myShape.IsNull() && aToSendUpdate) { + static const Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); + ModelAPI_EventCreator::get()->sendUpdated(data()->owner(), anEvent); } return aResult; } else { @@ -190,9 +251,14 @@ std::shared_ptr Model_ResultPart::shape() } } } + if (!myShape.IsNull() && aToSendUpdate) { + static const Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); + ModelAPI_EventCreator::get()->sendUpdated(data()->owner(), anEvent); + } } - if (!myShape.IsNull()) + if (!myShape.IsNull()) { aResult->setImpl(new TopoDS_Shape(myShape)); + } return aResult; } @@ -208,7 +274,7 @@ static bool IsEqualTrsf(gp_Trsf& theT1, gp_Trsf theT2) { return true; } -std::string Model_ResultPart::nameInPart(const std::shared_ptr& theShape, +std::wstring Model_ResultPart::nameInPart(const std::shared_ptr& theShape, int& theIndex) { theIndex = 0; // not initialized @@ -234,21 +300,21 @@ std::string Model_ResultPart::nameInPart(const std::shared_ptr& t } } // something is not right - return ""; + return L""; } TopoDS_Shape aShape = theShape->impl(); if (aShape.IsNull()) - return ""; + return L""; // getting an access to the document of part std::shared_ptr aDoc = std::dynamic_pointer_cast(partDoc()); if (!aDoc.get()) // the part document is not presented for the moment - return ""; - TDF_Label anAccessLabel = aDoc->generalLabel(); + return L""; + MAYBE_UNUSED TDF_Label anAccessLabel = aDoc->generalLabel(); // make the selection attribute anyway: // otherwise just by name it is not stable to search the result - std::string aName; + std::wstring aName; // for this the context result is needed ResultPtr aContext; const std::string& aBodyGroup = ModelAPI_ResultBody::group(); @@ -258,7 +324,7 @@ std::string Model_ResultPart::nameInPart(const std::shared_ptr& t TopoDS_Shape aBodyShape = *(aBody->shape()->implPtr()); // check is body contain the selected sub-shape for(TopExp_Explorer anExp(aBodyShape, aShape.ShapeType()); anExp.More(); anExp.Next()) { - if (aShape.IsEqual(anExp.Current())) { + if (aShape.IsSame(anExp.Current())) { aContext = aBody; break; } @@ -282,7 +348,11 @@ bool Model_ResultPart::updateInPart(const int theIndex) AttributeSelectionListPtr aSelAttr = aDoc->selectionInPartFeature(); AttributeSelectionPtr aThisAttr = aSelAttr->value(theIndex - 1); if (aThisAttr.get()) { - return aThisAttr->update(); + if (aThisAttr->update()) { + bool aRemove = false; + aThisAttr->updateInHistory(aRemove); + return true; // it was updated + } } } return false; // something is wrong @@ -297,8 +367,26 @@ gp_Trsf Model_ResultPart::sumTrsf() { return aResult; } +bool Model_ResultPart::combineGeometrical(const int theIndex, std::wstring& theNewName) +{ + std::shared_ptr aDoc = std::dynamic_pointer_cast(partDoc()); + if (aDoc.get()) { + AttributeSelectionListPtr aSelAttr = aDoc->selectionInPartFeature(); + AttributeSelectionPtr aThisAttr = aSelAttr->value(theIndex - 1); + if (aThisAttr.get()) { + aThisAttr->combineGeometrical(); + if (aThisAttr->value().get()) { + int anIndex; + theNewName = nameInPart(aThisAttr->value(), anIndex); + return true; + } + } + } + return false; // something is wrong +} + std::shared_ptr Model_ResultPart::shapeInPart( - const std::string& theName, const std::string& theType, int& theIndex) + const std::wstring& theName, const std::string& theType, int& theIndex) { theIndex = 0; // not found yet std::shared_ptr aResult; @@ -370,3 +458,10 @@ void Model_ResultPart::setTrsf(std::shared_ptr theThis, static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); ModelAPI_EventCreator::get()->sendUpdated(theThis, EVENT_DISP); // flush is in preview-update } + +std::shared_ptr Model_ResultPart::summaryTrsf() +{ + GeomTrsfPtr aResult(new GeomAPI_Trsf); + aResult->setImpl(new gp_Trsf(sumTrsf())); + return aResult; +}