From: asozinov Date: Mon, 10 Jul 2023 12:14:58 +0000 (+0100) Subject: [bos #31549] [EDF] (2023-T1) Sketch Visualization of constrains X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=refs%2Ftlpr%2F20%2Fhead;p=modules%2Fshaper.git [bos #31549] [EDF] (2023-T1) Sketch Visualization of constrains - Added browser which show all constraints in the active sketch. - This browser provide functionality for Delete, Edit and Suppress constraints - Suppressed constraints can be reactivated - for constraints will be added new attribute ConstraintState. If True - constraint active, otherwise - suppressed. This parameter can be used as optional for python script. Example of using: Sketch_1.setCoincident(SketchLine_4.endPoint(), SketchLine_1.startPoint(), is_active = False) Documentationalso will be added --- diff --git a/src/ModuleBase/ModuleBase_IModule.h b/src/ModuleBase/ModuleBase_IModule.h index e60281374..ac1ebde44 100644 --- a/src/ModuleBase/ModuleBase_IModule.h +++ b/src/ModuleBase/ModuleBase_IModule.h @@ -149,6 +149,10 @@ class MODULEBASE_EXPORT ModuleBase_IModule : public QObject /// \param theMenu a popup menu to be shown in the object browser virtual void addObjectBrowserMenu(QMenu* theMenu) const {}; + /// Add menu items for constraints browser into the given menu + /// \param theMenu a popup menu to be shown in the constraints browser + virtual void addConstraintBrowserMenu(QMenu* theMenu) const {}; + /// Creates custom widgets for property panel /// \param theType a type of widget /// \param theParent the parent object diff --git a/src/ModuleBase/ModuleBase_ISelection.h b/src/ModuleBase/ModuleBase_ISelection.h index c662231f2..a33e8c708 100644 --- a/src/ModuleBase/ModuleBase_ISelection.h +++ b/src/ModuleBase/ModuleBase_ISelection.h @@ -44,7 +44,7 @@ class MODULEBASE_EXPORT ModuleBase_ISelection { public: /// Types of the selection place, where the selection is obtained - enum SelectionPlace { Browser, Viewer, AllControls }; + enum SelectionPlace { Browser, Viewer, ConstraintsBorwser, AllControls }; virtual ~ModuleBase_ISelection() {} diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 73113c006..84b28e4d0 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -104,6 +104,7 @@ #include #include #include +#include #include #include @@ -998,6 +999,24 @@ bool PartSet_Module::deleteObjects() // the abort leads to selection lost on constraint objects. It can be corrected after #386 issue ModuleBase_ISelection* aSel = workshop()->selection(); QObjectPtrList aSelectedObj = aSel->selectedPresentations(); + + QObjectPtrList aConstrSelectedObj = getWorkshop()->constraintsBrowser()->selectedConstraints(); + // if list not empty, delete only constraints from list + if (!aConstrSelectedObj.isEmpty()) + { + QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text(); + ModuleBase_Operation* anOpAction = new ModuleBase_Operation(aDescription, this); + + bool isCommitted; + if (!anOpMgr->canStartOperation(anOpAction->id(), isCommitted)) + return true; + + anOpMgr->startOperation(anOpAction); + aWorkshop->deleteFeatures(aConstrSelectedObj); + anOpMgr->commitOperation(); + return true; + } + // if there are no selected objects in the viewer, that means that the selection in another // place cased this method. It is necessary to return the false value to understande in above // method that delete is not processed diff --git a/src/PartSet/PartSet_SketcherMgr.cpp b/src/PartSet/PartSet_SketcherMgr.cpp index d47d1ec75..42075abad 100644 --- a/src/PartSet/PartSet_SketcherMgr.cpp +++ b/src/PartSet/PartSet_SketcherMgr.cpp @@ -31,6 +31,7 @@ #include "PartSet_PreviewSketchPlane.h" #include +#include #include #include #include @@ -108,6 +109,8 @@ #include #include #include +#include +#include #include #include @@ -219,6 +222,11 @@ PartSet_SketcherMgr::~PartSet_SketcherMgr() delete mySketchPlane; } +XGUI_SketchConstraintsBrowser* PartSet_SketcherMgr::constraintsBrowser() +{ + return workshop()->constraintsBrowser(); +} + void PartSet_SketcherMgr::onEnterViewPort() { // 1. if the mouse over window, update the next flag. Do not perform update visibility of @@ -850,6 +858,105 @@ void PartSet_SketcherMgr::onAfterContextMenu() myIsPopupMenuActive = false; } +void PartSet_SketcherMgr::onEditValues() +{ + auto aConstrBrowser = constraintsBrowser(); + + auto anOperMgr = workshop()->operationMgr(); + + ModuleBase_Operation* anOpAction = new ModuleBase_Operation("Edit Constraints value"); + + anOperMgr->startOperation(anOpAction); + int aRow = 0; + QTreeWidgetItemIterator anIter(aConstrBrowser->getViewTree()); + while (*anIter) { + // Change value + auto aData = (*anIter)->data(3, 0); + if (!aData.isNull()) + { + double aNewValue = aData.toDouble(); + auto aName = (*anIter)->data(1, 0).toString(); + FeaturePtr aConstr; + for (int i = 0; i < myCurrentSketch->numberOfSubs(); ++i) + { + auto aFFeat = myCurrentSketch->subFeature(i); + if (aName == QString::fromStdWString(aFFeat->name())) + { + aConstr = aFFeat; + break; + } + } + + aConstr->real("ConstraintValue")->setValue(aNewValue); + + if (aConstr->real("AngleValue")) + aConstr->real("AngleValue")->setValue(aNewValue); + else if (aConstr->real("DistanceValue")) + aConstr->real("DistanceValue")->setValue(aNewValue); + else + aConstr->real("ConstraintValue")->setValue(aNewValue); + } + + ++aRow; + ++anIter; + } + anOperMgr->commitOperation(); + workshop()->viewer()->update(); +} + +// Rename +void PartSet_SketcherMgr::onUpdateConstraintsList() +{ + auto aConstrBrowser = constraintsBrowser(); + + std::vector>> aConstraints; + + CompositeFeaturePtr aComposite = + std::dynamic_pointer_cast(activeSketch()); + int aNumSubs = aComposite->numberOfSubs(); + for (int i = 0; i < aNumSubs; ++i) + { + auto aFeat = aComposite->subFeature(i); + if (aFeat->refattr(SketchPlugin_Constraint::ENTITY_A()) && + (!aFeat->attribute(SketchPlugin_Constraint::ENTITY_B()) || aFeat->refattr(SketchPlugin_Constraint::ENTITY_B()))) + { + std::pair> anElemContr; + anElemContr.first = aFeat; + + anElemContr.second.push_back(aFeat->refattr(SketchPlugin_Constraint::ENTITY_A())); + if (aFeat->attribute(SketchPlugin_Constraint::ENTITY_B())) + anElemContr.second.push_back(aFeat->refattr(SketchPlugin_Constraint::ENTITY_B())); + + aConstraints.push_back(anElemContr); + } + } + aConstrBrowser->UpdateTree(aConstraints); +} + +// Bad way, but it works +void PartSet_SketcherMgr::onDeactivate(bool isNeedDeactivate, std::vector theFeatures) +{ + std::list anUpd; + auto anOperMgr = workshop()->operationMgr(); + + ModuleBase_OperationFeature* anOpAction = new ModuleBase_OperationFeature("Deactivate/Activate"); + anOpAction->setFeature(myCurrentSketch); + startNestedSketch(anOpAction); + anOperMgr->startOperation(anOpAction); + + for (int i = 0; i < theFeatures.size(); ++i) + { + theFeatures[i]->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(isNeedDeactivate); + + static const Events_ID anEvent = Events_Loop::eventByName(EVENT_VISUAL_ATTRIBUTES); + ModelAPI_EventCreator::get()->sendUpdated(theFeatures[i], anEvent, false); + } + + stopNestedSketch(anOpAction); + anOperMgr->commitOperation(); + workshop()->viewer()->update(); +} + void PartSet_SketcherMgr::get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent, Point& thePoint) { @@ -1200,6 +1307,17 @@ void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation) PartSet_Fitter* aFitter = new PartSet_Fitter(this); myModule->workshop()->viewer()->setFitter(aFitter); + + auto aDesktop = workshop()->desktop(); + myConstraintsBrowser = workshop()->createConstraintsBrowser(aDesktop); + + // For process edit/delete and deactivate/activate constraints + connect(constraintsBrowser(), SIGNAL(editValues()), this, SLOT(onEditValues())); + connect(constraintsBrowser(), SIGNAL(deleteCosnstraints()), this, SLOT(onUpdateConstraintsList())); + connect(constraintsBrowser(), SIGNAL(deactivate(bool, std::vector)), this, SLOT(onDeactivate(bool, std::vector))); + aDesktop->addDockWidget(Qt::RightDockWidgetArea, myConstraintsBrowser); + + onUpdateConstraintsList(); } void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation) @@ -1274,6 +1392,17 @@ void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation) workshop()->selectionActivate()->updateSelectionFilters(); workshop()->selectionActivate()->updateSelectionModes(); workshop()->viewer()->set2dMode(false); + + disconnect(constraintsBrowser(), SIGNAL(editValues()), this, SLOT(onEditValues())); + disconnect(constraintsBrowser(), SIGNAL(deleteCosnstraints()), this, SLOT(onUpdateConstraintsList())); + disconnect(constraintsBrowser(), SIGNAL(deactivate(bool, std::vector)), this, SLOT(onDeactivate(bool, std::vector))); + + workshop()->desktop()->removeDockWidget(myConstraintsBrowser); + std::vector>> anEmpty; + constraintsBrowser()->UpdateTree(anEmpty); + workshop()->removeConstrBrowser(); + + myConstraintsBrowser->deleteLater(); } void PartSet_SketcherMgr::startNestedSketch(ModuleBase_Operation* theOperation) @@ -2266,11 +2395,15 @@ bool isIncludeToResult(const ObjectPtr& theObject) //************************************************************************************** std::vector PartSet_SketcherMgr::colorOfObject(const ObjectPtr& theObject, - const FeaturePtr& theFeature, bool isConstruction) const + const FeaturePtr& theFeature, bool isConstruction, bool isSuppressedConstraint) const { PartSet_OverconstraintListener* aOCListener = myModule->overconstraintListener(); std::string aKind = theFeature->getKind(); + // may be Preference Config_PropManager::color("Visualization", "sketch_deactivated_color"); + if (isSuppressedConstraint) + return { 128, 128, 128 }; + if (aOCListener->isConflictingObject(theObject)) { return Config_PropManager::color("Visualization", "sketch_overconstraint_color"); } @@ -2303,7 +2436,11 @@ void PartSet_SketcherMgr::customizeSketchPresentation(const ObjectPtr& theObject aFeature->data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID()); bool isConstruction = anAuxiliaryAttr.get() != NULL && anAuxiliaryAttr->value(); - std::vector aColor = colorOfObject(theObject, aFeature, isConstruction); + bool isSupressed = false; + if (aFeature->data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())) + isSupressed = !aFeature->data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value(); + + std::vector aColor = colorOfObject(theObject, aFeature, isConstruction, isSupressed); if (!aColor.empty()) { // The code below causes redisplay again if (ModelAPI_Session::get()->isOperation()) { diff --git a/src/PartSet/PartSet_SketcherMgr.h b/src/PartSet/PartSet_SketcherMgr.h index 14d88a168..7092ed769 100644 --- a/src/PartSet/PartSet_SketcherMgr.h +++ b/src/PartSet/PartSet_SketcherMgr.h @@ -66,6 +66,7 @@ class ModuleBase_Operation; class XGUI_OperationMgr; class XGUI_Workshop; class XGUI_Displayer; +class XGUI_SketchConstraintsBrowser; class PartSet_ExternalPointsMgr; class AIS_InteractiveObject; @@ -387,6 +388,8 @@ public: /// Returns true if current mode of objects creation is by drag mouse bool isDragModeCreation() const; + // Get constraints browser + XGUI_SketchConstraintsBrowser* constraintsBrowser(); public slots: /// Process sketch plane selected event @@ -396,6 +399,10 @@ public slots: /// \param toShow a state of the check box void onShowPoints(bool toShow); + void onEditValues(); + void onUpdateConstraintsList(); + void onDeactivate(bool isNeedDeactivate, std::vector theFeatures); + private slots: /// Toggle show constraints void onShowConstraintsToggle(int theType, bool theState); @@ -485,7 +492,7 @@ private: XGUI_OperationMgr* operationMgr() const; std::vector colorOfObject(const ObjectPtr& theObject, - const FeaturePtr& aFeature, bool isConstruction) const; + const FeaturePtr& aFeature, bool isConstruction, bool isSuppressedConstraint) const; private: PartSet_Module* myModule; @@ -518,6 +525,8 @@ private: bool myNoDragMoving; QPoint myMousePoint; + + QDockWidget* myConstraintsBrowser; }; diff --git a/src/SketchAPI/SketchAPI_Constraint.cpp b/src/SketchAPI/SketchAPI_Constraint.cpp index 9149d2395..fb4787f36 100644 --- a/src/SketchAPI/SketchAPI_Constraint.cpp +++ b/src/SketchAPI/SketchAPI_Constraint.cpp @@ -228,5 +228,8 @@ void SketchAPI_Constraint::dump(ModelHighAPI_Dumper& theDumper) const theDumper << ", " << isSigned->value(); } + bool isActive = aBase->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value(); + theDumper << ", is_active = " << isActive; + theDumper << ")" << std::endl; } diff --git a/src/SketchAPI/SketchAPI_ConstraintAngle.cpp b/src/SketchAPI/SketchAPI_ConstraintAngle.cpp index edf90a5d3..016bdb9b1 100644 --- a/src/SketchAPI/SketchAPI_ConstraintAngle.cpp +++ b/src/SketchAPI/SketchAPI_ConstraintAngle.cpp @@ -148,5 +148,7 @@ void SketchAPI_ConstraintAngle::dump(ModelHighAPI_Dumper& theDumper) const theDumper << ", " << aValueAttr; std::string aType = angleTypeToString(aBase); - theDumper << ", type = \"" << aType << "\")" << std::endl; + theDumper << ", type = \"" << aType << "\""; + bool isActive = aBase->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value(); + theDumper << ", is_active = " << isActive << ")" << std::endl; } diff --git a/src/SketchAPI/SketchAPI_Sketch.cpp b/src/SketchAPI/SketchAPI_Sketch.cpp index 34503d972..1e8aa8bf1 100644 --- a/src/SketchAPI/SketchAPI_Sketch.cpp +++ b/src/SketchAPI/SketchAPI_Sketch.cpp @@ -1010,7 +1010,8 @@ std::shared_ptr SketchAPI_Sketch::setAngle( const ModelHighAPI_RefAttr & theLine1, const ModelHighAPI_RefAttr & theLine2, const ModelHighAPI_Double & theValue, - const std::string& theType) + const std::string& theType, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintAngle::ID()); @@ -1028,6 +1029,7 @@ std::shared_ptr SketchAPI_Sketch::setAngle( fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); if (aVersion == SketchPlugin_ConstraintAngle::THE_VERSION_1) { std::string aTypeLC = theType; @@ -1049,7 +1051,8 @@ std::shared_ptr SketchAPI_Sketch::setAngle( std::shared_ptr SketchAPI_Sketch::setAngleComplementary( const ModelHighAPI_RefAttr & theLine1, const ModelHighAPI_RefAttr & theLine2, - const ModelHighAPI_Double & theValue) + const ModelHighAPI_Double & theValue, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintAngle::ID()); @@ -1060,6 +1063,7 @@ std::shared_ptr SketchAPI_Sketch::setAngleComplementary( fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID())); fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } @@ -1067,7 +1071,8 @@ std::shared_ptr SketchAPI_Sketch::setAngleComplementary( std::shared_ptr SketchAPI_Sketch::setAngleBackward( const ModelHighAPI_RefAttr & theLine1, const ModelHighAPI_RefAttr & theLine2, - const ModelHighAPI_Double & theValue) + const ModelHighAPI_Double & theValue, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintAngle::ID()); @@ -1078,30 +1083,35 @@ std::shared_ptr SketchAPI_Sketch::setAngleBackward( fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID())); fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } std::shared_ptr SketchAPI_Sketch::setCoincident( const ModelHighAPI_RefAttr & thePoint1, - const ModelHighAPI_RefAttr & thePoint2) + const ModelHighAPI_RefAttr & thePoint2, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintCoincidence::ID()); fillAttribute(thePoint1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(thePoint2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } std::shared_ptr SketchAPI_Sketch::setCollinear( const ModelHighAPI_RefAttr & theLine1, - const ModelHighAPI_RefAttr & theLine2) + const ModelHighAPI_RefAttr & theLine2, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintCollinear::ID()); fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } @@ -1110,7 +1120,8 @@ std::shared_ptr SketchAPI_Sketch::setDistance( const ModelHighAPI_RefAttr & thePoint, const ModelHighAPI_RefAttr & thePointOrLine, const ModelHighAPI_Double & theValue, - bool isSigned) + bool isSigned, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintDistance::ID()); @@ -1118,6 +1129,7 @@ std::shared_ptr SketchAPI_Sketch::setDistance( fillAttribute(thePointOrLine, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); fillAttribute(theValue, aFeature->real(SketchPlugin_Constraint::VALUE())); fillAttribute(isSigned, aFeature->boolean(SketchPlugin_ConstraintDistance::SIGNED())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } @@ -1125,23 +1137,26 @@ std::shared_ptr SketchAPI_Sketch::setDistance( std::shared_ptr SketchAPI_Sketch::setSignedDistance( const ModelHighAPI_RefAttr & thePoint, const ModelHighAPI_RefAttr & thePointOrLine, - const ModelHighAPI_Double & theValue) + const ModelHighAPI_Double & theValue, + bool theIsActive) { - return setDistance(thePoint, thePointOrLine, theValue, true); + return setDistance(thePoint, thePointOrLine, theValue, true, theIsActive); } std::shared_ptr SketchAPI_Sketch::setUnsignedDistance( const ModelHighAPI_RefAttr & thePoint, const ModelHighAPI_RefAttr & thePointOrLine, - const ModelHighAPI_Double & theValue) + const ModelHighAPI_Double & theValue, + bool theIsActive) { - return setDistance(thePoint, thePointOrLine, theValue, false); + return setDistance(thePoint, thePointOrLine, theValue, false, theIsActive); } std::shared_ptr SketchAPI_Sketch::setHorizontalDistance( const ModelHighAPI_RefAttr & thePoint1, const ModelHighAPI_RefAttr & thePoint2, - const ModelHighAPI_Double & theValue) + const ModelHighAPI_Double & theValue, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintDistanceHorizontal::ID()); @@ -1149,6 +1164,7 @@ std::shared_ptr SketchAPI_Sketch::setHorizontalDistance( fillAttribute(thePoint2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintDistanceAlongDir::DISTANCE_VALUE_ID())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } @@ -1156,7 +1172,8 @@ std::shared_ptr SketchAPI_Sketch::setHorizontalDistance( std::shared_ptr SketchAPI_Sketch::setVerticalDistance( const ModelHighAPI_RefAttr & thePoint1, const ModelHighAPI_RefAttr & thePoint2, - const ModelHighAPI_Double & theValue) + const ModelHighAPI_Double & theValue, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintDistanceVertical::ID()); @@ -1164,18 +1181,21 @@ std::shared_ptr SketchAPI_Sketch::setVerticalDistance( fillAttribute(thePoint2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintDistanceAlongDir::DISTANCE_VALUE_ID())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } std::shared_ptr SketchAPI_Sketch::setEqual( const ModelHighAPI_RefAttr & theObject1, - const ModelHighAPI_RefAttr & theObject2) + const ModelHighAPI_RefAttr & theObject2, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintEqual::ID()); fillAttribute(theObject1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theObject2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } @@ -1209,103 +1229,121 @@ std::shared_ptr SketchAPI_Sketch::setFilletWithRadius( } std::shared_ptr SketchAPI_Sketch::setFixed( - const ModelHighAPI_RefAttr & theObject) + const ModelHighAPI_RefAttr & theObject, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintRigid::ID()); fillAttribute(theObject, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } std::shared_ptr SketchAPI_Sketch::setHorizontal( - const ModelHighAPI_RefAttr & theLine) + const ModelHighAPI_RefAttr & theLine, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintHorizontal::ID()); fillAttribute(theLine, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } std::shared_ptr SketchAPI_Sketch::setLength( const ModelHighAPI_RefAttr & theLine, - const ModelHighAPI_Double & theValue) + const ModelHighAPI_Double & theValue, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintLength::ID()); fillAttribute(theLine, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theValue, aFeature->real(SketchPlugin_Constraint::VALUE())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } std::shared_ptr SketchAPI_Sketch::setMiddlePoint( const ModelHighAPI_RefAttr & thePoint, - const ModelHighAPI_RefAttr & theLine) + const ModelHighAPI_RefAttr & theLine, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintMiddle::ID()); fillAttribute(thePoint, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theLine, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } std::shared_ptr SketchAPI_Sketch::setParallel( const ModelHighAPI_RefAttr & theLine1, - const ModelHighAPI_RefAttr & theLine2) + const ModelHighAPI_RefAttr & theLine2, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintParallel::ID()); fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } std::shared_ptr SketchAPI_Sketch::setPerpendicular( const ModelHighAPI_RefAttr & theLine1, - const ModelHighAPI_RefAttr & theLine2) + const ModelHighAPI_RefAttr & theLine2, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintPerpendicular::ID()); fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } std::shared_ptr SketchAPI_Sketch::setRadius( const ModelHighAPI_RefAttr & theCircleOrArc, - const ModelHighAPI_Double & theValue) + const ModelHighAPI_Double & theValue, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintRadius::ID()); fillAttribute(theCircleOrArc, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theValue, aFeature->real(SketchPlugin_Constraint::VALUE())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } std::shared_ptr SketchAPI_Sketch::setTangent( const ModelHighAPI_RefAttr & theLine, - const ModelHighAPI_RefAttr & theCircle) + const ModelHighAPI_RefAttr & theCircle, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintTangent::ID()); fillAttribute(theLine, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theCircle, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } std::shared_ptr SketchAPI_Sketch::setVertical( - const ModelHighAPI_RefAttr & theLine) + const ModelHighAPI_RefAttr & theLine, + bool theIsActive) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintVertical::ID()); fillAttribute(theLine, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); + fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } diff --git a/src/SketchAPI/SketchAPI_Sketch.h b/src/SketchAPI/SketchAPI_Sketch.h index f9c8fdb79..0e8ffce49 100644 --- a/src/SketchAPI/SketchAPI_Sketch.h +++ b/src/SketchAPI/SketchAPI_Sketch.h @@ -420,33 +420,38 @@ public: const ModelHighAPI_RefAttr & theLine1, const ModelHighAPI_RefAttr & theLine2, const ModelHighAPI_Double & theValue, - const std::string& type = std::string()); + const std::string& type = std::string(), + bool is_active = true); /// Set complementary angle SKETCHAPI_EXPORT std::shared_ptr setAngleComplementary( const ModelHighAPI_RefAttr & theLine1, const ModelHighAPI_RefAttr & theLine2, - const ModelHighAPI_Double & theValue); + const ModelHighAPI_Double & theValue, + bool is_active = true); /// Set backward angle (= 360 - angle) SKETCHAPI_EXPORT std::shared_ptr setAngleBackward( const ModelHighAPI_RefAttr & theLine1, const ModelHighAPI_RefAttr & theLine2, - const ModelHighAPI_Double & theValue); + const ModelHighAPI_Double & theValue, + bool is_active = true); /// Set coincident SKETCHAPI_EXPORT std::shared_ptr setCoincident( const ModelHighAPI_RefAttr & thePoint1, - const ModelHighAPI_RefAttr & thePoint2); + const ModelHighAPI_RefAttr & thePoint2, + bool is_active = true); /// Set collinear SKETCHAPI_EXPORT std::shared_ptr setCollinear( const ModelHighAPI_RefAttr & theLine1, - const ModelHighAPI_RefAttr & theLine2); + const ModelHighAPI_RefAttr & theLine2, + bool is_active = true); /// Set distance SKETCHAPI_EXPORT @@ -454,41 +459,47 @@ public: const ModelHighAPI_RefAttr & thePoint, const ModelHighAPI_RefAttr & thePointOrLine, const ModelHighAPI_Double & theValue, - bool isSigned = false); + bool isSigned = false, + bool is_active = true); /// Set signed distance SKETCHAPI_EXPORT std::shared_ptr setSignedDistance( const ModelHighAPI_RefAttr & thePoint, const ModelHighAPI_RefAttr & thePointOrLine, - const ModelHighAPI_Double & theValue); + const ModelHighAPI_Double & theValue, + bool is_active = true); /// Set unsigned distance SKETCHAPI_EXPORT std::shared_ptr setUnsignedDistance( const ModelHighAPI_RefAttr & thePoint, const ModelHighAPI_RefAttr & thePointOrLine, - const ModelHighAPI_Double & theValue); + const ModelHighAPI_Double & theValue, + bool is_active = true); /// Set horizontal distance SKETCHAPI_EXPORT std::shared_ptr setHorizontalDistance( const ModelHighAPI_RefAttr & thePoint1, const ModelHighAPI_RefAttr & thePoint2, - const ModelHighAPI_Double & theValue); + const ModelHighAPI_Double & theValue, + bool is_active = true); /// Set vertical distance SKETCHAPI_EXPORT std::shared_ptr setVerticalDistance( const ModelHighAPI_RefAttr & thePoint1, const ModelHighAPI_RefAttr & thePoint2, - const ModelHighAPI_Double & theValue); + const ModelHighAPI_Double & theValue, + bool is_active = true); /// Set equal SKETCHAPI_EXPORT std::shared_ptr setEqual( const ModelHighAPI_RefAttr & theObject1, - const ModelHighAPI_RefAttr & theObject2); + const ModelHighAPI_RefAttr & theObject2, + bool is_active = true); /// Set fillet SKETCHAPI_EXPORT @@ -504,53 +515,62 @@ public: /// Set fixed SKETCHAPI_EXPORT std::shared_ptr setFixed( - const ModelHighAPI_RefAttr & theObject); + const ModelHighAPI_RefAttr & theObject, + bool is_active = true); /// Set horizontal SKETCHAPI_EXPORT std::shared_ptr setHorizontal( - const ModelHighAPI_RefAttr & theLine); + const ModelHighAPI_RefAttr & theLine, + bool is_active = true); /// Set length SKETCHAPI_EXPORT std::shared_ptr setLength( const ModelHighAPI_RefAttr & theLine, - const ModelHighAPI_Double & theValue); + const ModelHighAPI_Double & theValue, + bool is_active = true); /// Set middle SKETCHAPI_EXPORT std::shared_ptr setMiddlePoint( const ModelHighAPI_RefAttr & thePoint, - const ModelHighAPI_RefAttr & theLine); + const ModelHighAPI_RefAttr & theLine, + bool is_active = true); /// Set parallel SKETCHAPI_EXPORT std::shared_ptr setParallel( const ModelHighAPI_RefAttr & theLine1, - const ModelHighAPI_RefAttr & theLine2); + const ModelHighAPI_RefAttr & theLine2, + bool is_active = true); /// Set perpendicular SKETCHAPI_EXPORT std::shared_ptr setPerpendicular( const ModelHighAPI_RefAttr & theLine1, - const ModelHighAPI_RefAttr & theLine2); + const ModelHighAPI_RefAttr & theLine2, + bool is_active = true); /// Set radius SKETCHAPI_EXPORT std::shared_ptr setRadius( const ModelHighAPI_RefAttr & theCircleOrArc, - const ModelHighAPI_Double & theValue); + const ModelHighAPI_Double & theValue, + bool is_active = true); /// Set tangent SKETCHAPI_EXPORT std::shared_ptr setTangent( const ModelHighAPI_RefAttr & theLine, - const ModelHighAPI_RefAttr & theCircle); + const ModelHighAPI_RefAttr & theCircle, + bool is_active = true); /// Set vertical SKETCHAPI_EXPORT std::shared_ptr setVertical( - const ModelHighAPI_RefAttr & theLine); + const ModelHighAPI_RefAttr & theLine, + bool is_active = true); /// Set constraint value SKETCHAPI_EXPORT diff --git a/src/SketchPlugin/SketchPlugin_Constraint.h b/src/SketchPlugin/SketchPlugin_Constraint.h index 7b5723875..8a2662257 100644 --- a/src/SketchPlugin/SketchPlugin_Constraint.h +++ b/src/SketchPlugin/SketchPlugin_Constraint.h @@ -46,6 +46,12 @@ class SketchPlugin_Constraint : public SketchPlugin_Feature static const std::string MY_FLYOUT_VALUE_PNT("ConstraintFlyoutValuePnt"); return MY_FLYOUT_VALUE_PNT; } + /// State of constraint - Active - true, Suppressed - false + inline static const std::string& CONSTRAINT_ACTIVE() + { + static const std::string MY_STATE("ConstraintState"); + return MY_STATE; + } /// First entity for the constraint inline static const std::string& ENTITY_A() { diff --git a/src/SketchPlugin/SketchPlugin_ConstraintAngle.cpp b/src/SketchPlugin/SketchPlugin_ConstraintAngle.cpp index cdb3309ec..4b8f8f85f 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintAngle.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintAngle.cpp @@ -79,6 +79,10 @@ void SketchPlugin_ConstraintAngle::initAttributes() data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT(), GeomDataAPI_Point2D::typeId()); + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); + data()->addAttribute(ANGLE_VALUE_ID(), ModelAPI_AttributeDouble::typeId()); data()->addAttribute(TYPE_ID(), ModelAPI_AttributeInteger::typeId()); diff --git a/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp b/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp index 795eee98d..e1e9fd87a 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp @@ -40,6 +40,10 @@ void SketchPlugin_ConstraintCoincidence::initAttributes() { data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); + + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); } void SketchPlugin_ConstraintCoincidence::execute() diff --git a/src/SketchPlugin/SketchPlugin_ConstraintCollinear.cpp b/src/SketchPlugin/SketchPlugin_ConstraintCollinear.cpp index e689458e8..75dd96b2c 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintCollinear.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintCollinear.cpp @@ -29,6 +29,10 @@ void SketchPlugin_ConstraintCollinear::initAttributes() { data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); + + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); } void SketchPlugin_ConstraintCollinear::execute() diff --git a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp index 2f2c59b0a..3e8cf3b84 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp @@ -60,6 +60,10 @@ void SketchPlugin_ConstraintDistance::initAttributes() data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(SIGNED(), ModelAPI_AttributeBoolean::typeId()); + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); + data()->addAttribute(SketchPlugin_ConstraintDistance::LOCATION_TYPE_ID(), ModelAPI_AttributeInteger::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), LOCATION_TYPE_ID()); diff --git a/src/SketchPlugin/SketchPlugin_ConstraintDistanceAlongDir.cpp b/src/SketchPlugin/SketchPlugin_ConstraintDistanceAlongDir.cpp index e15b4402c..ff5204313 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintDistanceAlongDir.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintDistanceAlongDir.cpp @@ -56,6 +56,10 @@ void SketchPlugin_ConstraintDistanceAlongDir::initAttributes() data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); + data()->addAttribute(LOCATION_TYPE_ID(), ModelAPI_AttributeInteger::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), LOCATION_TYPE_ID()); diff --git a/src/SketchPlugin/SketchPlugin_ConstraintEqual.cpp b/src/SketchPlugin/SketchPlugin_ConstraintEqual.cpp index e3637a73e..9dceebd31 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintEqual.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintEqual.cpp @@ -38,6 +38,10 @@ void SketchPlugin_ConstraintEqual::initAttributes() { data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); + + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); } void SketchPlugin_ConstraintEqual::execute() diff --git a/src/SketchPlugin/SketchPlugin_ConstraintHorizontal.cpp b/src/SketchPlugin/SketchPlugin_ConstraintHorizontal.cpp index dae341a66..e8d988e33 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintHorizontal.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintHorizontal.cpp @@ -38,6 +38,10 @@ SketchPlugin_ConstraintHorizontal::SketchPlugin_ConstraintHorizontal() void SketchPlugin_ConstraintHorizontal::initAttributes() { data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); + + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); } void SketchPlugin_ConstraintHorizontal::execute() diff --git a/src/SketchPlugin/SketchPlugin_ConstraintLength.cpp b/src/SketchPlugin/SketchPlugin_ConstraintLength.cpp index cfe1da52f..6b706bcba 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintLength.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintLength.cpp @@ -57,6 +57,10 @@ void SketchPlugin_ConstraintLength::initAttributes() data()->addAttribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT(), GeomDataAPI_Point2D::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); + data()->addAttribute(SketchPlugin_ConstraintLength::LOCATION_TYPE_ID(), ModelAPI_AttributeInteger::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), LOCATION_TYPE_ID()); diff --git a/src/SketchPlugin/SketchPlugin_ConstraintMiddle.cpp b/src/SketchPlugin/SketchPlugin_ConstraintMiddle.cpp index ad9ab3755..209d325a8 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintMiddle.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintMiddle.cpp @@ -29,6 +29,10 @@ void SketchPlugin_ConstraintMiddle::initAttributes() { data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); + + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); } void SketchPlugin_ConstraintMiddle::execute() diff --git a/src/SketchPlugin/SketchPlugin_ConstraintMirror.cpp b/src/SketchPlugin/SketchPlugin_ConstraintMirror.cpp index fbbb8044a..07d6c887d 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintMirror.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintMirror.cpp @@ -50,6 +50,10 @@ void SketchPlugin_ConstraintMirror::initAttributes() registerNotObligatory(getKind(), SketchPlugin_Constraint::ENTITY_B()); ModelAPI_Session::get()->validators()-> registerNotObligatory(getKind(), SketchPlugin_Constraint::ENTITY_C()); + + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); } void SketchPlugin_ConstraintMirror::execute() diff --git a/src/SketchPlugin/SketchPlugin_ConstraintParallel.cpp b/src/SketchPlugin/SketchPlugin_ConstraintParallel.cpp index 2c5977867..b4e588302 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintParallel.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintParallel.cpp @@ -44,6 +44,10 @@ void SketchPlugin_ConstraintParallel::initAttributes() { data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); + + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); } void SketchPlugin_ConstraintParallel::execute() diff --git a/src/SketchPlugin/SketchPlugin_ConstraintPerpendicular.cpp b/src/SketchPlugin/SketchPlugin_ConstraintPerpendicular.cpp index 108ee2a16..6b269adea 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintPerpendicular.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintPerpendicular.cpp @@ -43,6 +43,10 @@ void SketchPlugin_ConstraintPerpendicular::initAttributes() { data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); + + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); } void SketchPlugin_ConstraintPerpendicular::execute() diff --git a/src/SketchPlugin/SketchPlugin_ConstraintRadius.cpp b/src/SketchPlugin/SketchPlugin_ConstraintRadius.cpp index 6dc1bd1df..5cb56ca3d 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintRadius.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintRadius.cpp @@ -57,6 +57,10 @@ void SketchPlugin_ConstraintRadius::initAttributes() data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT(), GeomDataAPI_Point2D::typeId()); + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); + data()->addAttribute(SketchPlugin_ConstraintRadius::LOCATION_TYPE_ID(), ModelAPI_AttributeInteger::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), LOCATION_TYPE_ID()); diff --git a/src/SketchPlugin/SketchPlugin_ConstraintRigid.cpp b/src/SketchPlugin/SketchPlugin_ConstraintRigid.cpp index e70c77b37..1c7b9de44 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintRigid.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintRigid.cpp @@ -36,6 +36,10 @@ SketchPlugin_ConstraintRigid::SketchPlugin_ConstraintRigid() void SketchPlugin_ConstraintRigid::initAttributes() { data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); + + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); } void SketchPlugin_ConstraintRigid::execute() diff --git a/src/SketchPlugin/SketchPlugin_ConstraintTangent.cpp b/src/SketchPlugin/SketchPlugin_ConstraintTangent.cpp index 224ac900a..0124690f4 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintTangent.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintTangent.cpp @@ -38,6 +38,10 @@ void SketchPlugin_ConstraintTangent::initAttributes() { data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); + + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); } void SketchPlugin_ConstraintTangent::execute() diff --git a/src/SketchPlugin/SketchPlugin_ConstraintVertical.cpp b/src/SketchPlugin/SketchPlugin_ConstraintVertical.cpp index e921e8404..f76363e68 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintVertical.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintVertical.cpp @@ -37,6 +37,10 @@ SketchPlugin_ConstraintVertical::SketchPlugin_ConstraintVertical() void SketchPlugin_ConstraintVertical::initAttributes() { data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); + + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); } void SketchPlugin_ConstraintVertical::execute() diff --git a/src/SketchPlugin/SketchPlugin_MultiRotation.cpp b/src/SketchPlugin/SketchPlugin_MultiRotation.cpp index 4e862e119..3bcec646f 100644 --- a/src/SketchPlugin/SketchPlugin_MultiRotation.cpp +++ b/src/SketchPlugin/SketchPlugin_MultiRotation.cpp @@ -64,6 +64,10 @@ void SketchPlugin_MultiRotation::initAttributes() data()->addAttribute(ROTATION_LIST_ID(), ModelAPI_AttributeRefList::typeId()); data()->addAttribute(REVERSED_ID(), ModelAPI_AttributeBoolean::typeId()); + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); + ModelAPI_Session::get()->validators()-> registerNotObligatory(getKind(), SketchPlugin_Constraint::ENTITY_A()); ModelAPI_Session::get()->validators()-> diff --git a/src/SketchPlugin/SketchPlugin_MultiTranslation.cpp b/src/SketchPlugin/SketchPlugin_MultiTranslation.cpp index 8a543fcaf..aad921266 100644 --- a/src/SketchPlugin/SketchPlugin_MultiTranslation.cpp +++ b/src/SketchPlugin/SketchPlugin_MultiTranslation.cpp @@ -48,6 +48,10 @@ void SketchPlugin_MultiTranslation::initAttributes() data()->addAttribute(START_POINT_ID(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(END_POINT_ID(), ModelAPI_AttributeRefAttr::typeId()); + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); + data()->addAttribute(NUMBER_OF_OBJECTS_ID(), ModelAPI_AttributeInteger::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefList::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefList::typeId()); diff --git a/src/SketchPlugin/SketchPlugin_Offset.cpp b/src/SketchPlugin/SketchPlugin_Offset.cpp index aabe5babf..90101c95d 100644 --- a/src/SketchPlugin/SketchPlugin_Offset.cpp +++ b/src/SketchPlugin/SketchPlugin_Offset.cpp @@ -79,6 +79,10 @@ void SketchPlugin_Offset::initAttributes() data()->addAttribute(VALUE_ID(), ModelAPI_AttributeDouble::typeId()); data()->addAttribute(REVERSED_ID(), ModelAPI_AttributeBoolean::typeId()); + // By default set true; + data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId()); + data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true); + // Always initialize approximation to false by default for backward compatibility AttributeBooleanPtr approxAttr = std::dynamic_pointer_cast( data()->addAttribute(APPROX_ID(), ModelAPI_AttributeBoolean::typeId())); diff --git a/src/SketchPlugin/doc/SketchPlugin.rst b/src/SketchPlugin/doc/SketchPlugin.rst index d1c47eb22..e98c502a9 100644 --- a/src/SketchPlugin/doc/SketchPlugin.rst +++ b/src/SketchPlugin/doc/SketchPlugin.rst @@ -53,6 +53,15 @@ After the plane for sketch is selected, the following property panel will be ope - **Change sketch plane** button - allows to change working plane of the current sketch. - **Show remaining DoFs** button - highlights all sketch edges which are not fully constrained. +Also will be opened window with created constraints: + +.. figure:: images/ConstraintsBrowser.png + :align: center + + Sketch constraints browser + +**See** :ref:`sketchConstraintsBrowsers` + Now it is possible to: - create :ref:`sketch objects ` diff --git a/src/SketchPlugin/doc/images/ConstraintsBrowser.png b/src/SketchPlugin/doc/images/ConstraintsBrowser.png new file mode 100644 index 000000000..47f40ab97 Binary files /dev/null and b/src/SketchPlugin/doc/images/ConstraintsBrowser.png differ diff --git a/src/SketchPlugin/doc/images/constraints_suppressed.png b/src/SketchPlugin/doc/images/constraints_suppressed.png new file mode 100644 index 000000000..66ea1de97 Binary files /dev/null and b/src/SketchPlugin/doc/images/constraints_suppressed.png differ diff --git a/src/SketchPlugin/doc/images/constraints_suppressed_moved.png b/src/SketchPlugin/doc/images/constraints_suppressed_moved.png new file mode 100644 index 000000000..1809edee5 Binary files /dev/null and b/src/SketchPlugin/doc/images/constraints_suppressed_moved.png differ diff --git a/src/SketchPlugin/doc/sketchConstraintsBrowser.rst b/src/SketchPlugin/doc/sketchConstraintsBrowser.rst new file mode 100644 index 000000000..3a5e72bac --- /dev/null +++ b/src/SketchPlugin/doc/sketchConstraintsBrowser.rst @@ -0,0 +1,45 @@ + +.. _sketchConstraintsBrowsers: + +Sketch Constraints Browser +================ +.. figure:: images/ConstraintsBrowser.png + :align: center + + Sketch constraints browser + +- **Extended Information** check box - allows showing/hiding **Primitives** and **Parameter** columns + +Right click by any constraint provide following funtionality: + +- **Edit...** - allows edit dimensional value if it exist +- **Delete** - allows delete constraints +- **Deactivate/Activate** - allows deactivate/activate constraints + +Edit +================ + +For dimension constraints (Angle, Length, Radius e.t.c.) you can change value. Ways for change: +1. Select all constraints, which you can modify. Right Click -> Edit... -> Input new values. After press Apply button; +2. In empty place Right click -> Edit... - will be modified all constraints. +3. Double click by constrints value - modify only selected constraint value + +Delete +================ + +Select constraints for delete -> Rightg Click -> Delete. All selected constraints will be deleted + +Deactivate +================ + +.. figure:: images/constraints_suppressed.png + :align: center + + Suppresed constraints + +.. figure:: images/constraints_suppressed_moved.png + :align: center + + Suppresed constraints moved + +This allows you to deactivate and activate already applied constraints. Suppressed constraint allows you keep constraint and check another arrangement of the existing geometry. diff --git a/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.cpp b/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.cpp index deefed48c..eee60125a 100644 --- a/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.cpp +++ b/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.cpp @@ -66,7 +66,8 @@ void PlaneGCSSolver_Storage::addConstraint( { SketchSolver_Storage::addConstraint(theConstraint, theSolverConstraint); - theSolverConstraint->setId(++myConstraintLastID); + if (theSolverConstraint->id() == 0) + theSolverConstraint->setId(++myConstraintLastID); constraintsToSolver(theSolverConstraint, mySketchSolver); } @@ -515,6 +516,62 @@ bool PlaneGCSSolver_Storage::removeConstraint(ConstraintPtr theConstraint) return true; } +bool PlaneGCSSolver_Storage::changeActiveStatus(ConstraintPtr theConstraint, bool theNewState) +{ + if (theNewState) + { + // activate + auto aPair = myDeactivatedConstraintMap.find(theConstraint); + if (aPair == myDeactivatedConstraintMap.end()) + return false; + + addConstraint(theConstraint, aPair->second); + myDeactivatedConstraintMap.erase(theConstraint); + } + else + { + // suppress + auto aPair = myConstraintMap.find(theConstraint); + if (aPair == myConstraintMap.end()) + return false; + myDeactivatedConstraintMap.insert((*aPair)); + + ConstraintWrapperPtr aCW = aPair->second; + ConstraintID anID = aCW->id(); + mySketchSolver->removeConstraint(anID); + myConstraintMap.erase(theConstraint); + } + myNeedToResolve = true; + notify(theConstraint); + + return true; +} + +bool PlaneGCSSolver_Storage::UpdateDeactivateList() +{ + std::list toRemove; + for (auto& aDeactMap : myDeactivatedConstraintMap) + { + if (!aDeactMap.first->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())) + { + toRemove.push_back(aDeactMap.first); + } + } + for (auto& aRemove : toRemove) + { + myDeactivatedConstraintMap.erase(aRemove); + } + + for (auto& aDeactMap : myDeactivatedConstraintMap) + { + if (aDeactMap.first->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value()) + { + changeActiveStatus(aDeactMap.first, true); + } + } + return true; +} + void PlaneGCSSolver_Storage::removeInvalidEntities() { PlaneGCSSolver_EntityDestroyer aDestroyer; diff --git a/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.h b/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.h index 6623376a5..81e4d4b00 100644 --- a/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.h +++ b/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.h @@ -70,6 +70,11 @@ public: /// \return \c true if the constraint and all its parameters are removed successfully virtual bool removeConstraint(ConstraintPtr theConstraint); + // Change status of constraints. + virtual bool changeActiveStatus(ConstraintPtr theConstraint, bool theNewState); + + virtual bool UpdateDeactivateList(); + /// \brief Verify, the sketch contains degenerated geometry /// after resolving the set of constraints /// \return STATUS_OK if the geometry is valid, STATUS_DEGENERATED otherwise. diff --git a/src/SketchSolver/SketchSolver_ConstraintDistance.cpp b/src/SketchSolver/SketchSolver_ConstraintDistance.cpp index 590681a86..06b248c9d 100644 --- a/src/SketchSolver/SketchSolver_ConstraintDistance.cpp +++ b/src/SketchSolver/SketchSolver_ConstraintDistance.cpp @@ -215,6 +215,10 @@ void SketchSolver_ConstraintDistance::adjustConstraint() void SketchSolver_ConstraintDistance::update() { ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint); + + if (!aConstraint) + return; + myPrevValue = aConstraint->value(); bool isDistanceAlognDir = diff --git a/src/SketchSolver/SketchSolver_Group.cpp b/src/SketchSolver/SketchSolver_Group.cpp index 232c8525e..558101c19 100644 --- a/src/SketchSolver/SketchSolver_Group.cpp +++ b/src/SketchSolver/SketchSolver_Group.cpp @@ -231,6 +231,21 @@ bool SketchSolver_Group::movePoint(AttributePtr theAttribute, // ============================================================================ bool SketchSolver_Group::resolveConstraints() { + auto aNb = mySketch->numberOfSubs(); + std::list aList; + for (int i = 0; i < aNb; ++i) + if (mySketch->subFeature(i)->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()) && !mySketch->subFeature(i)->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value()) + aList.push_back(std::dynamic_pointer_cast(mySketch->subFeature(i))); + + while (aList.size() > 0) + { + auto aConstr = aList.front(); + aList.pop_front(); + myStorage->changeActiveStatus(aConstr, false); + } + + myStorage->UpdateDeactivateList(); + static const int MAX_STACK_SIZE = 5; // check the "Multi" constraints do not drop sketch into infinite loop if (myMultiConstraintUpdateStack > MAX_STACK_SIZE) { diff --git a/src/SketchSolver/SketchSolver_Storage.h b/src/SketchSolver/SketchSolver_Storage.h index 281913257..eef815aec 100644 --- a/src/SketchSolver/SketchSolver_Storage.h +++ b/src/SketchSolver/SketchSolver_Storage.h @@ -103,6 +103,11 @@ public: /// \brief Removes constraint from the storage /// \return \c true if the constraint and all its parameters are removed successfully virtual bool removeConstraint(ConstraintPtr theConstraint) = 0; + + virtual bool changeActiveStatus(ConstraintPtr theConstraint, bool theNewState) = 0; + + virtual bool UpdateDeactivateList() = 0; + /// \brief Removes feature from the storage void removeFeature(FeaturePtr theFeature); /// \brief Removes attribute from the storage @@ -177,6 +182,7 @@ protected: std::map myAttributeMap; UpdaterPtr myUpdaters; + std::map myDeactivatedConstraintMap; }; typedef std::shared_ptr StoragePtr; diff --git a/src/SketcherPrs/CMakeLists.txt b/src/SketcherPrs/CMakeLists.txt index 5315b9c54..c0328f64b 100644 --- a/src/SketcherPrs/CMakeLists.txt +++ b/src/SketcherPrs/CMakeLists.txt @@ -94,14 +94,23 @@ ENDIF() SET(PROJECT_PICTURES icons/collinear.png + icons/collinear_deactivate.png icons/parallel.png + icons/parallel_deactivate.png icons/perpendicular.png + icons/perpendicular_deactivate.png icons/anchor.png + icons/anchor_deactivate.png icons/horisontal.png + icons/horisontal_deactivate.png icons/vertical.png + icons/vertical_deactivate.png icons/equal.png + icons/equal_deactivate.png icons/tangent.png + icons/tangent_deactivate.png icons/middlepoint.png + icons/middlepoint_deactivate.png icons/mirror.png icons/rotate.png icons/translate.png diff --git a/src/SketcherPrs/SketcherPrs_Angle.cpp b/src/SketcherPrs/SketcherPrs_Angle.cpp index 88d57dd1a..3b0f2ecef 100644 --- a/src/SketcherPrs/SketcherPrs_Angle.cpp +++ b/src/SketcherPrs/SketcherPrs_Angle.cpp @@ -48,6 +48,7 @@ /// \param theDimAspect an aspect to be changed /// \param theDimValue an arrow value /// \param theTextSize an arrow value +/// \param theIsActivated state of constraint extern void updateArrows(Handle(Prs3d_DimensionAspect) theDimAspect, double theDimValue, double theTextSize, SketcherPrs_Tools::LocationType theLocationType); @@ -247,7 +248,7 @@ void SketcherPrs_Angle::Compute(const Handle(PrsMgr_PresentationManager3d)& theP SetFlyout(aDist); // Update text visualization: parameter value or parameter text - myStyleListener->updateDimensions(this, myValue); + myStyleListener->updateDimensions(this, myValue, !aData->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value()); double aTextSize = 0.0; GetValueString(aTextSize); diff --git a/src/SketcherPrs/SketcherPrs_Collinear.h b/src/SketcherPrs/SketcherPrs_Collinear.h index 8cd9a8f34..4e55f83b7 100644 --- a/src/SketcherPrs/SketcherPrs_Collinear.h +++ b/src/SketcherPrs/SketcherPrs_Collinear.h @@ -49,7 +49,7 @@ public: const std::shared_ptr& thePlane); protected: - virtual const char* iconName() const { return "collinear.png"; } + virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "collinear.png" : "collinear_deactivate.png"; } virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const; diff --git a/src/SketcherPrs/SketcherPrs_DimensionStyle.cpp b/src/SketcherPrs/SketcherPrs_DimensionStyle.cpp index 6679e7885..775217b4b 100644 --- a/src/SketcherPrs/SketcherPrs_DimensionStyle.cpp +++ b/src/SketcherPrs/SketcherPrs_DimensionStyle.cpp @@ -64,18 +64,18 @@ SketcherPrs_DimensionStyle::~SketcherPrs_DimensionStyle() } void SketcherPrs_DimensionStyle::updateDimensions(PrsDim_Dimension* theDimension, - const SketcherPrs_DimensionStyle::DimensionValue& theDimensionValue) + const SketcherPrs_DimensionStyle::DimensionValue& theDimensionValue, bool theIsSuppress) { if (!theDimension) return; updateDimensions(theDimension, theDimensionValue.myHasParameters, - theDimensionValue.myTextValue, theDimensionValue.myDoubleValue); + theDimensionValue.myTextValue, theDimensionValue.myDoubleValue, theIsSuppress); } void SketcherPrs_DimensionStyle::updateDimensions(PrsDim_Dimension* theDimension, const bool theHasParameters, const std::string& theTextValue, - const double theDoubleValue) + const double theDoubleValue, bool theIsSuppress) { if (!theDimension) return; @@ -90,13 +90,31 @@ void SketcherPrs_DimensionStyle::updateDimensions(PrsDim_Dimension* theDimension #endif TCollection_ExtendedString aCustomValue; - if (theHasParameters) { - //bool isParameterTextStyle = myStyle == SketcherPrs_ParameterStyleMessage::ParameterText; - bool isParameterTextStyle = - SketcherPrs_Tools::parameterStyle() == SketcherPrs_Tools::ParameterText; - - if (isParameterTextStyle) - aCustomValue = theTextValue.c_str(); + if (theIsSuppress) + { + // for suppressed constraints not need show value + aCustomValue = TCollection_ExtendedString(MyEmptySymbol); + } + else + { + if (theHasParameters) { + //bool isParameterTextStyle = myStyle == SketcherPrs_ParameterStyleMessage::ParameterText; + bool isParameterTextStyle = + SketcherPrs_Tools::parameterStyle() == SketcherPrs_Tools::ParameterText; + + if (isParameterTextStyle) + aCustomValue = theTextValue.c_str(); + else { + // format value string using "sprintf" + TCollection_AsciiString aFormatStr = + theDimension->Attributes()->DimensionAspect()->ValueStringFormat(); + char aFmtBuffer[256]; + sprintf(aFmtBuffer, aFormatStr.ToCString(), theDoubleValue); + aCustomValue = TCollection_ExtendedString(aFmtBuffer); + + aCustomValue.Insert(1, MySigmaSymbol); + } + } else { // format value string using "sprintf" TCollection_AsciiString aFormatStr = @@ -104,18 +122,8 @@ void SketcherPrs_DimensionStyle::updateDimensions(PrsDim_Dimension* theDimension char aFmtBuffer[256]; sprintf (aFmtBuffer, aFormatStr.ToCString(), theDoubleValue); aCustomValue = TCollection_ExtendedString (aFmtBuffer); - - aCustomValue.Insert (1, MySigmaSymbol); } } - else { - // format value string using "sprintf" - TCollection_AsciiString aFormatStr = - theDimension->Attributes()->DimensionAspect()->ValueStringFormat(); - char aFmtBuffer[256]; - sprintf (aFmtBuffer, aFormatStr.ToCString(), theDoubleValue); - aCustomValue = TCollection_ExtendedString (aFmtBuffer); - } #ifdef COMPILATION_CORRECTION theDimension->SetCustomValue(theDoubleValue); #else diff --git a/src/SketcherPrs/SketcherPrs_DimensionStyle.h b/src/SketcherPrs/SketcherPrs_DimensionStyle.h index 32e459021..30a8439f8 100644 --- a/src/SketcherPrs/SketcherPrs_DimensionStyle.h +++ b/src/SketcherPrs/SketcherPrs_DimensionStyle.h @@ -64,7 +64,7 @@ public: /// \param theDimension a modified dimension /// \param theDimensionValue container filled by the model double attribute Standard_EXPORT void updateDimensions(PrsDim_Dimension* theDimension, - const DimensionValue& theDimensionValue); + const DimensionValue& theDimensionValue, bool theIsSuppress/* = false*/); private: /// Visualizes the dimension text or dimension value depending on the has parameters state @@ -72,10 +72,11 @@ private: /// \param theHasParameters if true, the text is shown, else digit /// \param theTextValue a dimension text value /// \param theDoubleValue a dimension digit value + /// \param theIsSuppress a state of constraint (active or not) void updateDimensions(PrsDim_Dimension* theDimension, const bool theHasParameters, const std::string& theTextValue, - const double theDoubleValue); + const double theDoubleValue, bool theIsSuppress/* = false*/); }; #endif \ No newline at end of file diff --git a/src/SketcherPrs/SketcherPrs_Equal.h b/src/SketcherPrs/SketcherPrs_Equal.h index bb1983b9a..867a6d100 100644 --- a/src/SketcherPrs/SketcherPrs_Equal.h +++ b/src/SketcherPrs/SketcherPrs_Equal.h @@ -48,7 +48,7 @@ public: const std::shared_ptr& thePlane); protected: - virtual const char* iconName() const { return "equal.png"; } + virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "equal.png" : "equal_deactivate.png"; } virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const; diff --git a/src/SketcherPrs/SketcherPrs_HVDirection.h b/src/SketcherPrs/SketcherPrs_HVDirection.h index 5ce5ceb23..91deaed0d 100644 --- a/src/SketcherPrs/SketcherPrs_HVDirection.h +++ b/src/SketcherPrs/SketcherPrs_HVDirection.h @@ -51,7 +51,12 @@ public: const std::shared_ptr& thePlane); protected: - virtual const char* iconName() const { return myIsHorisontal? "horisontal.png" : "vertical.png"; } + virtual const char* iconName(bool isActiveIcon = true) const { + if (isActiveIcon) + return myIsHorisontal? "horisontal.png" : "vertical.png"; + else + return myIsHorisontal ? "horisontal_deactivate.png" : "vertical_deactivate.png"; + } /// Redefine this function in order to add additiona lines of constraint base /// \param thePrs a presentation diff --git a/src/SketcherPrs/SketcherPrs_LengthDimension.cpp b/src/SketcherPrs/SketcherPrs_LengthDimension.cpp index f81fe13c2..87ed9bff6 100644 --- a/src/SketcherPrs/SketcherPrs_LengthDimension.cpp +++ b/src/SketcherPrs/SketcherPrs_LengthDimension.cpp @@ -225,7 +225,7 @@ void SketcherPrs_LengthDimension::Compute( updateArrows(DimensionAspect(), GetValue(), aTextSize, aLocationType); // Update text visualization: parameter value or parameter text - myStyleListener->updateDimensions(this, myValue); + myStyleListener->updateDimensions(this, myValue, !myConstraint->data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value()); PrsDim_LengthDimension::Compute(thePresentationManager, thePresentation, theMode); diff --git a/src/SketcherPrs/SketcherPrs_Middle.h b/src/SketcherPrs/SketcherPrs_Middle.h index 92820adff..204706799 100644 --- a/src/SketcherPrs/SketcherPrs_Middle.h +++ b/src/SketcherPrs/SketcherPrs_Middle.h @@ -48,7 +48,7 @@ public: const std::shared_ptr& thePlane); protected: - virtual const char* iconName() const { return "middlepoint.png"; } + virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "middlepoint.png" : "middlepoint_deactivate.png"; } virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const; diff --git a/src/SketcherPrs/SketcherPrs_Mirror.h b/src/SketcherPrs/SketcherPrs_Mirror.h index e4b021713..0bb6d2880 100644 --- a/src/SketcherPrs/SketcherPrs_Mirror.h +++ b/src/SketcherPrs/SketcherPrs_Mirror.h @@ -47,7 +47,7 @@ public: static bool IsReadyToDisplay(ModelAPI_Feature* theConstraint, const std::shared_ptr& thePlane); protected: - virtual const char* iconName() const { return "mirror.png"; } + virtual const char* iconName(bool /*isActiveIcon*/) const { return "mirror.png"; } virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const; diff --git a/src/SketcherPrs/SketcherPrs_Offset.h b/src/SketcherPrs/SketcherPrs_Offset.h index 8a479c6fa..e327f8df1 100644 --- a/src/SketcherPrs/SketcherPrs_Offset.h +++ b/src/SketcherPrs/SketcherPrs_Offset.h @@ -49,7 +49,7 @@ public: const std::shared_ptr& thePlane); protected: - virtual const char* iconName() const { return "offset.png"; } + virtual const char* iconName(bool /*isActiveIcon*/) const { return "offset.png"; } virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const; diff --git a/src/SketcherPrs/SketcherPrs_Parallel.h b/src/SketcherPrs/SketcherPrs_Parallel.h index c85cbfa99..a65ab4849 100644 --- a/src/SketcherPrs/SketcherPrs_Parallel.h +++ b/src/SketcherPrs/SketcherPrs_Parallel.h @@ -48,7 +48,7 @@ public: const std::shared_ptr& thePlane); protected: - virtual const char* iconName() const { return "parallel.png"; } + virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "parallel.png" : "parallel_deactivate.png"; } virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const; diff --git a/src/SketcherPrs/SketcherPrs_Perpendicular.h b/src/SketcherPrs/SketcherPrs_Perpendicular.h index f214c98fe..209b32aa1 100644 --- a/src/SketcherPrs/SketcherPrs_Perpendicular.h +++ b/src/SketcherPrs/SketcherPrs_Perpendicular.h @@ -50,7 +50,7 @@ public: static bool IsReadyToDisplay(ModelAPI_Feature* theConstraint, const std::shared_ptr& thePlane); protected: - virtual const char* iconName() const { return "perpendicular.png"; } + virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "perpendicular.png" : "perpendicular_deactivate.png"; } /// Redefine this function in order to add additiona lines of constraint base /// \param thePrs a presentation diff --git a/src/SketcherPrs/SketcherPrs_Radius.cpp b/src/SketcherPrs/SketcherPrs_Radius.cpp index e656da498..ca48ac5fb 100644 --- a/src/SketcherPrs/SketcherPrs_Radius.cpp +++ b/src/SketcherPrs/SketcherPrs_Radius.cpp @@ -160,7 +160,7 @@ void SketcherPrs_Radius::Compute( } SetMeasuredGeometry(myCircle, myAnchorPoint); - myStyleListener->updateDimensions(this, myValue); + myStyleListener->updateDimensions(this, myValue, !myConstraint->data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value()); // Update variable aspect parameters (depending on viewer scale) double aTextSize = 0.0; diff --git a/src/SketcherPrs/SketcherPrs_Rigid.h b/src/SketcherPrs/SketcherPrs_Rigid.h index 81b933060..c5bc43696 100644 --- a/src/SketcherPrs/SketcherPrs_Rigid.h +++ b/src/SketcherPrs/SketcherPrs_Rigid.h @@ -51,7 +51,7 @@ public: static bool IsReadyToDisplay(ModelAPI_Feature* theConstraint, const std::shared_ptr& thePlane); protected: - virtual const char* iconName() const { return "anchor.png"; } + virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "anchor.png" : "anchor_deactivate.png"; } /// Redefine this function in order to add additiona lines of constraint base /// \param thePrs a presentation diff --git a/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp b/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp index 0d156d22b..f85d679a4 100644 --- a/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp +++ b/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp @@ -159,8 +159,9 @@ SketcherPrs_SymbolPrs::~SketcherPrs_SymbolPrs() //********************************************************************************* Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon() { - if (myIconsMap.count(iconName()) == 1) { - return myIconsMap[iconName()]; + auto isIconType = myConstraint->boolean("ConstraintState")->value(); + if (myIconsMap.count(iconName(isIconType)) == 1) { + return myIconsMap[iconName(isIconType)]; } // Load icon for the presentation std::string aFile; @@ -175,7 +176,7 @@ Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon() } aFile += FSEP; - aFile += iconName(); + aFile += iconName(isIconType); Handle(Image_AlienPixMap) aPixMap = new Image_AlienPixMap(); if (aPixMap->Load(aFile.c_str())) { int aRatio = SketcherPrs_Tools::pixelRatio(); @@ -192,14 +193,14 @@ Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon() } aPixMap = aSizedMap; } - myIconsMap[iconName()] = aPixMap; + myIconsMap[iconName(isIconType)] = aPixMap; return aPixMap; } // The icon for constraint is not found static const char aMsg[] = "Error! constraint images are not found"; std::cout<SetColor(myCustomColor); - } + Handle(Image_AlienPixMap) aIcon = icon(); + if (aIcon.IsNull()) + myAspect = new Graphic3d_AspectMarker3d(); + else + myAspect = new Graphic3d_AspectMarker3d(aIcon); } //********************************************************************************* diff --git a/src/SketcherPrs/SketcherPrs_SymbolPrs.h b/src/SketcherPrs/SketcherPrs_SymbolPrs.h index d83d931a8..5e51b5f54 100644 --- a/src/SketcherPrs/SketcherPrs_SymbolPrs.h +++ b/src/SketcherPrs/SketcherPrs_SymbolPrs.h @@ -109,7 +109,7 @@ protected: const Standard_Integer aMode); /// Returns an icon file name. Has to be redefined in successors - virtual const char* iconName() const = 0; + virtual const char* iconName(bool isActiveIcon = true) const = 0; /// Check and creates if it is necessary myAspect member. /// It has to be called before the object computation diff --git a/src/SketcherPrs/SketcherPrs_Tangent.h b/src/SketcherPrs/SketcherPrs_Tangent.h index 1f61dbecb..547ab1c73 100644 --- a/src/SketcherPrs/SketcherPrs_Tangent.h +++ b/src/SketcherPrs/SketcherPrs_Tangent.h @@ -50,7 +50,7 @@ public: const std::shared_ptr& thePlane); protected: - virtual const char* iconName() const { return "tangent.png"; } + virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "tangent.png" : "tangent_deactivate.png"; } virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const; diff --git a/src/SketcherPrs/SketcherPrs_Transformation.h b/src/SketcherPrs/SketcherPrs_Transformation.h index 387ab2bf2..97f12838a 100644 --- a/src/SketcherPrs/SketcherPrs_Transformation.h +++ b/src/SketcherPrs/SketcherPrs_Transformation.h @@ -50,7 +50,7 @@ public: static bool IsReadyToDisplay(ModelAPI_Feature* theConstraint, const std::shared_ptr& thePlane); protected: - virtual const char* iconName() const { return myIsTranslation? "translate.png" : "rotate.png"; } + virtual const char* iconName(bool /*isActiveIcon*/ ) const { return myIsTranslation ? "translate.png" : "rotate.png"; } /// Redefine this function in order to add additiona lines of constraint base /// \param thePrs a presentation diff --git a/src/SketcherPrs/icons/anchor_deactivate.png b/src/SketcherPrs/icons/anchor_deactivate.png new file mode 100644 index 000000000..c03591e15 Binary files /dev/null and b/src/SketcherPrs/icons/anchor_deactivate.png differ diff --git a/src/SketcherPrs/icons/collinear_deactivate.png b/src/SketcherPrs/icons/collinear_deactivate.png new file mode 100644 index 000000000..19c401385 Binary files /dev/null and b/src/SketcherPrs/icons/collinear_deactivate.png differ diff --git a/src/SketcherPrs/icons/equal_deactivate.png b/src/SketcherPrs/icons/equal_deactivate.png new file mode 100644 index 000000000..f865127fc Binary files /dev/null and b/src/SketcherPrs/icons/equal_deactivate.png differ diff --git a/src/SketcherPrs/icons/horisontal_deactivate.png b/src/SketcherPrs/icons/horisontal_deactivate.png new file mode 100644 index 000000000..c11988aea Binary files /dev/null and b/src/SketcherPrs/icons/horisontal_deactivate.png differ diff --git a/src/SketcherPrs/icons/middlepoint_deactivate.png b/src/SketcherPrs/icons/middlepoint_deactivate.png new file mode 100644 index 000000000..bd0ef350d Binary files /dev/null and b/src/SketcherPrs/icons/middlepoint_deactivate.png differ diff --git a/src/SketcherPrs/icons/parallel_deactivate.png b/src/SketcherPrs/icons/parallel_deactivate.png new file mode 100644 index 000000000..49cb518ed Binary files /dev/null and b/src/SketcherPrs/icons/parallel_deactivate.png differ diff --git a/src/SketcherPrs/icons/perpendicular_deactivate.png b/src/SketcherPrs/icons/perpendicular_deactivate.png new file mode 100644 index 000000000..31c1f6dbe Binary files /dev/null and b/src/SketcherPrs/icons/perpendicular_deactivate.png differ diff --git a/src/SketcherPrs/icons/tangent_deactivate.png b/src/SketcherPrs/icons/tangent_deactivate.png new file mode 100644 index 000000000..90bffe48b Binary files /dev/null and b/src/SketcherPrs/icons/tangent_deactivate.png differ diff --git a/src/SketcherPrs/icons/vertical_deactivate.png b/src/SketcherPrs/icons/vertical_deactivate.png new file mode 100644 index 000000000..201f281c7 Binary files /dev/null and b/src/SketcherPrs/icons/vertical_deactivate.png differ diff --git a/src/XGUI/CMakeLists.txt b/src/XGUI/CMakeLists.txt index 25a57a530..bb76c8c0c 100644 --- a/src/XGUI/CMakeLists.txt +++ b/src/XGUI/CMakeLists.txt @@ -58,13 +58,14 @@ SET(PROJECT_HEADERS XGUI_Selection.h XGUI_SelectionActivate.h XGUI_SelectionMgr.h + XGUI_SketchConstraintsBrowser.h XGUI_Tools.h XGUI_TransparencyWidget.h XGUI_ViewerProxy.h XGUI_Workshop.h XGUI_WorkshopListener.h - XGUI_InspectionPanel.h - XGUI_CompressFiles.h + XGUI_InspectionPanel.h + XGUI_CompressFiles.h ) SET(PROJECT_MOC_HEADERS @@ -88,11 +89,12 @@ SET(PROJECT_MOC_HEADERS XGUI_PropertyPanel.h XGUI_PropertyPanelSelector.h XGUI_SelectionMgr.h + XGUI_SketchConstraintsBrowser.h XGUI_TransparencyWidget.h XGUI_ViewerProxy.h XGUI_Workshop.h XGUI_WorkshopListener.h - XGUI_InspectionPanel.h + XGUI_InspectionPanel.h ) # sources / moc wrappings @@ -125,13 +127,14 @@ SET(PROJECT_SOURCES XGUI_Selection.cpp XGUI_SelectionActivate.cpp XGUI_SelectionMgr.cpp + XGUI_SketchConstraintsBrowser.cpp XGUI_Tools.cpp XGUI_TransparencyWidget.cpp XGUI_ViewerProxy.cpp XGUI_Workshop.cpp XGUI_WorkshopListener.cpp - XGUI_InspectionPanel.cpp - XGUI_CompressFiles.cpp + XGUI_InspectionPanel.cpp + XGUI_CompressFiles.cpp ) SET(PROJECT_RESOURCES diff --git a/src/XGUI/XGUI_ActionsMgr.cpp b/src/XGUI/XGUI_ActionsMgr.cpp index e803522b4..f6500a801 100644 --- a/src/XGUI/XGUI_ActionsMgr.cpp +++ b/src/XGUI/XGUI_ActionsMgr.cpp @@ -121,7 +121,9 @@ void XGUI_ActionsMgr::updateCommandsStatus() { setAllEnabled(); XGUI_Selection* aSelection = myWorkshop->selector()->selection(); - if (aSelection->getSelected(ModuleBase_ISelection::AllControls).size() > 0) + // If ::ConstraintsBrowser and has Coincodence deleted - fail!!! + if (aSelection->getSelected(ModuleBase_ISelection::AllControls).size() > 0 + && aSelection->getSelected(ModuleBase_ISelection::ConstraintsBorwser).size() == 0) updateOnViewSelection(); FeaturePtr anActiveFeature = FeaturePtr(); diff --git a/src/XGUI/XGUI_ContextMenuMgr.cpp b/src/XGUI/XGUI_ContextMenuMgr.cpp index 9550326bd..cf3904bd2 100644 --- a/src/XGUI/XGUI_ContextMenuMgr.cpp +++ b/src/XGUI/XGUI_ContextMenuMgr.cpp @@ -20,6 +20,7 @@ #include "XGUI_ContextMenuMgr.h" #include "XGUI_Workshop.h" #include "XGUI_ObjectsBrowser.h" +#include "XGUI_SketchConstraintsBrowser.h" #include "XGUI_SelectionMgr.h" #include "XGUI_Displayer.h" #include "XGUI_ViewerProxy.h" @@ -101,6 +102,10 @@ void XGUI_ContextMenuMgr::createActions() anAction->setShortcut(Qt::Key_F2); addAction("RENAME_CMD", anAction); + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/part_ico.png"), tr("Deactivate/Activate"), + aDesktop, this); + addAction("DEACTIVATE_CONSTRAINT_CMD", anAction); + #ifdef HAVE_SALOME anAction = ModuleBase_Tools::createAction(QIcon(":pictures/move_to_end.png"), XGUI_Workshop::MOVE_TO_END_COMMAND, this); @@ -166,6 +171,10 @@ void XGUI_ContextMenuMgr::createActions() aDesktop); addAction("ISOLINES_CMD", anAction); + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/rename_edit.png"), tr("Edit..."), + aDesktop); + addAction("EDIT_CONSTR_CMD", anAction); + anAction = ModuleBase_Tools::createAction(QIcon(), tr("Show Isos"), aDesktop); anAction->setCheckable(true); addAction("SHOW_ISOLINES_CMD", anAction); @@ -251,6 +260,7 @@ void XGUI_ContextMenuMgr::createActions() addAction("SET_VIEW_NORMAL_CMD", anAction); buildObjBrowserMenu(); + buildConstrBrowserMenu(); buildViewerMenu(); } @@ -304,6 +314,8 @@ void XGUI_ContextMenuMgr::onContextMenuRequest(QContextMenuEvent* theEvent) } else if (sender() == myWorkshop->viewer()) { updateViewerMenu(); addViewerMenu(aMenu); + } else if (sender() == myWorkshop->constraintsBrowser()) { + addConstrBrowserMenu(aMenu); } if (aMenu && (aMenu->actions().size() > 0)) { @@ -699,6 +711,11 @@ void XGUI_ContextMenuMgr::connectViewer() SLOT(onContextMenuRequest(QContextMenuEvent*))); } +void XGUI_ContextMenuMgr::connectConstraintsBrowser() +{ + connect(myWorkshop->constraintsBrowser(), SIGNAL(contextMenuRequested(QContextMenuEvent*)), this, + SLOT(onContextMenuRequest(QContextMenuEvent*))); +} void XGUI_ContextMenuMgr::buildObjBrowserMenu() { @@ -820,6 +837,18 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu() myObjBrowserMenus[ModelAPI_ResultField::ModelAPI_FieldStep::group()] = aList; } +void XGUI_ContextMenuMgr::buildConstrBrowserMenu() +{ + QAction* aSeparator = ModuleBase_Tools::createAction(QIcon(), "", myWorkshop->desktop()); + aSeparator->setSeparator(true); + + QActionsList aList; + + aList.append(action("HIDE_CMD")); + aList.append(action("DELETE_CMD")); + aList.append(action("DEACTIVATE_CONSTRAINT_CMD")); +} + void XGUI_ContextMenuMgr::buildViewerMenu() { QActionsList aList; @@ -886,6 +915,56 @@ void XGUI_ContextMenuMgr::buildViewerMenu() myViewerMenu[ModelAPI_ResultField::ModelAPI_FieldStep::group()] = aList; } +void XGUI_ContextMenuMgr::addConstrBrowserMenu(QMenu* theMenu) const +{ + QActionsList anActions; + QObjectPtrList aObjects = myWorkshop->constraintsBrowser()->selectedObjects(); + + // Check that state foreach constraint. + // If at least 1 is Activa - show Deactivate + // otherwise - show Activate + // + if (aObjects.size() > 0) + { + // It's update START + + // Enable edit only if exist at least 1 dimensional constraint + bool isEditEnabled = false; + foreach(ObjectPtr anObject, aObjects) + { + if (auto aFeat = ModelAPI_Feature::feature(anObject)) + { + if (aFeat->real("ConstraintValue")) + { + isEditEnabled = true; + break; + } + } + } + + action("EDIT_CONSTR_CMD")->setEnabled(isEditEnabled); + action("DELETE_CMD")->setEnabled(true); + action("DEACTIVATE_CONSTRAINT_CMD")->setEnabled(true); + // It's update END + + anActions.append(action("EDIT_CONSTR_CMD")); + anActions.append(action("DELETE_CMD")); + anActions.append(action("DEACTIVATE_CONSTRAINT_CMD")); + } + else + { + // It's update START + action("EDIT_CONSTR_CMD")->setEnabled(true); + // It's update END + + anActions.append(action("EDIT_CONSTR_CMD")); + } + + + theMenu->addActions(anActions); + addFeatures(theMenu); + +} void XGUI_ContextMenuMgr::addObjBrowserMenu(QMenu* theMenu) const { diff --git a/src/XGUI/XGUI_ContextMenuMgr.h b/src/XGUI/XGUI_ContextMenuMgr.h index 3f1112a32..fb41ccbf3 100644 --- a/src/XGUI/XGUI_ContextMenuMgr.h +++ b/src/XGUI/XGUI_ContextMenuMgr.h @@ -67,9 +67,15 @@ Q_OBJECT /// Connect to viewer from workshop. Has to called at creation of viewer. void connectViewer(); + /// Connect to viewer from workshop. Has to called at creation of viewer. + void connectConstraintsBrowser(); + /// Add menu items for Object browser pop-up void addObjBrowserMenu(QMenu*) const; + /// Add menu items for Object browser pop-up + void addConstrBrowserMenu(QMenu*) const; + /// Add menu items for Viewer pop-up void addViewerMenu(QMenu*) const; @@ -126,6 +132,9 @@ signals: /// Creates menu for object browser void buildObjBrowserMenu(); + /// Creates menu for object browser + void buildConstrBrowserMenu(); + /// Creates menu for viewer void buildViewerMenu(); diff --git a/src/XGUI/XGUI_Displayer.cpp b/src/XGUI/XGUI_Displayer.cpp index 6ee3b9348..32b6df969 100644 --- a/src/XGUI/XGUI_Displayer.cpp +++ b/src/XGUI/XGUI_Displayer.cpp @@ -509,6 +509,23 @@ void XGUI_Displayer::setSelected(const QList& theValue #endif } } + else + { + auto aConstrFeature = ModelAPI_Feature::feature(anObject); + if (!aConstrFeature) + continue; + + AISObjectPtr aAisPtr = myWorkshop->displayer()->getAISObject(aConstrFeature); + if (!aAisPtr) + { + aAisPtr = myResult2AISObjectMap.value(aConstrFeature->lastResult()); + if (!aAisPtr) + continue; + } + Handle(AIS_InteractiveObject) aAisObj = aAisPtr->impl(); + + aContext->AddOrRemoveSelected(aAisObj, false); + } } } if (!aShapesToBeSelected.IsEmpty()) diff --git a/src/XGUI/XGUI_Selection.cpp b/src/XGUI/XGUI_Selection.cpp index fab475e49..74c909829 100644 --- a/src/XGUI/XGUI_Selection.cpp +++ b/src/XGUI/XGUI_Selection.cpp @@ -22,6 +22,7 @@ #include "XGUI_Displayer.h" #include "XGUI_ViewerProxy.h" #include "XGUI_ObjectsBrowser.h" +#include "XGUI_SketchConstraintsBrowser.h" #ifndef HAVE_SALOME #include @@ -79,6 +80,10 @@ QList XGUI_Selection::getSelected(const SelectionPlace& case Viewer: getSelectedInViewer(aPresentations); break; + case ConstraintsBorwser: + getSelectedInSketchConstraintsBrowser(aPresentations); + break; + case AllControls: // Get selection from object browser getSelectedInBrowser(aPresentations); @@ -201,6 +206,33 @@ void XGUI_Selection::getSelectedInBrowser(QList& thePre } } +void XGUI_Selection::getSelectedInSketchConstraintsBrowser(QList>& thePresentations) const +{ + QObjectPtrList anObjects; + if (myWorkshop->constraintsBrowser()) + anObjects = myWorkshop->constraintsBrowser()->selectedObjects(); + + if (anObjects.isEmpty()) + return; + + QObjectPtrList::const_iterator anIt = anObjects.begin(), aLast = anObjects.end(); + for (; anIt != aLast; anIt++) { + ObjectPtr anObject = *anIt; + if (anObject.get() != NULL) { + auto aConstrFeature = ModelAPI_Feature::feature(anObject); + thePresentations.append(std::shared_ptr( + new ModuleBase_ViewerPrs(anObject, GeomShapePtr(), NULL))); + /* AISObjectPtr aAisPtr = myWorkshop->displayer()->getAISObject(aConstrFeature); + if (!aAisPtr) + continue; + Handle(AIS_InteractiveObject) aAisObj = aAisPtr->impl(); + auto aPrs = std::shared_ptr( + new ModuleBase_ViewerPrs(anObject, GeomShapePtr(), NULL)); + aPrs->setInteractive(aAisObj); + thePresentations.append(aPrs);*/ + } + } +} void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrsPtr& thePrs, const Handle(SelectMgr_EntityOwner)& theOwner) const { @@ -381,6 +413,8 @@ QObjectPtrList XGUI_Selection::selectedObjects() const { if (myWorkshop->objectBrowser()) return myWorkshop->objectBrowser()->selectedObjects(); + if (myWorkshop->constraintsBrowser()) + return myWorkshop->constraintsBrowser()->selectedObjects(); return QObjectPtrList(); } diff --git a/src/XGUI/XGUI_Selection.h b/src/XGUI/XGUI_Selection.h index 58b257998..65d5b5f36 100644 --- a/src/XGUI/XGUI_Selection.h +++ b/src/XGUI/XGUI_Selection.h @@ -103,6 +103,13 @@ protected: /// \param thePresentations an output list of presentation void getSelectedInBrowser(QList>& thePresentations) const; + /// Fills the list of presentations by objects selected in the object browser. + /// ViewerPrs contains only object parameter not empty. + /// If the given list of presentations already has a viewer presentation with the same object + /// as selected in the browser, a new item is not appended to the list of presentations. + /// \param thePresentations an output list of presentation + void getSelectedInSketchConstraintsBrowser(QList>& thePresentations) const; + /// Generates a vertex or edge by the give IO if it is an AIS created on trihedron /// \param theIO a selected object /// \return created shape or empty shape diff --git a/src/XGUI/XGUI_SelectionMgr.cpp b/src/XGUI/XGUI_SelectionMgr.cpp index 80f1d1592..63188daaa 100644 --- a/src/XGUI/XGUI_SelectionMgr.cpp +++ b/src/XGUI/XGUI_SelectionMgr.cpp @@ -21,6 +21,7 @@ #include "XGUI_Workshop.h" #include "XGUI_ObjectsBrowser.h" +#include "XGUI_SketchConstraintsBrowser.h" #include "XGUI_SalomeConnector.h" #include "XGUI_ViewerProxy.h" #include "XGUI_Displayer.h" @@ -83,6 +84,8 @@ void XGUI_SelectionMgr::connectViewers() //Connect to other viewers connect(myWorkshop->viewer(), SIGNAL(selectionChanged()), this, SLOT(onViewerSelection())); + connect(myWorkshop->constraintsBrowser(), SIGNAL(selectionChanged()), this, + SLOT(onSketchConstraintsBrowserSelection())); } //************************************************************** @@ -140,6 +143,39 @@ void XGUI_SelectionMgr::onObjectBrowserSelection() emit selectionChanged(); } +//************************************************************** +void XGUI_SelectionMgr::onSketchConstraintsBrowserSelection() +{ + myLastSelectionPlace = ModuleBase_ISelection::ConstraintsBorwser; + QList aSelectedPrs = + myWorkshop->selector()->selection()->getSelected(ModuleBase_ISelection::ConstraintsBorwser); + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + if (!myWorkshop->operationMgr()->hasOperation()) { + + ObjectPtr aObject; + FeaturePtr aFeature; + // Select all results of a selected feature in viewer + foreach(ModuleBase_ViewerPrsPtr aPrs, aSelectedPrs) { + aObject = aPrs->object(); + if (aObject.get()) { + aFeature = std::dynamic_pointer_cast(aObject); + if (aFeature.get()) { + std::list allRes; + ModelAPI_Tools::allResults(aFeature, allRes); + std::list::iterator aRes; + for (aRes = allRes.begin(); aRes != allRes.end(); aRes++) { + aSelectedPrs.append(std::shared_ptr( + new ModuleBase_ViewerPrs(*aRes, GeomShapePtr(), NULL))); + } + } + } + } + } + aDisplayer->setSelected(aSelectedPrs); + myWorkshop->updateColorScaleVisibility(); + emit selectionChanged(); +} + //************************************************************** void XGUI_SelectionMgr::onViewerSelection() { diff --git a/src/XGUI/XGUI_SelectionMgr.h b/src/XGUI/XGUI_SelectionMgr.h index 6765efe05..db1f31f7e 100644 --- a/src/XGUI/XGUI_SelectionMgr.h +++ b/src/XGUI/XGUI_SelectionMgr.h @@ -94,9 +94,12 @@ signals: void selectionChanged(); public slots: - /// Reaction on selectio0n in Object browser + /// Reaction on selection in Object browser void onObjectBrowserSelection(); + /// Reaction on selection in Constraints Browser + void onSketchConstraintsBrowserSelection(); + /// Reaction on selectio0n in Viewer void onViewerSelection(); diff --git a/src/XGUI/XGUI_SketchConstraintsBrowser.cpp b/src/XGUI/XGUI_SketchConstraintsBrowser.cpp new file mode 100644 index 000000000..6a7d4f4ec --- /dev/null +++ b/src/XGUI/XGUI_SketchConstraintsBrowser.cpp @@ -0,0 +1,755 @@ +// Copyright (C) 2014-2022 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "XGUI_SketchConstraintsBrowser.h" +#include "XGUI_Tools.h" +#include "XGUI_DataModel.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#ifdef DEBUG_INDXES +#include +#endif + + +#ifdef WIN32 +# define FSEP "\\" +#else +# define FSEP "/" +#endif + +// Type of columns +enum ColumnType { + Col_Icon, + Col_Constraint, + Col_Primitive, + Col_Value +}; + +namespace +{ + QModelIndex GetIndex(QModelIndex theChildIndex) + { + auto aParent = theChildIndex.parent(); + if (aParent.isValid()) + return aParent.model()->index(aParent.row(), 1); + else + return QModelIndex(); + } + + // Retrurn name for constraint attribute + QString GetName(const AttributePtr& theAttribute) + { + QString aName; + + if (theAttribute->attributeType() != ModelAPI_AttributeRefAttr::typeId()) + return aName; + + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); + + auto anObj = aRefAttr->object(); + auto anAttr = aRefAttr->attr(); + if (anAttr) + { + FeaturePtr anAttrA = ModelAPI_Feature::feature(anAttr->owner()); + aName += QString::fromStdWString(anAttrA->name()); + aName += "/"; + aName += QString::fromStdString(anAttr->id()); + } + else if (anObj) + { + FeaturePtr anAttrA = ModelAPI_Feature::feature(anObj); + aName += QString::fromStdWString(anAttrA->name()); + } + + return aName; + } + + std::pair FromSketchKindToName(const std::string& theKind) + { + const std::string& aType = theKind; + if (aType == "SketchConstraintCoincidence" || + aType == "SketchConstraintCoincidenceInternal") + return { "Coincidence", "coincedence.png" }; + else if (aType == "SketchConstraintRigid") + return { "Fixed", "fixed.png" }; + else if (aType == "SketchConstraintHorizontal") + return { "Horizontal", "horisontal.png" }; + else if (aType == "SketchConstraintVertical") + return { "Vertical", "vertical.png" }; + else if (aType == "SketchConstraintAngle") + return { "Angle", "angle_constr.png" }; + else if (aType == "SketchConstraintDistance") + return { "Distance", "distance.png" }; + else if (aType == "SketchConstraintDistanceHorizontal") + return { "Horizontal distance", "distance_h.png" }; + else if (aType == "SketchConstraintDistanceVertical") + return { "Vertical distance", "distance_v.png" }; + else if (aType == "SketchConstraintEqual") + return { "Equal", "equal.png" }; + else if (aType == "SketchConstraintLength") + return { "Length", "length.png" }; + else if (aType == "SketchConstraintMiddle") + return { "Middle point", "middlepoint.png" }; + else if (aType == "SketchConstraintMirror") + return { "Mirror objects", "mirror.png" }; + else if (aType == "SketchConstraintParallel") + return { "Parallel", "parallel.png" }; + else if (aType == "SketchConstraintPerpendicular") + return { "Perpendicular", "perpendicular.png" }; + else if (aType == "SketchConstraintRadius") + return { "Radius", "radius_constr.png" }; + else if (aType == "SketchConstraintCollinear") + return { "Collinear", "collinear.png" }; + else if (aType == "SketchConstraintTangent") + return { "Tangent", "tangent.png" }; + return { "", "" }; + } + + std::string GetIconPath(const std::string& theKind) + { + std::string aFile; + char* anEnv = getenv("SHAPER_ROOT_DIR"); + if (anEnv) { + aFile = std::string(anEnv) + + FSEP + "share" + FSEP + "salome" + FSEP + "resources" + FSEP + "shaper" + FSEP + "icons" + FSEP + "Sketch"; + } + else { + anEnv = getenv("CADBUILDER_ROOT_DIR"); + if (anEnv) + aFile = std::string(anEnv) + FSEP + "plugins" + FSEP + "icons" + FSEP + "Sketch"; + } + + aFile += FSEP; + aFile += FromSketchKindToName(theKind).second; + return aFile; + } +} + +/*! + * \ingroup GUI + * ItemDelegate object in order to redefine items behavior + */ +class XGUI_ConstraintsItemDelegate : public QStyledItemDelegate +{ +public: + /// Constructor + /// \param thaParent a parent + XGUI_ConstraintsItemDelegate(QObject* thaParent) : + QStyledItemDelegate(thaParent) {} + + /// Redefinition of virtual method + /// \param parent a parent widget + /// \param option the item options + /// \param index the current index + virtual QWidget* createEditor(QWidget* parent, + const QStyleOptionViewItem& option, + const QModelIndex& index) const; + + /// Returns True if the given index is editable item + /// \param theIndex an item index + bool isEditable(const QModelIndex& theIndex) const; + + // Return current state for TreeItem + bool GetIsActive(const QModelIndex& index) const; + + // Modify state item + void SetIsActive(QModelIndex& theIndex, bool theIsActive); + + /// Returns currently editing index + QModelIndex editIndex() const { return myEditingIdx; } + + /// Redefinition of virtual method + /// \param painter a painter object + /// \param option the item options + /// \param index the current index + virtual void paint(QPainter* painter, + const QStyleOptionViewItem& option, + const QModelIndex& index) const; + +protected: + /// Redefinition of virtual method + /// \param option the item options + /// \param index the current index + virtual void initStyleOption(QStyleOptionViewItem* option, + const QModelIndex& index) const; + +private: + mutable QModelIndex myEditingIdx; +}; + +// Implement + +bool XGUI_ConstraintsItemDelegate::GetIsActive(const QModelIndex& index) const +{ + if (!index.parent().isValid()) + return true; + + auto aModel = index.model(); + auto anIndexForCheck = aModel->index(index.row(), 1); + bool myIsActive = index.parent().child(index.row(), 1).data(Qt::UserRole + 1).toBool(); + return myIsActive; +} + +void XGUI_ConstraintsItemDelegate::initStyleOption(QStyleOptionViewItem* option, const QModelIndex& index) const +{ + if (index.parent().isValid()) + { + bool myIsActive = GetIsActive(index); + option->palette.setBrush(QPalette::ColorRole::Text, myIsActive ? Qt::black : Qt::darkGray); + } + + QStyledItemDelegate::initStyleOption(option, index); +} + +void XGUI_ConstraintsItemDelegate::paint(QPainter* painter, + const QStyleOptionViewItem& option, + const QModelIndex& index) const +{ + QBrush aBrush = painter->brush(); + QPen aPen = painter->pen(); + + Qt::GlobalColor aColor = index.parent().isValid() ? Qt::white : Qt::lightGray; + painter->setBrush(aColor); + painter->setPen(aColor); + + painter->drawRect(option.rect); + painter->setPen(aPen); + + QStyledItemDelegate::paint(painter, option, index); + painter->setBrush(aBrush); +} + +void XGUI_ConstraintsItemDelegate::SetIsActive(QModelIndex& theIndex, bool theIsActive) +{ + bool aBool = theIndex.model()->data(theIndex, Qt::UserRole + 1).toBool(); + theIndex.model()->data(theIndex, Qt::UserRole + 1).setValue(!aBool); +} + +QWidget* XGUI_ConstraintsItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const +{ + myEditingIdx = index; + return QStyledItemDelegate::createEditor(parent, option, index); +} + +bool XGUI_ConstraintsItemDelegate::isEditable(const QModelIndex& theIndex) const +{ + QModelIndex aParent = theIndex.parent(); + if (aParent.isValid() && !theIndex.data(0).isNull() && theIndex.column() == 3) + return true; + + return false; +} + +void XGUI_ConstraintsViewTree::closeEditor(QWidget* theEditor, + QAbstractItemDelegate::EndEditHint theHint) +{ + if (theHint == QAbstractItemDelegate::EditNextItem) { + QModelIndex aCurrent = currentIndex(); + QModelIndex aParent = model()->index(0, 0); + int aNbRows = model()->rowCount(aParent); + QModelIndex aIdx; + if (aCurrent.column() == 3) { + QTreeWidget::closeEditor(theEditor, theHint); + return; + } + if (aIdx.isValid()) { + QTreeWidget::closeEditor(theEditor, QAbstractItemDelegate::NoHint); + setCurrentIndex(aIdx); + edit(aIdx); + return; + } + } + QTreeWidget::closeEditor(theEditor, theHint); +} + +//******************************************************************** +XGUI_SketchConstraintsBrowser::XGUI_SketchConstraintsBrowser(QWidget* theParent, XGUI_Workshop* theWorkshop) + : QWidget(theParent), myWorkshop(theWorkshop) +{ + // Attempt create Tree View + myViewTree = new XGUI_ConstraintsViewTree(this); + myViewTree->setColumnCount(4); + QStringList aHeaders; + aHeaders << "" << tr("Constraint") << tr("Primitives") + << tr("Parameter"); + + myViewTree->setHeaderLabels(aHeaders); + myViewTree->setColumnWidth(Col_Icon, 40); + myViewTree->setColumnWidth(Col_Constraint, 160); + myViewTree->setColumnWidth(Col_Primitive, 140); + myViewTree->setColumnWidth(Col_Value, 40); + + myViewTree->setEditTriggers(QAbstractItemView::NoEditTriggers); + myViewTree->setSelectionBehavior(QAbstractItemView::SelectRows); + myViewTree->setSelectionMode(QAbstractItemView::ExtendedSelection); + + connect(myViewTree, SIGNAL(doubleClicked(const QModelIndex&)), + SLOT(onDoubleClick(const QModelIndex&))); + connect(myViewTree, SIGNAL(itemSelectionChanged()), SLOT(onSelectionChanged())); + + myDelegate = new XGUI_ConstraintsItemDelegate(myViewTree); + + myViewTree->setItemDelegate(myDelegate); + + QPalette aTreePalet = myViewTree->palette(); + QColor aTreeBack = aTreePalet.color(QPalette::Base); + + QPalette aPalet; + aPalet.setColor(QPalette::Base, aTreeBack); + aPalet.setColor(QPalette::Window, aTreeBack); + myViewTree->setPalette(aTreePalet); + + connect(myViewTree, SIGNAL(contextMenuRequested(QContextMenuEvent*)), this, + SLOT(onContextMenuRequested(QContextMenuEvent*))); + + myExtInfo = new QCheckBox(tr("Extended Information")); + myExtInfo->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + myExtInfo->setChecked(true); + + // Connect for show/hide extended information + connect(myExtInfo, SIGNAL(toggled(bool)), this, SLOT(SelectStateChanged(bool))); + ModuleBase_Tools::adjustMargins(myExtInfo); + + myLayout = new QVBoxLayout(this); + ModuleBase_Tools::zeroMargins(myLayout); + myLayout->setSpacing(0); + + myLayout->addWidget(myExtInfo); + myLayout->addWidget(myViewTree); + + Events_Loop* aLoop = Events_Loop::loop(); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); +} + +XGUI_SketchConstraintsBrowser::~XGUI_SketchConstraintsBrowser() +{ + // For avoid crashes after reopen sketch + Events_Loop* aLoop = Events_Loop::loop(); + aLoop->removeListener(this); +} + +void XGUI_SketchConstraintsBrowser::SelectStateChanged(bool /*theState*/) +{ + // Add process for show columns in edit mode + bool isShowExtInfo = !myExtInfo->isChecked(); + myViewTree->setColumnHidden(Col_Primitive, isShowExtInfo); + myViewTree->setColumnHidden(Col_Value, isShowExtInfo); +} + +// bad first param! Make more easy +bool XGUI_SketchConstraintsBrowser::UpdateTree(const std::vector>>& theList, bool isAddToExist) +{ + if (!isAddToExist) + { + myViewTree->clear(); + myConstrs.clear(); + } + + // Prepare all groups of constraints + for (const auto& anElemConstr : theList) + { + myConstrs[FromSketchKindToName(anElemConstr.first->getKind()).first].push_back({ anElemConstr.first, anElemConstr.second }); + } + + int aRow = 0; + for (const auto& line : myConstrs) + { + //Get icon for group + std::string aFile = GetIconPath(line.second.front().Feature->getKind()); + + if (line.second[0].Attributes.size() == 0) + continue; + + QTreeWidgetItem* anElem = new QTreeWidgetItem(myViewTree); + anElem->setFlags(Qt::ItemIsEnabled); + anElem->setText(Col_Constraint, QString::fromStdString(line.first)); + anElem->setIcon(Col_Icon, QIcon(QString::fromStdString(aFile))); + anElem->setExpanded(true); + auto aStart = line.second.begin(); + for (; aStart != line.second.end(); ++aStart) + { + FeatStruct aFeatStruct; + // + for (const auto& anElemConstr : theList) + { + if (anElemConstr.first == (*aStart).Feature) + { + aFeatStruct.Feature = anElemConstr.first; + aFeatStruct.Attributes = anElemConstr.second; + ++aRow; + break; + } + } + // + QTreeWidgetItem* aSubElem = new QTreeWidgetItem(anElem); + aSubElem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled); + aSubElem->setText(Col_Constraint, QString::fromStdWString((*aStart).Feature->name())); + aSubElem->setData(Col_Constraint, Qt::UserRole + 1, (*aStart).Feature->boolean("ConstraintState")->value()); // Store state of constraints true - activated, false - supressed + + QString aPrimitives; + aPrimitives = GetName(aFeatStruct.Attributes[0]); + if (aFeatStruct.Attributes.size() == 2) + { + aPrimitives += "\n"; + aPrimitives += GetName(aFeatStruct.Attributes[1]); + } + + aSubElem->setText(Col_Primitive, aPrimitives); + if ((*aStart).Feature->real("ConstraintValue")) + { + if ((*aStart).Feature->real("AngleValue")) + aSubElem->setData(Col_Value, Qt::EditRole, (*aStart).Feature->real("AngleValue")->value()); + else if ((*aStart).Feature->real("DistanceValue")) + aSubElem->setData(Col_Value, Qt::EditRole, (*aStart).Feature->real("DistanceValue")->value()); + else + aSubElem->setData(Col_Value, Qt::EditRole, (*aStart).Feature->real("ConstraintValue")->value()); + } + anElem->addChild(aSubElem); + } + + myViewTree->addTopLevelItem(anElem); + } + return true; +} + +//****************************************************** +void XGUI_SketchConstraintsBrowser::processEvent(const std::shared_ptr& theMessage) +{ + if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED) + || theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED)) + { + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); + std::set aObjects = aUpdMsg->objects(); + + foreach(ObjectPtr anObjectC, aObjects) + { + auto aCreatedFeature = ModelAPI_Feature::feature(anObjectC); + if (aCreatedFeature && aCreatedFeature->getKind() == "Sketch") + { + // It's for update constraints after creating or updating + emit deleteCosnstraints(); + break; + } + } + } +} + +//*************************************************** +void XGUI_SketchConstraintsBrowser::initialize(ModuleBase_ITreeNode* theRoot) +{ + QItemSelectionModel* aSelMod = myViewTree->selectionModel(); + connect(aSelMod, SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), + this, SLOT(onSelectionChanged(const QItemSelection&, const QItemSelection&))); +} + +//*************************************************** +void XGUI_SketchConstraintsBrowser::onContextMenuRequested(QContextMenuEvent* theEvent) +{ + QModelIndexList aIndexes; + QObjectPtrList aSelectedData = selectedObjects(&aIndexes); + bool toEnable = true; + + foreach(QAction* aCmd, actions()) { + aCmd->setEnabled(toEnable); + } + emit contextMenuRequested(theEvent); +} + +//*************************************************** +void XGUI_SketchConstraintsBrowser::onEditItem() +{ + // Create buttons for edit mode - Move to separat fucntion + myButtons = new QHBoxLayout(this); + QPushButton* anApplyBut = + new QPushButton(QIcon(":pictures/plane_view.png"), tr("Apply")); + connect(anApplyBut, SIGNAL(clicked(bool)), this, SLOT(onCloseEditor())); + QPushButton* aCloseBut = + new QPushButton(QIcon(":pictures/plane_view.png"), tr("Cancel")); + connect(aCloseBut, SIGNAL(clicked(bool)), this, SLOT(onCloseEditor())); + myButtons->addWidget(anApplyBut); + myButtons->addWidget(aCloseBut); + myLayout->addLayout(myButtons); + + myLastState = myExtInfo->isChecked(); + myExtInfo->setChecked(true); + + QObjectPtrList aSelectedData = selectedObjects(); + if (aSelectedData.size() > 0) { + ObjectPtr anObject = aSelectedData.first(); + if (anObject.get()) { // Selection happens in TreeView + // check whether the object can be renamed. There should not be parts which are not loaded + std::set aFeatures; + aFeatures.insert(ModelAPI_Feature::feature(anObject)); + if (!XGUI_Tools::canRemoveOrRename((QWidget*)parent(), aFeatures)) + return; + + // Find index which corresponds the feature + QModelIndex aIndex; + foreach(QModelIndex aIdx, selectedIndexes()) { + if (aIdx.column() == Col_Value) { + aIndex = aIdx; + if (aIndex.isValid()) { + myViewTree->setCurrentIndex(aIndex); + auto aData = aIndex.data(0); + if (!aData.isNull()) + myViewTree->openPersistentEditor(myViewTree->currentItem(), Col_Value); + } + } + } + } + } + else + { + QTreeWidgetItemIterator anIter(myViewTree); + while (*anIter) { + auto aData = (*anIter)->data(Col_Value, 0); + if (!aData.isNull()) + myViewTree->openPersistentEditor((*anIter), Col_Value); + ++anIter; + } + } +} + +void XGUI_SketchConstraintsBrowser::onDeactivateItems() +{ + bool isActivate = true; + std::vector aFeaturesMod; + // This Check need on request COntext Menu step! + foreach(QModelIndex aIdx, selectedIndexes()) + { + if (aIdx.isValid() && aIdx.column() == Col_Constraint) { + auto aBool = aIdx.data(Qt::UserRole + 1).toBool(); + if (aBool) + { + isActivate = false; + break; + } + } + } + + QObjectPtrList aSelectedData = selectedObjects(); + if (aSelectedData.size() > 0) { + ObjectPtr anObject = aSelectedData.first(); + if (anObject.get()) { // Selection happens in TreeView + // check whether the object can be renamed. There should not be parts which are not loaded + std::set aFeatures; + aFeatures.insert(ModelAPI_Feature::feature(anObject)); + if (!XGUI_Tools::canRemoveOrRename((QWidget*)parent(), aFeatures)) + return; + + // Find index which corresponds the feature + foreach(QModelIndex aIdx, selectedIndexes()) { + auto aParent = GetIndex(aIdx); + if (aParent.isValid() && aIdx.isValid() && aIdx.column() == Col_Constraint) { + myViewTree->setCurrentIndex(aIdx); + myViewTree->currentItem()->setData(Col_Constraint, Qt::UserRole + 1, isActivate); + + auto aFeat = myConstrs[aParent.data().toString().toStdString()].at(aIdx.row()).Feature; + aFeaturesMod.push_back(aFeat); + } + } + } + } + + emit deactivate(isActivate, aFeaturesMod); +} + +void XGUI_SketchConstraintsBrowser::onCloseEditor() +{ + // Close editor + QTreeWidgetItemIterator anIter(myViewTree); + while (*anIter) { + myViewTree->closePersistentEditor((*anIter), Col_Value); + ++anIter; + } + myExtInfo->setChecked(myLastState); + + // Send signals for apply uopdates + emit editValues(); + + myButtons->takeAt(1)->widget()->deleteLater(); + myButtons->takeAt(0)->widget()->deleteLater(); + + myButtons->deleteLater(); +} + +void XGUI_SketchConstraintsBrowser::onCloseEditor(QWidget* theEditor, QAbstractItemDelegate::EndEditHint theHint) +{ +} + +//*************************************************** +void XGUI_SketchConstraintsBrowser::setObjectsSelected(const QObjectPtrList& theObjects) +{ + QItemSelectionModel* aSelectModel = myViewTree->selectionModel(); + QModelIndexList aIndexes = aSelectModel->selectedIndexes(); + if (theObjects.size() == 0) { + bool aIsBlock = aSelectModel->blockSignals(true); + aSelectModel->clear(); + aSelectModel->blockSignals(aIsBlock); + foreach(QModelIndex aIdx, aIndexes) { + myViewTree->update(aIdx); + } + return; + } +} + +//*************************************************** +void XGUI_SketchConstraintsBrowser::onSelectionChanged(const QItemSelection& theSelected, + const QItemSelection& theDeselected) +{ + onSelectionChanged(); +} + +//*************************************************** +void XGUI_SketchConstraintsBrowser::onSelectionChanged() +{ + emit selectionChanged(); +} + +//*************************************************** +QObjectPtrList XGUI_SketchConstraintsBrowser::selectedObjects(QModelIndexList* theIndexes) const +{ + QObjectPtrList aList; + QModelIndexList aIndexes = selectedIndexes(); + + foreach(QModelIndex aIdx, aIndexes) { + if (aIdx.column() == Col_Constraint) { + QModelIndex aParentData = GetIndex(aIdx); + if (!aParentData.isValid()) + continue; + + std::string aData = aParentData.data().toString().toStdString(); + ObjectPtr aObject = myConstrs.at(aData).at(aIdx.row()).Feature; + + auto anAttrs = myConstrs.at(aParentData.data().toString().toStdString()).at(aIdx.row()).Attributes; + if (aObject) { + if (!aList.contains(aObject)) + { + aList.append(aObject); + + // Add related primitives to list + for (int anIndex = 0; anIndex < anAttrs.size(); ++anIndex) + { + if (anAttrs[anIndex]->attributeType() == ModelAPI_AttributeRefAttr::typeId()) + { + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(anAttrs[anIndex]); + if (!aRefAttr->attr()) + { + auto aFObj = aRefAttr->object(); + + if (!aList.contains(aFObj)) + { + aList.append(aFObj); + } + } + else + { + aList.append(aRefAttr->attr()->owner()); + } + } + } + + if (theIndexes) + theIndexes->append(aIdx); + } + } + } + } + return aList; +} + +//*************************************************** +QObjectPtrList XGUI_SketchConstraintsBrowser::selectedConstraints(QModelIndexList* theIndexes) const +{ + QObjectPtrList aList; + QModelIndexList aIndexes = selectedIndexes(); + + foreach(QModelIndex aIdx, aIndexes) { + if (aIdx.column() == Col_Constraint) { + QModelIndex aParentData = GetIndex(aIdx); + if (!aParentData.isValid()) + continue; + + std::string aData = aParentData.data().toString().toStdString(); + ObjectPtr aObject = myConstrs.at(aData).at(aIdx.row()).Feature; + if (aObject) { + if (!aList.contains(aObject)) + { + aList.append(aObject); + + if (theIndexes) + theIndexes->append(aIdx); + } + } + } + } + return aList; +} + +//*************************************************** +void XGUI_SketchConstraintsBrowser::onDoubleClick(const QModelIndex& theIndex) +{ + if (myDelegate->isEditable(theIndex)) { + myViewTree->setCurrentIndex(theIndex); + myViewTree->openPersistentEditor(myViewTree->currentItem(), Col_Value); + // Create buttons apply/Close! + onEditItem(); + } +} + +void XGUI_SketchConstraintsBrowser::resizeEvent(QResizeEvent* theEvent) +{ + QWidget::resizeEvent(theEvent); + emit sizeChanged(); +} diff --git a/src/XGUI/XGUI_SketchConstraintsBrowser.h b/src/XGUI/XGUI_SketchConstraintsBrowser.h new file mode 100644 index 000000000..01b794699 --- /dev/null +++ b/src/XGUI/XGUI_SketchConstraintsBrowser.h @@ -0,0 +1,204 @@ +// Copyright (C) 2014-2022 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef XGUI_SketchConstraintsBrowser_H +#define XGUI_SketchConstraintsBrowser_H + +#include "XGUI.h" +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class ModuleBase_IDocumentDataModel; +class XGUI_DataModel; +class Config_DataModelReader; +class XGUI_Workshop; +class XGUI_ConstraintsItemDelegate; +class ModuleBase_ITreeNode; + +//#define DEBUG_INDXES + +struct FeatStruct +{ + FeaturePtr Feature; + std::vector Attributes; +}; + + +class XGUI_EXPORT XGUI_ConstraintsViewTree : public QTreeWidget +{ + Q_OBJECT +public: + /// Constructor + /// \param theParent a parent widget + XGUI_ConstraintsViewTree(QWidget* theParent = 0) : QTreeWidget(theParent) {} + + /// Returns current data model + XGUI_DataModel* dataModel() const + { + return static_cast(model()); + } + +signals: + //! Emited on context menu request + void contextMenuRequested(QContextMenuEvent* theEvent); + +protected slots: + /// Redefinition of virtual method + virtual void contextMenuEvent(QContextMenuEvent* theEvent) + { + emit contextMenuRequested(theEvent); + } + + void closeEditor(QWidget* theEditor, QAbstractItemDelegate::EndEditHint theHint); + +}; + +/**\class XGUI_SketchConstraintsBrowser + * \ingroup GUI + * \brief Object browser window object. Represents data tree of current data structure + */ +class XGUI_EXPORT XGUI_SketchConstraintsBrowser : public QWidget, public Events_Listener +{ +Q_OBJECT + public: + + // Temporary for more simple modification + XGUI_ConstraintsViewTree* getViewTree() { return myViewTree; } + + // Make more good option + bool UpdateTree(const std::vector>>& theList, bool isAddToExist = false); + + /// Constructor + /// \param theParent a parent widget + XGUI_SketchConstraintsBrowser(QWidget* theParent, XGUI_Workshop* theWorkshop); + virtual ~XGUI_SketchConstraintsBrowser(); + + /// Event Listener method + /// \param theMessage an event message + virtual void processEvent(const std::shared_ptr& theMessage); + + //! Returns list of currently selected constraints and geometries + //! \param theIndexes - output list of corresponded indexes (can be NULL) + QObjectPtrList selectedObjects(QModelIndexList* theIndexes = 0) const; + + //! Returns list of currently selected constraints in browser + //! \param theIndexes - output list of corresponded indexes (can be NULL) + QObjectPtrList selectedConstraints(QModelIndexList* theIndexes = 0) const; + + /// Set selected list of objects + /// \param theObjects list of objects to select + void setObjectsSelected(const QObjectPtrList& theObjects); + + //! Returns currently selected indexes + QModelIndexList selectedIndexes() const + { + if (myViewTree->selectionModel()) + return myViewTree->selectionModel()->selectedIndexes(); + else + return QModelIndexList(); + } + + /// Initialize the Object browser + void initialize(ModuleBase_ITreeNode* theRoot); + + /// Returns current workshop + XGUI_Workshop* workshop() const { return myWorkshop; } + + void onSelectionChanged(); + +public slots: + //! Called on Edit command request + void onEditItem(); + + //! Change state of constraints + void onDeactivateItems(); + +private slots: + void SelectStateChanged(bool theState); + +signals: + //! Emited when selection is changed + void selectionChanged(); + + //! Emited on context menu request + void contextMenuRequested(QContextMenuEvent* theEvent); + + //! Segnal is emitted when user cliks by mouse in header label of object browser + void headerMouseDblClicked(const QModelIndex&); + + //! An signal emitted on resize of the Object Browser + void sizeChanged(); + + void editValues(); + void deleteCosnstraints(); + void deactivate(bool, std::vector); + +protected: + //! redefinition of a virtual method + void resizeEvent(QResizeEvent* theEvent); + + private slots: + /// Show context menu + /// \param theEvent a context menu event + void onContextMenuRequested(QContextMenuEvent* theEvent); + + //! Called when selection in Data Tree is changed + void onSelectionChanged(const QItemSelection& theSelected, const QItemSelection& theDeselected); + + /// Slot for reaction on double click in the table (start editing) +/// \param theIndex the clicked index + void onDoubleClick(const QModelIndex& theIndex); + + /// Slot for reaction on end of cell editing + /// \param theEditor the editor widget + /// \param theHint end of edit type + void onCloseEditor(QWidget* theEditor, QAbstractItemDelegate::EndEditHint theHint); + + void onCloseEditor(); + + private: + XGUI_Workshop* myWorkshop; + + XGUI_ConstraintsViewTree* myViewTree; + QVBoxLayout* myLayout; + QHBoxLayout* myButtons; + + bool myLastState; //Store state of Extended Information CheckBox (need for correct reset after edit constraints) + QCheckBox* myExtInfo; + XGUI_ConstraintsItemDelegate* myDelegate; + + std::map> myConstrs; // string - name of group, vector - constraints from group +}; + +#endif diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 6ae78b95d..b32ccd8fd 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -51,6 +51,8 @@ #include #include +#include + #ifdef HAVE_SALOME #include #include @@ -207,6 +209,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) : QObject(), myModule(NULL), myObjectBrowser(0), + mySkConstBrwsr(0), myPropertyPanel(0), myFacesPanel(0), myDisplayer(0), @@ -1624,6 +1627,29 @@ QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent) return aObjDock; } +//****************************************************** +QDockWidget* XGUI_Workshop::createConstraintsBrowser(QWidget* theParent) +{ + QDockWidget* aSkDock = new QDockWidget(theParent); + aSkDock->setAllowedAreas(Qt::LeftDockWidgetArea | + Qt::RightDockWidgetArea); + aSkDock->setWindowTitle(tr("Sketch Constraints Browser")); + aSkDock->setStyleSheet( + "::title { position: relative; padding-left: 5px; text-align: left center }"); + + mySkConstBrwsr = new XGUI_SketchConstraintsBrowser(aSkDock, this); + mySkConstBrwsr->initialize(myModule->rootNode()); + //myModule->customizeObjectBrowser(mySkConstBrwsr); + aSkDock->setWidget(mySkConstBrwsr); + aSkDock->setObjectName("Constraints browser"); + + connect(mySkConstBrwsr, SIGNAL(sizeChanged()), SLOT(onDockSizeChanged())); + + mySelector->connectViewers(); + myContextMenuMgr->connectConstraintsBrowser(); + return aSkDock; +} + //****************************************************** /* * Creates dock widgets, places them in corresponding area @@ -1769,6 +1795,20 @@ void XGUI_Workshop::hideObjectBrowser() myObjectBrowser->parentWidget()->hide(); } +//****************************************************** +void XGUI_Workshop::showConstraintsBrowser() +{ + if (!isSalomeMode()) + mySkConstBrwsr->parentWidget()->show(); +} + +//****************************************************** +void XGUI_Workshop::hideConstraintsBrowser() +{ + if (!isSalomeMode()) + mySkConstBrwsr->parentWidget()->hide(); +} + //****************************************************** void XGUI_Workshop::salomeViewerSelectionChanged() { @@ -1789,6 +1829,10 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) deleteObjects(); else if (theId == "CLEAN_HISTORY_CMD") cleanHistory(); + else if (theId == "EDIT_CONSTR_CMD") + editConstraints(); + else if (theId == "DEACTIVATE_CONSTRAINT_CMD") + deactivateCosntraint(); else if (theId == "MOVE_CMD" || theId == "MOVE_SPLIT_CMD") moveObjects(theId == "MOVE_SPLIT_CMD"); else if (theId == "RECOVER_CMD") @@ -2121,6 +2165,23 @@ void XGUI_Workshop::deleteObjects() myDisplayer->updateViewer(); } +void XGUI_Workshop::deactivateCosntraint() +{ + QObjectPtrList anObjects = constraintsBrowser()->selectedObjects(); + + constraintsBrowser()->setObjectsSelected(anObjects); + constraintsBrowser()->onDeactivateItems(); +} + +void XGUI_Workshop::editConstraints() +{ + QObjectPtrList anObjects = constraintsBrowser()->selectedObjects(); + + // restore selection in case if dialog box was shown + constraintsBrowser()->setObjectsSelected(anObjects); + constraintsBrowser()->onEditItem(); +} + //************************************************************** void addRefsToFeature(const FeaturePtr& theFeature, const std::map >& theMainList, diff --git a/src/XGUI/XGUI_Workshop.h b/src/XGUI/XGUI_Workshop.h index b6e25c670..7bc4ecc69 100644 --- a/src/XGUI/XGUI_Workshop.h +++ b/src/XGUI/XGUI_Workshop.h @@ -65,6 +65,7 @@ class XGUI_SelectionMgr; class XGUI_ViewerProxy; class XGUI_WorkshopListener; class XGUI_InspectionPanel; +class XGUI_SketchConstraintsBrowser; class ModuleBase_IModule; class ModuleBase_IViewer; @@ -88,6 +89,12 @@ Q_OBJECT XGUI_Workshop(XGUI_SalomeConnector* theConnector = 0); virtual ~XGUI_Workshop(); + /// Create Sketch constraints browser widget + /// \param theParent a parent of widget + QDockWidget* createConstraintsBrowser(QWidget* theParent); + + void removeConstrBrowser() { mySkConstBrwsr = NULL; } + /// Starting of the application void startApplication(); @@ -153,6 +160,9 @@ Q_OBJECT /// Returns Object browser XGUI_ObjectsBrowser* objectBrowser() const { return myObjectBrowser; } + /// Returns Sketch constraints browser + XGUI_SketchConstraintsBrowser* constraintsBrowser() const { return mySkConstBrwsr; } + /// This method is called by Salome module when selection is changed void salomeViewerSelectionChanged(); @@ -176,6 +186,11 @@ Q_OBJECT /// Delete features void deleteObjects(); + /// Eit constraints + void editConstraints(); + + void deactivateCosntraint(); + /// Searches for selected features unused in other (not selected) features. If one or several /// selected features are found, a warning message proposes to delete them. It contains /// the list of features to be deleted. @@ -412,6 +427,12 @@ signals: /// Hide object Browser void hideObjectBrowser(); + /// Show Sketch constraints Browser + void showConstraintsBrowser(); + + /// Hide Sketch constraints Browser + void hideConstraintsBrowser(); + /// Close document void closeDocument(); @@ -569,6 +590,7 @@ private: AppElements_MainWindow* myMainWindow; ///< desktop window #endif + XGUI_SketchConstraintsBrowser* mySkConstBrwsr; // ~~!!!!~~ ModuleBase_IModule* myModule; ///< current module XGUI_ErrorMgr* myErrorMgr; ///< updator of error message XGUI_ObjectsBrowser* myObjectBrowser; ///< data tree widget diff --git a/src/XGUI/XGUI_msg_fr.ts b/src/XGUI/XGUI_msg_fr.ts index 9d89050d2..db4f19255 100644 --- a/src/XGUI/XGUI_msg_fr.ts +++ b/src/XGUI/XGUI_msg_fr.ts @@ -552,6 +552,13 @@ Panneau de propriété + + XGUI_SketchConstraintsBrowser + + Extended Information + Informations étendues + + XGUI_TransparencyWidget