1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
3 // File: SketchPlugin_Tools.cpp
4 // Created: 07 July 2015
5 // Author: Sergey POKHODENKO
7 #include "SketchPlugin_Tools.h"
9 #include "SketchPlugin_ConstraintCoincidence.h"
10 #include "SketchPlugin_ConstraintTangent.h"
11 #include "SketchPlugin_Point.h"
12 #include "SketchPlugin_SketchEntity.h"
14 #include <SketcherPrs_Tools.h>
16 #include <ModelAPI_AttributeDouble.h>
18 #include <GeomDataAPI_Point.h>
19 #include <GeomDataAPI_Point2D.h>
21 namespace SketchPlugin_Tools {
23 void clearExpressions(AttributeDoublePtr theAttribute)
25 theAttribute->setText(std::string());
28 void clearExpressions(AttributePointPtr theAttribute)
30 theAttribute->setText(std::string(), std::string(), std::string());
33 void clearExpressions(AttributePoint2DPtr theAttribute)
35 theAttribute->setText(std::string(), std::string());
38 void clearExpressions(AttributePtr theAttribute)
41 AttributeDoublePtr anAttributeDouble =
42 std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(theAttribute);
43 if (anAttributeDouble.get())
44 clearExpressions(anAttributeDouble);
46 AttributePointPtr anAttributePoint =
47 std::dynamic_pointer_cast<GeomDataAPI_Point>(theAttribute);
48 if (anAttributePoint.get())
49 clearExpressions(anAttributePoint);
51 AttributePoint2DPtr anAttributePoint2D =
52 std::dynamic_pointer_cast<GeomDataAPI_Point2D>(theAttribute);
53 if (anAttributePoint2D.get())
54 clearExpressions(anAttributePoint2D);
57 void clearExpressions(FeaturePtr theFeature)
59 if (!theFeature.get())
62 std::list<AttributePtr> anAttributes = theFeature->data()->attributes(std::string());
63 std::list<AttributePtr>::iterator anAttributeIt = anAttributes.begin();
64 for (; anAttributeIt != anAttributes.end(); ++anAttributeIt) {
65 clearExpressions(*anAttributeIt);
69 std::shared_ptr<GeomAPI_Pnt2d> getCoincidencePoint(const FeaturePtr theStartCoin)
71 std::shared_ptr<GeomAPI_Pnt2d> aPnt = SketcherPrs_Tools::getPoint(theStartCoin.get(),
72 SketchPlugin_Constraint::ENTITY_A());
73 if (aPnt.get() == NULL)
74 aPnt = SketcherPrs_Tools::getPoint(theStartCoin.get(), SketchPlugin_Constraint::ENTITY_B());
78 void findCoincidences(const FeaturePtr theStartCoin,
79 const std::string& theAttr,
80 std::set<FeaturePtr>& theList)
82 AttributeRefAttrPtr aPnt = theStartCoin->refattr(theAttr);
86 FeaturePtr aObj = ModelAPI_Feature::feature(aPnt->object());
87 if(theList.find(aObj) == theList.end()) {
88 std::shared_ptr<GeomAPI_Pnt2d> aOrig = getCoincidencePoint(theStartCoin);
89 if(aOrig.get() == NULL) {
93 const std::set<AttributePtr>& aRefsList = aObj->data()->refsToMe();
94 std::set<AttributePtr>::const_iterator aIt;
95 for(aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) {
96 std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
97 FeaturePtr aConstrFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
98 if(aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) {
99 std::shared_ptr<GeomAPI_Pnt2d> aPnt = getCoincidencePoint(aConstrFeature);
100 if(aPnt.get() && aOrig->isEqual(aPnt)) {
101 findCoincidences(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_A(), theList);
102 findCoincidences(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_B(), theList);
109 void resetAttribute(SketchPlugin_Feature* theFeature,
110 const std::string& theId)
112 AttributePtr anAttr = theFeature->attribute(theId);
118 void createConstraint(SketchPlugin_Feature* theFeature,
119 const std::string& theId,
120 const AttributePtr theAttr,
121 const ObjectPtr theObject,
122 const bool theIsCanBeTangent)
124 AttributeRefAttrPtr aRefAttr = theFeature->refattr(theId);
125 if(aRefAttr.get() && aRefAttr->isInitialized()) {
126 FeaturePtr aConstraint;
127 if(!theIsCanBeTangent) {
128 aConstraint = theFeature->sketch()
129 ->addFeature(SketchPlugin_ConstraintCoincidence::ID());
131 if(aRefAttr->isObject()) {
132 ObjectPtr anObject = aRefAttr->object();
133 FeaturePtr aFeature = ModelAPI_Feature::feature(anObject);
134 if(aFeature->getKind() == SketchPlugin_Point::ID()) {
135 aConstraint = theFeature->sketch()
136 ->addFeature(SketchPlugin_ConstraintCoincidence::ID());
138 aConstraint = theFeature->sketch()
139 ->addFeature(SketchPlugin_ConstraintTangent::ID());
142 aConstraint = theFeature->sketch()
143 ->addFeature(SketchPlugin_ConstraintCoincidence::ID());
146 AttributeRefAttrPtr aRefAttrA = aConstraint->refattr(SketchPlugin_Constraint::ENTITY_A());
147 aRefAttr->isObject() ? aRefAttrA->setObject(aRefAttr->object())
148 : aRefAttrA->setAttr(aRefAttr->attr());
149 AttributeRefAttrPtr aRefAttrB = aConstraint->refattr(SketchPlugin_Constraint::ENTITY_B());
150 if(theObject.get()) {
151 aRefAttrB->setObject(theObject);
152 } else if(theAttr.get()) {
153 aRefAttrB->setAttr(theAttr);
157 } // namespace SketchPlugin_Tools