Ingen beskrivning
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

IUnit.cs 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. namespace Unity.VisualScripting
  6. {
  7. public interface IUnit : IGraphElementWithDebugData
  8. {
  9. new FlowGraph graph { get; }
  10. #region Definition
  11. bool canDefine { get; }
  12. bool isDefined { get; }
  13. bool failedToDefine { get; }
  14. Exception definitionException { get; }
  15. void Define();
  16. void EnsureDefined();
  17. void RemoveUnconnectedInvalidPorts();
  18. #endregion
  19. #region Default Values
  20. Dictionary<string, object> defaultValues { get; }
  21. #endregion
  22. #region Ports
  23. IUnitPortCollection<ControlInput> controlInputs { get; }
  24. IUnitPortCollection<ControlOutput> controlOutputs { get; }
  25. IUnitPortCollection<ValueInput> valueInputs { get; }
  26. IUnitPortCollection<ValueOutput> valueOutputs { get; }
  27. IUnitPortCollection<InvalidInput> invalidInputs { get; }
  28. IUnitPortCollection<InvalidOutput> invalidOutputs { get; }
  29. IEnumerable<IUnitInputPort> inputs { get; }
  30. IEnumerable<IUnitOutputPort> outputs { get; }
  31. IEnumerable<IUnitInputPort> validInputs { get; }
  32. IEnumerable<IUnitOutputPort> validOutputs { get; }
  33. IEnumerable<IUnitPort> ports { get; }
  34. IEnumerable<IUnitPort> invalidPorts { get; }
  35. IEnumerable<IUnitPort> validPorts { get; }
  36. void PortsChanged();
  37. event Action onPortsChanged;
  38. #endregion
  39. #region Connections
  40. IConnectionCollection<IUnitRelation, IUnitPort, IUnitPort> relations { get; }
  41. IEnumerable<IUnitConnection> connections { get; }
  42. #endregion
  43. #region Analysis
  44. bool isControlRoot { get; }
  45. #endregion
  46. #region Widget
  47. Vector2 position { get; set; }
  48. #endregion
  49. }
  50. public static class XUnit
  51. {
  52. public static ValueInput CompatibleValueInput(this IUnit unit, Type outputType)
  53. {
  54. Ensure.That(nameof(outputType)).IsNotNull(outputType);
  55. return unit.valueInputs
  56. .Where(valueInput => ConversionUtility.CanConvert(outputType, valueInput.type, false))
  57. .OrderBy((valueInput) =>
  58. {
  59. var exactType = outputType == valueInput.type;
  60. var free = !valueInput.hasValidConnection;
  61. if (free && exactType)
  62. {
  63. return 1;
  64. }
  65. else if (free)
  66. {
  67. return 2;
  68. }
  69. else if (exactType)
  70. {
  71. return 3;
  72. }
  73. else
  74. {
  75. return 4;
  76. }
  77. }).FirstOrDefault();
  78. }
  79. public static ValueOutput CompatibleValueOutput(this IUnit unit, Type inputType)
  80. {
  81. Ensure.That(nameof(inputType)).IsNotNull(inputType);
  82. return unit.valueOutputs
  83. .Where(valueOutput => ConversionUtility.CanConvert(valueOutput.type, inputType, false))
  84. .OrderBy((valueOutput) =>
  85. {
  86. var exactType = inputType == valueOutput.type;
  87. var free = !valueOutput.hasValidConnection;
  88. if (free && exactType)
  89. {
  90. return 1;
  91. }
  92. else if (free)
  93. {
  94. return 2;
  95. }
  96. else if (exactType)
  97. {
  98. return 3;
  99. }
  100. else
  101. {
  102. return 4;
  103. }
  104. }).FirstOrDefault();
  105. }
  106. }
  107. }