From 787e0f26ba0c38ea246c0757cbb1ea244f494185 Mon Sep 17 00:00:00 2001 From: nds Date: Thu, 30 Mar 2017 11:58:53 +0300 Subject: [PATCH] Issue #2027 Modification of data strtucture outside of transaction when create circle on face of box Modification is proposed by MPV --- src/PartSet/PartSet_Module.cpp | 86 +++++-------------- .../PartSet_OverconstraintListener.cpp | 7 +- src/PartSet/PartSet_OverconstraintListener.h | 5 -- src/XGUI/XGUI_Displayer.cpp | 3 - 4 files changed, 26 insertions(+), 75 deletions(-) diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index edd895a40..4382fca68 100755 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -1014,36 +1014,11 @@ bool PartSet_Module::customisePresentation(ResultPtr theResult, AISObjectPtr the if (!anObject) return aCustomized; - std::vector aColor; - //bool aCustomColor = myOverconstraintListener->hasCustomColor(anObject, aColor); - if (!theResult.get()) { - /*// customize sketch symbol presentation - if (thePrs.get()) { - Handle(AIS_InteractiveObject) anAISIO = thePrs->impl(); - if (!anAISIO.IsNull()) { - if (!Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO).IsNull()) { - Handle(SketcherPrs_SymbolPrs) aPrs = Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO); - if (!aPrs.IsNull()) { - aPrs->SetCustomColor(aColor); - aCustomized = true; - } - } else if (!Handle(SketcherPrs_Coincident)::DownCast(anAISIO).IsNull()) { - Handle(SketcherPrs_Coincident) aPrs = Handle(SketcherPrs_Coincident)::DownCast(anAISIO); - if (!aPrs.IsNull()) { - aPrs->SetCustomColor(aColor); - aCustomized = true; - } - } - } - }*/ - // customize sketch dimension constraint presentation - //if (!aCustomized) { - // if (!aCustomColor) + std::vector aColor; XGUI_CustomPrs::getDefaultColor(anObject, true, aColor); if (!aColor.empty()) { aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]); - // } } } // customize dimentional constrains @@ -1065,47 +1040,32 @@ bool PartSet_Module::afterCustomisePresentation(std::shared_ptr return aCustomized; std::vector aColor; - bool aCustomColorChanged = myOverconstraintListener->isNeedUpdateCustomColor(); - if (aCustomColorChanged) { - bool aUseCustomColor = true; - // do not use fully constrained color if create operation is started - /*if (aWorkshop->operationMgr()->hasOperation()) { - ModuleBase_OperationFeature* aFOperation = dynamic_cast - (aWorkshop->operationMgr()->currentOperation()); - if (aFOperation && !aFOperation->isEditOperation()) - aUseCustomColor = false; - }*/ - if (aUseCustomColor) - myOverconstraintListener->getCustomColor(anObject, aColor); - //if (!theResult.get()) { - // customize sketch symbol presentation - //if (thePrs.get()) { - Handle(AIS_InteractiveObject) anAISIO = thePrs->impl(); - if (!anAISIO.IsNull()) { - if (!Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO).IsNull()) { - Handle(SketcherPrs_SymbolPrs) aPrs = Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO); - if (!aPrs.IsNull()) { - aPrs->SetCustomColor(aColor); - aCustomized = true; - } - } else if (!Handle(SketcherPrs_Coincident)::DownCast(anAISIO).IsNull()) { - Handle(SketcherPrs_Coincident) aPrs = Handle(SketcherPrs_Coincident)::DownCast(anAISIO); - if (!aPrs.IsNull()) { - aPrs->SetCustomColor(aColor); - aCustomized = true; - } - } + bool aUseCustomColor = true; + if (aUseCustomColor) + myOverconstraintListener->getCustomColor(anObject, aColor); + // customize sketch symbol presentation + Handle(AIS_InteractiveObject) anAISIO = thePrs->impl(); + if (!anAISIO.IsNull()) { + if (!Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO).IsNull()) { + Handle(SketcherPrs_SymbolPrs) aPrs = Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO); + if (!aPrs.IsNull()) { + aPrs->SetCustomColor(aColor); + aCustomized = true; } - //} - // customize sketch dimension constraint presentation - if (!aCustomized) { - //if (!aCustomColor) - // XGUI_CustomPrs::getDefaultColor(anObject, true, aColor); - if (!aColor.empty()) { // otherwise presentation has the default color - aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]); + } else if (!Handle(SketcherPrs_Coincident)::DownCast(anAISIO).IsNull()) { + Handle(SketcherPrs_Coincident) aPrs = Handle(SketcherPrs_Coincident)::DownCast(anAISIO); + if (!aPrs.IsNull()) { + aPrs->SetCustomColor(aColor); + aCustomized = true; } } } + // customize sketch dimension constraint presentation + if (!aCustomized) { + if (!aColor.empty()) { // otherwise presentation has the default color + aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]); + } + } return aCustomized; } diff --git a/src/PartSet/PartSet_OverconstraintListener.cpp b/src/PartSet/PartSet_OverconstraintListener.cpp index 0e74b0600..18125ad34 100755 --- a/src/PartSet/PartSet_OverconstraintListener.cpp +++ b/src/PartSet/PartSet_OverconstraintListener.cpp @@ -30,7 +30,7 @@ //#define DEBUG_FEATURE_OVERCONSTRAINT_LISTENER PartSet_OverconstraintListener::PartSet_OverconstraintListener(ModuleBase_IWorkshop* theWorkshop) -: myWorkshop(theWorkshop), myIsFullyConstrained(false)//, myIsNeedUpdateCustomColor(false) +: myWorkshop(theWorkshop), myIsFullyConstrained(false) { Events_Loop* aLoop = Events_Loop::loop(); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_SOLVER_FAILED)); @@ -54,7 +54,8 @@ void PartSet_OverconstraintListener::getCustomColor(const ObjectPtr& theObject, } if (myIsFullyConstrained) { FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); - if (aFeature.get()) { + // only entity features has custom color when sketch is fully constrained + if (aFeature.get() && PartSet_SketcherMgr::isEntity(aFeature->getKind())) { PartSet_Module* aModule = dynamic_cast(myWorkshop->module()); CompositeFeaturePtr aCompositeFeature = aModule->sketchMgr()->activeSketch(); // the given object is sub feature of the current sketch(created or edited) @@ -114,7 +115,6 @@ void PartSet_OverconstraintListener::processEvent( myIsFullyConstrained = anEventID == Events_Loop::eventByName(EVENT_SKETCH_FULLY_CONSTRAINED); if (aPrevFullyConstrained != myIsFullyConstrained) { - //myIsNeedUpdateCustomColor = true; std::set aModifiedObjects; PartSet_Module* aModule = dynamic_cast(myWorkshop->module()); CompositeFeaturePtr aSketch = aModule->sketchMgr()->activeSketch(); @@ -130,7 +130,6 @@ void PartSet_OverconstraintListener::processEvent( } redisplayObjects(aModifiedObjects); } - //myIsNeedUpdateCustomColor = false; } } else if (anEventID == Events_Loop::eventByName(EVENT_OBJECT_CREATED)) { diff --git a/src/PartSet/PartSet_OverconstraintListener.h b/src/PartSet/PartSet_OverconstraintListener.h index 4051c0c95..9ce9a4e4c 100755 --- a/src/PartSet/PartSet_OverconstraintListener.h +++ b/src/PartSet/PartSet_OverconstraintListener.h @@ -44,10 +44,6 @@ public: /// \return boolean result void getCustomColor(const ObjectPtr& theObject, std::vector& theColor); - /// Returns true if custom color of presentations is changed and it should be redisplayed - /// \return boolean value - bool isNeedUpdateCustomColor() const { return true;/*myIsNeedUpdateCustomColor;*/ } - /// Redefinition of Events_Listener method virtual void processEvent(const std::shared_ptr& theMessage); @@ -81,7 +77,6 @@ private: std::set myConflictingObjects; ModuleBase_IWorkshop* myWorkshop; bool myIsFullyConstrained; /// state if Solver is fully constrained, DOF = 0 - bool myIsNeedUpdateCustomColor; }; #endif diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 26672b472..dafd6dd98 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -1351,7 +1351,6 @@ bool XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO, return isActivationChanged; } -//#define DEBUG_FULLY_CONSTRAINED bool XGUI_Displayer::customizeObject(ObjectPtr theObject) { AISObjectPtr anAISObj = getAISObject(theObject); @@ -1374,10 +1373,8 @@ bool XGUI_Displayer::customizeObject(ObjectPtr theObject) } bool isCustomized = aCustomPrs.get() && aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs); -#ifdef DEBUG_FULLY_CONSTRAINED isCustomized = myWorkshop->module()->afterCustomisePresentation(aResult, anAISObj, myCustomPrs) || isCustomized; -#endif return isCustomized; } -- 2.39.2