X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_SketcherMgr.cpp;h=a0e1b7efa093573fc58fe96acd3ff8247af2e401;hb=f96597c41d8ae0949c8bb72d54e2d9c2e7f49914;hp=e5118c9b99b8443f9182f4f7c6850afab83a7512;hpb=fbdd4c375d03ccfd66ffd1547097f1453b22aab3;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_SketcherMgr.cpp b/src/PartSet/PartSet_SketcherMgr.cpp index e5118c9b9..a0e1b7efa 100644 --- a/src/PartSet/PartSet_SketcherMgr.cpp +++ b/src/PartSet/PartSet_SketcherMgr.cpp @@ -118,6 +118,8 @@ #include #include +#include + //#define DEBUG_DO_NOT_BY_ENTER //#define DEBUG_SKETCHER_ENTITIES //#define DEBUG_SKETCH_ENTITIES_ON_MOVE @@ -201,6 +203,8 @@ PartSet_SketcherMgr::PartSet_SketcherMgr(PartSet_Module* theModule) registerSelectionFilter(SF_SketchCirclePointFilter, new PartSet_CirclePointFilter(anIWorkshop)); registerSelectionFilter(SF_SketchPlaneFilter, new ModuleBase_ShapeInPlaneFilter()); + + Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_DOF_OBJECTS)); } PartSet_SketcherMgr::~PartSet_SketcherMgr() @@ -220,15 +224,17 @@ void PartSet_SketcherMgr::onEnterViewPort() return; #endif - if (canChangeCursor(getCurrentOperation())) { - QCursor* aCurrentCursor = QApplication::overrideCursor(); - if (!aCurrentCursor || aCurrentCursor->shape() != Qt::CrossCursor) { - QApplication::setOverrideCursor(QCursor(Qt::CrossCursor)); -#ifdef DEBUG_CURSOR - qDebug("onEnterViewPort() : Qt::CrossCursor"); -#endif - } - } + // It is switched off because of + // Task #3067: 5.2.2 Drawing in the sketcher: change the mouse cursor arrow + // if (canChangeCursor(getCurrentOperation())) { + // QCursor* aCurrentCursor = QApplication::overrideCursor(); + // if (!aCurrentCursor || aCurrentCursor->shape() != Qt::CrossCursor) { + // QApplication::setOverrideCursor(QCursor(Qt::CrossCursor)); + //#ifdef DEBUG_CURSOR + // qDebug("onEnterViewPort() : Qt::CrossCursor"); + //#endif + // } + // } if (!isNestedCreateOperation(getCurrentOperation(), activeSketch())) return; @@ -260,12 +266,12 @@ void PartSet_SketcherMgr::onLeaveViewPort() return; #endif - if (canChangeCursor(getCurrentOperation())) { - QApplication::restoreOverrideCursor(); -#ifdef DEBUG_CURSOR - qDebug("onLeaveViewPort() : None"); -#endif - } +// if (canChangeCursor(getCurrentOperation())) { +// QApplication::restoreOverrideCursor(); +//#ifdef DEBUG_CURSOR +// qDebug("onLeaveViewPort() : None"); +//#endif +// } if (!isNestedCreateOperation(getCurrentOperation(), activeSketch())) return; @@ -407,7 +413,6 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE } // Init flyout point for radius rotation FeaturePtr aFeature = myCurrentSelection.begin().key(); - get2dPoint(theWnd, theEvent, myCurrentPoint); if (isSketcher) { if (aCanDrag) { @@ -437,14 +442,33 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE /// Internal edit should not be stored as editing operation as the result will be a /// creation operation, where previous selection should not be used(and will be cleared) myIsEditLaunching = !myModule->sketchReentranceMgr()->isInternalEditActive(); - aFOperation->commit(); + + std::shared_ptr aSPFeature = + std::dynamic_pointer_cast(aFOperation->feature()); + bool isRelaunchEditing = true; + if (aSPFeature->isExternal()) { + foreach(FeaturePtr aF, myCurrentSelection.keys()) { + FeaturePtr aProducerFeature = PartSet_Tools::findRefsToMeFeature(aF, + aSPFeature->getKind()); + if (aProducerFeature == aSPFeature) { + isRelaunchEditing = false; + break; + } + } + } + else + isRelaunchEditing = !myCurrentSelection.contains(aSPFeature); + + if (isRelaunchEditing) + aFOperation->commit(); if (aCanDrag) { myIsDragging = true; myDragDone = false; } myPreviousDrawModeEnabled = aViewer->enableDrawMode(false); - launchEditing(); + if (isRelaunchEditing) + launchEditing(); myIsEditLaunching = aPrevLaunchingState; if (aFeature.get() != NULL) { std::shared_ptr aSPFeature = @@ -466,8 +490,9 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE void PartSet_SketcherMgr::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) { ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); + ModuleBase_IViewer* aViewer = aWorkshop->viewer(); if (myIsDragging) - aWorkshop->viewer()->enableDrawMode(myPreviousDrawModeEnabled); + aViewer->enableDrawMode(myPreviousDrawModeEnabled); bool aWasDragging = myIsDragging; myIsDragging = false; @@ -479,11 +504,10 @@ void PartSet_SketcherMgr::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouse if (!myIsMouseOverViewProcessed) { return; } - ModuleBase_IViewer* aViewer = aWorkshop->viewer(); //if (!aViewer->canDragByMouse()) // return; ModuleBase_OperationFeature* aOp = - dynamic_cast(getCurrentOperation()); + dynamic_cast(getCurrentOperation()); if (aOp) { bool aStartNoDragOperation = !aViewer->canDragByMouse() && aOp->isEditOperation(); if (aStartNoDragOperation || myNoDragMoving) { @@ -883,13 +907,15 @@ void PartSet_SketcherMgr::sketchSelectionModes(const CompositeFeaturePtr& theSke theModes.append(TopAbs_EDGE); } -Handle(AIS_InteractiveObject) PartSet_SketcherMgr::createPresentation(const ResultPtr& theResult) +Handle(AIS_InteractiveObject) PartSet_SketcherMgr::createPresentation(const ObjectPtr& theObj) { Handle(AIS_InteractiveObject) aPrs; - FeaturePtr aFeature = ModelAPI_Feature::feature(theResult); + FeaturePtr aFeature = ModelAPI_Feature::feature(theObj); if (aFeature.get() && aFeature->getKind() == SketchPlugin_Sketch::ID()) { - aPrs = new PartSet_ResultSketchPrs(theResult); + ResultPtr aResult = std::dynamic_pointer_cast(theObj); + if (aResult.get()) + aPrs = new PartSet_ResultSketchPrs(aResult); } return aPrs; } @@ -961,6 +987,8 @@ bool PartSet_SketcherMgr::isEntity(const std::string& theId) (theId == SketchPlugin_Arc::ID()) || (theId == SketchPlugin_Circle::ID()) || (theId == SketchPlugin_Ellipse::ID()) || + (theId == SketchPlugin_Projection::ID()) || + (theId == SketchPlugin_IntersectionPoint::ID()) || (theId == SketchPlugin_EllipticArc::ID()); } @@ -991,6 +1019,9 @@ bool PartSet_SketcherMgr::isDistanceKind(std::string& theKind) void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation) { + static Events_ID EVENT_ATTR = Events_Loop::loop()->eventByName(EVENT_VISUAL_ATTRIBUTES); + static Events_ID EVENT_DISP = Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY); + ModuleBase_OperationFeature* aFOperation = dynamic_cast (getCurrentOperation()); if (!aFOperation) @@ -1063,7 +1094,6 @@ void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation) myModule->overconstraintListener()->setActive(true); // Display sketcher objects QStringList anInfo; - Events_ID EVENT_DISP = Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY); const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); aNumberOfSubs = myCurrentSketch->numberOfSubs(); for (int i = 0; i < aNumberOfSubs; i++) { @@ -1084,6 +1114,7 @@ void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation) aECreator->sendUpdated(aFeature, EVENT_DISP); else aFeature->setDisplayed(true); + aECreator->sendUpdated(aFeature, EVENT_ATTR); } #ifdef DEBUG_SKETCHER_ENTITIES QString anInfoStr = anInfo.join(";\t"); @@ -1100,7 +1131,8 @@ void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation) workshop()->selectionActivate()->updateSelectionFilters(); workshop()->selectionActivate()->updateSelectionModes(); - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); + Events_Loop::loop()->flush(EVENT_DISP); + Events_Loop::loop()->flush(EVENT_ATTR); myExternalPointsMgr = new PartSet_ExternalPointsMgr(myModule->workshop(), myCurrentSketch); @@ -1184,18 +1216,18 @@ void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation) workshop()->viewer()->set2dMode(false); } -void PartSet_SketcherMgr::startNestedSketch(ModuleBase_Operation* theOperation) -{ - if (canChangeCursor(theOperation) && myIsMouseOverWindow) { - QCursor* aCurrentCursor = QApplication::overrideCursor(); - if (!aCurrentCursor || aCurrentCursor->shape() != Qt::CrossCursor) { - QApplication::setOverrideCursor(QCursor(Qt::CrossCursor)); -#ifdef DEBUG_CURSOR - qDebug("startNestedSketch() : Qt::CrossCursor"); -#endif - } - } -} +//void PartSet_SketcherMgr::startNestedSketch(ModuleBase_Operation* theOperation) +//{ +// if (canChangeCursor(theOperation) && myIsMouseOverWindow) { +// QCursor* aCurrentCursor = QApplication::overrideCursor(); +// if (!aCurrentCursor || aCurrentCursor->shape() != Qt::CrossCursor) { +// QApplication::setOverrideCursor(QCursor(Qt::CrossCursor)); +//#ifdef DEBUG_CURSOR +// qDebug("startNestedSketch() : Qt::CrossCursor"); +//#endif +// } +// } +//} void PartSet_SketcherMgr::stopNestedSketch(ModuleBase_Operation* theOperation) { @@ -1203,7 +1235,7 @@ void PartSet_SketcherMgr::stopNestedSketch(ModuleBase_Operation* theOperation) operationMgr()->onValidateOperation(); // when sketch nested operation is stopped the cursor should be restored unconditionally //if (canChangeCursor(theOperation)) { - QApplication::restoreOverrideCursor(); + //QApplication::restoreOverrideCursor(); #ifdef DEBUG_CURSOR qDebug("stopNestedSketch() : None"); #endif @@ -1542,17 +1574,19 @@ const QMap& PartSet_SketcherMgr::sh bool PartSet_SketcherMgr::isObjectOfSketch(const ObjectPtr& theObject) const { - bool isFoundObject = false; - + if (!myCurrentSketch.get()) + return false; FeaturePtr anObjectFeature = ModelAPI_Feature::feature(theObject); if (anObjectFeature.get()) { int aSize = myCurrentSketch->numberOfSubs(); - for (int i = 0; i < aSize && !isFoundObject; i++) { - FeaturePtr aCurrentFeature = myCurrentSketch->subFeature(i); - isFoundObject = myCurrentSketch->subFeature(i) == anObjectFeature; + FeaturePtr aCurrentFeature; + for (int i = 0; i < aSize; i++) { + aCurrentFeature = myCurrentSketch->subFeature(i); + if (myCurrentSketch->subFeature(i) == anObjectFeature) + return true; } } - return isFoundObject; + return false; } void PartSet_SketcherMgr::onPlaneSelected(const std::shared_ptr& thePlane) @@ -1775,26 +1809,26 @@ void PartSet_SketcherMgr::widgetStateChanged(int thePreviousState) } } -void PartSet_SketcherMgr::customizePresentation(const ObjectPtr& theObject) -{ - ModuleBase_OperationFeature* aFOperation = dynamic_cast - (getCurrentOperation()); - if (aFOperation && (PartSet_SketcherMgr::isSketchOperation(aFOperation) || - isNestedSketchOperation(aFOperation))) - SketcherPrs_Tools::sendExpressionShownEvent(myIsConstraintsShown[PartSet_Tools::Expressions]); - - // update entities selection priorities - FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); - if (aFeature.get() && PartSet_SketcherMgr::isEntity(aFeature->getKind())) { - // update priority for feature - updateSelectionPriority(aFeature, aFeature); - // update priority for results of the feature - std::list aResults = aFeature->results(); - std::list::const_iterator anIt = aResults.begin(), aLastIt = aResults.end(); - for (; anIt != aLastIt; anIt++) - updateSelectionPriority(*anIt, aFeature); - } -} +//void PartSet_SketcherMgr::customisePresentation(const ObjectPtr& theObject) +//{ +// ModuleBase_OperationFeature* aFOperation = dynamic_cast +// (getCurrentOperation()); +// if (aFOperation && (PartSet_SketcherMgr::isSketchOperation(aFOperation) || +// isNestedSketchOperation(aFOperation))) +// SketcherPrs_Tools::sendExpressionShownEvent(myIsConstraintsShown[PartSet_Tools::Expressions]); +// +// // update entities selection priorities +// FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); +// if (aFeature.get() && PartSet_SketcherMgr::isEntity(aFeature->getKind())) { +// // update priority for feature +// updateSelectionPriority(aFeature, aFeature); +// // update priority for results of the feature +// std::list aResults = aFeature->results(); +// std::list::const_iterator anIt = aResults.begin(), aLastIt = aResults.end(); +// for (; anIt != aLastIt; anIt++) +// updateSelectionPriority(*anIt, aFeature); +// } +//} ModuleBase_Operation* PartSet_SketcherMgr::getCurrentOperation() const { @@ -1985,6 +2019,9 @@ void PartSet_SketcherMgr::updateBySketchParameters( if (aPrevState != theState) { /// call all sketch features redisplay, the expression state will be corrected in customize /// of distance presentation + SketcherPrs_Tools::ParameterStyle aStyle = myIsConstraintsShown[PartSet_Tools::Expressions] ? + SketcherPrs_Tools::ParameterText : SketcherPrs_Tools::ParameterValue; + SketcherPrs_Tools::setParameterStyle(aStyle); Events_ID anEventId = Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY); PartSet_Tools::sendSubFeaturesEvent(myCurrentSketch, anEventId); } @@ -2114,7 +2151,161 @@ void PartSet_SketcherMgr::onShowPoints(bool toShow) aViewer->update(); } +void PartSet_SketcherMgr::processEvent(const std::shared_ptr& theMessage) +{ + if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOF_OBJECTS)) { + std::shared_ptr anUpdateMsg = + std::dynamic_pointer_cast(theMessage); + std::set aObjects = anUpdateMsg->objects(); + std::set::const_iterator aIt; + QList aPrsList; + for (aIt = aObjects.cbegin(); aIt != aObjects.cend(); aIt++) { + FeaturePtr aFeature = std::dynamic_pointer_cast(*aIt); + if (aFeature.get()) { + std::list aRes = aFeature->results(); + std::list::const_iterator aIt; + for (aIt = aRes.cbegin(); aIt != aRes.cend(); ++aIt) { + ModuleBase_ViewerPrsPtr aPrsPtr(new ModuleBase_ViewerPrs(*aIt)); + aPrsList.append(aPrsPtr); + } + } + } + if (aPrsList.size() > 0) { + myModule->workshop()->setSelected(aPrsList); + } + } +} + +bool isExternal(const ObjectPtr& theObject) +{ + AttributeSelectionPtr aAttr = + theObject->data()->selection(SketchPlugin_SketchEntity::EXTERNAL_ID()); + if (aAttr) + return aAttr->context().get() != NULL && !aAttr->isInvalid(); + return false; +} + +bool isCopy(const ObjectPtr& theObject) +{ + AttributeBooleanPtr anAttr = theObject->data()->boolean(SketchPlugin_SketchEntity::COPY_ID()); + if (anAttr.get()) + return anAttr->value(); + return false; +} + +bool isIncludeToResult(const ObjectPtr& theObject) +{ + AttributeBooleanPtr anAttr; + std::set aRefsToMe = theObject->data()->refsToMe(); + std::set::const_iterator aIt; + for (aIt = aRefsToMe.cbegin(); aIt != aRefsToMe.cend(); ++aIt) { + if ((*aIt)->id() == SketchPlugin_Projection::PROJECTED_FEATURE_ID()) { + FeaturePtr aFeature = std::dynamic_pointer_cast((*aIt)->owner()); + if (aFeature.get()) { + anAttr = aFeature->data()->boolean(SketchPlugin_Projection::INCLUDE_INTO_RESULT()); + if (anAttr.get()) + return anAttr->value(); + } + } + } + return true; +} + +//************************************************************************************** +std::vector PartSet_SketcherMgr::colorOfObject(const ObjectPtr& theObject, + const FeaturePtr& theFeature, bool isConstruction) const +{ + static const QStringList& aConstrIds = constraintsIdList(); + PartSet_OverconstraintListener* aOCListener = myModule->overconstraintListener(); + std::string aKind = theFeature->getKind(); + + if (isDistanceKind(aKind)) { + if (aOCListener->isConflictingObject(theObject)) + return Config_PropManager::color("Visualization", "sketch_overconstraint_color"); + return Config_PropManager::color("Visualization", "sketch_dimension_color"); + } + if (isExternal(theFeature)) + return Config_PropManager::color("Visualization", "sketch_external_color"); + if (isConstruction) + return Config_PropManager::color("Visualization", "sketch_auxiliary_color"); + + if (aOCListener->isFullyConstrained()) { + return Config_PropManager::color("Visualization", "sketch_fully_constrained_color"); + } + else if (aOCListener->isConflictingObject(theObject)) { + return Config_PropManager::color("Visualization", "sketch_overconstraint_color"); + } + return Config_PropManager::color("Visualization", "sketch_entity_color"); +} + +//************************************************************************************** +void PartSet_SketcherMgr::customizeSketchPresentation(const ObjectPtr& theObject, + const AISObjectPtr& thePrs) const +{ + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + + // set color from preferences + std::shared_ptr anAuxiliaryAttr = + aFeature->data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID()); + bool isConstruction = anAuxiliaryAttr.get() != NULL && anAuxiliaryAttr->value(); + + std::vector aColor = colorOfObject(theObject, aFeature, isConstruction); + if (!aColor.empty()) { + // The code below causes redisplay again + if (ModelAPI_Session::get()->isOperation()) { + AttributeIntArrayPtr aColorAttr = theObject->data()->intArray(ModelAPI_Result::COLOR_ID()); + if (aColorAttr.get()) { + aColorAttr->setSize(3, false); + // Set the color attribute in order do not use default colors in the presentation object + for (int i = 0; i < 3; i++) + aColorAttr->setValue(i, aColor[i], false); + } + } + thePrs->setColor(aColor[0], aColor[1], aColor[2]); + } + + int aShapeType = thePrs->getShapeType(); + // a compound is processed like the edge because the + // arc feature uses the compound for presentable AIS + if (aShapeType != 6/*an edge*/ && aShapeType != 7/*a vertex*/ && aShapeType != 0/*compound*/) + return; + + if (isExternal(aFeature)) { + thePrs->setWidth(1); + return; + } + std::string aKind = aFeature->getKind(); + if (isDistanceKind(aKind)) + return; + + if (aShapeType == 6 || aShapeType == 0) { // if this is an edge or a compound + if (isConstruction) { + // Set axilliary line + thePrs->setWidth(SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH_AUXILIARY()); + thePrs->setLineStyle(SketchPlugin_SketchEntity::SKETCH_LINE_STYLE_AUXILIARY()); + } + else { + int aWidth = Config_PropManager::integer("Visualization", "sketch_line_width"); + thePrs->setWidth(aWidth); + thePrs->setLineStyle(SketchPlugin_SketchEntity::SKETCH_LINE_STYLE()); + } + } + else if (aShapeType == 7) { // otherwise this is a vertex + // The width value do not have effect on the point presentation. + // It is defined in order to extend selection area of the object. + thePrs->setWidth(17); + // thePrs->setPointMarker(1, 1.); // Set point as a '+' symbol + } + if (isCopy(aFeature) && !isIncludeToResult(aFeature)) { + double aWidth = thePrs->width(); + thePrs->setWidth(aWidth / 2.5); + } + + double aDeflection = Config_PropManager::real("Visualization", "construction_deflection"); + thePrs->setDeflection(aDeflection); +} +//************************************************************************************* void PartSet_Fitter::fitAll(Handle(V3d_View) theView) { CompositeFeaturePtr aSketch = mySketchMgr->activeSketch();