1 // File: PartSet_FeaturePrs.h
2 // Created: 04 Jun 2014
3 // Author: Natalia ERMOLAEVA
5 #include <PartSet_FeatureLinePrs.h>
6 #include <PartSet_Tools.h>
8 #include <SketchPlugin_Feature.h>
9 #include <SketchPlugin_Sketch.h>
10 #include <SketchPlugin_ConstraintCoincidence.h>
11 #include <SketchPlugin_Line.h>
12 #include <SketchPlugin_Constraint.h>
14 #include <GeomDataAPI_Point2D.h>
16 #include <ModelAPI_Data.h>
17 #include <ModelAPI_Document.h>
18 #include <ModelAPI_AttributeRefAttr.h>
19 #include <ModelAPI_AttributeRefList.h>
21 #include <Precision.hxx>
22 #include <V3d_View.hxx>
26 PartSet_FeatureLinePrs::PartSet_FeatureLinePrs(FeaturePtr theSketch)
27 : PartSet_FeaturePrs(theSketch)
31 std::string PartSet_FeatureLinePrs::getKind()
33 return SKETCH_LINE_KIND;
36 void PartSet_FeatureLinePrs::initFeature(FeaturePtr theFeature)
38 if (feature() && theFeature)
40 // use the last point of the previous feature as the first of the new one
41 boost::shared_ptr<ModelAPI_Data> aData = theFeature->data();
42 boost::shared_ptr<GeomDataAPI_Point2D> anInitPoint = boost::dynamic_pointer_cast<GeomDataAPI_Point2D>
43 (aData->attribute(LINE_ATTR_END));
44 PartSet_Tools::setFeaturePoint(feature(), anInitPoint->x(), anInitPoint->y(), LINE_ATTR_START);
45 PartSet_Tools::setFeaturePoint(feature(), anInitPoint->x(), anInitPoint->y(), LINE_ATTR_END);
47 aData = feature()->data();
48 boost::shared_ptr<GeomDataAPI_Point2D> aPoint = boost::dynamic_pointer_cast<GeomDataAPI_Point2D>
49 (aData->attribute(LINE_ATTR_START));
50 PartSet_Tools::createConstraint(sketch(), anInitPoint, aPoint);
54 PartSet_SelectionMode PartSet_FeatureLinePrs::setPoint(double theX, double theY,
55 const PartSet_SelectionMode& theMode)
57 PartSet_SelectionMode aMode = theMode;
61 PartSet_Tools::setFeaturePoint(feature(), theX, theY, LINE_ATTR_START);
62 PartSet_Tools::setFeaturePoint(feature(), theX, theY, LINE_ATTR_END);
63 aMode = SM_SecondPoint;
66 case SM_SecondPoint: {
67 PartSet_Tools::setFeaturePoint(feature(), theX, theY, LINE_ATTR_END);
77 std::string PartSet_FeatureLinePrs::getAttribute(const PartSet_SelectionMode& theMode) const
79 std::string aAttribute;
83 aAttribute = LINE_ATTR_START;
86 aAttribute = LINE_ATTR_END;
94 PartSet_SelectionMode PartSet_FeatureLinePrs::getNextMode(const std::string& theAttribute) const
96 PartSet_SelectionMode aMode;
98 if (theAttribute == LINE_ATTR_START)
99 aMode = SM_SecondPoint;
100 else if (theAttribute == LINE_ATTR_END)
101 aMode = SM_DonePoint;
105 void PartSet_FeatureLinePrs::move(double theDeltaX, double theDeltaY)
107 boost::shared_ptr<ModelAPI_Data> aData = feature()->data();
108 if (!aData->isValid())
111 boost::shared_ptr<GeomDataAPI_Point2D> aPoint1 =
112 boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_START));
113 aPoint1->setValue(aPoint1->x() + theDeltaX, aPoint1->y() + theDeltaY);
115 boost::shared_ptr<GeomDataAPI_Point2D> aPoint2 =
116 boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_END));
117 aPoint2->setValue(aPoint2->x() + theDeltaX, aPoint2->y() + theDeltaY);
120 void PartSet_FeatureLinePrs::projectPointOnLine(FeaturePtr theFeature,
121 const PartSet_SelectionMode& theMode,
122 const gp_Pnt& thePoint, Handle(V3d_View) theView,
123 double& theX, double& theY)
126 double X0, X1, X2, X3;
127 double Y0, Y1, Y2, Y3;
128 getLinePoint(theFeature, LINE_ATTR_START, X2, Y2);
129 getLinePoint(theFeature, LINE_ATTR_END, X3, Y3);
130 PartSet_Tools::convertTo2D(thePoint, sketch(), theView, X1, Y1);
134 PartSet_Tools::projectPointOnLine(X2, Y2, X3, Y3, X1, Y1, theX, theY);
136 case SM_SecondPoint: {
137 getLinePoint(feature(), LINE_ATTR_START, X0, Y0);
138 PartSet_Tools::intersectLines(X0, Y0, X1, Y1, X2, Y2, X3, Y3, theX, theY);
147 double PartSet_FeatureLinePrs::distanceToPoint(FeaturePtr theFeature,
148 double theX, double theY)
151 if (!theFeature || theFeature->getKind() != getKind())
154 boost::shared_ptr<ModelAPI_Data> aData = theFeature->data();
155 boost::shared_ptr<GeomDataAPI_Point2D> aPoint1 =
156 boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_START));
157 boost::shared_ptr<GeomDataAPI_Point2D> aPoint2 =
158 boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_END));
161 PartSet_Tools::projectPointOnLine(aPoint1->x(), aPoint1->y(), aPoint2->x(), aPoint2->y(), theX, theY, aX, anY);
162 aDelta = gp_Pnt(theX, theY, 0).Distance(gp_Pnt(aX, anY, 0));
167 boost::shared_ptr<GeomDataAPI_Point2D> PartSet_FeatureLinePrs::findPoint(FeaturePtr theFeature,
168 double theX, double theY)
170 boost::shared_ptr<GeomDataAPI_Point2D> aPoint2D;
171 if (!theFeature || theFeature->getKind() != getKind())
174 boost::shared_ptr<ModelAPI_Data> aData = theFeature->data();
175 boost::shared_ptr<GeomDataAPI_Point2D> aPoint =
176 boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_START));
177 if (fabs(aPoint->x() - theX) < Precision::Confusion() &&
178 fabs(aPoint->y() - theY) < Precision::Confusion())
181 aPoint = boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_END));
182 if (fabs(aPoint->x() - theX) < Precision::Confusion() &&
183 fabs(aPoint->y() - theY) < Precision::Confusion())
189 boost::shared_ptr<GeomDataAPI_Point2D> PartSet_FeatureLinePrs::featurePoint
190 (const PartSet_SelectionMode& theMode)
192 std::string aPointArg;
196 aPointArg = LINE_ATTR_START;
199 aPointArg = LINE_ATTR_END;
204 boost::shared_ptr<ModelAPI_Data> aData = feature()->data();
205 boost::shared_ptr<GeomDataAPI_Point2D> aPoint = boost::dynamic_pointer_cast<GeomDataAPI_Point2D>
206 (aData->attribute(aPointArg));
210 void PartSet_FeatureLinePrs::getLinePoint(FeaturePtr theFeature, const std::string& theAttribute,
211 double& theX, double& theY)
213 if (!theFeature || theFeature->getKind() != PartSet_FeatureLinePrs::getKind())
215 boost::shared_ptr<ModelAPI_Data> aData = theFeature->data();
216 boost::shared_ptr<GeomDataAPI_Point2D> aPoint =
217 boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(theAttribute));