+ 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());
+ }
+ 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());
+ // 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();
+ }
+ }