From 70420d9e3bcc34b1c8083c022a5997ff3951ac8a Mon Sep 17 00:00:00 2001 From: WandererFan Date: Wed, 7 Sep 2016 15:41:05 -0400 Subject: [PATCH 01/12] Fix getViewObject inheritance across all ViewProviders --- src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp | 3 +-- src/Mod/TechDraw/Gui/ViewProviderAnnotation.h | 6 ++---- src/Mod/TechDraw/Gui/ViewProviderDimension.cpp | 1 - src/Mod/TechDraw/Gui/ViewProviderDimension.h | 7 ++----- src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp | 1 - src/Mod/TechDraw/Gui/ViewProviderDrawingView.h | 7 +++---- src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp | 13 +++++++------ src/Mod/TechDraw/Gui/ViewProviderProjGroup.h | 13 +++++-------- .../TechDraw/Gui/ViewProviderProjGroupItem.cpp | 12 ++++++------ src/Mod/TechDraw/Gui/ViewProviderProjGroupItem.h | 12 ++++++------ src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.cpp | 13 ++++++------- src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.h | 10 ++++------ src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp | 3 +-- src/Mod/TechDraw/Gui/ViewProviderSymbol.h | 11 ++++------- src/Mod/TechDraw/Gui/ViewProviderViewClip.cpp | 11 ++++++----- src/Mod/TechDraw/Gui/ViewProviderViewClip.h | 9 ++++----- src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp | 16 ++++++++++------ src/Mod/TechDraw/Gui/ViewProviderViewPart.h | 7 +++---- src/Mod/TechDraw/Gui/ViewProviderViewSection.cpp | 9 ++------- src/Mod/TechDraw/Gui/ViewProviderViewSection.h | 14 +++++++------- 20 files changed, 79 insertions(+), 99 deletions(-) diff --git a/src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp b/src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp index b9058bfe3..caadc59fc 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp @@ -38,7 +38,6 @@ #include #include -#include #include "ViewProviderAnnotation.h" using namespace TechDrawGui; @@ -78,7 +77,7 @@ std::vector ViewProviderAnnotation::getDisplayModes(void) const void ViewProviderAnnotation::updateData(const App::Property* prop) { - Gui::ViewProviderDocumentObject::updateData(prop); + Gui::ViewProviderDocumentObject::updateData(prop); } TechDraw::DrawViewAnnotation* ViewProviderAnnotation::getViewObject() const diff --git a/src/Mod/TechDraw/Gui/ViewProviderAnnotation.h b/src/Mod/TechDraw/Gui/ViewProviderAnnotation.h index 72d558650..88b9c8b70 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderAnnotation.h +++ b/src/Mod/TechDraw/Gui/ViewProviderAnnotation.h @@ -29,9 +29,7 @@ #include "ViewProviderDrawingView.h" -namespace TechDraw{ - class DrawViewAnnotation; -} +#include namespace TechDrawGui { @@ -54,7 +52,7 @@ public: virtual std::vector getDisplayModes(void) const; virtual void updateData(const App::Property*); - TechDraw::DrawViewAnnotation* getViewObject() const; + virtual TechDraw::DrawViewAnnotation* getViewObject() const; }; } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp b/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp index 3531cb5f0..539d0309e 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp @@ -38,7 +38,6 @@ #include #include -#include #include "ViewProviderDimension.h" using namespace TechDrawGui; diff --git a/src/Mod/TechDraw/Gui/ViewProviderDimension.h b/src/Mod/TechDraw/Gui/ViewProviderDimension.h index 75e5e3ee5..9bae39907 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDimension.h +++ b/src/Mod/TechDraw/Gui/ViewProviderDimension.h @@ -25,12 +25,9 @@ #ifndef DRAWINGGUI_VIEWPROVIDERDIMENSION_H #define DRAWINGGUI_VIEWPROVIDERDIMENSION_H -#include #include "ViewProviderDrawingView.h" +#include -namespace TechDraw{ - class DrawViewDimension; -} namespace TechDrawGui { @@ -53,7 +50,7 @@ public: virtual std::vector getDisplayModes(void) const; virtual void updateData(const App::Property*); - TechDraw::DrawViewDimension* getViewObject() const; + virtual TechDraw::DrawViewDimension* getViewObject() const; }; } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp index b55876642..f124edf52 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp @@ -43,7 +43,6 @@ #include #include -#include #include #include diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h index 6eb2750af..1b88253ad 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h @@ -28,9 +28,8 @@ #include #include -namespace TechDraw{ - class DrawView; -} +#include +#include "QGIView.h" namespace TechDrawGui { class QGIView; @@ -66,7 +65,7 @@ public: virtual void startRestoring(); virtual void finishRestoring(); //@} - TechDraw::DrawView* getViewObject() const; + virtual TechDraw::DrawView* getViewObject() const; private: bool m_docReady; //sb MDI + QGraphicsScene ready diff --git a/src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp b/src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp index 84b523690..d459ddbd3 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp @@ -32,8 +32,6 @@ /// Here the FreeCAD includes sorted by Base,App,Gui...... #include #include -#include -#include #include #include @@ -49,14 +47,13 @@ #include #include -#include #include "TaskProjGroup.h" #include "ViewProviderProjGroup.h" using namespace TechDrawGui; -PROPERTY_SOURCE(TechDrawGui::ViewProviderProjGroup, Gui::ViewProviderDocumentObject) +PROPERTY_SOURCE(TechDrawGui::ViewProviderProjGroup, TechDrawGui::ViewProviderDrawingView) //************************************************************************** // Construction/Destruction @@ -165,8 +162,12 @@ std::vector ViewProviderProjGroup::claimChildren(void) con } } - -TechDraw::DrawProjGroup* ViewProviderProjGroup::getObject() const +TechDraw::DrawProjGroup* ViewProviderProjGroup::getViewObject() const { return dynamic_cast(pcObject); } + +TechDraw::DrawProjGroup* ViewProviderProjGroup::getObject() const +{ + return getViewObject(); +} diff --git a/src/Mod/TechDraw/Gui/ViewProviderProjGroup.h b/src/Mod/TechDraw/Gui/ViewProviderProjGroup.h index a9042f6d5..3e70ad59d 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderProjGroup.h +++ b/src/Mod/TechDraw/Gui/ViewProviderProjGroup.h @@ -1,7 +1,7 @@ /*************************************************************************** * Copyright (c) 2013 Luke Parry * * * - * This file is part of the FreeCAD CAx development system. * + * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * @@ -10,7 +10,7 @@ * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * @@ -26,17 +26,13 @@ #include #include -#include +#include +#include #include "ViewProviderDrawingView.h" -namespace TechDraw{ - class DrawProjGroup; -} - namespace TechDrawGui { - class TechDrawGuiExport ViewProviderProjGroup : public ViewProviderDrawingView { PROPERTY_HEADER(TechDrawGui::ViewProviderProjGroup); @@ -61,6 +57,7 @@ public: virtual void updateData(const App::Property*); TechDraw::DrawProjGroup* getObject() const; + virtual TechDraw::DrawProjGroup* getViewObject() const; void unsetEdit(int ModNum); protected: diff --git a/src/Mod/TechDraw/Gui/ViewProviderProjGroupItem.cpp b/src/Mod/TechDraw/Gui/ViewProviderProjGroupItem.cpp index 0e77c2ff9..808f2a1dc 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderProjGroupItem.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderProjGroupItem.cpp @@ -40,12 +40,8 @@ #include #include #include -#include -#include -#include - #include "ViewProviderProjGroupItem.h" using namespace TechDrawGui; @@ -141,8 +137,12 @@ bool ViewProviderProjGroupItem::doubleClicked(void) return true; } - -TechDraw::DrawProjGroupItem* ViewProviderProjGroupItem::getObject() const +TechDraw::DrawProjGroupItem* ViewProviderProjGroupItem::getViewObject() const { return dynamic_cast(pcObject); } + +TechDraw::DrawProjGroupItem* ViewProviderProjGroupItem::getObject() const +{ + return getViewObject(); +} diff --git a/src/Mod/TechDraw/Gui/ViewProviderProjGroupItem.h b/src/Mod/TechDraw/Gui/ViewProviderProjGroupItem.h index 41f038fb9..48e3091b0 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderProjGroupItem.h +++ b/src/Mod/TechDraw/Gui/ViewProviderProjGroupItem.h @@ -1,7 +1,7 @@ /*************************************************************************** * Copyright (c) 2014 Luke Parry * * * - * This file is part of the FreeCAD CAx development system. * + * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * @@ -10,7 +10,7 @@ * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * @@ -24,10 +24,9 @@ #define DRAWINGGUI_VIEWPROVIDERVIEWGROUPITEM_H #include "ViewProviderViewPart.h" - -namespace TechDraw{ - class DrawProjGroupItem; -} +#include +#include +#include namespace TechDrawGui { @@ -52,6 +51,7 @@ public: void setupContextMenu(QMenu*, QObject*, const char*); virtual void updateData(const App::Property*); + virtual TechDraw::DrawProjGroupItem* getViewObject() const; TechDraw::DrawProjGroupItem* getObject() const; void unsetEdit(int ModNum); diff --git a/src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.cpp b/src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.cpp index 6898124c3..856ad2ec0 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.cpp @@ -28,16 +28,15 @@ /// Here the FreeCAD includes sorted by Base,App,Gui...... #include -#include -#include -#include +//#include +//#include +//#include #include #include #include -#include -#include +//#include +//#include -#include #include "ViewProviderSpreadsheet.h" using namespace TechDrawGui; @@ -77,7 +76,7 @@ std::vector ViewProviderSpreadsheet::getDisplayModes(void) const void ViewProviderSpreadsheet::updateData(const App::Property* prop) { - Gui::ViewProviderDocumentObject::updateData(prop); + Gui::ViewProviderDocumentObject::updateData(prop); } TechDraw::DrawViewSpreadsheet* ViewProviderSpreadsheet::getViewObject() const diff --git a/src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.h b/src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.h index 3481c6d93..885abb0e8 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.h +++ b/src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.h @@ -24,14 +24,12 @@ #ifndef DRAWINGGUI_VIEWPROVIDERSPREADSHEET_H #define DRAWINGGUI_VIEWPROVIDERSPREADSHEET_H -#include +#include "ViewProviderSymbol.h" +#include +#include #include "ViewProviderSymbol.h" -namespace TechDraw{ - class DrawViewSpreadsheet; -} - namespace TechDrawGui { @@ -53,7 +51,7 @@ public: virtual std::vector getDisplayModes(void) const; virtual void updateData(const App::Property*); - TechDraw::DrawViewSpreadsheet* getViewObject() const; + virtual TechDraw::DrawViewSpreadsheet* getViewObject() const; }; } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp b/src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp index 144831590..705b92d65 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp @@ -38,7 +38,6 @@ #include #include -#include #include "ViewProviderSymbol.h" using namespace TechDrawGui; @@ -78,7 +77,7 @@ std::vector ViewProviderSymbol::getDisplayModes(void) const void ViewProviderSymbol::updateData(const App::Property* prop) { - Gui::ViewProviderDocumentObject::updateData(prop); + Gui::ViewProviderDocumentObject::updateData(prop); } TechDraw::DrawViewSymbol* ViewProviderSymbol::getViewObject() const diff --git a/src/Mod/TechDraw/Gui/ViewProviderSymbol.h b/src/Mod/TechDraw/Gui/ViewProviderSymbol.h index 5a38ae998..d5fdf9006 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderSymbol.h +++ b/src/Mod/TechDraw/Gui/ViewProviderSymbol.h @@ -25,13 +25,10 @@ #ifndef DRAWINGGUI_VIEWPROVIDERSYMBOL_H #define DRAWINGGUI_VIEWPROVIDERSYMBOL_H -#include - +#include +#include +#include "ViewProviderDrawingView.h" #include "ViewProviderDrawingView.h" - -namespace TechDraw{ - class DrawViewSymbol; -} namespace TechDrawGui { @@ -54,7 +51,7 @@ public: virtual std::vector getDisplayModes(void) const; virtual void updateData(const App::Property*); - TechDraw::DrawViewSymbol* getViewObject() const; + virtual TechDraw::DrawViewSymbol* getViewObject() const; }; } // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewClip.cpp b/src/Mod/TechDraw/Gui/ViewProviderViewClip.cpp index 8513ce3f1..3efca80f3 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewClip.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderViewClip.cpp @@ -33,15 +33,11 @@ /// Here the FreeCAD includes sorted by Base,App,Gui...... #include #include -#include -#include #include #include #include #include -#include - #include "ViewProviderViewClip.h" using namespace TechDrawGui; @@ -121,7 +117,12 @@ bool ViewProviderViewClip::isShow(void) const return Visibility.getValue(); } -TechDraw::DrawViewClip* ViewProviderViewClip::getObject() const +TechDraw::DrawViewClip* ViewProviderViewClip::getViewObject() const { return dynamic_cast(pcObject); } + +TechDraw::DrawViewClip* ViewProviderViewClip::getObject() const +{ + return getViewObject(); +} diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewClip.h b/src/Mod/TechDraw/Gui/ViewProviderViewClip.h index 2ec85773c..a30e0f52d 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewClip.h +++ b/src/Mod/TechDraw/Gui/ViewProviderViewClip.h @@ -25,13 +25,10 @@ #ifndef DRAWINGGUI_VIEWPROVIDERCLIP_H #define DRAWINGGUI_VIEWPROVIDERCLIP_H -#include +#include +#include #include "ViewProviderDrawingView.h" -namespace TechDraw{ - class DrawViewClip; -} - namespace TechDrawGui { class TechDrawGuiExport ViewProviderViewClip : public ViewProviderDrawingView @@ -50,6 +47,8 @@ public: virtual bool useNewSelectionModel(void) const {return false;} /// returns a list of all possible modes virtual std::vector getDisplayModes(void) const; + + virtual TechDraw::DrawViewClip* getViewObject() const; TechDraw::DrawViewClip* getObject() const; /// Hide the object in the view diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp b/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp index 18e03b553..43bf9c36b 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp @@ -31,15 +31,14 @@ /// Here the FreeCAD includes sorted by Base,App,Gui...... #include #include -#include -#include +//#include +//#include #include #include #include -#include -#include +//#include +//#include -#include #include #include @@ -112,7 +111,12 @@ std::vector ViewProviderViewPart::claimChildren(void) cons } } -TechDraw::DrawViewPart* ViewProviderViewPart::getViewPart() const +TechDraw::DrawViewPart* ViewProviderViewPart::getViewObject() const { return dynamic_cast(pcObject); } + +TechDraw::DrawViewPart* ViewProviderViewPart::getViewPart() const +{ + return getViewObject(); +} diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewPart.h b/src/Mod/TechDraw/Gui/ViewProviderViewPart.h index 3b39c9da3..4636c4ec7 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewPart.h +++ b/src/Mod/TechDraw/Gui/ViewProviderViewPart.h @@ -25,10 +25,8 @@ #define DRAWINGGUI_VIEWPROVIDERVIEWPART_H #include "ViewProviderDrawingView.h" - -namespace TechDraw{ - class DrawViewPart; -} +#include +#include namespace TechDrawGui { @@ -51,6 +49,7 @@ public: public: virtual std::vector claimChildren(void) const; + virtual TechDraw::DrawViewPart* getViewObject() const; TechDraw::DrawViewPart* getViewPart() const; }; diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewSection.cpp b/src/Mod/TechDraw/Gui/ViewProviderViewSection.cpp index 1cfebe906..eecfc4536 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewSection.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderViewSection.cpp @@ -33,15 +33,10 @@ /// Here the FreeCAD includes sorted by Base,App,Gui...... #include #include -#include -#include #include #include #include -#include -#include -#include #include "ViewProviderViewSection.h" using namespace TechDrawGui; @@ -91,7 +86,7 @@ std::vector ViewProviderViewSection::claimChildren(void) c return ViewProviderViewPart::claimChildren(); } -TechDraw::DrawView* ViewProviderViewSection::getViewObject() const +TechDraw::DrawViewSection* ViewProviderViewSection::getViewObject() const { - return dynamic_cast(pcObject); + return dynamic_cast(pcObject); } diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewSection.h b/src/Mod/TechDraw/Gui/ViewProviderViewSection.h index 597a46e46..5395ec8e9 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewSection.h +++ b/src/Mod/TechDraw/Gui/ViewProviderViewSection.h @@ -2,7 +2,7 @@ * Copyright (c) 2004 Jürgen Riegel * * Copyright (c) 2013 Luke Parry * * * - * This file is part of the FreeCAD CAx development system. * + * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * @@ -11,7 +11,7 @@ * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * @@ -25,11 +25,11 @@ #ifndef DRAWINGGUI_VIEWPROVIDERVIEWSECTION_H #define DRAWINGGUI_VIEWPROVIDERVIEWSECTION_H -#include "ViewProviderViewPart.h" +#include +#include +#include -namespace TechDraw{ - class DrawView; -} +#include "ViewProviderViewPart.h" namespace TechDrawGui { @@ -52,7 +52,7 @@ public: virtual void updateData(const App::Property*); virtual std::vector claimChildren(void) const; - TechDraw::DrawView* getViewObject() const; + virtual TechDraw::DrawViewSection* getViewObject() const; }; } // namespace TechDrawGui From 17fe63598f6dffac54bf87a336ce4c909be415ec Mon Sep 17 00:00:00 2001 From: WandererFan Date: Wed, 7 Sep 2016 15:41:35 -0400 Subject: [PATCH 02/12] Handle case where no faces found in View. --- src/Mod/TechDraw/App/EdgeWalker.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Mod/TechDraw/App/EdgeWalker.cpp b/src/Mod/TechDraw/App/EdgeWalker.cpp index 757a558fd..3db76fceb 100644 --- a/src/Mod/TechDraw/App/EdgeWalker.cpp +++ b/src/Mod/TechDraw/App/EdgeWalker.cpp @@ -155,10 +155,13 @@ ewWireList EdgeWalker::getResult() std::vector EdgeWalker::getResultWires() { + std::vector fw; ewWireList result = m_eV.getResult(); + if (result.wires.empty()) { + return fw; + } std::vector::iterator iWire = result.wires.begin(); // a WE within [WE] - std::vector fw; for (;iWire != result.wires.end(); iWire++) { std::vector::iterator iEdge = (*iWire).wedges.begin(); std::vector topoEdges; @@ -174,11 +177,14 @@ std::vector EdgeWalker::getResultWires() std::vector EdgeWalker::getResultNoDups() { + std::vector fw; ewWireList result = m_eV.getResult(); + if (result.wires.empty()) { + return fw; + } result = result.removeDuplicates(); std::vector::iterator iWire = result.wires.begin(); - std::vector fw; for (;iWire != result.wires.end(); iWire++) { std::vector::iterator iEdge = (*iWire).wedges.begin(); std::vector topoEdges; @@ -310,6 +316,9 @@ void ewWire::push_back(WalkerEdge w) ewWireList ewWireList::removeDuplicates() { ewWireList result; + if (wires.empty()) { + return result; + } result.push_back(*(wires.begin())); //save the first ewWire std::vector::iterator iWire = (wires.begin()) + 1; //starting with second for (; iWire != wires.end(); iWire++) { From a5b5104875b7f682cf44d355ee9b59bcdbaaa391 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Thu, 8 Sep 2016 11:27:21 -0400 Subject: [PATCH 03/12] Implement Cancel logic for TaskViewSection --- src/Mod/TechDraw/App/DrawPagePy.xml | 5 +++++ src/Mod/TechDraw/App/DrawPagePyImp.cpp | 25 ++++++++++++++++++++++++ src/Mod/TechDraw/Gui/TaskSectionView.cpp | 10 +++++++++- src/Mod/TechDraw/Gui/TaskSectionView.h | 4 ++-- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawPagePy.xml b/src/Mod/TechDraw/App/DrawPagePy.xml index 560456b9f..5357768f2 100644 --- a/src/Mod/TechDraw/App/DrawPagePy.xml +++ b/src/Mod/TechDraw/App/DrawPagePy.xml @@ -18,6 +18,11 @@ addView(DrawView) - Add a View to this Page + + + removeView(DrawView) - Remove a View to this Page + + Return the width of this page diff --git a/src/Mod/TechDraw/App/DrawPagePyImp.cpp b/src/Mod/TechDraw/App/DrawPagePyImp.cpp index 48cc29af6..daaaaac5b 100644 --- a/src/Mod/TechDraw/App/DrawPagePyImp.cpp +++ b/src/Mod/TechDraw/App/DrawPagePyImp.cpp @@ -45,6 +45,31 @@ PyObject* DrawPagePy::addView(PyObject* args) return PyInt_FromLong((long) rc); } +PyObject* DrawPagePy::removeView(PyObject* args) +{ + //this implements iRC = pyPage.removeView(pyView) -or- + //doCommand(Doc,"App.activeDocument().%s.removeView(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); + PyObject *pcDocObj; + + if (!PyArg_ParseTuple(args, "O!", &(App::DocumentObjectPy::Type), &pcDocObj)) { + Base::Console().Error("Error: DrawPagePy::removeView - Bad Arg - not DocumentObject\n"); + return NULL; + //TODO: sb PyErr?? + //PyErr_SetString(PyExc_TypeError,"removeView expects a DrawView"); + //return -1; + } + + DrawPage* page = getDrawPagePtr(); //get DrawPage for pyPage + //how to validate that obj is DrawView before use?? + DrawViewPy* pyView = static_cast(pcDocObj); + DrawView* view = pyView->getDrawViewPtr(); //get DrawView for pyView + + int rc = page->removeView(view); + + return PyInt_FromLong((long) rc); +} + + // double getPageWidth() const; PyObject* DrawPagePy::getPageWidth(PyObject *args) { diff --git a/src/Mod/TechDraw/Gui/TaskSectionView.cpp b/src/Mod/TechDraw/Gui/TaskSectionView.cpp index 0b555f531..63e0b9279 100644 --- a/src/Mod/TechDraw/Gui/TaskSectionView.cpp +++ b/src/Mod/TechDraw/Gui/TaskSectionView.cpp @@ -272,12 +272,20 @@ bool TaskSectionView::accept() { //calcValues(); updateValues(); + std::string BaseName = m_base->getNameInDocument(); + Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().%s.ShowSectionLine=True",BaseName.c_str()); return true; } bool TaskSectionView::reject() { - //TODO: remove viewSection + std::string BaseName = m_base->getNameInDocument(); + std::string PageName = m_base->findParentPage()->getNameInDocument(); + std::string SectionName = m_section->getNameInDocument(); + Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().%s.ShowSectionLine=False",BaseName.c_str()); + Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().%s.removeView(App.activeDocument().%s)", + PageName.c_str(),SectionName.c_str()); + Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().removeObject('%s')",SectionName.c_str()); return false; } diff --git a/src/Mod/TechDraw/Gui/TaskSectionView.h b/src/Mod/TechDraw/Gui/TaskSectionView.h index ffc25a995..9e698f74d 100644 --- a/src/Mod/TechDraw/Gui/TaskSectionView.h +++ b/src/Mod/TechDraw/Gui/TaskSectionView.h @@ -46,8 +46,8 @@ public: ~TaskSectionView(); public: - bool accept(); - bool reject(); + virtual bool accept(); + virtual bool reject(); protected Q_SLOTS: void onHorizontalClicked(bool b); From d3afb32487b8f145b29fd07b4e7d6bc4c3fb077f Mon Sep 17 00:00:00 2001 From: WandererFan Date: Thu, 8 Sep 2016 14:27:04 -0400 Subject: [PATCH 04/12] Avoid Bnd_Box is void exception when shapes don't intersect. --- src/Mod/TechDraw/App/DrawViewSection.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Mod/TechDraw/App/DrawViewSection.cpp b/src/Mod/TechDraw/App/DrawViewSection.cpp index 075353839..a036c6fbe 100644 --- a/src/Mod/TechDraw/App/DrawViewSection.cpp +++ b/src/Mod/TechDraw/App/DrawViewSection.cpp @@ -28,6 +28,8 @@ #ifndef _PreComp_ # include +#include +#include #include #include #include @@ -196,6 +198,12 @@ App::DocumentObjectExecReturn *DrawViewSection::execute(void) return new App::DocumentObjectExecReturn("Section cut has failed"); TopoDS_Shape rawShape = mkCut.Shape(); + Bnd_Box testBox; + BRepBndLib::Add(rawShape, testBox); + testBox.SetGap(0.0); + if (testBox.IsVoid()) { //prism & input don't intersect. rawShape is garbage, don't bother. + return DrawView::execute(); + } geometryObject->setTolerance(Tolerance.getValue()); geometryObject->setScale(Scale.getValue()); From 6c937e1bbe62399876d4adfbb4f42c7f6845f7a8 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Fri, 9 Sep 2016 10:21:33 -0400 Subject: [PATCH 05/12] Protect EdgeWalker against bad input --- src/Mod/TechDraw/App/AppTechDrawPy.cpp | 60 +++++++--- src/Mod/TechDraw/App/DrawViewPart.cpp | 15 ++- src/Mod/TechDraw/App/DrawViewSection.cpp | 43 ++++--- src/Mod/TechDraw/App/EdgeWalker.cpp | 137 ++++++++++++++++++++--- src/Mod/TechDraw/App/EdgeWalker.h | 6 + 5 files changed, 216 insertions(+), 45 deletions(-) diff --git a/src/Mod/TechDraw/App/AppTechDrawPy.cpp b/src/Mod/TechDraw/App/AppTechDrawPy.cpp index 4183dbc3a..cbe054575 100644 --- a/src/Mod/TechDraw/App/AppTechDrawPy.cpp +++ b/src/Mod/TechDraw/App/AppTechDrawPy.cpp @@ -134,6 +134,11 @@ private: throw Py::Exception(Part::PartExceptionOCCError, e->GetMessageString()); } + if (edgeList.empty()) { + Base::Console().Log("LOG - edgeWalker: input is empty\n"); + return Py::None(); + } + bool biggie; if (inclBig == Py_True) { biggie = true; @@ -142,15 +147,23 @@ private: } PyObject* result = PyList_New(0); - EdgeWalker ew; - ew.loadEdges(edgeList); - ew.perform(); - std::vector rw = ew.getResultNoDups(); - std::vector sortedWires = ew.sortStrip(rw,biggie); //false==>do not include biggest wires - for (auto& w:sortedWires) { - PyList_Append(result,new TopoShapeWirePy(new TopoShape(w))); + try { + EdgeWalker ew; + ew.loadEdges(edgeList); + bool success = ew.perform(); + if (success) { + std::vector rw = ew.getResultNoDups(); + std::vector sortedWires = ew.sortStrip(rw,biggie); //false==>do not include biggest wires + for (auto& w:sortedWires) { + PyList_Append(result,new TopoShapeWirePy(new TopoShape(w))); + } + } else { + Base::Console().Warning("edgeWalker: input is not planar graph. Wire detection not done\n"); + } + } + catch (Base::Exception &e) { + throw Py::Exception(Base::BaseExceptionFreeCADError, e.what()); } - return Py::asObject(result); } @@ -179,12 +192,31 @@ private: throw Py::Exception(Part::PartExceptionOCCError, e->GetMessageString()); } - EdgeWalker ew; - ew.loadEdges(edgeList); - ew.perform(); - std::vector rw = ew.getResultNoDups(); - std::vector sortedWires = ew.sortStrip(rw,true); - PyObject* outerWire = new TopoShapeWirePy(new TopoShape(*sortedWires.begin())); + if (edgeList.empty()) { + Base::Console().Log("LOG - findOuterWire: input is empty\n"); + return Py::None(); + } + + PyObject* outerWire = nullptr; + bool success = false; + try { + EdgeWalker ew; + ew.loadEdges(edgeList); + success = ew.perform(); + if (success) { + std::vector rw = ew.getResultNoDups(); + std::vector sortedWires = ew.sortStrip(rw,true); + outerWire = new TopoShapeWirePy(new TopoShape(*sortedWires.begin())); + } else { + Base::Console().Warning("findOuterWire: input is not planar graph. Wire detection not done\n"); + } + } + catch (Base::Exception &e) { + throw Py::Exception(Base::BaseExceptionFreeCADError, e.what()); + } + if (!success) { + return Py::None(); + } return Py::asObject(outerWire); } }; diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index f8886168e..a4abb8620 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -198,7 +198,7 @@ App::DocumentObjectExecReturn *DrawViewPart::execute(void) } catch (Standard_Failure) { Handle_Standard_Failure e4 = Standard_Failure::Caught(); - Base::Console().Log("LOG - DVP::execute - buildGeometryObject failed for %s - %s **\n",getNameInDocument(),e4->GetMessageString()); + Base::Console().Log("LOG - DVP::execute - extractFaces failed for %s - %s **\n",getNameInDocument(),e4->GetMessageString()); return new App::DocumentObjectExecReturn(e4->GetMessageString()); } #endif //#if MOD_TECHDRAW_HANDLE_FACES @@ -404,10 +404,21 @@ void DrawViewPart::extractFaces() faceEdges.insert(std::end(faceEdges), std::begin(edgesToAdd),std::end(edgesToAdd)); } + + if (faceEdges.empty()) { + Base::Console().Log("LOG - DVP::extractFaces - no faceEdges\n"); + return; + } + + //find all the wires in the pile of faceEdges EdgeWalker ew; ew.loadEdges(faceEdges); - ew.perform(); + bool success = ew.perform(); + if (!success) { + Base::Console().Warning("DVP::extractFaces - input is not planar graph. No face detection\n"); + return; + } std::vector fw = ew.getResultNoDups(); std::vector sortedWires = ew.sortStrip(fw,true); diff --git a/src/Mod/TechDraw/App/DrawViewSection.cpp b/src/Mod/TechDraw/App/DrawViewSection.cpp index a036c6fbe..fb253b926 100644 --- a/src/Mod/TechDraw/App/DrawViewSection.cpp +++ b/src/Mod/TechDraw/App/DrawViewSection.cpp @@ -245,7 +245,9 @@ App::DocumentObjectExecReturn *DrawViewSection::execute(void) inputCenter, Direction.getValue(), validXDir); - builder.Add(newFaces,pFace); + if (!pFace.IsNull()) { + builder.Add(newFaces,pFace); + } } sectionFaces = newFaces; @@ -393,28 +395,37 @@ TopoDS_Face DrawViewSection::projectFace(const TopoDS_Shape &face, // } // } + TopoDS_Face projectedFace; + + if (faceEdges.empty()) { + Base::Console().Log("LOG - DVS::projectFace - no faceEdges\n"); + return projectedFace; + } + + //recreate the wires for this single face EdgeWalker ew; ew.loadEdges(faceEdges); - ew.perform(); - std::vector fw = ew.getResultNoDups(); + bool success = ew.perform(); + if (success) { + std::vector fw = ew.getResultNoDups(); - TopoDS_Face projectedFace; + if (!fw.empty()) { + std::vector sortedWires = ew.sortStrip(fw, true); + if (sortedWires.empty()) { + return projectedFace; + } - if (!fw.empty()) { - std::vector sortedWires = ew.sortStrip(fw, true); - if (sortedWires.empty()) { - return projectedFace; + BRepBuilderAPI_MakeFace mkFace(sortedWires.front(),true); //true => only want planes? + std::vector::iterator itWire = ++sortedWires.begin(); //starting with second face + for (; itWire != sortedWires.end(); itWire++) { + mkFace.Add(*itWire); + } + projectedFace = mkFace.Face(); } - - BRepBuilderAPI_MakeFace mkFace(sortedWires.front(),true); //true => only want planes? - std::vector::iterator itWire = ++sortedWires.begin(); //starting with second face - for (; itWire != sortedWires.end(); itWire++) { - mkFace.Add(*itWire); - } - projectedFace = mkFace.Face(); + } else { + Base::Console().Warning("DVS::projectFace - input is not planar graph. No face detection\n"); } - return projectedFace; } diff --git a/src/Mod/TechDraw/App/EdgeWalker.cpp b/src/Mod/TechDraw/App/EdgeWalker.cpp index 3db76fceb..9462f9913 100644 --- a/src/Mod/TechDraw/App/EdgeWalker.cpp +++ b/src/Mod/TechDraw/App/EdgeWalker.cpp @@ -41,8 +41,10 @@ #include #endif +#include #include +#include #include "DrawUtil.h" #include "EdgeWalker.h" @@ -89,7 +91,8 @@ void edgeVisitor::setGraph(TechDraw::graph& g) //* EdgeWalker //******************************************************* -EdgeWalker::EdgeWalker() +EdgeWalker::EdgeWalker() : + duplicateInput(false) { } @@ -97,6 +100,7 @@ EdgeWalker::~EdgeWalker() { } +//loads a list of unique edges into the traversal mechanism bool EdgeWalker::loadEdges(std::vector edges) { for (auto e: edges) { @@ -107,10 +111,14 @@ bool EdgeWalker::loadEdges(std::vector edges) bool EdgeWalker::loadEdges(std::vector edges) { + if (edges.empty()) { + throw Base::Exception("EdgeWalker has no edges to load\n"); + } + std::vector verts = makeUniqueVList(edges); setSize(verts.size()); + std::vector we = makeWalkerEdges(edges, verts); - saveInEdges = edges; return loadEdges(we); } @@ -133,15 +141,45 @@ bool EdgeWalker::perform() for(boost::tie(ei, ei_end) = edges(m_g); ei != ei_end; ++ei) put(e_index, *ei, edge_count++); - // Test for planarity - we know it is planar, we just want to - // compute the planar embedding as a side-effect + // Test for planarity typedef std::vector< graph_traits::edge_descriptor > vec_t; std::vector embedding(num_vertices(m_g)); - boyer_myrvold_planarity_test(boyer_myrvold_params::graph = m_g, - boyer_myrvold_params::embedding = &embedding[0]); + typedef std::vector< graph_traits::edge_descriptor > kura_edges_t; + kura_edges_t kEdges; + kura_edges_t::iterator ki, ki_end; + graph_traits::edge_descriptor e1; + +// Get the index associated with edge + graph_traits::edges_size_type + get(boost::edge_index_t, + const TechDraw::graph& m_g, + graph_traits::edge_descriptor edge); + + + + bool isPlanar = boyer_myrvold_planarity_test(boyer_myrvold_params::graph = m_g, + boyer_myrvold_params::embedding = &embedding[0], + boyer_myrvold_params::kuratowski_subgraph = + std::back_inserter(kEdges)); + if (!isPlanar) { + Base::Console().Log("LOG - EW::perform - input is NOT planar\n"); + ki_end = kEdges.end(); + std::stringstream ss; + ss << "EW::perform - obstructing edges: "; + for(ki = kEdges.begin(); ki != ki_end; ++ki) + { + e1 = *ki; + ss << boost::get(edge_index,m_g,e1) << ","; + } + ss << std::endl; + Base::Console().Log("LOG - %s\n",ss.str().c_str()); + return false; + } m_eV.setGraph(m_g); + //Base::Console().Message("TRACE - EW::perform - setGraph complete\n"); planar_face_traversal(m_g, &embedding[0], m_eV); + //Base::Console().Message("TRACE - EW::perform - traversal complete\n"); return true; } @@ -161,6 +199,16 @@ std::vector EdgeWalker::getResultWires() return fw; } + //convert from noduplicate index to duplicates index + for (auto& w:result.wires) { + for (auto& we:w.wedges) { + //we.idx is the edge index in the short list (no duplicates) + //saveIndex[we.idx] should be the index in the long list + we.idx = saveIndex[we.idx]; + } + } + + std::vector::iterator iWire = result.wires.begin(); // a WE within [WE] for (;iWire != result.wires.end(); iWire++) { std::vector::iterator iEdge = (*iWire).wedges.begin(); @@ -182,15 +230,26 @@ std::vector EdgeWalker::getResultNoDups() if (result.wires.empty()) { return fw; } + + //convert from noduplicate index to duplicates index + for (auto& w:result.wires) { + for (auto& we:w.wedges) { + //we.idx is the edge index in the short list (no duplicates) + //saveIndex[we.idx] should be the index in the long list + we.idx = saveIndex[we.idx]; + } + } result = result.removeDuplicates(); std::vector::iterator iWire = result.wires.begin(); + int edgeCount = 1; for (;iWire != result.wires.end(); iWire++) { std::vector::iterator iEdge = (*iWire).wedges.begin(); std::vector topoEdges; for (;iEdge != (*iWire).wedges.end(); iEdge++) { TopoDS_Edge e = saveInEdges.at((*iEdge).idx); topoEdges.push_back(e); + edgeCount++; } TopoDS_Wire w = makeCleanWire(topoEdges); //make 1 clean wire from its edges fw.push_back(w); @@ -253,21 +312,30 @@ std::vector EdgeWalker:: makeUniqueVList(std::vector } //!make WalkerEdges (unique Vertex index pairs) from edge list +//remove duplicate edges from input std::vector EdgeWalker::makeWalkerEdges(std::vector edges, std::vector verts) { - std::vector walkerEdges; + saveInEdges = edges; + std::vector rawList; for (auto e:edges) { TopoDS_Vertex ev1 = TopExp::FirstVertex(e); TopoDS_Vertex ev2 = TopExp::LastVertex(e); int v1dx = findUniqueVert(ev1, verts); int v2dx = findUniqueVert(ev2, verts); - WalkerEdge we; - we.v1 = v1dx; - we.v2 = v2dx; - walkerEdges.push_back(we); + WalkerEdge rl; + rl.v1 = v1dx; + rl.v2 = v2dx; + rawList.push_back(rl); } - return walkerEdges; + + std::vector we = removeDuplicateInput(rawList); + for (auto& w:we) + { + saveIndex.push_back(w.idx); + } + + return we; } int EdgeWalker::findUniqueVert(TopoDS_Vertex vx, std::vector &uniqueVert) @@ -284,7 +352,50 @@ int EdgeWalker::findUniqueVert(TopoDS_Vertex vx, std::vector &uni return result; } -/*static*/ bool WalkerEdge::weCompare(WalkerEdge i, WalkerEdge j) +//removes duplicates from input and sets idx to position in original list +std::vector EdgeWalker::removeDuplicateInput(std::vector input) +{ + std::vector result; + //std::vector ref; + if (input.empty()) { + return result; + } + + result.push_back(*(input.begin())); //save the first WE + result[0].idx = 0; + //ref.push_back(0); + std::vector::iterator iWE = (input.begin()) + 1; //starting with second + int i = 1; + for (; iWE != input.end(); iWE++, i++) { + bool addToResult = true; + for (auto& w:result) { + if ((*iWE).isEqual(w)) { //already in result? + addToResult = false; + Base::Console().Log("LOG - EW::removeDuplicateInput - input edge: %d is a duplicate\n",i); + break; + } + } + if (addToResult) { + (*iWE).idx = i; + result.push_back((*iWE)); + //ref.push_back(i); + } + } + return result; +} + +bool WalkerEdge::isEqual(WalkerEdge w) +{ + bool result = false; + if ((( v1 == w.v1) && (v2 == w.v2)) || + (( v1 == w.v2) && (v2 == w.v1)) ) { + result = true; + } + return result; +} + + +/*static*/ bool WalkerEdge::weCompare(WalkerEdge i, WalkerEdge j) //used for sorting { return (i.idx < j.idx); } diff --git a/src/Mod/TechDraw/App/EdgeWalker.h b/src/Mod/TechDraw/App/EdgeWalker.h index cee5557c3..10095bb04 100644 --- a/src/Mod/TechDraw/App/EdgeWalker.h +++ b/src/Mod/TechDraw/App/EdgeWalker.h @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -59,6 +60,7 @@ class WalkerEdge { public: static bool weCompare(WalkerEdge i, WalkerEdge j); + bool isEqual(WalkerEdge w); std::size_t v1; std::size_t v2; @@ -119,6 +121,8 @@ public: std::vector makeUniqueVList(std::vector edges); std::vector makeWalkerEdges(std::vector edges, std::vector verts); + std::vector removeDuplicateInput(std::vector input); + int findUniqueVert(TopoDS_Vertex vx, std::vector &uniqueVert); std::vector sortStrip(std::vector fw, bool includeBiggest); std::vector sortWiresBySize(std::vector& w, bool reverse = false); @@ -128,10 +132,12 @@ public: protected: static bool wireCompare(const TopoDS_Wire& w1, const TopoDS_Wire& w2); std::vector saveInEdges; + std::vector saveIndex; private: edgeVisitor m_eV; TechDraw::graph m_g; + bool duplicateInput; }; } //end namespace TechDraw From bcb29541aa2bf85b2f2bc09cbc93789642305ea0 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Fri, 9 Sep 2016 16:06:32 -0400 Subject: [PATCH 06/12] Suppress extraneous log messages --- src/Mod/TechDraw/App/Geometry.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Mod/TechDraw/App/Geometry.cpp b/src/Mod/TechDraw/App/Geometry.cpp index a22e1b8ac..94dc8c31e 100644 --- a/src/Mod/TechDraw/App/Geometry.cpp +++ b/src/Mod/TechDraw/App/Geometry.cpp @@ -401,8 +401,7 @@ Generic::Generic(const TopoDS_Edge &e) points.push_back(Base::Vector2D(nodes(i).X(), nodes(i).Y())); } } else { - //no polygon representation? approximate with line? - Base::Console().Log("INFO - Generic::Generic(edge) - polygon is NULL\n"); + //no polygon representation? approximate with line gp_Pnt p = BRep_Tool::Pnt(TopExp::FirstVertex(occEdge)); points.push_back(Base::Vector2D(p.X(), p.Y())); p = BRep_Tool::Pnt(TopExp::LastVertex(occEdge)); From 884a32fabf9467dd7680f3821fa4dacd3fedeca4 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Sat, 10 Sep 2016 07:57:43 -0400 Subject: [PATCH 07/12] Coverty changes: ** CID 152490: Control flow issues (DEADCODE) ** CID 152492: Null pointer dereferences (FORWARD_NULL) ** CID 152493: Null pointer dereferences (FORWARD_NULL) ** CID 152494: Null pointer dereferences (FORWARD_NULL) ** CID 152495: Null pointer dereferences (FORWARD_NULL) ** CID 152496: Null pointer dereferences (FORWARD_NULL) ** CID 152497: Null pointer dereferences (FORWARD_NULL) ** CID 152502: Null pointer dereferences (REVERSE_INULL) ** CID 152507: Uninitialized members (UNINIT_CTOR) ** CID 152508: Uninitialized members (UNINIT_CTOR) ** CID 152508: Uninitialized members (UNINIT_CTOR) ** CID 152510: Uninitialized members (UNINIT_CTOR) --- src/Mod/TechDraw/App/DrawPage.cpp | 2 +- src/Mod/TechDraw/App/DrawViewCollection.cpp | 12 ++++-- src/Mod/TechDraw/App/GeometryObject.cpp | 2 +- src/Mod/TechDraw/Gui/Command.cpp | 21 +++++++--- src/Mod/TechDraw/Gui/CommandCreateDims.cpp | 46 +++++++++++++++------ src/Mod/TechDraw/Gui/QGIArrow.cpp | 3 +- src/Mod/TechDraw/Gui/QGISectionLine.cpp | 1 + src/Mod/TechDraw/Gui/QGIViewDimension.cpp | 3 +- src/Mod/TechDraw/Gui/QGIViewPart.cpp | 2 +- 9 files changed, 66 insertions(+), 26 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawPage.cpp b/src/Mod/TechDraw/App/DrawPage.cpp index e43d4580b..4a3b55580 100644 --- a/src/Mod/TechDraw/App/DrawPage.cpp +++ b/src/Mod/TechDraw/App/DrawPage.cpp @@ -238,7 +238,7 @@ int DrawPage::addView(App::DocumentObject *docObj) return -1; //position all new views in center of Page (exceptDVDimension) - DrawView* view = dynamic_cast(docObj); + DrawView* view = static_cast(docObj); if (!docObj->isDerivedFrom(TechDraw::DrawViewDimension::getClassTypeId())) { view->X.setValue(getPageWidth()/2.0); view->Y.setValue(getPageHeight()/2.0); diff --git a/src/Mod/TechDraw/App/DrawViewCollection.cpp b/src/Mod/TechDraw/App/DrawViewCollection.cpp index e43c62205..8a788a22f 100644 --- a/src/Mod/TechDraw/App/DrawViewCollection.cpp +++ b/src/Mod/TechDraw/App/DrawViewCollection.cpp @@ -87,9 +87,9 @@ int DrawViewCollection::countChildren() const std::vector &views = Views.getValues(); for(std::vector::const_iterator it = views.begin(); it != views.end(); ++it) { - App::DocumentObject *docObj = dynamic_cast(*it); + App::DocumentObject *docObj = static_cast(*it); if(docObj->getTypeId().isDerivedFrom(TechDraw::DrawViewCollection::getClassTypeId())) { - TechDraw::DrawViewCollection *viewCollection = dynamic_cast(*it); + TechDraw::DrawViewCollection *viewCollection = static_cast(*it); numChildren += viewCollection->countChildren() + 1; } else { numChildren += 1; @@ -127,7 +127,7 @@ App::DocumentObjectExecReturn *DrawViewCollection::execute(void) for(std::vector::const_iterator it = views.begin(); it != views.end(); ++it) { App::DocumentObject *docObj = *it; if(docObj->getTypeId().isDerivedFrom(TechDraw::DrawView::getClassTypeId())) { - TechDraw::DrawView *view = dynamic_cast(*it); + TechDraw::DrawView *view = static_cast(*it); // Set scale factor of each view view->ScaleType.setValue("Document"); @@ -140,7 +140,7 @@ App::DocumentObjectExecReturn *DrawViewCollection::execute(void) for(std::vector::const_iterator it = views.begin(); it != views.end(); ++it) { App::DocumentObject *docObj = *it; if(docObj->getTypeId().isDerivedFrom(TechDraw::DrawView::getClassTypeId())) { - TechDraw::DrawView *view = dynamic_cast(*it); + TechDraw::DrawView *view = static_cast(*it); view->ScaleType.setValue("Custom"); // Set scale factor of each view @@ -159,6 +159,10 @@ QRectF DrawViewCollection::getRect() const QRectF result; for (auto& v:Views.getValues()) { TechDraw::DrawView *view = dynamic_cast(v); + if (!view) { + throw Base::Exception("DrawViewCollection::getRect bad View\n"); + } + result = result.united(view->getRect().translated(view->X.getValue(),view->Y.getValue())); } return QRectF(0,0,Scale.getValue() * result.width(),Scale.getValue() * result.height()); diff --git a/src/Mod/TechDraw/App/GeometryObject.cpp b/src/Mod/TechDraw/App/GeometryObject.cpp index 02cebb5a9..fcf0e7ab5 100644 --- a/src/Mod/TechDraw/App/GeometryObject.cpp +++ b/src/Mod/TechDraw/App/GeometryObject.cpp @@ -274,7 +274,7 @@ void GeometryObject::addGeomFromCompound(TopoDS_Shape edgeCompound, edgeClass ca } if (circle) { if ((*itVertex)->isEqual(c1,Precision::Confusion())) { - c1Add = true; + c1Add = false; } } diff --git a/src/Mod/TechDraw/Gui/Command.cpp b/src/Mod/TechDraw/Gui/Command.cpp index 29fee1c6d..a4b0d1cf0 100644 --- a/src/Mod/TechDraw/Gui/Command.cpp +++ b/src/Mod/TechDraw/Gui/Command.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -103,14 +104,14 @@ TechDraw::DrawPage* _findPage(Gui::Command* cmd) QObject::tr("Can not determine correct page.")); return page; } else { //use only page in document - page = dynamic_cast(selPages.front()); + page = static_cast(selPages.front()); } } else if (selPages.size() > 1) { //multiple pages in selection QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Too many pages"), QObject::tr("Select exactly 1 page.")); return page; } else { //use only page in selection - page = dynamic_cast(selPages.front()); + page = static_cast(selPages.front()); } return page; @@ -172,6 +173,10 @@ void CmdTechDrawNewPageDef::activated(int iMsg) commitCommand(); TechDraw::DrawPage* fp = dynamic_cast(getDocument()->getObject(PageName.c_str())); + if (!fp) { + throw Base::Exception("CmdTechDrawNewPageDef fp not found\n"); + } + Gui::ViewProvider* vp = Gui::Application::Instance->getDocument(getDocument())->getViewProvider(fp); TechDrawGui::ViewProviderPage* dvp = dynamic_cast(vp); if (dvp) { @@ -247,6 +252,9 @@ void CmdTechDrawNewPage::activated(int iMsg) commitCommand(); TechDraw::DrawPage* fp = dynamic_cast(getDocument()->getObject(PageName.c_str())); + if (!fp) { + throw Base::Exception("CmdTechDrawNewPagePick fp not found\n"); + } Gui::ViewProvider* vp = Gui::Application::Instance->getDocument(getDocument())->getViewProvider(fp); TechDrawGui::ViewProviderPage* dvp = dynamic_cast(vp); if (dvp) { @@ -377,7 +385,7 @@ void CmdTechDrawNewViewSection::activated(int iMsg) return; } App::DocumentObject* dObj = *(shapes.begin()); - TechDraw::DrawViewPart* dvp = dynamic_cast(dObj); + TechDraw::DrawViewPart* dvp = static_cast(dObj); if (dvp->getSectionRef()) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), QObject::tr("This View already has a related Section. Choose another.")); @@ -397,6 +405,9 @@ void CmdTechDrawNewViewSection::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); App::DocumentObject *docObj = getDocument()->getObject(FeatName.c_str()); TechDraw::DrawViewSection* dsv = dynamic_cast(docObj); + if (!dsv) { + throw Base::Exception("CmdTechDrawNewViewSection DSV not found\n"); + } Gui::Control().showDialog(new TaskDlgSectionView(dvp,dsv)); updateActive(); @@ -592,9 +603,9 @@ void CmdTechDrawClipPlus::activated(int iMsg) std::vector::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewClip::getClassTypeId())) { - clip = dynamic_cast((*itSel).getObject()); + clip = static_cast((*itSel).getObject()); } else if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawView::getClassTypeId())) { - view = dynamic_cast((*itSel).getObject()); + view = static_cast((*itSel).getObject()); } } if (!view) { diff --git a/src/Mod/TechDraw/Gui/CommandCreateDims.cpp b/src/Mod/TechDraw/Gui/CommandCreateDims.cpp index 806042870..9f7757037 100644 --- a/src/Mod/TechDraw/Gui/CommandCreateDims.cpp +++ b/src/Mod/TechDraw/Gui/CommandCreateDims.cpp @@ -33,6 +33,7 @@ #include # include +# include # include # include # include @@ -94,14 +95,14 @@ TechDraw::DrawPage* _findPageCCD(Gui::Command* cmd) QObject::tr("Can not determine correct page.")); return page; } else { //use only page in document - page = dynamic_cast(selPages.front()); + page = static_cast(selPages.front()); } } else if (selPages.size() > 1) { //multiple pages in selection QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Too many pages"), QObject::tr("Select exactly 1 page.")); return page; } else { //use only page in selection - page = dynamic_cast(selPages.front()); + page = static_cast(selPages.front()); } } return page; @@ -161,7 +162,7 @@ void CmdTechDrawNewDimension::activated(int iMsg) std::vector::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { - objFeat = dynamic_cast ((*itSel).getObject()); + objFeat = static_cast ((*itSel).getObject()); SubNames = (*itSel).getSubNames(); } } @@ -242,6 +243,9 @@ void CmdTechDrawNewDimension::activated(int iMsg) ,contentStr.c_str()); dim = dynamic_cast(getDocument()->getObject(FeatName.c_str())); + if (!dim) { + throw Base::Exception("CmdTechDrawNewDimension - dim not found\n"); + } dim->References2D.setValues(objs, subs); doCommand(Doc,"App.activeDocument().%s.MeasureType = 'Projected'",FeatName.c_str()); @@ -293,7 +297,7 @@ void CmdTechDrawNewRadiusDimension::activated(int iMsg) std::vector::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { - objFeat = dynamic_cast ((*itSel).getObject()); + objFeat = static_cast ((*itSel).getObject()); SubNames = (*itSel).getSubNames(); } } @@ -325,6 +329,9 @@ void CmdTechDrawNewRadiusDimension::activated(int iMsg) doCommand(Doc, "App.activeDocument().%s.FormatSpec = 'R%%value%%'", FeatName.c_str()); dim = dynamic_cast(getDocument()->getObject(FeatName.c_str())); + if (!dim) { + throw Base::Exception("CmdTechDrawNewRadiusDimension - dim not found\n"); + } dim->References2D.setValues(objs, subs); doCommand(Doc,"App.activeDocument().%s.MeasureType = 'Projected'",FeatName.c_str()); @@ -377,7 +384,7 @@ void CmdTechDrawNewDiameterDimension::activated(int iMsg) std::vector::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { - objFeat = dynamic_cast ((*itSel).getObject()); + objFeat = static_cast ((*itSel).getObject()); SubNames = (*itSel).getSubNames(); } } @@ -411,6 +418,9 @@ void CmdTechDrawNewDiameterDimension::activated(int iMsg) doCommand(Doc, "App.activeDocument().%s.FormatSpec = '\xe2\x8c\x80%%value%%'", FeatName.c_str()); // utf-8 encoded diameter symbol dim = dynamic_cast(getDocument()->getObject(FeatName.c_str())); + if (!dim) { + throw Base::Exception("CmdTechDrawNewDiameterDimension - dim not found\n"); + } dim->References2D.setValues(objs, subs); doCommand(Doc,"App.activeDocument().%s.MeasureType = 'Projected'",FeatName.c_str()); @@ -463,7 +473,7 @@ void CmdTechDrawNewLengthDimension::activated(int iMsg) std::vector::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { - objFeat = dynamic_cast ((*itSel).getObject()); + objFeat = static_cast ((*itSel).getObject()); SubNames = (*itSel).getSubNames(); } } @@ -513,6 +523,9 @@ void CmdTechDrawNewLengthDimension::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.Type = '%s'", FeatName.c_str() , "Distance"); dim = dynamic_cast(getDocument()->getObject(FeatName.c_str())); + if (!dim) { + throw Base::Exception("CmdTechDrawNewLengthDimension - dim not found\n"); + } dim->References2D.setValues(objs, subs); doCommand(Doc, "App.activeDocument().%s.FormatSpec = '%%value%%'", FeatName.c_str()); @@ -567,7 +580,7 @@ void CmdTechDrawNewDistanceXDimension::activated(int iMsg) std::vector::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { - objFeat = dynamic_cast ((*itSel).getObject()); + objFeat = static_cast ((*itSel).getObject()); SubNames = (*itSel).getSubNames(); } } @@ -615,6 +628,9 @@ void CmdTechDrawNewDistanceXDimension::activated(int iMsg) ,"DistanceX"); dim = dynamic_cast(getDocument()->getObject(FeatName.c_str())); + if (!dim) { + throw Base::Exception("CmdTechDrawNewDistanceXDimension - dim not found\n"); + } dim->References2D.setValues(objs, subs); doCommand(Doc, "App.activeDocument().%s.FormatSpec = '%%value%%'", FeatName.c_str()); @@ -669,7 +685,7 @@ void CmdTechDrawNewDistanceYDimension::activated(int iMsg) std::vector::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { - objFeat = dynamic_cast ((*itSel).getObject()); + objFeat = static_cast ((*itSel).getObject()); SubNames = (*itSel).getSubNames(); } } @@ -716,6 +732,9 @@ void CmdTechDrawNewDistanceYDimension::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.Type = '%s'",FeatName.c_str() ,"DistanceY"); dim = dynamic_cast(getDocument()->getObject(FeatName.c_str())); + if (!dim) { + throw Base::Exception("CmdTechDrawNewDistanceYDimension - dim not found\n"); + } dim->References2D.setValues(objs, subs); doCommand(Doc, "App.activeDocument().%s.FormatSpec = '%%value%%'", FeatName.c_str()); @@ -770,7 +789,7 @@ void CmdTechDrawNewAngleDimension::activated(int iMsg) std::vector::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { - objFeat = dynamic_cast ((*itSel).getObject()); + objFeat = static_cast ((*itSel).getObject()); SubNames = (*itSel).getSubNames(); } } @@ -801,6 +820,9 @@ void CmdTechDrawNewAngleDimension::activated(int iMsg) ,"Angle"); dim = dynamic_cast(getDocument()->getObject(FeatName.c_str())); + if (!dim) { + throw Base::Exception("CmdTechDrawNewAngleDimension - dim not found\n"); + } dim->References2D.setValues(objs, subs); doCommand(Doc,"App.activeDocument().%s.MeasureType = 'Projected'",FeatName.c_str()); @@ -858,7 +880,7 @@ void CmdTechDrawLinkDimension::activated(int iMsg) std::vector::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(Part::Feature::getClassTypeId())) { - obj3D = dynamic_cast ((*itSel).getObject()); + obj3D = static_cast ((*itSel).getObject()); subs = (*itSel).getSubNames(); } } @@ -1072,8 +1094,8 @@ int _isValidEdgeToEdge(Gui::Command* cmd) { bool _isValidVertexToEdge(Gui::Command* cmd) { bool result = false; std::vector selection = cmd->getSelection().getSelectionEx(); - TechDraw::DrawViewPart* objFeat0 = dynamic_cast(selection[0].getObject()); - //TechDraw::DrawViewPart* objFeat1 = dynamic_cast(selection[1].getObject()); + TechDraw::DrawViewPart* objFeat0 = static_cast(selection[0].getObject()); + //TechDraw::DrawViewPart* objFeat1 = static_castt(selection[1].getObject()); const std::vector SubNames = selection[0].getSubNames(); if(SubNames.size() == 2) { //there are 2 int eId,vId; diff --git a/src/Mod/TechDraw/Gui/QGIArrow.cpp b/src/Mod/TechDraw/Gui/QGIArrow.cpp index b2335cb28..e73258c9f 100644 --- a/src/Mod/TechDraw/Gui/QGIArrow.cpp +++ b/src/Mod/TechDraw/Gui/QGIArrow.cpp @@ -39,7 +39,8 @@ using namespace TechDrawGui; QGIArrow::QGIArrow() : m_fill(Qt::SolidPattern), - m_size(5.0) + m_size(5.0), + m_style(0) { isFlipped = false; m_brush.setStyle(m_fill); diff --git a/src/Mod/TechDraw/Gui/QGISectionLine.cpp b/src/Mod/TechDraw/Gui/QGISectionLine.cpp index 6f8820239..b3022f0c1 100644 --- a/src/Mod/TechDraw/Gui/QGISectionLine.cpp +++ b/src/Mod/TechDraw/Gui/QGISectionLine.cpp @@ -41,6 +41,7 @@ using namespace TechDrawGui; QGISectionLine::QGISectionLine() { m_extLen = 8.0; + m_arrowSize = 0.0; m_line = new QGraphicsPathItem(); addToGroup(m_line); diff --git a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp index b0a06f1f8..c894fb2ea 100644 --- a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp @@ -138,7 +138,8 @@ void QGIDatumLabel::mouseReleaseEvent( QGraphicsSceneMouseEvent * event) } QGIViewDimension::QGIViewDimension() : - hasHover(false) + hasHover(false), + m_lineWidth(0.0) { setHandlesChildEvents(false); setFlag(QGraphicsItem::ItemIsMovable, false); diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index 6a5adc7ad..54aa8268a 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -455,7 +455,7 @@ void QGIViewPart::drawSectionLine(bool b) { //Base::Console().Message("TRACE - QGIVP::drawSectionLine); - TechDraw::DrawViewPart *viewPart = dynamic_cast(getViewObject()); + TechDraw::DrawViewPart *viewPart = static_cast(getViewObject()); TechDraw::DrawViewSection *viewSection = viewPart->getSectionRef(); if (!viewPart || !viewSection) { From 6dc017a1cebcda88a6b14e1b941ddf96afef7a92 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Sat, 10 Sep 2016 12:39:29 -0400 Subject: [PATCH 08/12] Add notes re Kura. subgraph --- src/Mod/TechDraw/App/EdgeWalker.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Mod/TechDraw/App/EdgeWalker.cpp b/src/Mod/TechDraw/App/EdgeWalker.cpp index 9462f9913..e2a0e2148 100644 --- a/src/Mod/TechDraw/App/EdgeWalker.cpp +++ b/src/Mod/TechDraw/App/EdgeWalker.cpp @@ -162,12 +162,12 @@ bool EdgeWalker::perform() boyer_myrvold_params::kuratowski_subgraph = std::back_inserter(kEdges)); if (!isPlanar) { + //TODO: remove kura subgraph to make planar?? Base::Console().Log("LOG - EW::perform - input is NOT planar\n"); ki_end = kEdges.end(); std::stringstream ss; ss << "EW::perform - obstructing edges: "; - for(ki = kEdges.begin(); ki != ki_end; ++ki) - { + for(ki = kEdges.begin(); ki != ki_end; ++ki) { e1 = *ki; ss << boost::get(edge_index,m_g,e1) << ","; } From 4d7f00860e888aa16f099bfb3cc735d2605d183d Mon Sep 17 00:00:00 2001 From: WandererFan Date: Sat, 10 Sep 2016 12:41:25 -0400 Subject: [PATCH 09/12] reduce use of "execute" on cosmetic changes. --- src/Mod/TechDraw/App/DrawPage.cpp | 3 +- src/Mod/TechDraw/App/DrawView.cpp | 1 - src/Mod/TechDraw/App/DrawViewClip.cpp | 3 +- src/Mod/TechDraw/App/DrawViewPart.cpp | 40 ++------- src/Mod/TechDraw/App/DrawViewSection.cpp | 4 - src/Mod/TechDraw/Gui/MDIViewPage.cpp | 17 ++-- src/Mod/TechDraw/Gui/MDIViewPage.h | 2 +- src/Mod/TechDraw/Gui/QGIViewAnnotation.h | 2 +- src/Mod/TechDraw/Gui/QGIViewDimension.h | 2 +- src/Mod/TechDraw/Gui/QGIViewPart.cpp | 1 - src/Mod/TechDraw/Gui/QGIViewSection.h | 2 +- src/Mod/TechDraw/Gui/QGIViewSymbol.h | 2 +- src/Mod/TechDraw/Gui/QGVPage.cpp | 22 ++--- src/Mod/TechDraw/Gui/QGVPage.h | 2 +- .../TechDraw/Gui/ViewProviderAnnotation.cpp | 25 ++++-- src/Mod/TechDraw/Gui/ViewProviderAnnotation.h | 2 +- .../TechDraw/Gui/ViewProviderDimension.cpp | 2 +- .../TechDraw/Gui/ViewProviderDrawingView.cpp | 15 +++- .../TechDraw/Gui/ViewProviderDrawingView.h | 3 +- src/Mod/TechDraw/Gui/ViewProviderPage.cpp | 86 +++++++++---------- src/Mod/TechDraw/Gui/ViewProviderPage.h | 4 +- .../TechDraw/Gui/ViewProviderSpreadsheet.cpp | 15 ++-- src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp | 10 +-- src/Mod/TechDraw/Gui/ViewProviderViewClip.cpp | 16 ++++ src/Mod/TechDraw/Gui/ViewProviderViewClip.h | 1 + src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp | 33 ++++++- src/Mod/TechDraw/Gui/ViewProviderViewPart.h | 3 + .../TechDraw/Gui/ViewProviderViewSection.cpp | 14 ++- 28 files changed, 188 insertions(+), 144 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawPage.cpp b/src/Mod/TechDraw/App/DrawPage.cpp index 4a3b55580..2ea5bb822 100644 --- a/src/Mod/TechDraw/App/DrawPage.cpp +++ b/src/Mod/TechDraw/App/DrawPage.cpp @@ -107,7 +107,6 @@ void DrawPage::onChanged(const App::Property* prop) } else if (prop == &Views) { if (!isRestoring()) { //TODO: reload if Views prop changes (ie adds/deletes) - //touch(); } } else if(prop == &Scale) { // touch all views in the Page as they may be dependent on this scale @@ -136,6 +135,8 @@ void DrawPage::onChanged(const App::Property* prop) App::DocumentObjectExecReturn *DrawPage::execute(void) { + //Page is just a property storage area? no real logic involved? + //all this does is trigger onChanged in this and ViewProviderPage Template.touch(); Views.touch(); return App::DocumentObject::StdReturn; diff --git a/src/Mod/TechDraw/App/DrawView.cpp b/src/Mod/TechDraw/App/DrawView.cpp index 9636d63c9..0d148c0c2 100644 --- a/src/Mod/TechDraw/App/DrawView.cpp +++ b/src/Mod/TechDraw/App/DrawView.cpp @@ -129,7 +129,6 @@ short DrawView::mustExecute() const if (!isRestoring()) { result = (X.isTouched() || Y.isTouched() || - Rotation.isTouched() || Scale.isTouched() || ScaleType.isTouched() ); } diff --git a/src/Mod/TechDraw/App/DrawViewClip.cpp b/src/Mod/TechDraw/App/DrawViewClip.cpp index 4bc3c5e7c..5478be043 100644 --- a/src/Mod/TechDraw/App/DrawViewClip.cpp +++ b/src/Mod/TechDraw/App/DrawViewClip.cpp @@ -76,8 +76,7 @@ void DrawViewClip::onChanged(const App::Property* prop) { if (prop == &Height || prop == &Width || - prop == &ShowFrame || - prop == &ShowLabels) { + prop == &Views) { if (!isRestoring()) { DrawViewClip::execute(); } diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index a4abb8620..8073184ca 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -225,22 +225,10 @@ short DrawViewPart::mustExecute() const Source.isTouched() || Scale.isTouched() || ScaleType.isTouched() || - Tolerance.isTouched()); - -// don't have to execute DVP, but should update Gui -// ShowHiddenLines.isTouched() || -// ShowSmoothLines.isTouched() || -// ShowSeamLines.isTouched() || -// LineWidth.isTouched() || -// HiddenWidth.isTouched() || -// ShowCenters.isTouched() || -// CenterScale.isTouched() || -// ShowSectionLine.isTouched() || -// HorizSectionLine.isTouched() || -// ArrowUpSection.isTouched() || -// SymbolSection.isTouched() || -// HorizCenterLine.isTouched() || -// VertCenterLine.isTouched()); + Tolerance.isTouched() || + ShowHiddenLines.isTouched() || + ShowSmoothLines.isTouched() || + ShowSeamLines.isTouched() ); } if (result) { @@ -259,28 +247,16 @@ void DrawViewPart::onChanged(const App::Property* prop) prop == &XAxisDirection || prop == &Source || prop == &Scale || - prop == &ScaleType) { -//don't need to execute, but need to update Gui -// prop == &ShowHiddenLines || -// prop == &ShowSmoothLines || -// prop == &ShowSeamLines || -// prop == &LineWidth || -// prop == &HiddenWidth || -// prop == &ShowCenters || -// prop == &CenterScale || -// prop == &ShowSectionLine || -// prop == &HorizSectionLine || -// prop == &ArrowUpSection || -// prop == &SymbolSection || -// prop == &HorizCenterLine || -// prop == &VertCenterLine) { + prop == &ScaleType || + prop == &ShowHiddenLines || + prop == &ShowSmoothLines || + prop == &ShowSeamLines) try { App::DocumentObjectExecReturn *ret = recompute(); delete ret; } catch (...) { } - } } DrawView::onChanged(prop); diff --git a/src/Mod/TechDraw/App/DrawViewSection.cpp b/src/Mod/TechDraw/App/DrawViewSection.cpp index fb253b926..4302721ae 100644 --- a/src/Mod/TechDraw/App/DrawViewSection.cpp +++ b/src/Mod/TechDraw/App/DrawViewSection.cpp @@ -115,10 +115,6 @@ short DrawViewSection::mustExecute() const BaseView.isTouched() || SectionNormal.isTouched() || SectionOrigin.isTouched() ); - -//don't need to execute, but need to update Gui -// ShowCutSurface.isTouched() || -// CutSurfaceColor.isTouched() ); } if (result) { return result; diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.cpp b/src/Mod/TechDraw/Gui/MDIViewPage.cpp index d08317890..7c7022320 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.cpp +++ b/src/Mod/TechDraw/Gui/MDIViewPage.cpp @@ -96,7 +96,7 @@ MDIViewPage::MDIViewPage(ViewProviderPage *pageVp, Gui::Document* doc, QWidget* : Gui::MDIView(doc, parent), m_orientation(QPrinter::Landscape), m_paperSize(QPrinter::A4), - pageGui(pageVp), + m_vpPage(pageVp), m_frameState(true) { @@ -149,7 +149,7 @@ MDIViewPage::MDIViewPage(ViewProviderPage *pageVp, Gui::Document* doc, QWidget* // A fresh page is added and we iterate through its collected children and add these to Canvas View -MLP // if docobj is a featureviewcollection (ex orthogroup), add its child views. if there are ever children that have children, // we'll have to make this recursive. -WF - const std::vector &grp = pageGui->getPageObject()->Views.getValues(); + const std::vector &grp = m_vpPage->getDrawPage()->Views.getValues(); std::vector childViews; for (std::vector::const_iterator it = grp.begin();it != grp.end(); ++it) { attachView(*it); @@ -165,7 +165,7 @@ MDIViewPage::MDIViewPage(ViewProviderPage *pageVp, Gui::Document* doc, QWidget* //therefore we need to make sure parentage of the graphics representation is set properly. bit of a kludge. setDimensionGroups(); - App::DocumentObject *obj = pageGui->getPageObject()->Template.getValue(); + App::DocumentObject *obj = m_vpPage->getDrawPage()->Template.getValue(); auto pageTemplate( dynamic_cast(obj) ); if( pageTemplate ) { attachTemplate(pageTemplate); @@ -312,14 +312,14 @@ bool MDIViewPage::attachView(App::DocumentObject *obj) void MDIViewPage::updateTemplate(bool forceUpdate) { - App::DocumentObject *templObj = pageGui->getPageObject()->Template.getValue(); + App::DocumentObject *templObj = m_vpPage->getDrawPage()->Template.getValue(); // TODO: what if template has been deleted? templObj will be NULL. segfault? if (!templObj) { - Base::Console().Log("INFO - MDIViewPage::updateTemplate - Page: %s has NO template!!\n",pageGui->getPageObject()->getNameInDocument()); + Base::Console().Log("INFO - MDIViewPage::updateTemplate - Page: %s has NO template!!\n",m_vpPage->getDrawPage()->getNameInDocument()); return; } - if(pageGui->getPageObject()->Template.isTouched() || templObj->isTouched()) { + if(m_vpPage->getDrawPage()->Template.isTouched() || templObj->isTouched()) { // Template is touched so update if(forceUpdate || @@ -338,10 +338,9 @@ void MDIViewPage::updateTemplate(bool forceUpdate) void MDIViewPage::updateDrawing(bool forceUpdate) { - // We cannot guarantee if the number of graphical representations (QGIVxxxx) have changed so check the number - // Why? + // We cannot guarantee if the number of graphical representations (QGIVxxxx) have changed so check the number (MLP) const std::vector &graphicsList = m_view->getViews(); - const std::vector &pageChildren = pageGui->getPageObject()->Views.getValues(); + const std::vector &pageChildren = m_vpPage->getDrawPage()->Views.getValues(); // Count total # DocumentObjects in Page unsigned int docObjCount = 0; diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.h b/src/Mod/TechDraw/Gui/MDIViewPage.h index 774dd611d..fda96b936 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.h +++ b/src/Mod/TechDraw/Gui/MDIViewPage.h @@ -116,7 +116,7 @@ private: QString m_currentPath; QPrinter::Orientation m_orientation; QPrinter::PaperSize m_paperSize; - ViewProviderPage *pageGui; + ViewProviderPage *m_vpPage; bool m_frameState; diff --git a/src/Mod/TechDraw/Gui/QGIViewAnnotation.h b/src/Mod/TechDraw/Gui/QGIViewAnnotation.h index 12ed6c3f8..6a8ffba99 100644 --- a/src/Mod/TechDraw/Gui/QGIViewAnnotation.h +++ b/src/Mod/TechDraw/Gui/QGIViewAnnotation.h @@ -46,7 +46,7 @@ public: enum {Type = QGraphicsItem::UserType + 120}; int type() const override { return Type;} - void updateView(bool update = false) override; + virtual void updateView(bool update = false) override; void setViewAnnoFeature(TechDraw::DrawViewAnnotation *obj); virtual void draw() override; diff --git a/src/Mod/TechDraw/Gui/QGIViewDimension.h b/src/Mod/TechDraw/Gui/QGIViewDimension.h index fea22785c..efc761560 100644 --- a/src/Mod/TechDraw/Gui/QGIViewDimension.h +++ b/src/Mod/TechDraw/Gui/QGIViewDimension.h @@ -95,7 +95,7 @@ public: int type() const { return Type;} virtual void drawBorder(); - virtual void updateView(bool update = false); + virtual void updateView(bool update = false) override; virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ); public Q_SLOTS: diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index 54aa8268a..d1f6db341 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -243,7 +243,6 @@ void QGIViewPart::updateView(bool update) if( viewPart == nullptr ) { return; } - //Base::Console().Message("TRACE - QGIVP::updateView(%d) - %s\n",update,getViewObject()->getNameInDocument()); QGIView::updateView(update); diff --git a/src/Mod/TechDraw/Gui/QGIViewSection.h b/src/Mod/TechDraw/Gui/QGIViewSection.h index 2368f7900..d77dfdb9c 100644 --- a/src/Mod/TechDraw/Gui/QGIViewSection.h +++ b/src/Mod/TechDraw/Gui/QGIViewSection.h @@ -36,7 +36,7 @@ public: ~QGIViewSection() = default; virtual void draw() override; - void updateView(bool update = false) override; + virtual void updateView(bool update = false) override; enum {Type = QGraphicsItem::UserType + 108}; int type() const override { return Type;} void drawSectionLine(bool b) override; diff --git a/src/Mod/TechDraw/Gui/QGIViewSymbol.h b/src/Mod/TechDraw/Gui/QGIViewSymbol.h index 5eb54cbe6..9369dd370 100644 --- a/src/Mod/TechDraw/Gui/QGIViewSymbol.h +++ b/src/Mod/TechDraw/Gui/QGIViewSymbol.h @@ -50,7 +50,7 @@ public: enum {Type = QGraphicsItem::UserType + 121}; int type() const override { return Type;} - void updateView(bool update = false) override; + virtual void updateView(bool update = false) override; void setViewSymbolFeature(TechDraw::DrawViewSymbol *obj); virtual void draw() override; diff --git a/src/Mod/TechDraw/Gui/QGVPage.cpp b/src/Mod/TechDraw/Gui/QGVPage.cpp index ee92dd00b..c40c67a0c 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.cpp +++ b/src/Mod/TechDraw/Gui/QGVPage.cpp @@ -85,11 +85,11 @@ QGVPage::QGVPage(ViewProviderPage *vp, QGraphicsScene* s, QWidget *parent) , pageTemplate(0) , m_renderer(Native) , drawBkg(true) - , pageGui(0) + , m_vpPage(0) { assert(vp); - pageGui = vp; - const char* name = vp->getPageObject()->getNameInDocument(); + m_vpPage = vp; + const char* name = vp->getDrawPage()->getNameInDocument(); setObjectName(QString::fromLocal8Bit(name)); setScene(s); @@ -117,7 +117,7 @@ void QGVPage::drawBackground(QPainter *p, const QRectF &) if(!drawBkg) return; - if (!pageGui->getPageObject()) { + if (!m_vpPage->getDrawPage()) { //Base::Console().Log("TROUBLE - QGVP::drawBackground - no Page Object!\n"); return; } @@ -129,7 +129,7 @@ void QGVPage::drawBackground(QPainter *p, const QRectF &) p->setBrush(*bkgBrush); p->drawRect(viewport()->rect()); - if(!pageGui) { + if(!m_vpPage) { return; } @@ -138,9 +138,9 @@ void QGVPage::drawBackground(QPainter *p, const QRectF &) float pageWidth = 420, pageHeight = 297; - if ( pageGui->getPageObject()->hasValidTemplate() ) { - pageWidth = pageGui->getPageObject()->getPageWidth(); - pageHeight = pageGui->getPageObject()->getPageHeight(); + if ( m_vpPage->getDrawPage()->hasValidTemplate() ) { + pageWidth = m_vpPage->getDrawPage()->getPageWidth(); + pageHeight = m_vpPage->getDrawPage()->getPageHeight(); } // Draw the white page @@ -473,8 +473,8 @@ void QGVPage::toggleHatch(bool enable) void QGVPage::saveSvg(QString filename) { - // TODO: We only have pageGui because constructor gets passed a view provider... - TechDraw::DrawPage *page( pageGui->getPageObject() ); + // TODO: We only have m_vpPage because constructor gets passed a view provider... + TechDraw::DrawPage *page( m_vpPage->getDrawPage() ); const QString docName( QString::fromUtf8(page->getDocument()->getName()) ); const QString pageName( QString::fromUtf8(page->getNameInDocument()) ); @@ -569,7 +569,7 @@ void QGVPage::mouseReleaseEvent(QMouseEvent *event) TechDraw::DrawPage* QGVPage::getDrawPage() { - return pageGui->getPageObject(); + return m_vpPage->getDrawPage(); } diff --git a/src/Mod/TechDraw/Gui/QGVPage.h b/src/Mod/TechDraw/Gui/QGVPage.h index a6e743b96..15c9f006b 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.h +++ b/src/Mod/TechDraw/Gui/QGVPage.h @@ -112,7 +112,7 @@ private: bool drawBkg; QBrush* bkgBrush; QImage m_image; - ViewProviderPage *pageGui; + ViewProviderPage *m_vpPage; }; } // namespace MDIViewPageGui diff --git a/src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp b/src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp index caadc59fc..c4bdc023b 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderAnnotation.cpp @@ -42,7 +42,7 @@ using namespace TechDrawGui; -PROPERTY_SOURCE(TechDrawGui::ViewProviderAnnotation, Gui::ViewProviderDocumentObject) +PROPERTY_SOURCE(TechDrawGui::ViewProviderAnnotation, TechDrawGui::ViewProviderDrawingView) //************************************************************************** // Construction/Destruction @@ -59,25 +59,40 @@ ViewProviderAnnotation::~ViewProviderAnnotation() void ViewProviderAnnotation::attach(App::DocumentObject *pcFeat) { // call parent attach method - ViewProviderDocumentObject::attach(pcFeat); + ViewProviderDrawingView::attach(pcFeat); } void ViewProviderAnnotation::setDisplayMode(const char* ModeName) { - ViewProviderDocumentObject::setDisplayMode(ModeName); + ViewProviderDrawingView::setDisplayMode(ModeName); } std::vector ViewProviderAnnotation::getDisplayModes(void) const { // get the modes of the father - std::vector StrList = ViewProviderDocumentObject::getDisplayModes(); + std::vector StrList = ViewProviderDrawingView::getDisplayModes(); return StrList; } void ViewProviderAnnotation::updateData(const App::Property* prop) { - Gui::ViewProviderDocumentObject::updateData(prop); + Base::Console().Log("ViewProviderViewSection::updateData - Update View: %s\n",prop->getName()); + if (prop == &(getViewObject()->Text) || + prop == &(getViewObject()->Font) || + prop == &(getViewObject()->TextColor) || + prop == &(getViewObject()->TextSize) || + prop == &(getViewObject()->LineSpace) || + prop == &(getViewObject()->TextStyle) || + prop == &(getViewObject()->MaxWidth) ) { + // redraw QGIVP + QGIView* qgiv = getQView(); + if (qgiv) { + qgiv->updateView(true); + } + } + + ViewProviderDrawingView::updateData(prop); } TechDraw::DrawViewAnnotation* ViewProviderAnnotation::getViewObject() const diff --git a/src/Mod/TechDraw/Gui/ViewProviderAnnotation.h b/src/Mod/TechDraw/Gui/ViewProviderAnnotation.h index 88b9c8b70..12912fa27 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderAnnotation.h +++ b/src/Mod/TechDraw/Gui/ViewProviderAnnotation.h @@ -28,7 +28,7 @@ #include #include "ViewProviderDrawingView.h" - +#include #include namespace TechDrawGui { diff --git a/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp b/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp index 539d0309e..53773329c 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp @@ -90,7 +90,7 @@ void ViewProviderDimension::updateData(const App::Property* p) sPixmap = "TechDraw_Dimension_Angle"; } } - Gui::ViewProviderDocumentObject::updateData(p); + ViewProviderDrawingView::updateData(p); } TechDraw::DrawViewDimension* ViewProviderDimension::getViewObject() const diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp index f124edf52..4a712f784 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp @@ -177,9 +177,18 @@ void ViewProviderDrawingView::finishRestoring() Gui::ViewProviderDocumentObject::finishRestoring(); } -//void ViewProviderDrawingView::updateData(const App::Property*) -//{ -//} +void ViewProviderDrawingView::updateData(const App::Property* prop) +{ + if (prop == &(getViewObject()->Rotation) ) { + // redraw QGIVP + QGIView* qgiv = getQView(); + if (qgiv) { + qgiv->updateView(true); + } + } + + Gui::ViewProviderDocumentObject::updateData(prop); +} TechDraw::DrawView* ViewProviderDrawingView::getViewObject() const { diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h index 1b88253ad..5e9057ccb 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h @@ -50,7 +50,6 @@ public: virtual bool useNewSelectionModel(void) const {return false;} /// returns a list of all possible modes virtual std::vector getDisplayModes(void) const; - //virtual void updateData(const App::Property*); /// Hide the object in the view virtual void hide(void); /// Show the object in the view @@ -58,6 +57,8 @@ public: virtual bool isShow(void) const; virtual void onChanged(const App::Property *prop); + virtual void updateData(const App::Property*); + QGIView* getQView(void); /** @name Restoring view provider from document load */ diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp index 54478b202..df657a46a 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp @@ -71,7 +71,7 @@ PROPERTY_SOURCE(TechDrawGui::ViewProviderPage, Gui::ViewProviderDocumentObject) // Construction/Destruction ViewProviderPage::ViewProviderPage() - : view(0), + : m_mdiView(0), m_docReady(true) { sPixmap = "TechDraw_Tree_Page"; @@ -116,23 +116,23 @@ void ViewProviderPage::show(void) void ViewProviderPage::hide(void) { - // hiding the drawing page should not affect its children but closes the MDI view + // hiding the drawing page should not affect its children but closes the MDI m_mdiView // therefore do not call the method of its direct base class ViewProviderDocumentObject::hide(); - if (view) { - view->parentWidget()->deleteLater(); + if (m_mdiView) { + m_mdiView->parentWidget()->deleteLater(); } } void ViewProviderPage::updateData(const App::Property* prop) { - if (prop == &(getPageObject()->Views)) { - if(view) { - view->updateDrawing(); + if (prop == &(getDrawPage()->Views)) { + if(m_mdiView) { + m_mdiView->updateDrawing(); } - } else if (prop == &(getPageObject()->Template)) { - if(view) { - view->updateTemplate(); + } else if (prop == &(getDrawPage()->Template)) { + if(m_mdiView) { + m_mdiView->updateTemplate(); } } @@ -141,10 +141,10 @@ void ViewProviderPage::updateData(const App::Property* prop) bool ViewProviderPage::onDelete(const std::vector &items) { - if (!view.isNull()) { - Gui::getMainWindow()->removeWindow(view); + if (!m_mdiView.isNull()) { + Gui::getMainWindow()->removeWindow(m_mdiView); Gui::getMainWindow()->activatePreviousWindow(); - view->deleteLater(); // Delete the drawing view; + m_mdiView->deleteLater(); // Delete the drawing m_mdiView; } else { // MDIViewPage is not displayed yet so don't try to delete it! Base::Console().Log("INFO - ViewProviderPage::onDelete - Page object deleted when viewer not displayed\n"); @@ -165,7 +165,7 @@ bool ViewProviderPage::setEdit(int ModNum) { if (ModNum == ViewProvider::Default) { showMDIViewPage(); // show the drawing - Gui::getMainWindow()->setActiveWindow(view); + Gui::getMainWindow()->setActiveWindow(m_mdiView); return false; } else { Gui::ViewProviderDocumentObject::setEdit(ModNum); @@ -176,7 +176,7 @@ bool ViewProviderPage::setEdit(int ModNum) bool ViewProviderPage::doubleClicked(void) { showMDIViewPage(); - Gui::getMainWindow()->setActiveWindow(view); + Gui::getMainWindow()->setActiveWindow(m_mdiView); return true; } @@ -186,19 +186,19 @@ bool ViewProviderPage::showMDIViewPage() return true; } - if (view.isNull()){ + if (m_mdiView.isNull()){ Gui::Document* doc = Gui::Application::Instance->getDocument (pcObject->getDocument()); - view = new MDIViewPage(this, doc, Gui::getMainWindow()); - view->setWindowTitle(QObject::tr("Drawing viewer") + QString::fromLatin1("[*]")); - view->setWindowIcon(Gui::BitmapFactory().pixmap("TechDraw_Tree_Page")); - view->updateDrawing(true); - // view->updateTemplate(true); //TODO: I don't think this is necessary? Ends up triggering a reload of SVG template, but the MDIViewPage constructor does too. - Gui::getMainWindow()->addWindow(view); - view->viewAll(); + m_mdiView = new MDIViewPage(this, doc, Gui::getMainWindow()); + m_mdiView->setWindowTitle(QObject::tr("Drawing viewer") + QString::fromLatin1("[*]")); + m_mdiView->setWindowIcon(Gui::BitmapFactory().pixmap("TechDraw_Tree_Page")); + m_mdiView->updateDrawing(true); + // m_mdiView->updateTemplate(true); //TODO: I don't think this is necessary? Ends up triggering a reload of SVG template, but the MDIViewPage constructor does too. + Gui::getMainWindow()->addWindow(m_mdiView); + m_mdiView->viewAll(); } else { - view->updateDrawing(true); - view->updateTemplate(true); + m_mdiView->updateDrawing(true); + m_mdiView->updateTemplate(true); } return true; } @@ -209,7 +209,7 @@ std::vector ViewProviderPage::claimChildren(void) const // Attach the template if it exists App::DocumentObject *templateFeat = 0; - templateFeat = getPageObject()->Template.getValue(); + templateFeat = getDrawPage()->Template.getValue(); if(templateFeat) { temp.push_back(templateFeat); @@ -221,7 +221,7 @@ std::vector ViewProviderPage::claimChildren(void) const // any FeatuerView in a DrawViewClip // DrawHatch - const std::vector &views = getPageObject()->Views.getValues(); + const std::vector &views = getDrawPage()->Views.getValues(); try { for(std::vector::const_iterator it = views.begin(); it != views.end(); ++it) { @@ -252,24 +252,24 @@ void ViewProviderPage::unsetEdit(int ModNum) MDIViewPage* ViewProviderPage::getMDIViewPage() { - if (view.isNull()) { - Base::Console().Log("INFO - ViewProviderPage::getMDIViewPage has no view!\n"); + if (m_mdiView.isNull()) { + Base::Console().Log("INFO - ViewProviderPage::getMDIViewPage has no m_mdiView!\n"); return 0; } else { - return view; + return m_mdiView; } } void ViewProviderPage::onSelectionChanged(const Gui::SelectionChanges& msg) { - if(!view.isNull()) { + if(!m_mdiView.isNull()) { if(msg.Type == Gui::SelectionChanges::SetSelection) { - view->clearSelection(); + m_mdiView->clearSelection(); std::vector objs = Gui::Selection().getSelection(msg.pDocName); for (std::vector::iterator it = objs.begin(); it != objs.end(); ++it) { Gui::SelectionSingleton::SelObj selObj = *it; - if(selObj.pObject == getPageObject()) + if(selObj.pObject == getDrawPage()) continue; std::string str = msg.pSubName; @@ -281,7 +281,7 @@ void ViewProviderPage::onSelectionChanged(const Gui::SelectionChanges& msg) // TODO implement me wf: don't think this is ever executed } } else { - view->selectFeature(selObj.pObject, true); + m_mdiView->selectFeature(selObj.pObject, true); } } } else { @@ -297,7 +297,7 @@ void ViewProviderPage::onSelectionChanged(const Gui::SelectionChanges& msg) TechDraw::DrawUtil::getGeomTypeFromName(str) == "Vertex") { // TODO implement me } else { - view->selectFeature(obj, selectState); + m_mdiView->selectFeature(obj, selectState); } } } @@ -307,13 +307,13 @@ void ViewProviderPage::onSelectionChanged(const Gui::SelectionChanges& msg) void ViewProviderPage::onChanged(const App::Property *prop) { - if (prop == &(getPageObject()->Views)) { - if(view) { - view->updateDrawing(); + if (prop == &(getDrawPage()->Views)) { + if(m_mdiView) { + m_mdiView->updateDrawing(); } - } else if (prop == &(getPageObject()->Template)) { - if(view) { - view->updateTemplate(); + } else if (prop == &(getDrawPage()->Template)) { + if(m_mdiView) { + m_mdiView->updateTemplate(); } } @@ -334,11 +334,11 @@ void ViewProviderPage::finishRestoring() } -TechDraw::DrawPage* ViewProviderPage::getPageObject() const +TechDraw::DrawPage* ViewProviderPage::getDrawPage() const { //during redo, pcObject can become invalid, but non-zero?? if (!pcObject) { - Base::Console().Message("TROUBLE - VPP::getPageObject - no Page Object!\n"); + Base::Console().Message("TROUBLE - VPPage::getDrawPage - no Page Object!\n"); return nullptr; } return dynamic_cast(pcObject); diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.h b/src/Mod/TechDraw/Gui/ViewProviderPage.h index 32466be58..d740c9e21 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.h +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.h @@ -78,7 +78,7 @@ public: virtual void finishRestoring(); bool isRestoring(void) {return !m_docReady;} - TechDraw::DrawPage* getPageObject() const; + TechDraw::DrawPage* getDrawPage() const; void unsetEdit(int ModNum); MDIViewPage* getMDIViewPage(); @@ -87,7 +87,7 @@ protected: bool showMDIViewPage(); private: - QPointer view; + QPointer m_mdiView; bool m_docReady; }; diff --git a/src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.cpp b/src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.cpp index 856ad2ec0..f14d20c86 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderSpreadsheet.cpp @@ -28,20 +28,15 @@ /// Here the FreeCAD includes sorted by Base,App,Gui...... #include -//#include -//#include -//#include #include #include #include -//#include -//#include #include "ViewProviderSpreadsheet.h" using namespace TechDrawGui; -PROPERTY_SOURCE(TechDrawGui::ViewProviderSpreadsheet, Gui::ViewProviderDocumentObject) +PROPERTY_SOURCE(TechDrawGui::ViewProviderSpreadsheet, TechDrawGui::ViewProviderSymbol) //************************************************************************** // Construction/Destruction @@ -58,25 +53,25 @@ ViewProviderSpreadsheet::~ViewProviderSpreadsheet() void ViewProviderSpreadsheet::attach(App::DocumentObject *pcFeat) { // call parent attach method - ViewProviderDocumentObject::attach(pcFeat); + ViewProviderSymbol::attach(pcFeat); } void ViewProviderSpreadsheet::setDisplayMode(const char* ModeName) { - ViewProviderDocumentObject::setDisplayMode(ModeName); + ViewProviderSymbol::setDisplayMode(ModeName); } std::vector ViewProviderSpreadsheet::getDisplayModes(void) const { // get the modes of the father - std::vector StrList = ViewProviderDocumentObject::getDisplayModes(); + std::vector StrList = ViewProviderSymbol::getDisplayModes(); return StrList; } void ViewProviderSpreadsheet::updateData(const App::Property* prop) { - Gui::ViewProviderDocumentObject::updateData(prop); + ViewProviderSymbol::updateData(prop); } TechDraw::DrawViewSpreadsheet* ViewProviderSpreadsheet::getViewObject() const diff --git a/src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp b/src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp index 705b92d65..b46a30512 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp @@ -42,7 +42,7 @@ using namespace TechDrawGui; -PROPERTY_SOURCE(TechDrawGui::ViewProviderSymbol, Gui::ViewProviderDocumentObject) +PROPERTY_SOURCE(TechDrawGui::ViewProviderSymbol, TechDrawGui::ViewProviderDrawingView) //************************************************************************** // Construction/Destruction @@ -59,25 +59,25 @@ ViewProviderSymbol::~ViewProviderSymbol() void ViewProviderSymbol::attach(App::DocumentObject *pcFeat) { // call parent attach method - ViewProviderDocumentObject::attach(pcFeat); + ViewProviderDrawingView::attach(pcFeat); } void ViewProviderSymbol::setDisplayMode(const char* ModeName) { - ViewProviderDocumentObject::setDisplayMode(ModeName); + ViewProviderDrawingView::setDisplayMode(ModeName); } std::vector ViewProviderSymbol::getDisplayModes(void) const { // get the modes of the father - std::vector StrList = ViewProviderDocumentObject::getDisplayModes(); + std::vector StrList = ViewProviderDrawingView::getDisplayModes(); return StrList; } void ViewProviderSymbol::updateData(const App::Property* prop) { - Gui::ViewProviderDocumentObject::updateData(prop); + ViewProviderDrawingView::updateData(prop); } TechDraw::DrawViewSymbol* ViewProviderSymbol::getViewObject() const diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewClip.cpp b/src/Mod/TechDraw/Gui/ViewProviderViewClip.cpp index 3efca80f3..77af00e71 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewClip.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderViewClip.cpp @@ -57,6 +57,22 @@ ViewProviderViewClip::~ViewProviderViewClip() { } +void ViewProviderViewClip::updateData(const App::Property* prop) +{ + Base::Console().Log("ViewProviderViewClip::updateData - Update View: %s\n",prop->getName()); + if (prop == &(getViewObject()->Height) || + prop == &(getViewObject()->Width) || + prop == &(getViewObject()->ShowFrame) || + prop == &(getViewObject()->ShowLabels) ) { + // redraw QGIVP + QGIView* qgiv = getQView(); + if (qgiv) { + qgiv->updateView(true); + } + } + ViewProviderDrawingView::updateData(prop); +} + void ViewProviderViewClip::attach(App::DocumentObject *pcFeat) { // call parent attach method diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewClip.h b/src/Mod/TechDraw/Gui/ViewProviderViewClip.h index a30e0f52d..5789b0cc2 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewClip.h +++ b/src/Mod/TechDraw/Gui/ViewProviderViewClip.h @@ -50,6 +50,7 @@ public: virtual TechDraw::DrawViewClip* getViewObject() const; TechDraw::DrawViewClip* getObject() const; + virtual void updateData(const App::Property* prop); /// Hide the object in the view virtual void hide(void); diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp b/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp index 43bf9c36b..cced922ad 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp @@ -32,12 +32,9 @@ #include #include //#include -//#include #include #include #include -//#include -//#include #include #include @@ -59,8 +56,38 @@ ViewProviderViewPart::ViewProviderViewPart() ViewProviderViewPart::~ViewProviderViewPart() { + } +void ViewProviderViewPart::updateData(const App::Property* prop) +{ + if (prop == &(getViewObject()->LineWidth) || + prop == &(getViewObject()->HiddenWidth) || + prop == &(getViewObject()->ShowCenters) || + prop == &(getViewObject()->CenterScale) || + prop == &(getViewObject()->ShowSectionLine) || + prop == &(getViewObject()->HorizSectionLine) || + prop == &(getViewObject()->ArrowUpSection) || + prop == &(getViewObject()->SymbolSection) || + prop == &(getViewObject()->HorizCenterLine) || + prop == &(getViewObject()->VertCenterLine) ) { + // redraw QGIVP + QGIView* qgiv = getQView(); + if (qgiv) { + qgiv->updateView(true); + } + } + + + ViewProviderDrawingView::updateData(prop); +} + +void ViewProviderViewPart::onChanged(const App::Property* prop) +{ + ViewProviderDrawingView::onChanged(prop); +} + + void ViewProviderViewPart::attach(App::DocumentObject *pcFeat) { // call parent attach method diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewPart.h b/src/Mod/TechDraw/Gui/ViewProviderViewPart.h index 4636c4ec7..cfbd5b776 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewPart.h +++ b/src/Mod/TechDraw/Gui/ViewProviderViewPart.h @@ -47,6 +47,9 @@ public: virtual std::vector getDisplayModes(void) const; public: + virtual void onChanged(const App::Property *prop); + virtual void updateData(const App::Property*); + virtual std::vector claimChildren(void) const; virtual TechDraw::DrawViewPart* getViewObject() const; diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewSection.cpp b/src/Mod/TechDraw/Gui/ViewProviderViewSection.cpp index eecfc4536..4b14e2ea0 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewSection.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderViewSection.cpp @@ -76,9 +76,17 @@ std::vector ViewProviderViewSection::getDisplayModes(void) const void ViewProviderViewSection::updateData(const App::Property* prop) { - //Base::Console().Log("ViewProviderViewSection::updateData - Update View: %s\n",prop->getName()); - // - Gui::ViewProviderDocumentObject::updateData(prop); + Base::Console().Log("ViewProviderViewSection::updateData - Update View: %s\n",prop->getName()); + if (prop == &(getViewObject()->ShowCutSurface) || + prop == &(getViewObject()->CutSurfaceColor) ) { + // redraw QGIVP + QGIView* qgiv = getQView(); + if (qgiv) { + qgiv->updateView(true); + } + } + + ViewProviderViewPart::updateData(prop); } std::vector ViewProviderViewSection::claimChildren(void) const From 81472a5fd89697674ba9efe659af468cf9be7d1e Mon Sep 17 00:00:00 2001 From: WandererFan Date: Sat, 10 Sep 2016 19:37:03 -0400 Subject: [PATCH 10/12] Fix over-aggressive input cleansing --- src/Mod/TechDraw/App/EdgeWalker.cpp | 229 +++++++++++----------------- src/Mod/TechDraw/App/EdgeWalker.h | 5 +- 2 files changed, 90 insertions(+), 144 deletions(-) diff --git a/src/Mod/TechDraw/App/EdgeWalker.cpp b/src/Mod/TechDraw/App/EdgeWalker.cpp index e2a0e2148..4384e724b 100644 --- a/src/Mod/TechDraw/App/EdgeWalker.cpp +++ b/src/Mod/TechDraw/App/EdgeWalker.cpp @@ -88,11 +88,10 @@ void edgeVisitor::setGraph(TechDraw::graph& g) } //******************************************************* -//* EdgeWalker +//* EdgeWalker methods //******************************************************* -EdgeWalker::EdgeWalker() : - duplicateInput(false) +EdgeWalker::EdgeWalker() { } @@ -155,8 +154,6 @@ bool EdgeWalker::perform() const TechDraw::graph& m_g, graph_traits::edge_descriptor edge); - - bool isPlanar = boyer_myrvold_planarity_test(boyer_myrvold_params::graph = m_g, boyer_myrvold_params::embedding = &embedding[0], boyer_myrvold_params::kuratowski_subgraph = @@ -199,16 +196,6 @@ std::vector EdgeWalker::getResultWires() return fw; } - //convert from noduplicate index to duplicates index - for (auto& w:result.wires) { - for (auto& we:w.wedges) { - //we.idx is the edge index in the short list (no duplicates) - //saveIndex[we.idx] should be the index in the long list - we.idx = saveIndex[we.idx]; - } - } - - std::vector::iterator iWire = result.wires.begin(); // a WE within [WE] for (;iWire != result.wires.end(); iWire++) { std::vector::iterator iEdge = (*iWire).wedges.begin(); @@ -231,25 +218,15 @@ std::vector EdgeWalker::getResultNoDups() return fw; } - //convert from noduplicate index to duplicates index - for (auto& w:result.wires) { - for (auto& we:w.wedges) { - //we.idx is the edge index in the short list (no duplicates) - //saveIndex[we.idx] should be the index in the long list - we.idx = saveIndex[we.idx]; - } - } - result = result.removeDuplicates(); + result = result.removeDuplicateWires(); std::vector::iterator iWire = result.wires.begin(); - int edgeCount = 1; for (;iWire != result.wires.end(); iWire++) { std::vector::iterator iEdge = (*iWire).wedges.begin(); std::vector topoEdges; for (;iEdge != (*iWire).wedges.end(); iEdge++) { TopoDS_Edge e = saveInEdges.at((*iEdge).idx); topoEdges.push_back(e); - edgeCount++; } TopoDS_Wire w = makeCleanWire(topoEdges); //make 1 clean wire from its edges fw.push_back(w); @@ -312,30 +289,23 @@ std::vector EdgeWalker:: makeUniqueVList(std::vector } //!make WalkerEdges (unique Vertex index pairs) from edge list -//remove duplicate edges from input std::vector EdgeWalker::makeWalkerEdges(std::vector edges, std::vector verts) { saveInEdges = edges; - std::vector rawList; + std::vector walkerEdges; for (auto e:edges) { TopoDS_Vertex ev1 = TopExp::FirstVertex(e); TopoDS_Vertex ev2 = TopExp::LastVertex(e); int v1dx = findUniqueVert(ev1, verts); int v2dx = findUniqueVert(ev2, verts); - WalkerEdge rl; - rl.v1 = v1dx; - rl.v2 = v2dx; - rawList.push_back(rl); + WalkerEdge we; + we.v1 = v1dx; + we.v2 = v2dx; + walkerEdges.push_back(we); } - std::vector we = removeDuplicateInput(rawList); - for (auto& w:we) - { - saveIndex.push_back(w.idx); - } - - return we; + return walkerEdges; } int EdgeWalker::findUniqueVert(TopoDS_Vertex vx, std::vector &uniqueVert) @@ -352,107 +322,6 @@ int EdgeWalker::findUniqueVert(TopoDS_Vertex vx, std::vector &uni return result; } -//removes duplicates from input and sets idx to position in original list -std::vector EdgeWalker::removeDuplicateInput(std::vector input) -{ - std::vector result; - //std::vector ref; - if (input.empty()) { - return result; - } - - result.push_back(*(input.begin())); //save the first WE - result[0].idx = 0; - //ref.push_back(0); - std::vector::iterator iWE = (input.begin()) + 1; //starting with second - int i = 1; - for (; iWE != input.end(); iWE++, i++) { - bool addToResult = true; - for (auto& w:result) { - if ((*iWE).isEqual(w)) { //already in result? - addToResult = false; - Base::Console().Log("LOG - EW::removeDuplicateInput - input edge: %d is a duplicate\n",i); - break; - } - } - if (addToResult) { - (*iWE).idx = i; - result.push_back((*iWE)); - //ref.push_back(i); - } - } - return result; -} - -bool WalkerEdge::isEqual(WalkerEdge w) -{ - bool result = false; - if ((( v1 == w.v1) && (v2 == w.v2)) || - (( v1 == w.v2) && (v2 == w.v1)) ) { - result = true; - } - return result; -} - - -/*static*/ bool WalkerEdge::weCompare(WalkerEdge i, WalkerEdge j) //used for sorting -{ - return (i.idx < j.idx); -} - -bool ewWire::isEqual(ewWire w2) -{ - bool result = true; - if (wedges.size() != w2.wedges.size()) { - result = false; - } else { - std::sort(wedges.begin(),wedges.end(),WalkerEdge::weCompare); - std::sort(w2.wedges.begin(),w2.wedges.end(),WalkerEdge::weCompare); - for (unsigned int i = 0; i < w2.wedges.size(); i ++) { - if (wedges.at(i).idx != w2.wedges.at(i).idx) { - result = false; - break; - } - } - } - return result; -} - -void ewWire::push_back(WalkerEdge w) -{ - wedges.push_back(w); -} - -//check wirelist for wires that use the same set of edges, but maybe in a different order. -ewWireList ewWireList::removeDuplicates() -{ - ewWireList result; - if (wires.empty()) { - return result; - } - result.push_back(*(wires.begin())); //save the first ewWire - std::vector::iterator iWire = (wires.begin()) + 1; //starting with second - for (; iWire != wires.end(); iWire++) { - bool addToResult = true; - for (auto& w:result.wires) { - if ((*iWire).isEqual(w)) { //already in result? - addToResult = false; - break; - } - } - if (addToResult) { - result.push_back((*iWire)); - } - } - return result; -} - -void ewWireList::push_back(ewWire w) -{ - wires.push_back(w); -} - - std::vector EdgeWalker::sortStrip(std::vector fw, bool includeBiggest) { std::vector sortedWires = sortWiresBySize(fw,false); //biggest 1st @@ -551,3 +420,83 @@ std::vector EdgeWalker::sortWiresBySize(std::vector& w return box1.SquareExtent() > box2.SquareExtent(); } + + +//******************************************* +// WalkerEdge Methods +//******************************************* +bool WalkerEdge::isEqual(WalkerEdge w) +{ + bool result = false; + if ((( v1 == w.v1) && (v2 == w.v2)) || + (( v1 == w.v2) && (v2 == w.v1)) ) { + result = true; + } + return result; +} + + +/*static*/ bool WalkerEdge::weCompare(WalkerEdge i, WalkerEdge j) //used for sorting +{ + return (i.idx < j.idx); +} + + +//***************************************** +// ewWire Methods +//***************************************** +bool ewWire::isEqual(ewWire w2) +{ + bool result = true; + if (wedges.size() != w2.wedges.size()) { + result = false; + } else { + std::sort(wedges.begin(),wedges.end(),WalkerEdge::weCompare); + std::sort(w2.wedges.begin(),w2.wedges.end(),WalkerEdge::weCompare); + for (unsigned int i = 0; i < w2.wedges.size(); i ++) { + if (wedges.at(i).idx != w2.wedges.at(i).idx) { + result = false; + break; + } + } + } + return result; +} + +void ewWire::push_back(WalkerEdge w) +{ + wedges.push_back(w); +} + + +//*************************************** +// ewWireList methods +//*************************************** +//check wirelist for wires that use the same set of edges, but maybe in a different order. +ewWireList ewWireList::removeDuplicateWires() +{ + ewWireList result; + if (wires.empty()) { + return result; + } + result.push_back(*(wires.begin())); //save the first ewWire + std::vector::iterator iWire = (wires.begin()) + 1; //starting with second + for (; iWire != wires.end(); iWire++) { + bool addToResult = true; + for (auto& w:result.wires) { + if ((*iWire).isEqual(w)) { //already in result? + addToResult = false; + break; + } + } + if (addToResult) { + result.push_back((*iWire)); + } + } + return result; +} + +void ewWireList::push_back(ewWire w) +{ + wires.push_back(w); +} diff --git a/src/Mod/TechDraw/App/EdgeWalker.h b/src/Mod/TechDraw/App/EdgeWalker.h index 10095bb04..873579193 100644 --- a/src/Mod/TechDraw/App/EdgeWalker.h +++ b/src/Mod/TechDraw/App/EdgeWalker.h @@ -80,7 +80,7 @@ public: class ewWireList { public: - ewWireList removeDuplicates(); + ewWireList removeDuplicateWires(); std::vector wires; void push_back(ewWire e); @@ -121,7 +121,6 @@ public: std::vector makeUniqueVList(std::vector edges); std::vector makeWalkerEdges(std::vector edges, std::vector verts); - std::vector removeDuplicateInput(std::vector input); int findUniqueVert(TopoDS_Vertex vx, std::vector &uniqueVert); std::vector sortStrip(std::vector fw, bool includeBiggest); @@ -132,12 +131,10 @@ public: protected: static bool wireCompare(const TopoDS_Wire& w1, const TopoDS_Wire& w2); std::vector saveInEdges; - std::vector saveIndex; private: edgeVisitor m_eV; TechDraw::graph m_g; - bool duplicateInput; }; } //end namespace TechDraw From 254b28ea775fdac06c6f338816fa4ae7a5d541c7 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Fri, 9 Sep 2016 12:52:57 -0400 Subject: [PATCH 11/12] Fix #2692 TaskProjectGroup cancel button --- src/Mod/TechDraw/App/DrawProjGroup.cpp | 90 +++++++----- src/Mod/TechDraw/App/DrawProjGroup.h | 1 + src/Mod/TechDraw/App/DrawProjGroupItem.cpp | 4 +- src/Mod/TechDraw/App/DrawProjGroupItem.h | 2 - src/Mod/TechDraw/App/DrawProjGroupPy.xml | 5 + src/Mod/TechDraw/App/DrawProjGroupPyImp.cpp | 8 ++ src/Mod/TechDraw/App/DrawViewCollection.cpp | 48 +++++++ src/Mod/TechDraw/App/DrawViewCollection.h | 2 + src/Mod/TechDraw/App/DrawViewCollectionPy.xml | 10 ++ .../TechDraw/App/DrawViewCollectionPyImp.cpp | 35 +++++ src/Mod/TechDraw/Gui/Command.cpp | 10 +- src/Mod/TechDraw/Gui/TaskProjGroup.cpp | 131 ++++++++++++------ src/Mod/TechDraw/Gui/TaskProjGroup.h | 13 +- src/Mod/TechDraw/Gui/TaskProjGroup.ui | 17 +-- .../TechDraw/Gui/ViewProviderProjGroup.cpp | 9 +- 15 files changed, 284 insertions(+), 101 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawProjGroup.cpp b/src/Mod/TechDraw/App/DrawProjGroup.cpp index 13937a749..300ec9cb8 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroup.cpp @@ -242,17 +242,6 @@ App::DocumentObject * DrawProjGroup::getProjObj(const char *viewProjType) const return 0; } -bool DrawProjGroup::hasProjection(const char *viewProjType) const -{ - for( const auto it : Views.getValues() ) { - auto view( dynamic_cast(it) ); - if( view && strcmp(viewProjType, view->Type.getValueAsString()) == 0 ) { - return true; - } - } - return false; -} - bool DrawProjGroup::checkViewProjType(const char *in) { if ( strcmp(in, "Front") == 0 || @@ -270,13 +259,27 @@ bool DrawProjGroup::checkViewProjType(const char *in) return false; } +//******************************** +// ProjectionItem A/D/I +//******************************** +bool DrawProjGroup::hasProjection(const char *viewProjType) const +{ + for( const auto it : Views.getValues() ) { + auto view( dynamic_cast(it) ); + if( view && strcmp(viewProjType, view->Type.getValueAsString()) == 0 ) { + return true; + } + } + return false; +} + App::DocumentObject * DrawProjGroup::addProjection(const char *viewProjType) { DrawProjGroupItem *view( nullptr ); if ( checkViewProjType(viewProjType) && !hasProjection(viewProjType) ) { std::string FeatName = getDocument()->getUniqueObjectName("ProjItem"); - auto docObj( getDocument()->addObject( "TechDraw::DrawProjGroupItem", + auto docObj( getDocument()->addObject( "TechDraw::DrawProjGroupItem", //add to Document FeatName.c_str() ) ); view = static_cast( docObj ); @@ -287,13 +290,50 @@ App::DocumentObject * DrawProjGroup::addProjection(const char *viewProjType) view->Label.setValue( viewProjType ); setViewOrientation( view, viewProjType ); - addView(view); //from DrawViewCollection + addView(view); //from DrawViewCollection - add to ProjGroup Views moveToCentre(); } return view; } +int DrawProjGroup::removeProjection(const char *viewProjType) +{ + if ( checkViewProjType(viewProjType) ) { + if( !hasProjection(viewProjType) ) { + throw Base::Exception("The projection doesn't exist in the group"); + } + + // Iterate through the child views and find the projection type + for( auto it : Views.getValues() ) { + auto projPtr( dynamic_cast(it) ); + if( projPtr ) { + if ( strcmp(viewProjType, projPtr->Type.getValueAsString()) == 0 ) { + removeView(projPtr); // Remove from collection + getDocument()->remObject( it->getNameInDocument() ); // Remove from the document + moveToCentre(); + return Views.getValues().size(); + } + } + } + } + + return -1; +} + +int DrawProjGroup::purgeProjections() +{ + while (!Views.getValues().empty()) { + std::vector views = Views.getValues(); + DrawProjGroupItem* dpgi; + DocumentObject* dObj = views.back(); + dpgi = dynamic_cast(dObj); + std::string itemName = dpgi->Type.getValueAsString(); + removeProjection(itemName.c_str()); + } + return Views.getValues().size(); +} + void DrawProjGroup::setViewOrientation(DrawProjGroupItem *v, const char *projType) const { Base::Vector3d dir, xDir; @@ -351,30 +391,6 @@ void DrawProjGroup::setViewOrientation(DrawProjGroupItem *v, const char *projTyp v->XAxisDirection.setValue(xDir); } -int DrawProjGroup::removeProjection(const char *viewProjType) -{ - if ( checkViewProjType(viewProjType) ) { - if( !hasProjection(viewProjType) ) { - throw Base::Exception("The projection doesn't exist in the group"); - } - - // Iterate through the child views and find the projection type - for( auto it : Views.getValues() ) { - auto projPtr( dynamic_cast(it) ); - if( projPtr ) { - if ( strcmp(viewProjType, projPtr->Type.getValueAsString()) == 0 ) { - // Remove from the document - getDocument()->remObject( it->getNameInDocument() ); - moveToCentre(); - return Views.getValues().size(); - } - } - } - } - - return -1; -} - void DrawProjGroup::arrangeViewPointers(DrawProjGroupItem *viewPtrs[10]) const { for (int i=0; i<10; ++i) { diff --git a/src/Mod/TechDraw/App/DrawProjGroup.h b/src/Mod/TechDraw/App/DrawProjGroup.h index a6b53e2d2..589c7b63b 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.h +++ b/src/Mod/TechDraw/App/DrawProjGroup.h @@ -83,6 +83,7 @@ public: */ int removeProjection(const char *viewProjType); + int purgeProjections(); /// Automatically position child views bool distributeProjections(void); void resetPositions(void); diff --git a/src/Mod/TechDraw/App/DrawProjGroupItem.cpp b/src/Mod/TechDraw/App/DrawProjGroupItem.cpp index 9a35bfae8..ede874d2f 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupItem.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroupItem.cpp @@ -57,8 +57,8 @@ DrawProjGroupItem::DrawProjGroupItem(void) ADD_PROPERTY(Type, ((long)0)); //projection group controls these - Direction.setStatus(App::Property::Hidden,true); - XAxisDirection.setStatus(App::Property::Hidden,true); + Direction.setStatus(App::Property::ReadOnly,true); + XAxisDirection.setStatus(App::Property::ReadOnly,true); Scale.setStatus(App::Property::ReadOnly,true); ScaleType.setStatus(App::Property::ReadOnly,true); } diff --git a/src/Mod/TechDraw/App/DrawProjGroupItem.h b/src/Mod/TechDraw/App/DrawProjGroupItem.h index c0de0735e..b08f52f6f 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupItem.h +++ b/src/Mod/TechDraw/App/DrawProjGroupItem.h @@ -31,8 +31,6 @@ namespace TechDraw { -/** Base class of all View Features in the drawing module - */ class TechDrawExport DrawProjGroupItem : public TechDraw::DrawViewPart { PROPERTY_HEADER(TechDraw::DrawProjGroupItem); diff --git a/src/Mod/TechDraw/App/DrawProjGroupPy.xml b/src/Mod/TechDraw/App/DrawProjGroupPy.xml index f42fe53f7..603a2543b 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupPy.xml +++ b/src/Mod/TechDraw/App/DrawProjGroupPy.xml @@ -23,6 +23,11 @@ removeProjection(string projectionType) - Remove specified Projection Item from this Group. Returns int number of views in Group. + + + purgeProjections() - Remove all Projection Items from this Group. Returns int number of views in Group (0). + + getItemByLabel(string projectionType) - return specified Projection Item diff --git a/src/Mod/TechDraw/App/DrawProjGroupPyImp.cpp b/src/Mod/TechDraw/App/DrawProjGroupPyImp.cpp index 1b6872434..9ff9d092c 100644 --- a/src/Mod/TechDraw/App/DrawProjGroupPyImp.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroupPyImp.cpp @@ -50,6 +50,14 @@ PyObject* DrawProjGroupPy::removeProjection(PyObject* args) return PyInt_FromLong((long) i);; } +PyObject* DrawProjGroupPy::purgeProjections(PyObject* args) +{ + DrawProjGroup* projGroup = getDrawProjGroupPtr(); + int i = projGroup->purgeProjections(); + + return PyInt_FromLong((long) i);; +} + PyObject* DrawProjGroupPy::getItemByLabel(PyObject* args) { const char* projType; diff --git a/src/Mod/TechDraw/App/DrawViewCollection.cpp b/src/Mod/TechDraw/App/DrawViewCollection.cpp index 8a788a22f..acb29de81 100644 --- a/src/Mod/TechDraw/App/DrawViewCollection.cpp +++ b/src/Mod/TechDraw/App/DrawViewCollection.cpp @@ -68,6 +68,54 @@ int DrawViewCollection::addView(DrawView *view) return Views.getSize(); } +int DrawViewCollection::removeView(DrawView *view) +{ + // Remove the view from the the collection + const std::vector currViews = Views.getValues(); + std::vector newViews; + std::vector::const_iterator it = currViews.begin(); + for (; it != currViews.end(); it++) { + std::string viewName = view->getNameInDocument(); + if (viewName.compare((*it)->getNameInDocument()) != 0) { + newViews.push_back((*it)); + } + } + Views.setValues(newViews); + +//TODO: also have to touch the parent page's views to get repaint?? + DrawPage* page = findParentPage(); + if (page) { + page->Views.touch(); + } + return Views.getSize(); +} + +//make sure everything in View list represents a real DrawView docObj and occurs only once +void DrawViewCollection::rebuildViewList() +{ + const std::vector currViews = Views.getValues(); + std::vector newViews; + std::vector children = getOutList(); + for (std::vector::iterator it = children.begin(); it != children.end(); ++it) { + if ((*it)->getTypeId().isDerivedFrom(DrawView::getClassTypeId())) { + //TechDraw::DrawView* view = static_cast(*it); + bool found = false; + for (auto& v:currViews) { + if (v == (*it)) { + found = true; + break; + } + } + if (found) { + newViews.push_back((*it)); + } + } + } // newViews contains only valid items, but may have duplicates + sort( newViews.begin(), newViews.end() ); + newViews.erase( unique( newViews.begin(), newViews.end() ), newViews.end() ); + Views.setValues(newViews); +} + short DrawViewCollection::mustExecute() const { // If Tolerance Property is touched diff --git a/src/Mod/TechDraw/App/DrawViewCollection.h b/src/Mod/TechDraw/App/DrawViewCollection.h index d54a139ce..4b1c85d54 100644 --- a/src/Mod/TechDraw/App/DrawViewCollection.h +++ b/src/Mod/TechDraw/App/DrawViewCollection.h @@ -48,6 +48,8 @@ public: short mustExecute() const; int addView(DrawView *view); + int removeView(DrawView *view); + void rebuildViewList(void); int countChildren(); /** @name methods overide Feature */ diff --git a/src/Mod/TechDraw/App/DrawViewCollectionPy.xml b/src/Mod/TechDraw/App/DrawViewCollectionPy.xml index 543b0527f..ded644e4b 100644 --- a/src/Mod/TechDraw/App/DrawViewCollectionPy.xml +++ b/src/Mod/TechDraw/App/DrawViewCollectionPy.xml @@ -13,6 +13,16 @@ Feature for creating and manipulating Technical Drawing View Collections + + + addView(DrawView object) - Add a new View to this Group. Returns count of views. + + + + + removeView(DrawView object) - Remove specified Viewfrom this Group. Returns count of views in Group. + + diff --git a/src/Mod/TechDraw/App/DrawViewCollectionPyImp.cpp b/src/Mod/TechDraw/App/DrawViewCollectionPyImp.cpp index b507c233c..1fe97d292 100644 --- a/src/Mod/TechDraw/App/DrawViewCollectionPyImp.cpp +++ b/src/Mod/TechDraw/App/DrawViewCollectionPyImp.cpp @@ -14,6 +14,41 @@ std::string DrawViewCollectionPy::representation(void) const { return std::string(""); } +PyObject* DrawViewCollectionPy::addView(PyObject* args) +{ + PyObject *pcDocObj; + + if (!PyArg_ParseTuple(args, "O!", &(App::DocumentObjectPy::Type), &pcDocObj)) { + Base::Console().Error("Error: DrawViewClipPy::addView - Bad Arg - not DocumentObject\n"); + return NULL; + } + + DrawViewCollection* collect = getDrawViewCollectionPtr(); + DrawViewPy* pyView = static_cast(pcDocObj); + DrawView* view = pyView->getDrawViewPtr(); //get DrawView for pyView + + int i = collect->addView(view); + + return PyInt_FromLong((long) i); +} + +PyObject* DrawViewCollectionPy::removeView(PyObject* args) +{ + PyObject *pcDocObj; + + if (!PyArg_ParseTuple(args, "O!", &(App::DocumentObjectPy::Type), &pcDocObj)) { + Base::Console().Error("Error: DrawViewClipPy::addView - Bad Arg - not DocumentObject\n"); + return NULL; + } + + DrawViewCollection* collect = getDrawViewCollectionPtr(); + DrawViewPy* pyView = static_cast(pcDocObj); + DrawView* view = pyView->getDrawViewPtr(); //get DrawView for pyView + + int i = collect->removeView(view); + + return PyInt_FromLong((long) i); +} PyObject *DrawViewCollectionPy::getCustomAttributes(const char* /*attr*/) const diff --git a/src/Mod/TechDraw/Gui/Command.cpp b/src/Mod/TechDraw/Gui/Command.cpp index a4b0d1cf0..0a04c6f35 100644 --- a/src/Mod/TechDraw/Gui/Command.cpp +++ b/src/Mod/TechDraw/Gui/Command.cpp @@ -469,13 +469,15 @@ void CmdTechDrawProjGroup::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.addProjection('%s')",multiViewName.c_str(),anchor.c_str()); doCommand(Doc,"App.activeDocument().%s.Anchor = App.activeDocument().%s.getItemByLabel('%s')", multiViewName.c_str(),multiViewName.c_str(),anchor.c_str()); - - // create the rest of the desired views - Gui::Control().showDialog(new TaskDlgProjGroup(multiView)); - // add the multiView to the page doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),multiViewName.c_str()); + // create the rest of the desired views + Gui::Control().showDialog(new TaskDlgProjGroup(multiView,true)); + +// // add the multiView to the page +// doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),multiViewName.c_str()); + updateActive(); commitCommand(); } diff --git a/src/Mod/TechDraw/Gui/TaskProjGroup.cpp b/src/Mod/TechDraw/Gui/TaskProjGroup.cpp index a1ea17df3..71df028a4 100644 --- a/src/Mod/TechDraw/Gui/TaskProjGroup.cpp +++ b/src/Mod/TechDraw/Gui/TaskProjGroup.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include @@ -56,8 +58,10 @@ using namespace TechDrawGui; #endif -TaskProjGroup::TaskProjGroup(TechDraw::DrawProjGroup* featView) : ui(new Ui_TaskProjGroup), - multiView(featView) +TaskProjGroup::TaskProjGroup(TechDraw::DrawProjGroup* featView, bool mode) : + ui(new Ui_TaskProjGroup), + multiView(featView), + m_createMode(mode) { ui->setupUi(this); @@ -84,8 +88,8 @@ TaskProjGroup::TaskProjGroup(TechDraw::DrawProjGroup* featView) : ui(new Ui_Task // Slot for Scale Type connect(ui->cmbScaleType, SIGNAL(currentIndexChanged(int)), this, SLOT(scaleTypeChanged(int))); - connect(ui->scaleNum, SIGNAL(textEdited(const QString &)), this, SLOT(scaleManuallyChanged(const QString &))); - connect(ui->scaleDenom, SIGNAL(textEdited(const QString &)), this, SLOT(scaleManuallyChanged(const QString &))); + connect(ui->sbScaleNum, SIGNAL(valueChanged(int)), this, SLOT(scaleManuallyChanged(int))); + connect(ui->sbScaleDen, SIGNAL(valueChanged(int)), this, SLOT(scaleManuallyChanged(int))); // Slot for Projection Type (layout) connect(ui->projection, SIGNAL(currentIndexChanged(int)), this, SLOT(projectionTypeChanged(int))); @@ -148,7 +152,7 @@ void TaskProjGroup::projectionTypeChanged(int index) if(blockUpdate) return; - Gui::Command::openCommand("Update projection type"); + //Gui::Command::openCommand("Update projection type"); if(index == 0) { //layout per Page (Document) Gui::Command::doCommand(Gui::Command::Doc, @@ -165,7 +169,7 @@ void TaskProjGroup::projectionTypeChanged(int index) "App.activeDocument().%s.ProjectionType = '%s'", multiView->getNameInDocument(), "Third Angle"); } else { - Gui::Command::abortCommand(); + //Gui::Command::abortCommand(); Base::Console().Log("Error - TaskProjGroup::projectionTypeChanged - unknown projection layout: %d\n", index); return; @@ -174,8 +178,8 @@ void TaskProjGroup::projectionTypeChanged(int index) // Update checkboxes so checked state matches the drawing setupViewCheckboxes(); - Gui::Command::commitCommand(); - Gui::Command::updateActive(); + //Gui::Command::commitCommand(); + //Gui::Command::updateActive(); } void TaskProjGroup::scaleTypeChanged(int index) @@ -183,7 +187,7 @@ void TaskProjGroup::scaleTypeChanged(int index) if(blockUpdate) return; - Gui::Command::openCommand("Update projection scale type"); + //Gui::Command::openCommand("Update projection scale type"); if(index == 0) { //Automatic Scale Type Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.ScaleType = '%s'", multiView->getNameInDocument() @@ -197,12 +201,12 @@ void TaskProjGroup::scaleTypeChanged(int index) Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.ScaleType = '%s'", multiView->getNameInDocument() , "Custom"); } else { - Gui::Command::abortCommand(); + //Gui::Command::abortCommand(); Base::Console().Log("Error - TaskProjGroup::scaleTypeChanged - unknown scale type: %d\n",index); return; } - Gui::Command::commitCommand(); - Gui::Command::updateActive(); + //Gui::Command::commitCommand(); + //Gui::Command::updateActive(); } // ** David Eppstein / UC Irvine / 8 Aug 1993 @@ -256,43 +260,40 @@ void TaskProjGroup::setFractionalScale(double newScale) nearestFraction(newScale, num, den); - ui->scaleNum->setText(QString::number(num)); - ui->scaleDenom->setText(QString::number(den)); + ui->sbScaleNum->setValue(num); + ui->sbScaleDen->setValue(den); blockUpdate = false; } -void TaskProjGroup::scaleManuallyChanged(const QString & text) +void TaskProjGroup::scaleManuallyChanged(int i) { //TODO: See what this is about - shouldn't be simplifying the scale ratio while it's being edited... IR if(blockUpdate) return; - bool ok1, ok2; - - int a = ui->scaleNum->text().toInt(&ok1); - int b = ui->scaleDenom->text().toInt(&ok2); + int a = ui->sbScaleNum->value(); + int b = ui->sbScaleDen->value(); double scale = (double) a / (double) b; - if (ok1 && ok2) { - // If we were not in Custom, switch to Custom in two steps - bool switchToCustom = (strcmp(multiView->ScaleType.getValueAsString(), "Custom") != 0); - if(switchToCustom) { - // First, send out command to put us into custom scale - scaleTypeChanged(ui->cmbScaleType->findText(QString::fromLatin1("Custom"))); - switchToCustom = true; - } - - Gui::Command::openCommand("Update custom scale"); - Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.Scale = %f", multiView->getNameInDocument() - , scale); - Gui::Command::commitCommand(); - Gui::Command::updateActive(); - - if(switchToCustom) { - // Second, update the GUI - ui->cmbScaleType->setCurrentIndex(ui->cmbScaleType->findText(QString::fromLatin1("Custom"))); - } + // If we were not in Custom, switch to Custom in two steps + bool switchToCustom = (strcmp(multiView->ScaleType.getValueAsString(), "Custom") != 0); + if(switchToCustom) { + // First, send out command to put us into custom scale + scaleTypeChanged(ui->cmbScaleType->findText(QString::fromLatin1("Custom"))); + switchToCustom = true; } + + //Gui::Command::openCommand("Update custom scale"); + Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.Scale = %f", multiView->getNameInDocument() + , scale); + //Gui::Command::commitCommand(); + //Gui::Command::updateActive(); + + if(switchToCustom) { + // Second, update the GUI + ui->cmbScaleType->setCurrentIndex(ui->cmbScaleType->findText(QString::fromLatin1("Custom"))); + } + } void TaskProjGroup::changeEvent(QEvent *e) @@ -362,13 +363,49 @@ void TaskProjGroup::setupViewCheckboxes(bool addConnections) } } +bool TaskProjGroup::accept() +{ + Gui::Command::commitCommand(); + Gui::Command::updateActive(); + Gui::Command::doCommand(Gui::Command::Gui,"Gui.ActiveDocument.resetEdit()"); + + return true; +} + +bool TaskProjGroup::reject() +{ + if (getCreateMode()) { + std::string multiViewName = multiView->getNameInDocument(); + std::string PageName = multiView->findParentPage()->getNameInDocument(); + + Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().%s.purgeProjections()", + multiViewName.c_str()); + Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().%s.removeView(App.activeDocument().%s)", + PageName.c_str(),multiViewName.c_str()); + Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().removeObject('%s')",multiViewName.c_str()); + Gui::Command::doCommand(Gui::Command::Gui,"Gui.ActiveDocument.resetEdit()"); + } else { + if (Gui::Command::hasPendingCommand()) { + std::vector undos = Gui::Application::Instance->activeDocument()->getUndoVector(); + Gui::Application::Instance->activeDocument()->undo(1); + multiView->rebuildViewList(); + } else { + Base::Console().Log("TaskProjGroup: Edit mode - NO command is active\n"); + } + + Gui::Command::updateActive(); + Gui::Command::doCommand(Gui::Command::Gui,"Gui.ActiveDocument.resetEdit()"); + } + return false; +} + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TODO: Do we really need to hang on to the TaskDlgProjGroup in this class? IR -TaskDlgProjGroup::TaskDlgProjGroup(TechDraw::DrawProjGroup* featView) : TaskDialog(), +TaskDlgProjGroup::TaskDlgProjGroup(TechDraw::DrawProjGroup* featView, bool mode) : TaskDialog(), multiView(featView) { - viewProvider = dynamic_cast(featView); - widget = new TaskProjGroup(featView); + //viewProvider = dynamic_cast(featView); + widget = new TaskProjGroup(featView,mode); taskbox = new Gui::TaskView::TaskBox(Gui::BitmapFactory().pixmap("actions/techdraw-projgroup"), widget->windowTitle(), true, 0); taskbox->groupLayout()->addWidget(widget); @@ -384,9 +421,17 @@ void TaskDlgProjGroup::update() widget->updateTask(); } +void TaskDlgProjGroup::setCreateMode(bool b) +{ + widget->setCreateMode(b); +} + //==== calls from the TaskView =============================================================== void TaskDlgProjGroup::open() { + if (!widget->getCreateMode()) { //this is an edit session, start a transaction + Gui::Command::openCommand("Edit Projection Group"); + } } void TaskDlgProjGroup::clicked(int) @@ -395,11 +440,13 @@ void TaskDlgProjGroup::clicked(int) bool TaskDlgProjGroup::accept() { - return true;//!widget->user_input(); + widget->accept(); + return true; } bool TaskDlgProjGroup::reject() { + widget->reject(); return true; } diff --git a/src/Mod/TechDraw/Gui/TaskProjGroup.h b/src/Mod/TechDraw/Gui/TaskProjGroup.h index fca0c220e..1dffa3063 100644 --- a/src/Mod/TechDraw/Gui/TaskProjGroup.h +++ b/src/Mod/TechDraw/Gui/TaskProjGroup.h @@ -31,6 +31,7 @@ #include #include +#include class Ui_TaskProjGroup; @@ -48,14 +49,18 @@ class TaskProjGroup : public QWidget Q_OBJECT public: - TaskProjGroup(TechDraw::DrawProjGroup* featView); + TaskProjGroup(TechDraw::DrawProjGroup* featView, bool mode); ~TaskProjGroup(); public: + virtual bool accept(); + virtual bool reject(); void updateTask(); void nearestFraction(double val, int &a, int &b) const; /// Sets the numerator and denominator widgets to match newScale void setFractionalScale(double newScale); + void setCreateMode(bool b) { m_createMode = b;} + bool getCreateMode() { return m_createMode; } protected Q_SLOTS: void viewToggled(bool toggle); @@ -65,7 +70,7 @@ protected Q_SLOTS: void projectionTypeChanged(int index); void scaleTypeChanged(int index); - void scaleManuallyChanged(const QString & text); + void scaleManuallyChanged(int i); protected: void changeEvent(QEvent *e); @@ -87,6 +92,7 @@ private: protected: ViewProviderProjGroup *viewProvider; TechDraw::DrawProjGroup* multiView; + bool m_createMode; }; /// Simulation dialog for the TaskView @@ -95,7 +101,7 @@ class TaskDlgProjGroup : public Gui::TaskView::TaskDialog Q_OBJECT public: - TaskDlgProjGroup(TechDraw::DrawProjGroup* featView); + TaskDlgProjGroup(TechDraw::DrawProjGroup* featView,bool mode); ~TaskDlgProjGroup(); const ViewProviderProjGroup * getViewProvider() const { return viewProvider; } @@ -113,6 +119,7 @@ public: virtual void helpRequested() { return;} virtual bool isAllowedAlterDocument(void) const { return false; } + void setCreateMode(bool b); void update(); diff --git a/src/Mod/TechDraw/Gui/TaskProjGroup.ui b/src/Mod/TechDraw/Gui/TaskProjGroup.ui index a9b023b4a..3675144d9 100644 --- a/src/Mod/TechDraw/Gui/TaskProjGroup.ui +++ b/src/Mod/TechDraw/Gui/TaskProjGroup.ui @@ -110,7 +110,7 @@ - + @@ -132,12 +132,9 @@ - - - - 0 - 0 - + + + 1 @@ -149,7 +146,11 @@ - + + + 1 + + diff --git a/src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp b/src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp index d459ddbd3..4edd5f960 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderProjGroup.cpp @@ -127,16 +127,19 @@ bool ViewProviderProjGroup::setEdit(int ModNum) Gui::Selection().clearSelection(); // start the edit dialog - if (projDlg) + if (projDlg) { + projDlg->setCreateMode(false); Gui::Control().showDialog(projDlg); - else - Gui::Control().showDialog(new TaskDlgProjGroup(getObject())); + } else { + Gui::Control().showDialog(new TaskDlgProjGroup(getObject(),false)); + } return true; } void ViewProviderProjGroup::unsetEdit(int ModNum) { + Base::Console().Message("TRACE - VPPG::unSetEdit(%d) \n",ModNum); Gui::Control().closeDialog(); } From 4e729f084016280d7821ec4b72f0ae37b73607f9 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Mon, 12 Sep 2016 07:41:24 -0400 Subject: [PATCH 12/12] Changes re comments on PR279 --- src/Mod/TechDraw/App/DrawPage.cpp | 2 +- src/Mod/TechDraw/App/DrawPagePyImp.cpp | 14 ++++---------- src/Mod/TechDraw/App/DrawViewCollection.cpp | 3 +-- src/Mod/TechDraw/App/DrawViewCollectionPyImp.cpp | 8 ++++---- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawPage.cpp b/src/Mod/TechDraw/App/DrawPage.cpp index 2ea5bb822..a9010ab73 100644 --- a/src/Mod/TechDraw/App/DrawPage.cpp +++ b/src/Mod/TechDraw/App/DrawPage.cpp @@ -237,9 +237,9 @@ int DrawPage::addView(App::DocumentObject *docObj) { if(!docObj->isDerivedFrom(TechDraw::DrawView::getClassTypeId())) return -1; + DrawView* view = static_cast(docObj); //position all new views in center of Page (exceptDVDimension) - DrawView* view = static_cast(docObj); if (!docObj->isDerivedFrom(TechDraw::DrawViewDimension::getClassTypeId())) { view->X.setValue(getPageWidth()/2.0); view->Y.setValue(getPageHeight()/2.0); diff --git a/src/Mod/TechDraw/App/DrawPagePyImp.cpp b/src/Mod/TechDraw/App/DrawPagePyImp.cpp index daaaaac5b..a85b1fc6c 100644 --- a/src/Mod/TechDraw/App/DrawPagePyImp.cpp +++ b/src/Mod/TechDraw/App/DrawPagePyImp.cpp @@ -27,11 +27,8 @@ PyObject* DrawPagePy::addView(PyObject* args) PyObject *pcDocObj; if (!PyArg_ParseTuple(args, "O!", &(App::DocumentObjectPy::Type), &pcDocObj)) { - Base::Console().Error("Error: DrawPagePy::addView - Bad Arg - not DocumentObject\n"); - return NULL; - //TODO: sb PyErr?? - //PyErr_SetString(PyExc_TypeError,"addView expects a DrawView"); - //return -1; + PyErr_SetString(PyExc_TypeError, "DrawPagePy::AddView - Bad Arg - not DocumentObject"); + return nullptr; } DrawPage* page = getDrawPagePtr(); //get DrawPage for pyPage @@ -52,11 +49,8 @@ PyObject* DrawPagePy::removeView(PyObject* args) PyObject *pcDocObj; if (!PyArg_ParseTuple(args, "O!", &(App::DocumentObjectPy::Type), &pcDocObj)) { - Base::Console().Error("Error: DrawPagePy::removeView - Bad Arg - not DocumentObject\n"); - return NULL; - //TODO: sb PyErr?? - //PyErr_SetString(PyExc_TypeError,"removeView expects a DrawView"); - //return -1; + PyErr_SetString(PyExc_TypeError, "DrawPagePy::removeView - Bad Arg - not DocumentObject"); + return nullptr; } DrawPage* page = getDrawPagePtr(); //get DrawPage for pyPage diff --git a/src/Mod/TechDraw/App/DrawViewCollection.cpp b/src/Mod/TechDraw/App/DrawViewCollection.cpp index acb29de81..4c0de80e3 100644 --- a/src/Mod/TechDraw/App/DrawViewCollection.cpp +++ b/src/Mod/TechDraw/App/DrawViewCollection.cpp @@ -135,8 +135,7 @@ int DrawViewCollection::countChildren() const std::vector &views = Views.getValues(); for(std::vector::const_iterator it = views.begin(); it != views.end(); ++it) { - App::DocumentObject *docObj = static_cast(*it); - if(docObj->getTypeId().isDerivedFrom(TechDraw::DrawViewCollection::getClassTypeId())) { + if((*it)->getTypeId().isDerivedFrom(TechDraw::DrawViewCollection::getClassTypeId())) { TechDraw::DrawViewCollection *viewCollection = static_cast(*it); numChildren += viewCollection->countChildren() + 1; } else { diff --git a/src/Mod/TechDraw/App/DrawViewCollectionPyImp.cpp b/src/Mod/TechDraw/App/DrawViewCollectionPyImp.cpp index 1fe97d292..6c2780206 100644 --- a/src/Mod/TechDraw/App/DrawViewCollectionPyImp.cpp +++ b/src/Mod/TechDraw/App/DrawViewCollectionPyImp.cpp @@ -19,8 +19,8 @@ PyObject* DrawViewCollectionPy::addView(PyObject* args) PyObject *pcDocObj; if (!PyArg_ParseTuple(args, "O!", &(App::DocumentObjectPy::Type), &pcDocObj)) { - Base::Console().Error("Error: DrawViewClipPy::addView - Bad Arg - not DocumentObject\n"); - return NULL; + PyErr_SetString(PyExc_TypeError, "DrawViewCollectionPy::addView - Bad Arg - not DocumentObject"); + return nullptr; } DrawViewCollection* collect = getDrawViewCollectionPtr(); @@ -37,8 +37,8 @@ PyObject* DrawViewCollectionPy::removeView(PyObject* args) PyObject *pcDocObj; if (!PyArg_ParseTuple(args, "O!", &(App::DocumentObjectPy::Type), &pcDocObj)) { - Base::Console().Error("Error: DrawViewClipPy::addView - Bad Arg - not DocumentObject\n"); - return NULL; + PyErr_SetString(PyExc_TypeError, "DrawViewCollectionPy::removeView - Bad Arg - not DocumentObject"); + return nullptr; } DrawViewCollection* collect = getDrawViewCollectionPtr();