diff --git a/src/Mod/Part/App/FeatureCompound.cpp b/src/Mod/Part/App/FeatureCompound.cpp index 08d36b19bfd1..9a87e96c78e1 100644 --- a/src/Mod/Part/App/FeatureCompound.cpp +++ b/src/Mod/Part/App/FeatureCompound.cpp @@ -66,21 +66,29 @@ App::DocumentObjectExecReturn *Compound::execute(void) TopoDS_Compound comp; builder.MakeCompound(comp); + // avoid duplicates without changing the order + // See also ViewProviderCompound::updateData + std::set tempLinks; + const std::vector& links = Links.getValues(); for (std::vector::const_iterator it = links.begin(); it != links.end(); ++it) { if (*it && (*it)->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) { Part::Feature* fea = static_cast(*it); - const TopoDS_Shape& sh = fea->Shape.getValue(); - if (!sh.IsNull()) { - builder.Add(comp, sh); - TopTools_IndexedMapOfShape faceMap; - TopExp::MapShapes(sh, TopAbs_FACE, faceMap); - ShapeHistory hist; - hist.type = TopAbs_FACE; - for (int i=1; i<=faceMap.Extent(); i++) { - hist.shapeMap[i-1].push_back(countFaces++); + + auto pos = tempLinks.insert(fea); + if (pos.second) { + const TopoDS_Shape& sh = fea->Shape.getValue(); + if (!sh.IsNull()) { + builder.Add(comp, sh); + TopTools_IndexedMapOfShape faceMap; + TopExp::MapShapes(sh, TopAbs_FACE, faceMap); + ShapeHistory hist; + hist.type = TopAbs_FACE; + for (int i=1; i<=faceMap.Extent(); i++) { + hist.shapeMap[i-1].push_back(countFaces++); + } + history.push_back(hist); } - history.push_back(hist); } } } diff --git a/src/Mod/Part/Gui/Command.cpp b/src/Mod/Part/Gui/Command.cpp index 08fbf9b9255a..c4aba0f9f6c5 100644 --- a/src/Mod/Part/Gui/Command.cpp +++ b/src/Mod/Part/Gui/Command.cpp @@ -909,11 +909,15 @@ void CmdPartCompound::activated(int iMsg) std::vector Sel = getSelection().getSelection(); std::stringstream str; - std::vector tempSelNames; + + // avoid duplicates without changing the order + std::set tempSelNames; str << "App.activeDocument()." << FeatName << ".Links = ["; - for (std::vector::iterator it = Sel.begin(); it != Sel.end(); ++it){ - str << "App.activeDocument()." << it->FeatName << ","; - tempSelNames.push_back(it->FeatName); + for (std::vector::iterator it = Sel.begin(); it != Sel.end(); ++it) { + auto pos = tempSelNames.insert(it->FeatName); + if (pos.second) { + str << "App.activeDocument()." << it->FeatName << ","; + } } str << "]"; diff --git a/src/Mod/Part/Gui/ViewProviderCompound.cpp b/src/Mod/Part/Gui/ViewProviderCompound.cpp index 27b5418b430f..30fa8f27ba11 100644 --- a/src/Mod/Part/Gui/ViewProviderCompound.cpp +++ b/src/Mod/Part/Gui/ViewProviderCompound.cpp @@ -72,6 +72,24 @@ void ViewProviderCompound::updateData(const App::Property* prop) (prop)->getValues(); Part::Compound* objComp = static_cast(getObject()); std::vector sources = objComp->Links.getValues(); + + if (hist.size() != sources.size()) { + // avoid duplicates without changing the order + // See also Compound::execute + std::set tempSources; + std::vector filter; + for (std::vector::iterator it = sources.begin(); it != sources.end(); ++it) { + Part::Feature* objBase = dynamic_cast(*it); + if (objBase) { + auto pos = tempSources.insert(objBase); + if (pos.second) { + filter.push_back(objBase); + } + } + } + + sources = filter; + } if (hist.size() != sources.size()) return;