Skip to content

Commit

Permalink
Sketcher:: Trim creator UI
Browse files Browse the repository at this point in the history
==========================

* Enable to select any GeomTrimmedCurve (any arc supported by the Sketcher), as well as B-Splines.
* Use Edit Markers to provide visualisation of the cutting position and cut segment end point before trimming.
* Reject trimming Internal aligned geometry (internals of complex geometries such as ellipses or hyperbolas)
  • Loading branch information
abdullahtahiriyo committed Mar 21, 2021
1 parent 2d81712 commit 28e40ff
Showing 1 changed file with 53 additions and 12 deletions.
65 changes: 53 additions & 12 deletions src/Mod/Sketcher/Gui/CommandCreateGeo.cpp
Expand Up @@ -51,6 +51,7 @@
#include <Mod/Sketcher/App/SketchObject.h>
#include <Mod/Part/App/DatumFeature.h>
#include <Mod/Part/App/BodyBase.h>
#include <Mod/Sketcher/App/Constraint.h>

#include "ViewProviderSketch.h"
#include "DrawSketchHandler.h"
Expand Down Expand Up @@ -5450,13 +5451,15 @@ namespace SketcherGui {
int GeoId = std::atoi(element.substr(4,4000).c_str()) - 1;
Sketcher::SketchObject *Sketch = static_cast<Sketcher::SketchObject*>(object);
const Part::Geometry *geom = Sketch->getGeometry(GeoId);
if (geom->getTypeId() == Part::GeomLineSegment::getClassTypeId() ||
geom->getTypeId() == Part::GeomCircle::getClassTypeId()||
geom->getTypeId() == Part::GeomArcOfCircle::getClassTypeId()||
geom->getTypeId() == Part::GeomEllipse::getClassTypeId()||
geom->getTypeId() == Part::GeomArcOfEllipse::getClassTypeId()
)
return true;
if (geom->getTypeId().isDerivedFrom(Part::GeomTrimmedCurve::getClassTypeId()) ||
geom->getTypeId() == Part::GeomCircle::getClassTypeId() ||
geom->getTypeId() == Part::GeomEllipse::getClassTypeId() ||
geom->getTypeId() == Part::GeomBSplineCurve::getClassTypeId()
) {
// We do not trim internal geometry of complex geometries
if( Sketcher::GeometryFacade::isInternalType(geom, Sketcher::InternalType::None))
return true;
}
}
return false;
}
Expand All @@ -5483,6 +5486,40 @@ class DrawSketchHandlerTrimming: public DrawSketchHandler
virtual void mouseMove(Base::Vector2d onSketchPos)
{
Q_UNUSED(onSketchPos);

int GeoId = sketchgui->getPreselectCurve();

if (GeoId > -1) {
auto sk = static_cast<Sketcher::SketchObject *>(sketchgui->getObject());
int GeoId1, GeoId2;
Base::Vector3d intersect1, intersect2;
if(sk->seekTrimPoints(GeoId, Base::Vector3d(onSketchPos.x,onSketchPos.y,0),
GeoId1, intersect1,
GeoId2, intersect2)) {

EditMarkers.resize(0);

if(GeoId1 != Sketcher::Constraint::GeoUndef)
EditMarkers.emplace_back(intersect1.x, intersect1.y);
else {
auto start = sk->getPoint(GeoId, Sketcher::start);
EditMarkers.emplace_back(start.x, start.y);
}

if(GeoId2 != Sketcher::Constraint::GeoUndef)
EditMarkers.emplace_back(intersect2.x, intersect2.y);
else {
auto end = sk->getPoint(GeoId, Sketcher::end);
EditMarkers.emplace_back( end.x, end.y);
}

sketchgui->drawEditMarkers(EditMarkers, 2); // maker augmented by two sizes (see supported marker sizes)
}
}
else {
EditMarkers.resize(0);
sketchgui->drawEditMarkers(EditMarkers, 2);
}
}

virtual bool pressButton(Base::Vector2d onSketchPos)
Expand All @@ -5496,11 +5533,10 @@ class DrawSketchHandlerTrimming: public DrawSketchHandler
int GeoId = sketchgui->getPreselectCurve();
if (GeoId > -1) {
const Part::Geometry *geom = sketchgui->getSketchObject()->getGeometry(GeoId);
if (geom->getTypeId() == Part::GeomLineSegment::getClassTypeId() ||
geom->getTypeId() == Part::GeomArcOfCircle::getClassTypeId() ||
geom->getTypeId() == Part::GeomCircle::getClassTypeId() ||
geom->getTypeId() == Part::GeomArcOfEllipse::getClassTypeId() ||
geom->getTypeId() == Part::GeomEllipse::getClassTypeId()) {
if (geom->getTypeId().isDerivedFrom(Part::GeomTrimmedCurve::getClassTypeId()) ||
geom->getTypeId() == Part::GeomCircle::getClassTypeId() ||
geom->getTypeId() == Part::GeomEllipse::getClassTypeId() ||
geom->getTypeId() == Part::GeomBSplineCurve::getClassTypeId() ) {
try {
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Trim edge"));
Gui::cmdAppObjectArgs(sketchgui->getObject(), "trim(%d,App.Vector(%f,%f,0))",
Expand All @@ -5513,12 +5549,17 @@ class DrawSketchHandlerTrimming: public DrawSketchHandler
Gui::Command::abortCommand();
}
}

EditMarkers.resize(0);
sketchgui->drawEditMarkers(EditMarkers);
}
else // exit the trimming tool if the user clicked on empty space
sketchgui->purgeHandler(); // no code after this line, Handler get deleted in ViewProvider

return true;
}
private:
std::vector<Base::Vector2d> EditMarkers;
};

DEF_STD_CMD_A(CmdSketcherTrimming)
Expand Down

0 comments on commit 28e40ff

Please sign in to comment.