diff --git a/src/Mod/Part/App/Part2DObject.cpp b/src/Mod/Part/App/Part2DObject.cpp index 33f8c6a64..422d2383f 100644 --- a/src/Mod/Part/App/Part2DObject.cpp +++ b/src/Mod/Part/App/Part2DObject.cpp @@ -20,7 +20,7 @@ * * ***************************************************************************/ - + #include "PreCompiled.h" #ifndef _PreComp_ # include @@ -63,25 +63,36 @@ Part2DObject::Part2DObject() App::DocumentObjectExecReturn *Part2DObject::execute(void) { - return App::DocumentObject::StdReturn; } -Base::Placement Part2DObject::positionBySupport(const TopoDS_Face &face, const Base::Placement &Place) +void Part2DObject::positionBySupport(void) { - if (face.IsNull()) - throw Base::Exception("Null Face in Part2DObject::positionBySupport()!"); + // recalculate support: + Part::Feature *part = static_cast(Support.getValue()); + if (!part || !part->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) + return; - bool Reverse = false; - if (face.Orientation() == TopAbs_REVERSED) - Reverse = true; + Base::Placement Place = part->Placement.getValue(); + const std::vector &sub = Support.getSubValues(); + assert(sub.size()==1); + // get the selected sub shape (a Face) + const Part::TopoShape &shape = part->Shape.getShape(); + if (shape._Shape.IsNull()) + throw Base::Exception("Support shape is empty!"); + TopoDS_Shape sh = shape.getSubShape(sub[0].c_str()); + const TopoDS_Face &face = TopoDS::Face(sh); + if (face.IsNull()) + throw Base::Exception("Null face in Part2DObject::positionBySupport()!"); BRepAdaptor_Surface adapt(face); - if (adapt.GetType() != GeomAbs_Plane) - throw Base::Exception("No planar Face in Part2DObject::positionBySupport()!"); + throw Base::Exception("No planar face in Part2DObject::positionBySupport()!"); + + bool Reverse = false; + if (face.Orientation() == TopAbs_REVERSED) + Reverse = true; - gp_Pnt ObjOrg(Place.getPosition().x,Place.getPosition().y,Place.getPosition().z); gp_Pln plane = adapt.Plane(); Standard_Boolean ok = plane.Direct(); if (!ok) { @@ -94,6 +105,8 @@ Base::Placement Part2DObject::positionBySupport(const TopoDS_Face &face, const B if (Reverse) Normal.Reverse(); + gp_Pnt ObjOrg(Place.getPosition().x,Place.getPosition().y,Place.getPosition().z); + Handle (Geom_Plane) gPlane = new Geom_Plane(plane); GeomAPI_ProjectPointOnSurf projector(ObjOrg,gPlane); gp_Pnt SketchBasePoint = projector.NearestPoint(); @@ -168,7 +181,7 @@ Base::Placement Part2DObject::positionBySupport(const TopoDS_Face &face, const B // check the angle against the Z Axis //Standard_Real a = Normal.Angle(gp_Ax1(gp_Pnt(0,0,0),gp_Dir(0,0,1))); - return Base::Placement(mtrx); + Placement.setValue(Base::Placement(mtrx)); } bool Part2DObject::seekTrimPoints(const std::vector &geomlist, diff --git a/src/Mod/Part/App/Part2DObject.h b/src/Mod/Part/App/Part2DObject.h index c99ecf3be..d8c0aabac 100644 --- a/src/Mod/Part/App/Part2DObject.h +++ b/src/Mod/Part/App/Part2DObject.h @@ -35,16 +35,16 @@ namespace Part { class Geometry; -/** 2D Shape - * This is a specialiced version of the PartShape for use with +/** 2D Shape + * This is a specialiced version of the PartShape for use with * flat (2D) geometry. The Z direction has always to be 0. * The position and orientation of the Plane this 2D geometry is * referenced is defined by the Placement property. It also - * has a link to a supporting Face which defines the position + * has a link to a supporting Face which defines the position * in space where it is located. If the support is changed the - * static methode positionBySupport() is used to calculate a + * static methode positionBySupport() is used to calculate a * new position for the Part2DObject. - * This object can be used stand alone or for constraint + * This object can be used stand alone or for constraint * geometry as its descend Sketcher::SketchObject . */ @@ -58,15 +58,15 @@ public: /// if the 2DObject lies on the Face of an other object this links to it App::PropertyLinkSub Support; - /** calculate a position out of a support face - * this methode will calculate the position of the - * 2D shape on a supporting Face. The Normal(Orientation) get + /** calculate and update the Placement property based on the Support + * this methode will calculate the position of the + * 2D shape on a supporting Face. The Normal(Orientation) get * extracted from the Face and for the position an educated guess is made, * by examining the placement of the support object (not only the face). - * If the support is changed this methode is called do determine a new + * If the support is changed this methode is called do determine a new * postion of the 2D shape on the supporting Face */ - static Base::Placement positionBySupport(const TopoDS_Face &face, const Base::Placement &Place); + void positionBySupport(void); /** calculate the points where a curve with index GeoId should be trimmed * with respect to the rest of the curves contained in the list geomlist diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index 51432fd8c..430941df2 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -57,28 +57,11 @@ SketchObject::SketchObject() App::DocumentObjectExecReturn *SketchObject::execute(void) { - // recalculate support: - Part::Feature *part = static_cast(Support.getValue()); - if (part && part->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) - { - Base::Placement ObjectPos = part->Placement.getValue(); - const std::vector &sub = Support.getSubValues(); - assert(sub.size()==1); - // get the selected sub shape (a Face) - const Part::TopoShape &shape = part->Shape.getShape(); - if (shape._Shape.IsNull()) - return new App::DocumentObjectExecReturn("Support shape is empty!"); - TopoDS_Shape sh = shape.getSubShape(sub[0].c_str()); - const TopoDS_Face &face = TopoDS::Face(sh); - assert(!face.IsNull()); - - BRepAdaptor_Surface adapt(face); - if (adapt.GetType() != GeomAbs_Plane) - return new App::DocumentObjectExecReturn("Sketch has no planar support!"); - - // set sketch position - Base::Placement placement = Part2DObject::positionBySupport(face,ObjectPos); - Placement.setValue(placement); + try { + this->positionBySupport(); + } + catch (const Base::Exception& e) { + return new App::DocumentObjectExecReturn(e.what()); } // setup and diagnose the sketch diff --git a/src/Mod/Sketcher/Gui/Command.cpp b/src/Mod/Sketcher/Gui/Command.cpp index c9eda945e..eeddfb858 100644 --- a/src/Mod/Sketcher/Gui/Command.cpp +++ b/src/Mod/Sketcher/Gui/Command.cpp @@ -54,7 +54,7 @@ using namespace Part; DEF_STD_CMD_A(CmdSketcherNewSketch); CmdSketcherNewSketch::CmdSketcherNewSketch() - :Command("Sketcher_NewSketch") + :Command("Sketcher_NewSketch") { sAppModule = "Sketcher"; sGroup = QT_TR_NOOP("Sketcher"); @@ -103,19 +103,16 @@ void CmdSketcherNewSketch::activated(int iMsg) QObject::tr("You need a planar face as support for a sketch!")); return; } - Base::Placement placement = Part2DObject::positionBySupport(face,ObjectPos); - double a,b,c; - placement.getRotation().getYawPitchRoll(a,b,c); std::string supportString = FaceFilter.Result[0][0].getAsPropertyLinkSubString(); - + // create Sketch on Face std::string FeatName = getUniqueObjectName("Sketch"); openCommand("Create a Sketch on Face"); doCommand(Doc,"App.activeDocument().addObject('Sketcher::SketchObject','%s')",FeatName.c_str()); - doCommand(Gui,"App.activeDocument().%s.Placement = FreeCAD.Placement(FreeCAD.Vector(%f,%f,%f),FreeCAD.Rotation(%f,%f,%f))",FeatName.c_str(),placement.getPosition().x,placement.getPosition().y,placement.getPosition().z,a,b,c); doCommand(Gui,"App.activeDocument().%s.Support = %s",FeatName.c_str(),supportString.c_str()); + doCommand(Gui,"App.activeDocument().recompute()"); // recompute the sketch placement based on its support //doCommand(Gui,"Gui.activeDocument().activeView().setCamera('%s')",cam.c_str()); doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); } @@ -158,7 +155,7 @@ void CmdSketcherNewSketch::activated(int iMsg) doCommand(Gui,"Gui.activeDocument().activeView().setCamera('%s')",camstring.c_str()); doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); } - + } bool CmdSketcherNewSketch::isActive(void) @@ -237,15 +234,12 @@ void CmdSketcherMapSketch::activated(int iMsg) qApp->translate(className(),"You need a planar face as support for a sketch!")); return; } - Base::Placement placement = Part2DObject::positionBySupport(face,ObjectPos); - double a,b,c; - placement.getRotation().getYawPitchRoll(a,b,c); std::string supportString = FaceFilter.Result[0][0].getAsPropertyLinkSubString(); openCommand("Map a Sketch on Face"); - doCommand(Gui,"App.activeDocument().%s.Placement = FreeCAD.Placement(FreeCAD.Vector(%f,%f,%f),FreeCAD.Rotation(%f,%f,%f))",featName.c_str(),placement.getPosition().x,placement.getPosition().y,placement.getPosition().z,a,b,c); doCommand(Gui,"App.activeDocument().%s.Support = %s",featName.c_str(),supportString.c_str()); + doCommand(Gui,"App.activeDocument().recompute()"); doCommand(Gui,"Gui.activeDocument().setEdit('%s')",featName.c_str()); } else {