1 // File: PartSet_Presentation.h
2 // Created: 02 June 2014
3 // Author: Natalia ERMOLAEVA
5 #include <PartSet_Presentation.h>
6 #include <PartSet_Tools.h>
8 #include <ModelAPI_Feature.h>
9 #include <ModelAPI_Data.h>
10 #include <ModelAPI_AttributeDouble.h>
12 #include <GeomDataAPI_Point.h>
13 #include <GeomDataAPI_Point2D.h>
14 #include <GeomDataAPI_Dir.h>
16 #include <SketchPlugin_Sketch.h>
17 #include <SketchPlugin_Line.h>
18 #include <SketchPlugin_Constraint.h>
19 #include <SketchPlugin_ConstraintLength.h>
21 #include <AIS_InteractiveObject.hxx>
22 #include <AIS_LengthDimension.hxx>
23 #include <AIS_Shape.hxx>
28 const Quantity_NameOfColor SKETCH_PLANE_COLOR = Quantity_NOC_CHOCOLATE; /// the plane edge color
29 const int SKETCH_WIDTH = 4; /// the plane edge width
31 Handle(AIS_InteractiveObject) PartSet_Presentation::createPresentation(
32 FeaturePtr theFeature,
34 const TopoDS_Shape& theShape,
35 Handle_AIS_InteractiveObject thePrevPrs)
37 Handle(AIS_InteractiveObject) anAIS;
39 if (theFeature->getKind() == SKETCH_CONSTRAINT_LENGTH_KIND)
40 anAIS = createSketchConstraintLength(theFeature, theSketch, thePrevPrs);
42 anAIS = createFeature(theFeature, theShape, thePrevPrs);
43 if (theFeature->getKind() == SKETCH_KIND)
45 Handle(AIS_Shape) aShapeAIS = Handle(AIS_Shape)::DownCast(anAIS);
46 aShapeAIS->SetColor(Quantity_Color(SKETCH_PLANE_COLOR));
47 aShapeAIS->SetWidth(SKETCH_WIDTH);
48 aShapeAIS->Redisplay();
55 Handle(AIS_InteractiveObject) PartSet_Presentation::createFeature(
56 FeaturePtr theFeature,
57 const TopoDS_Shape& theShape,
58 Handle_AIS_InteractiveObject thePrevPrs)
60 Handle(AIS_InteractiveObject) anAIS = thePrevPrs;
63 Handle(AIS_Shape) aShapeAIS = Handle(AIS_Shape)::DownCast(anAIS);
64 if (!aShapeAIS.IsNull()) {
65 // if the AIS object is displayed in the opened local context in some mode, additional
66 // AIS sub objects are created there. They should be rebuild for correct selecting.
67 // It is possible to correct it by closing local context before the shape set and opening
68 // after. Another workaround to thrown down the selection and reselecting the AIS.
69 // If there was a problem here, try the first solution with close/open local context.
70 aShapeAIS->Set(theShape);
71 aShapeAIS->Redisplay(Standard_True);
76 anAIS = new AIS_Shape(theShape);
81 Handle(AIS_InteractiveObject) PartSet_Presentation::createSketchConstraintLength(
82 FeaturePtr theFeature,
84 Handle(AIS_InteractiveObject) thePrevPrs)
86 if (!theFeature || !theSketch)
89 boost::shared_ptr<ModelAPI_Data> aData = theSketch->data();
90 boost::shared_ptr<GeomDataAPI_Point> anOrigin =
91 boost::dynamic_pointer_cast<GeomDataAPI_Point>(aData->attribute(SKETCH_ATTR_ORIGIN));
92 boost::shared_ptr<GeomDataAPI_Dir> aNormal =
93 boost::dynamic_pointer_cast<GeomDataAPI_Dir>(aData->attribute(SKETCH_ATTR_NORM));
94 gp_Pln aPlane(aNormal->x(), aNormal->y(), aNormal->z(), 0/*D*/);
96 aData = theFeature->data();
97 boost::shared_ptr<ModelAPI_AttributeRefAttr> anAttr =
98 boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aData->attribute(CONSTRAINT_ATTR_ENTITY_A));
101 FeaturePtr aFeature = anAttr->feature();
102 if (!aFeature || aFeature->getKind() != SKETCH_LINE_KIND)
105 boost::shared_ptr<ModelAPI_AttributeDouble> aFlyoutAttr =
106 boost::dynamic_pointer_cast<ModelAPI_AttributeDouble>(aData->attribute(CONSTRAINT_ATTR_FLYOUT_VALUE));
107 double aFlyout = aFlyoutAttr->value();
109 aData = aFeature->data();
110 if (!aData->isValid())
113 boost::shared_ptr<GeomDataAPI_Point2D> aPointStart =
114 boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_START));
115 boost::shared_ptr<GeomDataAPI_Point2D> aPointEnd =
116 boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_END));
118 gp_Pnt aPoint1, aPoint2;
119 PartSet_Tools::convertTo3D(aPointStart->x(), aPointStart->y(), theSketch, aPoint1);
120 PartSet_Tools::convertTo3D(aPointEnd->x(), aPointEnd->y(), theSketch, aPoint2);
122 //Build dimension here
123 gp_Pnt aP1 = aPoint1;
124 gp_Pnt aP2 = aPoint2;
126 Handle(AIS_InteractiveObject) anAIS = thePrevPrs;
129 Handle(AIS_LengthDimension) aLenDim = new AIS_LengthDimension (aP1, aP2, aPlane);
131 Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect();
132 anAspect->MakeArrows3d (Standard_False);
133 anAspect->MakeText3d(false/*is text 3d*/);
134 anAspect->TextAspect()->SetHeight(28);
135 anAspect->MakeTextShaded(false/*is test shaded*/);
136 aLenDim->DimensionAspect()->MakeUnitsDisplayed(false/*is units displayed*/);
137 /*if (isUnitsDisplayed)
139 aLenDim->SetDisplayUnits (aDimDlg->GetUnits ());
141 aLenDim->SetDimensionAspect (anAspect);
142 aLenDim->SetFlyout(aFlyout);
147 // update presentation
148 Handle(AIS_LengthDimension) aDimAIS = Handle(AIS_LengthDimension)::DownCast(anAIS);
149 if (!aDimAIS.IsNull()) {
150 aDimAIS->SetMeasuredGeometry(aPoint1, aPoint2, aPlane);
151 aDimAIS->Redisplay(Standard_True);