From 86e56ec842647bcf870dd315f19f802c6aa04775 Mon Sep 17 00:00:00 2001 From: wmayer Date: Thu, 11 May 2023 15:45:09 +0200 Subject: [PATCH] fixes #9134: Points Merge doesn't keep Color information --- src/Mod/Points/App/CMakeLists.txt | 1 + src/Mod/Points/App/Tools.h | 65 +++++++++++++++++++++++++++++++ src/Mod/Points/Gui/Command.cpp | 24 +++++++++++- 3 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/Mod/Points/App/Tools.h diff --git a/src/Mod/Points/App/CMakeLists.txt b/src/Mod/Points/App/CMakeLists.txt index 4aa7c9c9ac..0cd0601736 100644 --- a/src/Mod/Points/App/CMakeLists.txt +++ b/src/Mod/Points/App/CMakeLists.txt @@ -48,6 +48,7 @@ SET(Points_SRCS PropertyPointKernel.h Structured.cpp Structured.h + Tools.h ) set(Points_Scripts diff --git a/src/Mod/Points/App/Tools.h b/src/Mod/Points/App/Tools.h new file mode 100644 index 0000000000..48be0fd033 --- /dev/null +++ b/src/Mod/Points/App/Tools.h @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2023 Werner Mayer * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +#ifndef POINTS_TOOLS_H +#define POINTS_TOOLS_H + +#include +#include + +namespace Points { + +template +bool copyProperty(App::DocumentObject* target, + std::vector source, + const char* propertyName) +{ + // check for properties + if (std::all_of(std::begin(source), std::end(source), [=](auto obj) { + return dynamic_cast(obj->getPropertyByName(propertyName)) != nullptr; + })) { + + auto target_prop = dynamic_cast + (target->addDynamicProperty(PropertyT::getClassTypeId().getName(), propertyName)); + if (target_prop) { + auto values = target_prop->getValues(); + for (auto it : source) { + auto source_prop = dynamic_cast + (it->getPropertyByName(propertyName)); + if (source_prop) { + auto source_values = source_prop->getValues(); + values.insert(values.end(), source_values.begin(), source_values.end()); + } + } + + target_prop->setValues(values); + return true; + } + } + + return false; +} + +} + +#endif // POINTS_TOOLS_H diff --git a/src/Mod/Points/Gui/Command.cpp b/src/Mod/Points/Gui/Command.cpp index ef6418f4ed..d2e7ecd339 100644 --- a/src/Mod/Points/Gui/Command.cpp +++ b/src/Mod/Points/Gui/Command.cpp @@ -41,11 +41,13 @@ #include #include #include +#include #include #include "../App/PointsFeature.h" #include "../App/Structured.h" #include "../App/Properties.h" +#include "../App/Tools.h" #include "DlgPointsReadImp.h" #include "ViewProvider.h" @@ -323,8 +325,8 @@ void CmdPointsMerge::activated(int iMsg) 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(); + for (auto it : docObj) { + 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; iPoints.finishEditing(); + + // Add properties + std::string displayMode = "Points"; + if (Points::copyProperty(pts, docObj, "Color")) { + displayMode = "Color"; + } + if (Points::copyProperty(pts, docObj, "Normal")) { + displayMode = "Shaded"; + } + if (Points::copyProperty(pts, docObj, "Intensity")) { + displayMode = "Intensity"; + } + + if (auto vp = dynamic_cast + (Gui::Application::Instance->getViewProvider(pts))) { + vp->DisplayMode.setValue(displayMode.c_str()); + } + doc->commitTransaction(); updateActive(); }