From db97daf0e015656dd718af5f771da62bb1d92c9a Mon Sep 17 00:00:00 2001 From: wandererfan Date: Sun, 1 Mar 2020 19:29:51 -0500 Subject: [PATCH] [TD]expose dimension arrow position to Python --- src/Mod/TechDraw/App/DrawViewDimension.cpp | 15 ++++++++++++++- src/Mod/TechDraw/App/DrawViewDimension.h | 4 ++++ src/Mod/TechDraw/App/DrawViewDimensionPy.xml | 5 +++++ src/Mod/TechDraw/App/DrawViewDimensionPyImp.cpp | 10 ++++++++++ src/Mod/TechDraw/Gui/QGIViewDimension.cpp | 11 +++++++++++ src/Mod/TechDraw/Gui/QGIViewDimension.h | 2 ++ 6 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/Mod/TechDraw/App/DrawViewDimension.cpp b/src/Mod/TechDraw/App/DrawViewDimension.cpp index 52e9c71dd0..9d7f70f566 100644 --- a/src/Mod/TechDraw/App/DrawViewDimension.cpp +++ b/src/Mod/TechDraw/App/DrawViewDimension.cpp @@ -1093,7 +1093,20 @@ bool DrawViewDimension::leaderIntersectsArc(Base::Vector3d s, Base::Vector3d poi return result; } -//are there non-blank references? +void DrawViewDimension::saveArrowPositions(const Base::Vector2d positions[]) +{ + double scale = getViewPart()->getScale(); + m_arrowPositions.first = Base::Vector3d(positions[0].x, positions[0].y, 0.0) / scale; + m_arrowPositions.second = Base::Vector3d(positions[1].x, positions[1].y, 0.0) / scale; +} + +//return position within parent view of dimension arrow heads/dimline endpoints +//note positions are in apparent coord (inverted y). +pointPair DrawViewDimension::getArrowPositions(void) +{ + return m_arrowPositions; +} + bool DrawViewDimension::has2DReferences(void) const { // Base::Console().Message("DVD::has2DReferences() - %s\n",getNameInDocument()); diff --git a/src/Mod/TechDraw/App/DrawViewDimension.h b/src/Mod/TechDraw/App/DrawViewDimension.h index 7916d62daa..0d83efe5ed 100644 --- a/src/Mod/TechDraw/App/DrawViewDimension.h +++ b/src/Mod/TechDraw/App/DrawViewDimension.h @@ -153,6 +153,9 @@ public: bool isMultiValueSchema(void) const; + pointPair getArrowPositions(void); + void saveArrowPositions(const Base::Vector2d positions[]); + protected: virtual void onChanged(const App::Property* prop) override; virtual void onDocumentRestored() override; @@ -174,6 +177,7 @@ protected: pointPair closestPoints(TopoDS_Shape s1, TopoDS_Shape s2) const; pointPair m_linearPoints; + pointPair m_arrowPositions; private: static const char* TypeEnums[]; diff --git a/src/Mod/TechDraw/App/DrawViewDimensionPy.xml b/src/Mod/TechDraw/App/DrawViewDimensionPy.xml index 48dfad36b0..b82104f00b 100644 --- a/src/Mod/TechDraw/App/DrawViewDimensionPy.xml +++ b/src/Mod/TechDraw/App/DrawViewDimensionPy.xml @@ -33,6 +33,11 @@ getAnglePoints() - returns list of points for angle Dimension + + + getArrowPositions() - returns list of locations or Dimension Arrowheads. Locations are in unscaled coordinates of parent View + + diff --git a/src/Mod/TechDraw/App/DrawViewDimensionPyImp.cpp b/src/Mod/TechDraw/App/DrawViewDimensionPyImp.cpp index f78ab170b1..7be2b7b2dd 100644 --- a/src/Mod/TechDraw/App/DrawViewDimensionPyImp.cpp +++ b/src/Mod/TechDraw/App/DrawViewDimensionPyImp.cpp @@ -99,6 +99,16 @@ PyObject* DrawViewDimensionPy::getAnglePoints(PyObject* args) return ret; } +PyObject* DrawViewDimensionPy::getArrowPositions(PyObject* args) +{ + (void) args; + DrawViewDimension* dvd = getDrawViewDimensionPtr(); + pointPair pts = dvd->getArrowPositions(); + PyObject* ret = PyList_New(0); + PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.first))); + PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.second))); + return ret; +} PyObject *DrawViewDimensionPy::getCustomAttributes(const char* /*attr*/) const { return 0; diff --git a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp index 1c5c1a6db4..e7578df7cc 100644 --- a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp @@ -1176,6 +1176,8 @@ void QGIViewDimension::drawArrows(int count, const Base::Vector2d positions[], d const int arrowCount = 2; QGIArrow *arrows[arrowCount] = { aHead1, aHead2 }; + arrowPositionsToFeature(positions); + for (int i = 0; i < arrowCount; ++i) { QGIArrow *arrow = arrows[i]; @@ -1198,6 +1200,15 @@ void QGIViewDimension::drawArrows(int count, const Base::Vector2d positions[], d } } +void QGIViewDimension::arrowPositionsToFeature(const Base::Vector2d positions[]) const +{ + auto dim( dynamic_cast(getViewObject()) ); + if( dim == nullptr ) + return; + + dim->saveArrowPositions(positions); +} + void QGIViewDimension::drawSingleLine(QPainterPath &painterPath, const Base::Vector2d &lineOrigin, double lineAngle, double startPosition, double endPosition) const { diff --git a/src/Mod/TechDraw/Gui/QGIViewDimension.h b/src/Mod/TechDraw/Gui/QGIViewDimension.h index 86df34cc60..934f6d62ed 100644 --- a/src/Mod/TechDraw/Gui/QGIViewDimension.h +++ b/src/Mod/TechDraw/Gui/QGIViewDimension.h @@ -260,6 +260,8 @@ protected: //QGICMark* centerMark double m_lineWidth; + void arrowPositionsToFeature(const Base::Vector2d positions[]) const; + private: static inline Base::Vector2d fromQtApp(const Base::Vector3d &v) { return Base::Vector2d(v.x, -v.y); } static inline Base::BoundBox2d fromQtGui(const QRectF &r)