From 20bd9212f25253626f2dbc9449f38274da3a12f8 Mon Sep 17 00:00:00 2001 From: nds Date: Wed, 10 May 2017 17:29:21 +0300 Subject: [PATCH] Issue #2149 Split does not highlight the selected edge --- src/PartSet/CMakeLists.txt | 3 - src/PartSet/PartSet_Module.cpp | 7 - src/PartSet/PartSet_SketcherReentrantMgr.cpp | 35 +- .../PartSet_WidgetFeaturePointSelector.cpp | 23 +- .../PartSet_WidgetFeaturePointSelector.h | 7 + .../PartSet_WidgetSubShapeSelector.cpp | 260 ---- src/PartSet/PartSet_WidgetSubShapeSelector.h | 126 -- src/SketchAPI/SketchAPI_Sketch.cpp | 21 +- src/SketchAPI/SketchAPI_Sketch.h | 3 +- src/SketchPlugin/CMakeLists.txt | 4 +- .../SketchPlugin_ConstraintSplit.cpp | 1310 ----------------- .../SketchPlugin_ConstraintSplit.h | 279 ---- src/SketchPlugin/SketchPlugin_Plugin.cpp | 8 +- src/SketchPlugin/SketchPlugin_Trim.cpp | 23 +- src/SketchPlugin/SketchPlugin_Trim.h | 8 +- src/SketchPlugin/plugin-Sketch.xml | 20 +- 16 files changed, 69 insertions(+), 2068 deletions(-) delete mode 100755 src/PartSet/PartSet_WidgetSubShapeSelector.cpp delete mode 100644 src/PartSet/PartSet_WidgetSubShapeSelector.h delete mode 100755 src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp delete mode 100755 src/SketchPlugin/SketchPlugin_ConstraintSplit.h diff --git a/src/PartSet/CMakeLists.txt b/src/PartSet/CMakeLists.txt index 8dee08d11..1a997eaea 100644 --- a/src/PartSet/CMakeLists.txt +++ b/src/PartSet/CMakeLists.txt @@ -38,7 +38,6 @@ SET(PROJECT_HEADERS PartSet_WidgetShapeSelector.h PartSet_WidgetSketchCreator.h PartSet_WidgetSketchLabel.h - PartSet_WidgetSubShapeSelector.h ) SET(PROJECT_MOC_HEADERS @@ -57,7 +56,6 @@ SET(PROJECT_MOC_HEADERS PartSet_WidgetShapeSelector.h PartSet_WidgetSketchCreator.h PartSet_WidgetSketchLabel.h - PartSet_WidgetSubShapeSelector.h ) SET(PROJECT_SOURCES @@ -85,7 +83,6 @@ SET(PROJECT_SOURCES PartSet_WidgetShapeSelector.cpp PartSet_WidgetSketchCreator.cpp PartSet_WidgetSketchLabel.cpp - PartSet_WidgetSubShapeSelector.cpp ) SET(PROJECT_RESOURCES diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 717bfeed6..4ba63e7ca 100755 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -9,7 +9,6 @@ #include "PartSet_WidgetPoint2DFlyout.h" #include "PartSet_WidgetShapeSelector.h" #include "PartSet_WidgetMultiSelector.h" -#include "PartSet_WidgetSubShapeSelector.h" #include "PartSet_WidgetFeaturePointSelector.h" #include "PartSet_WidgetEditor.h" #include "PartSet_WidgetFileSelector.h" @@ -752,12 +751,6 @@ ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& th aShapeSelectorWgt->setSketcher(mySketchMgr->activeSketch()); aWgt = aShapeSelectorWgt; } - else if (theType == "sketch_sub_shape_selector") { - PartSet_WidgetSubShapeSelector* aSubShapeSelectorWgt = - new PartSet_WidgetSubShapeSelector(theParent, aWorkshop, theWidgetApi); - aSubShapeSelectorWgt->setSketcher(mySketchMgr->activeSketch()); - aWgt = aSubShapeSelectorWgt; - } else if (theType == "sketch_feature_point_selector") { PartSet_WidgetFeaturePointSelector* aPointSelectorWgt = new PartSet_WidgetFeaturePointSelector(theParent, aWorkshop, theWidgetApi); diff --git a/src/PartSet/PartSet_SketcherReentrantMgr.cpp b/src/PartSet/PartSet_SketcherReentrantMgr.cpp index 7006876a4..35fbf3e41 100644 --- a/src/PartSet/PartSet_SketcherReentrantMgr.cpp +++ b/src/PartSet/PartSet_SketcherReentrantMgr.cpp @@ -8,6 +8,7 @@ #include "ModelAPI_Session.h" #include "ModelAPI_AttributeString.h" #include "ModelAPI_AttributeRefAttr.h" +#include "ModelAPI_AttributeReference.h" #include "ModelAPI_EventReentrantMessage.h" #include "GeomDataAPI_Point2D.h" @@ -30,6 +31,7 @@ #include #include #include +#include #include #include @@ -729,39 +731,26 @@ bool PartSet_SketcherReentrantMgr::copyReetntrantAttributes(const FeaturePtr& th //ModuleBase_Tools::flushUpdated(theNewFeature); //aChanged = true; } - else if (aFeatureKind == SketchPlugin_Trim::ID()) { - /*std::shared_ptr aRefSelectedAttr = - std::dynamic_pointer_cast( - theSourceFeature->data()->attribute(SketchPlugin_Trim::SELECTED_OBJECT())); - std::shared_ptr aNRefSelectedAttr = - std::dynamic_pointer_cast( - theNewFeature->data()->attribute(SketchPlugin_Trim::SELECTED_OBJECT())); - aNRefSelectedAttr->setValue(aRefSelectedAttr->value());*/ - + else if (aFeatureKind == SketchPlugin_Trim::ID() || + aFeatureKind == SketchPlugin_Split::ID()) { + std::string aPreviewObjectAttribute = aFeatureKind == SketchPlugin_Trim::ID() ? + SketchPlugin_Trim::PREVIEW_OBJECT(): SketchPlugin_Split::PREVIEW_OBJECT(); + std::string aPreviewPointAttribute = aFeatureKind == SketchPlugin_Trim::ID() ? + SketchPlugin_Trim::PREVIEW_POINT(): SketchPlugin_Split::PREVIEW_POINT(); std::shared_ptr aRefPreviewAttr = std::dynamic_pointer_cast( - theSourceFeature->data()->attribute(SketchPlugin_Trim::PREVIEW_OBJECT())); + theSourceFeature->data()->attribute(aPreviewObjectAttribute)); std::shared_ptr aNRefPreviewAttr = std::dynamic_pointer_cast( - theNewFeature->data()->attribute(SketchPlugin_Trim::PREVIEW_OBJECT())); + theNewFeature->data()->attribute(aPreviewObjectAttribute)); aNRefPreviewAttr->setValue(aRefPreviewAttr->value()); - - /*std::shared_ptr aPointSelectedAttr = - std::dynamic_pointer_cast( - theSourceFeature->data()->attribute(SketchPlugin_Trim::SELECTED_POINT())); - std::shared_ptr aNPointSelectedAttr = - std::dynamic_pointer_cast( - theNewFeature->data()->attribute(SketchPlugin_Trim::SELECTED_POINT())); - aNPointSelectedAttr->setValue(aPointSelectedAttr->x(), aPointSelectedAttr->y()); - */ std::shared_ptr aPointPreviewAttr = std::dynamic_pointer_cast( - theSourceFeature->data()->attribute(SketchPlugin_Trim::PREVIEW_POINT())); + theSourceFeature->data()->attribute(aPreviewPointAttribute)); std::shared_ptr aNPointPreviewAttr = std::dynamic_pointer_cast( - theNewFeature->data()->attribute(SketchPlugin_Trim::PREVIEW_POINT())); + theNewFeature->data()->attribute(aPreviewPointAttribute)); aNPointPreviewAttr->setValue(aPointPreviewAttr->x(), aPointPreviewAttr->y()); - //aChanged = true; } return aChanged; } diff --git a/src/PartSet/PartSet_WidgetFeaturePointSelector.cpp b/src/PartSet/PartSet_WidgetFeaturePointSelector.cpp index f68e580d9..cd98c423c 100644 --- a/src/PartSet/PartSet_WidgetFeaturePointSelector.cpp +++ b/src/PartSet/PartSet_WidgetFeaturePointSelector.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -28,10 +29,7 @@ #include "PartSet_WidgetFeaturePointSelector.h" #include "PartSet_Tools.h" -//#include -//#include #include -#include #include #include @@ -52,6 +50,13 @@ PartSet_WidgetFeaturePointSelector::PartSet_WidgetFeaturePointSelector(QWidget* const Config_WidgetAPI* theData) : ModuleBase_WidgetShapeSelector(theParent, theWorkshop, theData) { + std::string anAttributes = theData->getProperty("selection_attributes"); + QStringList anAttributesList = QString(anAttributes.c_str()).split(' ', QString::SkipEmptyParts); + + mySelectedObjectAttribute = anAttributesList[0].toStdString(); + mySelectedPointAttribute = anAttributesList[1].toStdString(); + myPreviewObjectAttribute = anAttributesList[2].toStdString(); + myPreviewPointAttribute = anAttributesList[3].toStdString(); } PartSet_WidgetFeaturePointSelector::~PartSet_WidgetFeaturePointSelector() @@ -134,7 +139,7 @@ void PartSet_WidgetFeaturePointSelector::mouseReleased(ModuleBase_IViewWindow* t std::shared_ptr aRefPreviewAttr = std::dynamic_pointer_cast( - feature()->data()->attribute(SketchPlugin_Trim::PREVIEW_OBJECT())); + feature()->data()->attribute(myPreviewObjectAttribute)); ObjectPtr aPreviewObject = aRefPreviewAttr->value(); // do not move focus from the current widget if the object is not highlighted/selected if (!aPreviewObject.get()) @@ -143,15 +148,15 @@ void PartSet_WidgetFeaturePointSelector::mouseReleased(ModuleBase_IViewWindow* t // set parameters of preview into parameters of selection in the feature std::shared_ptr aRefSelectedAttr = std::dynamic_pointer_cast( - feature()->data()->attribute(SketchPlugin_Trim::SELECTED_OBJECT())); + feature()->data()->attribute(mySelectedObjectAttribute)); aRefSelectedAttr->setValue(aRefPreviewAttr->value()); std::shared_ptr aPointSelectedAttr = std::dynamic_pointer_cast( - feature()->data()->attribute(SketchPlugin_Trim::SELECTED_POINT())); + feature()->data()->attribute(mySelectedPointAttribute)); std::shared_ptr aPointPreviewAttr = std::dynamic_pointer_cast( - feature()->data()->attribute(SketchPlugin_Trim::PREVIEW_POINT())); + feature()->data()->attribute(myPreviewPointAttribute)); aPointSelectedAttr->setValue(aPointPreviewAttr->x(), aPointPreviewAttr->y()); updateObject(feature()); @@ -174,12 +179,12 @@ bool PartSet_WidgetFeaturePointSelector::fillFeature( std::shared_ptr aRef = std::dynamic_pointer_cast( - feature()->data()->attribute(SketchPlugin_Trim::PREVIEW_OBJECT())); + feature()->data()->attribute(myPreviewObjectAttribute)); aRef->setValue(anObject); std::shared_ptr anAttributePoint = std::dynamic_pointer_cast( - feature()->data()->attribute(SketchPlugin_Trim::PREVIEW_POINT())); + feature()->data()->attribute(myPreviewPointAttribute)); std::shared_ptr aPoint = PartSet_Tools::getPnt2d(theEvent, theWindow, mySketch); anAttributePoint->setValue(aPoint); // redisplay AIS presentation in viewer diff --git a/src/PartSet/PartSet_WidgetFeaturePointSelector.h b/src/PartSet/PartSet_WidgetFeaturePointSelector.h index 96d559d0c..176638c51 100644 --- a/src/PartSet/PartSet_WidgetFeaturePointSelector.h +++ b/src/PartSet/PartSet_WidgetFeaturePointSelector.h @@ -18,6 +18,8 @@ #include +#include + class ModuleBase_IWorkshop; class Config_WidgetAPI; class ModuleBase_IViewWindow; @@ -113,6 +115,11 @@ protected: CompositeFeaturePtr mySketch; Quantity_Color myHighlightColor; Quantity_Color mySelectionColor; + + std::string mySelectedObjectAttribute; + std::string mySelectedPointAttribute; + std::string myPreviewObjectAttribute; + std::string myPreviewPointAttribute; }; #endif \ No newline at end of file diff --git a/src/PartSet/PartSet_WidgetSubShapeSelector.cpp b/src/PartSet/PartSet_WidgetSubShapeSelector.cpp deleted file mode 100755 index 24dd2cad0..000000000 --- a/src/PartSet/PartSet_WidgetSubShapeSelector.cpp +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: PartSet_WidgetSubShapeSelector.cpp -// Created: 21 Jul 2016 -// Author: Natalia ERMOLAEVA - -#include "PartSet_WidgetSubShapeSelector.h" -#include "PartSet_Tools.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 - -PartSet_WidgetSubShapeSelector::PartSet_WidgetSubShapeSelector(QWidget* theParent, - ModuleBase_IWorkshop* theWorkshop, - const Config_WidgetAPI* theData) -: ModuleBase_WidgetShapeSelector(theParent, theWorkshop, theData) -{ - myCurrentSubShape = std::shared_ptr(new ModuleBase_ViewerPrs()); -} - -PartSet_WidgetSubShapeSelector::~PartSet_WidgetSubShapeSelector() -{ - myCashedShapes.clear(); -} - -//******************************************************************** -void PartSet_WidgetSubShapeSelector::activateCustom() -{ - ModuleBase_WidgetShapeSelector::activateCustom(); - - myWorkshop->module()->activateCustomPrs(myFeature, - ModuleBase_IModule::CustomizeHighlightedObjects, true); -} - -//******************************************************************** -void PartSet_WidgetSubShapeSelector::deactivate() -{ - ModuleBase_WidgetShapeSelector::deactivate(); - - myWorkshop->module()->deactivateCustomPrs(ModuleBase_IModule::CustomizeHighlightedObjects, true); -} - -//******************************************************************** -void PartSet_WidgetSubShapeSelector::mouseMoved(ModuleBase_IViewWindow* theWindow, - QMouseEvent* theEvent) -{ - ModuleBase_ISelection* aSelect = myWorkshop->selection(); - QList aHighlighted = aSelect->getHighlighted(); - - if (!aHighlighted.empty()) { - ModuleBase_ViewerPrsPtr aPrs = aHighlighted.first(); - if (aPrs.get() && aPrs->object().get()) { - ObjectPtr anObject = aPrs->object(); - if (myCashedShapes.find(anObject) == myCashedShapes.end()) - fillObjectShapes(anObject); - const std::set& aShapes = myCashedShapes[anObject]; - if (!aShapes.empty()) { - gp_Pnt aPnt = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWindow->v3dView()); - double aX, anY; - Handle(V3d_View) aView = theWindow->v3dView(); - PartSet_Tools::convertTo2D(aPnt, mySketch, aView, aX, anY); - std::shared_ptr aPoint = PartSet_Tools::convertTo3D(aX, anY, mySketch); - - std::set::const_iterator anIt = aShapes.begin(), aLast = aShapes.end(); - for (; anIt != aLast; anIt++) { - GeomShapePtr aBaseShape = *anIt; - std::shared_ptr aProjectedPoint; - if (ModelGeomAlgo_Point2D::isPointOnEdge(aBaseShape, aPoint, aProjectedPoint)) { - XGUI_Tools::workshop(myWorkshop)->displayer()->clearSelected(false); - if (myCurrentSubShape->object() != anObject || - myCurrentSubShape->shape() != aBaseShape) { - myCurrentSubShape->setObject(anObject); - myCurrentSubShape->setShape(aBaseShape); - - ModuleBase_IModule* aModule = myWorkshop->module(); - - - if (!aModule->isCustomPrsActivated(ModuleBase_IModule::CustomizeHighlightedObjects)) - aModule->activateCustomPrs(myFeature, - ModuleBase_IModule::CustomizeHighlightedObjects, true); - aModule->customizeObject(myFeature, - ModuleBase_IModule::CustomizeHighlightedObjects, true); - } - else - XGUI_Tools::workshop(myWorkshop)->displayer()->updateViewer();; - break; - } - } - } - } - } -} - -//******************************************************************** -void PartSet_WidgetSubShapeSelector::getGeomSelection(const ModuleBase_ViewerPrsPtr& thePrs, - ObjectPtr& theObject, - GeomShapePtr& theShape) -{ - ModuleBase_ISelection* aSelection = myWorkshop->selection(); - theObject = aSelection->getResult(thePrs); - if (!theObject.get() && myCurrentSubShape->object()) - theObject = myCurrentSubShape->object(); -} - -//******************************************************************** -QList PartSet_WidgetSubShapeSelector::getAttributeSelection() const -{ - return QList(); -} - - -//******************************************************************** -bool PartSet_WidgetSubShapeSelector::setSelection( - QList>& theValues, - const bool theToValidate) -{ - ObjectPtr aBaseObject = myCurrentSubShape->object(); - GeomShapePtr aBaseShape = myCurrentSubShape->shape(); - bool aResult = aBaseObject.get() && aBaseShape.get(); - // firstly set the selection to the attribute - if (aResult) { - QList aValues; - aValues.append(myCurrentSubShape); - aResult = ModuleBase_WidgetShapeSelector::setSelection(aValues, theToValidate); - } - // secondly fill additional attributes - if (aResult) { - aResult = false; - if (aBaseShape->shapeType() == GeomAPI_Shape::EDGE) { - std::shared_ptr anEdge(new GeomAPI_Edge(aBaseShape)); - - std::shared_ptr aFirstPnt = anEdge->firstPoint(); - std::shared_ptr aLastPnt = anEdge->lastPoint(); - - std::shared_ptr aFirstPointAttr, aLastPointAttr; - /// find the points in feature attributes - FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObject); - std::list a2DPointAttributes = aBaseFeature->data()->attributes( - GeomDataAPI_Point2D::typeId()); - std::list::const_iterator anIt = a2DPointAttributes.begin(), - aLast = a2DPointAttributes.end(); - for (; anIt != aLast; anIt++) { - std::shared_ptr anAttributePoint = - std::dynamic_pointer_cast(*anIt); - std::shared_ptr aPoint2D = anAttributePoint->pnt(); - std::shared_ptr aPoint3D = PartSet_Tools::convertTo3D(aPoint2D->x(), - aPoint2D->y(), mySketch); - if (aFirstPnt->isEqual(aPoint3D)) - aFirstPointAttr = anAttributePoint; - else if (aLastPnt->isEqual(aPoint3D)) - aLastPointAttr = anAttributePoint; - } - - /// find the points in coincident features - PntToAttributesMap aRefAttributes = myCashedReferences[aBaseObject]; - PntToAttributesMap::const_iterator - aRIt = aRefAttributes.begin(), aRLast = aRefAttributes.end(); - for (; aRIt != aRLast; aRIt++) { - std::shared_ptr anAttribute = aRIt->first; - std::shared_ptr aPoint = aRIt->second; - if (!aFirstPointAttr.get() && aFirstPnt->isEqual(aPoint)) - aFirstPointAttr = anAttribute; - if (!aLastPointAttr.get() && aLastPnt->isEqual(aPoint)) - aLastPointAttr = anAttribute; - if (aFirstPointAttr.get() && aLastPointAttr.get()) - break; - } - if (!aFirstPointAttr.get() || !aLastPointAttr) - return false; - - FeaturePtr aFeature = feature(); - AttributeRefAttrPtr anAPointAttr = std::dynamic_pointer_cast( - aFeature->attribute(SketchPlugin_Constraint::ENTITY_A())); - AttributeRefAttrPtr aBPointAttr = std::dynamic_pointer_cast( - aFeature->attribute(SketchPlugin_Constraint::ENTITY_B())); - anAPointAttr->setAttr(aFirstPointAttr); - aBPointAttr->setAttr(aLastPointAttr); - aResult = true; - } - } - - return aResult; -} - -//******************************************************************** -void PartSet_WidgetSubShapeSelector::getHighlighted( - QList>& theValues) -{ - if (myCurrentSubShape.get() && myCurrentSubShape->object().get()) - theValues.append(myCurrentSubShape); -} - -//******************************************************************** -void PartSet_WidgetSubShapeSelector::fillObjectShapes(const ObjectPtr& theObject) -{ - std::set > aShapes; - std::map, std::shared_ptr > aPointToAttributes; - std::set > aRefAttributes; - // current feature - FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); - // edges on feature - std::set anEdgeResults; - ModelGeomAlgo_Shape::shapesOfType(aFeature, GeomAPI_Shape::EDGE, anEdgeResults); - if (!anEdgeResults.empty()) { - GeomShapePtr aFeatureShape = (*anEdgeResults.begin())->shape(); - - // coincidences to the feature - ModelGeomAlgo_Point2D::getPointsOfReference(aFeature, SketchPlugin_ConstraintCoincidence::ID(), - aRefAttributes, SketchPlugin_Point::ID(), SketchPlugin_Point::COORD_ID()); - // layed on feature coincidences to divide it on several shapes - CompositeFeaturePtr aSketch = sketch(); - std::shared_ptr aData = aSketch->data(); - std::shared_ptr aC = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); - std::shared_ptr aX = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Sketch::DIRX_ID())); - std::shared_ptr aNorm = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Sketch::NORM_ID())); - std::shared_ptr aY(new GeomAPI_Dir(aNorm->dir()->cross(aX->dir()))); - std::list > aPoints; - ModelGeomAlgo_Point2D::getPointsInsideShape_p(aFeatureShape, aRefAttributes, aC->pnt(), - aX->dir(), aY, aPoints, aPointToAttributes); - - GeomAlgoAPI_ShapeTools::splitShape_p(aFeatureShape, aPoints, aShapes); - } - myCashedShapes[theObject] = aShapes; - myCashedReferences[theObject] = aPointToAttributes; -} - diff --git a/src/PartSet/PartSet_WidgetSubShapeSelector.h b/src/PartSet/PartSet_WidgetSubShapeSelector.h deleted file mode 100644 index 376ffb139..000000000 --- a/src/PartSet/PartSet_WidgetSubShapeSelector.h +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: PartSet_WidgetSubShapeSelector.h -// Created: 21 Jul 2016 -// Author: Natalia ERMOLAEVA - - -#ifndef PartSet_WidgetSubShapeSelector_H -#define PartSet_WidgetSubShapeSelector_H - -#include "PartSet.h" -#include "PartSet_MouseProcessor.h" - -#include - -#include - -#include - -#include -#include - -class ModuleBase_IWorkshop; -class Config_WidgetAPI; -class ModuleBase_IViewWindow; -class ModuleBase_ViewerPrs; - -class GeomAPI_Pnt; -class GeomDataAPI_Point2D; - -class QWidget; -class QMouseEvent; - -/** -* \ingroup Modules -* Customosation of PartSet_WidgetSubShapeSelector in order to visualize sub-shape -* by mouse move over shape in the viewer. Split of the object is performed by -* coincident points to the object. Segment between nearest coincidence is highlighted -*/ -class PARTSET_EXPORT PartSet_WidgetSubShapeSelector: public ModuleBase_WidgetShapeSelector, - public PartSet_MouseProcessor -{ -Q_OBJECT - public: - /// Constructor - /// \param theParent the parent object - /// \param theWorkshop instance of workshop interface - /// \param theData the widget configuation. The attribute of the model widget is obtained from - PartSet_WidgetSubShapeSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, - const Config_WidgetAPI* theData); - - virtual ~PartSet_WidgetSubShapeSelector(); - - /// Set sketcher - /// \param theSketch a sketcher object - void setSketcher(CompositeFeaturePtr theSketch) { mySketch = theSketch; } - - /// Retrurns installed sketcher - CompositeFeaturePtr sketch() const { return mySketch; } - - /// The methiod called when widget is deactivated - virtual void deactivate(); - - /// Processing the mouse move event in the viewer - /// \param theWindow a view window - /// \param theEvent a mouse event - virtual void mouseMoved(ModuleBase_IViewWindow* theWindow, QMouseEvent* theEvent); - - /// Returns values which should be highlighted when the whidget is active - /// \param theValues a list of presentations - virtual void getHighlighted(QList>& theValues); - - /// Set the given wrapped value to the current widget - /// This value should be processed in the widget according to the needs - /// The method is called by the current operation to process the operation preselection. - /// It is redefined to fill attributes responsible for the sub selection - /// \param theValues the wrapped selection values - /// \param theToValidate a flag on validation of the values - virtual bool setSelection(QList>& theValues, - const bool theToValidate); - -protected: - /// Checks the widget validity. By default, it returns true. - /// \param thePrs a selected presentation in the view - /// \return a boolean value - //virtual bool isValidSelectionCustom(const std::shared_ptr& thePrs); - - /// Return an object and geom shape by the viewer presentation - /// \param thePrs a selection - /// \param theObject an output object - /// \param theShape a shape of the selection - //virtual void getGeomSelection(const std::shared_ptr& thePrs, - // ObjectPtr& theObject, - // GeomShapePtr& theShape); - void fillObjectShapes(const ObjectPtr& theObject); - - /// Return an object and geom shape by the viewer presentation - /// \param thePrs a selection - /// \param theObject an output object - /// \param theShape a shape of the selection - virtual void getGeomSelection(const std::shared_ptr& thePrs, - ObjectPtr& theObject, - GeomShapePtr& theShape); - - /// Return the attribute values wrapped in a list of viewer presentations - /// \return a list of viewer presentations, which contains an attribute result and - /// a shape. If the attribute do not uses the shape, it is empty - virtual QList> getAttributeSelection() const; - -protected: - /// The methiod called when widget is activated - virtual void activateCustom(); - -protected: - std::shared_ptr myCurrentSubShape; - std::map > myCashedShapes; - - typedef std::map, - std::shared_ptr > PntToAttributesMap; - std::map myCashedReferences; - - /// Pointer to a sketch - CompositeFeaturePtr mySketch; -}; - -#endif \ No newline at end of file diff --git a/src/SketchAPI/SketchAPI_Sketch.cpp b/src/SketchAPI/SketchAPI_Sketch.cpp index cc0ec8169..f03e6b1ba 100644 --- a/src/SketchAPI/SketchAPI_Sketch.cpp +++ b/src/SketchAPI/SketchAPI_Sketch.cpp @@ -23,8 +23,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -495,16 +495,19 @@ std::shared_ptr SketchAPI_Sketch::addRotation( //-------------------------------------------------------------------------------------- std::shared_ptr SketchAPI_Sketch::addSplit( - const ModelHighAPI_Reference& theFeature, - const ModelHighAPI_RefAttr& thePoint1, - const ModelHighAPI_RefAttr& thePoint2) + const ModelHighAPI_Reference& theFeature, + const std::shared_ptr& thePositionPoint) { std::shared_ptr aFeature = - compositeFeature()->addFeature(SketchPlugin_ConstraintSplit::ID()); - fillAttribute(theFeature, aFeature->reference(SketchPlugin_Constraint::VALUE())); - fillAttribute(thePoint1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); - fillAttribute(thePoint2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); - //aFeature->execute(); + compositeFeature()->addFeature(SketchPlugin_Split::ID()); + fillAttribute(theFeature, aFeature->reference(SketchPlugin_Split::SELECTED_OBJECT())); + + AttributePtr anAttribute = aFeature->attribute(SketchPlugin_Split::SELECTED_POINT()); + if (anAttribute->attributeType() == GeomDataAPI_Point2D::typeId()) { + AttributePoint2DPtr aPointAttr = std::dynamic_pointer_cast(anAttribute); + fillAttribute(thePositionPoint, aPointAttr); + } + return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } diff --git a/src/SketchAPI/SketchAPI_Sketch.h b/src/SketchAPI/SketchAPI_Sketch.h index 15450976f..6d01f8c6e 100644 --- a/src/SketchAPI/SketchAPI_Sketch.h +++ b/src/SketchAPI/SketchAPI_Sketch.h @@ -272,8 +272,7 @@ public: SKETCHAPI_EXPORT std::shared_ptr addSplit( const ModelHighAPI_Reference& theFeature, - const ModelHighAPI_RefAttr& thePoint1, - const ModelHighAPI_RefAttr& thePoint2); + const std::shared_ptr& thePositionPoint); /// Add trim SKETCHAPI_EXPORT diff --git a/src/SketchPlugin/CMakeLists.txt b/src/SketchPlugin/CMakeLists.txt index 1d18e369d..cc47e90de 100644 --- a/src/SketchPlugin/CMakeLists.txt +++ b/src/SketchPlugin/CMakeLists.txt @@ -23,7 +23,6 @@ SET(PROJECT_HEADERS SketchPlugin_ConstraintPerpendicular.h SketchPlugin_ConstraintRadius.h SketchPlugin_ConstraintRigid.h - SketchPlugin_ConstraintSplit.h SketchPlugin_ConstraintTangent.h SketchPlugin_ConstraintVertical.h SketchPlugin_ExternalValidator.h @@ -40,6 +39,7 @@ SET(PROJECT_HEADERS SketchPlugin_Projection.h SketchPlugin_Sketch.h SketchPlugin_SketchEntity.h + SketchPlugin_Split.h SketchPlugin_Tools.h SketchPlugin_Trim.h SketchPlugin_Validators.h @@ -64,7 +64,6 @@ SET(PROJECT_SOURCES SketchPlugin_ConstraintPerpendicular.cpp SketchPlugin_ConstraintRadius.cpp SketchPlugin_ConstraintRigid.cpp - SketchPlugin_ConstraintSplit.cpp SketchPlugin_ConstraintTangent.cpp SketchPlugin_ConstraintVertical.cpp SketchPlugin_ExternalValidator.cpp @@ -80,6 +79,7 @@ SET(PROJECT_SOURCES SketchPlugin_Projection.cpp SketchPlugin_Sketch.cpp SketchPlugin_SketchEntity.cpp + SketchPlugin_Split.cpp SketchPlugin_Tools.cpp SketchPlugin_Trim.cpp SketchPlugin_Validators.cpp diff --git a/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp b/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp deleted file mode 100755 index e21de9591..000000000 --- a/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp +++ /dev/null @@ -1,1310 +0,0 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> - -// File: SketchPlugin_ConstraintSplit.cpp -// Created: 25 Aug 2016 -// Author: Natalia ERMOLAEVA - -#include "SketchPlugin_ConstraintSplit.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 -#include - -#include - -//#define CREATE_CONSTRAINTS - -//#define DEBUG_SPLIT -#ifdef DEBUG_SPLIT -#include -#endif - -static const double PI = 3.141592653589793238463; - -SketchPlugin_ConstraintSplit::SketchPlugin_ConstraintSplit() -{ -} - -void SketchPlugin_ConstraintSplit::initAttributes() -{ - data()->addAttribute(SketchPlugin_Constraint::VALUE(), ModelAPI_AttributeReference::typeId()); - data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); - data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); -} - -void SketchPlugin_ConstraintSplit::execute() -{ - std::shared_ptr aData = data(); - - // Check the base objects are initialized. - AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Constraint::VALUE())); - if(!aBaseObjectAttr->isInitialized()) { - setError("Error: Base object is not initialized."); - return; - } - AttributePoint2DPtr aFirstPointAttrOfSplit = - getPointOfRefAttr(aData->attribute(SketchPlugin_Constraint::ENTITY_A())); - AttributePoint2DPtr aSecondPointAttrOfSplit = - getPointOfRefAttr(aData->attribute(SketchPlugin_Constraint::ENTITY_B())); - if (!aFirstPointAttrOfSplit.get() || !aFirstPointAttrOfSplit->isInitialized() || - !aSecondPointAttrOfSplit.get() || !aSecondPointAttrOfSplit->isInitialized()) { - setError("Error: Sub-shape is not initialized."); - return; - } - - // Wait all constraints being created, then send update events - static Events_ID anUpdateEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); - bool isUpdateFlushed = Events_Loop::loop()->isFlushed(anUpdateEvent); - if (isUpdateFlushed) - Events_Loop::loop()->setFlushed(anUpdateEvent, false); - - - // Find feature constraints - FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); - ResultPtr aBaseFeatureResult = getFeatureResult(aBaseFeature); - std::set aFeaturesToDelete, aFeaturesToUpdate; - - //std::map aTangentFeatures; - std::map aCoincidenceToFeature; - getConstraints(aFeaturesToDelete, aFeaturesToUpdate, /*aTangentFeatures, */ - aCoincidenceToFeature); - - std::map > aBaseRefAttributes; - std::list aRefsToFeature; - getRefAttributes(aBaseFeature, aBaseRefAttributes, aRefsToFeature); - - std::map aBasePointModifiedAttributes; - -#ifdef DEBUG_SPLIT - std::cout << std::endl; - std::cout << "SketchPlugin_ConstraintSplit::execute()" << std::endl; - std::cout << std::endl; - - SketchPlugin_Sketch* aSketch = sketch(); - std::cout << "SKETCH FEATURES (before split) [" << aSketch->numberOfSubs() << "]:" << std::endl; - for (int i = 0, aNbSubs = aSketch->numberOfSubs(); i < aNbSubs; i++) { - std::cout << getFeatureInfo(aSketch->subFeature(i), false) << std::endl; - } - - std::cout << std::endl; - std::cout << "---- IN PARAMETERS ----" << std::endl; - std::cout << "Base feature:" << getFeatureInfo(aBaseFeature) << std::endl; - std::cout << std::endl; - - if (!aCoincidenceToFeature.empty()) { - std::cout << "Coincidences to base feature[" << - aCoincidenceToFeature.size() << "]: " << std::endl; - std::map::const_iterator anIt = aCoincidenceToFeature.begin(), - aLast = aCoincidenceToFeature.end(); - for (int i = 1; anIt != aLast; anIt++, i++) { - FeaturePtr aFeature = (*anIt).first; - std::string anAttributeId = (*anIt).second.first; - std::shared_ptr aPointAttr = (*anIt).second.second; - - std::cout << i << "-" << getFeatureInfo(aFeature) << std::endl; - std::cout << " -Attribute to correct:" << anAttributeId << std::endl; - std::cout << " -Point attribute:" << - ModelGeomAlgo_Point2D::getPointAttributeInfo(aPointAttr) << std::endl; - } - } - - std::map >::const_iterator - aRefIt = aBaseRefAttributes.begin(), aRefLast = aBaseRefAttributes.end(); - std::cout << std::endl << "References to attributes of base feature [" << - aBaseRefAttributes.size() << "]" << std::endl; - for (; aRefIt != aRefLast; aRefIt++) { - AttributePtr aBaseAttr = aRefIt->first; - std::list aRefAttributes = aRefIt->second; - std::string aRefsInfo; - std::list::const_iterator aRefAttrIt = aRefAttributes.begin(), - aRefAttrLast = aRefAttributes.end(); - for (; aRefAttrIt != aRefAttrLast; aRefAttrIt++) { - if (!aRefsInfo.empty()) - aRefsInfo.append(","); - AttributePtr aRAttr = *aRefAttrIt; - aRefsInfo.append(aRAttr->id()); - FeaturePtr aRFeature = ModelAPI_Feature::feature(aRAttr->owner()); - aRefsInfo.append("(" + aRFeature->name() + ") "); - } - std::shared_ptr aPointAttr = - std::dynamic_pointer_cast(aBaseAttr); - std::cout << aPointAttr->id().c_str() << - ": " << "[" << aRefAttributes.size() << "] " << aRefsInfo << std::endl; - } - std::cout << std::endl; - std::cout << std::endl << "References to base feature [" << - aRefsToFeature.size() << "]" << std::endl; - std::list::const_iterator aRefAttrIt = aRefsToFeature.begin(), - aRefAttrLast = aRefsToFeature.end(); - std::string aRefsInfo; - for (; aRefAttrIt != aRefAttrLast; aRefAttrIt++) { - if (!aRefsInfo.empty()) - aRefsInfo.append(","); - AttributePtr aRAttr = *aRefAttrIt; - aRefsInfo.append(aRAttr->id()); - FeaturePtr aRFeature = ModelAPI_Feature::feature(aRAttr->owner()); - aRefsInfo.append("(" + aRFeature->name() + ") "); - } - std::cout << "[" << aRefsToFeature.size() << "] " << aRefsInfo << std::endl; - - - std::cout << std::endl; - std::cout << "---- SPLIT ----" << std::endl; - std::cout << std::endl; -#endif - - std::string aFeatureKind = aBaseFeature->getKind(); - FeaturePtr aSplitFeature, anAfterFeature; - std::set aFurtherCoincidences; - std::set aCreatedFeatures; - std::set> aModifiedAttributes; - if (aFeatureKind == SketchPlugin_Line::ID()) - splitLine(aSplitFeature, aBaseFeature, anAfterFeature, aFurtherCoincidences, aCreatedFeatures, - aModifiedAttributes); - else if (aFeatureKind == SketchPlugin_Arc::ID()) - splitArc(aSplitFeature, aBaseFeature, anAfterFeature, aFurtherCoincidences, aCreatedFeatures, - aModifiedAttributes); - if (aFeatureKind == SketchPlugin_Circle::ID()) { - FeaturePtr aCircleFeature = aBaseFeature; - splitCircle(aSplitFeature, aBaseFeature, anAfterFeature, aFurtherCoincidences, - aCreatedFeatures, aModifiedAttributes); - - updateRefFeatureConstraints(getFeatureResult(aBaseFeature), aRefsToFeature); - - AttributePtr aCenterAttr = aCircleFeature->attribute(SketchPlugin_Circle::CENTER_ID()); - aFeaturesToDelete.insert(aCircleFeature); - // as circle is removed, temporary fill this attribute*/ - aBaseObjectAttr->setObject(ResultPtr()); - } - -#ifdef DEBUG_SPLIT - std::cout << "---- OUT PARAMETERS ----" << std::endl; - std::cout << "Base modified feature:" << getFeatureInfo(aBaseFeature) << std::endl; - std::cout << "Split feature:" << getFeatureInfo(aSplitFeature) << std::endl; - std::cout << "After feature:" << getFeatureInfo(anAfterFeature) << std::endl; - std::cout << std::endl; - - std::cout << "Created features by split:[" << aCreatedFeatures.size() << "]" << std::endl; - std::set::const_iterator aFIt = aCreatedFeatures.begin(), - aFLast = aCreatedFeatures.end(); - for (; aFIt != aFLast; aFIt++) { - std::cout << getFeatureInfo(*aFIt) << std::endl; - } - std::cout << std::endl; - - std::cout << "Attributes for further Coincidences:" << std::endl; - std::set::const_iterator anIt = aFurtherCoincidences.begin(), - aLast = aFurtherCoincidences.end(); - for (; anIt != aLast; anIt++) { - AttributePtr anAttribute = *anIt; - FeaturePtr aFeature = ModelAPI_Feature::feature(anAttribute->owner()); - std::cout << ModelGeomAlgo_Point2D::getPointAttributeInfo(anAttribute) - << " [" << getFeatureInfo(aFeature, false) << "]" << std::endl; - } - - std::cout << "Modifed attributes (constraints to attributes are moved here):" << std::endl; - std::set >::const_iterator - aPIt = aModifiedAttributes.begin(), aPLast = aModifiedAttributes.end(); - std::string aResInfo; - for (; aPIt != aPLast; aPIt++) { - if (!aResInfo.empty()) - aResInfo += "\n"; - - std::pair aPair = *aPIt; - - AttributePtr anAttr = aPair.first; - aResInfo.append(anAttr->id()); - FeaturePtr aFeature = ModelAPI_Feature::feature(anAttr->owner()); - aResInfo.append("(" + aFeature->name() + ") "); - - aResInfo.append(" - is modified to - "); - - anAttr = aPair.second; - aResInfo.append(anAttr->id()); - aFeature = ModelAPI_Feature::feature(anAttr->owner()); - aResInfo.append("(" + aFeature->name() + ") "); - } - std::cout << aResInfo << std::endl; -#endif - - std::set aFeatureResults; - aFeatureResults.insert(getFeatureResult(aBaseFeature)); - if (anAfterFeature.get() && anAfterFeature != aBaseFeature) - aFeatureResults.insert(getFeatureResult(anAfterFeature)); - - // coincidence to feature - updateCoincidenceConstraintsToFeature(aCoincidenceToFeature, aFurtherCoincidences, - aFeatureResults, aSplitFeature); - - updateRefAttConstraints(aBaseRefAttributes, aModifiedAttributes); - - // delete constraints -#ifdef DEBUG_SPLIT - std::cout << "remove features and references:" << std::endl; - std::set::const_iterator aDIt = aFeaturesToDelete.begin(), - aDLast = aFeaturesToDelete.end(); - for (; aDIt != aDLast; aDIt++) { - std::cout << getFeatureInfo(*aDIt, false) << std::endl; - std::cout << std::endl; - } -#endif - ModelAPI_Tools::removeFeaturesAndReferences(aFeaturesToDelete); - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_DELETED)); - -#ifdef DEBUG_SPLIT - std::cout << "update features after split:" << std::endl; - std::set::const_iterator anUIt = aFeaturesToUpdate.begin(), - anULast = aFeaturesToUpdate.end(); - for (; anUIt != anULast; anUIt++) { - std::cout << getFeatureInfo(*anUIt, false) << std::endl; - std::cout << std::endl; - } -#endif - updateFeaturesAfterSplit(aFeaturesToUpdate); - - // Send events to update the sub-features by the solver. - if(isUpdateFlushed) { - Events_Loop::loop()->setFlushed(anUpdateEvent, true); - } - -#ifdef DEBUG_SPLIT - std::cout << "SKETCH FEATURES (after split) [" << aSketch->numberOfSubs() << "]:" << std::endl; - for (int i = 0, aNbSubs = aSketch->numberOfSubs(); i < aNbSubs; i++) { - std::cout << getFeatureInfo(aSketch->subFeature(i), false) << std::endl; - } -#endif -} - -bool SketchPlugin_ConstraintSplit::isMacro() const -{ - return true; -} - -AISObjectPtr SketchPlugin_ConstraintSplit::getAISObject(AISObjectPtr thePrevious) -{ - AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast( - data()->attribute(SketchPlugin_Constraint::VALUE())); - FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); - - AttributePoint2DPtr aFirstPointAttrOfSplit = getPointOfRefAttr( - data()->attribute(SketchPlugin_Constraint::ENTITY_A())); - AttributePoint2DPtr aSecondPointAttrOfSplit = getPointOfRefAttr( - data()->attribute(SketchPlugin_Constraint::ENTITY_B())); - - if (aBaseObjectAttr->isInitialized() && aBaseFeature.get() && - aFirstPointAttrOfSplit->isInitialized() && - aSecondPointAttrOfSplit->isInitialized()) { - - ResultPtr aResult = getFeatureResult(aBaseFeature); - GeomShapePtr aBaseShape = aResult->shape(); - std::list > aPoints; - - std::shared_ptr aStartPnt2d = aFirstPointAttrOfSplit->pnt(); - std::shared_ptr aStartPoint = sketch()->to3D(aStartPnt2d->x(), aStartPnt2d->y()); - aPoints.push_back(aStartPoint); - - std::shared_ptr aSecondPnt2d = aSecondPointAttrOfSplit->pnt(); - std::shared_ptr aSecondPoint = - sketch()->to3D(aSecondPnt2d->x(), aSecondPnt2d->y()); - aPoints.push_back(aSecondPoint); - - std::set > aSplitShapes; - - GeomAlgoAPI_ShapeTools::splitShape_p(aBaseShape, aPoints, aSplitShapes); - std::shared_ptr aShape = - GeomAlgoAPI_ShapeTools::findShape(aPoints, aSplitShapes); - - AISObjectPtr anAIS = thePrevious; - if (aShape) { - if (!anAIS) - anAIS = AISObjectPtr(new GeomAPI_AISObject); - anAIS->createShape(aShape); - std::shared_ptr anAuxiliaryAttr = - aBaseFeature->data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID()); - - bool isConstruction = anAuxiliaryAttr.get() != NULL && anAuxiliaryAttr->value(); - - std::vector aColor; - double aWidth = SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH(); - int aLineStyle = SketchPlugin_SketchEntity::SKETCH_LINE_STYLE(); - if (isConstruction) { - aColor = Config_PropManager::color("Visualization", "sketch_auxiliary_color"); - aWidth = SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH_AUXILIARY(); - aLineStyle = SketchPlugin_SketchEntity::SKETCH_LINE_STYLE_AUXILIARY(); - } - else { - aColor = Config_PropManager::color("Visualization", "sketch_entity_color"); - } - anAIS->setColor(aColor[0], aColor[1], aColor[2]); - anAIS->setWidth(aWidth + 1); - anAIS->setLineStyle(aLineStyle); - } - return anAIS; - } - return AISObjectPtr(); -} - -std::shared_ptr SketchPlugin_ConstraintSplit::getPointOfRefAttr( - const AttributePtr& theAttribute) -{ - AttributePoint2DPtr aPointAttribute; - - if (theAttribute->attributeType() == ModelAPI_AttributeRefAttr::typeId()) { - AttributeRefAttrPtr aRefAttr = - std::dynamic_pointer_cast(theAttribute); - if (aRefAttr.get() && aRefAttr->isInitialized()) { - AttributePtr anAttribute = aRefAttr->attr(); - if (anAttribute.get() && anAttribute->attributeType() == GeomDataAPI_Point2D::typeId()) - aPointAttribute = std::dynamic_pointer_cast(anAttribute); - } - } - return aPointAttribute; -} - -void SketchPlugin_ConstraintSplit::getFeaturePoints(const FeaturePtr& theFeature, - AttributePoint2DPtr& theStartPointAttr, - AttributePoint2DPtr& theEndPointAttr) -{ - std::string aFeatureKind = theFeature->getKind(); - std::string aStartAttributeName, anEndAttributeName; - if (aFeatureKind == SketchPlugin_Line::ID()) { - aStartAttributeName = SketchPlugin_Line::START_ID(); - anEndAttributeName = SketchPlugin_Line::END_ID(); - } - else if (aFeatureKind == SketchPlugin_Arc::ID()) { - aStartAttributeName = SketchPlugin_Arc::START_ID(); - anEndAttributeName = SketchPlugin_Arc::END_ID(); - } - if (!aStartAttributeName.empty() && !anEndAttributeName.empty()) { - theStartPointAttr = std::dynamic_pointer_cast( - theFeature->attribute(aStartAttributeName)); - theEndPointAttr = std::dynamic_pointer_cast( - theFeature->attribute(anEndAttributeName)); - } -} - -void SketchPlugin_ConstraintSplit::getConstraints(std::set& theFeaturesToDelete, - std::set& theFeaturesToUpdate, - std::map& theCoincidenceToFeature) -{ - std::shared_ptr aData = data(); - - // Check the base objects are initialized. - AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Constraint::VALUE())); - FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); - ResultPtr aBaseFeatureResult = getFeatureResult(aBaseFeature); - - std::set aRefsList = aBaseFeatureResult->data()->refsToMe(); - std::set aFRefsList = aBaseFeature->data()->refsToMe(); - aRefsList.insert(aFRefsList.begin(), aFRefsList.end()); - - std::set::const_iterator aIt; - for (aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) { - std::shared_ptr aAttr = (*aIt); - FeaturePtr aRefFeature = std::dynamic_pointer_cast(aAttr->owner()); - std::string aRefFeatureKind = aRefFeature->getKind(); - if (aRefFeatureKind == SketchPlugin_ConstraintMirror::ID() || - aRefFeatureKind == SketchPlugin_MultiRotation::ID() || - aRefFeatureKind == SketchPlugin_MultiTranslation::ID() || - aRefFeatureKind == SketchPlugin_ConstraintMiddle::ID()) - theFeaturesToDelete.insert(aRefFeature); - else if (aRefFeatureKind == SketchPlugin_ConstraintLength::ID()) - theFeaturesToUpdate.insert(aRefFeature); - else if (aRefFeatureKind == SketchPlugin_ConstraintCoincidence::ID()) { - std::string anAttributeToBeModified; - AttributePoint2DPtr aCoincidentPoint; - AttributeRefAttrPtr anAttrA = aRefFeature->refattr(SketchPlugin_Constraint::ENTITY_A()); - AttributeRefAttrPtr anAttrB = aRefFeature->refattr(SketchPlugin_Constraint::ENTITY_B()); - bool isToFeature = false; - if (anAttrA->isObject() || anAttrB->isObject()) { /// coincidence to base feature - FeaturePtr aFeature = anAttrA->isObject() ? ModelAPI_Feature::feature(anAttrA->object()) - : FeaturePtr(); - isToFeature = aFeature.get() && aFeature == aBaseFeature; - anAttributeToBeModified = anAttrA->id(); - if (!isToFeature) { - aFeature = anAttrB->isObject() ? ModelAPI_Feature::feature(anAttrB->object()) - : FeaturePtr(); - isToFeature = aFeature.get() && aFeature == aBaseFeature; - anAttributeToBeModified = anAttrB->id(); - } - if (isToFeature) - aCoincidentPoint = SketchPlugin_ConstraintCoincidence::getPoint(aRefFeature); - } - if (!isToFeature) { /// coincidence to point on base feature - AttributePtr anAttribute; - - if (!anAttrA->isObject()) { - AttributePtr aCurAttribute = anAttrA->attr(); - if (aCurAttribute.get()) { - FeaturePtr aCurFeature = ModelAPI_Feature::feature(aCurAttribute->owner()); - if (aCurFeature.get() && aCurFeature == aBaseFeature) { - anAttribute = anAttrB->attr(); - anAttributeToBeModified = anAttrA->id(); - } - } - } - if (!anAttribute.get() && !anAttrB->isObject()) { - AttributePtr aCurAttribute = anAttrB->attr(); - if (aCurAttribute.get()) { - FeaturePtr aCurFeature = ModelAPI_Feature::feature(aCurAttribute->owner()); - if (aCurFeature.get() && aCurFeature == aBaseFeature) { - anAttribute = anAttrA->attr(); - anAttributeToBeModified = anAttrB->id(); - } - } - } - if (anAttribute.get()) - aCoincidentPoint = std::dynamic_pointer_cast(anAttribute); - } - if (aCoincidentPoint.get() && isToFeature) - theCoincidenceToFeature[aRefFeature] = std::make_pair(anAttributeToBeModified, - aCoincidentPoint); - } - } -} - -void SketchPlugin_ConstraintSplit::getRefAttributes(const FeaturePtr& theFeature, - std::map >& theRefs, - std::list& theRefsToFeature) -{ - theRefs.clear(); - - std::list aPointAttributes = - theFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); - std::set aPointAttributesSet; - - std::list::const_iterator aPIt = - aPointAttributes.begin(), aPLast = aPointAttributes.end(); - for (; aPIt != aPLast; aPIt++) - aPointAttributesSet.insert(*aPIt); - - std::set aRefsAttributes = getFeatureResult(theFeature)->data()->refsToMe(); - std::set aFRefsList = theFeature->data()->refsToMe(); - aRefsAttributes.insert(aFRefsList.begin(), aFRefsList.end()); - - std::set::const_iterator aIt; - for (aIt = aRefsAttributes.cbegin(); aIt != aRefsAttributes.cend(); ++aIt) { - AttributePtr anAttr = (*aIt); - FeaturePtr anAttrFeature = ModelAPI_Feature::feature(anAttr->owner()); - if (anAttrFeature.get() != this && - anAttr.get() && anAttr->attributeType() == ModelAPI_AttributeRefAttr::typeId()) { - AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(anAttr); - if (!aRefAttr->isObject()) { /// find attributes referenced to feature point attributes - AttributePtr anAttrInRef = aRefAttr->attr(); - if (anAttrInRef.get() && - aPointAttributesSet.find(anAttrInRef) != aPointAttributesSet.end()) { - if (theRefs.find(anAttrInRef) != theRefs.end()) - theRefs[anAttrInRef].push_back(aRefAttr); - else { - std::list anAttrList; - anAttrList.push_back(aRefAttr); - theRefs[anAttrInRef] = anAttrList; - } - } - } - else { /// find attributes referenced to feature itself - theRefsToFeature.push_back(anAttr); - } - } - } -} - -void SketchPlugin_ConstraintSplit::updateCoincidenceConstraintsToFeature( - const std::map, IdToPointPair>& theCoincidenceToFeature, - const std::set >& theFurtherCoincidences, - const std::set& theFeatureResults, - const FeaturePtr& theSplitFeature) -{ - if (theCoincidenceToFeature.empty()) - return; - - // we should build coincidence constraints to end of the split feature - std::set > aNewCoincidencesToSplitFeature; - AttributePoint2DPtr aStartPointAttr, anEndPointAttr; - getFeaturePoints(theSplitFeature, aStartPointAttr, anEndPointAttr); - if (theFurtherCoincidences.find(aStartPointAttr) == theFurtherCoincidences.end()) - aNewCoincidencesToSplitFeature.insert(aStartPointAttr); - if (theFurtherCoincidences.find(anEndPointAttr) == theFurtherCoincidences.end()) - aNewCoincidencesToSplitFeature.insert(anEndPointAttr); - - std::map::const_iterator aCIt = theCoincidenceToFeature.begin(), - aCLast = theCoincidenceToFeature.end(); -#ifdef DEBUG_SPLIT - std::cout << std::endl; - std::cout << "Coincidences to feature(modified):"<< std::endl; -#endif - for (; aCIt != aCLast; aCIt++) { - FeaturePtr aCoincFeature = aCIt->first; - std::string anAttributeId = aCIt->second.first; - AttributePoint2DPtr aCoincPoint = aCIt->second.second; - std::set::const_iterator aFCIt = theFurtherCoincidences.begin(), - aFCLast = theFurtherCoincidences.end(); - std::shared_ptr aCoincPnt = aCoincPoint->pnt(); - AttributePoint2DPtr aFeaturePointAttribute; - for (; aFCIt != aFCLast && !aFeaturePointAttribute.get(); aFCIt++) { - AttributePoint2DPtr aFCAttribute = *aFCIt; - if (aCoincPnt->isEqual(aFCAttribute->pnt())) - aFeaturePointAttribute = aFCAttribute; - } - if (aFeaturePointAttribute.get()) { - aCoincFeature->refattr(anAttributeId)->setObject(ResultPtr()); - aCoincFeature->refattr(anAttributeId)->setAttr(aFeaturePointAttribute); - // create new coincidences to split feature points - std::set::const_iterator aSFIt = aNewCoincidencesToSplitFeature.begin(), - aSFLast = aNewCoincidencesToSplitFeature.end(); - for (; aSFIt != aSFLast; aSFIt++) { - AttributePoint2DPtr aSFAttribute = *aSFIt; - if (aCoincPnt->isEqual(aSFAttribute->pnt())) { - std::string aSecondAttribute = SketchPlugin_Constraint::ENTITY_A(); - if (anAttributeId == SketchPlugin_Constraint::ENTITY_A()) - aSecondAttribute = SketchPlugin_Constraint::ENTITY_B(); - createConstraint(SketchPlugin_ConstraintCoincidence::ID(), - aSFAttribute, aCoincFeature->refattr(aSecondAttribute)->attr()); - } - } - } - else { - /// find feature by shape intersected the point - ResultPtr aResultForCoincidence = *(theFeatureResults.begin()); - - if (theFeatureResults.size() > 1) { // try to find point on additional feature - ResultPtr anAddtionalResult = *(theFeatureResults.begin()++); - GeomShapePtr aShape = anAddtionalResult->shape(); - - std::shared_ptr aPnt2d = aCoincPoint->pnt(); - std::shared_ptr aPoint = sketch()->to3D(aPnt2d->x(), aPnt2d->y()); - - std::shared_ptr aProjectedPoint; - if (ModelGeomAlgo_Point2D::isPointOnEdge(aShape, aPoint, aProjectedPoint)) - aResultForCoincidence = anAddtionalResult; - } - aCoincFeature->refattr(anAttributeId)->setObject(aResultForCoincidence); - } -#ifdef DEBUG_SPLIT - std::cout << " -" << getFeatureInfo(aCoincFeature) << std::endl; -#endif - } -} - -void SketchPlugin_ConstraintSplit::updateRefFeatureConstraints( - const ResultPtr& theFeatureBaseResult, - const std::list& theRefsToFeature) -{ - std::list::const_iterator anIt = theRefsToFeature.begin(), - aLast = theRefsToFeature.end(); - for (; anIt != aLast; anIt++) { - AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(*anIt); - if (aRefAttr.get()) - aRefAttr->setObject(theFeatureBaseResult); - } -} - -void SketchPlugin_ConstraintSplit::updateRefAttConstraints( - const std::map >& theBaseRefAttributes, - const std::set >& theModifiedAttributes) -{ -#ifdef DEBUG_SPLIT - std::cout << "SketchPlugin_ConstraintSplit::updateRefAttConstraints" << std::endl; -#endif - - std::set >::const_iterator - anIt = theModifiedAttributes.begin(), aLast = theModifiedAttributes.end(); - for (; anIt != aLast; anIt++) { - AttributePtr anAttribute = anIt->first; - - /// not found in references - if (theBaseRefAttributes.find(anAttribute) == theBaseRefAttributes.end()) - continue; - std::list aRefAttributes = theBaseRefAttributes.at(anAttribute); - std::list::const_iterator aRefIt = aRefAttributes.begin(), - aRLast = aRefAttributes.end(); - - AttributePtr aNewAttribute = anIt->second; - for (; aRefIt != aRLast; aRefIt++) { - AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(*aRefIt); - if (aRefAttr.get()) { - aRefAttr->setAttr(aNewAttribute); -#ifdef DEBUG_SPLIT - FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttr->owner()); - std::cout << " -" << getFeatureInfo(aFeature) << std::endl; -#endif - } - } - } -} - -void SketchPlugin_ConstraintSplit::splitLine(FeaturePtr& theSplitFeature, - FeaturePtr& theBaseFeatureModified, - FeaturePtr& theAfterFeature, - std::set& thePoints, - std::set& theCreatedFeatures, - std::set>& theModifiedAttributes) -{ - std::set aCreatedFeatures; - FeaturePtr aConstraintFeature; - theBaseFeatureModified = FeaturePtr(); // it will contain modified base feature - - SketchPlugin_Sketch* aSketch = sketch(); - if (!aSketch) - return; - - AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast( - data()->attribute(SketchPlugin_Constraint::VALUE())); - FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); - std::string aFeatureKind = aBaseFeature->getKind(); - if (aFeatureKind != SketchPlugin_Line::ID()) - return; - - AttributePoint2DPtr aFirstPointAttrOfSplit = - getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_A())); - AttributePoint2DPtr aSecondPointAttrOfSplit = - getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B())); - AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase; - - getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase); - if (!aStartPointAttrOfBase.get() && !anEndPointAttrOfBase.get()) { - setError("Error: Feature has no start and end points."); - return; - } - - arrangePointsOnLine(aStartPointAttrOfBase, anEndPointAttrOfBase, - aFirstPointAttrOfSplit, aSecondPointAttrOfSplit); - -#ifdef DEBUG_SPLIT - std::cout << "Arranged points (to build split between 1st and 2nd points:" << std::endl; - std::cout << "Start point: " << - ModelGeomAlgo_Point2D::getPointAttributeInfo(aStartPointAttrOfBase) << std::endl; - std::cout << "1st point: " << - ModelGeomAlgo_Point2D::getPointAttributeInfo(aFirstPointAttrOfSplit) << std::endl; - std::cout << "2nd point: " << - ModelGeomAlgo_Point2D::getPointAttributeInfo(aSecondPointAttrOfSplit) << std::endl; - std::cout << "End point: " << - ModelGeomAlgo_Point2D::getPointAttributeInfo(anEndPointAttrOfBase) << std::endl; -#endif - - /// create a split feature - theSplitFeature = - createLineFeature(aBaseFeature, aFirstPointAttrOfSplit, aSecondPointAttrOfSplit); - theCreatedFeatures.insert(theSplitFeature); - - // before split feature - if (aStartPointAttrOfBase->pnt()->isEqual(aFirstPointAttrOfSplit->pnt())) { - theModifiedAttributes.insert(std::make_pair(aStartPointAttrOfBase, - theSplitFeature->attribute(SketchPlugin_Line::START_ID()))); - } - else { - theBaseFeatureModified = aBaseFeature; ///< use base feature to store all constraints here - /// move end arc point to start of split - } - - // after split feature - if (!aSecondPointAttrOfSplit->pnt()->isEqual(anEndPointAttrOfBase->pnt())) { - FeaturePtr aFeature; - if (!theBaseFeatureModified.get()) { - aFeature = aBaseFeature; ///< use base feature to store all constraints here - fillAttribute(aFeature->attribute(SketchPlugin_Line::START_ID()), aSecondPointAttrOfSplit); - aFeature->execute(); // to update result - } - else { - aFeature = createLineFeature(aBaseFeature, aSecondPointAttrOfSplit, anEndPointAttrOfBase); - theCreatedFeatures.insert(aFeature); - theModifiedAttributes.insert(std::make_pair(anEndPointAttrOfBase, - aFeature->attribute(SketchPlugin_Line::END_ID()))); - } - aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(), - theSplitFeature->attribute(SketchPlugin_Line::END_ID()), - aFeature->attribute(SketchPlugin_Line::START_ID())); - theCreatedFeatures.insert(aConstraintFeature); - - thePoints.insert(std::dynamic_pointer_cast - (aFeature->attribute(SketchPlugin_Line::START_ID()))); - thePoints.insert(std::dynamic_pointer_cast - (aFeature->attribute(SketchPlugin_Line::END_ID()))); - - if (!theBaseFeatureModified.get()) - theBaseFeatureModified = aFeature; - else - theAfterFeature = aFeature; - } - else { - thePoints.insert(std::dynamic_pointer_cast - (theSplitFeature->attribute(SketchPlugin_Line::END_ID()))); - theModifiedAttributes.insert(std::make_pair(anEndPointAttrOfBase, - theSplitFeature->attribute(SketchPlugin_Line::END_ID()))); - } - // base split, that is defined before split feature should be changed at end - // (after the after feature creation). Otherwise modified value will be used in after feature - // before split feature - if (!aStartPointAttrOfBase->pnt()->isEqual(aFirstPointAttrOfSplit->pnt())) { - /// move end arc point to start of split - fillAttribute(theBaseFeatureModified->attribute(SketchPlugin_Line::END_ID()), - aFirstPointAttrOfSplit); - theBaseFeatureModified->execute(); // to update result - aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(), - theBaseFeatureModified->attribute(SketchPlugin_Line::END_ID()), - theSplitFeature->attribute(SketchPlugin_Line::START_ID())); - theCreatedFeatures.insert(aConstraintFeature); - - thePoints.insert(std::dynamic_pointer_cast - (theBaseFeatureModified->attribute(SketchPlugin_Line::START_ID()))); - thePoints.insert(std::dynamic_pointer_cast - (theBaseFeatureModified->attribute(SketchPlugin_Line::END_ID()))); - } - else - thePoints.insert(std::dynamic_pointer_cast - (theSplitFeature->attribute(SketchPlugin_Line::START_ID()))); - -#ifdef CREATE_CONSTRAINTS - // additional constraints between split and base features - aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintParallel::ID(), - getFeatureResult(aBaseFeature), - getFeatureResult(theSplitFeature)); - theCreatedFeatures.insert(aConstraintFeature); - if (theAfterFeature.get()) { - aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintParallel::ID(), - getFeatureResult(aBaseFeature), - getFeatureResult(theAfterFeature)); - theCreatedFeatures.insert(aConstraintFeature); - } -#endif -} - -void SketchPlugin_ConstraintSplit::splitArc(FeaturePtr& theSplitFeature, - FeaturePtr& theBaseFeatureModified, - FeaturePtr& theAfterFeature, - std::set& thePoints, - std::set& theCreatedFeatures, - std::set>& theModifiedAttributes) -{ - std::set aCreatedFeatures; - FeaturePtr aConstraintFeature; - theBaseFeatureModified = FeaturePtr(); // it will contain modified base feature - - SketchPlugin_Sketch* aSketch = sketch(); - if (!aSketch) - return; - - AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast( - data()->attribute(SketchPlugin_Constraint::VALUE())); - FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); - std::string aFeatureKind = aBaseFeature->getKind(); - if (aFeatureKind != SketchPlugin_Arc::ID()) - return; - - AttributePoint2DPtr aFirstPointAttrOfSplit = - getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_A())); - AttributePoint2DPtr aSecondPointAttrOfSplit = - getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B())); - AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase; - getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase); - if (!aStartPointAttrOfBase.get() && !anEndPointAttrOfBase.get()) { - setError("Error: Feature has no start and end points."); - return; - } - - arrangePointsOnArc(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase, - aFirstPointAttrOfSplit, aSecondPointAttrOfSplit); -#ifdef DEBUG_SPLIT - std::cout << "Arranged points (to build split between 1st and 2nd points:" << std::endl; - std::cout << "Start point: " << - ModelGeomAlgo_Point2D::getPointAttributeInfo(aStartPointAttrOfBase) << std::endl; - std::cout << "1st point: " << - ModelGeomAlgo_Point2D::getPointAttributeInfo(aFirstPointAttrOfSplit) << std::endl; - std::cout << "2nd point: " << - ModelGeomAlgo_Point2D::getPointAttributeInfo(aSecondPointAttrOfSplit) << std::endl; - std::cout << "End point: " << - ModelGeomAlgo_Point2D::getPointAttributeInfo(anEndPointAttrOfBase) << std::endl; -#endif - - /// split feature - theSplitFeature = createArcFeature(aBaseFeature, aFirstPointAttrOfSplit, aSecondPointAttrOfSplit); - theCreatedFeatures.insert(theSplitFeature); - - // before split feature - if (aStartPointAttrOfBase->pnt()->isEqual(aFirstPointAttrOfSplit->pnt())) { - theModifiedAttributes.insert(std::make_pair(aStartPointAttrOfBase, - theSplitFeature->attribute(SketchPlugin_Arc::START_ID()))); - } - else { - theBaseFeatureModified = aBaseFeature; ///< use base feature to store all constraints here - /// move end arc point to start of split - } - - // after split feature - if (!aSecondPointAttrOfSplit->pnt()->isEqual(anEndPointAttrOfBase->pnt())) { - FeaturePtr aFeature; - if (!theBaseFeatureModified.get()) { - aFeature = aBaseFeature; ///< use base feature to store all constraints here - fillAttribute(aFeature->attribute(SketchPlugin_Arc::START_ID()), aSecondPointAttrOfSplit); - aFeature->execute(); // to update result - } - else { - aFeature = createArcFeature(aBaseFeature, aSecondPointAttrOfSplit, anEndPointAttrOfBase); - theCreatedFeatures.insert(aFeature); - theModifiedAttributes.insert(std::make_pair(anEndPointAttrOfBase, - aFeature->attribute(SketchPlugin_Arc::END_ID()))); - } - aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(), - theSplitFeature->attribute(SketchPlugin_Arc::END_ID()), - aFeature->attribute(SketchPlugin_Arc::START_ID())); - theCreatedFeatures.insert(aConstraintFeature); - - thePoints.insert(std::dynamic_pointer_cast - (aFeature->attribute(SketchPlugin_Arc::START_ID()))); - thePoints.insert(std::dynamic_pointer_cast - (aFeature->attribute(SketchPlugin_Arc::END_ID()))); - - if (!theBaseFeatureModified.get()) - theBaseFeatureModified = aFeature; - else - theAfterFeature = aFeature; - } - else { - thePoints.insert(std::dynamic_pointer_cast - (theSplitFeature->attribute(SketchPlugin_Arc::END_ID()))); - theModifiedAttributes.insert(std::make_pair(anEndPointAttrOfBase, - theSplitFeature->attribute(SketchPlugin_Arc::END_ID()))); - } - // base split, that is defined before split feature should be changed at end - // (after the after feature creation). Otherwise modified value will be used in after feature - // before split feature - if (!aStartPointAttrOfBase->pnt()->isEqual(aFirstPointAttrOfSplit->pnt())) { - /// move end arc point to start of split - fillAttribute(theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID()), - aFirstPointAttrOfSplit); - theBaseFeatureModified->execute(); // to update result - aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(), - theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID()), - theSplitFeature->attribute(SketchPlugin_Arc::START_ID())); - theCreatedFeatures.insert(aConstraintFeature); - - thePoints.insert(std::dynamic_pointer_cast - (theBaseFeatureModified->attribute(SketchPlugin_Arc::START_ID()))); - thePoints.insert(std::dynamic_pointer_cast - (theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID()))); - } - else - thePoints.insert(std::dynamic_pointer_cast - (theSplitFeature->attribute(SketchPlugin_Arc::START_ID()))); - - // additional constraints between split and base features -#ifdef CREATE_CONSTRAINTS - aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintEqual::ID(), - getFeatureResult(aBaseFeature), - getFeatureResult(theSplitFeature)); - theCreatedFeatures.insert(aConstraintFeature); - aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintTangent::ID(), - getFeatureResult(theSplitFeature), - getFeatureResult(aBaseFeature)); - theCreatedFeatures.insert(aConstraintFeature); - if (theAfterFeature.get()) { - aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintEqual::ID(), - getFeatureResult(aBaseFeature), - getFeatureResult(theAfterFeature)); - theCreatedFeatures.insert(aConstraintFeature); - aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintTangent::ID(), - getFeatureResult(theSplitFeature), - getFeatureResult(theAfterFeature)); - theCreatedFeatures.insert(aConstraintFeature); - } -#endif -} - -void SketchPlugin_ConstraintSplit::splitCircle(FeaturePtr& theSplitFeature, - FeaturePtr& theBaseFeatureModified, - FeaturePtr& theAfterFeature, - std::set& thePoints, - std::set& theCreatedFeatures, - std::set>& theModifiedAttributes) -{ - std::set aCreatedFeatures; - FeaturePtr aConstraintFeature; - theBaseFeatureModified = FeaturePtr(); // it will contain modified base feature - - SketchPlugin_Sketch* aSketch = sketch(); - if (!aSketch) - return; - - AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast( - data()->attribute(SketchPlugin_Constraint::VALUE())); - FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); - std::string aFeatureKind = aBaseFeature->getKind(); - if (aFeatureKind != SketchPlugin_Circle::ID()) - return; - - AttributePoint2DPtr aFirstPointAttrOfSplit = - getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_A())); - AttributePoint2DPtr aSecondPointAttrOfSplit = - getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B())); - - /// split feature - theSplitFeature = - createArcFeature(aBaseFeature, aFirstPointAttrOfSplit, aSecondPointAttrOfSplit); - bool aSplitReversed = std::dynamic_pointer_cast(theSplitFeature)->isReversed(); - theCreatedFeatures.insert(theSplitFeature); - - /// base feature is a left part of the circle - theBaseFeatureModified = createArcFeature(aBaseFeature, - aFirstPointAttrOfSplit, aSecondPointAttrOfSplit); - std::dynamic_pointer_cast( - theBaseFeatureModified)->setReversed(!aSplitReversed); - theBaseFeatureModified->execute(); - - theModifiedAttributes.insert( - std::make_pair(aBaseFeature->attribute(SketchPlugin_Circle::CENTER_ID()), - theBaseFeatureModified->attribute(SketchPlugin_Arc::CENTER_ID()))); - - theCreatedFeatures.insert(theBaseFeatureModified); - - thePoints.insert(std::dynamic_pointer_cast - (theBaseFeatureModified->attribute(SketchPlugin_Arc::START_ID()))); - thePoints.insert(std::dynamic_pointer_cast - (theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID()))); - - // additional constraints between split and base features - aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(), - theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID()), - theSplitFeature->attribute(SketchPlugin_Arc::END_ID())); - theCreatedFeatures.insert(aConstraintFeature); - aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(), - theBaseFeatureModified->attribute(SketchPlugin_Arc::START_ID()), - theSplitFeature->attribute(SketchPlugin_Arc::START_ID())); - theCreatedFeatures.insert(aConstraintFeature); - -#ifdef CREATE_CONSTRAINTS - aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintTangent::ID(), - getFeatureResult(theSplitFeature), - getFeatureResult(theBaseFeatureModified)); - theCreatedFeatures.insert(aConstraintFeature); -#endif -} - -void SketchPlugin_ConstraintSplit::arrangePointsOnLine( - const AttributePoint2DPtr& theStartPointAttr, - const AttributePoint2DPtr& theEndPointAttr, - AttributePoint2DPtr& theFirstPointAttr, - AttributePoint2DPtr& theLastPointAttr) const -{ - // if first point is closer to last point, swap first and last values - if (theStartPointAttr->pnt()->distance(theFirstPointAttr->pnt()) > - theStartPointAttr->pnt()->distance(theLastPointAttr->pnt())) { - AttributePoint2DPtr aTmpPoint = theFirstPointAttr; - theFirstPointAttr = theLastPointAttr; - theLastPointAttr = aTmpPoint; - } -} - -void SketchPlugin_ConstraintSplit::arrangePointsOnArc( - const FeaturePtr& theArc, - const std::shared_ptr& theStartPointAttr, - const std::shared_ptr& theEndPointAttr, - std::shared_ptr& theFirstPointAttr, - std::shared_ptr& theSecondPointAttr) const -{ - static const double anAngleTol = 1.e-12; - - std::shared_ptr aCenter = std::dynamic_pointer_cast( - theArc->attribute(SketchPlugin_Arc::CENTER_ID()))->pnt(); - bool isReversed = theArc->boolean(SketchPlugin_Arc::REVERSED_ID())->value(); - - // collect directions to each point - std::shared_ptr aStartDir( - new GeomAPI_Dir2d(theStartPointAttr->pnt()->xy()->decreased(aCenter->xy()))); - std::shared_ptr aFirstPtDir( - new GeomAPI_Dir2d(theFirstPointAttr->pnt()->xy()->decreased(aCenter->xy()))); - std::shared_ptr aSecondPtDir( - new GeomAPI_Dir2d(theSecondPointAttr->pnt()->xy()->decreased(aCenter->xy()))); - - // sort points by their angular values - double aFirstPtAngle = aStartDir->angle(aFirstPtDir); - double aSecondPtAngle = aStartDir->angle(aSecondPtDir); - double aPeriod = isReversed ? -2.0 * PI : 2.0 * PI; - if (fabs(aFirstPtAngle) > anAngleTol && isReversed == (aFirstPtAngle > 0.)) - aFirstPtAngle += aPeriod; - if (fabs(aSecondPtAngle) > anAngleTol && isReversed == (aSecondPtAngle > 0.)) - aSecondPtAngle += aPeriod; - - if (fabs(aFirstPtAngle) > fabs(aSecondPtAngle)) { - AttributePoint2DPtr aTmpPoint = theFirstPointAttr; - theFirstPointAttr = theSecondPointAttr; - theSecondPointAttr = aTmpPoint; - } -} - -void SketchPlugin_ConstraintSplit::fillAttribute(const AttributePtr& theModifiedAttribute, - const AttributePtr& theSourceAttribute) -{ - std::string anAttributeType = theModifiedAttribute->attributeType(); - if (anAttributeType == GeomDataAPI_Point2D::typeId()) { - AttributePoint2DPtr aModifiedAttribute = std::dynamic_pointer_cast( - theModifiedAttribute); - AttributePoint2DPtr aSourceAttribute = std::dynamic_pointer_cast( - theSourceAttribute); - - if (aModifiedAttribute.get() && aSourceAttribute.get()) - aModifiedAttribute->setValue(aSourceAttribute->pnt()); - } - else if (anAttributeType == ModelAPI_AttributeBoolean::typeId()) { - AttributeBooleanPtr aModifiedAttribute = std::dynamic_pointer_cast( - theModifiedAttribute); - AttributeBooleanPtr aSourceAttribute = std::dynamic_pointer_cast( - theSourceAttribute); - - if (aModifiedAttribute.get() && aSourceAttribute.get()) - aModifiedAttribute->setValue(aSourceAttribute->value()); - } -} - -FeaturePtr SketchPlugin_ConstraintSplit::createLineFeature(const FeaturePtr& theBaseFeature, - const AttributePtr& theFirstPointAttr, - const AttributePtr& theSecondPointAttr) -{ - FeaturePtr aFeature; - SketchPlugin_Sketch* aSketch = sketch(); - if (!aSketch || !theBaseFeature.get()) - return aFeature; - - aFeature = aSketch->addFeature(SketchPlugin_Line::ID()); - - fillAttribute(aFeature->attribute(SketchPlugin_Line::START_ID()), theFirstPointAttr); - fillAttribute(aFeature->attribute(SketchPlugin_Line::END_ID()), theSecondPointAttr); - - fillAttribute(aFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID()), - theBaseFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID())); - - aFeature->execute(); // to obtain result - - return aFeature; -} - -FeaturePtr SketchPlugin_ConstraintSplit::createArcFeature(const FeaturePtr& theBaseFeature, - const AttributePtr& theFirstPointAttr, - const AttributePtr& theSecondPointAttr) -{ - FeaturePtr aFeature; - SketchPlugin_Sketch* aSketch = sketch(); - if (!aSketch || !theBaseFeature.get()) - return aFeature; - - std::string aCenterAttributeId; - if (theBaseFeature->getKind() == SketchPlugin_Arc::ID()) - aCenterAttributeId = SketchPlugin_Arc::CENTER_ID(); - else if (theBaseFeature->getKind() == SketchPlugin_Circle::ID()) - aCenterAttributeId = SketchPlugin_Circle::CENTER_ID(); - - if (aCenterAttributeId.empty()) - return aFeature; - - aFeature = aSketch->addFeature(SketchPlugin_Arc::ID()); - // update fillet arc: make the arc correct for sure, so, it is not needed to process - // the "attribute updated" - // by arc; moreover, it may cause cyclicity in hte mechanism of updater - bool aWasBlocked = aFeature->data()->blockSendAttributeUpdated(true); - - fillAttribute(aFeature->attribute(SketchPlugin_Arc::CENTER_ID()), - theBaseFeature->attribute(aCenterAttributeId)); - fillAttribute(aFeature->attribute(SketchPlugin_Arc::START_ID()), theFirstPointAttr); - fillAttribute(aFeature->attribute(SketchPlugin_Arc::END_ID()), theSecondPointAttr); - - fillAttribute(aFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID()), - theBaseFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID())); - - /// fill referersed state of created arc as it is on the base arc - if (theBaseFeature->getKind() == SketchPlugin_Arc::ID()) { - bool aReversed = theBaseFeature->boolean(SketchPlugin_Arc::REVERSED_ID())->value(); - aFeature->boolean(SketchPlugin_Arc::REVERSED_ID())->setValue(aReversed); - } - aFeature->data()->blockSendAttributeUpdated(aWasBlocked); - aFeature->execute(); // to obtain result - - return aFeature; -} - -FeaturePtr SketchPlugin_ConstraintSplit::createConstraint(const std::string& theConstraintId, - const AttributePtr& theFirstAttribute, - const AttributePtr& theSecondAttribute) -{ - FeaturePtr aConstraint = sketch()->addFeature(theConstraintId); - AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast( - aConstraint->attribute(SketchPlugin_Constraint::ENTITY_A())); - aRefAttr->setAttr(theFirstAttribute); - - aRefAttr = std::dynamic_pointer_cast( - aConstraint->attribute(SketchPlugin_Constraint::ENTITY_B())); - aRefAttr->setAttr(theSecondAttribute); - - return aConstraint; -} - -FeaturePtr SketchPlugin_ConstraintSplit::createConstraintForObjects( - const std::string& theConstraintId, - const ObjectPtr& theFirstObject, - const ObjectPtr& theSecondObject) -{ - FeaturePtr aConstraint = sketch()->addFeature(theConstraintId); - AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast( - aConstraint->attribute(SketchPlugin_Constraint::ENTITY_A())); - aRefAttr->setObject(theFirstObject); - - aRefAttr = std::dynamic_pointer_cast( - aConstraint->attribute(SketchPlugin_Constraint::ENTITY_B())); - aRefAttr->setObject(theSecondObject); - - return aConstraint; -} - -void SketchPlugin_ConstraintSplit::updateFeaturesAfterSplit( - const std::set& theFeaturesToUpdate) -{ - std::set::const_iterator anIt = theFeaturesToUpdate.begin(), - aLast = theFeaturesToUpdate.end(); - for (; anIt != aLast; anIt++) { - FeaturePtr aRefFeature = std::dynamic_pointer_cast(*anIt); - std::string aRefFeatureKind = aRefFeature->getKind(); - if (aRefFeatureKind == SketchPlugin_ConstraintLength::ID()) { - std::shared_ptr aLenghtFeature = - std::dynamic_pointer_cast(*anIt); - if (aLenghtFeature.get()) { - std::shared_ptr aValueAttr = std::dynamic_pointer_cast< - ModelAPI_AttributeDouble>(aLenghtFeature->attribute(SketchPlugin_Constraint::VALUE())); - double aValue; - if (aLenghtFeature->computeLenghtValue(aValue) && aValueAttr.get()) - aValueAttr->setValue(aValue); - } - } - } -} - -std::shared_ptr SketchPlugin_ConstraintSplit::getFeatureResult( - const std::shared_ptr& theFeature) -{ - std::shared_ptr aResult; - - std::string aFeatureKind = theFeature->getKind(); - if (aFeatureKind == SketchPlugin_Line::ID()) - aResult = theFeature->firstResult(); - else if (aFeatureKind == SketchPlugin_Arc::ID()) - aResult = theFeature->lastResult(); - else if (aFeatureKind == SketchPlugin_Circle::ID()) - aResult = theFeature->lastResult(); - - return aResult; -} - -std::set > SketchPlugin_ConstraintSplit::getEdgeAttributes( - const std::shared_ptr& theFeature) -{ - std::set > anAttributes; - - std::string aFeatureKind = theFeature->getKind(); - if (aFeatureKind == SketchPlugin_Line::ID()) { - anAttributes.insert(theFeature->attribute(SketchPlugin_Line::START_ID())); - anAttributes.insert(theFeature->attribute(SketchPlugin_Line::END_ID())); - } - else if (aFeatureKind == SketchPlugin_Arc::ID()) { - anAttributes.insert(theFeature->attribute(SketchPlugin_Arc::START_ID())); - anAttributes.insert(theFeature->attribute(SketchPlugin_Arc::END_ID())); - } - else if (aFeatureKind == SketchPlugin_Circle::ID()) { - } - - return anAttributes; -} - -#ifdef _DEBUG -std::string SketchPlugin_ConstraintSplit::getFeatureInfo( - const std::shared_ptr& theFeature, - const bool isUseAttributesInfo) -{ - std::string anInfo; - if (!theFeature.get()) { - return "none"; - } - - if (theFeature->data()->isValid()) - anInfo.append(theFeature->data()->name().c_str()); - - if (isUseAttributesInfo) { - std::string aPointsInfo = ModelGeomAlgo_Point2D::getPontAttributesInfo(theFeature, - getEdgeAttributes(theFeature)); - /// processing of feature with point 2d attributes, like line, arc, circle - if (!aPointsInfo.empty()) { - anInfo += ": "; - anInfo += "\n"; - anInfo += aPointsInfo; - } - else { /// process constraint coincidence, find points in ref attr attributes - std::list anAttrs = theFeature->data()->attributes( - ModelAPI_AttributeRefAttr::typeId()); - std::list::const_iterator anIt = anAttrs.begin(), aLast = anAttrs.end(); - std::string anAttributesInfo; - for(; anIt != aLast; anIt++) { - if (!anAttributesInfo.empty()) { - anAttributesInfo.append(", "); - anAttributesInfo += "\n"; - } - AttributePtr anAttr = *anIt; - std::string aValue = "not defined"; - std::string aType = anAttr->attributeType(); - if (aType == ModelAPI_AttributeRefAttr::typeId()) { - std::shared_ptr aRefAttr = - std::dynamic_pointer_cast(anAttr); - if (aRefAttr.get()) { - if (aRefAttr->isObject()) { - FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttr->object()); - aValue = "" + getFeatureInfo(aFeature, false); - } - else { - AttributePtr anAttribute = aRefAttr->attr(); - if (anAttribute.get()) { - FeaturePtr aFeature = ModelAPI_Feature::feature(anAttribute->owner()); - aValue = "" + ModelGeomAlgo_Point2D::getPointAttributeInfo(anAttribute) + - " [" + getFeatureInfo(aFeature, false) + "]"; - } - } - } - } - anAttributesInfo.append(" " + anAttr->id() + ": " + aValue); - } - if (!anAttributesInfo.empty()) - anInfo = anInfo + "\n" + anAttributesInfo; - } - } - return anInfo; -} -#endif diff --git a/src/SketchPlugin/SketchPlugin_ConstraintSplit.h b/src/SketchPlugin/SketchPlugin_ConstraintSplit.h deleted file mode 100755 index e4e1bc770..000000000 --- a/src/SketchPlugin/SketchPlugin_ConstraintSplit.h +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> - -// File: SketchPlugin_ConstraintSplit.h -// Created: 25 Aug 2016 -// Author: Natalia ERMOLAEVA - -#ifndef SketchPlugin_ConstraintSplit_H_ -#define SketchPlugin_ConstraintSplit_H_ - -#include "SketchPlugin.h" -#include -#include "SketchPlugin_ConstraintBase.h" - -class GeomDataAPI_Point2D; -class ModelAPI_Feature; -class ModelAPI_Result; - -typedef std::pair > IdToPointPair; - -/** \class SketchPlugin_ConstraintSplit - * \ingroup Plugins - * \brief Feature for creation of a new constraint splitting object. Entities for split: - * - Linear segment by point(s) on this line - * - Arc by point(s) on this arc - * - Circle by at least 2 split-points on this circle - * - * The following constraints will be applied after split to keep the divided segments geometry: - * - Coincident constraints for both parts of created segments in the point of splitting - * - For linear segments parallel, for circles - tangent constraint, for arc - tangent and equal - * constraints. In case of three segments in result two couple of constraints are created - * - parallel and equal constraints: the first is between 1st and middle entity, the second is - * between 1st and 3rd. - * - tangency constraints: the first between 1st and 2nd, the second between 2nd and 3rd. - * - Constraints assigned to the feature before split operation are assigned after using rules: - * - Coincident constraints are assigned to the segment where they belong to. Segment of split - * has only a coincidence to the neighbor segment. All constraints used in the splitting of - * this segment are moved to point of neighbor segment. If constraint was initially built - * to the point of splitting segment, it stays for this point. - * - Geometrical and dimensional constraints are assigned to one of result segment, not the - * selected for split. In case of 3 result segments, this will be the segment nearest to the - * start point of arc/line. - * - Replication constraint used split feature will be deleted in the same way as it is deleted - * by any of entity delete in sketch which is used in this constraint. - * - * This constraint has three attributes: - * SketchPlugin_Constraint::VALUE() contains reference object to be splitted - * SketchPlugin_Constraint::ENTITY_A() and SketchPlugin_Constraint::ENTITY_B() for the points of split; - * - */ -class SketchPlugin_ConstraintSplit : public SketchPlugin_ConstraintBase -{ - public: - /// Split constraint kind - inline static const std::string& ID() - { - static const std::string MY_CONSTRAINT_SPLIT_ID("SketchConstraintSplit"); - return MY_CONSTRAINT_SPLIT_ID; - } - /// \brief Returns the kind of a feature - SKETCHPLUGIN_EXPORT virtual const std::string& getKind() - { - static std::string MY_KIND = SketchPlugin_ConstraintSplit::ID(); - return MY_KIND; - } - - /// \brief Creates a new part document if needed - SKETCHPLUGIN_EXPORT virtual void execute(); - - /// \brief Request for initialization of data model of the feature: adding all attributes - SKETCHPLUGIN_EXPORT virtual void initAttributes(); - - /// Reimplemented from ModelAPI_Feature::isMacro(). - /// \returns true - SKETCHPLUGIN_EXPORT virtual bool isMacro() const; - - /// Reimplemented from ModelAPI_Feature::isPreviewNeeded(). Returns false. - /// This is necessary to perform execute only by apply the feature - SKETCHPLUGIN_EXPORT virtual bool isPreviewNeeded() const { return false; } - - /// \brief Use plugin manager for features creation - SketchPlugin_ConstraintSplit(); - - /// Returns the AIS preview - SKETCHPLUGIN_EXPORT virtual AISObjectPtr getAISObject(AISObjectPtr thePrevious); - -private: - /// Returns geom point attribute of the feature bounds. It processes line or arc. - /// For circle feature, the result attributes are null - /// \param theFeature a source feature - /// \param theStartPointAttr an out attribute to start point - /// \param theStartPointAttr an out attribute to end point - void getFeaturePoints(const FeaturePtr& theFeature, - std::shared_ptr& theStartPointAttr, - std::shared_ptr& theEndPointAttr); - - /// Returns cast of attribute to geometrical point if the attribute is a ref attr attribute - /// \param theAttribute an attribute - /// \param geom point 2D or NULL - std::shared_ptr getPointOfRefAttr(const AttributePtr& theAttribute); - - /// Obtains those constraints of the feature that should be modified. output maps contain - /// point of coincidence and attribute id to be modified after split - /// \param theFeaturesToDelete [out] constrains that will be deleted after split - /// \param theFeaturesToUpdate [out] constrains that will be updated after split - /// \param theTangentFeatures [out] tangent feature to be connected to new feature - /// \param theCoincidenceToFeature [out] coincidence to feature to be connected to new feature - /// \param theCoincidenceToPoint [out] coincidence to point be connected to new feature - void getConstraints(std::set>& theFeaturesToDelete, - std::set>& theFeaturesToUpdate, - std::map, IdToPointPair>& theCoincidenceToFeature); - - /// Obtains references to feature point attributes and to feature, - /// e.g. for feature line: 1st container is - /// <1st line point, list > - /// <2nd line point, list<> > - /// for feature circle 2nd container is - /// \param theFeature an investigated feature - /// \param theRefs a container of list of referenced attributes - void getRefAttributes(const FeaturePtr& theFeature, - std::map >& theRefs, - std::list& theRefsToFeature); - - /// Move coincidence constraint from feature to point if it is found - /// \param theCoincidenceToFeature coincidence to feature to be connected to new feature - /// \param theFurtherCoincidences a list of points where coincidences will be build - /// \param theFeatureResults created results after split where constaint might be connected - /// \param theSplitFeature feature created by split, new coincidences to points should be created - /// if theCoincidenceToFeature contains equal points - void updateCoincidenceConstraintsToFeature( - const std::map, IdToPointPair>& theCoincidenceToFeature, - const std::set >& theFurtherCoincidences, - const std::set& theFeatureResults, - const FeaturePtr& theSplitFeature); - - /// Move constraints from base feature to given feature - /// \param theFeature a base feature - /// \param theRefsToFeature list of attributes referenced to base feature - void updateRefFeatureConstraints(const std::shared_ptr& theFeatureBaseResult, - const std::list& theRefsToFeature); - - /// Move constraints from attribute of base feature to attribute after modification - /// \param theBaseRefAttributes container of references to the attributes of base feature - /// \param theModifiedAttributes container of attributes placed instead of base attributes - /// at the same place - void updateRefAttConstraints( - const std::map >& theBaseRefAttributes, - const std::set >& theModifiedAttributes); - - /// Make the base object is splitted by the point attributes - /// \param theSplitFeature a result split feature - /// \param theBeforeFeature a feature between start point and the 1st point of split feature - /// \param theAfterFeature a feature between last point of split feature and the end point - /// \param thePoints a list of points where coincidences will be build - /// \param theCreatedFeatures a container of created features - /// \param theModifiedAttributes a container of attribute on base - /// feature to attribute on new feature - void splitLine(std::shared_ptr& theSplitFeature, - std::shared_ptr& theBeforeFeature, - std::shared_ptr& theAfterFeature, - std::set >& thePoints, - std::set>& theCreatedFeatures, - std::set>& theModifiedAttributes); - - /// Make the base object is splitted by the point attributes - /// \param theSplitFeature a result split feature - /// \param theBeforeFeature a feature between start point and the 1st point of split feature - /// \param theAfterFeature a feature between last point of split feature and the end point - /// \param thePoints a list of points where coincidences will be build - /// \param theCreatedFeatures a container of created features - void splitArc(std::shared_ptr& theSplitFeature, - std::shared_ptr& theBeforeFeature, - std::shared_ptr& theAfterFeature, - std::set >& thePoints, - std::set>& theCreatedFeatures, - std::set>& theModifiedAttributes); - - /// Make the base object is splitted by the point attributes - /// \param theSplitFeature a result split feature - /// \param theBeforeFeature a feature between start point and the 1st point of split feature - /// \param theAfterFeature a feature between last point of split feature and the end point - /// \param thePoints a list of points where coincidences will be build - /// \param theCreatedFeatures a container of created features - void splitCircle(std::shared_ptr& theSplitFeature, - std::shared_ptr& theBeforeFeature, - std::shared_ptr& theAfterFeature, - std::set >& thePoints, - std::set>& theCreatedFeatures, - std::set>& theModifiedAttributes); - - /// Correct the first and the second point to provide condition that the first is closer to - /// the start point and the second point - to the last end of current segment. To rearrange - /// them if this condition is not satisfied. - /// \param theStartPointAttr a start point of a segment - /// \param theEndPointAttr an end point of a segment - /// \param theFirstPointAttr a start point of a segment - /// \param theSecondPointAttr an end point of a segment - void arrangePointsOnLine(const std::shared_ptr& theStartPointAttr, - const std::shared_ptr& theEndPointAttr, - std::shared_ptr& theFirstPointAttr, - std::shared_ptr& theSecondPointAttr) const; - - /// Correct the first and the second point to provide condition that the first is closer to - /// the start point and the second point - to the last end of current segment. To rearrange - /// them if this condition is not satisfied. - /// \param theArc an arc to be split - /// \param theStartPointAttr a start point of a segment - /// \param theEndPointAttr an end point of a segment - /// \param theFirstPointAttr a start point of a segment - /// \param theSecondPointAttr an end point of a segment - void arrangePointsOnArc(const FeaturePtr& theArc, - const std::shared_ptr& theStartPointAttr, - const std::shared_ptr& theEndPointAttr, - std::shared_ptr& theFirstPointAttr, - std::shared_ptr& theSecondPointAttr) const; - - /// Fill attribute by value of another attribute. It processes only Point 2D attributes. - /// \param theModifiedAttribute an attribute of GeomDataAPI_Point2D on feature to be modified - /// \param theSourceAttribute an attribute of GeomDataAPI_Point2D to obtain data - void fillAttribute(const AttributePtr& theModifiedAttribute, - const AttributePtr& theSourceAttribute); - - /// Creates a line feature filled by center of base feature and given points - /// \param theBaseFeature another arc feature - /// \param theFirstAttribute an attribute with coordinates for the start point - /// \param theSecondAttribute an attribute with coordinates for the end point - FeaturePtr createLineFeature(const FeaturePtr& theBaseFeature, - const AttributePtr& theFirstPointAttr, - const AttributePtr& theSecondPointAttr); - - /// Creates an arc feature filled by center of base feature and given points - /// \param theBaseFeature another arc feature - /// \param theFirstAttribute an attribute with coordinates for the start point - /// \param theSecondAttribute an attribute with coordinates for the end point - FeaturePtr createArcFeature(const FeaturePtr& theBaseFeature, - const AttributePtr& theFirstPointAttr, - const AttributePtr& theSecondPointAttr); - - /// Add feature coincidence constraint between given attributes - /// \param theConstraintId a constraint index - /// \param theFirstAttribute an attribute of further coincidence - /// \param theSecondAttribute an attribute of further coincidence - std::shared_ptr createConstraint(const std::string& theConstraintId, - const std::shared_ptr& theFirstAttribute, - const std::shared_ptr& theSecondAttribute); - - /// Add feature coincidence constraint between given attributes - /// \param theConstraintId a constraint index - /// \param theFirstAttribute an attribute of further coincidence - /// \param theFirstAttribute an attribute of further coincidence - std::shared_ptr createConstraintForObjects(const std::string& theConstraintId, - const std::shared_ptr& theFirstObject, - const std::shared_ptr& theSecondObject); - - /// Add feature coincidence constraint between given attributes - /// \param theFeaturesToUpdate a constraint index - void updateFeaturesAfterSplit(const std::set& theFeaturesToUpdate); - - /// Result result of the feature to build constraint with. For arc, circle it is an edge result. - /// \param theFeature a feature - /// \return result object - std::shared_ptr getFeatureResult( - const std::shared_ptr& theFeature); - - /// Returns attributes of the feature, used in edge build, for arc it is end and start points - /// \param theFeature a feature - /// \return container of attributes - std::set > getEdgeAttributes( - const std::shared_ptr& theFeature); - -#ifdef _DEBUG - /// Return feature name, kind, point attribute values united in a string - /// \param theFeature an investigated feature - /// \return string value - std::string getFeatureInfo(const std::shared_ptr& theFeature, - const bool isUseAttributesInfo = true); -#endif -}; - -#endif diff --git a/src/SketchPlugin/SketchPlugin_Plugin.cpp b/src/SketchPlugin/SketchPlugin_Plugin.cpp index 65a5cf662..ab6197e72 100644 --- a/src/SketchPlugin/SketchPlugin_Plugin.cpp +++ b/src/SketchPlugin/SketchPlugin_Plugin.cpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -30,6 +29,7 @@ #include #include #include +#include #include #include @@ -193,14 +193,14 @@ FeaturePtr SketchPlugin_Plugin::createFeature(std::string theFeatureID) return FeaturePtr(new SketchPlugin_ConstraintMirror); } else if (theFeatureID == SketchPlugin_Fillet::ID()) { return FeaturePtr(new SketchPlugin_Fillet); - } else if (theFeatureID == SketchPlugin_ConstraintSplit::ID()) { - return FeaturePtr(new SketchPlugin_ConstraintSplit); } else if (theFeatureID == SketchPlugin_MultiTranslation::ID()) { return FeaturePtr(new SketchPlugin_MultiTranslation); } else if (theFeatureID == SketchPlugin_MultiRotation::ID()) { return FeaturePtr(new SketchPlugin_MultiRotation); } else if (theFeatureID == SketchPlugin_ConstraintAngle::ID()) { return FeaturePtr(new SketchPlugin_ConstraintAngle); + } else if (theFeatureID == SketchPlugin_Split::ID()) { + return FeaturePtr(new SketchPlugin_Split); } else if (theFeatureID == SketchPlugin_Trim::ID()) { return FeaturePtr(new SketchPlugin_Trim); } else if (theFeatureID == SketchPlugin_MacroArc::ID()) { @@ -265,10 +265,10 @@ std::shared_ptr SketchPlugin_Plugin aMsg->setState(SketchPlugin_ConstraintMiddle::ID(), aHasSketchPlane); aMsg->setState(SketchPlugin_ConstraintMirror::ID(), aHasSketchPlane); aMsg->setState(SketchPlugin_Fillet::ID(), aHasSketchPlane); - aMsg->setState(SketchPlugin_ConstraintSplit::ID(), aHasSketchPlane); aMsg->setState(SketchPlugin_ConstraintAngle::ID(), aHasSketchPlane); aMsg->setState(SketchPlugin_MultiRotation::ID(), aHasSketchPlane); aMsg->setState(SketchPlugin_MultiTranslation::ID(), aHasSketchPlane); + aMsg->setState(SketchPlugin_Split::ID(), aHasSketchPlane); aMsg->setState(SketchPlugin_Trim::ID(), aHasSketchPlane); aMsg->setState(SketchPlugin_MacroArc::ID(), aHasSketchPlane); aMsg->setState(SketchPlugin_MacroCircle::ID(), aHasSketchPlane); diff --git a/src/SketchPlugin/SketchPlugin_Trim.cpp b/src/SketchPlugin/SketchPlugin_Trim.cpp index 9ad6f0db9..747351bb3 100644 --- a/src/SketchPlugin/SketchPlugin_Trim.cpp +++ b/src/SketchPlugin/SketchPlugin_Trim.cpp @@ -75,8 +75,7 @@ SketchPlugin_Trim::SketchPlugin_Trim() void SketchPlugin_Trim::initAttributes() { - data()->addAttribute(SketchPlugin_Trim::SELECTED_OBJECT(), - ModelAPI_AttributeReference::typeId()); + data()->addAttribute(SELECTED_OBJECT(), ModelAPI_AttributeReference::typeId()); data()->addAttribute(SELECTED_POINT(), GeomDataAPI_Point2D::typeId()); data()->addAttribute(PREVIEW_POINT(), GeomDataAPI_Point2D::typeId()); @@ -427,23 +426,12 @@ void SketchPlugin_Trim::execute() if (aReplacingResult.get()) { // base object was removed aPreviewObject = aReplacingResult; //aMessage->setSelectedObject(aReplacingResult); - - GeomShapePtr aSelectedShape = aReplacingResult->shape(); - std::shared_ptr aPreviewPnt = sketch()->to3D(aPreviewPnt2d->x(), - aPreviewPnt2d->y()); - std::shared_ptr aProjectedPoint; - if (ModelGeomAlgo_Point2D::isPointOnEdge(aSelectedShape, aPreviewPnt, aProjectedPoint)) { - bool aValue = true; - } - //aBaseShape = aShape; - #ifdef DEBUG_TRIM_METHODS if (!aSelectedShape.get()) std::cout << "Set empty selected object" << std::endl; else std::cout << "Set shape with ShapeType: " << aSelectedShape->shapeTypeStr() << std::endl; #endif - bool aValue = true; } else { aPreviewObject = ObjectPtr(); @@ -594,11 +582,6 @@ bool SketchPlugin_Trim::replaceCoincidenceAttribute(const AttributePtr& theCoinc return isProcessed; } -bool SketchPlugin_Trim::isMacro() const -{ - return true; -} - AISObjectPtr SketchPlugin_Trim::getAISObject(AISObjectPtr thePrevious) { #ifdef DEBUG_TRIM_METHODS @@ -655,9 +638,9 @@ GeomShapePtr SketchPlugin_Trim::getSubShape(const std::string& theObjectAttribut return aBaseShape; // point on feature - AttributePoint2DPtr aPoint = std::dynamic_pointer_cast( + AttributePoint2DPtr aPointAttr = std::dynamic_pointer_cast( data()->attribute(thePointAttributeId)); - std::shared_ptr anAttributePnt2d = aPoint->pnt(); + std::shared_ptr anAttributePnt2d = aPointAttr->pnt(); std::shared_ptr anAttributePnt = sketch()->to3D(anAttributePnt2d->x(), anAttributePnt2d->y()); diff --git a/src/SketchPlugin/SketchPlugin_Trim.h b/src/SketchPlugin/SketchPlugin_Trim.h index 610ae1e1c..6371dad6c 100644 --- a/src/SketchPlugin/SketchPlugin_Trim.h +++ b/src/SketchPlugin/SketchPlugin_Trim.h @@ -7,10 +7,10 @@ #ifndef SketchPlugin_Trim_H_ #define SketchPlugin_Trim_H_ -#include - #include "SketchPlugin.h" -#include "SketchPlugin_ConstraintBase.h" + +#include "GeomAPI_IPresentable.h" +#include #include class GeomDataAPI_Point2D; @@ -77,7 +77,7 @@ class SketchPlugin_Trim : public SketchPlugin_Feature, public GeomAPI_IPresentab /// Reimplemented from ModelAPI_Feature::isMacro() /// \returns true - SKETCHPLUGIN_EXPORT virtual bool isMacro() const; + SKETCHPLUGIN_EXPORT virtual bool isMacro() const { return true; } /// Reimplemented from ModelAPI_Feature::isPreviewNeeded(). Returns false. /// This is necessary to perform execute only by apply the feature diff --git a/src/SketchPlugin/plugin-Sketch.xml b/src/SketchPlugin/plugin-Sketch.xml index 444209e88..4d900de02 100644 --- a/src/SketchPlugin/plugin-Sketch.xml +++ b/src/SketchPlugin/plugin-Sketch.xml @@ -13,7 +13,7 @@ SketchConstraintParallel SketchConstraintPerpendicular SketchConstraintRigid SketchConstraintHorizontal SketchConstraintVertical SketchConstraintEqual SketchConstraintTangent - SketchFillet SketchConstraintSplit SketchTrim + SketchFillet SketchSplit SketchTrim SketchConstraintCoincidence SketchConstraintMirror SketchConstraintAngle SketchMultiRotation SketchMultiTranslation @@ -308,19 +308,19 @@ - - + - + use_external="false"> - + @@ -329,11 +329,11 @@ icon="icons/Sketch/trim.png"> + use_external="false"> -- 2.39.2