From cd9e827d249e13d464b6eaabd2ac653c82b059bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Sun, 15 Nov 2015 10:54:44 +0100 Subject: [PATCH] FEM Post: Add cut filter --- src/Mod/Fem/App/AppFem.cpp | 1 + src/Mod/Fem/App/AppFem.cpp.orig | 6 +- src/Mod/Fem/App/FemPostFilter.cpp | 40 +++- src/Mod/Fem/App/FemPostFilter.h | 22 +++ src/Mod/Fem/Gui/AppFemGui.cpp | 1 + src/Mod/Fem/Gui/CMakeLists.txt | 2 + src/Mod/Fem/Gui/Command.cpp | 122 ++++++------ src/Mod/Fem/Gui/Command.cpp.orig | 173 ++++++++++------- src/Mod/Fem/Gui/TaskPostBoxes.cpp | 102 ++++++++++ src/Mod/Fem/Gui/TaskPostBoxes.h | 26 +++ src/Mod/Fem/Gui/TaskPostCut.ui | 67 +++++++ src/Mod/Fem/Gui/TaskPostWarpVector.ui | 183 ++++++++++++++++++ src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp | 21 ++ src/Mod/Fem/Gui/ViewProviderFemPostFilter.h | 13 ++ src/Mod/Fem/Gui/Workbench.cpp | 1 + 15 files changed, 643 insertions(+), 137 deletions(-) create mode 100644 src/Mod/Fem/Gui/TaskPostCut.ui create mode 100644 src/Mod/Fem/Gui/TaskPostWarpVector.ui diff --git a/src/Mod/Fem/App/AppFem.cpp b/src/Mod/Fem/App/AppFem.cpp index 50e91fa94..c94061ed6 100644 --- a/src/Mod/Fem/App/AppFem.cpp +++ b/src/Mod/Fem/App/AppFem.cpp @@ -158,6 +158,7 @@ PyMODINIT_FUNC initFem() Fem::FemPostClipFilter ::init(); Fem::FemPostScalarClipFilter ::init(); Fem::FemPostWarpVectorFilter ::init(); + Fem::FemPostCutFilter ::init(); Fem::FemPostFunction ::init(); Fem::FemPostFunctionProvider ::init(); Fem::FemPostPlaneFunction ::init(); diff --git a/src/Mod/Fem/App/AppFem.cpp.orig b/src/Mod/Fem/App/AppFem.cpp.orig index 605196ca0..c24fb7839 100644 --- a/src/Mod/Fem/App/AppFem.cpp.orig +++ b/src/Mod/Fem/App/AppFem.cpp.orig @@ -1,4 +1,4 @@ -<<<<<<< c8cde18ac8aa317da00f6668e9a156fcbe0b2975 +<<<<<<< 559b38429c3ec5bcad9eced553e5d7ca544cb55e /*************************************************************************** * Copyright (c) 2008 Jürgen Riegel (juergen.riegel@web.de) * * * @@ -158,6 +158,7 @@ PyMODINIT_FUNC initFem() Fem::FemPostFilter ::init(); Fem::FemPostClipFilter ::init(); Fem::FemPostScalarClipFilter ::init(); + Fem::FemPostWarpVectorFilter ::init(); Fem::FemPostFunction ::init(); Fem::FemPostFunctionProvider ::init(); Fem::FemPostPlaneFunction ::init(); @@ -325,10 +326,11 @@ PyMODINIT_FUNC initFem() Fem::FemPostClipFilter ::init(); Fem::FemPostScalarClipFilter ::init(); Fem::FemPostWarpVectorFilter ::init(); + Fem::FemPostCutFilter ::init(); Fem::FemPostFunction ::init(); Fem::FemPostFunctionProvider ::init(); Fem::FemPostPlaneFunction ::init(); Fem::FemPostSphereFunction ::init(); #endif } ->>>>>>> Add warp vector filter +>>>>>>> Add cut filter diff --git a/src/Mod/Fem/App/FemPostFilter.cpp b/src/Mod/Fem/App/FemPostFilter.cpp index 7c621fda9..99e660253 100644 --- a/src/Mod/Fem/App/FemPostFilter.cpp +++ b/src/Mod/Fem/App/FemPostFilter.cpp @@ -345,8 +345,8 @@ PROPERTY_SOURCE(Fem::FemPostWarpVectorFilter, Fem::FemPostFilter) FemPostWarpVectorFilter::FemPostWarpVectorFilter(void): FemPostFilter() { - ADD_PROPERTY_TYPE(Factor, (0), "Warp", App::Prop_None, "The scalar value used to clip the selected field"); - ADD_PROPERTY_TYPE(Vector, (long(0)), "Warp", App::Prop_None, "The field used to clip"); + ADD_PROPERTY_TYPE(Factor, (0), "Warp", App::Prop_None, "The factor by which the vector is added to the node positions"); + ADD_PROPERTY_TYPE(Vector, (long(0)), "Warp", App::Prop_None, "The field added to the node position"); polyDataSource = vtkGeometryFilter::New(); @@ -420,4 +420,38 @@ void FemPostWarpVectorFilter::onChanged(const Property* prop) { } Fem::FemPostFilter::onChanged(prop); -} \ No newline at end of file +} + + +PROPERTY_SOURCE(Fem::FemPostCutFilter, Fem::FemPostFilter) + +FemPostCutFilter::FemPostCutFilter(void) : FemPostFilter() { + + ADD_PROPERTY_TYPE(Function, (0), "Cut", App::Prop_None, "The function object which defines the clip cut function"); + + polyDataSource = vtkGeometryFilter::New(); + + FilterPipeline clip; + m_cutter = vtkCutter::New(); + clip.source = m_cutter; + clip.target = m_cutter; + clip.visualisation = m_cutter; + addFilterPipeline(clip, "cut"); + setActiveFilterPipeline("cut"); +} + +FemPostCutFilter::~FemPostCutFilter() { + +} + +void FemPostCutFilter::onChanged(const Property* prop) { + + if(prop == &Function) { + + if(Function.getValue() && Function.getValue()->isDerivedFrom(FemPostFunction::getClassTypeId())) { + m_cutter->SetCutFunction(static_cast(Function.getValue())->getImplicitFunction()); + } + } + + Fem::FemPostFilter::onChanged(prop); +} diff --git a/src/Mod/Fem/App/FemPostFilter.h b/src/Mod/Fem/App/FemPostFilter.h index cec6c2901..064af759b 100644 --- a/src/Mod/Fem/App/FemPostFilter.h +++ b/src/Mod/Fem/App/FemPostFilter.h @@ -34,6 +34,7 @@ #include #include #include +#include namespace Fem { @@ -162,6 +163,27 @@ private: App::Enumeration m_vectorFields; }; +class AppFemExport FemPostCutFilter : public FemPostFilter { + + PROPERTY_HEADER(Fem::FemPostCutFilter); + +public: + FemPostCutFilter(void); + virtual ~FemPostCutFilter(); + + App::PropertyLink Function; + + virtual const char* getViewProviderName(void) const { + return "FemGui::ViewProviderFemPostCut"; + } + +protected: + virtual void onChanged(const App::Property* prop); + +private: + vtkSmartPointer m_cutter; +}; + } //namespace Fem diff --git a/src/Mod/Fem/Gui/AppFemGui.cpp b/src/Mod/Fem/Gui/AppFemGui.cpp index d9f8ed90f..0461efb99 100644 --- a/src/Mod/Fem/Gui/AppFemGui.cpp +++ b/src/Mod/Fem/Gui/AppFemGui.cpp @@ -131,6 +131,7 @@ PyMODINIT_FUNC initFemGui() FemGui::ViewProviderFemPostClip ::init(); FemGui::ViewProviderFemPostScalarClip ::init(); FemGui::ViewProviderFemPostWarpVector ::init(); + FemGui::ViewProviderFemPostCut ::init(); #endif diff --git a/src/Mod/Fem/Gui/CMakeLists.txt b/src/Mod/Fem/Gui/CMakeLists.txt index 45365b705..25304bb34 100755 --- a/src/Mod/Fem/Gui/CMakeLists.txt +++ b/src/Mod/Fem/Gui/CMakeLists.txt @@ -98,6 +98,7 @@ if(BUILD_FEM_VTK) TaskPostClip.ui TaskPostScalarClip.ui TaskPostWarpVector.ui + TaskPostCut.ui PlaneWidget.ui SphereWidget.ui ) @@ -206,6 +207,7 @@ if(BUILD_FEM_VTK) TaskPostScalarClip.ui TaskPostDisplay.ui TaskPostWarpVector.ui + TaskPostCut.ui TaskPostBoxes.h TaskPostBoxes.cpp ) diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index dc247563a..e2e2b2f3b 100644 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -767,6 +767,32 @@ bool CmdFemCreateNodesSet::isActive(void) #ifdef FC_USE_VTK +void setupFilter(Gui::Command* cmd, std::string Name) { + + std::vector pipelines = App::GetApplication().getActiveDocument()->getObjectsOfType(); + if (!pipelines.empty()) { + Fem::FemPostPipeline *pipeline = pipelines.front(); + + std::string FeatName = cmd->getUniqueObjectName(Name.c_str()); + + cmd->openCommand("Create filter"); + cmd->doCommand(Gui::Command::Doc,"App.activeDocument().addObject('Fem::FemPost%sFilter','%s')", Name.c_str(), FeatName.c_str()); + cmd->doCommand(Gui::Command::Doc,"__list__ = App.ActiveDocument.%s.Filter", pipeline->getNameInDocument()); + cmd->doCommand(Gui::Command::Doc,"__list__.append(App.ActiveDocument.%s)", FeatName.c_str()); + cmd->doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Filter = __list__", pipeline->getNameInDocument()); + cmd->doCommand(Gui::Command::Doc,"del __list__"); + + cmd->updateActive(); + cmd->doCommand(Gui::Command::Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); + + } + else { + QMessageBox::warning(Gui::getMainWindow(), + qApp->translate("CmdFemPostCreateClipFilter", "Wrong selection"), + qApp->translate("CmdFemPostCreateClipFilter", "Select a pipeline, please.")); + } + +}; DEF_STD_CMD_A(CmdFemPostCreateClipFilter); @@ -784,28 +810,7 @@ CmdFemPostCreateClipFilter::CmdFemPostCreateClipFilter() void CmdFemPostCreateClipFilter::activated(int iMsg) { - std::vector pipelines = App::GetApplication().getActiveDocument()->getObjectsOfType(); - if (!pipelines.empty()) { - Fem::FemPostPipeline *pipeline = pipelines.front(); - - std::string FeatName = getUniqueObjectName("Clip"); - - openCommand("Create clip filter"); - doCommand(Doc,"App.activeDocument().addObject('Fem::FemPostClipFilter','%s')",FeatName.c_str()); - doCommand(Doc,"__list__ = App.ActiveDocument.%s.Filter", pipeline->getNameInDocument()); - doCommand(Doc,"__list__.append(App.ActiveDocument.%s)", FeatName.c_str()); - doCommand(Doc,"App.ActiveDocument.%s.Filter = __list__", pipeline->getNameInDocument()); - doCommand(Doc,"del __list__"); - - this->updateActive(); - doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); - - } - else { - QMessageBox::warning(Gui::getMainWindow(), - qApp->translate("CmdFemPostCreateClipFilter", "Wrong selection"), - qApp->translate("CmdFemPostCreateClipFilter", "Select a pipeline, please.")); - } + setupFilter(this, "Clip"); } bool CmdFemPostCreateClipFilter::isActive(void) @@ -829,27 +834,7 @@ CmdFemPostCreateScalarClipFilter::CmdFemPostCreateScalarClipFilter() void CmdFemPostCreateScalarClipFilter::activated(int iMsg) { - std::vector pipelines = App::GetApplication().getActiveDocument()->getObjectsOfType(); - if (!pipelines.empty()) { - Fem::FemPostPipeline *pipeline = pipelines.front(); - - std::string FeatName = getUniqueObjectName("ScalarClip"); - - openCommand("Create scalar clip filter"); - doCommand(Doc,"App.activeDocument().addObject('Fem::FemPostScalarClipFilter','%s')",FeatName.c_str()); - doCommand(Doc,"__list__ = App.ActiveDocument.%s.Filter", pipeline->getNameInDocument()); - doCommand(Doc,"__list__.append(App.ActiveDocument.%s)", FeatName.c_str()); - doCommand(Doc,"App.ActiveDocument.%s.Filter = __list__", pipeline->getNameInDocument()); - doCommand(Doc,"del __list__"); - - this->updateActive(); - doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); - } - else { - QMessageBox::warning(Gui::getMainWindow(), - qApp->translate("CmdFemPostCreateScalarClipFilter", "Wrong selection"), - qApp->translate("CmdFemPostCreateScalarClipFilter", "Select a pipeline, please.")); - } + setupFilter(this, "ScalarClip"); } bool CmdFemPostCreateScalarClipFilter::isActive(void) @@ -875,27 +860,7 @@ CmdFemPostWarpVectorFilter::CmdFemPostWarpVectorFilter() void CmdFemPostWarpVectorFilter::activated(int iMsg) { - std::vector pipelines = App::GetApplication().getActiveDocument()->getObjectsOfType(); - if (!pipelines.empty()) { - Fem::FemPostPipeline *pipeline = pipelines.front(); - - std::string FeatName = getUniqueObjectName("WarpVector"); - - openCommand("Create warp vector filter"); - doCommand(Doc,"App.activeDocument().addObject('Fem::FemPostWarpVectorFilter','%s')",FeatName.c_str()); - doCommand(Doc,"__list__ = App.ActiveDocument.%s.Filter", pipeline->getNameInDocument()); - doCommand(Doc,"__list__.append(App.ActiveDocument.%s)", FeatName.c_str()); - doCommand(Doc,"App.ActiveDocument.%s.Filter = __list__", pipeline->getNameInDocument()); - doCommand(Doc,"del __list__"); - - this->updateActive(); - doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); - } - else { - QMessageBox::warning(Gui::getMainWindow(), - qApp->translate("CmdFemPostCreateWarpVectorFilter", "Wrong selection"), - qApp->translate("CmdFemPostCreateWarpVectorFilter", "Select a pipeline, please.")); - } + setupFilter(this, "WarpVector"); } bool CmdFemPostWarpVectorFilter::isActive(void) @@ -903,6 +868,30 @@ bool CmdFemPostWarpVectorFilter::isActive(void) return hasActiveDocument(); } +DEF_STD_CMD_A(CmdFemPostCutFilter); + +CmdFemPostCutFilter::CmdFemPostCutFilter() + : Command("Fem_PostCreateCutFilter") +{ + sAppModule = "Fem"; + sGroup = QT_TR_NOOP("Fem"); + sMenuText = QT_TR_NOOP("Cut the data along an implicit function"); + sToolTipText = QT_TR_NOOP("Cut the data along an implicit function"); + sWhatsThis = "Fem_PostCreateCutFilter"; + sStatusTip = sToolTipText; + sPixmap = "fem-fem-mesh-create-node-by-poly"; +} + +void CmdFemPostCutFilter::activated(int iMsg) +{ + setupFilter(this, "Cut"); +} + +bool CmdFemPostCutFilter::isActive(void) +{ + return hasActiveDocument(); +} + // ##################################################################################################### @@ -958,7 +947,9 @@ void CmdFemPostFunctions::activated(int iMsg) doCommand(Doc,"del __list__"); this->updateActive(); - doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); + //most of the times functions are added inside of a filter, make sure this still works + if(Gui::Application::Instance->activeDocument()->getInEdit() == NULL) + doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); } else { QMessageBox::warning(Gui::getMainWindow(), @@ -1142,5 +1133,6 @@ void CreateFemCommands(void) rcCmdMgr.addCommand(new CmdFemPostFunctions); rcCmdMgr.addCommand(new CmdFemPostApllyChanges); rcCmdMgr.addCommand(new CmdFemPostPipelineFromResult); + rcCmdMgr.addCommand(new CmdFemPostCutFilter); #endif } diff --git a/src/Mod/Fem/Gui/Command.cpp.orig b/src/Mod/Fem/Gui/Command.cpp.orig index 02bc1612b..21f14994e 100644 --- a/src/Mod/Fem/Gui/Command.cpp.orig +++ b/src/Mod/Fem/Gui/Command.cpp.orig @@ -1,4 +1,4 @@ -<<<<<<< c8cde18ac8aa317da00f6668e9a156fcbe0b2975 +<<<<<<< 559b38429c3ec5bcad9eced553e5d7ca544cb55e /*************************************************************************** * Copyright (c) 2008 Jürgen Riegel (juergen.riegel@web.de) * * * @@ -858,6 +858,52 @@ bool CmdFemPostCreateScalarClipFilter::isActive(void) return hasActiveDocument(); } + + +DEF_STD_CMD_A(CmdFemPostWarpVectorFilter); + +CmdFemPostWarpVectorFilter::CmdFemPostWarpVectorFilter() + : Command("Fem_PostCreateWarpVectorFilter") +{ + sAppModule = "Fem"; + sGroup = QT_TR_NOOP("Fem"); + sMenuText = QT_TR_NOOP("Warp the geometry along a vector field by a certain factor"); + sToolTipText = QT_TR_NOOP("Warp the geometry along a vector field by a certain factor"); + sWhatsThis = "Fem_PostCreateWarpVectorFilter"; + sStatusTip = sToolTipText; + sPixmap = "fem-fem-mesh-create-node-by-poly"; +} + +void CmdFemPostWarpVectorFilter::activated(int iMsg) +{ + std::vector pipelines = App::GetApplication().getActiveDocument()->getObjectsOfType(); + if (!pipelines.empty()) { + Fem::FemPostPipeline *pipeline = pipelines.front(); + + std::string FeatName = getUniqueObjectName("WarpVector"); + + openCommand("Create warp vector filter"); + doCommand(Doc,"App.activeDocument().addObject('Fem::FemPostWarpVectorFilter','%s')",FeatName.c_str()); + doCommand(Doc,"__list__ = App.ActiveDocument.%s.Filter", pipeline->getNameInDocument()); + doCommand(Doc,"__list__.append(App.ActiveDocument.%s)", FeatName.c_str()); + doCommand(Doc,"App.ActiveDocument.%s.Filter = __list__", pipeline->getNameInDocument()); + doCommand(Doc,"del __list__"); + + this->updateActive(); + doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); + } + else { + QMessageBox::warning(Gui::getMainWindow(), + qApp->translate("CmdFemPostCreateWarpVectorFilter", "Wrong selection"), + qApp->translate("CmdFemPostCreateWarpVectorFilter", "Select a pipeline, please.")); + } +} + +bool CmdFemPostWarpVectorFilter::isActive(void) +{ + return hasActiveDocument(); +} + // ##################################################################################################### @@ -1093,6 +1139,7 @@ void CreateFemCommands(void) #ifdef FC_USE_VTK rcCmdMgr.addCommand(new CmdFemPostCreateClipFilter); rcCmdMgr.addCommand(new CmdFemPostCreateScalarClipFilter); + rcCmdMgr.addCommand(new CmdFemPostWarpVectorFilter); rcCmdMgr.addCommand(new CmdFemPostFunctions); rcCmdMgr.addCommand(new CmdFemPostApllyChanges); rcCmdMgr.addCommand(new CmdFemPostPipelineFromResult); @@ -1868,6 +1915,32 @@ bool CmdFemCreateNodesSet::isActive(void) #ifdef FC_USE_VTK +void setupFilter(Gui::Command* cmd, std::string Name) { + + std::vector pipelines = App::GetApplication().getActiveDocument()->getObjectsOfType(); + if (!pipelines.empty()) { + Fem::FemPostPipeline *pipeline = pipelines.front(); + + std::string FeatName = cmd->getUniqueObjectName(Name.c_str()); + + cmd->openCommand("Create filter"); + cmd->doCommand(Gui::Command::Doc,"App.activeDocument().addObject('Fem::FemPost%sFilter','%s')", Name.c_str(), FeatName.c_str()); + cmd->doCommand(Gui::Command::Doc,"__list__ = App.ActiveDocument.%s.Filter", pipeline->getNameInDocument()); + cmd->doCommand(Gui::Command::Doc,"__list__.append(App.ActiveDocument.%s)", FeatName.c_str()); + cmd->doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Filter = __list__", pipeline->getNameInDocument()); + cmd->doCommand(Gui::Command::Doc,"del __list__"); + + cmd->updateActive(); + cmd->doCommand(Gui::Command::Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); + + } + else { + QMessageBox::warning(Gui::getMainWindow(), + qApp->translate("CmdFemPostCreateClipFilter", "Wrong selection"), + qApp->translate("CmdFemPostCreateClipFilter", "Select a pipeline, please.")); + } + +}; DEF_STD_CMD_A(CmdFemPostCreateClipFilter); @@ -1885,28 +1958,7 @@ CmdFemPostCreateClipFilter::CmdFemPostCreateClipFilter() void CmdFemPostCreateClipFilter::activated(int iMsg) { - std::vector pipelines = App::GetApplication().getActiveDocument()->getObjectsOfType(); - if (!pipelines.empty()) { - Fem::FemPostPipeline *pipeline = pipelines.front(); - - std::string FeatName = getUniqueObjectName("Clip"); - - openCommand("Create clip filter"); - doCommand(Doc,"App.activeDocument().addObject('Fem::FemPostClipFilter','%s')",FeatName.c_str()); - doCommand(Doc,"__list__ = App.ActiveDocument.%s.Filter", pipeline->getNameInDocument()); - doCommand(Doc,"__list__.append(App.ActiveDocument.%s)", FeatName.c_str()); - doCommand(Doc,"App.ActiveDocument.%s.Filter = __list__", pipeline->getNameInDocument()); - doCommand(Doc,"del __list__"); - - this->updateActive(); - doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); - - } - else { - QMessageBox::warning(Gui::getMainWindow(), - qApp->translate("CmdFemPostCreateClipFilter", "Wrong selection"), - qApp->translate("CmdFemPostCreateClipFilter", "Select a pipeline, please.")); - } + setupFilter(this, "Clip"); } bool CmdFemPostCreateClipFilter::isActive(void) @@ -1930,27 +1982,7 @@ CmdFemPostCreateScalarClipFilter::CmdFemPostCreateScalarClipFilter() void CmdFemPostCreateScalarClipFilter::activated(int iMsg) { - std::vector pipelines = App::GetApplication().getActiveDocument()->getObjectsOfType(); - if (!pipelines.empty()) { - Fem::FemPostPipeline *pipeline = pipelines.front(); - - std::string FeatName = getUniqueObjectName("ScalarClip"); - - openCommand("Create scalar clip filter"); - doCommand(Doc,"App.activeDocument().addObject('Fem::FemPostScalarClipFilter','%s')",FeatName.c_str()); - doCommand(Doc,"__list__ = App.ActiveDocument.%s.Filter", pipeline->getNameInDocument()); - doCommand(Doc,"__list__.append(App.ActiveDocument.%s)", FeatName.c_str()); - doCommand(Doc,"App.ActiveDocument.%s.Filter = __list__", pipeline->getNameInDocument()); - doCommand(Doc,"del __list__"); - - this->updateActive(); - doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); - } - else { - QMessageBox::warning(Gui::getMainWindow(), - qApp->translate("CmdFemPostCreateScalarClipFilter", "Wrong selection"), - qApp->translate("CmdFemPostCreateScalarClipFilter", "Select a pipeline, please.")); - } + setupFilter(this, "ScalarClip"); } bool CmdFemPostCreateScalarClipFilter::isActive(void) @@ -1976,27 +2008,7 @@ CmdFemPostWarpVectorFilter::CmdFemPostWarpVectorFilter() void CmdFemPostWarpVectorFilter::activated(int iMsg) { - std::vector pipelines = App::GetApplication().getActiveDocument()->getObjectsOfType(); - if (!pipelines.empty()) { - Fem::FemPostPipeline *pipeline = pipelines.front(); - - std::string FeatName = getUniqueObjectName("WarpVector"); - - openCommand("Create warp vector filter"); - doCommand(Doc,"App.activeDocument().addObject('Fem::FemPostWarpVectorFilter','%s')",FeatName.c_str()); - doCommand(Doc,"__list__ = App.ActiveDocument.%s.Filter", pipeline->getNameInDocument()); - doCommand(Doc,"__list__.append(App.ActiveDocument.%s)", FeatName.c_str()); - doCommand(Doc,"App.ActiveDocument.%s.Filter = __list__", pipeline->getNameInDocument()); - doCommand(Doc,"del __list__"); - - this->updateActive(); - doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); - } - else { - QMessageBox::warning(Gui::getMainWindow(), - qApp->translate("CmdFemPostCreateWarpVectorFilter", "Wrong selection"), - qApp->translate("CmdFemPostCreateWarpVectorFilter", "Select a pipeline, please.")); - } + setupFilter(this, "WarpVector"); } bool CmdFemPostWarpVectorFilter::isActive(void) @@ -2004,6 +2016,30 @@ bool CmdFemPostWarpVectorFilter::isActive(void) return hasActiveDocument(); } +DEF_STD_CMD_A(CmdFemPostCutFilter); + +CmdFemPostCutFilter::CmdFemPostCutFilter() + : Command("Fem_PostCreateCutFilter") +{ + sAppModule = "Fem"; + sGroup = QT_TR_NOOP("Fem"); + sMenuText = QT_TR_NOOP("Cut the data along an implicit function"); + sToolTipText = QT_TR_NOOP("Cut the data along an implicit function"); + sWhatsThis = "Fem_PostCreateCutFilter"; + sStatusTip = sToolTipText; + sPixmap = "fem-fem-mesh-create-node-by-poly"; +} + +void CmdFemPostCutFilter::activated(int iMsg) +{ + setupFilter(this, "Cut"); +} + +bool CmdFemPostCutFilter::isActive(void) +{ + return hasActiveDocument(); +} + // ##################################################################################################### @@ -2059,7 +2095,9 @@ void CmdFemPostFunctions::activated(int iMsg) doCommand(Doc,"del __list__"); this->updateActive(); - doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); + //most of the times functions are added inside of a filter, make sure this still works + if(Gui::Application::Instance->activeDocument()->getInEdit() == NULL) + doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); } else { QMessageBox::warning(Gui::getMainWindow(), @@ -2243,6 +2281,7 @@ void CreateFemCommands(void) rcCmdMgr.addCommand(new CmdFemPostFunctions); rcCmdMgr.addCommand(new CmdFemPostApllyChanges); rcCmdMgr.addCommand(new CmdFemPostPipelineFromResult); + rcCmdMgr.addCommand(new CmdFemPostCutFilter); #endif } ->>>>>>> Add warp vector filter +>>>>>>> Add cut filter diff --git a/src/Mod/Fem/Gui/TaskPostBoxes.cpp b/src/Mod/Fem/Gui/TaskPostBoxes.cpp index 72a3d5d44..39e71195c 100644 --- a/src/Mod/Fem/Gui/TaskPostBoxes.cpp +++ b/src/Mod/Fem/Gui/TaskPostBoxes.cpp @@ -30,6 +30,7 @@ #include "ui_TaskPostClip.h" #include "ui_TaskPostScalarClip.h" #include "ui_TaskPostWarpVector.h" +#include "ui_TaskPostCut.h" #include "TaskPostBoxes.h" #include "ViewProviderFemPostObject.h" #include "ViewProviderFemPostFunction.h" @@ -535,6 +536,107 @@ void TaskPostWarpVector::on_Min_valueChanged(double v) { ui->Slider->blockSignals(false); } +//############################################################################################ +TaskPostCut::TaskPostCut(ViewProviderDocumentObject* view, App::PropertyLink* function, QWidget* parent) + : TaskPostBox(view,Gui::BitmapFactory().pixmap("fem-fem-mesh-create-node-by-poly"), tr("Choose implicit function"), parent) { + + assert(view->isDerivedFrom(ViewProviderFemPostCut::getClassTypeId())); + assert(function); + + fwidget = NULL; + + //we load the views widget + proxy = new QWidget(this); + ui = new Ui_TaskPostCut(); + ui->setupUi(proxy); + QMetaObject::connectSlotsByName(this); + this->groupLayout()->addWidget(proxy); + + //the layout for the container widget + QVBoxLayout *layout = new QVBoxLayout(); + ui->Container->setLayout(layout); + + //fill up the combo box with possible functions + collectImplicitFunctions(); + + //add the function creation command + Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager(); + rcCmdMgr.getCommandByName("Fem_PostCreateFunctions")->getAction()->addTo(ui->CreateButton); + ui->CreateButton->setPopupMode(QToolButton::InstantPopup); +} + +TaskPostCut::~TaskPostCut() { + +} + +void TaskPostCut::applyPythonCode() { + +} + +void TaskPostCut::collectImplicitFunctions() { + + std::vector pipelines; + pipelines = App::GetApplication().getActiveDocument()->getObjectsOfType(); + if (!pipelines.empty()) { + Fem::FemPostPipeline *pipeline = pipelines.front(); + if(pipeline->Function.getValue() && + pipeline->Function.getValue()->getTypeId() == Fem::FemPostFunctionProvider::getClassTypeId()) { + + ui->FunctionBox->clear(); + QStringList items; + const std::vector& funcs = static_cast( + pipeline->Function.getValue())->Functions.getValues(); + for(std::size_t i=0; igetNameInDocument())); + + ui->FunctionBox->addItems(items); + } + } +} + +void TaskPostCut::on_CreateButton_triggered(QAction* a) { + + collectImplicitFunctions(); + recompute(); +} + +void TaskPostCut::on_FunctionBox_currentIndexChanged(int idx) { + + //set the correct property + std::vector pipelines; + pipelines = App::GetApplication().getActiveDocument()->getObjectsOfType(); + if (!pipelines.empty()) { + Fem::FemPostPipeline *pipeline = pipelines.front(); + if(pipeline->Function.getValue() && + pipeline->Function.getValue()->getTypeId() == Fem::FemPostFunctionProvider::getClassTypeId()) { + + const std::vector& funcs = static_cast( + pipeline->Function.getValue())->Functions.getValues(); + if(idx>=0) + static_cast(getObject())->Function.setValue(funcs[idx]); + else + static_cast(getObject())->Function.setValue(NULL); + } + } + + //load the correct view + Fem::FemPostFunction* fobj = static_cast( + static_cast(getObject())->Function.getValue()); + Gui::ViewProvider* view = NULL; + if(fobj) + view = Gui::Application::Instance->activeDocument()->getViewProvider(fobj); + + if(fwidget) + fwidget->deleteLater(); + + if(view) { + fwidget = static_cast(view)->createControlWidget(); + fwidget->setParent(ui->Container); + fwidget->setViewProvider(static_cast(view)); + ui->Container->layout()->addWidget(fwidget); + } + recompute(); +} #include "moc_TaskPostBoxes.cpp" diff --git a/src/Mod/Fem/Gui/TaskPostBoxes.h b/src/Mod/Fem/Gui/TaskPostBoxes.h index 555adc218..d7ff256ae 100644 --- a/src/Mod/Fem/Gui/TaskPostBoxes.h +++ b/src/Mod/Fem/Gui/TaskPostBoxes.h @@ -36,6 +36,7 @@ class Ui_TaskPostDisplay; class Ui_TaskPostClip; class Ui_TaskPostScalarClip; class Ui_TaskPostWarpVector; +class Ui_TaskPostCut; namespace FemGui { @@ -206,6 +207,31 @@ private: Ui_TaskPostWarpVector* ui; }; + + +class TaskPostCut : public TaskPostBox { + + Q_OBJECT + +public: + TaskPostCut(Gui::ViewProviderDocumentObject* view, App::PropertyLink* function, QWidget* parent = 0); + virtual ~TaskPostCut(); + + virtual void applyPythonCode(); + +private Q_SLOTS: + void on_CreateButton_triggered(QAction* a); + void on_FunctionBox_currentIndexChanged(int idx); + +private: + void collectImplicitFunctions(); + + App::PropertyLink* m_functionProperty; + QWidget* proxy; + Ui_TaskPostCut* ui; + FunctionWidget* fwidget; +}; + } //namespace FemGui #endif // GUI_TASKVIEW_TaskPostDisplay_H diff --git a/src/Mod/Fem/Gui/TaskPostCut.ui b/src/Mod/Fem/Gui/TaskPostCut.ui new file mode 100644 index 000000000..f316f0faf --- /dev/null +++ b/src/Mod/Fem/Gui/TaskPostCut.ui @@ -0,0 +1,67 @@ + + + TaskPostCut + + + + 0 + 0 + 404 + 98 + + + + + 0 + 0 + + + + Form + + + + + + + + + + + Create + + + + :/icons/list-add.svg:/icons/list-add.svg + + + Qt::ToolButtonTextBesideIcon + + + + + + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + + + + + + + diff --git a/src/Mod/Fem/Gui/TaskPostWarpVector.ui b/src/Mod/Fem/Gui/TaskPostWarpVector.ui new file mode 100644 index 000000000..eeb4d93c7 --- /dev/null +++ b/src/Mod/Fem/Gui/TaskPostWarpVector.ui @@ -0,0 +1,183 @@ + + + TaskPostWarpVector + + + + 0 + 0 + 295 + 156 + + + + Form + + + + + + + + + 0 + 0 + + + + Vector + + + + + + + + 0 + 0 + + + + + Outline + + + + + Surface + + + + + Surface with Edges + + + + + Wireframe + + + + + + + + + + Qt::Horizontal + + + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + 99999.000000000000000 + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + 100 + + + Qt::Horizontal + + + false + + + false + + + QSlider::NoTicks + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + 99999.000000000000000 + + + + + + + + + Qt::Horizontal + + + + + + + QFormLayout::ExpandingFieldsGrow + + + + + Value + + + + + + + + 0 + 0 + + + + + + + + line + + + line_2 + + + + diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp index 3972c7eb7..e12cead4e 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp @@ -88,3 +88,24 @@ void ViewProviderFemPostWarpVector::setupTaskDialog(TaskDlgPost* dlg) { //add the display options FemGui::ViewProviderFemPostObject::setupTaskDialog(dlg); } + + +PROPERTY_SOURCE(FemGui::ViewProviderFemPostCut, FemGui::ViewProviderFemPostObject) + +ViewProviderFemPostCut::ViewProviderFemPostCut() { + +} + +ViewProviderFemPostCut::~ViewProviderFemPostCut() { + +} + +void ViewProviderFemPostCut::setupTaskDialog(TaskDlgPost* dlg) { + + //add the function box + dlg->appendBox(new TaskPostCut(dlg->getView(), + &static_cast(dlg->getView()->getObject())->Function)); + + //add the display options + FemGui::ViewProviderFemPostObject::setupTaskDialog(dlg); +} \ No newline at end of file diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostFilter.h b/src/Mod/Fem/Gui/ViewProviderFemPostFilter.h index b449acbb9..4e93f6f4d 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostFilter.h +++ b/src/Mod/Fem/Gui/ViewProviderFemPostFilter.h @@ -68,6 +68,19 @@ protected: virtual void setupTaskDialog(TaskDlgPost* dlg); }; +class FemGuiExport ViewProviderFemPostCut : public ViewProviderFemPostObject { + + PROPERTY_HEADER(FemGui::ViewProviderFemPostCut); + +public: + /// constructor. + ViewProviderFemPostCut(); + ~ViewProviderFemPostCut(); + +protected: + virtual void setupTaskDialog(TaskDlgPost* dlg); +}; + } //namespace FemGui diff --git a/src/Mod/Fem/Gui/Workbench.cpp b/src/Mod/Fem/Gui/Workbench.cpp index df7abf654..ca23dab91 100755 --- a/src/Mod/Fem/Gui/Workbench.cpp +++ b/src/Mod/Fem/Gui/Workbench.cpp @@ -87,6 +87,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const << "Separator" << "Fem_PostCreateClipFilter" << "Fem_PostCreateScalarClipFilter" + << "Fem_PostCreateCutFilter" << "Fem_PostCreateWarpVectorFilter" << "Separator" << "Fem_PostCreateFunctions";