X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Session.cpp;h=98a1340f9c4b41eb0ed3a87a6da69aea163445f7;hb=1803da706614befff7cacbe408c69ea14d71a8bb;hp=e336d1652d3f7d2166cc095b231232cd09ece395;hpb=b4bccdade3d22c8375bcd5e374a9e99ab6fce250;p=modules%2Fshaper.git diff --git a/src/Model/Model_Session.cpp b/src/Model/Model_Session.cpp index e336d1652..98a1340f9 100644 --- a/src/Model/Model_Session.cpp +++ b/src/Model/Model_Session.cpp @@ -15,21 +15,28 @@ #include #include #include -#include +#include #include #include #include #include #include + +#include #include #include +#include #include #include #include #include -using namespace std; +#include +#include +#include + +#include static Model_Session* myImpl = new Model_Session(); @@ -144,7 +151,7 @@ std::list Model_Session::redoList() return ROOT_DOC->redoList(); } -FeaturePtr Model_Session::createFeature(string theFeatureID, Model_Document* theDocOwner) +FeaturePtr Model_Session::createFeature(std::string theFeatureID, Model_Document* theDocOwner) { if (this != myImpl) { return myImpl->createFeature(theFeatureID, theDocOwner); @@ -156,9 +163,9 @@ FeaturePtr Model_Session::createFeature(string theFeatureID, Model_Document* the if (myPlugins.find(theFeatureID) != myPlugins.end()) { std::pair& aPlugin = myPlugins[theFeatureID]; // plugin and doc kind if (!aPlugin.second.empty() && aPlugin.second != theDocOwner->kind()) { - Events_Error::send( - string("Feature '") + theFeatureID + "' can be created only in document '" - + aPlugin.second + "' by the XML definition"); + Events_InfoMessage("Model_Session", + "Feature '%1' can be created only in document '%2' by the XML definition") + .arg(theFeatureID).arg(aPlugin.second).send(); return FeaturePtr(); } myCurrentPluginName = aPlugin.first; @@ -169,16 +176,18 @@ FeaturePtr Model_Session::createFeature(string theFeatureID, Model_Document* the if (myPluginObjs.find(myCurrentPluginName) != myPluginObjs.end()) { FeaturePtr aCreated = myPluginObjs[myCurrentPluginName]->createFeature(theFeatureID); if (!aCreated) { - Events_Error::send( - string("Can not initialize feature '") + theFeatureID + "' in plugin '" - + myCurrentPluginName + "'"); + Events_InfoMessage("Model_Session", + "Can not initialize feature '%1' in plugin '%2'") + .arg(theFeatureID).arg(myCurrentPluginName).send(); } return aCreated; } else { - Events_Error::send(string("Can not load plugin '") + myCurrentPluginName + "'"); + Events_InfoMessage("Model_Session", + "Can not load plugin '%1'").arg(myCurrentPluginName).send(); } } else { - Events_Error::send(string("Feature '") + theFeatureID + "' not found in any plugin"); + Events_InfoMessage("Model_Session", + "Feature '%1' not found in any plugin").arg(theFeatureID).send(); } return FeaturePtr(); // return nothing @@ -189,6 +198,10 @@ std::shared_ptr Model_Session::moduleDocument() Handle(Model_Application) anApp = Model_Application::getApplication(); bool aFirstCall = !anApp->hasRoot(); if (aFirstCall) { + // to be sure that plugins are loaded, + // even before the first "createFeature" call (in unit tests) + + LoadPluginsInfo(); // creation of the root document is always outside of the transaction, so, avoid checking it setCheckTransactions(false); anApp->createDocument(0); // 0 is a root ID @@ -263,7 +276,7 @@ void Model_Session::setActiveDocument( bool aWasChecked = myCheckTransactions; setCheckTransactions(false); TDF_LabelList anEmptyUpdated; - aDoc->objects()->synchronizeFeatures(anEmptyUpdated, true, true); + aDoc->objects()->synchronizeFeatures(anEmptyUpdated, true, true, false, true); if (aWasChecked) setCheckTransactions(true); } @@ -287,10 +300,10 @@ void Model_Session::setActiveDocument( std::list > Model_Session::allOpenedDocuments() { - list > aResult; + std::list > aResult; aResult.push_back(moduleDocument()); // add subs recursively - list >::iterator aDoc = aResult.begin(); + std::list >::iterator aDoc = aResult.begin(); for(; aDoc != aResult.end(); aDoc++) { DocumentPtr anAPIDoc = *aDoc; std::shared_ptr aDoc = std::dynamic_pointer_cast(anAPIDoc); @@ -321,12 +334,56 @@ std::shared_ptr Model_Session::copy( Handle(TDF_DataSet) aDS = new TDF_DataSet; aDS->AddLabel(aSourceRoot); TDF_ClosureTool::Closure(aDS); - Handle(TDF_RelocationTable) aRT = new TDF_RelocationTable; + Handle(TDF_RelocationTable) aRT = new TDF_RelocationTable(Standard_True); aRT->SetRelocation(aSourceRoot, aTargetRoot); TDF_CopyTool::Copy(aDS, aRT); + // TODO: remove after fix in OCCT. + // All named shapes are stored in reversed order, so to fix this we reverse them back. + for(TDF_ChildIDIterator aChildIter(aTargetRoot, TNaming_NamedShape::GetID(), true); + aChildIter.More(); + aChildIter.Next()) { + Handle(TNaming_NamedShape) aNamedShape = + Handle(TNaming_NamedShape)::DownCast(aChildIter.Value()); + if (aNamedShape.IsNull()) { + continue; + } + + TopoDS_Shape aShape = aNamedShape->Get(); + if(aShape.IsNull() || aShape.ShapeType() != TopAbs_COMPOUND) { + continue; + } + + TNaming_Evolution anEvol = aNamedShape->Evolution(); + std::list > aShapePairs; // to store old and new shapes + for(TNaming_Iterator anIter(aNamedShape); anIter.More(); anIter.Next()) { + aShapePairs.push_back( + std::pair(anIter.OldShape(), anIter.NewShape())); + } + + // Add in reverse order. + TDF_Label aLabel = aNamedShape->Label(); + TNaming_Builder aBuilder(aLabel); + for(std::list >::iterator aPairsIter = + aShapePairs.begin(); + aPairsIter != aShapePairs.end(); + aPairsIter++) { + if (anEvol == TNaming_GENERATED) { + aBuilder.Generated(aPairsIter->first, aPairsIter->second); + } else if (anEvol == TNaming_MODIFY) { + aBuilder.Modify(aPairsIter->first, aPairsIter->second); + } else if (anEvol == TNaming_DELETE) { + aBuilder.Delete(aPairsIter->first); + } else if (anEvol == TNaming_PRIMITIVE) { + aBuilder.Generated(aPairsIter->second); + } else if (anEvol == TNaming_SELECTED) { + aBuilder.Select(aPairsIter->second, aPairsIter->first); + } + } + } + TDF_LabelList anEmptyUpdated; - aNew->objects()->synchronizeFeatures(anEmptyUpdated, true, true); + aNew->objects()->synchronizeFeatures(anEmptyUpdated, true, true, true, true); return aNew; } @@ -338,7 +395,7 @@ Model_Session::Model_Session() ModelAPI_Session::setSession(std::shared_ptr(this)); // register the configuration reading listener Events_Loop* aLoop = Events_Loop::loop(); - static const Events_ID kFeatureEvent = + static const Events_ID kFeatureEvent = Events_Loop::eventByName(Config_FeatureMessage::MODEL_EVENT()); aLoop->registerListener(this, kFeatureEvent); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED), 0, true); @@ -349,38 +406,40 @@ Model_Session::Model_Session() void Model_Session::processEvent(const std::shared_ptr& theMessage) { - static const Events_ID kFeatureEvent = + static const Events_ID kFeatureEvent = Events_Loop::eventByName(Config_FeatureMessage::MODEL_EVENT()); static const Events_ID kValidatorEvent = Events_Loop::eventByName(EVENT_VALIDATOR_LOADED); if (theMessage->eventID() == kFeatureEvent) { - const std::shared_ptr aMsg = + const std::shared_ptr aMsg = std::dynamic_pointer_cast(theMessage); if (aMsg) { + // process the plugin info, load plugin if (myPlugins.find(aMsg->id()) == myPlugins.end()) { myPlugins[aMsg->id()] = std::pair( aMsg->pluginLibrary(), aMsg->documentKind()); } } else { - const std::shared_ptr aMsgAttr = + const std::shared_ptr aMsgAttr = std::dynamic_pointer_cast(theMessage); if (aMsgAttr) { + if (!aMsgAttr->isObligatory()) { validators()->registerNotObligatory(aMsgAttr->featureId(), aMsgAttr->attributeId()); } if(aMsgAttr->isConcealment()) { validators()->registerConcealment(aMsgAttr->featureId(), aMsgAttr->attributeId()); } - if (!aMsgAttr->caseId().empty()) { - validators()->registerCase(aMsgAttr->featureId(), aMsgAttr->attributeId(), - aMsgAttr->switchId(), aMsgAttr->caseId()); + const std::list >& aCases = aMsgAttr->getCases(); + if (!aCases.empty()) { + validators()->registerCase(aMsgAttr->featureId(), aMsgAttr->attributeId(), aCases); } } } // plugins information was started to load, so, it will be loaded myPluginsInfoLoaded = true; } else if (theMessage->eventID() == kValidatorEvent) { - std::shared_ptr aMsg = + std::shared_ptr aMsg = std::dynamic_pointer_cast(theMessage); if (aMsg) { if (aMsg->attributeId().empty()) { // feature validator @@ -392,13 +451,14 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa } } else { // create/update/delete if (myCheckTransactions && !isOperation()) - Events_Error::send("Modification of data structure outside of the transaction"); + Events_InfoMessage("Model_Session", + "Modification of data structure outside of the transaction").send(); // if part is deleted, make the root as the current document (on undo of Parts creations) static const Events_ID kDeletedEvent = Events_Loop::eventByName(EVENT_OBJECT_DELETED); if (theMessage->eventID() == kDeletedEvent) { std::shared_ptr aDeleted = std::dynamic_pointer_cast(theMessage); - if (aDeleted && + if (aDeleted && aDeleted->groups().find(ModelAPI_ResultPart::group()) != aDeleted->groups().end()) { // check that the current feature of the session is still the active Part (even disabled) @@ -416,7 +476,8 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa } } if (!aFound) { // if not, the part was removed, so activate the module document - setActiveDocument(moduleDocument()); + if (myCurrentDoc.get()) + setActiveDocument(moduleDocument()); } } } @@ -427,7 +488,6 @@ void Model_Session::LoadPluginsInfo() { if (myPluginsInfoLoaded) // nothing to do return; - // Read plugins information from XML files Config_ModuleReader aModuleReader(Config_FeatureMessage::MODEL_EVENT()); aModuleReader.readAll(); @@ -444,8 +504,7 @@ void Model_Session::registerPlugin(ModelAPI_Plugin* thePlugin) { myPluginObjs[myCurrentPluginName] = thePlugin; static Events_ID EVENT_LOAD = Events_Loop::loop()->eventByName(EVENT_PLUGIN_LOADED); - ModelAPI_EventCreator::get()->sendUpdated(ObjectPtr(), EVENT_LOAD); - Events_Loop::loop()->flush(EVENT_LOAD); + ModelAPI_EventCreator::get()->sendUpdated(ObjectPtr(), EVENT_LOAD, false); // If the plugin has an ability to process GUI events, register it Events_Listener* aListener = dynamic_cast(thePlugin); if (aListener) {