[Sketcher] Moved radius to constraint mode framework
This commit is contained in:
parent
3d9b46d9f3
commit
cc46acf10e
|
@ -4428,17 +4428,26 @@ void CmdSketcherConstrainTangent::applyConstraint(std::vector<SelIdPair> &selSeq
|
||||||
getSelection().clearSelection();
|
getSelection().clearSelection();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ======================================================================================
|
// ======================================================================================
|
||||||
|
|
||||||
DEF_STD_CMD_AU(CmdSketcherConstrainRadius);
|
class CmdSketcherConstrainRadius : public CmdSketcherConstraint
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CmdSketcherConstrainRadius();
|
||||||
|
virtual ~CmdSketcherConstrainRadius(){}
|
||||||
|
virtual void updateAction(int mode);
|
||||||
|
virtual const char* className() const
|
||||||
|
{ return "CmdSketcherConstrainRadius"; }
|
||||||
|
protected:
|
||||||
|
virtual void activated(int iMsg);
|
||||||
|
virtual void applyConstraint(std::vector<SelIdPair> &selSeq, int seqIndex);
|
||||||
|
};
|
||||||
|
|
||||||
CmdSketcherConstrainRadius::CmdSketcherConstrainRadius()
|
CmdSketcherConstrainRadius::CmdSketcherConstrainRadius()
|
||||||
:Command("Sketcher_ConstrainRadius")
|
:CmdSketcherConstraint("Sketcher_ConstrainRadius")
|
||||||
{
|
{
|
||||||
sAppModule = "Sketcher";
|
sAppModule = "Sketcher";
|
||||||
sGroup = QT_TR_NOOP("Sketcher");
|
sGroup = QT_TR_NOOP("Sketcher");
|
||||||
|
@ -4449,6 +4458,9 @@ CmdSketcherConstrainRadius::CmdSketcherConstrainRadius()
|
||||||
sPixmap = "Constraint_Radius";
|
sPixmap = "Constraint_Radius";
|
||||||
sAccel = "SHIFT+R";
|
sAccel = "SHIFT+R";
|
||||||
eType = ForEdit;
|
eType = ForEdit;
|
||||||
|
|
||||||
|
allowedSelSequences = {{SelEdge}};
|
||||||
|
constraintCursor = cursor_genericconstraint;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CmdSketcherConstrainRadius::activated(int iMsg)
|
void CmdSketcherConstrainRadius::activated(int iMsg)
|
||||||
|
@ -4459,8 +4471,9 @@ void CmdSketcherConstrainRadius::activated(int iMsg)
|
||||||
|
|
||||||
// only one sketch with its subelements are allowed to be selected
|
// only one sketch with its subelements are allowed to be selected
|
||||||
if (selection.size() != 1) {
|
if (selection.size() != 1) {
|
||||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
ActivateHandler(getActiveGuiDocument(),
|
||||||
QObject::tr("Select one or more arcs or circles from the sketch."));
|
new DrawSketchHandlerGenConstraint(constraintCursor, this));
|
||||||
|
getSelection().clearSelection();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4739,6 +4752,151 @@ void CmdSketcherConstrainRadius::activated(int iMsg)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CmdSketcherConstrainRadius::applyConstraint(std::vector<SelIdPair> &selSeq, int seqIndex)
|
||||||
|
{
|
||||||
|
SketcherGui::ViewProviderSketch* sketchgui = static_cast<SketcherGui::ViewProviderSketch*>(getActiveGuiDocument()->getInEdit());
|
||||||
|
Sketcher::SketchObject* Obj = sketchgui->getSketchObject();
|
||||||
|
|
||||||
|
int GeoId = selSeq.at(0).GeoId;
|
||||||
|
double radius = 0.0;
|
||||||
|
|
||||||
|
bool commitNeeded=false;
|
||||||
|
bool updateNeeded=false;
|
||||||
|
|
||||||
|
switch (seqIndex) {
|
||||||
|
case 0: // {SelEdge}
|
||||||
|
const Part::Geometry *geom = Obj->getGeometry(GeoId);
|
||||||
|
if (geom && geom->getTypeId() == Part::GeomArcOfCircle::getClassTypeId()) {
|
||||||
|
const Part::GeomArcOfCircle *arc = static_cast<const Part::GeomArcOfCircle *>(geom);
|
||||||
|
radius = arc->getRadius();
|
||||||
|
}
|
||||||
|
else if (geom && geom->getTypeId() == Part::GeomCircle::getClassTypeId()) {
|
||||||
|
const Part::GeomCircle *circle = static_cast<const Part::GeomCircle *>(geom);
|
||||||
|
radius = circle->getRadius();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||||
|
QObject::tr("Constraint only applies to arcs or circles."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the radius constraint now
|
||||||
|
openCommand("Add radius constraint");
|
||||||
|
Gui::Command::doCommand(Doc, "App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('Radius',%d,%f)) ",
|
||||||
|
Obj->getNameInDocument(), GeoId, radius);
|
||||||
|
|
||||||
|
const std::vector<Sketcher::Constraint *> &ConStr = Obj->Constraints.getValues();
|
||||||
|
|
||||||
|
int indexConstr = ConStr.size() - 1;
|
||||||
|
|
||||||
|
if(constraintCreationMode==Reference) {
|
||||||
|
Gui::Command::doCommand(Doc, "App.ActiveDocument.%s.setDriving(%i,%s)",
|
||||||
|
Obj->getNameInDocument(), ConStr.size()-1, "False");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Guess some reasonable distance for placing the datum text
|
||||||
|
Gui::Document *doc = getActiveGuiDocument();
|
||||||
|
float sf = 1.f;
|
||||||
|
if (doc && doc->getInEdit() && doc->getInEdit()->isDerivedFrom(SketcherGui::ViewProviderSketch::getClassTypeId())) {
|
||||||
|
SketcherGui::ViewProviderSketch *vp = static_cast<SketcherGui::ViewProviderSketch*>(doc->getInEdit());
|
||||||
|
sf = vp->getScaleFactor();
|
||||||
|
|
||||||
|
Sketcher::Constraint *constr = ConStr[ConStr.size()-1];
|
||||||
|
constr->LabelDistance = 2. * sf;
|
||||||
|
vp->draw(); // Redraw
|
||||||
|
}
|
||||||
|
|
||||||
|
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Mod/Sketcher");
|
||||||
|
bool show = hGrp->GetBool("ShowDialogOnDistanceConstraint", true);
|
||||||
|
// Ask for the value of the radius immediately
|
||||||
|
if (show && constraintCreationMode==Driving) {
|
||||||
|
QDialog dlg(Gui::getMainWindow());
|
||||||
|
Ui::InsertDatum ui_Datum;
|
||||||
|
ui_Datum.setupUi(&dlg);
|
||||||
|
dlg.setWindowTitle(EditDatumDialog::tr("Change radius"));
|
||||||
|
ui_Datum.label->setText(EditDatumDialog::tr("Radius:"));
|
||||||
|
Base::Quantity init_val;
|
||||||
|
init_val.setUnit(Base::Unit::Length);
|
||||||
|
init_val.setValue(radius);
|
||||||
|
|
||||||
|
ui_Datum.labelEdit->setValue(init_val);
|
||||||
|
ui_Datum.labelEdit->selectNumber();
|
||||||
|
ui_Datum.labelEdit->bind(Obj->Constraints.createPath(indexConstr));
|
||||||
|
|
||||||
|
if (dlg.exec() == QDialog::Accepted) {
|
||||||
|
Base::Quantity newQuant = ui_Datum.labelEdit->value();
|
||||||
|
double newRadius = newQuant.getValue();
|
||||||
|
|
||||||
|
try {
|
||||||
|
doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.setDatum(%i,App.Units.Quantity('%f %s'))",
|
||||||
|
Obj->getNameInDocument(),
|
||||||
|
indexConstr, newRadius, (const char*)newQuant.getUnit().getString().toUtf8());
|
||||||
|
|
||||||
|
QString constraintName = ui_Datum.name->text().trimmed();
|
||||||
|
if (Base::Tools::toStdString(constraintName) != Obj->Constraints[indexConstr]->Name) {
|
||||||
|
std::string escapedstr = Base::Tools::escapedUnicodeFromUtf8(constraintName.toUtf8().constData());
|
||||||
|
Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.renameConstraint(%d, u'%s')",
|
||||||
|
Obj->getNameInDocument(),
|
||||||
|
indexConstr, escapedstr.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
commitCommand();
|
||||||
|
|
||||||
|
bool autoRecompute = hGrp->GetBool("AutoRecompute",false);
|
||||||
|
|
||||||
|
if (Obj->noRecomputes && Obj->ExpressionEngine.depsAreTouched()) {
|
||||||
|
Obj->ExpressionEngine.execute();
|
||||||
|
Obj->solve();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(autoRecompute)
|
||||||
|
Gui::Command::updateActive();
|
||||||
|
|
||||||
|
commitNeeded=false;
|
||||||
|
updateNeeded=false;
|
||||||
|
}
|
||||||
|
catch (const Base::Exception& e) {
|
||||||
|
QMessageBox::critical(qApp->activeWindow(), QObject::tr("Dimensional constraint"), QString::fromUtf8(e.what()));
|
||||||
|
abortCommand();
|
||||||
|
|
||||||
|
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Mod/Sketcher");
|
||||||
|
bool autoRecompute = hGrp->GetBool("AutoRecompute",false);
|
||||||
|
|
||||||
|
if(autoRecompute) // toggling does not modify the DoF of the solver, however it may affect features depending on the sketch
|
||||||
|
Gui::Command::updateActive();
|
||||||
|
else
|
||||||
|
Obj->solve(); // we have to update the solver after this aborted addition.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// command canceled
|
||||||
|
abortCommand();
|
||||||
|
|
||||||
|
updateNeeded=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// now dialog was shown so commit the command
|
||||||
|
commitCommand();
|
||||||
|
commitNeeded=false;
|
||||||
|
}
|
||||||
|
//updateActive();
|
||||||
|
getSelection().clearSelection();
|
||||||
|
|
||||||
|
if(commitNeeded)
|
||||||
|
commitCommand();
|
||||||
|
|
||||||
|
if(updateNeeded) {
|
||||||
|
bool autoRecompute = hGrp->GetBool("AutoRecompute",false);
|
||||||
|
|
||||||
|
if(autoRecompute)
|
||||||
|
Gui::Command::updateActive();
|
||||||
|
else
|
||||||
|
Obj->solve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CmdSketcherConstrainRadius::updateAction(int mode)
|
void CmdSketcherConstrainRadius::updateAction(int mode)
|
||||||
{
|
{
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
|
@ -4753,11 +4911,6 @@ void CmdSketcherConstrainRadius::updateAction(int mode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CmdSketcherConstrainRadius::isActive(void)
|
|
||||||
{
|
|
||||||
return isCreateConstraintActive( getActiveGuiDocument() );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ======================================================================================
|
// ======================================================================================
|
||||||
|
|
||||||
DEF_STD_CMD_AU(CmdSketcherConstrainAngle);
|
DEF_STD_CMD_AU(CmdSketcherConstrainAngle);
|
||||||
|
@ -5059,8 +5212,6 @@ bool CmdSketcherConstrainAngle::isActive(void)
|
||||||
|
|
||||||
// ======================================================================================
|
// ======================================================================================
|
||||||
|
|
||||||
//DEF_STD_CMD_A(CmdSketcherConstrainEqual);
|
|
||||||
|
|
||||||
class CmdSketcherConstrainEqual : public CmdSketcherConstraint
|
class CmdSketcherConstrainEqual : public CmdSketcherConstraint
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -5235,8 +5386,6 @@ void CmdSketcherConstrainEqual::applyConstraint(std::vector<SelIdPair> &selSeq,
|
||||||
|
|
||||||
// ======================================================================================
|
// ======================================================================================
|
||||||
|
|
||||||
//DEF_STD_CMD_A(CmdSketcherConstrainSymmetric);
|
|
||||||
|
|
||||||
class CmdSketcherConstrainSymmetric : public CmdSketcherConstraint
|
class CmdSketcherConstrainSymmetric : public CmdSketcherConstraint
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user