diff --git a/src/Mod/Points/Gui/Command.cpp b/src/Mod/Points/Gui/Command.cpp
index a6768a9134..4fb2110040 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 62113c25b3..d31e21f314 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;
}