X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d.vtk%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Fvtk%2Fcommon%2FAbstractVTKNodeMap.java;h=d9b754b45e115bb0f7be78fc6c3f56c327abae37;hb=46c28cc32944d0f73c5ab4062bd6b0b232143be7;hp=674a71f2987953f0cf1ace01014b1deb9a68103e;hpb=27fb679643fab3ef9aa46d04c5ced2ea82cf60c2;p=simantics%2F3d.git diff --git a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/common/AbstractVTKNodeMap.java b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/common/AbstractVTKNodeMap.java index 674a71f2..d9b754b4 100644 --- a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/common/AbstractVTKNodeMap.java +++ b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/common/AbstractVTKNodeMap.java @@ -11,9 +11,11 @@ *******************************************************************************/ package org.simantics.g3d.vtk.common; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Deque; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -435,6 +437,27 @@ public abstract class AbstractVTKNodeMap implements VTKNodeMap< synchronized (syncMutex) { + // Check for overlapping additions and deletions, prevent deleting objects that are also added. + Deque stack = new ArrayDeque(); + for (Pair n : added) { + stack.add(n.first); + } + while (!stack.isEmpty()) { + E n = stack.pop(); + for (int i = removed.size()-1; i >= 0; i--) { + if (removed.get(i).first == n) { + removed.remove(i); + break; + } + } + if (n instanceof ParentNode) { + ParentNode pn = (ParentNode)n; + for (INode cn : pn.getNodes()) { + stack.push((E)cn); + } + } + } + rem.addAll(removed); add.addAll(added); for (E e : updated.getKeys()) { @@ -448,6 +471,8 @@ public abstract class AbstractVTKNodeMap implements VTKNodeMap< updated.clear(); } + + for (Pair n : rem) { stopListening(n.first); removeActor(n.first);