From 292f7450eb5e67eee4bf45f3786f38e6c4dd4e5a Mon Sep 17 00:00:00 2001 From: logari81 Date: Sun, 1 Jan 2012 20:01:43 +0000 Subject: [PATCH] + add GUI command for addExternal in the Sketcher git-svn-id: https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk@5377 e8eeb9e2-ec13-0410-a4a9-efa5cf37419d --- src/Mod/Complete/Gui/Workbench.cpp | 2 + src/Mod/PartDesign/Gui/Workbench.cpp | 2 + src/Mod/Sketcher/Gui/CommandCreateGeo.cpp | 165 ++++++++++++++++++++ src/Mod/Sketcher/Gui/DrawSketchHandler.h | 2 + src/Mod/Sketcher/Gui/Resources/Makefile.am | 5 +- src/Mod/Sketcher/Gui/Resources/Sketcher.qrc | 1 + src/Mod/Sketcher/Gui/ViewProviderSketch.cpp | 22 ++- src/Mod/Sketcher/Gui/Workbench.cpp | 2 + 8 files changed, 196 insertions(+), 5 deletions(-) diff --git a/src/Mod/Complete/Gui/Workbench.cpp b/src/Mod/Complete/Gui/Workbench.cpp index 245594a25..d069a7a57 100644 --- a/src/Mod/Complete/Gui/Workbench.cpp +++ b/src/Mod/Complete/Gui/Workbench.cpp @@ -260,6 +260,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const << "Sketcher_CreateRectangle" << "Sketcher_CreateFillet" << "Sketcher_Trimming" + << "Sketcher_External" << "Sketcher_ToggleConstruction" << "Separator" << "Sketcher_ConstrainLock" @@ -487,6 +488,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const << "Sketcher_CreateRectangle" << "Sketcher_CreateFillet" << "Sketcher_Trimming" + << "Sketcher_External" << "Sketcher_ToggleConstruction" << "Separator" << "Sketcher_ConstrainLock" diff --git a/src/Mod/PartDesign/Gui/Workbench.cpp b/src/Mod/PartDesign/Gui/Workbench.cpp index 7e3bc7708..50f9f9adf 100644 --- a/src/Mod/PartDesign/Gui/Workbench.cpp +++ b/src/Mod/PartDesign/Gui/Workbench.cpp @@ -132,6 +132,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const << "Sketcher_CreateRectangle" << "Sketcher_CreateFillet" << "Sketcher_Trimming" + << "Sketcher_External" << "Sketcher_ToggleConstruction" /*<< "Sketcher_CreateText"*/ /*<< "Sketcher_CreateDraftLine"*/; @@ -198,6 +199,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const << "Sketcher_CreateRectangle" << "Sketcher_CreateFillet" << "Sketcher_Trimming" + << "Sketcher_External" << "Sketcher_ToggleConstruction" /*<< "Sketcher_CreateText"*/ /*<< "Sketcher_CreateDraftLine"*/; diff --git a/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp b/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp index 414e7aff3..89685e99a 100644 --- a/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp +++ b/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp @@ -39,6 +39,10 @@ #include "ViewProviderSketch.h" #include "DrawSketchHandler.h" +#include +#include +#include + using namespace std; using namespace SketcherGui; @@ -1530,6 +1534,166 @@ bool CmdSketcherTrimming::isActive(void) return isCreateGeoActive(getActiveGuiDocument()); } +// ====================================================================================== + +namespace SketcherGui { + class ExternalSelection : public Gui::SelectionFilterGate + { + App::DocumentObject* object; + public: + ExternalSelection(App::DocumentObject* obj) + : Gui::SelectionFilterGate((Gui::SelectionFilter*)0), object(obj) + {} + + bool allow(App::Document *pDoc, App::DocumentObject *pObj, const char *sSubName) + { + Sketcher::SketchObject *sketch = static_cast(object); + App::DocumentObject *support = sketch->Support.getValue(); + // for the moment we allow external constraints only from the support + if (pObj != support) + return false; + if (!sSubName || sSubName[0] == '\0') + return false; + std::string element(sSubName); + // for the moment we allow only edges + if (element.substr(0,4) == "Edge") { + return true; + } + return false; + } + }; +}; + +/* XPM */ +static const char *cursor_external[]={ +"32 32 3 1", +"+ c white", +"* c red", +". c None", +"......+.........................", +"......+.........................", +"......+.........................", +"......+.........................", +"......+.........................", +"................................", +"+++++...+++++...................", +"................................", +"......+.........................", +"......+.........................", +"......+.........................", +"......+.........................", +"......+....***************......", +".........**...............***...", +"........**................***...", +".......**................**.*...", +"......*.................*...*...", +"....**................**....*...", +"...**................**.....*...", +"..**................**......*...", +"..******************........*...", +"..*................*........*...", +"..*................*........*...", +"..*................*........*...", +"..*................*............", +"..*................*............", +"..*................*............", +"..*................*............", +"..*................*............", +"..*................*............", +"................................", +"................................"}; + +class DrawSketchHandlerExternal: public DrawSketchHandler +{ +public: + DrawSketchHandlerExternal() {} + virtual ~DrawSketchHandlerExternal() + { + Gui::Selection().rmvSelectionGate(); + } + + virtual void activated(ViewProviderSketch *sketchgui) + { + Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView(); + Gui::View3DInventorViewer *viewer; + viewer = static_cast(mdi)->getViewer(); + + SoNode* root = viewer->getSceneGraph(); + static_cast(root)->selectionRole.setValue(TRUE); + + Gui::Selection().clearSelection(); + Gui::Selection().rmvSelectionGate(); + Gui::Selection().addSelectionGate(new ExternalSelection(sketchgui->getObject())); + setCursor(QPixmap(cursor_external),7,7); + } + + virtual void mouseMove(Base::Vector2D onSketchPos) + { + applyCursor(); + } + + virtual bool pressButton(Base::Vector2D onSketchPos) + { + return true; + } + + virtual bool releaseButton(Base::Vector2D onSketchPos) + { + sketchgui->purgeHandler(); // no code after this line, Handler get deleted in ViewProvider + return true; + } + + virtual bool onSelectionChanged(const Gui::SelectionChanges& msg) + { + if (msg.Type == Gui::SelectionChanges::AddSelection) { + std::string subName(msg.pSubName); + if (subName.size() > 4 && subName.substr(0,4) == "Edge") { + try { + Gui::Command::openCommand("Add external geometry"); + Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.addExternal(\"%s\",\"%s\")", + sketchgui->getObject()->getNameInDocument(), + msg.pObjectName, msg.pSubName); + Gui::Command::commitCommand(); + Gui::Command::updateActive(); + Gui::Selection().clearSelection(); + sketchgui->purgeHandler(); // no code after this line, Handler get deleted in ViewProvider + } + catch (const Base::Exception& e) { + Base::Console().Error("%s\n", e.what()); + } + return true; + } + } + return false; + } +}; + +DEF_STD_CMD_A(CmdSketcherExternal); + +CmdSketcherExternal::CmdSketcherExternal() + : Command("Sketcher_External") +{ + sAppModule = "Sketcher"; + sGroup = QT_TR_NOOP("Sketcher"); + sMenuText = QT_TR_NOOP("External geometry"); + sToolTipText = QT_TR_NOOP("Create an edge linked to an external geometry"); + sWhatsThis = sToolTipText; + sStatusTip = sToolTipText; + sPixmap = "Sketcher_External"; + sAccel = "E"; + eType = ForEdit; +} + +void CmdSketcherExternal::activated(int iMsg) +{ + ActivateHandler(getActiveGuiDocument(), new DrawSketchHandlerExternal()); +} + +bool CmdSketcherExternal::isActive(void) +{ + return isCreateGeoActive(getActiveGuiDocument()); +} + void CreateSketcherCommandsCreateGeo(void) { @@ -1545,4 +1709,5 @@ void CreateSketcherCommandsCreateGeo(void) //rcCmdMgr.addCommand(new CmdSketcherCreateText()); //rcCmdMgr.addCommand(new CmdSketcherCreateDraftLine()); rcCmdMgr.addCommand(new CmdSketcherTrimming()); + rcCmdMgr.addCommand(new CmdSketcherExternal()); } diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandler.h b/src/Mod/Sketcher/Gui/DrawSketchHandler.h index 5d58889d0..f5ccfa975 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandler.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandler.h @@ -26,6 +26,7 @@ #include #include +#include class QPixmap; @@ -70,6 +71,7 @@ public: virtual void mouseMove(Base::Vector2D onSketchPos)=0; virtual bool pressButton(Base::Vector2D onSketchPos)=0; virtual bool releaseButton(Base::Vector2D onSketchPos)=0; + virtual bool onSelectionChanged(const Gui::SelectionChanges& msg) { return false; }; virtual void quit(void); diff --git a/src/Mod/Sketcher/Gui/Resources/Makefile.am b/src/Mod/Sketcher/Gui/Resources/Makefile.am index e6dab8b7c..9f2fcbe47 100644 --- a/src/Mod/Sketcher/Gui/Resources/Makefile.am +++ b/src/Mod/Sketcher/Gui/Resources/Makefile.am @@ -1,10 +1,10 @@ noinst_LTLIBRARIES=libResources.la BUILT_SOURCES=\ - qrc_Sketcher.cpp + qrc_Sketcher.cpp nodist_libResources_la_SOURCES=\ - qrc_Sketcher.cpp + qrc_Sketcher.cpp EXTRA_DIST = \ icons/Constraint_PointOnObject.svg \ @@ -70,6 +70,7 @@ icons/Constraint_PointOnObject.svg \ icons/Sketcher_CreateText.svg \ icons/Sketcher_DraftLine.svg \ icons/Sketcher_Trimming.svg \ + icons/Sketcher_External.svg \ icons/Sketcher_LeaveSketch.svg \ icons/Sketcher_NewSketch.svg \ icons/Sketcher_Sketch.svg \ diff --git a/src/Mod/Sketcher/Gui/Resources/Sketcher.qrc b/src/Mod/Sketcher/Gui/Resources/Sketcher.qrc index 0fa4d69c2..8a3fe9324 100644 --- a/src/Mod/Sketcher/Gui/Resources/Sketcher.qrc +++ b/src/Mod/Sketcher/Gui/Resources/Sketcher.qrc @@ -60,6 +60,7 @@ icons/Sketcher_CreateText.svg icons/Sketcher_DraftLine.svg icons/Sketcher_Trimming.svg + icons/Sketcher_External.svg icons/Sketcher_LeaveSketch.svg icons/Sketcher_NewSketch.svg icons/Sketcher_Sketch.svg diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index 60c5f403b..8699b4a1d 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -251,9 +251,18 @@ void ViewProviderSketch::purgeHandler(void) { assert(edit); assert(edit->sketchHandler != 0); + edit->sketchHandler->unsetCursor(); delete(edit->sketchHandler); edit->sketchHandler = 0; Mode = STATUS_NONE; + + // ensure that we are in sketch only selection mode + Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView(); + Gui::View3DInventorViewer *viewer; + viewer = static_cast(mdi)->getViewer(); + + SoNode* root = viewer->getSceneGraph(); + static_cast(root)->selectionRole.setValue(FALSE); } // ********************************************************************************** @@ -609,6 +618,7 @@ bool ViewProviderSketch::mouseButtonPressed(int Button, bool pressed, const SbVe << "Sketcher_CreateRectangle" << "Sketcher_CreateFillet" << "Sketcher_Trimming" + << "Sketcher_External" << "Sketcher_ToggleConstruction" /*<< "Sketcher_CreateText"*/ /*<< "Sketcher_CreateDraftLine"*/; @@ -1043,6 +1053,13 @@ void ViewProviderSketch::onSelectionChanged(const Gui::SelectionChanges& msg) { // are we in edit? if (edit) { + bool handled=false; + if (Mode == STATUS_SKETCH_UseHandler) { + handled = edit->sketchHandler->onSelectionChanged(msg); + } + if (handled) + return; + std::string temp; if (msg.Type == Gui::SelectionChanges::ClrSelection) { // if something selected in this object? @@ -2894,10 +2911,9 @@ void ViewProviderSketch::unsetEdit(int ModNum) edit->EditRoot->removeAllChildren(); pcRoot->removeChild(edit->EditRoot); - if (edit->sketchHandler) { - edit->sketchHandler->unsetCursor(); + if (edit->sketchHandler) purgeHandler(); - } + delete edit; edit = 0; diff --git a/src/Mod/Sketcher/Gui/Workbench.cpp b/src/Mod/Sketcher/Gui/Workbench.cpp index ccf5cbb0d..c196d63ce 100644 --- a/src/Mod/Sketcher/Gui/Workbench.cpp +++ b/src/Mod/Sketcher/Gui/Workbench.cpp @@ -68,6 +68,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const << "Sketcher_CreateRectangle" << "Sketcher_CreateFillet" << "Sketcher_Trimming" + << "Sketcher_External" << "Sketcher_ToggleConstruction" /*<< "Sketcher_CreateText"*/ /*<< "Sketcher_CreateDraftLine"*/; @@ -119,6 +120,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const << "Sketcher_CreateRectangle" << "Sketcher_CreateFillet" << "Sketcher_Trimming" + << "Sketcher_External" << "Sketcher_ToggleConstruction" /*<< "Sketcher_CreateText"*/ /*<< "Sketcher_CreateDraftLine"*/;