Race.metamodel 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. {
  2. "types": {
  3. "Car": [
  4. {
  5. "name": "name",
  6. "type": "string",
  7. "default": "Car1"
  8. },
  9. {
  10. "name": "position",
  11. "type": "list<int>",
  12. "default": [
  13. 0,
  14. 0
  15. ]
  16. }
  17. ],
  18. "UnitTrack": [
  19. {
  20. "name": "position",
  21. "type": "list<int>",
  22. "default": [
  23. 0,
  24. 0
  25. ]
  26. }
  27. ],
  28. "Positionable": [
  29. {
  30. "name": "position",
  31. "type": "list<int>",
  32. "default": [
  33. 0,
  34. 0
  35. ]
  36. }
  37. ],
  38. "next": [],
  39. "onTrack": []
  40. },
  41. "constraints": [
  42. {
  43. "name": "noAbstractInstances",
  44. "event": "pre-create",
  45. "code": "false",
  46. "targetType": "Positionable"
  47. }
  48. ],
  49. "actions": [
  50. {
  51. "name": "snapToTarget",
  52. "event": "post-connect",
  53. "code": "/*newline*/var neighborLinks = getNeighbors('>'),/*newline*/ neighborLink = neighborLinks[neighborLinks.length-1];/*newline*/if( neighborLink )/*newline*/{/*newline*/ if( getAttr('$type', neighborLink).match(/next/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] - 75, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/onTrack/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 10, gpos[1] + 35], neighbor);/*newline*/ }/*newline*/ else/*newline*/ {/*newline*/ print('Invalid link');/*newline*/ }/*newline*/}",
  54. "targetType": "Car"
  55. },
  56. {
  57. "name": "snapToTarget",
  58. "event": "post-connect",
  59. "code": "/*newline*/var neighborLinks = getNeighbors('>'),/*newline*/ neighborLink = neighborLinks[neighborLinks.length-1];/*newline*/if( neighborLink )/*newline*/{/*newline*/ if( getAttr('$type', neighborLink).match(/next/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] - 75, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/onTrack/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 10, gpos[1] + 35], neighbor);/*newline*/ }/*newline*/ else/*newline*/ {/*newline*/ print('Invalid link');/*newline*/ }/*newline*/}",
  60. "targetType": "UnitTrack"
  61. },
  62. {
  63. "name": "snapToTarget",
  64. "event": "post-connect",
  65. "code": "/*newline*/var neighborLinks = getNeighbors('>'),/*newline*/ neighborLink = neighborLinks[neighborLinks.length-1];/*newline*/if( neighborLink )/*newline*/{/*newline*/ if( getAttr('$type', neighborLink).match(/next/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] - 75, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/onTrack/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 10, gpos[1] + 35], neighbor);/*newline*/ }/*newline*/ else/*newline*/ {/*newline*/ print('Invalid link');/*newline*/ }/*newline*/}",
  66. "targetType": "Positionable"
  67. }
  68. ],
  69. "cardinalities": {
  70. "Car": [
  71. {
  72. "dir": "in",
  73. "type": "onTrack",
  74. "min": "0",
  75. "max": "Infinity"
  76. }
  77. ],
  78. "UnitTrack": [
  79. {
  80. "dir": "out",
  81. "type": "next",
  82. "min": "0",
  83. "max": "Infinity"
  84. },
  85. {
  86. "dir": "in",
  87. "type": "next",
  88. "min": "0",
  89. "max": "Infinity"
  90. },
  91. {
  92. "dir": "out",
  93. "type": "onTrack",
  94. "min": "0",
  95. "max": "Infinity"
  96. }
  97. ],
  98. "Positionable": [],
  99. "next": [
  100. {
  101. "dir": "in",
  102. "type": "UnitTrack",
  103. "min": "0",
  104. "max": "1"
  105. },
  106. {
  107. "dir": "out",
  108. "type": "UnitTrack",
  109. "min": "0",
  110. "max": "1"
  111. }
  112. ],
  113. "onTrack": [
  114. {
  115. "dir": "in",
  116. "type": "UnitTrack",
  117. "min": "0",
  118. "max": "1"
  119. },
  120. {
  121. "dir": "out",
  122. "type": "Car",
  123. "min": "0",
  124. "max": "1"
  125. }
  126. ]
  127. },
  128. "legalConnections": {
  129. "UnitTrack": {
  130. "UnitTrack": [
  131. "next"
  132. ],
  133. "Car": [
  134. "onTrack"
  135. ]
  136. }
  137. },
  138. "connectorTypes": {
  139. "next": "visual",
  140. "onTrack": "containment"
  141. },
  142. "types2parentTypes": {
  143. "Car": [
  144. "Positionable"
  145. ],
  146. "UnitTrack": [
  147. "Positionable"
  148. ],
  149. "Positionable": [],
  150. "next": [],
  151. "onTrack": []
  152. }
  153. }