+ return aResult;
+}
+
+ResultPtr PartSet_Tools::createFixedObjectByExternal(const TopoDS_Shape& theShape,
+ const ObjectPtr& theObject,
+ CompositeFeaturePtr theSketch,
+ const bool theTemporary)
+{
+ 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());
+ if (theShape.Orientation() == TopAbs_REVERSED)
+ aMyFeature->boolean(SketchPlugin_Arc::REVERSED_ID())->setValue(true);
+ }
+ 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();
+
+ // issue #2125: Naming problem: two edges in Naming for one circle on solid
+ // this is result of boolean and seamedge
+ if (aAdaptor.GetType() == GeomAbs_Circle) {
+ ModelAPI_ValidatorsFactory* aFactory = ModelAPI_Session::get()->validators();
+ if (!aFactory->validate(aMyFeature)) {
+ anAttr->setValue(ResultPtr(), GeomShapePtr());
+ std::set<FeaturePtr> aFeatures;
+ aFeatures.insert(aMyFeature);
+ ModelAPI_Tools::removeFeaturesAndReferences(aFeatures);
+ Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
+ Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_DELETED));
+
+ return ResultPtr();
+ }
+ }
+
+ // // fix this edge
+ // FeaturePtr aFix = theSketch->addFeature(SketchPlugin_ConstraintRigid::ID());
+ // aFix->data()->refattr(SketchPlugin_Constraint::ENTITY_A())->
+ // setObject(aMyFeature->lastResult());
+ // // we need to flush created signal in order to fixed constraint is processed by solver
+ // Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
+ //}
+ 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());
+ // // we need to flush created signal in order to fixed constraint is processed by solver
+ // Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
+ //}
+ return aMyFeature->lastResult();
+ }
+ }