X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultPart.cpp;h=d4d10de3b6d9ae588f7b91d5e3c2c296656df566;hb=84b36b8deb02c2661b3d09299560266388329d01;hp=12361eb33a1054295d3f4c16be76d4c59695ffd5;hpb=4c2fb25615fc2e96957aeaee177251c40a434f4e;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultPart.cpp b/src/Model/Model_ResultPart.cpp index 12361eb33..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() @@ -41,13 +47,12 @@ std::shared_ptr Model_ResultPart::partDoc() if (myTrsf.get()) { return baseRef()->partDoc(); } - return data()->document("PartDocument")->value(); + DocumentPtr aRes = data()->document(DOC_REF())->value(); + return aRes; } Model_ResultPart::Model_ResultPart() { - myIsDisabled = true; // by default it is not initialized and false to be after created - setIsConcealed(false); } void Model_ResultPart::activate() @@ -59,23 +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 - std::shared_ptr aDoc = document()->subDocument(data()->name()); - 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(); } } @@ -90,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(); } @@ -105,14 +120,23 @@ bool Model_ResultPart::setDisabled(std::shared_ptr theThis, 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 - FeaturePtr aLastFeature = std::dynamic_pointer_cast(aDoc->object( - ModelAPI_Feature::group(), aDoc->size(ModelAPI_Feature::group()) - 1)); + 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 updateShape(); shape(); aDoc->setCurrentFeature(FeaturePtr(), false); + // in order to update OB sub-elements of document before the document closing + Events_Loop* aLoop = Events_Loop::loop(); + aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); + aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); + aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_DELETED)); } } } @@ -215,53 +239,30 @@ std::string Model_ResultPart::nameInPart(const std::shared_ptr& t if (!aDoc.get()) // the part document is not presented for the moment return ""; 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; - // check if the subShape is already in DF - Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(aShape, anAccessLabel); - Handle(TDataStd_Name) anAttr; - if(!aNS.IsNull() && !aNS->IsEmpty()) { // in the document - if(aNS->Label().FindAttribute(TDataStd_Name::GetID(), anAttr)) { - aName = TCollection_AsciiString(anAttr->Get()).ToCString(); - if(!aName.empty()) { - const TDF_Label& aLabel = aDoc->findNamingName(aName); - - static const std::string aPostFix("_"); - TNaming_Iterator anItL(aNS); - for(int i = 1; anItL.More(); anItL.Next(), i++) { - if(anItL.NewShape() == aShape) { - aName += aPostFix; - aName += TCollection_AsciiString (i).ToCString(); - break; - } - } - } - } - } - if (aName.empty()) { // not found, so use the selection mechanism - // for this the context result is needed - ResultPtr aContext; - const std::string& aBodyGroup = ModelAPI_ResultBody::group(); - for(int a = aDoc->size(aBodyGroup) - 1; a >= 0; a--) { - ResultPtr aBody = std::dynamic_pointer_cast(aDoc->object(aBodyGroup, a)); - if (aBody.get() && aBody->shape().get() && !aBody->isDisabled()) { - 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())) { - aContext = aBody; - break; - } + // for this the context result is needed + ResultPtr aContext; + const std::string& aBodyGroup = ModelAPI_ResultBody::group(); + for(int a = aDoc->size(aBodyGroup) - 1; a >= 0; a--) { + ResultPtr aBody = std::dynamic_pointer_cast(aDoc->object(aBodyGroup, a)); + if (aBody.get() && aBody->shape().get() && !aBody->isDisabled()) { + 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())) { + aContext = aBody; + break; } } } - if (aContext.get()) { - AttributeSelectionListPtr aSelAttr = aDoc->selectionInPartFeature(); - aSelAttr->append(aContext, theShape); - theIndex = aSelAttr->size(); - AttributeSelectionPtr aNewAttr = aSelAttr->value(theIndex - 1); - return aNewAttr->namingName(); - } + } + if (aContext.get()) { + AttributeSelectionListPtr aSelAttr = aDoc->selectionInPartFeature(); + aSelAttr->append(aContext, theShape); + theIndex = aSelAttr->size(); + AttributeSelectionPtr aNewAttr = aSelAttr->value(theIndex - 1); + return aNewAttr->namingName(); } return aName; } @@ -279,12 +280,42 @@ bool Model_ResultPart::updateInPart(const int theIndex) return false; // something is wrong } -std::shared_ptr Model_ResultPart::shapeInPart(const std::string& theName) +std::shared_ptr Model_ResultPart::shapeInPart( + const std::string& theName, const std::string& theType, int& theIndex) { - /// TODO: not implemented yet - return std::shared_ptr(); + theIndex = 0; // not found yet + std::shared_ptr aResult; + std::shared_ptr aDoc = std::dynamic_pointer_cast(partDoc()); + if (!aDoc.get()) // the part document is not presented for the moment + return aResult; + + AttributeSelectionListPtr aSelAttr = aDoc->selectionInPartFeature(); + // check this selection is already there: reuse it + int aSize = aSelAttr->size(); + for(int a = 0; a < aSize; a++) { + if (aSelAttr->value(a)->namingName() == theName) { + theIndex = a; + return aSelAttr->value(a)->value(); + } + } + + aSelAttr->append(theName, theType); + theIndex = aSelAttr->size(); + aResult = aSelAttr->value(theIndex - 1)->value(); + return aResult; } +std::shared_ptr Model_ResultPart::selectionValue(const int theIndex) +{ + std::shared_ptr aResult; + std::shared_ptr aDoc = std::dynamic_pointer_cast(partDoc()); + if (!aDoc.get()) // the part document is not presented for the moment + return aResult; + + AttributeSelectionListPtr aSelAttr = aDoc->selectionInPartFeature(); + aResult = aSelAttr->value(theIndex - 1)->value(); + return aResult; +} void Model_ResultPart::colorConfigInfo(std::string& theSection, std::string& theName, std::string& theDefault)