[TD]Allow override of dimension line angles

This commit is contained in:
Wanderer Fan
2022-01-26 09:37:14 -05:00
committed by WandererFan
parent 7ef448572d
commit 4da3c21dcf
9 changed files with 537 additions and 18 deletions

View File

@@ -26,12 +26,15 @@
#include <cmath>
#endif // #ifndef _PreComp_
# include <QMessageBox>
#include <Base/Console.h>
#include <Gui/Application.h>
#include <Gui/BitmapFactory.h>
#include <Gui/Command.h>
#include <Gui/Document.h>
#include <Gui/MainWindow.h>
#include <Gui/Selection.h>
#include <Gui/ViewProvider.h>
@@ -41,6 +44,8 @@
#include <Mod/TechDraw/App/DrawViewDimension.h>
#include <Mod/TechDraw/App/DrawPage.h>
#include <Mod/TechDraw/App/DrawUtil.h>
#include <Mod/TechDraw/App/Geometry.h>
#include "QGIViewDimension.h"
#include "ViewProviderDimension.h"
@@ -124,7 +129,22 @@ TaskDimension::TaskDimension(QGIViewDimension *parent, ViewProviderDimension *di
connect(ui->qsbFontSize, SIGNAL(valueChanged(double)), this, SLOT(onFontsizeChanged()));
ui->comboDrawingStyle->setCurrentIndex(dimensionVP->StandardAndStyle.getValue());
connect(ui->comboDrawingStyle, SIGNAL(currentIndexChanged(int)), this, SLOT(onDrawingStyleChanged()));
}
}
// Lines
ui->rbOverride->setChecked(parent->dvDimension->AngleOverride.getValue());
connect(ui->rbOverride, SIGNAL(toggled(bool)), this, SLOT(onOverrideToggled()));
ui->dsbDimAngle->setValue(parent->dvDimension->LineAngle.getValue());
connect(ui->dsbDimAngle, SIGNAL(valueChanged(double)), this, SLOT(onDimAngleChanged()));
ui->dsbExtAngle->setValue(parent->dvDimension->ExtensionAngle.getValue());
connect(ui->dsbExtAngle, SIGNAL(valueChanged(double)), this, SLOT(onExtAngleChanged()));
connect(ui->pbDimUseDefault, SIGNAL(clicked()), this, SLOT(onDimUseDefaultClicked()));
connect(ui->pbDimUseSelection, SIGNAL(clicked()), this, SLOT(onDimUseSelectionClicked()));
connect(ui->pbExtUseDefault, SIGNAL(clicked()), this, SLOT(onExtUseDefaultClicked()));
connect(ui->pbExtUseSelection, SIGNAL(clicked()), this, SLOT(onExtUseSelectionClicked()));
Gui::Document* doc = m_dimensionVP->getDocument();
doc->openCommand("TaskDimension");
}
TaskDimension::~TaskDimension()
@@ -294,6 +314,104 @@ void TaskDimension::onDrawingStyleChanged()
recomputeFeature();
}
void TaskDimension::onOverrideToggled()
{
m_parent->dvDimension->AngleOverride.setValue(ui->rbOverride->isChecked());
recomputeFeature();
}
void TaskDimension::onDimAngleChanged()
{
m_parent->dvDimension->LineAngle.setValue(ui->dsbDimAngle->value());
recomputeFeature();
}
void TaskDimension::onExtAngleChanged()
{
m_parent->dvDimension->ExtensionAngle.setValue(ui->dsbExtAngle->value());
recomputeFeature();
}
void TaskDimension::onDimUseDefaultClicked()
{
pointPair points = m_parent->dvDimension->getLinearPoints();
//duplicate coordinate conversion logic from QGIViewDimension
Base::Vector2d first2(points.first.x, -points.first.y);
Base::Vector2d second2(points.second.x, -points.second.y);
double lineAngle = (second2 - first2).Angle();
ui->dsbDimAngle->setValue(lineAngle * 180.0 / M_PI);
}
void TaskDimension::onDimUseSelectionClicked()
{
std::pair<double, bool> result = getAngleFromSelection();
if (result.second) {
ui->dsbDimAngle->setValue(result.first * 180.0 / M_PI);
}
}
void TaskDimension::onExtUseDefaultClicked()
{
pointPair points = m_parent->dvDimension->getLinearPoints();
//duplicate coordinate conversion logic from QGIViewDimension
Base::Vector2d first2(points.first.x, -points.first.y);
Base::Vector2d second2(points.second.x, -points.second.y);
Base::Vector2d lineDirection = second2 - first2;
Base::Vector2d extensionDirection(-lineDirection.y, lineDirection.x);
double extensionAngle = extensionDirection.Angle();
ui->dsbExtAngle->setValue(extensionAngle * 180.0 / M_PI);
}
void TaskDimension::onExtUseSelectionClicked()
{
std::pair<double, bool> result = getAngleFromSelection();
if (result.second) {
ui->dsbExtAngle->setValue(result.first * 180.0 / M_PI);
}
}
std::pair<double, bool> TaskDimension::getAngleFromSelection()
{
std::pair<double, bool> result;
result.first = 0.0;
result.second = true;
std::vector<Gui::SelectionObject> selection = Gui::Selection().getSelectionEx();
TechDraw::DrawViewPart * objFeat = 0;
std::vector<std::string> SubNames;
if (!selection.empty()) {
objFeat = static_cast<TechDraw::DrawViewPart*> (selection.front().getObject());
SubNames = selection.front().getSubNames();
if (SubNames.size() == 2) { //expecting Vertices
std::string geomName0 = DrawUtil::getGeomTypeFromName(SubNames[0]);
int geomIndex0 = DrawUtil::getIndexFromName(SubNames[0]);
std::string geomName1 = DrawUtil::getGeomTypeFromName(SubNames[1]);
int geomIndex1 = DrawUtil::getIndexFromName(SubNames[1]);
if ((geomName0 == "Vertex") && (geomName1 == "Vertex")) {
TechDraw::VertexPtr v0 = objFeat->getProjVertexByIndex(geomIndex0);
TechDraw::VertexPtr v1 = objFeat->getProjVertexByIndex(geomIndex1);
Base::Vector2d v02(v0->point().x, -v0->point().y);
Base::Vector2d v12(v1->point().x, -v1->point().y);
result.first = (v12 - v02).Angle();
return result;
}
} else if (SubNames.size() == 1) { //expecting Edge
std::string geomName0 = DrawUtil::getGeomTypeFromName(SubNames[0]);
int geomIndex0 = DrawUtil::getIndexFromName(SubNames[0]);
if (geomName0 == "Edge") {
TechDraw::BaseGeomPtr edge = objFeat->getGeomByIndex(geomIndex0);
Base::Vector2d v02(edge->getStartPoint().x, -edge->getStartPoint().y);
Base::Vector2d v12(edge->getEndPoint().x, -edge->getEndPoint().y);
result.first = (v12 - v02).Angle();
return result;
}
}
}
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"),
QObject::tr("Select 2 Vertexes or 1 Edge"));
result.second = false;
return result;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TaskDlgDimension::TaskDlgDimension(QGIViewDimension *parent, ViewProviderDimension *dimensionVP) :