- if (theShape.ShapeType() == TopAbs_EDGE) {
- Standard_Real aStart, aEnd;
- Handle(V3d_View) aNullView;
- FeaturePtr aMyFeature;
-
- Handle(Geom_Curve) aCurve = BRep_Tool::Curve(TopoDS::Edge(theShape), aStart, aEnd);
- GeomAdaptor_Curve aAdaptor(aCurve);
- std::shared_ptr<GeomAPI_Edge> anEdge = std::shared_ptr<GeomAPI_Edge>(new GeomAPI_Edge);
- anEdge->setImpl(new TopoDS_Shape(theShape));
- if (aAdaptor.GetType() == GeomAbs_Line) {
- // Create line
- aMyFeature = theSketch->addFeature(SketchPlugin_Line::ID());
- if (!theObject.get()) {
- // There is no selected result
- std::shared_ptr<GeomAPI_Pnt> aPnt1 = anEdge->firstPoint();
- std::shared_ptr<GeomAPI_Pnt> aPnt2 = anEdge->lastPoint();
- std::shared_ptr<GeomAPI_Pnt2d> aPnt2d1 = convertTo2D(theSketch, aPnt1);
- std::shared_ptr<GeomAPI_Pnt2d> aPnt2d2 = convertTo2D(theSketch, aPnt2);
-
- std::shared_ptr<ModelAPI_Data> aData = aMyFeature->data();
- std::shared_ptr<GeomDataAPI_Point2D> aPoint1 =
- std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(SketchPlugin_Line::START_ID()));
- std::shared_ptr<GeomDataAPI_Point2D> aPoint2 =
- std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(SketchPlugin_Line::END_ID()));
-
- aPoint1->setValue(aPnt2d1);
- aPoint2->setValue(aPnt2d2);
-
- // If this is an axis then its name has to be changed correspondently
- std::string aSuffix = "";
- bool aXdir = fabs(aPnt1->x() - aPnt2->x()) > Precision::Confusion();
- bool aYdir = fabs(aPnt1->y() - aPnt2->y()) > Precision::Confusion();
- bool aZdir = fabs(aPnt1->z() - aPnt2->z()) > Precision::Confusion();
- if (aXdir && (!aYdir) && (!aZdir))
- aSuffix = "X";
- else if ((!aXdir) && aYdir && (!aZdir))
- aSuffix = "Y";
- else if ((!aXdir) && (!aYdir) && aZdir)
- aSuffix = "Z";
- if (aSuffix.length() > 0)
- aData->setName("Axis_" + aSuffix);
- aMyFeature->execute();
-
- }
- } else if (aAdaptor.GetType() == GeomAbs_Circle) {
- if (anEdge->isArc()) {
- // Create arc
- aMyFeature = theSketch->addFeature(SketchPlugin_Arc::ID());
- }
- else {
- // Create circle
- aMyFeature = theSketch->addFeature(SketchPlugin_Circle::ID());
- }
- }
- if (aMyFeature) {
- DataPtr aData = aMyFeature->data();
- AttributeSelectionPtr anAttr =
- std::dynamic_pointer_cast<ModelAPI_AttributeSelection>
- (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID()));
-
- ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
- // selection shape has no result owner => the trihedron axis
- // TODO: make reference to the real axes when they are implemented in the initialization plugin
- if (!aRes.get()) {
- ObjectPtr aPointObj = ModelAPI_Session::get()->moduleDocument()->objectByName(
- ModelAPI_ResultConstruction::group(), "Origin");
- if (aPointObj.get()) { // if initialization plugin performed well
- aRes = std::dynamic_pointer_cast<ModelAPI_Result>(aPointObj);
- }
- }
- if (!aRes.get()) {
- aRes = aMyFeature->firstResult();
- }
- if (anAttr.get() && aRes.get()) {
- std::shared_ptr<GeomAPI_Shape> anEdge(new GeomAPI_Shape);
- anEdge->setImpl(new TopoDS_Shape(theShape));
-
- anAttr->setValue(aRes, anEdge);
- //if (!theTemporary) {
- aMyFeature->execute();
-
- // fix this edge
- FeaturePtr aFix = theSketch->addFeature(SketchPlugin_ConstraintRigid::ID());
- aFix->data()->refattr(SketchPlugin_Constraint::ENTITY_A())->
- setObject(aMyFeature->lastResult());
- //}
- return aMyFeature->lastResult();
- }
- }
- }
- if (theShape.ShapeType() == TopAbs_VERTEX) {
- FeaturePtr aMyFeature = theSketch->addFeature(SketchPlugin_Point::ID());
-
- if (aMyFeature) {
- DataPtr aData = aMyFeature->data();
- AttributeSelectionPtr anAttr =
- std::dynamic_pointer_cast<ModelAPI_AttributeSelection>
- (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID()));
-
- ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
- // if there is no object, it means that this is the origin point: search it in the module document
- if (!aRes.get()) {
- ObjectPtr aPointObj = ModelAPI_Session::get()->moduleDocument()->objectByName(
- ModelAPI_ResultConstruction::group(), "Origin");
- if (aPointObj.get()) { // if initialization plugin performed well
- aRes = std::dynamic_pointer_cast<ModelAPI_Result>(aPointObj);
- }
- }
- // reference to itself with name "Origin" (but this may cause the infinitive cycling)
- if (!aRes.get()) {
- // If the point is selected not from Result object
- std::shared_ptr<GeomAPI_Shape> aShape =
- std::shared_ptr<GeomAPI_Shape>(new GeomAPI_Shape());
- aShape->setImpl(new TopoDS_Shape(theShape));
-
- std::shared_ptr<GeomAPI_Vertex> aVertex =
- std::shared_ptr<GeomAPI_Vertex>(new GeomAPI_Vertex(aShape));
- std::shared_ptr<GeomAPI_Pnt> aPnt = aVertex->point();
-
- std::shared_ptr<GeomAPI_Pnt2d> aPnt2d = convertTo2D(theSketch, aPnt);
- std::shared_ptr<GeomDataAPI_Point2D> aPoint =
- std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(SketchPlugin_Point::COORD_ID()));
- aPoint->setValue(aPnt2d);
- if ((aPnt->x() < Precision::Confusion()) &&
- (aPnt->y() < Precision::Confusion()) &&
- (aPnt->z() < Precision::Confusion()))
- aData->setName("Origin");
-
- aMyFeature->execute();
- aRes = aMyFeature->firstResult();
- }
- if (anAttr.get() && aRes.get()) {
- std::shared_ptr<GeomAPI_Shape> aVert(new GeomAPI_Shape);
- aVert->setImpl(new TopoDS_Shape(theShape));
-
- anAttr->setValue(aRes, aVert);
- //if (theTemporary) {
- aMyFeature->execute();
-
- // fix this edge
- FeaturePtr aFix = theSketch->addFeature(SketchPlugin_ConstraintRigid::ID());
- aFix->data()->refattr(SketchPlugin_Constraint::ENTITY_A())->
- setObject(aMyFeature->lastResult());
- //}
- return aMyFeature->lastResult();
- }
- }
+ ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+ if (!aResult.get())
+ return ResultPtr();
+
+ FeaturePtr aProjectionFeature = theSketch->addFeature(SketchPlugin_Projection::ID());
+ theCreatedFeature = aProjectionFeature;
+ AttributeSelectionPtr anExternalAttr = std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(
+ aProjectionFeature->attribute(SketchPlugin_Projection::EXTERNAL_FEATURE_ID()));
+ anExternalAttr->setValue(aResult, theShape);
+
+ AttributeBooleanPtr anIntoResult = std::dynamic_pointer_cast<ModelAPI_AttributeBoolean>
+ (aProjectionFeature->data()->attribute(SketchPlugin_Projection::INCLUDE_INTO_RESULT()));
+ anIntoResult->setValue(SKETCH_PROJECTION_INCLUDE_INTO_RESULT);
+ aProjectionFeature->execute();
+
+ // if projection feature has not been created, exit
+ AttributeRefAttrPtr aRefAttr = aProjectionFeature->data()->refattr(
+ SketchPlugin_Projection::PROJECTED_FEATURE_ID());
+ if (!aRefAttr || !aRefAttr->isInitialized())
+ {
+ // remove external feature if the attribute is not filled
+ std::set<FeaturePtr> aFeatures;
+ aFeatures.insert(aProjectionFeature);
+ ModelAPI_Tools::removeFeaturesAndReferences(aFeatures);
+ return ResultPtr();