X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultPart.cpp;h=d4d10de3b6d9ae588f7b91d5e3c2c296656df566;hb=84b36b8deb02c2661b3d09299560266388329d01;hp=b38c0bb092d812bb38f8dbdea66a886dc8c8621e;hpb=cbde248859fb0072f6012907391ea90cfc254574;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultPart.cpp b/src/Model/Model_ResultPart.cpp index b38c0bb09..d4d10de3b 100644 --- a/src/Model/Model_ResultPart.cpp +++ b/src/Model/Model_ResultPart.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -31,9 +32,14 @@ void Model_ResultPart::initAttributes() { // append the color attribute. It is empty, the attribute will be filled by a request - data()->addAttribute(DOC_REF(), ModelAPI_AttributeDocRef::typeId()); + AttributeDocRefPtr aDocRef = std::dynamic_pointer_cast( + data()->addAttribute(DOC_REF(), ModelAPI_AttributeDocRef::typeId())); data()->addAttribute(COLOR_ID(), ModelAPI_AttributeIntArray::typeId()); data()->addAttribute(BASE_REF_ID(), ModelAPI_AttributeReference::typeId()); + + if (aDocRef->isInitialized() && // initialized immideately means already exist and will be loaded + !Model_Application::getApplication()->hasDocument(aDocRef->docId())) + Model_Application::getApplication()->setLoadByDemand(data()->name()); } std::shared_ptr Model_ResultPart::partDoc() @@ -42,15 +48,11 @@ std::shared_ptr Model_ResultPart::partDoc() return baseRef()->partDoc(); } DocumentPtr aRes = data()->document(DOC_REF())->value(); - if (!aRes.get() && myIsInLoad) { // trying to get this document from the session - aRes = document()->subDocument(data()->name()); - } return aRes; } Model_ResultPart::Model_ResultPart() { - myIsInLoad = false; } void Model_ResultPart::activate() @@ -62,26 +64,31 @@ void Model_ResultPart::activate() std::shared_ptr aDocRef = data()->document(DOC_REF()); + // activation may cause changes in current features in document, so it must be in transaction + bool isNewTransaction = false; + SessionPtr aMgr = ModelAPI_Session::get(); + if (!aMgr->isOperation()) { // open transaction even document is not created to set current docs in setActiveDocument + aMgr->startOperation("Activation"); + isNewTransaction = true; + } if (!aDocRef->value().get()) { // create (or open) a document if it is not yet created - myIsInLoad = true; - std::shared_ptr aDoc = document()->subDocument(data()->name()); - myIsInLoad = false; - if (aDoc) { + 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 + } else { + anApp->createDocument(aDocRef->docId()); + } + std::shared_ptr aDoc = aDocRef->value(); + if (aDoc.get()) { aDoc->synchronizeTransactions(); aDocRef->setValue(aDoc); } } if (aDocRef->value().get()) { - SessionPtr aMgr = ModelAPI_Session::get(); - bool isNewTransaction = !aMgr->isOperation(); - // activation may cause changes in current features in document, so it must be in transaction - if (isNewTransaction) { - aMgr->startOperation("Activation"); - } ModelAPI_Session::get()->setActiveDocument(aDocRef->value()); - if (isNewTransaction) { - aMgr->finishOperation(); - } + } + if (isNewTransaction) { + aMgr->finishOperation(); } } @@ -96,6 +103,8 @@ std::shared_ptr Model_ResultPart::original() bool Model_ResultPart::isActivated() { if (myTrsf.get()) { + if (!baseRef().get()) // may be on close + return false; return baseRef()->isActivated(); } @@ -110,9 +119,13 @@ 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()) { - std::shared_ptr anIntDoc = std::dynamic_pointer_cast(aDoc); // make the current feature the last in any case: to update shapes defore deactivation too - FeaturePtr aLastFeature = anIntDoc->lastFeature(); + int aSize = aDoc->size(ModelAPI_Feature::group()); + FeaturePtr aLastFeature; + if (aSize) + aLastFeature = std::dynamic_pointer_cast(aDoc->object( + ModelAPI_Feature::group(), aSize - 1)); + aDoc->setCurrentFeature(aLastFeature, false); if (theFlag) { // disable, so make all features disabled too // update the shape just before the deactivation: it will be used outside of part