4 using System.Collections.Generic;
7 using SiliconStudio.Quantum.References;
9 namespace SiliconStudio.Quantum
16 private class NodePathItemIndex
19 public override string ToString() {
return string.Format(
"[{0}]", Value); }
22 private class NodePathItemMember
25 public override string ToString() {
return string.Format(
".{0}", Name); } }
27 private class NodePathItemTarget
29 public override string ToString() {
return "-> (Target)"; }
32 private readonly List<object> path =
new List<object>();
33 private bool targetIsRootNode;
42 public bool IsValid {
get {
return path.Count > 0 || targetIsRootNode; } }
57 throw new InvalidOperationException(
"The node path is invalid.");
60 foreach (var itemPath
in path)
62 var member = itemPath as NodePathItemMember;
63 var target = itemPath as NodePathItemTarget;
64 var index = itemPath as NodePathItemIndex;
67 node = node.Children.Single(x => x.Name == member.Name);
69 else if (target != null)
72 node = objectRefererence.TargetNode;
74 else if (index != null)
77 var objectRefererence = enumerableReference.Single(x => Equals(x.Index, index.Value));
78 node = objectRefererence.TargetNode;
92 var visitedNode =
new HashSet<IModelNode>();
93 var result = GetPathRecursive(rootNode, target, visitedNode);
96 result.RootNode = rootNode;
97 result.targetIsRootNode = rootNode == target;
105 return IsValid ?
"(root)" + path.Select(x => x.ToString()).Aggregate((current, next) => current + next) :
"(invalid)";
108 private void Prepend(
object item)
110 path.Insert(0, item);
113 private static ModelNodePath GetPathRecursive(IModelNode modelNode, IModelNode target,
ICollection<IModelNode> visitedNode)
115 var member = modelNode.Children.Where(x => !visitedNode.Contains(x)).FirstOrDefault(x => x == target);
118 var result =
new ModelNodePath();
120 visitedNode.Add(modelNode);
125 result.path.Add(
new NodePathItemMember { Name = member.Name });
127 else if (objectReference != null && objectReference.TargetNode != null)
130 if (objectReference.TargetNode != target)
131 result = GetPathRecursive(objectReference.TargetNode, target, visitedNode);
133 if (result.IsValid || target == objectReference.TargetNode)
135 result.Prepend(
new NodePathItemTarget());
138 else if (enumerableReference != null)
140 foreach (ObjectReference reference
in enumerableReference.Where(x => x.TargetNode != null))
143 result = GetPathRecursive(reference.
TargetNode, target, visitedNode);
145 if (result.IsValid || target == reference.
TargetNode)
148 result.Prepend(
new NodePathItemIndex {
Value = reference.Index });
156 foreach (var child
in modelNode.Children.Where(x => !visitedNode.Contains(x)))
158 result = GetPathRecursive(child, target, visitedNode);
161 result.Prepend(
new NodePathItemMember { Name = child.Name });
_Use_decl_annotations_ bool IsValid(DXGI_FORMAT fmt)
static ModelNodePath GetPath(IModelNode rootNode, IModelNode target)
Gets a new instance of ModelNodePath corresponding to the path of the given target node relative to t...
IContent Content
Gets the content of the IModelNode.
A class representing an enumeration of references to multiple objects.
IModelNode GetNode()
Gets the node corresponding to this path.
IModelNode TargetNode
Gets the model node targeted by this reference, if available.
A class representing a reference to another object that has a different model.
The IModelNode interface represents a node in a model object. A model object is represented by a grap...
A class describing the path of a node, relative to a root node. The path can cross references...
override string ToString()