Sketcher: Hyperbola perpendicularity constraint
================================================= Line perpendicular to hyperbola using via point constraint.
This commit is contained in:
parent
50ab33aeb4
commit
73930c4294
|
@ -504,8 +504,8 @@ void SketcherGui::makeTangentToArcOfHyperbolaviaNewPoint(const Sketcher::SketchO
|
||||||
Base::Vector3d direction=center2-focus;
|
Base::Vector3d direction=center2-focus;
|
||||||
double tapprox=atan2(direction.y,direction.x)-phi;
|
double tapprox=atan2(direction.y,direction.x)-phi;
|
||||||
|
|
||||||
Base::Vector3d PoH = Base::Vector3d(center.x+majord*cos(tapprox)*cos(phi)-minord*sin(tapprox)*sin(phi),
|
Base::Vector3d PoH = Base::Vector3d(center.x+majord*cosh(tapprox)*cos(phi)-minord*sinh(tapprox)*sin(phi),
|
||||||
center.y+majord*cos(tapprox)*sin(phi)+minord*sin(tapprox)*cos(phi), 0);
|
center.y+majord*cosh(tapprox)*sin(phi)+minord*sinh(tapprox)*cos(phi), 0);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Add a point
|
// Add a point
|
||||||
|
@ -1909,9 +1909,11 @@ void CmdSketcherConstrainPerpendicular::activated(int iMsg)
|
||||||
geo2 = Obj->getGeometry(GeoId2);
|
geo2 = Obj->getGeometry(GeoId2);
|
||||||
|
|
||||||
if( geo1->getTypeId() == Part::GeomEllipse::getClassTypeId() ||
|
if( geo1->getTypeId() == Part::GeomEllipse::getClassTypeId() ||
|
||||||
geo1->getTypeId() == Part::GeomArcOfEllipse::getClassTypeId() ) {
|
geo1->getTypeId() == Part::GeomArcOfEllipse::getClassTypeId() ||
|
||||||
|
geo1->getTypeId() == Part::GeomArcOfHyperbola::getClassTypeId()) {
|
||||||
|
|
||||||
Base::Vector3d center;
|
Base::Vector3d center;
|
||||||
|
Base::Vector3d majdir;
|
||||||
double majord = 0;
|
double majord = 0;
|
||||||
double minord = 0;
|
double minord = 0;
|
||||||
double phi = 0;
|
double phi = 0;
|
||||||
|
@ -1922,7 +1924,8 @@ void CmdSketcherConstrainPerpendicular::activated(int iMsg)
|
||||||
center=ellipse->getCenter();
|
center=ellipse->getCenter();
|
||||||
majord=ellipse->getMajorRadius();
|
majord=ellipse->getMajorRadius();
|
||||||
minord=ellipse->getMinorRadius();
|
minord=ellipse->getMinorRadius();
|
||||||
phi=atan2(ellipse->getMajorAxisDir().y, ellipse->getMajorAxisDir().x);
|
majdir=ellipse->getMajorAxisDir();
|
||||||
|
phi=atan2(majdir.y, majdir.x);
|
||||||
} else
|
} else
|
||||||
if( geo1->getTypeId() == Part::GeomArcOfEllipse::getClassTypeId() ){
|
if( geo1->getTypeId() == Part::GeomArcOfEllipse::getClassTypeId() ){
|
||||||
const Part::GeomArcOfEllipse *aoe = static_cast<const Part::GeomArcOfEllipse *>(geo1);
|
const Part::GeomArcOfEllipse *aoe = static_cast<const Part::GeomArcOfEllipse *>(geo1);
|
||||||
|
@ -1930,25 +1933,47 @@ void CmdSketcherConstrainPerpendicular::activated(int iMsg)
|
||||||
center=aoe->getCenter();
|
center=aoe->getCenter();
|
||||||
majord=aoe->getMajorRadius();
|
majord=aoe->getMajorRadius();
|
||||||
minord=aoe->getMinorRadius();
|
minord=aoe->getMinorRadius();
|
||||||
phi=atan2(aoe->getMajorAxisDir().y, aoe->getMajorAxisDir().x);
|
majdir=aoe->getMajorAxisDir();
|
||||||
|
phi=atan2(majdir.y, majdir.x);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
if( geo1->getTypeId() == Part::GeomArcOfHyperbola::getClassTypeId() ){
|
||||||
|
const Part::GeomArcOfHyperbola *aoh = static_cast<const Part::GeomArcOfHyperbola *>(geo1);
|
||||||
|
|
||||||
|
center=aoh->getCenter();
|
||||||
|
majord=aoh->getMajorRadius();
|
||||||
|
minord=aoh->getMinorRadius();
|
||||||
|
majdir=aoh->getMajorAxisDir();
|
||||||
|
phi=atan2(majdir.y, majdir.x);
|
||||||
|
}
|
||||||
|
|
||||||
const Part::GeomLineSegment *line = static_cast<const Part::GeomLineSegment *>(geo2);
|
const Part::GeomLineSegment *line = static_cast<const Part::GeomLineSegment *>(geo2);
|
||||||
|
|
||||||
Base::Vector3d point1=line->getStartPoint();
|
Base::Vector3d point1=line->getStartPoint();
|
||||||
|
Base::Vector3d PoO;
|
||||||
|
|
||||||
Base::Vector3d direction=point1-center;
|
|
||||||
double tapprox=atan2(direction.y,direction.x)-phi; // we approximate the eccentric anomally by the polar
|
|
||||||
|
|
||||||
Base::Vector3d PoE = Base::Vector3d(center.x+majord*cos(tapprox)*cos(phi)-minord*sin(tapprox)*sin(phi),
|
if( geo1->getTypeId() == Part::GeomArcOfHyperbola::getClassTypeId() ) {
|
||||||
center.y+majord*cos(tapprox)*sin(phi)+minord*sin(tapprox)*cos(phi), 0);
|
double df=sqrt(majord*majord+minord*minord);
|
||||||
|
Base::Vector3d direction=point1-(center+majdir*df); // towards the focus
|
||||||
|
double tapprox=atan2(direction.y,direction.x)-phi;
|
||||||
|
|
||||||
|
PoO = Base::Vector3d(center.x+majord*cosh(tapprox)*cos(phi)-minord*sinh(tapprox)*sin(phi),
|
||||||
|
center.y+majord*cosh(tapprox)*sin(phi)+minord*sinh(tapprox)*cos(phi), 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Base::Vector3d direction=point1-center;
|
||||||
|
double tapprox=atan2(direction.y,direction.x)-phi; // we approximate the eccentric anomally by the polar
|
||||||
|
|
||||||
|
PoO = Base::Vector3d(center.x+majord*cos(tapprox)*cos(phi)-minord*sin(tapprox)*sin(phi),
|
||||||
|
center.y+majord*cos(tapprox)*sin(phi)+minord*sin(tapprox)*cos(phi), 0);
|
||||||
|
}
|
||||||
openCommand("add perpendicular constraint");
|
openCommand("add perpendicular constraint");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Add a point
|
// Add a point
|
||||||
Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.addGeometry(Part.Point(App.Vector(%f,%f,0)))",
|
Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.addGeometry(Part.Point(App.Vector(%f,%f,0)))",
|
||||||
Obj->getNameInDocument(), PoE.x,PoE.y);
|
Obj->getNameInDocument(), PoO.x,PoO.y);
|
||||||
int GeoIdPoint = Obj->getHighestCurveIndex();
|
int GeoIdPoint = Obj->getHighestCurveIndex();
|
||||||
|
|
||||||
// Point on first object (ellipse, arc of ellipse)
|
// Point on first object (ellipse, arc of ellipse)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user