# 图层删除 当删除一个节点时,该节点一定满足且只满足以下条件中的一条: 1. 是一个Leaf节点,引用了其他的Element; 2. 是一个Folder节点,没有GroupElement引用,没有引用任何其他节点(因为是Folder); 3. 是一个Folder节点,存在对应的GroupElement引用。 其中,对于第1条,由于Leaf节点被删除只影响其父亲Folder的属性,所以显然在删除Leaf节点时是绝对安全的。 对于第2条,对于其父亲Folder,其被删除只影响其父亲Folder的属性,所以不会影响其父亲;对于其孩子,有可能存在以下情况: 1. 孩子中不存在任何被引用的情况:删除安全; 2. 孩子中存在Folder节点被GroupElement引用,不安全,需要手动将情况转换为第1条后才可以删除。 对于第3条,必须首先手动解除其本身的引用,然后将转变为第2条。 # 图元删除 **显然**,无论是什么种类的图元,删除一个图元会影响到的元素只有引用它的图层,所以我们将SimpleElement与GroupElement合并成一种情况讨论。 当删除一个图元时,该图元一定满足且只满足以下条件中的一条: 1. 是一个GraphicElement,未被其他图层引用; 2. 是一个GraphicElement,被其他图层引用。 对于第1条,删除绝对安全。 对于第2条,将引用关系手动解除后,删除安全。 # 图层移动 ## 条件分析 图层移动时,显然,被移动的节点只影响它本身及它的子图层, 移动的目标节点只影响它本身及它的父图层,那么: (1) 被移动的图层一定满足且只满足以下条件中的一条: 1. 是一个Folder节点,无对应的GroupElement引用,子节点无引用GroupElement; 2. 是一个Folder节点,无对应的GroupElement引用,子节点存在引用GroupElement; 3. 是一个Folder节点,存在对应的GroupElement引用; 4. 是一个Leaf节点,引用了GroupElement; 5. 是一个Leaf节点,未引用GroupElement。 (2) 目标FolderLayer一定满足且只满足以下条件中的一条: 1. 自身无对应的GroupElement引用,无父节点有GroupElement引用; 2. 自身无对应的GroupElement引用,存在父节点有GroupElement引用; 3. 自身存在对应的GroupElement引用。 显然,以上条件的全组合可以覆盖所有情况。 由于: - `(1) 1` 与 `(2) 中的任一条件`进行组合显然是绝对安全的; - `(1) 3` 中自身提供的GroupElement并不会影响移动; - `(1) 5` 与 `(2) 中的任一条件`进行组合显然是绝对安全的; - `(1) 中的任一条件` 与 `(2) 1` 进行组合显然是绝对安全的。 所以接下来对于除去以上情况的所有组合情况进行讨论。 ## 讨论证明 ### `(1) 2` - `(2) 2` 当且仅当被移动的图层的子节点引用的GroupElement 与 目标图层父节点提供的GroupElement 相同时,移动不安全。 ### `(1) 4` - `(2) 2` 当且仅当被移动的图层引用的GroupElement 与 目标图层父节点提供的 GroupElement 相同时,移动不安全。 ### `(2) 3` 的特殊讨论 当且仅当自身提供的GroupElement 被 被移动图层或其子节点引用时,需要处理其自身情况,否则无视其自身提供的GroupElement,与 `(2) 1` 或 `(2) 2` 视为同情况处理。 ## 结论 当且仅当被移动的图层或其子节点所引用的GroupElement 与 目标图层或其父节点所提供的GroupElement 相同时,移动不安全;其余情况均安全。