Techdraw: Smart Dimension: Fixes and simplifies code

This commit is contained in:
PaddleStroke
2024-04-22 16:59:55 +02:00
parent 41650a78d4
commit cc393632e1
12 changed files with 306 additions and 219 deletions

View File

@@ -30,6 +30,7 @@
#include <QMessageBox>
#include <QKeyEvent>
#include <QMouseEvent>
#include <QPoint>
#endif//#ifndef _PreComp_
#include <App/Document.h>
@@ -178,7 +179,7 @@ public:
: SelectionObserver(true)
, specialDimension(SpecialDimension::None)
, availableDimension(AvailableDimension::FIRST)
, previousPos(QPoint(0, 0))
, mousePos(QPoint(0, 0))
, selPoints({})
, selLine({})
, selCircleArc({})
@@ -218,6 +219,10 @@ public:
void activated() override
{
auto* mdi = dynamic_cast<MDIViewPage*>(Gui::getMainWindow()->activeWindow());
if (mdi) {
mdi->setDimensionsSelectability(false);
}
Gui::Selection().setSelectionStyle(Gui::SelectionSingleton::SelectionStyle::GreedySelection);
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Insert Dimension"));
handleInitialSelection();
@@ -225,6 +230,10 @@ public:
void deactivated() override
{
auto* mdi = dynamic_cast<MDIViewPage*>(Gui::getMainWindow()->activeWindow());
if (mdi) {
mdi->setDimensionsSelectability(true);
}
Gui::Selection().setSelectionStyle(Gui::SelectionSingleton::SelectionStyle::NormalSelection);
Gui::Command::abortCommand();
}
@@ -247,7 +256,7 @@ public:
else if (availableDimension == AvailableDimension::FIFTH || availableDimension == AvailableDimension::RESET) {
availableDimension = AvailableDimension::FIRST;
}
makeAppropriateDimension(previousPos);
makeAppropriateDimension();
event->accept();
}
else if (event->key() == Qt::Key_Z && (QApplication::keyboardModifiers() & Qt::ControlModifier)) {
@@ -270,7 +279,7 @@ public:
void mouseMoveEvent(QMouseEvent* event) override
{
previousPos = event->pos();
mousePos = event->pos();
if (dims.empty()){
return;
@@ -280,13 +289,13 @@ public:
Base::Vector3d dirMaster, delta;
//Change distance dimension based on position of mouse.
if (specialDimension == SpecialDimension::LineOr2PointsDistance){
updateDistanceType(event->pos());
updateDistanceType();
}
else if (specialDimension == SpecialDimension::ExtendDistance){
updateExtentDistanceType(event->pos());
updateExtentDistanceType();
}
else if (specialDimension == SpecialDimension::ChainDistance || specialDimension == SpecialDimension::CoordDistance){
updateChainDistanceType(event->pos());
updateChainDistanceType();
textToMiddle = true;
pointPair pp = dims[0]->getLinearPoints();
dirMaster = pp.second() - pp.first();
@@ -301,7 +310,7 @@ public:
int i = 0;
for (auto* dim : dims) {
auto dimType = static_cast<DimensionType>(dim->Type.getValue());
moveDimension(event->pos(), dim, textToMiddle, dirMaster, delta, dimType, i);
moveDimension(mousePos, dim, textToMiddle, dirMaster, delta, dimType, i);
if (specialDimension == SpecialDimension::CoordDistance) {
i++;
@@ -321,7 +330,7 @@ public:
}
return qgivDimension->getDatumLabel();
}
void moveDimension(QPoint& pos, DrawViewDimension* dim, bool textToMiddle = false, Base::Vector3d dir = Base::Vector3d(),
void moveDimension(QPoint pos, DrawViewDimension* dim, bool textToMiddle = false, Base::Vector3d dir = Base::Vector3d(),
Base::Vector3d delta = Base::Vector3d(), DimensionType type = DimensionType::Distance, int i = 0)
{
if (!dim) { return; }
@@ -330,14 +339,14 @@ public:
label->setPos(getDimPositionToBe(pos, label->pos(), textToMiddle, dir, delta, type, i));
}
QPointF getDimPositionToBe(QPoint& pos, QPointF curPos = QPointF(), bool textToMiddle = false, Base::Vector3d dir = Base::Vector3d(),
QPointF getDimPositionToBe(QPoint pos, QPointF curPos = QPointF(), bool textToMiddle = false, Base::Vector3d dir = Base::Vector3d(),
Base::Vector3d delta = Base::Vector3d(), DimensionType type = DimensionType::Distance, int i = 0)
{
auto* vpp = dynamic_cast<ViewProviderDrawingView*>(Gui::Application::Instance->getViewProvider(partFeat));
if (!vpp) { return QPointF(); }
QPointF scenePos = viewPage->mapToScene(pos) - vpp->getQView()->pos();
QPointF scenePos = viewPage->mapToScene(pos) - vpp->getQView()->scenePos();
if (textToMiddle) {
// delta is for coord distances. i = 0 when it's a chain so delta is ignored.
@@ -383,86 +392,104 @@ public:
}
}
bool mousePressEvent(QMouseEvent* event) override
void setDimsSelectability(bool val)
{
if (event->button() == Qt::RightButton && !dims.empty()) {
Gui::Selection().clearSelection();
clearAndRestartCommand();
event->accept();
return true;
for (auto dim : dims) {
setDimSelectability(dim, val);
}
}
void setDimSelectability(DrawViewDimension* d, bool val)
{
QGIDatumLabel* label = getDimLabel(d);
if (label) {
label->setSelectability(val);
}
return TechDrawHandler::mousePressEvent(event);
}
bool mouseReleaseEvent(QMouseEvent* event) override
void mouseReleaseEvent(QMouseEvent* event) override
{
// Base::Console().Warning("mouseReleaseEvent TH\n");
bool finalize = true;
if (removedRef.hasGeometry()) {
finalize = false;
//Base::Console().Warning("RmvSelection \n");
// Remove the reference from the vector
ReferenceVector& selVector = getSelectionVector(removedRef);
selVector.erase(std::remove(selVector.begin(), selVector.end(), removedRef), selVector.end());
if (!selectionEmpty()) {
availableDimension = AvailableDimension::FIRST;
makeAppropriateDimension(event->pos());
}
else {
if (event->button() == Qt::RightButton) {
if (!dims.empty()) {
Gui::Selection().clearSelection();
clearAndRestartCommand();
}
removedRef = ReferenceEntry();
}
if (addedRef.hasGeometry()) {
finalize = false;
//Base::Console().Warning("AddSelection\n");
//add the geometry to its type vector. Temporarily if not selAllowed
if (addedRef.getSubName() == "") {
// Behavior deactivated for now because I found it annoying.
// To reactivate replace addedRef.hasGeometry() by addedRef.getObject() above.
// This means user selected the view itself.
if (selectionEmpty()) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Extent dimension"));
createExtentDistanceDimension("DistanceX", event->pos());
}
event->accept();
}
else {
ReferenceVector& selVector = getSelectionVector(addedRef);
selVector.push_back(addedRef);
TechDrawHandler::mouseReleaseEvent(event);
}
return;
}
else if (event->button() == Qt::LeftButton) {
mousePos = event->pos();
availableDimension = AvailableDimension::FIRST;
bool selAllowed = makeAppropriateDimension(event->pos());
bool finalize = true;
if (!selAllowed) {
// remove from selection
blockRemoveSel = true;
if (removedRef.hasGeometry()) {
finalize = false;
//Base::Console().Warning("RmvSelection \n");
// Remove the reference from the vector
ReferenceVector& selVector = getSelectionVector(removedRef);
selVector.erase(std::remove(selVector.begin(), selVector.end(), removedRef), selVector.end());
Gui::Selection().rmvSelection(addedRef.getObject()->getDocument()->getName(), addedRef.getObject()->getNameInDocument(), addedRef.getSubName().c_str());
blockRemoveSel = false;
if (!selectionEmpty()) {
availableDimension = AvailableDimension::FIRST;
makeAppropriateDimension();
}
else {
clearAndRestartCommand();
}
removedRef = ReferenceEntry();
}
if (selVector == selFaces) {
// if sel face and not allowed, then a dimension is being created
// and user clicked on a face to drop it.
// Better would be to disable face selectability when needed.
finalize = true;
if (addedRef.hasGeometry()) {
finalize = false;
//Base::Console().Warning("AddSelection\n");
//add the geometry to its type vector. Temporarily if not selAllowed
if (addedRef.getSubName() == "") {
// Behavior deactivated for now because I found it annoying.
// To reactivate replace addedRef.hasGeometry() by addedRef.getObject() above.
// This means user selected the view itself.
if (selectionEmpty()) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Extent dimension"));
createExtentDistanceDimension("DistanceX");
}
}
else {
ReferenceVector& selVector = getSelectionVector(addedRef);
selVector.push_back(addedRef);
availableDimension = AvailableDimension::FIRST;
bool selAllowed = makeAppropriateDimension();
if (!selAllowed) {
// remove from selection
blockRemoveSel = true;
Gui::Selection().rmvSelection(addedRef.getObject()->getDocument()->getName(),
addedRef.getObject()->getNameInDocument(), addedRef.getSubName().c_str());
blockRemoveSel = false;
if (selVector == selFaces) {
// if sel face and not allowed, then a dimension is being created
// and user clicked on a face to drop it.
// Better would be to disable face selectability when needed.
finalize = true;
}
}
}
addedRef = ReferenceEntry();
}
addedRef = ReferenceEntry();
}
// Finalize if click on empty space.
if (finalize && !dims.empty()) {
finalizeCommand();
// Finalize if click on empty space.
if (finalize && !dims.empty()) {
finalizeCommand();
}
}
return true;
}
void onSelectionChanged(const Gui::SelectionChanges& msg)
void onSelectionChanged(const Gui::SelectionChanges& msg) override
{
//Base::Console().Warning("onSelectionChanged %d - --%s--\n", (int)msg.Type, msg.pSubName);
@@ -539,7 +566,7 @@ protected:
SpecialDimension specialDimension;
AvailableDimension availableDimension;
QPoint previousPos;
QPoint mousePos;
ReferenceVector selPoints;
ReferenceVector selLine;
@@ -578,7 +605,7 @@ protected:
}
// See if the selection is valid
bool selAllowed = makeAppropriateDimension(QPoint());
bool selAllowed = makeAppropriateDimension();
if (!selAllowed) {
clearRefVectors();
@@ -704,316 +731,322 @@ protected:
return result;
}
bool makeAppropriateDimension(QPoint& pos) {
bool makeAppropriateDimension() {
bool selAllowed = false;
//Base::Console().Warning("makeAppropriateDimension %d %d %d %d %d %d\n", selPoints.size(), selLine.size(), selCircleArc.size(), selEllipseArc.size(), selSplineAndCo.size(), selFaces.size());
GeomSelectionSizes selection(selPoints.size(), selLine.size(), selCircleArc.size(), selEllipseArc.size(), selSplineAndCo.size(), selFaces.size());
if (selection.hasFaces()) {
if (selection.has1Face()) { makeCts_Faces(selAllowed, pos); }
if (selection.has1Face()) { makeCts_Faces(selAllowed); }
else { return false; } // nothing else with face works
}
else if (selection.hasPoints()) {
if (selection.has1Point()) { selAllowed = true; }
else if (selection.has2Points()) { makeCts_2Point(selAllowed, pos); }
else if (selection.has3Points()) { makeCts_3Point(selAllowed, pos); }
else if (selection.has4MorePoints()) { makeCts_4MorePoints(selAllowed, pos); }
else if (selection.has1Point1Line()) { makeCts_1Point1Line(selAllowed, pos); }
else if (selection.has1Point1Circle()) { makeCts_1Point1Circle(selAllowed, pos); }
else if (selection.has1Point1Ellipse()) { makeCts_1Point1Ellipse(selAllowed, pos); }
else if (selection.has2Points()) { makeCts_2Point(selAllowed); }
else if (selection.has3Points()) { makeCts_3Point(selAllowed); }
else if (selection.has4MorePoints()) { makeCts_4MorePoints(selAllowed); }
else if (selection.has1Point1Line()) { makeCts_1Point1Line(selAllowed); }
else if (selection.has1Point1Circle()) { makeCts_1Point1Circle(selAllowed); }
else if (selection.has1Point1Ellipse()) { makeCts_1Point1Ellipse(selAllowed); }
}
else if (selection.hasLines()) {
if (selection.has1Line()) { makeCts_1Line(selAllowed, pos); }
else if (selection.has2Lines()) { makeCts_2Line(selAllowed, pos); }
else if (selection.has1Line1Circle()) { makeCts_1Line1Circle(selAllowed, pos); }
else if (selection.has1Line1Ellipse()) { makeCts_1Line1Ellipse(selAllowed, pos); }
if (selection.has1Line()) { makeCts_1Line(selAllowed); }
else if (selection.has2Lines()) { makeCts_2Line(selAllowed); }
else if (selection.has1Line1Circle()) { makeCts_1Line1Circle(selAllowed); }
else if (selection.has1Line1Ellipse()) { makeCts_1Line1Ellipse(selAllowed); }
}
else if (selection.hasCirclesOrArcs()) {
if (selection.has1Circle()) { makeCts_1Circle(selAllowed, pos); }
else if (selection.has2Circles()) { makeCts_2Circle(selAllowed, pos); }
if (selection.has1Circle()) { makeCts_1Circle(selAllowed); }
else if (selection.has2Circles()) { makeCts_2Circle(selAllowed); }
}
else if (selection.hasEllipseAndCo()) {
if (selection.has1Ellipse()) { makeCts_1Ellipse(selAllowed, pos); }
if (selection.has2Ellipses()) { makeCts_2Ellipses(selAllowed, pos); }
if (selection.has1Ellipse()) { makeCts_1Ellipse(selAllowed); }
if (selection.has2Ellipses()) { makeCts_2Ellipses(selAllowed); }
}
else if (selection.hasSplineAndCo()) {
if (selection.has1Spline()) { makeCts_1Spline(selAllowed, pos); }
if (selection.has1SplineAndMore()) { makeCts_1SplineAndMore(selAllowed, pos); }
if (selection.has1Spline()) { makeCts_1Spline(selAllowed); }
if (selection.has1SplineAndMore()) { makeCts_1SplineAndMore(selAllowed); }
}
// Make created constraints unselectable.
if (selAllowed) {
setDimsSelectability(false);
}
return selAllowed;
}
void makeCts_Faces(bool& selAllowed, QPoint& pos)
void makeCts_Faces(bool& selAllowed)
{
//area
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Area dimension"));
createAreaDimension(selFaces[0], pos);
createAreaDimension(selFaces[0]);
selAllowed = true;
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_2Point(bool& selAllowed, QPoint& pos)
void makeCts_2Point(bool& selAllowed)
{
//distance
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Distance dimension"));
createDistanceDimension("Distance", selPoints[0], selPoints[1], pos);
createDistanceDimension("Distance", { selPoints[0], selPoints[1] });
specialDimension = SpecialDimension::LineOr2PointsDistance;
selAllowed = true;
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_3Point(bool& selAllowed, QPoint& pos)
void makeCts_3Point(bool& selAllowed)
{
// chain distances, angle
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add horizontal chain dimensions"));
createChainDimension("DistanceX", pos);
createChainDimension("DistanceX");
selAllowed = true;
}
if (availableDimension == AvailableDimension::SECOND) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add horizontal coordinate dimensions"));
createCoordDimension("DistanceX", pos);
createCoordDimension("DistanceX");
}
if (availableDimension == AvailableDimension::THIRD) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add 3-points angle dimension"));
create3pAngleDimension(selPoints[0], selPoints[1], selPoints[2], pos);
create3pAngleDimension({ selPoints[0], selPoints[1], selPoints[2] });
}
else if (availableDimension == AvailableDimension::FOURTH) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add 3-points angle dimension"));
create3pAngleDimension(selPoints[1], selPoints[2], selPoints[0], pos);
create3pAngleDimension({ selPoints[1], selPoints[2], selPoints[0] });
}
else if (availableDimension == AvailableDimension::FIFTH) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add 3-points angle dimension"));
create3pAngleDimension(selPoints[2], selPoints[0], selPoints[1], pos);
create3pAngleDimension({ selPoints[2], selPoints[0], selPoints[1] });
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_4MorePoints(bool& selAllowed, QPoint& pos)
void makeCts_4MorePoints(bool& selAllowed)
{
// chain distances
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add horizontal chain dimension"));
createChainDimension("DistanceX", pos);
createChainDimension("DistanceX");
selAllowed = true;
}
if (availableDimension == AvailableDimension::SECOND) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add horizontal coordinate dimensions"));
createCoordDimension("DistanceX", pos);
createCoordDimension("DistanceX");
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_1Point1Line(bool& selAllowed, QPoint& pos)
void makeCts_1Point1Line(bool& selAllowed)
{
//distance
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add point to line Distance dimension"));
createDistanceDimension("Distance", selPoints[0], selLine[0], pos);
createDistanceDimension("Distance", { selPoints[0], selLine[0] });
selAllowed = true;
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_1Point1Circle(bool& selAllowed, QPoint& pos)
void makeCts_1Point1Circle(bool& selAllowed)
{
//Distance, extent distance
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add length dimension"));
createDistanceDimension("Distance", selPoints[0], selCircleArc[0], pos);
createDistanceDimension("Distance", { selPoints[0], selCircleArc[0] });
selAllowed = true;
}
if (availableDimension == AvailableDimension::SECOND) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Extent dimension"));
createExtentDistanceDimension("DistanceX", pos);
createExtentDistanceDimension("DistanceX");
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_1Point1Ellipse(bool& selAllowed, QPoint& pos)
void makeCts_1Point1Ellipse(bool& selAllowed)
{
//Distance
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add length dimension"));
createDistanceDimension("Distance", selPoints[0], selEllipseArc[0], pos);
createDistanceDimension("Distance", { selPoints[0], selEllipseArc[0] });
selAllowed = true;
}
if (availableDimension == AvailableDimension::SECOND) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Extent dimension"));
createExtentDistanceDimension("DistanceX", pos);
createExtentDistanceDimension("DistanceX");
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_1Line(bool& selAllowed, QPoint& pos)
void makeCts_1Line(bool& selAllowed)
{
//distance
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add length dimension"));
createDistanceDimension("Distance", selLine[0], ReferenceEntry(), pos);
createDistanceDimension("Distance", { selLine[0] });
specialDimension = SpecialDimension::LineOr2PointsDistance;
selAllowed = true;
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_2Line(bool& selAllowed, QPoint& pos)
void makeCts_2Line(bool& selAllowed)
{
//angle (if parallel: Distance (see in createAngleDimension)).
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Angle dimension"));
createAngleDimension(selLine[0], selLine[1], pos);
createAngleDimension(selLine[0], selLine[1]);
selAllowed = true;
}
if (availableDimension == AvailableDimension::SECOND) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Extent dimension"));
createExtentDistanceDimension("DistanceX", pos);
createExtentDistanceDimension("DistanceX");
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_1Line1Circle(bool& selAllowed, QPoint& pos)
void makeCts_1Line1Circle(bool& selAllowed)
{
//distance, extent distance
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add circle to line Distance dimension"));
createDistanceDimension("Distance", selCircleArc[0], selLine[0], pos);
createDistanceDimension("Distance", { selCircleArc[0], selLine[0] });
selAllowed = true;
}
if (availableDimension == AvailableDimension::SECOND) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Extent dimension"));
createExtentDistanceDimension("DistanceX", pos);
createExtentDistanceDimension("DistanceX");
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_1Line1Ellipse(bool& selAllowed, QPoint& pos)
void makeCts_1Line1Ellipse(bool& selAllowed)
{
//distance, extent distance
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add ellipse to line Distance dimension"));
createDistanceDimension("Distance", selEllipseArc[0], selLine[0], pos);
createDistanceDimension("Distance", { selEllipseArc[0], selLine[0] });
selAllowed = true;
}
if (availableDimension == AvailableDimension::SECOND) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Extent dimension"));
createExtentDistanceDimension("DistanceX", pos);
createExtentDistanceDimension("DistanceX");
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_1Circle(bool& selAllowed, QPoint& pos)
void makeCts_1Circle(bool& selAllowed)
{
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Radius dimension"));
createRadiusDiameterDimension(selCircleArc[0], pos, true);
createRadiusDiameterDimension(selCircleArc[0], true);
selAllowed = true;
}
if (availableDimension == AvailableDimension::SECOND) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Radius dimension"));
createRadiusDiameterDimension(selCircleArc[0], pos, false);
createRadiusDiameterDimension(selCircleArc[0], false);
if (selCircleArc[0].geomEdgeType() != TechDraw::ARCOFCIRCLE) {
availableDimension = AvailableDimension::RESET;
}
}
if (availableDimension == AvailableDimension::THIRD) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Arc Length dimension"));
createArcLengthDimension(selCircleArc[0], pos);
createArcLengthDimension(selCircleArc[0]);
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_2Circle(bool& selAllowed, QPoint& pos)
void makeCts_2Circle(bool& selAllowed)
{
//Distance
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add circle to circle Distance dimension"));
createDistanceDimension("Distance", selCircleArc[0], selCircleArc[1], pos);
createDistanceDimension("Distance", { selCircleArc[0], selCircleArc[1] });
selAllowed = true;
}
if (availableDimension == AvailableDimension::SECOND) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Extent dimension"));
createExtentDistanceDimension("DistanceX", pos);
createExtentDistanceDimension("DistanceX");
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_1Ellipse(bool& selAllowed, QPoint& pos)
void makeCts_1Ellipse(bool& selAllowed)
{
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Radius dimension"));
createRadiusDiameterDimension(selEllipseArc[0], pos, true);
createRadiusDiameterDimension(selEllipseArc[0], true);
selAllowed = true;
}
if (availableDimension == AvailableDimension::SECOND) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Radius dimension"));
createRadiusDiameterDimension(selEllipseArc[0], pos, false);
createRadiusDiameterDimension(selEllipseArc[0], false);
if (selEllipseArc[0].geomEdgeType() != TechDraw::ARCOFELLIPSE) {
availableDimension = AvailableDimension::RESET;
}
}
if (availableDimension == AvailableDimension::THIRD) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Arc Length dimension"));
createArcLengthDimension(selEllipseArc[0], pos);
createArcLengthDimension(selEllipseArc[0]);
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_2Ellipses(bool& selAllowed, QPoint& pos)
void makeCts_2Ellipses(bool& selAllowed)
{
//Distance
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add ellipse to ellipse Distance dimension"));
createDistanceDimension("Distance", selEllipseArc[0], selEllipseArc[1], pos);
createDistanceDimension("Distance", { selEllipseArc[0], selEllipseArc[1] });
selAllowed = true;
}
if (availableDimension == AvailableDimension::SECOND) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Extent dimension"));
createExtentDistanceDimension("DistanceX", pos);
createExtentDistanceDimension("DistanceX");
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_1Spline(bool& selAllowed, QPoint& pos)
void makeCts_1Spline(bool& selAllowed)
{
//Edge length
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add edge length dimension"));
createArcLengthDimension(selSplineAndCo[0], pos);
createArcLengthDimension(selSplineAndCo[0]);
selAllowed = true;
availableDimension = AvailableDimension::RESET;
}
}
void makeCts_1SplineAndMore(bool& selAllowed, QPoint& pos)
void makeCts_1SplineAndMore(bool& selAllowed)
{
//Extend
if (availableDimension == AvailableDimension::FIRST) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Extent dimension"));
createExtentDistanceDimension("DistanceX", pos);
createExtentDistanceDimension("DistanceX");
selAllowed = true;
availableDimension = AvailableDimension::RESET;
}
}
void createAreaDimension(ReferenceEntry ref, QPoint& pos)
void createAreaDimension(ReferenceEntry ref)
{
DrawViewDimension* dim = dimMaker(partFeat, "Area", { ref }, {});
dims.push_back(dim);
moveDimension(pos, dim);
moveDimension(mousePos, dim);
}
void createRadiusDiameterDimension(ReferenceEntry ref, QPoint& pos, bool firstCstr) {
void createRadiusDiameterDimension(ReferenceEntry ref, bool firstCstr) {
bool isCircleGeom = true;
int GeoId(TechDraw::DrawUtil::getIndexFromName(ref.getSubName()));
TechDraw::BaseGeomPtr geom = partFeat->getGeomByIndex(GeoId);
isCircleGeom = geom->getGeomType() == TechDraw::CIRCLE || TechDraw::ELLIPSE;
isCircleGeom = (geom->getGeomType() == TechDraw::CIRCLE) || (geom->getGeomType() == TechDraw::ELLIPSE);
// Use same preference as in sketcher?
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Mod/TechDraw/dimensioning");
@@ -1032,61 +1065,57 @@ protected:
}
dims.push_back(dim);
moveDimension(pos, dim);
moveDimension(mousePos, dim);
}
void createAngleDimension(ReferenceEntry ref1, ReferenceEntry ref2, QPoint& pos) {
void createAngleDimension(ReferenceEntry ref1, ReferenceEntry ref2) {
if (TechDraw::isValidMultiEdge({ ref1, ref2 }) != isAngle) {
//isValidMultiEdge check if lines are parallel.
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Distance dimension"));
createDistanceDimension("Distance", ref1, ref2, pos);
createDistanceDimension("Distance", { ref1, ref2 });
return;
}
DrawViewDimension* dim = dimMaker(partFeat, "Angle", {ref1, ref2}, {});
dims.push_back(dim);
moveDimension(pos, dim);
moveDimension(mousePos, dim);
}
void create3pAngleDimension(ReferenceEntry ref1, ReferenceEntry ref2, ReferenceEntry ref3, QPoint& pos)
void create3pAngleDimension(ReferenceVector refs)
{
DrawViewDimension* dim = dimMaker(partFeat, "Angle3Pt", {ref1, ref2, ref3}, {});
DrawViewDimension* dim = dimMaker(partFeat, "Angle3Pt", refs, {});
dims.push_back(dim);
moveDimension(pos, dim);
moveDimension(mousePos, dim);
}
void createArcLengthDimension(ReferenceEntry ref, QPoint& pos)
void createArcLengthDimension(ReferenceEntry ref)
{
DrawViewDimension* dim = makeArcLengthDimension(ref);
dims.push_back(dim);
moveDimension(pos, dim);
moveDimension(mousePos, dim);
}
void createDistanceDimension(std::string type, ReferenceEntry ref1, ReferenceEntry ref2, QPoint& pos) {
ReferenceVector refs = { ref1 };
if (ref2.hasGeometry()) { // if valid
refs.push_back(ref2);
}
void createDistanceDimension(std::string type, ReferenceVector refs)
{
DrawViewDimension* dim = dimMaker(partFeat, type, refs, {});
dims.push_back(dim);
moveDimension(pos, dim);
moveDimension(mousePos, dim);
}
void createExtentDistanceDimension(std::string type, QPoint& pos) {
void createExtentDistanceDimension(std::string type) {
specialDimension = SpecialDimension::ExtendDistance;
DrawViewDimension* dim = DrawDimHelper::makeExtentDim(partFeat, type, allRefs());
dims.push_back(dim);
moveDimension(pos, dim);
moveDimension(mousePos, dim);
}
void updateDistanceType(QPoint& pos)
void updateDistanceType()
{
if (dims.empty()) {
return;
@@ -1098,7 +1127,7 @@ protected:
Base::Vector3d pnt1 = Rez::guiX(pp.first());
Base::Vector3d pnt2 = Rez::guiX(pp.second());
QPointF fpos = getDimPositionToBe(pos);
QPointF fpos = getDimPositionToBe(mousePos);
double minX, minY, maxX, maxY;
minX = min(pnt1.x, pnt2.x);
@@ -1127,14 +1156,15 @@ protected:
specialDimension = SpecialDimension::LineOr2PointsDistance;
if (selLine.size() == 1) {
createDistanceDimension(newType, selLine[0], ReferenceEntry(), pos);
createDistanceDimension(newType, { selLine[0] });
}
else {
createDistanceDimension(newType, selPoints[0], selPoints[1], pos);
createDistanceDimension(newType, { selPoints[0], selPoints[1] });
}
setDimsSelectability(false);
}
void updateExtentDistanceType(QPoint& pos)
void updateExtentDistanceType()
{
if (dims.empty()) {
return;
@@ -1146,7 +1176,7 @@ protected:
Base::Vector3d pnt1 = Rez::guiX(pp.first());
Base::Vector3d pnt2 = Rez::guiX(pp.second());
QPointF fpos = getDimPositionToBe(pos);
QPointF fpos = getDimPositionToBe(mousePos);
double minX, minY, maxX, maxY;
minX = min(pnt1.x, pnt2.x);
@@ -1157,16 +1187,21 @@ protected:
if (fpos.x() > minX && fpos.x() < maxX
&& (fpos.y() < minY || fpos.y() > maxY) && type != DimensionType::DistanceX) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add DistanceX extent dimension"));
createExtentDistanceDimension("DistanceX", pos);
createExtentDistanceDimension("DistanceX");
}
else if (fpos.y() > minY && fpos.y() < maxY
&& (fpos.x() < minX || fpos.x() > maxX) && type != DimensionType::DistanceY) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add DistanceY extent dimension"));
createExtentDistanceDimension("DistanceY", pos);
createExtentDistanceDimension("DistanceY");
}
else {
return;
}
setDimsSelectability(false);
}
void updateChainDistanceType(QPoint& pos)
void updateChainDistanceType()
{
if (dims.empty()) {
return;
@@ -1187,7 +1222,7 @@ protected:
maxY = max(maxY, max(pnt1.y, pnt2.y));
}
QPointF fpos = getDimPositionToBe(pos);
QPointF fpos = getDimPositionToBe(mousePos);
auto type = static_cast<DimensionType>(dims[0]->Type.getValue());
@@ -1195,37 +1230,42 @@ protected:
&& (fpos.y() < minY || fpos.y() > maxY) && type != DimensionType::DistanceX) {
if (specialDimension == SpecialDimension::ChainDistance) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add horizontal chain dimensions"));
createChainDimension("DistanceX", pos);
createChainDimension("DistanceX");
}
else {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add horizontal coord dimensions"));
createCoordDimension("DistanceX", pos);
createCoordDimension("DistanceX");
}
}
else if (fpos.y() > minY && fpos.y() < maxY
&& (fpos.x() < minX || fpos.x() > maxX) && type != DimensionType::DistanceY) {
if (specialDimension == SpecialDimension::ChainDistance) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add vertical chain dimensions"));
createChainDimension("DistanceY", pos);
createChainDimension("DistanceY");
}
else {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add vertical coord dimensions"));
createCoordDimension("DistanceY", pos);
createCoordDimension("DistanceY");
}
}
else if (((fpos.y() < minY || fpos.y() > maxY) && (fpos.x() < minX || fpos.x() > maxX)) && type != DimensionType::Distance) {
if (specialDimension == SpecialDimension::ChainDistance) {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add oblique chain dimensions"));
createChainDimension("Distance", pos);
createChainDimension("Distance");
}
else {
restartCommand(QT_TRANSLATE_NOOP("Command", "Add oblique coord dimensions"));
createCoordDimension("Distance", pos);
createCoordDimension("Distance");
}
}
else {
return;
}
setDimsSelectability(false);
}
void createChainDimension(std::string type, QPoint& pos)
void createChainDimension(std::string type)
{
specialDimension = SpecialDimension::ChainDistance;
if (type == "Distance") {
@@ -1241,7 +1281,7 @@ protected:
}
}
void createCoordDimension(std::string type, QPoint& pos)
void createCoordDimension(std::string type)
{
specialDimension = SpecialDimension::CoordDistance;
if (type == "Distance") {
@@ -1269,7 +1309,7 @@ protected:
Gui::Command::abortCommand();
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Dimension"));
specialDimension = SpecialDimension::None;
previousPos = QPoint(0,0);
mousePos = QPoint(0,0);
clearRefVectors();
partFeat = nullptr;
dims.clear();