From bf0d8d68bbb90018652f7c845fc16cb6d51df8f3 Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 13 Nov 2015 13:38:24 +0100 Subject: [PATCH] + Add selected sketches to one Face, implement specialized view provider for Face --- src/Mod/Part/App/FeatureFace.h | 4 + src/Mod/Part/Gui/AppPartGui.cpp | 1 + src/Mod/Part/Gui/Command.cpp | 27 +++-- .../Part/Gui/ViewProviderPlaneParametric.cpp | 99 ++++++++++++++----- .../Part/Gui/ViewProviderPlaneParametric.h | 19 +++- 5 files changed, 118 insertions(+), 32 deletions(-) diff --git a/src/Mod/Part/App/FeatureFace.h b/src/Mod/Part/App/FeatureFace.h index 04e3fe8ba..29e96c1fa 100644 --- a/src/Mod/Part/App/FeatureFace.h +++ b/src/Mod/Part/App/FeatureFace.h @@ -43,6 +43,10 @@ public: /// recalculate the feature App::DocumentObjectExecReturn *execute(void); short mustExecute() const; + /// returns the type name of the ViewProvider + const char* getViewProviderName(void) const { + return "PartGui::ViewProviderFace"; + } //@} protected: diff --git a/src/Mod/Part/Gui/AppPartGui.cpp b/src/Mod/Part/Gui/AppPartGui.cpp index 71f99783c..2aa6c2535 100644 --- a/src/Mod/Part/Gui/AppPartGui.cpp +++ b/src/Mod/Part/Gui/AppPartGui.cpp @@ -145,6 +145,7 @@ void PartGuiExport initPartGui() PartGui::ViewProviderConeParametric ::init(); PartGui::ViewProviderTorusParametric ::init(); PartGui::ViewProviderRuledSurface ::init(); + PartGui::ViewProviderFace ::init(); PartGui::DimensionLinear ::initClass(); PartGui::DimensionAngular ::initClass(); PartGui::ArcEngine ::initClass(); diff --git a/src/Mod/Part/Gui/Command.cpp b/src/Mod/Part/Gui/Command.cpp index a968ec83c..8733ff4dd 100644 --- a/src/Mod/Part/Gui/Command.cpp +++ b/src/Mod/Part/Gui/Command.cpp @@ -1034,7 +1034,7 @@ CmdPartMakeFace::CmdPartMakeFace() sAppModule = "Part"; sGroup = QT_TR_NOOP("Part"); sMenuText = QT_TR_NOOP("Make face from sketch"); - sToolTipText = QT_TR_NOOP("Make face from a selected sketch"); + sToolTipText = QT_TR_NOOP("Make face from selected sketches"); sWhatsThis = "Part_MakeFace"; sStatusTip = sToolTipText; } @@ -1043,16 +1043,27 @@ void CmdPartMakeFace::activated(int iMsg) { std::vector sketches = Gui::Selection().getObjectsOfType(); openCommand("Make face"); - for (std::vector::iterator it = sketches.begin(); it != sketches.end(); ++it) { - App::DocumentObjectT obj(*it); + + try { + App::DocumentT doc(sketches.front()->getDocument()); std::stringstream str; - str << obj.getDocumentPython() - << ".addObject(\"Part::Face\", \"Face\").Sources = " - << obj.getObjectPython(); + str << doc.getDocumentPython() + << ".addObject(\"Part::Face\", \"Face\").Sources = ("; + for (std::vector::iterator it = sketches.begin(); it != sketches.end(); ++it) { + App::DocumentObjectT obj(*it); + str << obj.getObjectPython() << ", "; + } + + str << ")"; + doCommand(Doc,str.str().c_str()); + commitCommand(); + updateActive(); + } + catch (...) { + abortCommand(); + throw; } - commitCommand(); - updateActive(); } bool CmdPartMakeFace::isActive(void) diff --git a/src/Mod/Part/Gui/ViewProviderPlaneParametric.cpp b/src/Mod/Part/Gui/ViewProviderPlaneParametric.cpp index eb40b8189..04d2503b9 100644 --- a/src/Mod/Part/Gui/ViewProviderPlaneParametric.cpp +++ b/src/Mod/Part/Gui/ViewProviderPlaneParametric.cpp @@ -26,18 +26,11 @@ #ifndef _PreComp_ #endif -/// Here the FreeCAD includes sorted by Base,App,Gui...... -#include - +#include +#include #include "ViewProviderPlaneParametric.h" - -//#include "Tree.h" - - - using namespace PartGui; -using namespace std; //************************************************************************** @@ -45,10 +38,10 @@ using namespace std; PROPERTY_SOURCE(PartGui::ViewProviderPlaneParametric, PartGui::ViewProviderPart) - + ViewProviderPlaneParametric::ViewProviderPlaneParametric() { - sPixmap = "Tree_Part_Plane_Parametric.svg"; + sPixmap = "Tree_Part_Plane_Parametric.svg"; } ViewProviderPlaneParametric::~ViewProviderPlaneParametric() @@ -56,20 +49,80 @@ ViewProviderPlaneParametric::~ViewProviderPlaneParametric() } - - -// ********************************************************************************** - std::vector ViewProviderPlaneParametric::getDisplayModes(void) const { - // get the modes of the father - std::vector StrList; + // get the modes of the father + std::vector StrList; - // add your own modes - StrList.push_back("Flat Lines"); - StrList.push_back("Shaded"); - StrList.push_back("Wireframe"); - StrList.push_back("Points"); + // add your own modes + StrList.push_back("Flat Lines"); + StrList.push_back("Shaded"); + StrList.push_back("Wireframe"); + StrList.push_back("Points"); - return StrList; + return StrList; +} + +// ---------------------------------------------------------------------------- + +PROPERTY_SOURCE(PartGui::ViewProviderFace, PartGui::ViewProviderPlaneParametric) + + +ViewProviderFace::ViewProviderFace() +{ +} + +ViewProviderFace::~ViewProviderFace() +{ +} + +std::vector ViewProviderFace::claimChildren(void) const +{ + return std::vector(static_cast(getObject())->Sources.getValues()); +} + +bool ViewProviderFace::canDragObjects() const +{ + return true; +} + +bool ViewProviderFace::canDragObject(App::DocumentObject* obj) const +{ + if (!obj) + return false; + if (obj->getTypeId().isDerivedFrom(Part::Part2DObject::getClassTypeId())) + return true; + else + return false; +} + +void ViewProviderFace::dragObject(App::DocumentObject* obj) +{ + Part::Face* face = static_cast(getObject()); + std::vector sources = face->Sources.getValues(); + for (std::vector::iterator it = sources.begin(); it != sources.end(); ++it) { + if (*it == obj) { + sources.erase(it); + face->Sources.setValues(sources); + break; + } + } +} + +bool ViewProviderFace::canDropObjects() const +{ + return true; +} + +bool ViewProviderFace::canDropObject(App::DocumentObject* obj) const +{ + return canDragObject(obj); +} + +void ViewProviderFace::dropObject(App::DocumentObject* obj) +{ + Part::Face* face = static_cast(getObject()); + std::vector sources = face->Sources.getValues(); + sources.push_back(obj); + face->Sources.setValues(sources); } diff --git a/src/Mod/Part/Gui/ViewProviderPlaneParametric.h b/src/Mod/Part/Gui/ViewProviderPlaneParametric.h index eba2a4738..00f946400 100644 --- a/src/Mod/Part/Gui/ViewProviderPlaneParametric.h +++ b/src/Mod/Part/Gui/ViewProviderPlaneParametric.h @@ -36,7 +36,7 @@ class SoTransform; namespace PartGui { -class PartGuiExport ViewProviderPlaneParametric:public ViewProviderPart +class PartGuiExport ViewProviderPlaneParametric : public ViewProviderPart { PROPERTY_HEADER(PartGui::ViewProviderPlaneParametric); @@ -52,6 +52,23 @@ protected: }; +class PartGuiExport ViewProviderFace : public ViewProviderPlaneParametric +{ + PROPERTY_HEADER(PartGui::ViewProviderFace); + +public: + ViewProviderFace(); + virtual ~ViewProviderFace(); + + virtual std::vector claimChildren(void) const; + virtual bool canDragObjects() const; + virtual bool canDragObject(App::DocumentObject*) const; + virtual void dragObject(App::DocumentObject*); + virtual bool canDropObjects() const; + virtual bool canDropObject(App::DocumentObject*) const; + virtual void dropObject(App::DocumentObject*); +}; + } // namespace PartGui