From 3b2f8927207d5327b6ba6f0cd722940dafb8cc25 Mon Sep 17 00:00:00 2001 From: nds Date: Tue, 14 Jul 2015 13:41:55 +0300 Subject: [PATCH] Multi-rotation/translation deselect listo of objects. There is still a crash by deselection when edit them. --- .../SketchPlugin_MultiRotation.cpp | 19 ++++++++++++------ .../SketchPlugin_MultiTranslation.cpp | 20 ++++++++++++------- src/SketcherPrs/SketcherPrs_SymbolPrs.cpp | 4 +++- src/XGUI/XGUI_WorkshopListener.cpp | 11 ++++++++-- 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/SketchPlugin/SketchPlugin_MultiRotation.cpp b/src/SketchPlugin/SketchPlugin_MultiRotation.cpp index 1070ce0eb..5864a194e 100644 --- a/src/SketchPlugin/SketchPlugin_MultiRotation.cpp +++ b/src/SketchPlugin/SketchPlugin_MultiRotation.cpp @@ -283,11 +283,13 @@ void SketchPlugin_MultiRotation::attributeChanged(const std::string& theID) if (theID == ROTATION_LIST_ID()) { AttributeSelectionListPtr aRotationObjectRefs = selectionList(ROTATION_LIST_ID()); if (aRotationObjectRefs->size() == 0) { + // the commented code is not necessary here because if an update event is flushed + // before the setFlushed with true value happens, it leads to crash // Wait all objects being created, then send update events static Events_ID anUpdateEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); - bool isUpdateFlushed = Events_Loop::loop()->isFlushed(anUpdateEvent); - if (isUpdateFlushed) - Events_Loop::loop()->setFlushed(anUpdateEvent, false); + //bool isUpdateFlushed = Events_Loop::loop()->isFlushed(anUpdateEvent); + //if (isUpdateFlushed) + // Events_Loop::loop()->setFlushed(anUpdateEvent, false); int aNbCopies = integer(NUMBER_OF_COPIES_ID())->value(); // Clear list of objects @@ -308,11 +310,16 @@ void SketchPlugin_MultiRotation::attributeChanged(const std::string& theID) aDoc->removeFeature(aFeature); } } - integer(NUMBER_OF_COPIES_ID())->setValue(0); + aRefListOfRotated->clear(); + std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Constraint::ENTITY_A()))->clear(); + std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Constraint::ENTITY_B()))->clear(); + // the commented code is incorrect and obsolete, so it is removed // send events to update the sub-features by the solver - if (isUpdateFlushed) - Events_Loop::loop()->setFlushed(anUpdateEvent, true); + //if (isUpdateFlushed) + // Events_Loop::loop()->setFlushed(anUpdateEvent, true); } } } diff --git a/src/SketchPlugin/SketchPlugin_MultiTranslation.cpp b/src/SketchPlugin/SketchPlugin_MultiTranslation.cpp index b644a2f73..7d06cfd13 100644 --- a/src/SketchPlugin/SketchPlugin_MultiTranslation.cpp +++ b/src/SketchPlugin/SketchPlugin_MultiTranslation.cpp @@ -225,11 +225,13 @@ void SketchPlugin_MultiTranslation::attributeChanged(const std::string& theID) if (theID == TRANSLATION_LIST_ID()) { AttributeSelectionListPtr aTranslationObjectRefs = selectionList(TRANSLATION_LIST_ID()); if (aTranslationObjectRefs->size() == 0) { + // the commented code is not necessary here because if an update event is flushed + // before the setFlushed with true value happens, it leads to crash // Wait all objects being created, then send update events - static Events_ID anUpdateEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); - bool isUpdateFlushed = Events_Loop::loop()->isFlushed(anUpdateEvent); - if (isUpdateFlushed) - Events_Loop::loop()->setFlushed(anUpdateEvent, false); + //static Events_ID anUpdateEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); + //bool isUpdateFlushed = Events_Loop::loop()->isFlushed(anUpdateEvent); + //if (isUpdateFlushed) + // Events_Loop::loop()->setFlushed(anUpdateEvent, false); int aNbCopies = integer(NUMBER_OF_COPIES_ID())->value(); // Clear list of objects @@ -250,11 +252,15 @@ void SketchPlugin_MultiTranslation::attributeChanged(const std::string& theID) aDoc->removeFeature(aFeature); } } - integer(NUMBER_OF_COPIES_ID())->setValue(0); + aRefListOfTranslated->clear(); + std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Constraint::ENTITY_A()))->clear(); + std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Constraint::ENTITY_B()))->clear(); // send events to update the sub-features by the solver - if (isUpdateFlushed) - Events_Loop::loop()->setFlushed(anUpdateEvent, true); + //if (isUpdateFlushed) + // Events_Loop::loop()->setFlushed(anUpdateEvent, true); } } } diff --git a/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp b/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp index 77b40fc8b..30535729a 100644 --- a/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp +++ b/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp @@ -342,8 +342,10 @@ void SketcherPrs_SymbolPrs::Compute(const Handle(PrsMgr_PresentationManager3d)& aDriver->UserDrawCallback() = SymbolPrsCallBack; } - if (!updatePoints(20)) + if (!updatePoints(20)) { + mySPoints.Clear(); return; + } int aNbVertex = myPntArray->VertexNumber(); if (myOwner.IsNull()) { diff --git a/src/XGUI/XGUI_WorkshopListener.cpp b/src/XGUI/XGUI_WorkshopListener.cpp index 120a9390a..d6dd2834e 100755 --- a/src/XGUI/XGUI_WorkshopListener.cpp +++ b/src/XGUI/XGUI_WorkshopListener.cpp @@ -245,8 +245,15 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrisVisible(aObj); #ifdef DEBUG_FEATURE_REDISPLAY - //QString anObjInfo = ModuleBase_Tools::objectInfo((aObj)); - //qDebug(QString("visible=%1 : display= %2").arg(isVisibleObject).arg(anObjInfo).toStdString().c_str()); + QString anObjInfo = ModuleBase_Tools::objectInfo((aObj)); + qDebug(QString("visible=%1 : display= %2").arg(isVisibleObject).arg(anObjInfo).toStdString().c_str()); + + FeaturePtr aFeature = std::dynamic_pointer_cast(aObj); + if (aFeature.get()) { + std::string aKind = aFeature->getKind(); + if (aKind == "SketchMultiRotation") + bool aValue = true; + } #endif if (isVisibleObject) { // redisplay visible object -- 2.39.2