From 0e677ee4915a09c2204b797121577f7c0e61104f Mon Sep 17 00:00:00 2001 From: vsv Date: Fri, 4 Oct 2019 11:43:01 +0300 Subject: [PATCH] Issue #3039: Add a constraint on a last line of a contour --- src/PartSet/PartSet_SketcherReentrantMgr.cpp | 71 +++++++++++--------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/src/PartSet/PartSet_SketcherReentrantMgr.cpp b/src/PartSet/PartSet_SketcherReentrantMgr.cpp index 5ae478889..d46c5d30d 100644 --- a/src/PartSet/PartSet_SketcherReentrantMgr.cpp +++ b/src/PartSet/PartSet_SketcherReentrantMgr.cpp @@ -177,8 +177,6 @@ bool PartSet_SketcherReentrantMgr::processMouseMoved(ModuleBase_IViewWindow* the workshop()->selector()->clearSelection(); myPreviousFeature = aFOperation->feature(); - if (myIsAutoConstraints) - addConstraints(myPreviousFeature); restartOperation(); myPreviousFeature = FeaturePtr(); @@ -378,8 +376,11 @@ void PartSet_SketcherReentrantMgr::onNoMoreWidgets(const std::string& thePreviou isStarted = startInternalEdit(thePreviousAttributeID); } } - if (!isStarted) + if (!isStarted) { + if (myIsAutoConstraints) + addConstraints(aFOperation->feature()); aFOperation->commit(); + } } } } @@ -503,6 +504,9 @@ bool PartSet_SketcherReentrantMgr::startInternalEdit(const std::string& thePrevi // returning to the neutral point of the Sketcher or start internal edit workshop()->selector()->clearSelection(); + if (myIsAutoConstraints) + addConstraints(aFOperation->feature()); + aFOperation->setEditOperation(true/*, false*/); createInternalFeature(); @@ -839,39 +843,40 @@ void PartSet_SketcherReentrantMgr::onAutoConstraints(bool isOn) void PartSet_SketcherReentrantMgr::addConstraints(const FeaturePtr& theFeature) { + if (theFeature->getKind() != SketchPlugin_Line::ID()) + return; + static GeomDir2dPtr myHorDir(new GeomAPI_Dir2d(1, 0)); static GeomDir2dPtr myVertDir(new GeomAPI_Dir2d(0, 1)); - if (theFeature->getKind() == SketchPlugin_Line::ID()) { - std::shared_ptr aData = theFeature->data(); - std::shared_ptr aPoint1 = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Line::START_ID())); - std::shared_ptr aPoint2 = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Line::END_ID())); - if (aPoint1.get() && aPoint2.get()) { - GeomLine2dPtr aLine(new GeomAPI_Lin2d(aPoint1->pnt(), aPoint2->pnt())); - GeomDir2dPtr aDir = aLine->direction(); - double aHorAngle = fabs(myHorDir->angle(aDir)); - double aVertAngle = fabs(myVertDir->angle(aDir)); - if (aHorAngle > M_PI/2.) - aHorAngle = M_PI - aHorAngle; - if (aVertAngle > M_PI/2.) - aVertAngle = M_PI - aVertAngle; - - double aTolerance = Config_PropManager::real(SKETCH_TAB_NAME, "angular_tolerance"); - CompositeFeaturePtr aSketch = module()->sketchMgr()->activeSketch(); - FeaturePtr aFeature; - if (aHorAngle < aTolerance) - // Add horizontal constraint - aFeature = aSketch->addFeature(SketchPlugin_ConstraintHorizontal::ID()); - else if (aVertAngle < aTolerance) - // Add vertical constraint - aFeature = aSketch->addFeature(SketchPlugin_ConstraintVertical::ID()); - - if (aFeature.get()) { - aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())->setObject( - theFeature->firstResult()); - } + std::shared_ptr aData = theFeature->data(); + std::shared_ptr aPoint1 = std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Line::START_ID())); + std::shared_ptr aPoint2 = std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Line::END_ID())); + if (aPoint1.get() && aPoint2.get()) { + GeomLine2dPtr aLine(new GeomAPI_Lin2d(aPoint1->pnt(), aPoint2->pnt())); + GeomDir2dPtr aDir = aLine->direction(); + double aHorAngle = fabs(myHorDir->angle(aDir)); + double aVertAngle = fabs(myVertDir->angle(aDir)); + if (aHorAngle > M_PI/2.) + aHorAngle = M_PI - aHorAngle; + if (aVertAngle > M_PI/2.) + aVertAngle = M_PI - aVertAngle; + + double aTolerance = Config_PropManager::real(SKETCH_TAB_NAME, "angular_tolerance"); + CompositeFeaturePtr aSketch = module()->sketchMgr()->activeSketch(); + FeaturePtr aFeature; + if (aHorAngle < aTolerance) + // Add horizontal constraint + aFeature = aSketch->addFeature(SketchPlugin_ConstraintHorizontal::ID()); + else if (aVertAngle < aTolerance) + // Add vertical constraint + aFeature = aSketch->addFeature(SketchPlugin_ConstraintVertical::ID()); + + if (aFeature.get()) { + aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())->setObject( + theFeature->firstResult()); } } } -- 2.39.2