From 004348f024af6aaa5f275f395098f6933d1304f3 Mon Sep 17 00:00:00 2001 From: naninunenoy Date: Sun, 15 Nov 2020 23:05:20 +0900 Subject: [PATCH 1/9] nodeProfile --- .../Editor/DependencyNode.meta | 8 +++++ .../Editor/DependencyNode/NodeId.cs | 25 +++++++++++++++ .../Editor/DependencyNode/NodeId.cs.meta | 11 +++++++ .../Editor/DependencyNode/NodeProfile.cs | 27 ++++++++++++++++ .../Editor/DependencyNode/NodeProfile.cs.meta | 11 +++++++ .../Editor/DependencyNode/Tests.meta | 8 +++++ ...Helper.DependencyGraph.Editor.Tests.asmdef | 17 ++++++++++ ...r.DependencyGraph.Editor.Tests.asmdef.meta | 7 +++++ .../Editor/DependencyNode/Tests/NodeIdTest.cs | 31 +++++++++++++++++++ .../DependencyNode/Tests/NodeIdTest.cs.meta | 11 +++++++ .../DependencyNode/Tests/NodeProfileTest.cs | 28 +++++++++++++++++ .../Tests/NodeProfileTest.cs.meta | 3 ++ 12 files changed, 187 insertions(+) create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeId.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeId.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/AsmdefHelper.DependencyGraph.Editor.Tests.asmdef create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/AsmdefHelper.DependencyGraph.Editor.Tests.asmdef.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeIdTest.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeIdTest.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProfileTest.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProfileTest.cs.meta diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode.meta new file mode 100644 index 0000000..40910f9 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bbaa68e4da2746ed9af5d76e173b5e8c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeId.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeId.cs new file mode 100644 index 0000000..c901d19 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeId.cs @@ -0,0 +1,25 @@ +using System; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode { + public readonly struct NodeId : IEquatable { + public readonly int value; + + public NodeId(int value) => this.value = value; + + public bool Equals(NodeId other) { + return value == other.value; + } + + public override bool Equals(object obj) { + return obj is NodeId other && Equals(other); + } + + public override int GetHashCode() { + return value; + } + + public override string ToString() { + return value.ToString(); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeId.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeId.cs.meta new file mode 100644 index 0000000..80d6e23 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeId.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 11a5fcf054a34f8083cdcdb038b4c70c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs new file mode 100644 index 0000000..aad6031 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs @@ -0,0 +1,27 @@ +using System; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode { + public readonly struct NodeProfile : IEquatable { + public readonly NodeId id; + public readonly string name; + + public NodeProfile(NodeId id, string name) { + this.id = id; + this.name = name; + } + + public bool Equals(NodeProfile other) { + return id.Equals(other.id) && name == other.name; + } + + public override bool Equals(object obj) { + return obj is NodeProfile other && Equals(other); + } + + public override int GetHashCode() { + unchecked { + return (id.GetHashCode() * 397) ^ (name != null ? name.GetHashCode() : 0); + } + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs.meta new file mode 100644 index 0000000..10b4358 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8cf71e8ce8054c4b95902fcd1bda7010 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests.meta new file mode 100644 index 0000000..4f235b8 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7f68a5c3b1e9b8b4aa69caf9b0838471 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/AsmdefHelper.DependencyGraph.Editor.Tests.asmdef b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/AsmdefHelper.DependencyGraph.Editor.Tests.asmdef new file mode 100644 index 0000000..b57e474 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/AsmdefHelper.DependencyGraph.Editor.Tests.asmdef @@ -0,0 +1,17 @@ +{ + "name": "AsmdefHelper.DependencyGraph.Editor.Tests", + "references": [ + "GUID:53e113411e7b0e947975fcd498b539aa" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": false, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/AsmdefHelper.DependencyGraph.Editor.Tests.asmdef.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/AsmdefHelper.DependencyGraph.Editor.Tests.asmdef.meta new file mode 100644 index 0000000..649977c --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/AsmdefHelper.DependencyGraph.Editor.Tests.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5b1e278775093cb40af4ebe716362ac9 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeIdTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeIdTest.cs new file mode 100644 index 0000000..2b296f7 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeIdTest.cs @@ -0,0 +1,31 @@ +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.TestTools; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { + public class NodeIdTest { + [Test] + public void TestNodeIdValue() { + var nodeId = new NodeId(123); + Assert.That(nodeId.value, Is.EqualTo(123)); + } + + [Test] + public void TestNodeIdEquals() { + var id1 = new NodeId(111); + var id2 = new NodeId(222); + var id3 = new NodeId(111); + Assert.That(id1, Is.EqualTo(id1)); + Assert.That(id1, Is.Not.EqualTo(id2)); + Assert.That(id1, Is.EqualTo(id3)); + } + + [Test] + public void TestNodeIdToString() { + var nodeId = new NodeId(999); + Assert.That(nodeId.ToString(), Is.EqualTo("999")); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeIdTest.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeIdTest.cs.meta new file mode 100644 index 0000000..8b81f4a --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeIdTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 946cb4c27532a5848a9cf8c9dea05df8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProfileTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProfileTest.cs new file mode 100644 index 0000000..de2d753 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProfileTest.cs @@ -0,0 +1,28 @@ +using System.Collections; +using NUnit.Framework; +using UnityEditor; +using UnityEngine.TestTools; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { + public class NodeProfileTest { + + [Test] + public void TestNodeProfile() { + var nodeProfile = new NodeProfile(new NodeId(123), "testNode"); + Assert.That(nodeProfile.id.value, Is.EqualTo(123)); + Assert.That(nodeProfile.name, Is.EqualTo("testNode")); + } + + [Test] + public void TestNodeProfileEquals() { + var profile1 = new NodeProfile(new NodeId(111), "testNode1"); + var profile2 = new NodeProfile(new NodeId(222), "testNode1"); + var profile3 = new NodeProfile(new NodeId(111), "testNode2"); + var profile4 = new NodeProfile(new NodeId(111), "testNode1"); + Assert.That(profile1, Is.EqualTo(profile1)); + Assert.That(profile1, Is.Not.EqualTo(profile2)); + Assert.That(profile1, Is.Not.EqualTo(profile3)); + Assert.That(profile1, Is.EqualTo(profile4)); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProfileTest.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProfileTest.cs.meta new file mode 100644 index 0000000..f404abf --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProfileTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6550a73c9df44f0092949ddd3ea5ac06 +timeCreated: 1605448488 \ No newline at end of file From beebf3e7c84401452397799be6135f0e258f8cb3 Mon Sep 17 00:00:00 2001 From: naninunenoy Date: Sun, 15 Nov 2020 23:29:49 +0900 Subject: [PATCH 2/9] HashSetDependencyNode --- .../DependencyNode/HashSetDependencyNode.cs | 15 +++++++++ .../HashSetDependencyNode.cs.meta | 3 ++ .../Editor/DependencyNode/IDependencyNode.cs | 9 +++++ .../DependencyNode/IDependencyNode.cs.meta | 3 ++ .../Editor/DependencyNode/NodeProfile.cs | 33 ++++++++++++------- .../Tests/HashSetDependencyNodeTest.cs | 19 +++++++++++ .../Tests/HashSetDependencyNodeTest.cs.meta | 3 ++ .../DependencyNode/Tests/NodeProfileTest.cs | 12 +++++-- 8 files changed, 83 insertions(+), 14 deletions(-) create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/HashSetDependencyNode.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/HashSetDependencyNode.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/IDependencyNode.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/IDependencyNode.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/HashSetDependencyNodeTest.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/HashSetDependencyNodeTest.cs.meta diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/HashSetDependencyNode.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/HashSetDependencyNode.cs new file mode 100644 index 0000000..7b82076 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/HashSetDependencyNode.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode { + public class HashSetDependencyNode : IDependencyNode { + public NodeProfile Profile { get; } + public ICollection Sources { get; } + public ICollection Destinations { get; } + + public HashSetDependencyNode(NodeProfile profile) { + Profile = profile; + Sources = new HashSet(); + Destinations = new HashSet(); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/HashSetDependencyNode.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/HashSetDependencyNode.cs.meta new file mode 100644 index 0000000..dc53403 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/HashSetDependencyNode.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3b278ba5cdda49eca5f5aa0b2941713d +timeCreated: 1605450089 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/IDependencyNode.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/IDependencyNode.cs new file mode 100644 index 0000000..ce222ff --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/IDependencyNode.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode { + public interface IDependencyNode { + NodeProfile Profile { get; } + ICollection Sources { get; } + ICollection Destinations { get; } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/IDependencyNode.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/IDependencyNode.cs.meta new file mode 100644 index 0000000..6f7f7cd --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/IDependencyNode.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 365c6defe4c649a496963187a24ffca0 +timeCreated: 1605449577 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs index aad6031..8d60374 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs @@ -1,26 +1,35 @@ using System; namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode { - public readonly struct NodeProfile : IEquatable { - public readonly NodeId id; - public readonly string name; + public class NodeProfile : IEquatable { + public NodeId Id { get; } + public string Name { set; get; } public NodeProfile(NodeId id, string name) { - this.id = id; - this.name = name; + Id = id; + Name = name; } - public bool Equals(NodeProfile other) { - return id.Equals(other.id) && name == other.name; + public bool Equals(NodeProfile other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return Id.Equals(other.Id) && Name == other.Name; } - public override bool Equals(object obj) { - return obj is NodeProfile other && Equals(other); + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((NodeProfile) obj); } - public override int GetHashCode() { - unchecked { - return (id.GetHashCode() * 397) ^ (name != null ? name.GetHashCode() : 0); + public override int GetHashCode() + { + unchecked + { + return (Id.GetHashCode() * 397) ^ (Name != null ? Name.GetHashCode() : 0); } } } diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/HashSetDependencyNodeTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/HashSetDependencyNodeTest.cs new file mode 100644 index 0000000..d588ad8 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/HashSetDependencyNodeTest.cs @@ -0,0 +1,19 @@ +using System.Collections; +using NUnit.Framework; +using UnityEditor; +using UnityEngine.TestTools; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { + public class HashSetDependencyNodeTest { + + [Test] + public void TestHashSetDependencyNode() { + var node = new HashSetDependencyNode(new NodeProfile(new NodeId(1), "node")); + Assert.That(node, Is.InstanceOf()); + Assert.That(node.Profile.Id, Is.EqualTo(1)); + Assert.That(node.Profile.Name, Is.EqualTo("node")); + Assert.That(node.Sources, Is.Empty); + Assert.That(node.Destinations, Is.Empty); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/HashSetDependencyNodeTest.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/HashSetDependencyNodeTest.cs.meta new file mode 100644 index 0000000..d321d6c --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/HashSetDependencyNodeTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cd573c4b7c3d450da36047e4e1e03824 +timeCreated: 1605450304 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProfileTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProfileTest.cs index de2d753..e2019b4 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProfileTest.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProfileTest.cs @@ -9,8 +9,8 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { [Test] public void TestNodeProfile() { var nodeProfile = new NodeProfile(new NodeId(123), "testNode"); - Assert.That(nodeProfile.id.value, Is.EqualTo(123)); - Assert.That(nodeProfile.name, Is.EqualTo("testNode")); + Assert.That(nodeProfile.Id.value, Is.EqualTo(123)); + Assert.That(nodeProfile.Name, Is.EqualTo("testNode")); } [Test] @@ -24,5 +24,13 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { Assert.That(profile1, Is.Not.EqualTo(profile3)); Assert.That(profile1, Is.EqualTo(profile4)); } + + + [Test] + public void TestNodeProfileName() { + var nodeProfile = new NodeProfile(new NodeId(123), "hoge"); + nodeProfile.Name = "testNode"; + Assert.That(nodeProfile.Name, Is.EqualTo("testNode")); + } } } From 029ee6515dde245f7928508abb01cdb32099a936 Mon Sep 17 00:00:00 2001 From: naninunenoy Date: Mon, 16 Nov 2020 01:17:52 +0900 Subject: [PATCH 3/9] NodeProcessor --- .../DependencyNode/HashSetDependencyNode.cs | 11 +- .../Editor/DependencyNode/NodeId.cs | 8 ++ .../Editor/DependencyNode/NodeProcessor.cs | 25 ++++ .../DependencyNode/NodeProcessor.cs.meta | 3 + .../Editor/DependencyNode/NodeProfile.cs | 8 ++ .../Tests/HashSetDependencyNodeTest.cs | 2 +- .../DependencyNode/Tests/NodeProcessorTest.cs | 112 ++++++++++++++++++ .../Tests/NodeProcessorTest.cs.meta | 3 + .../Editor/DependencyNode/Tests/Nodes.cs | 52 ++++++++ .../Editor/DependencyNode/Tests/Nodes.cs.meta | 3 + 10 files changed, 222 insertions(+), 5 deletions(-) create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProcessor.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProcessor.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProcessorTest.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProcessorTest.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/Nodes.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/Nodes.cs.meta diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/HashSetDependencyNode.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/HashSetDependencyNode.cs index 7b82076..7368efb 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/HashSetDependencyNode.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/HashSetDependencyNode.cs @@ -3,13 +3,16 @@ using System.Collections.Generic; namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode { public class HashSetDependencyNode : IDependencyNode { public NodeProfile Profile { get; } - public ICollection Sources { get; } - public ICollection Destinations { get; } + public ICollection Sources => sources; + public ICollection Destinations => destinations; + + readonly HashSet sources; + readonly HashSet destinations; public HashSetDependencyNode(NodeProfile profile) { Profile = profile; - Sources = new HashSet(); - Destinations = new HashSet(); + sources = new HashSet(); + destinations = new HashSet(); } } } diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeId.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeId.cs index c901d19..85bb52b 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeId.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeId.cs @@ -21,5 +21,13 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode { public override string ToString() { return value.ToString(); } + + public static bool operator ==(NodeId x, NodeId y) { + return x.Equals(y); + } + + public static bool operator !=(NodeId x, NodeId y) { + return !(x == y); + } } } diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProcessor.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProcessor.cs new file mode 100644 index 0000000..cda38d4 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProcessor.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Linq; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode { + public static class NodeProcessor { + + public static void SetBeRequiredNodes(IEnumerable nodes) { + var array = nodes as IDependencyNode[] ?? nodes.ToArray(); + var dict = array.ToDictionary(x => x.Profile.Id); + foreach (var n in array) { + foreach (var d in n.Destinations) { + dict[d.Id].Sources.Add(n.Profile); + } + } + } + + public static void SetRequireNodes(this IDependencyNode node, IEnumerable requireNodes) { + node.Sources.Clear(); + node.Destinations.Clear(); + foreach (var d in requireNodes) { + node.Destinations.Add(d); + } + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProcessor.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProcessor.cs.meta new file mode 100644 index 0000000..7a5ecf7 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProcessor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6febd7e408df42d89d561ffe371c602f +timeCreated: 1605454341 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs index 8d60374..fe71ff6 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/NodeProfile.cs @@ -32,5 +32,13 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode { return (Id.GetHashCode() * 397) ^ (Name != null ? Name.GetHashCode() : 0); } } + + public static bool operator ==(NodeProfile x, NodeProfile y) { + return x.Equals(y); + } + + public static bool operator !=(NodeProfile x, NodeProfile y) { + return !(x == y); + } } } diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/HashSetDependencyNodeTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/HashSetDependencyNodeTest.cs index d588ad8..cd670cd 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/HashSetDependencyNodeTest.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/HashSetDependencyNodeTest.cs @@ -10,7 +10,7 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { public void TestHashSetDependencyNode() { var node = new HashSetDependencyNode(new NodeProfile(new NodeId(1), "node")); Assert.That(node, Is.InstanceOf()); - Assert.That(node.Profile.Id, Is.EqualTo(1)); + Assert.That(node.Profile.Id.value, Is.EqualTo(1)); Assert.That(node.Profile.Name, Is.EqualTo("node")); Assert.That(node.Sources, Is.Empty); Assert.That(node.Destinations, Is.Empty); diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProcessorTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProcessorTest.cs new file mode 100644 index 0000000..f78592b --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProcessorTest.cs @@ -0,0 +1,112 @@ +using System.Collections; +using System.Linq; +using NUnit.Framework; +using UnityEditor; +using UnityEngine.TestTools; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { + public class NodeProcessorTest { + + [SetUp] + public void SetUpBeforeEveryTest() { + Nodes.Init(); + } + + [Test] + public void TestSetRequireNodes() { + var node = new HashSetDependencyNode(new NodeProfile(new NodeId(0), "node0")); + var p1 = new NodeProfile(new NodeId(1), "node1"); + var p2 = new NodeProfile(new NodeId(2), "node2"); + var p3 = new NodeProfile(new NodeId(3), "node3"); + node.Sources.Add(p3); + node.SetRequireNodes(new[] { p1, p2 }); + Assert.That(node.Destinations.Count, Is.EqualTo(2)); + Assert.That(node.Destinations.Any(x => x.Equals(p1))); + Assert.That(node.Destinations.Any(x => x.Equals(p2))); + Assert.That(node.Sources.Count, Is.Zero); + } + + [Test] + public void TestLinerNodeDependency() { + // [0]--->[1] + Nodes._0.SetRequireNodes(new[] { Profiles._1}); + NodeProcessor.SetBeRequiredNodes(new[] { Nodes._0, Nodes._1 }); + Assert.That(Nodes._1.Sources.Any(x => x.Equals(Profiles._0))); + } + + + static void SetSomeNodeDependency() { + /* + * ┌->[1]-┐ + * [0]-┴->[2]-┴->[4]--->[5]--->[6] + * │ │ + * V │ + * [3]<-----------┘ + * + * [7]--->[8] [9] + * + * + */ + Nodes._0.SetRequireNodes(new[] { Profiles._1, Profiles._2 }); + Nodes._1.SetRequireNodes(new[] { Profiles._4 }); + Nodes._2.SetRequireNodes(new[] { Profiles._3, Profiles._4 }); + Nodes._4.SetRequireNodes(new[] { Profiles._5 }); + Nodes._5.SetRequireNodes(new[] { Profiles._3, Profiles._6 }); + Nodes._7.SetRequireNodes(new[] { Profiles._8 }); + } + + [Test] + public void TestSomeNodeDependency() { + SetSomeNodeDependency(); + NodeProcessor.SetBeRequiredNodes(Nodes.All); + // 0 + Assert.That(Nodes._0.Sources, Is.Empty); + Assert.That(Nodes._0.Destinations.Count, Is.EqualTo(2)); + Assert.That(Nodes._0.Destinations.Any(x => x == Profiles._1)); + Assert.That(Nodes._0.Destinations.Any(x => x == Profiles._2)); + // 1 + Assert.That(Nodes._1.Destinations.Count, Is.EqualTo(1)); + Assert.That(Nodes._1.Sources.Any(x => x == Profiles._0)); + Assert.That(Nodes._1.Destinations.Count, Is.EqualTo(1)); + Assert.That(Nodes._1.Destinations.Any(x => x == Profiles._4)); + // 2 + Assert.That(Nodes._2.Sources.Count, Is.EqualTo(1)); + Assert.That(Nodes._2.Sources.Any(x => x == Profiles._0)); + Assert.That(Nodes._2.Destinations.Count, Is.EqualTo(2)); + Assert.That(Nodes._2.Destinations.Any(x => x == Profiles._3)); + Assert.That(Nodes._2.Destinations.Any(x => x == Profiles._4)); + // 3 + Assert.That(Nodes._3.Sources.Count, Is.EqualTo(2)); + Assert.That(Nodes._3.Sources.Any(x => x == Profiles._2)); + Assert.That(Nodes._3.Sources.Any(x => x == Profiles._5)); + Assert.That(Nodes._3.Destinations, Is.Empty); + // 4 + Assert.That(Nodes._4.Sources.Count, Is.EqualTo(2)); + Assert.That(Nodes._4.Sources.Any(x => x == Profiles._1)); + Assert.That(Nodes._4.Sources.Any(x => x == Profiles._2)); + Assert.That(Nodes._4.Destinations.Count, Is.EqualTo(1)); + Assert.That(Nodes._4.Destinations.Any(x => x == Profiles._5)); + // 5 + Assert.That(Nodes._5.Sources.Count, Is.EqualTo(1)); + Assert.That(Nodes._5.Sources.Any(x => x == Profiles._4)); + Assert.That(Nodes._5.Destinations.Count, Is.EqualTo(2)); + Assert.That(Nodes._5.Destinations.Any(x => x == Profiles._3)); + Assert.That(Nodes._5.Destinations.Any(x => x == Profiles._6)); + // 6 + Assert.That(Nodes._6.Sources.Count, Is.EqualTo(1)); + Assert.That(Nodes._6.Sources.Any(x => x == Profiles._5)); + Assert.That(Nodes._6.Destinations, Is.Empty); + // 7 + Assert.That(Nodes._7.Sources, Is.Empty); + Assert.That(Nodes._7.Destinations.Count, Is.EqualTo(1)); + Assert.That(Nodes._7.Destinations.Any(x => x == Profiles._8)); + // 8 + Assert.That(Nodes._8.Sources.Count, Is.EqualTo(1)); + Assert.That(Nodes._8.Sources.Any(x => x == Profiles._7)); + Assert.That(Nodes._8.Destinations, Is.Empty); + // 9 + Assert.That(Nodes._9.Sources, Is.Empty); + Assert.That(Nodes._9.Destinations, Is.Empty); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProcessorTest.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProcessorTest.cs.meta new file mode 100644 index 0000000..97797c0 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProcessorTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9e86a8d93f3a4bb5a7c6d81b775efb47 +timeCreated: 1605450647 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/Nodes.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/Nodes.cs new file mode 100644 index 0000000..132f883 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/Nodes.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { + + public static class Ids { + public static readonly NodeId _0 = new NodeId(0); + public static readonly NodeId _1 = new NodeId(1); + public static readonly NodeId _2 = new NodeId(2); + public static readonly NodeId _3 = new NodeId(3); + public static readonly NodeId _4 = new NodeId(4); + public static readonly NodeId _5 = new NodeId(5); + public static readonly NodeId _6 = new NodeId(6); + public static readonly NodeId _7 = new NodeId(7); + public static readonly NodeId _8 = new NodeId(8); + public static readonly NodeId _9 = new NodeId(9); + } + public static class Profiles { + public static readonly NodeProfile _0 = new NodeProfile(Ids._0, "node0"); + public static readonly NodeProfile _1 = new NodeProfile(Ids._1, "node1"); + public static readonly NodeProfile _2 = new NodeProfile(Ids._2, "node2"); + public static readonly NodeProfile _3 = new NodeProfile(Ids._3, "node3"); + public static readonly NodeProfile _4 = new NodeProfile(Ids._4, "node4"); + public static readonly NodeProfile _5 = new NodeProfile(Ids._5, "node5"); + public static readonly NodeProfile _6 = new NodeProfile(Ids._6, "node6"); + public static readonly NodeProfile _7 = new NodeProfile(Ids._7, "node7"); + public static readonly NodeProfile _8 = new NodeProfile(Ids._8, "node8"); + public static readonly NodeProfile _9 = new NodeProfile(Ids._9, "node9"); + } + public static class Nodes { + public static readonly IDependencyNode _0 = new HashSetDependencyNode(Profiles._0); + public static readonly IDependencyNode _1 = new HashSetDependencyNode(Profiles._1); + public static readonly IDependencyNode _2 = new HashSetDependencyNode(Profiles._2); + public static readonly IDependencyNode _3 = new HashSetDependencyNode(Profiles._3); + public static readonly IDependencyNode _4 = new HashSetDependencyNode(Profiles._4); + public static readonly IDependencyNode _5 = new HashSetDependencyNode(Profiles._5); + public static readonly IDependencyNode _6 = new HashSetDependencyNode(Profiles._6); + public static readonly IDependencyNode _7 = new HashSetDependencyNode(Profiles._7); + public static readonly IDependencyNode _8 = new HashSetDependencyNode(Profiles._8); + public static readonly IDependencyNode _9 = new HashSetDependencyNode(Profiles._9); + + public static readonly IEnumerable All = new[] { + _0, _1, _2, _3, _4, _5, _6, _7, _8, _9 + }; + + public static void Init() { + foreach (var n in All) { + n.Sources.Clear(); + n.Destinations.Clear(); + } + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/Nodes.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/Nodes.cs.meta new file mode 100644 index 0000000..6e9b2d3 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/Nodes.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 55ca469364f847a4827a9f2ed13c7ef4 +timeCreated: 1605451653 \ No newline at end of file From 5ec5d749c3c68a9d69715a4f0dae9f267a19a236 Mon Sep 17 00:00:00 2001 From: naninunenoy Date: Mon, 16 Nov 2020 01:56:27 +0900 Subject: [PATCH 4/9] node position --- .../DependencyGraph/Editor/NodeView.meta | 8 ++++++ .../Editor/NodeView/INodeView.cs | 5 ++++ .../Editor/NodeView/INodeView.cs.meta | 3 +++ .../DependencyGraph/Editor/NodeView/IRect.cs | 23 +++++++++++++++++ .../Editor/NodeView/IRect.cs.meta | 3 +++ .../Editor/NodeView/UiElementsNodeView.cs | 25 +++++++++++++++++++ .../NodeView/UiElementsNodeView.cs.meta | 3 +++ 7 files changed, 70 insertions(+) create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/NodeView.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/INodeView.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/INodeView.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IRect.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IRect.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs.meta diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView.meta new file mode 100644 index 0000000..da08a93 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 317ec7aeddbdec848819fcfcfcb8becb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/INodeView.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/INodeView.cs new file mode 100644 index 0000000..1d099bf --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/INodeView.cs @@ -0,0 +1,5 @@ +namespace AsmdefHelper.DependencyGraph.Editor.NodeView { + public interface INodeView : IRect { + string Label { set; get; } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/INodeView.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/INodeView.cs.meta new file mode 100644 index 0000000..4877a07 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/INodeView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 95c599809404452380ee0c65390284e4 +timeCreated: 1605457329 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IRect.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IRect.cs new file mode 100644 index 0000000..3326e19 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IRect.cs @@ -0,0 +1,23 @@ +using UnityEngine; + +namespace AsmdefHelper.DependencyGraph.Editor.NodeView { + public interface IRect { + float PositionX { set; get; } + float PositionY { set; get; } + float Height { get; } + float Width { get; } + } + + public static class ViewExtension { + public static Vector2 GetPositionXY(this IRect rect) { + return new Vector2(rect.PositionX, rect.PositionY); + } + public static void SetPositionXY(this IRect rect, Vector2 pos) { + rect.PositionX = pos.x; + rect.PositionY = pos.y; + } + public static Rect AsRect(this IRect rect) { + return new Rect(rect.PositionX, rect.PositionY, rect.Width, rect.Height); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IRect.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IRect.cs.meta new file mode 100644 index 0000000..e277dd4 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IRect.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3ba20ae9f4964efaa46e9fd6f83dd819 +timeCreated: 1605458617 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs new file mode 100644 index 0000000..1a19c5e --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs @@ -0,0 +1,25 @@ +using UnityEditor.Graphs; + +namespace AsmdefHelper.DependencyGraph.Editor.NodeView { + public class UiElementsNodeView : Node, INodeView { + + string INodeView.Label { + get => title; + set => title = value; + } + + float IRect.PositionX { + get => position.x; + set => position.x = value; + } + + float IRect.PositionY { + get => position.y; + set => position.y = value; + } + + float IRect.Height => position.height; + + float IRect.Width => position.width; + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs.meta new file mode 100644 index 0000000..90b6220 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fc7014a6a7494dbcbc43466c7dbcdffa +timeCreated: 1605457452 \ No newline at end of file From 2cba3e7e955ec62cc264c2d0c80e0764b195d716 Mon Sep 17 00:00:00 2001 From: naninunenoy Date: Tue, 17 Nov 2020 01:37:08 +0900 Subject: [PATCH 5/9] LinerSortStrategy --- .../Editor/DependencyNode/Sort.meta | 3 + .../Sort/DependencyNodeExtensions.cs | 22 ++++++++ .../Sort/DependencyNodeExtensions.cs.meta | 11 ++++ .../DependencyNode/Sort/ISortStrategy.cs | 7 +++ .../DependencyNode/Sort/ISortStrategy.cs.meta | 3 + .../DependencyNode/Sort/LinerSortStrategy.cs | 31 ++++++++++ .../Sort/LinerSortStrategy.cs.meta | 3 + .../Editor/DependencyNode/Sort/SortedNode.cs | 8 +++ .../DependencyNode/Sort/SortedNode.cs.meta | 3 + .../Tests/DependencyNodeExtensionsTest.cs | 56 +++++++++++++++++++ .../DependencyNodeExtensionsTest.cs.meta | 3 + .../DependencyNode/Tests/LinerSortTest.cs | 43 ++++++++++++++ .../Tests/LinerSortTest.cs.meta | 3 + .../DependencyNode/Tests/NodeProcessorTest.cs | 23 +------- .../Editor/DependencyNode/Tests/Nodes.cs | 19 +++++++ 15 files changed, 216 insertions(+), 22 deletions(-) create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/DependencyNodeExtensions.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/DependencyNodeExtensions.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/ISortStrategy.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/ISortStrategy.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/LinerSortStrategy.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/LinerSortStrategy.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SortedNode.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SortedNode.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/DependencyNodeExtensionsTest.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/DependencyNodeExtensionsTest.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs.meta diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort.meta new file mode 100644 index 0000000..7581d51 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d7b935eca30945f5bff132d6a7645320 +timeCreated: 1605459681 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/DependencyNodeExtensions.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/DependencyNodeExtensions.cs new file mode 100644 index 0000000..ac694f3 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/DependencyNodeExtensions.cs @@ -0,0 +1,22 @@ +using System.Linq; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { + public static class DependencyNodeExtensions { + public static bool IsSourceEmpty(this IDependencyNode node) { + return !node.Sources.Any(); + } + public static bool IsDestinationEmpty(this IDependencyNode node) { + return !node.Destinations.Any(); + } + public static bool IsEmptyDependency(this IDependencyNode node) { + return node.IsSourceEmpty() && node.IsDestinationEmpty(); + } + public static int CountDependencies(this IDependencyNode node) { + return node.Sources.Count + node.Destinations.Count; + } + public static bool ContainsSelfReference(this IDependencyNode node) { + return node.Sources.Any(x => x == node.Profile) || + node.Destinations.Any(x => x == node.Profile); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/DependencyNodeExtensions.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/DependencyNodeExtensions.cs.meta new file mode 100644 index 0000000..b4a0c34 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/DependencyNodeExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8d0cee1bf7d4c8c47a98a23879a257cb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/ISortStrategy.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/ISortStrategy.cs new file mode 100644 index 0000000..6722df9 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/ISortStrategy.cs @@ -0,0 +1,7 @@ +using System.Collections.Generic; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { + public interface ISortStrategy { + IEnumerable Sort(IEnumerable nodes); + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/ISortStrategy.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/ISortStrategy.cs.meta new file mode 100644 index 0000000..e055f38 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/ISortStrategy.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3e2c63741aae4306aa49389ffdcb2e13 +timeCreated: 1605459681 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/LinerSortStrategy.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/LinerSortStrategy.cs new file mode 100644 index 0000000..fd613dd --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/LinerSortStrategy.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { + public class LinerSortStrategy : ISortStrategy { + readonly Vector2 originPosition; + readonly float basicDistance; + readonly float nodeWidth; + readonly float nodeHeight; + + public LinerSortStrategy(Vector2 originPosition, float basicDistance, float nodeWidth, float nodeHeight) { + this.originPosition = originPosition; + this.basicDistance = basicDistance; + this.nodeWidth = nodeWidth; + this.nodeHeight = nodeHeight; + } + + IEnumerable ISortStrategy.Sort(IEnumerable nodes) { + var arr = nodes.ToArray(); + var posDict = arr + .ToDictionary(x => x.Profile, _ => originPosition); + // 参照元がないNodeを原点に + var left = arr.FirstOrDefault(x => x.IsSourceEmpty()); + posDict[left.Profile] = originPosition; + var right = arr.FirstOrDefault(x => x.Profile != left.Profile); + posDict[right.Profile] = new Vector2(nodeWidth / 2.0F + basicDistance, 0.0F) + originPosition; + return posDict.Select(x => new SortedNode { Profile = x.Key, Position = x.Value }); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/LinerSortStrategy.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/LinerSortStrategy.cs.meta new file mode 100644 index 0000000..474a57d --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/LinerSortStrategy.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7d00de9a7b3041be922c457f9f53b1c0 +timeCreated: 1605459871 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SortedNode.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SortedNode.cs new file mode 100644 index 0000000..530dc2d --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SortedNode.cs @@ -0,0 +1,8 @@ +using UnityEngine; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { + public class SortedNode { + public NodeProfile Profile { set; get; } + public Vector2 Position { set; get; } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SortedNode.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SortedNode.cs.meta new file mode 100644 index 0000000..e6751dc --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SortedNode.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c995f86b2ebe4c83ac65ec6727431ddb +timeCreated: 1605459738 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/DependencyNodeExtensionsTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/DependencyNodeExtensionsTest.cs new file mode 100644 index 0000000..008a386 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/DependencyNodeExtensionsTest.cs @@ -0,0 +1,56 @@ +using System.Collections; +using AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort; +using NUnit.Framework; +using UnityEditor; +using UnityEngine.TestTools; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { + public class DependencyNodeExtensionsTest { + + [SetUp] + public void SetUpBeforeEveryTest() { + Nodes.Init(); + // [0]--->[1]--->[2]<---[3] [4] + Nodes._0.SetRequireNodes(new[] { Profiles._1 }); + Nodes._1.SetRequireNodes(new[] { Profiles._2 }); + Nodes._3.SetRequireNodes(new[] { Profiles._2 }); + NodeProcessor.SetBeRequiredNodes(new[] { Nodes._0, Nodes._1, Nodes._2, Nodes._3, Nodes._4 }); + } + + [Test] + public void TestIsSourceEmpty() { + Assert.That(Nodes._0.IsSourceEmpty(), Is.True); + Assert.That(Nodes._1.IsSourceEmpty(), Is.False); + Assert.That(Nodes._2.IsSourceEmpty(), Is.False); + Assert.That(Nodes._3.IsSourceEmpty(), Is.True); + Assert.That(Nodes._4.IsSourceEmpty(), Is.True); + } + + [Test] + public void TestIsDestinationEmpty() { + Assert.That(Nodes._0.IsDestinationEmpty(), Is.False); + Assert.That(Nodes._1.IsDestinationEmpty(), Is.False); + Assert.That(Nodes._2.IsDestinationEmpty(), Is.True); + Assert.That(Nodes._3.IsDestinationEmpty(), Is.False); + Assert.That(Nodes._4.IsDestinationEmpty(), Is.True); + } + + [Test] + public void TestIsEmptyDependency() { + Assert.That(Nodes._0.IsEmptyDependency(), Is.False); + Assert.That(Nodes._1.IsEmptyDependency(), Is.False); + Assert.That(Nodes._2.IsEmptyDependency(), Is.False); + Assert.That(Nodes._3.IsEmptyDependency(), Is.False); + Assert.That(Nodes._4.IsEmptyDependency(), Is.True); + } + + [Test] + public void TestCountDependencies() { + Assert.That(Nodes._0.CountDependencies(), Is.EqualTo(1)); + Assert.That(Nodes._1.CountDependencies(), Is.EqualTo(2)); + Assert.That(Nodes._2.CountDependencies(), Is.EqualTo(2)); + Assert.That(Nodes._3.CountDependencies(), Is.EqualTo(1)); + Assert.That(Nodes._4.CountDependencies(), Is.EqualTo(0)); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/DependencyNodeExtensionsTest.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/DependencyNodeExtensionsTest.cs.meta new file mode 100644 index 0000000..22b81f5 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/DependencyNodeExtensionsTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 95cc92d669584f4bacd5faf7b1e78320 +timeCreated: 1605543283 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs new file mode 100644 index 0000000..b810ccf --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs @@ -0,0 +1,43 @@ +using System.Collections; +using System.Linq; +using AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort; +using NUnit.Framework; +using UnityEditor; +using UnityEngine; +using UnityEngine.TestTools; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { + public class LinerSortTest { + const float d = 10.0F; + const float w = 10.0F; + const float h = 10.0F; + const float e = 0.0001F; + ISortStrategy sortStrategy; + + [SetUp] + public void SetUpBeforeEveryTest() { + Nodes.Init(); + sortStrategy = new LinerSortStrategy(Vector2.zero, d, w, h); + } + + + [Test] + public void TestLinerNodeDependency() { + var nodes = new[] { Nodes._0, Nodes._1 }; + // [0]--->[1] + Nodes._0.SetRequireNodes(new[] { Profiles._1}); + NodeProcessor.SetBeRequiredNodes(nodes); + + var result = sortStrategy.Sort(nodes).ToArray(); + var node0 = result.FirstOrDefault(x => x.Profile == Profiles._0); + var node1 = result.FirstOrDefault(x => x.Profile == Profiles._1); + + Assert.That(node0, Is.Not.Null); + Assert.That(node0.Position.x, Is.Zero); + Assert.That(node0.Position.y, Is.Zero); + Assert.That(node1, Is.Not.Null); + Assert.That(node1.Position.x, Is.EqualTo(node0.Position.x + d + (w / 2.0F)).Within(e)); + Assert.That(node1.Position.y, Is.EqualTo(node0.Position.y).Within(e)); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs.meta new file mode 100644 index 0000000..8df4532 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ecac0d687a574143a409b043040ce933 +timeCreated: 1605460235 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProcessorTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProcessorTest.cs index f78592b..5a1bd22 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProcessorTest.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeProcessorTest.cs @@ -34,30 +34,9 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { Assert.That(Nodes._1.Sources.Any(x => x.Equals(Profiles._0))); } - - static void SetSomeNodeDependency() { - /* - * ┌->[1]-┐ - * [0]-┴->[2]-┴->[4]--->[5]--->[6] - * │ │ - * V │ - * [3]<-----------┘ - * - * [7]--->[8] [9] - * - * - */ - Nodes._0.SetRequireNodes(new[] { Profiles._1, Profiles._2 }); - Nodes._1.SetRequireNodes(new[] { Profiles._4 }); - Nodes._2.SetRequireNodes(new[] { Profiles._3, Profiles._4 }); - Nodes._4.SetRequireNodes(new[] { Profiles._5 }); - Nodes._5.SetRequireNodes(new[] { Profiles._3, Profiles._6 }); - Nodes._7.SetRequireNodes(new[] { Profiles._8 }); - } - [Test] public void TestSomeNodeDependency() { - SetSomeNodeDependency(); + Nodes.SetSomeNodeDependency(); NodeProcessor.SetBeRequiredNodes(Nodes.All); // 0 Assert.That(Nodes._0.Sources, Is.Empty); diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/Nodes.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/Nodes.cs index 132f883..a66ab94 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/Nodes.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/Nodes.cs @@ -48,5 +48,24 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { n.Destinations.Clear(); } } + + public static void SetSomeNodeDependency() { + /* + * ┌->[1]-┐ + * [0]-┴->[2]-┴->[4]--->[5]--->[6] + * │ │ + * V │ + * [3]<-----------┘ + * + * [7]--->[8] [9] + * + */ + Nodes._0.SetRequireNodes(new[] { Profiles._1, Profiles._2 }); + Nodes._1.SetRequireNodes(new[] { Profiles._4 }); + Nodes._2.SetRequireNodes(new[] { Profiles._3, Profiles._4 }); + Nodes._4.SetRequireNodes(new[] { Profiles._5 }); + Nodes._5.SetRequireNodes(new[] { Profiles._3, Profiles._6 }); + Nodes._7.SetRequireNodes(new[] { Profiles._8 }); + } } } From a55f46e7c353b3edebe5ab0c7cf4e8cfaf3a9773 Mon Sep 17 00:00:00 2001 From: naninunenoy Date: Tue, 17 Nov 2020 02:43:02 +0900 Subject: [PATCH 6/9] RandomSortStrategy --- .../Editor/DependencyNode/Sort/NodeGrid.cs | 32 +++++++++++++++++ .../DependencyNode/Sort/NodeGrid.cs.meta | 3 ++ .../DependencyNode/Sort/RandomSortStrategy.cs | 35 +++++++++++++++++++ .../Sort/RandomSortStrategy.cs.meta | 3 ++ .../Sort/SquareValueProvider.cs | 19 ++++++++++ .../Sort/SquareValueProvider.cs.meta | 3 ++ ...erSortTest.cs => LinerSortStrategyTest.cs} | 3 +- ....cs.meta => LinerSortStrategyTest.cs.meta} | 0 .../DependencyNode/Tests/NodeGridTest.cs | 27 ++++++++++++++ .../DependencyNode/Tests/NodeGridTest.cs.meta | 3 ++ .../Tests/RandomSortStrategyTest.cs | 34 ++++++++++++++++++ .../Tests/RandomSortStrategyTest.cs.meta | 3 ++ .../Tests/SquareValueProviderTest.cs | 31 ++++++++++++++++ .../Tests/SquareValueProviderTest.cs.meta | 3 ++ 14 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SquareValueProvider.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SquareValueProvider.cs.meta rename Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/{LinerSortTest.cs => LinerSortStrategyTest.cs} (97%) rename Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/{LinerSortTest.cs.meta => LinerSortStrategyTest.cs.meta} (100%) create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/RandomSortStrategyTest.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/RandomSortStrategyTest.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/SquareValueProviderTest.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/SquareValueProviderTest.cs.meta diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs new file mode 100644 index 0000000..7b00e0a --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { + public class NodeGrid { + public readonly float GridSize; + readonly int gridSideCount; + public readonly int GridCount; + + public NodeGrid(float nodeWidth, float nodeDistance, int nodeCount) { + GridSize = nodeDistance + nodeWidth / 2.0F; + gridSideCount = SquareValueProvider.ProvideNearestSquareValue(nodeCount); + GridCount = gridSideCount * gridSideCount; + } + + public IReadOnlyList GridCenterPositions() { + var grids = new Vector2[GridCount]; + var index = 0; + var y = 0.0F; + for (var i = 0; i < gridSideCount; i++) { + var x = 0.0F; + for (var j = 0; j < gridSideCount; j++) { + grids[index] = new Vector2(x, y); + x += GridSize; + index++; + } + y += GridSize; + } + return grids; + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs.meta new file mode 100644 index 0000000..97be2a8 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bf9e7d3635b441398a2011b98e35610b +timeCreated: 1605545271 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs new file mode 100644 index 0000000..c16edb7 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { + public class RandomSortStrategy : ISortStrategy { + readonly Vector2 originPosition; + readonly float basicDistance; + readonly float nodeWidth; + readonly float nodeHeight; + + public RandomSortStrategy(Vector2 originPosition, float basicDistance, float nodeWidth, float nodeHeight) { + this.originPosition = originPosition; + this.basicDistance = basicDistance; + this.nodeWidth = nodeWidth; + this.nodeHeight = nodeHeight; + } + public IEnumerable Sort(IEnumerable nodes) { + var nodeArr = nodes + .Select(x => new SortedNode { Profile = x.Profile, Position = originPosition }) + .ToArray(); + var nodeGrid = new NodeGrid(nodeWidth, basicDistance, nodeArr.Length); + var positions = nodeGrid.GridCenterPositions(); + var indexes = Enumerable.Range(0, positions.Count).ToList(); + + foreach (var node in nodeArr) { + var randomIndex = indexes[Random.Range(0, indexes.Count)]; + node.Position = positions[randomIndex] + originPosition; + indexes.Remove(randomIndex); + } + + return nodeArr; + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs.meta new file mode 100644 index 0000000..c60919a --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f63fbb77026544bb82b0ddf7e2b507b0 +timeCreated: 1605544752 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SquareValueProvider.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SquareValueProvider.cs new file mode 100644 index 0000000..da719fd --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SquareValueProvider.cs @@ -0,0 +1,19 @@ +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { + public static class SquareValueProvider { + public static int ProvideNearestSquareValue(int count) { + if (count < 1) return 0; + if (count == 1) return 1; + var value = 1; + while (value < 100) { + var square = value * value; + var nextValue = value + 1; + var nextSquare = nextValue * nextValue; + value = nextValue; + if (square <= count && count <= nextSquare) { + break; + } + } + return value; + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SquareValueProvider.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SquareValueProvider.cs.meta new file mode 100644 index 0000000..1fc3110 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/SquareValueProvider.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b8521b362be64b7eb1bcf8174be0ecf8 +timeCreated: 1605545553 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortStrategyTest.cs similarity index 97% rename from Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs rename to Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortStrategyTest.cs index b810ccf..162453d 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortStrategyTest.cs @@ -7,7 +7,7 @@ using UnityEngine; using UnityEngine.TestTools; namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { - public class LinerSortTest { + public class LinerSortStrategyTest { const float d = 10.0F; const float w = 10.0F; const float h = 10.0F; @@ -20,7 +20,6 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { sortStrategy = new LinerSortStrategy(Vector2.zero, d, w, h); } - [Test] public void TestLinerNodeDependency() { var nodes = new[] { Nodes._0, Nodes._1 }; diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortStrategyTest.cs.meta similarity index 100% rename from Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortTest.cs.meta rename to Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/LinerSortStrategyTest.cs.meta diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs new file mode 100644 index 0000000..4428bbd --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs @@ -0,0 +1,27 @@ +using System.Collections; +using AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort; +using NUnit.Framework; +using UnityEditor; +using UnityEngine.TestTools; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { + public class NodeGridTest { + + [Test] + public void TestNodeGrid() { + const float e = 0.000001F; + var nodeGrid = new NodeGrid(10.0F, 10.0F, 4); + Assert.That(nodeGrid.GridCount, Is.EqualTo(4)); + Assert.That(nodeGrid.GridSize, Is.EqualTo(15.0F).Within(e)); + var grids = nodeGrid.GridCenterPositions(); + Assert.That(grids[0].x, Is.EqualTo(0.0F).Within(e)); + Assert.That(grids[0].y, Is.EqualTo(0.0F).Within(e)); + Assert.That(grids[1].x, Is.EqualTo(15.0F).Within(e)); + Assert.That(grids[1].y, Is.EqualTo(0.0F).Within(e)); + Assert.That(grids[2].x, Is.EqualTo(0.0F).Within(e)); + Assert.That(grids[2].y, Is.EqualTo(15.0F).Within(e)); + Assert.That(grids[3].x, Is.EqualTo(15.0F).Within(e)); + Assert.That(grids[3].y, Is.EqualTo(15.0F).Within(e)); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs.meta new file mode 100644 index 0000000..19eee0a --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 43541e9cd66e4df59c2cac11ada769fe +timeCreated: 1605546997 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/RandomSortStrategyTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/RandomSortStrategyTest.cs new file mode 100644 index 0000000..8eb16c9 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/RandomSortStrategyTest.cs @@ -0,0 +1,34 @@ +using System.Collections; +using System.Linq; +using AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort; +using NUnit.Framework; +using UnityEditor; +using UnityEngine; +using UnityEngine.TestTools; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { + public class RandomSortStrategyTest { + const float d = 10.0F; + const float w = 10.0F; + const float h = 10.0F; + const float e = 0.0001F; + ISortStrategy sortStrategy; + + [SetUp] + public void SetUpBeforeEveryTest() { + Nodes.Init(); + sortStrategy = new RandomSortStrategy(Vector2.zero, d, w, h); + } + + [Test] + public void TestLinerNodeDependency() { + var result = sortStrategy.Sort(Nodes.All).ToArray(); + foreach (var node in result) { + var others = result.Where(x => x.Profile != node.Profile); + foreach (var other in others) { + Assert.That(node.Position, Is.Not.EqualTo(other.Position).Within(e)); + } + } + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/RandomSortStrategyTest.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/RandomSortStrategyTest.cs.meta new file mode 100644 index 0000000..9e8fae1 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/RandomSortStrategyTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fa8b199e711d454f92390170a758b146 +timeCreated: 1605544903 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/SquareValueProviderTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/SquareValueProviderTest.cs new file mode 100644 index 0000000..665a94e --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/SquareValueProviderTest.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections; +using AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort; +using NUnit.Framework; +using UnityEditor; +using UnityEngine.TestTools; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { + public class SquareValueProviderTest { + + [Test] + public void TestProvideNearestSquareValue() { + var ans = SquareValueProvider.ProvideNearestSquareValue(0); + Assert.That(ans, Is.EqualTo(0)); + ans = SquareValueProvider.ProvideNearestSquareValue(1); + Assert.That(ans, Is.EqualTo(1)); + ans = SquareValueProvider.ProvideNearestSquareValue(4); + Assert.That(ans, Is.EqualTo(2)); + ans = SquareValueProvider.ProvideNearestSquareValue(8); + Assert.That(ans, Is.EqualTo(3)); + ans = SquareValueProvider.ProvideNearestSquareValue(9); + Assert.That(ans, Is.EqualTo(3)); + ans = SquareValueProvider.ProvideNearestSquareValue(10); + Assert.That(ans, Is.EqualTo(4)); + ans = SquareValueProvider.ProvideNearestSquareValue(10001); + Assert.That(ans, Is.EqualTo(100)); + ans = SquareValueProvider.ProvideNearestSquareValue(-1); + Assert.That(ans, Is.EqualTo(0)); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/SquareValueProviderTest.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/SquareValueProviderTest.cs.meta new file mode 100644 index 0000000..0ee97b7 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/SquareValueProviderTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 917495e8285943d4a194235a789c7bc1 +timeCreated: 1605545948 \ No newline at end of file From ff6b37420a77c11aa0ea7d13db91e41c12c5f51b Mon Sep 17 00:00:00 2001 From: naninunenoy Date: Thu, 19 Nov 2020 01:39:32 +0900 Subject: [PATCH 7/9] =?UTF-8?q?=E3=83=A9=E3=83=B3=E3=83=80=E3=83=A0?= =?UTF-8?q?=E3=81=AB=E6=95=B4=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/AsmdefDependency.cs | 13 ---- .../Editor/AsmdefDependency.cs.meta | 11 ---- .../Editor/AsmdefGraphEditorWindow.cs | 10 +--- .../DependencyGraph/Editor/AsmdefGraphView.cs | 59 +++++++++++++++---- .../DependencyGraph/Editor/AsmdefNode.cs | 24 ++++---- .../Editor/DependencyNode/Sort/NodeGrid.cs | 14 +++-- .../DependencyNode/Sort/RandomSortStrategy.cs | 2 +- .../DependencyNode/Tests/NodeGridTest.cs | 3 +- .../DependencyGraph/Editor/IAsmdefNodeView.cs | 8 +++ .../Editor/IAsmdefNodeView.cs.meta | 3 + .../Editor/NodeView/GraphViewPort.cs | 24 ++++++++ .../Editor/NodeView/GraphViewPort.cs.meta | 3 + .../DependencyGraph/Editor/NodeView/IPort.cs | 10 ++++ .../Editor/NodeView/IPort.cs.meta | 3 + .../Editor/NodeView/UiElementsNodeView.cs | 21 +++---- 15 files changed, 132 insertions(+), 76 deletions(-) delete mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs delete mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs.meta diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs deleted file mode 100644 index daeaad0..0000000 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.Generic; - -namespace AsmdefHelper.DependencyGraph.Editor { - public class AsmdefDependency { - public string DependsFrom { get; } - public IEnumerable DependsTo { get; } - - public AsmdefDependency(string key, IEnumerable value) { - DependsFrom = key; - DependsTo = value; - } - } -} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs.meta deleted file mode 100644 index 4e823b1..0000000 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefDependency.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: de8afe620d6667940a15a8871781c62d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphEditorWindow.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphEditorWindow.cs index 2878598..e49211f 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphEditorWindow.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphEditorWindow.cs @@ -13,16 +13,8 @@ namespace AsmdefHelper.DependencyGraph.Editor { void OnEnable() { // .asmdefをすべて取得 var asmdefs = CompilationPipeline.GetAssemblies(); - var allDependencies = new List(); - foreach (var asmdef in asmdefs) { - allDependencies.Add( - new AsmdefDependency( - asmdef.name, - asmdef.assemblyReferences?.Select(x => x.name) ?? new string[0]) - ); - } // viewの作成 - var graphView = new AsmdefGraphView(allDependencies) { + var graphView = new AsmdefGraphView(asmdefs) { style = { flexGrow = 1 } }; rootVisualElement.Add(graphView); diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphView.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphView.cs index 1a79c87..df9d8ca 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphView.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphView.cs @@ -1,10 +1,17 @@ using System.Collections.Generic; +using System.Linq; +using AsmdefHelper.DependencyGraph.Editor.DependencyNode; +using AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort; +using AsmdefHelper.DependencyGraph.Editor.NodeView; +using UnityEditor.Compilation; using UnityEditor.Experimental.GraphView; +using UnityEngine; using UnityEngine.UIElements; namespace AsmdefHelper.DependencyGraph.Editor { - public class AsmdefGraphView : GraphView { - public AsmdefGraphView(IEnumerable asmdefs) : base() { + public sealed class AsmdefGraphView : GraphView { + public AsmdefGraphView(IEnumerable assemblies) { + var assemblyArr = assemblies.ToArray(); // zoom可能に SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale); // 背景を黒に @@ -12,24 +19,50 @@ namespace AsmdefHelper.DependencyGraph.Editor { // ドラッグによる移動可能に this.AddManipulator(new SelectionDragger()); // ノードの追加 - var asmdefNodeDict = new Dictionary(); - foreach (var asmdef in asmdefs) { - var node = new AsmdefNode(asmdef.DependsFrom); + var asmdefNodeDict = new Dictionary(); + foreach (var asm in assemblyArr) { + var node = new AsmdefNode(asm.name, contentContainer); AddElement(node); asmdefNodeDict.Add(node.title, node); } - // 依存先にラインを追加 - var nodeApapter = new NodeAdapter(); - foreach (var asmdef in asmdefs) { - if (!asmdefNodeDict.TryGetValue(asmdef.DependsFrom, out var fromNode)) { + // 依存の整理 + var nodeProfiles = assemblyArr + .Select((x, i) => new NodeProfile(new NodeId(i), x.name)) + .ToDictionary(x => x.Name); + var dependencies = new List(nodeProfiles.Count); + // 依存先の設定 + foreach (var asm in assemblyArr) { + if (nodeProfiles.TryGetValue(asm.name, out var profile)) { + var requireProfiles = asm.assemblyReferences + .Where(x => nodeProfiles.ContainsKey(x.name)) + .Select(x => nodeProfiles[x.name]); + var dep = new HashSetDependencyNode(profile); + dep.SetRequireNodes(requireProfiles); + dependencies.Add(dep); + } + } + // 依存元の設定 + NodeProcessor.SetBeRequiredNodes(dependencies); + + // 依存先にのみラインを追加 + foreach (var dep in dependencies) { + if (!asmdefNodeDict.TryGetValue(dep.Profile.Name, out var fromNode)) { continue; } - foreach (var dependents in asmdef.DependsTo) { - if (!asmdefNodeDict.TryGetValue(dependents, out var toNode)) { + foreach (var dest in dep.Destinations) { + if (!asmdefNodeDict.TryGetValue(dest.Name, out var toNode)) { continue; } - var edge = fromNode.RightPort.ConnectTo(toNode.LeftPort); - contentContainer.Add(edge);// これが無いと線が表示されない + fromNode.RightPort.Connect(toNode.LeftPort); + } + } + + // ノードの場所を整列 + var sortStrategy = new RandomSortStrategy(Vector2.zero, 100, 600, 100); + var sortedNode = sortStrategy.Sort(dependencies); + foreach (var node in sortedNode) { + if (asmdefNodeDict.TryGetValue(node.Profile.Name, out var nodeView)) { + nodeView.SetPositionXY(node.Position); } } } diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefNode.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefNode.cs index af9deb8..d34eb6b 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefNode.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefNode.cs @@ -1,20 +1,20 @@ -using UnityEditor.Experimental.GraphView; +using AsmdefHelper.DependencyGraph.Editor.NodeView; +using UnityEditor.Experimental.GraphView; +using UnityEngine.UIElements; namespace AsmdefHelper.DependencyGraph.Editor { - public class AsmdefNode : Node { - public readonly Port LeftPort; - public readonly Port RightPort; + public class AsmdefNode : UiElementsNodeView, IAsmdefNodeView { + public IPort LeftPort { get; } + public IPort RightPort { get; } - public AsmdefNode(string nodeName) { - title = nodeName; + public AsmdefNode(string nodeName, VisualElement parentContentContainer) { + Label = nodeName; - LeftPort = Port.Create(Orientation.Horizontal, Direction.Output, Port.Capacity.Multi, typeof(Port)); - LeftPort.portName = "Ref By"; - outputContainer.Add(LeftPort); // as right side + LeftPort = new GraphViewPort(parentContentContainer, Direction.Input) { Label = "Ref By" }; + inputContainer.Add(LeftPort as Port); // as right side - RightPort = Port.Create(Orientation.Horizontal, Direction.Input, Port.Capacity.Multi, typeof(Port)); - RightPort.portName = "Ref To"; - inputContainer.Add(RightPort); // as left side + RightPort = new GraphViewPort(parentContentContainer, Direction.Output) { Label = "Ref To" }; + outputContainer.Add(RightPort as Port); // as left side } } } diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs index 7b00e0a..6216a22 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/NodeGrid.cs @@ -3,12 +3,16 @@ using UnityEngine; namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { public class NodeGrid { - public readonly float GridSize; + public readonly float GridWidth; + public readonly float GridHeight; + public readonly float Distance; readonly int gridSideCount; public readonly int GridCount; - public NodeGrid(float nodeWidth, float nodeDistance, int nodeCount) { - GridSize = nodeDistance + nodeWidth / 2.0F; + public NodeGrid(float nodeWidth, float nodeHeight, float nodeDistance, int nodeCount) { + GridWidth = nodeWidth; + GridHeight = nodeHeight; + Distance = nodeDistance; gridSideCount = SquareValueProvider.ProvideNearestSquareValue(nodeCount); GridCount = gridSideCount * gridSideCount; } @@ -21,10 +25,10 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { var x = 0.0F; for (var j = 0; j < gridSideCount; j++) { grids[index] = new Vector2(x, y); - x += GridSize; + x += (GridWidth/2.0F) + Distance; index++; } - y += GridSize; + y += (GridHeight/2.0F) + Distance;; } return grids; } diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs index c16edb7..de653e7 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/RandomSortStrategy.cs @@ -19,7 +19,7 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { var nodeArr = nodes .Select(x => new SortedNode { Profile = x.Profile, Position = originPosition }) .ToArray(); - var nodeGrid = new NodeGrid(nodeWidth, basicDistance, nodeArr.Length); + var nodeGrid = new NodeGrid(nodeWidth, nodeHeight, basicDistance, nodeArr.Length); var positions = nodeGrid.GridCenterPositions(); var indexes = Enumerable.Range(0, positions.Count).ToList(); diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs index 4428bbd..a07e50f 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Tests/NodeGridTest.cs @@ -10,9 +10,8 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests { [Test] public void TestNodeGrid() { const float e = 0.000001F; - var nodeGrid = new NodeGrid(10.0F, 10.0F, 4); + var nodeGrid = new NodeGrid(10.0F, 10.0F, 10.0F, 4); Assert.That(nodeGrid.GridCount, Is.EqualTo(4)); - Assert.That(nodeGrid.GridSize, Is.EqualTo(15.0F).Within(e)); var grids = nodeGrid.GridCenterPositions(); Assert.That(grids[0].x, Is.EqualTo(0.0F).Within(e)); Assert.That(grids[0].y, Is.EqualTo(0.0F).Within(e)); diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs new file mode 100644 index 0000000..35f9fac --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs @@ -0,0 +1,8 @@ +using AsmdefHelper.DependencyGraph.Editor.NodeView; + +namespace AsmdefHelper.DependencyGraph.Editor { + public interface IAsmdefNodeView : INodeView { + IPort LeftPort { get; } + IPort RightPort { get; } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs.meta new file mode 100644 index 0000000..1ab8ed3 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/IAsmdefNodeView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b6072eb937a646a4b9cd860534bd9d43 +timeCreated: 1605710938 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs new file mode 100644 index 0000000..c96d20e --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs @@ -0,0 +1,24 @@ +using UnityEditor.Experimental.GraphView; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AsmdefHelper.DependencyGraph.Editor.NodeView { + public class GraphViewPort : Port, IPort { + + readonly VisualElement parentContentContainer; + + public GraphViewPort(VisualElement contentContainer, Direction directionType) : base(Orientation.Horizontal, + directionType, Capacity.Multi, typeof(Port)) { + parentContentContainer = contentContainer; + } + + public string Label { set => portName = value; get => portName; } + public Vector2 Position => new Vector2(GetPosition().x, GetPosition().y); + + public void Connect(IPort port) { + if (port is Port graphViewPort) { + parentContentContainer.Add(ConnectTo(graphViewPort)); + } + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs.meta new file mode 100644 index 0000000..b3bdaf8 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/GraphViewPort.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 44bf77af3f4d4781a1f63e6227256bec +timeCreated: 1605711889 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs new file mode 100644 index 0000000..b20b287 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs @@ -0,0 +1,10 @@ +using UnityEditor.Experimental.GraphView; +using UnityEngine; + +namespace AsmdefHelper.DependencyGraph.Editor.NodeView { + public interface IPort { + string Label { set; get; } + Vector2 Position { get; } + void Connect(IPort port); + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs.meta new file mode 100644 index 0000000..7dd7a52 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/IPort.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 21b3446cef7248c8b533162402f8429f +timeCreated: 1605711702 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs index 1a19c5e..4447e20 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/NodeView/UiElementsNodeView.cs @@ -1,25 +1,26 @@ -using UnityEditor.Graphs; +using UnityEditor.Experimental.GraphView; +using UnityEngine; namespace AsmdefHelper.DependencyGraph.Editor.NodeView { public class UiElementsNodeView : Node, INodeView { - string INodeView.Label { + public string Label { get => title; set => title = value; } - float IRect.PositionX { - get => position.x; - set => position.x = value; + public float PositionX { + get => transform.position.x; + set => transform.position = new Vector3(value, PositionY, transform.position.z); } - float IRect.PositionY { - get => position.y; - set => position.y = value; + public float PositionY { + get => transform.position.y; + set => transform.position = new Vector3(PositionX, value, transform.position.z); } - float IRect.Height => position.height; + public float Height => contentRect.height; - float IRect.Width => position.width; + public float Width => contentRect.width; } } From d5a67a45714f00cff0ae28a1a6996ee3384791e1 Mon Sep 17 00:00:00 2001 From: naninunenoy Date: Thu, 19 Nov 2020 23:41:46 +0900 Subject: [PATCH 8/9] AlignSortStrategy --- .../DependencyGraph/Editor/AsmdefGraphView.cs | 2 +- .../Editor/DependencyNode/Sort/AlignParam.cs | 50 +++++++++++++++++++ .../DependencyNode/Sort/AlignParam.cs.meta | 3 ++ .../DependencyNode/Sort/AlignSortStrategy.cs | 49 ++++++++++++++++++ .../Sort/AlignSortStrategy.cs.meta | 3 ++ .../Sort/DependencyNodeExtensions.cs | 10 +++- 6 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignParam.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignParam.cs.meta create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignSortStrategy.cs create mode 100644 Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignSortStrategy.cs.meta diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphView.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphView.cs index df9d8ca..046d1b1 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphView.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/AsmdefGraphView.cs @@ -58,7 +58,7 @@ namespace AsmdefHelper.DependencyGraph.Editor { } // ノードの場所を整列 - var sortStrategy = new RandomSortStrategy(Vector2.zero, 100, 600, 100); + var sortStrategy = new AlignSortStrategy(AlignParam.Default(), Vector2.zero); var sortedNode = sortStrategy.Sort(dependencies); foreach (var node in sortedNode) { if (asmdefNodeDict.TryGetValue(node.Profile.Name, out var nodeView)) { diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignParam.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignParam.cs new file mode 100644 index 0000000..9fe4f5b --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignParam.cs @@ -0,0 +1,50 @@ +using UnityEngine; + +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { + public struct AlignParam { + public readonly int tryCount; + + public readonly float basicDistance; + public readonly float nodeWidth; + public readonly float nodeHeight; + + public readonly float relationK; + public readonly float relationNaturalLength; + public readonly float repulsivePower; + public readonly float threshold; + + public AlignParam(int tryCount, float basicDistance, float nodeWidth, float nodeHeight, + float relationK, float relationNaturalLength, float repulsivePower, float threshold) { + this.tryCount = tryCount; + this.basicDistance = basicDistance; + this.nodeWidth = nodeWidth; + this.nodeHeight = nodeHeight; + this.relationK = relationK; + this.relationNaturalLength = relationNaturalLength; + this.repulsivePower = repulsivePower; + this.threshold = threshold; + } + + public static AlignParam Default() => new AlignParam(1000, 100, 600, 100, -0.01F, 300, 0.01F, 300.0F); + } + + public static class AlignParamEx { + public static Vector2 接続したノード同士はばねによって引き合う(this AlignParam align, Vector2 target, Vector2 other) { + var k = align.relationK; + var nl = align.relationNaturalLength; + + var l = (target - other).magnitude; + var delta = l - nl; + + return -(delta * k * (other - target).normalized); + } + public static Vector2 全ノードは互いに斥力が発生する(this AlignParam align, Vector2 target, Vector2 other) { + var l = (other - target).magnitude; + if (l < align.threshold) + { + return -(other - target).normalized * ((align.threshold - l) * align.repulsivePower); + } + return Vector2.zero; + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignParam.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignParam.cs.meta new file mode 100644 index 0000000..7a1d855 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignParam.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 949ed302d4b143d3b3fea3039ec3f9e9 +timeCreated: 1605794098 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignSortStrategy.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignSortStrategy.cs new file mode 100644 index 0000000..e70e37a --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignSortStrategy.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +//https://github.com/TORISOUP/AnimatorControllerLayouter/blob/master/Assets/TORISOUP/AnimatorControllerLayouter/Editor/LayoutHelper.cs +namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { + public class AlignSortStrategy : ISortStrategy { + readonly AlignParam alignParam; + readonly Vector2 originPosition; + + public AlignSortStrategy(AlignParam alignParam, Vector2 originPosition) { + this.alignParam = alignParam; + this.originPosition = originPosition; + } + + public IEnumerable Sort(IEnumerable nodes) { + var nodeArr = nodes.ToArray(); + var posDict = nodeArr.ToDictionary(x => x.Profile, _ => originPosition); + + // まず順番に整列させる + var nodeGrid = new NodeGrid(alignParam.nodeWidth, alignParam.nodeHeight, alignParam.basicDistance, nodeArr.Length); + for (var i = 0; i < nodeArr.Length; i++) { + posDict[nodeArr[i].Profile] += nodeGrid.GridCenterPositions()[i]; + } + + // ばねによる整列 + var tryCount = alignParam.tryCount; + while (tryCount-- > 0) { + foreach (var node in nodeArr) { + var target = posDict[node.Profile]; + var force = Vector2.zero; + foreach (var innerNode in nodeArr) { + var other = posDict[innerNode.Profile]; + // ばねの計算 + if (node.IsConnectedTo(innerNode.Profile)) { + force += alignParam.接続したノード同士はばねによって引き合う(target, other); + } + + force += alignParam.全ノードは互いに斥力が発生する(target, other); + } + + posDict[node.Profile] = target + force * 1.0f; + } + } + + return posDict.Select(x => new SortedNode { Profile = x.Key, Position = x.Value }); + } + } +} diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignSortStrategy.cs.meta b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignSortStrategy.cs.meta new file mode 100644 index 0000000..268eba0 --- /dev/null +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/AlignSortStrategy.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5ebdb87d853042fd96657c9f78cec1a9 +timeCreated: 1605793928 \ No newline at end of file diff --git a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/DependencyNodeExtensions.cs b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/DependencyNodeExtensions.cs index ac694f3..8e6561a 100644 --- a/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/DependencyNodeExtensions.cs +++ b/Assets/AsmdefHelper/DependencyGraph/Editor/DependencyNode/Sort/DependencyNodeExtensions.cs @@ -1,4 +1,6 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; +using UnityEditor.Graphs; namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { public static class DependencyNodeExtensions { @@ -18,5 +20,11 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort { return node.Sources.Any(x => x == node.Profile) || node.Destinations.Any(x => x == node.Profile); } + public static IEnumerable ConnectedNodes(this IDependencyNode node) { + return node.Sources.Concat(node.Destinations); + } + public static bool IsConnectedTo(this IDependencyNode node, NodeProfile nodeProfile) { + return node.Sources.Contains(nodeProfile) || node.Destinations.Contains(nodeProfile); + } } } From bedce68a4499759f4b99b6aca177c70c1262db86 Mon Sep 17 00:00:00 2001 From: naninunenoy Date: Thu, 19 Nov 2020 23:54:33 +0900 Subject: [PATCH 9/9] update package.json --- Assets/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/package.json b/Assets/package.json index bde3d34..917517d 100644 --- a/Assets/package.json +++ b/Assets/package.json @@ -1,7 +1,7 @@ { "name": "dev.n5y.asmdefhelper", "displayName": "AsmdefHelper", - "version": "0.2.5", + "version": "0.3.0", "unity": "2019.3", "description": "Unity assembly definition utilities.", "keywords": ["asmdef", "editor"],