From f24da2823992c4d1bba1560a5df5584a62044766 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Fri, 9 Feb 2018 12:04:09 -0500 Subject: [PATCH] Allow ProgGroup Item AutoPosition from Python --- src/Mod/TechDraw/App/DrawProjGroup.cpp | 28 +++++++++++++++++-- src/Mod/TechDraw/App/DrawProjGroup.h | 1 + src/Mod/TechDraw/App/DrawProjGroupItem.cpp | 20 ++++++++----- src/Mod/TechDraw/App/DrawProjGroupItem.h | 1 + src/Mod/TechDraw/App/DrawProjGroupItemPy.xml | 5 ++++ .../TechDraw/App/DrawProjGroupItemPyImp.cpp | 9 ++++++ src/Mod/TechDraw/App/DrawProjGroupPy.xml | 4 +-- src/Mod/TechDraw/App/DrawProjGroupPyImp.cpp | 25 +++++++---------- src/Mod/TechDraw/TDTest/DProjGroupTest.py | 4 +++ 9 files changed, 70 insertions(+), 27 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawProjGroup.cpp b/src/Mod/TechDraw/App/DrawProjGroup.cpp index 77cb4eb88c..c271962b79 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroup.cpp @@ -174,6 +174,11 @@ App::DocumentObjectExecReturn *DrawProjGroup::execute(void) updateChildren(); } + for (auto& item: getViewsAsDPGI()) { + item->autoPosition(); + item->purgeTouched(); + } + if (page != nullptr) { page->requestPaint(); } @@ -697,7 +702,9 @@ void DrawProjGroup::makeViewBbs(DrawProjGroupItem *viewPtrs[10], } } -//! tell children DPGIs that parent DPG has changed ?Scale? +/*! + * tell children DPGIs that parent DPG has changed ?Scale? + */ void DrawProjGroup::updateChildren(void) { for( const auto it : Views.getValues() ) { @@ -709,7 +716,9 @@ void DrawProjGroup::updateChildren(void) } } -//!check if ProjectionGroup fits on Page +/*! + * check if ProjectionGroup fits on Page + */ bool DrawProjGroup::checkFit(TechDraw::DrawPage* p) const { bool result = true; @@ -915,7 +924,20 @@ void DrawProjGroup::spinCCW() } -//dumps the current iso DPGI's +std::vector DrawProjGroup::getViewsAsDPGI() +{ + std::vector result; + auto views = Views.getValues(); + for (auto& v:views) { + DrawProjGroupItem* item = static_cast(v); + result.push_back(item); + } + return result; +} + +/*! + *dumps the current iso DPGI's + */ void DrawProjGroup::dumpISO(char * title) { Base::Console().Message("DPG ISO: %s\n", title); diff --git a/src/Mod/TechDraw/App/DrawProjGroup.h b/src/Mod/TechDraw/App/DrawProjGroup.h index 8b59cb715b..30f0b860de 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.h +++ b/src/Mod/TechDraw/App/DrawProjGroup.h @@ -128,6 +128,7 @@ public: void spinCCW(void); void dumpISO(char * title); + std::vector getViewsAsDPGI(); protected: void onChanged(const App::Property* prop) override; diff --git a/src/Mod/TechDraw/App/DrawProjGroupItem.cpp b/src/Mod/TechDraw/App/DrawProjGroupItem.cpp index 7a10f6e1ed..7c35b4db0f 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupItem.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroupItem.cpp @@ -99,17 +99,23 @@ App::DocumentObjectExecReturn *DrawProjGroupItem::execute(void) App::DocumentObjectExecReturn * ret = DrawViewPart::execute(); delete ret; + autoPosition(); + requestPaint(); + + return App::DocumentObject::StdReturn; +} + +void DrawProjGroupItem::autoPosition() +{ auto pgroup = getPGroup(); Base::Vector3d newPos; if ((pgroup != nullptr) && - (pgroup->AutoDistribute.getValue())) { - newPos = pgroup->getXYPosition(Type.getValueAsString()); - X.setValue(newPos.x); - Y.setValue(newPos.y); - requestPaint(); + (pgroup->AutoDistribute.getValue()) && + (!LockPosition.getValue())) { + newPos = pgroup->getXYPosition(Type.getValueAsString()); + X.setValue(newPos.x); + Y.setValue(newPos.y); } - - return App::DocumentObject::StdReturn; } void DrawProjGroupItem::onDocumentRestored() diff --git a/src/Mod/TechDraw/App/DrawProjGroupItem.h b/src/Mod/TechDraw/App/DrawProjGroupItem.h index 40619b3ad7..5102d8696d 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupItem.h +++ b/src/Mod/TechDraw/App/DrawProjGroupItem.h @@ -77,6 +77,7 @@ public: const bool flip=true) const override; virtual double getScale(void) const override; + void autoPosition(void); protected: diff --git a/src/Mod/TechDraw/App/DrawProjGroupItemPy.xml b/src/Mod/TechDraw/App/DrawProjGroupItemPy.xml index 8d81eccfad..bcb9e93f13 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupItemPy.xml +++ b/src/Mod/TechDraw/App/DrawProjGroupItemPy.xml @@ -13,6 +13,11 @@ Feature for creating and manipulating component Views Technical Drawing Projection Groups + + + autoPosition() - Move to AutoDistribute/Unlocked position on Page. Returns none. + + diff --git a/src/Mod/TechDraw/App/DrawProjGroupItemPyImp.cpp b/src/Mod/TechDraw/App/DrawProjGroupItemPyImp.cpp index ba56e0bc25..8a1ce86180 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupItemPyImp.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroupItemPyImp.cpp @@ -15,6 +15,15 @@ std::string DrawProjGroupItemPy::representation(void) const return std::string(""); } +PyObject* DrawProjGroupItemPy::autoPosition(PyObject *args) +{ + (void) args; + DrawProjGroupItem* item = getDrawProjGroupItemPtr(); + item->autoPosition(); + Py_INCREF(Py_None); + return Py_None; +} + PyObject *DrawProjGroupItemPy::getCustomAttributes(const char* /*attr*/) const { return 0; diff --git a/src/Mod/TechDraw/App/DrawProjGroupPy.xml b/src/Mod/TechDraw/App/DrawProjGroupPy.xml index 516ab280a5..812029b7f5 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupPy.xml +++ b/src/Mod/TechDraw/App/DrawProjGroupPy.xml @@ -33,9 +33,9 @@ getItemByLabel(string projectionType) - return specified Projection Item - + - setViewOrientation(DrawProjGroupItem item, string projectionType) - sets item's view Direction according to projectionType + getXYPosition(string projectionType) - return the AutoDistribute position for specified Projection Item diff --git a/src/Mod/TechDraw/App/DrawProjGroupPyImp.cpp b/src/Mod/TechDraw/App/DrawProjGroupPyImp.cpp index 2c5840f6a1..eb67eaabc7 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupPyImp.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroupPyImp.cpp @@ -2,6 +2,7 @@ #include "PreCompiled.h" #include +#include #include "DrawProjGroup.h" #include "DrawProjGroupItem.h" @@ -10,6 +11,7 @@ #include #include #include +#include using namespace TechDraw; @@ -87,28 +89,21 @@ PyObject* DrawProjGroupPy::getItemByLabel(PyObject* args) return new DrawProjGroupItemPy(newProj); } -//TODO: this is no longer required? -PyObject* DrawProjGroupPy::setViewOrientation(PyObject* args) +PyObject* DrawProjGroupPy::getXYPosition(PyObject* args) { char* projType; - PyObject* pcObj; - if (!PyArg_ParseTuple(args, "Os", &pcObj,&projType)) + + if (!PyArg_ParseTuple(args, "s", &projType)) { throw Py::Exception(); + } -// App::DocumentObject* obj = static_cast(pcObj)->getDocumentObjectPtr(); -// if (obj->getTypeId().isDerivedFrom(TechDraw::DrawProjGroupItem::getClassTypeId())) { -// TechDraw::DrawProjGroupItem* view = static_cast(obj); -// TechDraw::DrawProjGroup* projGroup = getDrawProjGroupPtr(); -// projGroup->setViewOrientation( view, projType ); - -// } else { -// Base::Console().Message("'%s' is not a DrawProjGroup Item, it will be ignored.\n", obj->Label.getValue()); -// } - - return Py_None; + DrawProjGroup* projGroup = getDrawProjGroupPtr(); + Base::Vector3d v = projGroup->getXYPosition(projType); + return new Base::VectorPy(v); } + PyObject *DrawProjGroupPy::getCustomAttributes(const char* /*attr*/) const { return 0; diff --git a/src/Mod/TechDraw/TDTest/DProjGroupTest.py b/src/Mod/TechDraw/TDTest/DProjGroupTest.py index 7cfd29076f..b197c3a8b4 100644 --- a/src/Mod/TechDraw/TDTest/DProjGroupTest.py +++ b/src/Mod/TechDraw/TDTest/DProjGroupTest.py @@ -69,6 +69,10 @@ def DProjGroupTest(): print("recomputing document") FreeCAD.ActiveDocument.recompute() + for v in group.Views: + print ("View: " + v.Label + " " + v.TypeId) + v.autoPosition() + rc = False if ("Up-to-date" in group.State): rc = True