From 0ad2e47f4d611a22f679e5b3ef5ed6851f8a02be Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 8 May 2017 21:50:03 +0200 Subject: [PATCH] add command to merge point clouds --- src/Mod/Points/Gui/Command.cpp | 44 ++++++++++++++++++++++++++++++++ src/Mod/Points/Gui/Workbench.cpp | 4 ++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/Mod/Points/Gui/Command.cpp b/src/Mod/Points/Gui/Command.cpp index a6768a913449..4fb211004032 100644 --- a/src/Mod/Points/Gui/Command.cpp +++ b/src/Mod/Points/Gui/Command.cpp @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -314,6 +315,48 @@ bool CmdPointsPolyCut::isActive(void) return getSelection().countObjectsOfType(Points::Feature::getClassTypeId()) > 0; } +DEF_STD_CMD_A(CmdPointsMerge) + +CmdPointsMerge::CmdPointsMerge() + :Command("Points_Merge") +{ + sAppModule = "Points"; + sGroup = QT_TR_NOOP("Points"); + sMenuText = QT_TR_NOOP("Merge point clouds"); + sToolTipText = QT_TR_NOOP("Merge several point clouds into one"); + sWhatsThis = QT_TR_NOOP("Merge several point clouds into one"); + sStatusTip = QT_TR_NOOP("Merge several point clouds into one"); +} + +void CmdPointsMerge::activated(int iMsg) +{ + Q_UNUSED(iMsg); + + App::Document* doc = App::GetApplication().getActiveDocument(); + doc->openTransaction("Merge point clouds"); + Points::Feature* pts = static_cast(doc->addObject("Points::Feature", "Merged Points")); + Points::PointKernel* kernel = pts->Points.startEditing(); + + std::vector docObj = Gui::Selection().getObjectsOfType(Points::Feature::getClassTypeId()); + for (std::vector::iterator it = docObj.begin(); it != docObj.end(); ++it) { + const Points::PointKernel& k = static_cast(*it)->Points.getValue(); + std::size_t numPts = kernel->size(); + kernel->resize(numPts + k.size()); + for (std::size_t i=0; isetPoint(i+numPts, k.getPoint(i)); + } + } + + pts->Points.finishEditing(); + doc->commitTransaction(); + updateActive(); +} + +bool CmdPointsMerge::isActive(void) +{ + return getSelection().countObjectsOfType(Points::Feature::getClassTypeId()) > 1; +} + void CreatePointsCommands(void) { Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager(); @@ -322,4 +365,5 @@ void CreatePointsCommands(void) rcCmdMgr.addCommand(new CmdPointsTransform()); rcCmdMgr.addCommand(new CmdPointsConvert()); rcCmdMgr.addCommand(new CmdPointsPolyCut()); + rcCmdMgr.addCommand(new CmdPointsMerge()); } diff --git a/src/Mod/Points/Gui/Workbench.cpp b/src/Mod/Points/Gui/Workbench.cpp index 62113c25b332..d31e21f31491 100644 --- a/src/Mod/Points/Gui/Workbench.cpp +++ b/src/Mod/Points/Gui/Workbench.cpp @@ -76,7 +76,9 @@ Gui::MenuItem* Workbench::setupMenuBar() const root->insertItem(item, pnts); pnts->setCommand("&Points"); - *pnts << "Points_Convert" << "Separator" << "Points_Import" << "Points_Export" << "Separator" << "Points_PolyCut"; + *pnts << "Points_Convert" << "Separator" << "Points_Import" + << "Points_Export" << "Separator" << "Points_PolyCut" + << "Points_Merge"; return root; }