X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=febeae273ef5db9be8d20adbc0955dfba46b164a;hb=44d447459becc9e2fc08985f89da5cb4bd7b9c33;hp=b6a259050fd300695dac1144703cefb0bbe2bbb0;hpb=41ce7f10d66940b02b4d2dd579747f1f2c27c3ea;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp old mode 100755 new mode 100644 index b6a259050..febeae273 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "PartSet_Module.h" @@ -38,16 +37,23 @@ #include "PartSet_CustomPrs.h" #include "PartSet_IconFactory.h" #include "PartSet_OverconstraintListener.h" +#include "PartSet_TreeNodes.h" +#include "PartSet_FieldStepPrs.h" #include "PartSet_Filters.h" #include "PartSet_FilterInfinite.h" +#ifdef _DEBUG +#include +#endif + #include #include #include +#include + #include -#include #include #include #include @@ -60,7 +66,9 @@ #include #include #include +#include +#include #include #include #include @@ -71,6 +79,8 @@ #include #include #include +#include +#include #include #include @@ -80,7 +90,6 @@ #include #include #include -#include #include #include #include @@ -104,6 +113,7 @@ #include #include +#include #include #include @@ -134,10 +144,6 @@ #include -#ifdef _DEBUG -#include -#endif - /*!Create and return new instance of XGUI_Module*/ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop) { @@ -148,9 +154,10 @@ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) : ModuleBase_IModule(theWshop), myVisualLayerId(0), + myRoot(0), myIsOperationIsLaunched(false) { - new PartSet_IconFactory(); + new PartSet_IconFactory(this); mySketchMgr = new PartSet_SketcherMgr(this); mySketchReentrantMgr = new PartSet_SketcherReentrantMgr(theWshop); @@ -172,6 +179,7 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) Events_Loop* aLoop = Events_Loop::loop(); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); registerSelectionFilter(SF_GlobalFilter, new PartSet_GlobalFilter(myWorkshop)); registerSelectionFilter(SF_FilterInfinite, new PartSet_FilterInfinite(myWorkshop)); @@ -183,6 +191,26 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) setDefaultConstraintShown(); + //Config_PropManager::registerProp("Visualization", "object_default_color", "Object color", + // Config_Prop::Color, "225,225,225"); + + Config_PropManager::registerProp("Visualization", "result_body_color", "Result color", + Config_Prop::Color, ModelAPI_ResultBody::DEFAULT_COLOR()); + + Config_PropManager::registerProp("Visualization", "result_group_color", "Group color", + Config_Prop::Color, ModelAPI_ResultGroup::DEFAULT_COLOR()); + + Config_PropManager::registerProp("Visualization", "result_construction_color", + "Construction color", + Config_Prop::Color, + ModelAPI_ResultConstruction::DEFAULT_COLOR()); + + Config_PropManager::registerProp("Visualization", "result_part_color", "Part color", + Config_Prop::Color, ModelAPI_ResultPart::DEFAULT_COLOR()); + + Config_PropManager::registerProp("Visualization", "result_field_color", "Field color", + Config_Prop::Color, ModelAPI_ResultField::DEFAULT_COLOR()); + Config_PropManager::registerProp("Visualization", "operation_parameter_color", "Reference shape wireframe color in operation", Config_Prop::Color, PartSet_CustomPrs::OPERATION_PARAMETER_COLOR()); @@ -201,24 +229,51 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) Config_PropManager::registerProp("Visualization", "hidden_face_transparency", "Hidden faces transparency", - Config_Prop::Double, + Config_Prop::DblSpin, "0.8"); + std::ostringstream aStream; + aStream << SketcherPrs_Tools::getDefaultArrowSize(); + Config_PropManager::registerProp("Visualization", "dimension_arrow_size", + "Dimension arrow size", Config_Prop::IntSpin, aStream.str()); + + Config_PropManager::registerProp("Visualization", "dimension_font", "Dimension font", + Config_Prop::String, "Times-bold"); + + aStream.str(""); + aStream.clear(); + aStream << SketcherPrs_Tools::getDefaultTextHeight(); + Config_PropManager::registerProp("Visualization", "dimension_value_size", + "Dimension value size", Config_Prop::IntSpin, aStream.str()); + + Config_PropManager::registerProp("Visualization", "sketch_dimension_color", + "Dimension color", + Config_Prop::Color, SKETCH_DIMENSION_COLOR); + + Config_PropManager::registerProp("Shortcuts", "add_parameter_shortcut", + "Add parameter in parameters manager dialog", + Config_Prop::Shortcut, "Ctrl+A"); + + Config_PropManager::registerProp("Windows", "use_hide_faces_panel", "Use HideFaces panel in operations", + Config_Prop::Boolean, "false"); } //****************************************************** PartSet_Module::~PartSet_Module() { - std::map::const_iterator aFiltersIt = - mySelectionFilters.begin(); - for (; aFiltersIt != mySelectionFilters.end(); aFiltersIt++) { - Handle(SelectMgr_Filter) aFilter = aFiltersIt->second; - if (!aFilter.IsNull()) - aFilter.Nullify(); - } delete myCustomPrs; delete myOverconstraintListener; + delete myRoot; +} + +//****************************************************** +void PartSet_Module::createFeatures() +{ + ModuleBase_IModule::createFeatures(); + myRoot = new PartSet_RootNode(); + myRoot->setWorkshop(workshop()); } + //****************************************************** void PartSet_Module::storeSelection() { @@ -264,6 +319,7 @@ void PartSet_Module::registerValidators() new PartSet_MultyTranslationSelection); aFactory->registerValidator("PartSet_SplitSelection", new PartSet_SplitSelection); aFactory->registerValidator("PartSet_ProjectionSelection", new PartSet_ProjectionSelection); + aFactory->registerValidator("PartSet_IntersectionSelection", new PartSet_IntersectionSelection); } //****************************************************** @@ -401,9 +457,11 @@ void PartSet_Module::updateSketcherOnStart(ModuleBase_Operation* theOperation) if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { mySketchMgr->startSketch(theOperation); } - else if (sketchMgr()->isNestedSketchOperation(theOperation)) { - mySketchMgr->startNestedSketch(theOperation); - } + // It is switched off because of + // Task #3067: 5.2.2 Drawing in the sketcher: change the mouse cursor arrow + //else if (sketchMgr()->isNestedSketchOperation(theOperation)) { + // mySketchMgr->startNestedSketch(theOperation); + //} } //****************************************************** @@ -412,8 +470,8 @@ void PartSet_Module::updatePresentationsOnStart(ModuleBase_Operation* theOperati ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); if (aFOperation) { - myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeArguments, true); - myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeResults, true); + myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeArguments, false); + myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeResults, false); } } @@ -425,8 +483,8 @@ void PartSet_Module::operationResumed(ModuleBase_Operation* theOperation) ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); if (aFOperation) { - myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeArguments, true); - myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeResults, true); + myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeArguments, false); + myCustomPrs->activate(aFOperation->feature(), ModuleBase_IModule::CustomizeResults, false); } } @@ -621,12 +679,9 @@ void PartSet_Module::moduleSelectionModes(int theModesType, QIntList& theModes) void PartSet_Module::moduleSelectionFilters(const QIntList& theFilterTypes, SelectMgr_ListOfFilter& theSelectionFilters) { - bool isSketchActive = mySketchMgr->activeSketch(); - XGUI_ActiveControlSelector* anActiveSelector = getWorkshop()->activeControlMgr()->activeSelector(); - bool isHideFacesActive = anActiveSelector && - anActiveSelector->getType() == XGUI_FacesPanelSelector::Type(); + bool isSketchActive = mySketchMgr->activeSketch().get(); - std::map::const_iterator aFiltersIt = + std::map::const_iterator aFiltersIt = mySelectionFilters.begin(); for (; aFiltersIt != mySelectionFilters.end(); aFiltersIt++) { int aFilterType = aFiltersIt->first; @@ -636,47 +691,17 @@ void PartSet_Module::moduleSelectionFilters(const QIntList& theFilterTypes, // using sketch filters only if sketch operation is active if (!isSketchActive && - mySketchMgr->sketchSelectionFilter((PartSet_SelectionFilterType)aFilterType)) + mySketchMgr->sketchSelectionFilter((ModuleBase_SelectionFilterType)aFilterType)) continue; - // using filtering of construction results only when faces panel is active - if (aFilterType == SF_ResultGroupNameFilter && !isHideFacesActive) + // using filtering of construction results only from faces panel + if (aFilterType == SF_ResultGroupNameFilter) continue; theSelectionFilters.Append(aFiltersIt->second); } } -//****************************************************** -QIntList PartSet_Module::selectionFilters() -{ - QIntList aTypes; - - std::map::const_iterator aFiltersIt = - mySelectionFilters.begin(); - for (; aFiltersIt != mySelectionFilters.end(); aFiltersIt++) - aTypes.append(aFiltersIt->first); - - return aTypes; -} - -//****************************************************** -void PartSet_Module::registerSelectionFilter(const PartSet_SelectionFilterType theFilterType, - const Handle(SelectMgr_Filter)& theFilter) -{ - mySelectionFilters[theFilterType] = theFilter; -} - -//****************************************************** -Handle(SelectMgr_Filter) PartSet_Module::selectionFilter( - const PartSet_SelectionFilterType theFilterType) -{ - if (mySelectionFilters.find(theFilterType) != mySelectionFilters.end()) - return mySelectionFilters[theFilterType]; - else - return Handle(SelectMgr_Filter)(); -} - //****************************************************** void PartSet_Module::customSubShapesSelectionModes(QIntList& theModes) { @@ -723,6 +748,7 @@ bool PartSet_Module::isSketchNeutralPointActivated() const void PartSet_Module::closeDocument() { myActivePartIndex = QModelIndex(); + SketcherPrs_PositionMgr::get()->clearAll(); } //****************************************************** @@ -750,16 +776,14 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) } //****************************************************** -bool PartSet_Module::createWidgets(ModuleBase_Operation* theOperation, +bool PartSet_Module::createWidgets(const FeaturePtr& theFeature, const QString& theXmlRepr, QList& theWidgets) const { bool aProcessed = false; - ModuleBase_OperationFeature* aFOperation = - dynamic_cast(theOperation); XGUI_Workshop* aWorkshop = getWorkshop(); XGUI_PropertyPanel* aPropertyPanel = aWorkshop->propertyPanel(); - if (mySketchMgr->activeSketch().get() && aFOperation && aPropertyPanel) { + if (mySketchMgr->activeSketch().get() && aPropertyPanel) { ModuleBase_ISelection* aSelection = workshop()->selection(); // click on a point in sketch leads here with the point is highlighted, not yet selected QList aPreselection = aSelection->getHighlighted(); @@ -768,11 +792,10 @@ bool PartSet_Module::createWidgets(ModuleBase_Operation* theOperation, ObjectPtr anObject = aSelectedPrs->object(); FeaturePtr aFeature = ModelAPI_Feature::feature(anObject); - FeaturePtr anOpFeature = aFOperation->feature(); GeomShapePtr aShape = aSelectedPrs->shape(); // click on the digit of dimension constrain comes here // with an empty shape, so we need the check - if (aFeature == anOpFeature && aShape.get() && !aShape->isNull()) { + if (aFeature == theFeature && aShape.get() && !aShape->isNull()) { // if feature has only one result and shape of result is equal to selected shape // this attribute is not processed. It is a case of Sketch Point. if (aFeature->results().size() == 1) { @@ -784,8 +807,7 @@ bool PartSet_Module::createWidgets(ModuleBase_Operation* theOperation, AttributePtr anAttribute = PartSet_Tools::findAttributeBy2dPoint(anObject, aTDShape, mySketchMgr->activeSketch()); if (anAttribute.get()) { - QString aXmlRepr = aFOperation->getDescription()->xmlRepresentation(); - ModuleBase_WidgetFactory aFactory(aXmlRepr.toStdString(), workshop()); + ModuleBase_WidgetFactory aFactory(theXmlRepr.toStdString(), workshop()); const std::string anAttributeId = anAttribute->id(); aFactory.createWidget(aPropertyPanel->contentWidget(), anAttributeId); @@ -859,6 +881,10 @@ ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& th mySketchMgr, SLOT(onPlaneSelected(const std::shared_ptr&))); connect(aLabelWgt, SIGNAL(showConstraintToggled(int, bool)), mySketchMgr, SLOT(onShowConstraintsToggle(int, bool))); + connect(aLabelWgt, SIGNAL(showFreePoints(bool)), mySketchMgr, SLOT(onShowPoints(bool))); + connect(aLabelWgt, SIGNAL(autoConstraints(bool)), + sketchReentranceMgr(), SLOT(onAutoConstraints(bool))); + aLabelWgt->setShowPointsState(mySketchMgr->isShowFreePointsShown()); aWgt = aLabelWgt; } else if (theType == "sketch-2dpoint_selector") { PartSet_WidgetPoint2D* aPointWgt = new PartSet_WidgetPoint2D(theParent, aWorkshop, @@ -908,15 +934,15 @@ ModuleBase_ModelWidget* PartSet_Module::activeWidget() const { ModuleBase_ModelWidget* anActiveWidget = 0; - anActiveWidget = mySketchReentrantMgr->internalActiveWidget(); - if (!anActiveWidget) { - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - if (aOperation) { - ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); - anActiveWidget = aPanel ? aPanel->activeWidget() : 0; - } - } - return anActiveWidget; + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (!aOperation) + return anActiveWidget; + + ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + if (!aPanel) + return anActiveWidget; + + return aPanel->activeWidget(true); } //****************************************************** @@ -965,7 +991,7 @@ bool PartSet_Module::deleteObjects() // 3. start operation QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text(); - ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction(aDescription, this); + ModuleBase_Operation* anOpAction = new ModuleBase_Operation(aDescription, this); // the active nested sketch operation should be aborted unconditionally // the Delete action should be additionally granted for the Sketch operation @@ -1047,22 +1073,23 @@ void PartSet_Module::onObjectDisplayed(ObjectPtr theObject, AISObjectPtr theAIS) { Handle(AIS_InteractiveObject) anAIS = theAIS->impl(); if (!anAIS.IsNull()) { - bool aToUseZLayer = false; FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); - if (aFeature.get() && PartSet_Tools::findRefsToMeFeature(aFeature, - SketchPlugin_Projection::ID())) - aToUseZLayer = true; - Handle(AIS_InteractiveContext) aCtx = anAIS->GetContext(); - Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast(anAIS); - if (!aDim.IsNull()) { - aToUseZLayer = true; - } else { - Handle(SketcherPrs_SymbolPrs) aCons = Handle(SketcherPrs_SymbolPrs)::DownCast(anAIS); - if (!aCons.IsNull()) - aToUseZLayer = true; + if (aFeature.get()) { + bool aToUseZLayer = false; + if (PartSet_Tools::findRefsToMeFeature(aFeature,SketchPlugin_Projection::ID())) + aToUseZLayer = true; + else { + CompositeFeaturePtr aParent = ModelAPI_Tools::compositeOwner(aFeature); + aToUseZLayer = (aParent.get() && (aParent->getKind() == SketchPlugin_Sketch::ID())); + } + if (aToUseZLayer) { + Handle(AIS_InteractiveContext) aCtx = anAIS->GetContext(); + if (aFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) + aCtx->SetZLayer(anAIS, Graphic3d_ZLayerId_Top); + else + aCtx->SetZLayer(anAIS, myVisualLayerId); + } } - if (aToUseZLayer) - aCtx->SetZLayer(anAIS, myVisualLayerId); } } @@ -1108,10 +1135,12 @@ void PartSet_Module::onViewTransformed(int theTrsfType) if (aView.IsNull()) return; + bool isModified = false; ModuleBase_Operation* aCurrentOperation = myWorkshop->currentOperation(); if (aCurrentOperation && (PartSet_SketcherMgr::isSketchOperation(aCurrentOperation) || - sketchMgr()->isNestedSketchOperation(aCurrentOperation))) + sketchMgr()->isNestedSketchOperation(aCurrentOperation) || + (aCurrentOperation->id() == "Measurement"))) { double aLen = aView->Convert(SketcherPrs_Tools::getConfigArrowSize()); @@ -1119,11 +1148,14 @@ void PartSet_Module::onViewTransformed(int theTrsfType) SketcherPrs_Tools::setArrowSize(aLen); const double aCurScale = aViewer->activeView()->Camera()->Scale(); aViewer->SetScale(aViewer->activeView(), aCurScale); - bool isModified = false; +#ifdef OPTIMIZE_PRS + QList aPrsList = aDisplayer->displayedPresentations(); + foreach(Handle(AIS_InteractiveObject) aAisObj, aPrsList) { +#else QList aPrsList = aDisplayer->displayedPresentations(); - foreach (AISObjectPtr aAIS, aPrsList) { + foreach(AISObjectPtr aAIS, aPrsList) { Handle(AIS_InteractiveObject) aAisObj = aAIS->impl(); - +#endif Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast(aAisObj); if (!aDim.IsNull()) { aDim->DimensionAspect()->ArrowAspect()->SetLength(aLen); @@ -1134,6 +1166,7 @@ void PartSet_Module::onViewTransformed(int theTrsfType) if (isModified) aDisplayer->updateViewer(); } + } //****************************************************** @@ -1158,75 +1191,75 @@ void PartSet_Module::deactivateCustomPrs(const ModuleBase_CustomizeFlag& theFlag } //****************************************************** -bool PartSet_Module::customisePresentation(ResultPtr theResult, AISObjectPtr thePrs, - std::shared_ptr theCustomPrs) -{ - bool aCustomized = false; - - XGUI_Workshop* aWorkshop = getWorkshop(); - XGUI_Displayer* aDisplayer = aWorkshop->displayer(); - ObjectPtr anObject = aDisplayer->getObject(thePrs); - if (!anObject) - return aCustomized; - - if (!theResult.get()) { - std::vector aColor; - XGUI_CustomPrs::getDefaultColor(anObject, true, aColor); - if (!aColor.empty()) { - aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]); - } - } - // customize dimentional constrains - sketchMgr()->customizePresentation(anObject); - - return aCustomized; -} - -//****************************************************** -bool PartSet_Module::afterCustomisePresentation(std::shared_ptr theResult, - AISObjectPtr thePrs, - GeomCustomPrsPtr theCustomPrs) -{ - bool aCustomized = false; - - XGUI_Workshop* aWorkshop = getWorkshop(); - XGUI_Displayer* aDisplayer = aWorkshop->displayer(); - ObjectPtr anObject = aDisplayer->getObject(thePrs); - if (!anObject) - return aCustomized; - - std::vector aColor; - 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; - } - } 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; -} - -//****************************************************** -bool PartSet_Module::customizeObject(ObjectPtr theObject, const ModuleBase_CustomizeFlag& theFlag, +//bool PartSet_Module::customisePresentation(ResultPtr theResult, AISObjectPtr thePrs, +// std::shared_ptr theCustomPrs) +//{ +// bool aCustomized = false; +// +// XGUI_Workshop* aWorkshop = getWorkshop(); +// XGUI_Displayer* aDisplayer = aWorkshop->displayer(); +// ObjectPtr anObject = aDisplayer->getObject(thePrs); +// if (!anObject) +// return aCustomized; +// +// if (!theResult.get()) { +// std::vector aColor; +// XGUI_CustomPrs::getDefaultColor(anObject, true, aColor); +// if (!aColor.empty()) { +// aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]); +// } +// } +// // customize dimentional constrains +// sketchMgr()->customisePresentation(anObject); +// +// return aCustomized; +//} +// +////****************************************************** +//bool PartSet_Module::afterCustomisePresentation(std::shared_ptr theResult, +// AISObjectPtr thePrs, +// GeomCustomPrsPtr theCustomPrs) +//{ +// bool aCustomized = false; +// +// XGUI_Workshop* aWorkshop = getWorkshop(); +// XGUI_Displayer* aDisplayer = aWorkshop->displayer(); +// ObjectPtr anObject = aDisplayer->getObject(thePrs); +// if (!anObject) +// return aCustomized; +// +// std::vector aColor; +// 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; +// } +// } 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; +//} + +//****************************************************** +bool PartSet_Module::customizeFeature(ObjectPtr theObject, const ModuleBase_CustomizeFlag& theFlag, const bool theUpdateViewer) { bool isRedisplayed = false; @@ -1271,11 +1304,101 @@ void PartSet_Module::onActiveDocPopup(const QPoint& thePnt) } //****************************************************** -Handle(AIS_InteractiveObject) PartSet_Module::createPresentation(const ResultPtr& theResult) +AISObjectPtr PartSet_Module::createPresentation(const ObjectPtr& theObject) +{ + Handle(AIS_InteractiveObject) anAISPrs = mySketchMgr->createPresentation(theObject); + if (anAISPrs.IsNull()) { + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (aResult.get()) { + std::shared_ptr aShapePtr = ModelAPI_Tools::shape(aResult); + if (aShapePtr.get() != NULL) + anAISPrs = new ModuleBase_ResultPrs(aResult); + } + else { + FieldStepPtr aStep = + std::dynamic_pointer_cast(theObject); + if (aStep.get()) { + anAISPrs = new PartSet_FieldStepPrs(aStep); + } + } + } + AISObjectPtr anAIS; + if (!anAISPrs.IsNull()) { + Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(anAISPrs); + if (!aShapePrs.IsNull()) + ModuleBase_Tools::setPointBallHighlighting((AIS_Shape*)aShapePrs.get()); + + anAIS = AISObjectPtr(new GeomAPI_AISObject()); + anAIS->setImpl(new Handle(AIS_InteractiveObject)(anAISPrs)); + customizePresentation(theObject, anAIS); + } + return anAIS; +} + +//****************************************************** +void getResultColor(const ResultPtr& theResult, std::vector& theColor) +{ + ModelAPI_Tools::getColor(theResult, theColor); + if (theColor.empty()) + PartSet_Tools::getDefaultColor(theResult, false, theColor); +} + +//****************************************************** +double getResultDeflection(const ResultPtr& theResult) +{ + double aDeflection = ModelAPI_Tools::getDeflection(theResult); + if (aDeflection < 0) + aDeflection = PartSet_Tools::getDefaultDeflection(theResult); + return aDeflection; +} + +//****************************************************** +double getResultTransparency(const ResultPtr& theResult) { - return mySketchMgr->createPresentation(theResult); + double aTransparency = ModelAPI_Tools::getTransparency(theResult); + if (aTransparency < 0) + aTransparency = PartSet_Tools::getDefaultTransparency(); + return aTransparency; } + +//****************************************************** +void PartSet_Module::customizePresentation(const ObjectPtr& theObject, + const AISObjectPtr& thePrs) const +{ + if (mySketchMgr->isSketchStarted()) { + mySketchMgr->customizeSketchPresentation(theObject, thePrs); + } + else { + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (aResult.get()) { + std::vector aColor; + getResultColor(aResult, aColor); + + SessionPtr aMgr = ModelAPI_Session::get(); + if (aMgr->activeDocument() != aResult->document()) { + QColor aQColor(aColor[0], aColor[1], aColor[2]); + QColor aNewColor = + QColor::fromHsvF(aQColor.hueF(), aQColor.saturationF() / 3., aQColor.valueF()); + aColor[0] = aNewColor.red(); + aColor[1] = aNewColor.green(); + aColor[2] = aNewColor.blue(); + } + thePrs->setColor(aColor[0], aColor[1], aColor[2]); + + thePrs->setDeflection(getResultDeflection(aResult)); + + thePrs->setTransparency(getResultTransparency(aResult)); + } + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + if (aFeature.get()) { + if (aFeature->getKind() == SketchPlugin_Sketch::ID()) + thePrs->setWidth(2); + } + } +} + + //****************************************************** ObjectPtr PartSet_Module::findPresentedObject(const AISObjectPtr& theAIS) const { @@ -1402,10 +1525,15 @@ void PartSet_Module::processEvent(const std::shared_ptr& theMess SessionPtr aMgr = ModelAPI_Session::get(); DocumentPtr aActiveDoc = aMgr->activeDocument(); - if (myActivePartIndex.isValid()) - aTreeView->setExpanded(myActivePartIndex, false); + + // Clear active part index if there is no Part documents + // It could be not null if document was closed and opened a new + // without closeDocument call + if (aMgr->allOpenedDocuments().size() <= 1) + myActivePartIndex = QModelIndex(); XGUI_DataModel* aDataModel = aWorkshop->objectBrowser()->dataModel(); + QModelIndex aOldActive = myActivePartIndex; myActivePartIndex = aDataModel->documentRootIndex(aActiveDoc, 0); bool needUpdate = false; if (myActivePartIndex.isValid()) { @@ -1413,6 +1541,8 @@ void PartSet_Module::processEvent(const std::shared_ptr& theMess if (!needUpdate) aTreeView->setExpanded(myActivePartIndex, true); } + if ((aOldActive != myActivePartIndex) && (aOldActive.isValid())) + aTreeView->setExpanded(aOldActive, false); aLabel->setPalette(aPalet); aWorkshop->updateCommandStatus(); @@ -1421,16 +1551,20 @@ void PartSet_Module::processEvent(const std::shared_ptr& theMess XGUI_Displayer* aDisplayer = aWorkshop->displayer(); QObjectPtrList aObjects = aDisplayer->displayedObjects(); bool aHidden; + bool aUpdateViewer = false; foreach(ObjectPtr aObj, aObjects) { aHidden = !aObj->data() || !aObj->data()->isValid() || aObj->isDisabled() || (!aObj->isDisplayed()); - if (!aHidden) + if (!aHidden) { aDisplayer->redisplay(aObj, false); + aUpdateViewer = true; + } } - aDisplayer->updateViewer(); + if (aUpdateViewer) + aDisplayer->updateViewer(); // Update tree items if they are expanded if (needUpdate) { - aTreeView->viewport()->repaint(aTreeView->viewport()->rect()); + aTreeView->viewport()->update(aTreeView->viewport()->rect()); } } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED)) { std::shared_ptr aUpdMsg = @@ -1466,6 +1600,14 @@ void PartSet_Module::processEvent(const std::shared_ptr& theMess } } } + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)) { + CompositeFeaturePtr aSketch = mySketchMgr->activeSketch(); + if (aSketch.get()) { + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); + if (PartSet_SketcherMgr::isSketchOperation(anOperation)) + mySketchMgr->previewSketchPlane()->createSketchPlane(aSketch, myWorkshop); + } + } } //****************************************************** @@ -1630,10 +1772,25 @@ XGUI_Workshop* PartSet_Module::getWorkshop() const return aConnector->workshop(); } -//****************************************************** void PartSet_Module::setDefaultConstraintShown() { myHasConstraintShown[PartSet_Tools::Geometrical] = true; myHasConstraintShown[PartSet_Tools::Dimensional] = true; myHasConstraintShown[PartSet_Tools::Expressions] = false; } + +//****************************************************** +ModuleBase_ITreeNode* PartSet_Module::rootNode() const +{ + return myRoot; +} + +//****************************************************** +void PartSet_Module::disableCustomMode(ModuleBase_CustomizeFlag theMode) { + myCustomPrs->disableCustomMode(theMode); +} + +//****************************************************** +void PartSet_Module::enableCustomModes() { + myCustomPrs->enableCustomModes(); +}