TheDynamics.vue 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. <script setup lang="ts">
  2. import { useStore } from '@/util/store'
  3. import { computed, ref } from 'vue';
  4. import { UABaseNode } from '@/ua/UABaseNode';
  5. import { ReferenceTypeIds } from '@/ua/opcua_node_ids';
  6. import type { UAReferenceType } from '@/ua/UAReferenceType';
  7. import { ObjectTypeIds } from '@/ua/opcua_node_ids';
  8. import type { UAObjectType } from '@/ua/UAObjectType';
  9. import { VariableTypeIds } from '@/ua/opcua_node_ids';
  10. import type { UAVariableType } from '@/ua/UAVariableType';
  11. import { UAReference } from '@/ua/UAReference';
  12. import { UAObject } from '@/ua/UAObject';
  13. import { UAVariable } from '@/ua/UAVariable';
  14. import { DynamicNode, ComponentPair} from '@/ua/DynamicNode';
  15. import { storeToRefs } from 'pinia';
  16. import { isNullOrUndefined } from 'util';
  17. const store = useStore();
  18. const parentDialogOpen = ref(false);
  19. const { selectedNode} = storeToRefs(store)
  20. const nameSpaceName = computed(() => {
  21. if(!selectedNode.value)
  22. return "";
  23. let nsIdx=selectedNode.value.nodeId.namespace;
  24. return store.addressSpace?.nst.getUri(nsIdx);
  25. })
  26. let opt = {
  27. ident: "MyDyn",
  28. namespaceUri:"MyNamespace",
  29. parentNodeId: "MyNodeId",
  30. checkInterval:100,
  31. nodeClass:"Object",
  32. typeNodeId:"ns=0;i=88",
  33. name:"Dynamic",
  34. startIndex:0
  35. };
  36. let dynNode = new DynamicNode(opt);
  37. function filter(fnode: UABaseNode) {
  38. if(selectedNode.value?.nodeClass==="Variable") {
  39. if(fnode.nodeClass!="Object")
  40. return true;
  41. }
  42. return false;
  43. }
  44. function getRefTypes():UABaseNode[] {
  45. let list=(store.addressSpace?.getSubTreeAsList("ns=0;i="+ReferenceTypeIds.HierarchicalReferences)||[]) as UAReferenceType[];
  46. list=list.filter((node) => node.isAbstract==false)
  47. return list;
  48. }
  49. function getObjTypes(flag:any):UABaseNode[] {
  50. let list = [];
  51. if(flag){
  52. list=(store.addressSpace?.getSubTreeAsList("ns=0;i=89")||[]) as UAVariableType[];
  53. }else{
  54. list=(store.addressSpace?.getSubTreeAsList("ns=0;i=88")||[]) as UAObjectType[];
  55. }
  56. list=list.filter((node) => node.isAbstract==false)
  57. return list;
  58. }
  59. function defType(flag:any ):String{
  60. let lab = "ObjectType";
  61. if(flag){
  62. lab = "VariableType";
  63. }
  64. return lab;
  65. }
  66. function getInstanceDecl(nid="ns=0;i=84"){
  67. if(nid==""){nid="ns=0;i=84"}
  68. let component_refs:String[] = [];
  69. let res_man:any[] = [];
  70. let res_opt:any[] = [];
  71. dynNode.mandatory = [];
  72. dynNode.optionals = [];
  73. let res:any[] = [];
  74. let node = (store.addressSpace?.findNode(nid)) as UABaseNode;
  75. let refs = node.references;
  76. let list = (store.addressSpace?.getSubTreeAsList("ns=0;i="+ReferenceTypeIds.Aggregates)||[]) as UABaseNode[];
  77. list.forEach((item) => {
  78. component_refs.push(item.browseName);
  79. })
  80. refs.forEach((item) => {
  81. if(component_refs.includes(item.referenceType) && item.isForward){
  82. let mr = "";
  83. if(item.toNode.nodeClass == "Object"){
  84. let i = item.toNode as UAObject;
  85. mr = i.getModellingRule()||"";
  86. }else if(item.toNode.nodeClass == "Variable"){
  87. let i = item.toNode as UAVariable;
  88. mr = i.getModellingRule()||"";
  89. }
  90. if(mr == "Mandatory"){
  91. const newItem = new ComponentPair(item.toNode.displayName , true);
  92. res_man.push(item.toNode.displayName);
  93. }else{
  94. const newItem = new ComponentPair(item.toNode.displayName , false);
  95. res_opt.push(item.toNode.displayName);
  96. }
  97. dynNode.mandatory = res_man;
  98. dynNode.optionals = res_opt;
  99. dynNode.o_check = new Array(res_opt.length).fill(false);
  100. }
  101. })
  102. return res;
  103. }
  104. function getComponents(nid:string):DynamicNode{
  105. getInstanceDecl(nid);
  106. return dynNode;
  107. }
  108. function getNodeVersion(nid:string, dynNode:DynamicNode){
  109. let node = (store.addressSpace?.findNode(nid)) as UABaseNode;
  110. let refs = node.references;
  111. let res = "";
  112. refs.forEach((ref)=>{
  113. if(ref.toNode.displayName == "NodeVersion"){
  114. res= ref.toNode.nodeId.toString()
  115. dynNode.nodeVersionId= res;
  116. return res;
  117. }else if(ref.fromNode.displayName == "NodeVersion"){
  118. res= ref.fromNode.nodeId.toString()
  119. dynNode.nodeVersionId= res;
  120. return res;
  121. }
  122. })
  123. dynNode.nodeVersionId= res;
  124. return res;
  125. }
  126. async function createDynamic() {
  127. //dynNode.namespaceUri = nameSpaceName.value;
  128. //dynNode.parentNodeId = selectedNode.value?.nodeId.toString();
  129. dynNode.typeNodeId = typedef.value.toString();
  130. // console.log(dynNode);
  131. //console.log(c_man);
  132. //console.log(c_opt.value);
  133. console.log(dynNode.optionals)
  134. console.log(dynNode.o_check)
  135. //dynNode = new DynamicNode(opt);
  136. /*
  137. const blob = await store.addressSpace?.exportProject();
  138. if ('dynamics' in sconfig){
  139. sconfig.dynamics.push("hello");
  140. }else{
  141. sconfig.dynamics = [];
  142. }
  143. */
  144. }
  145. const checked = ref("")
  146. const c_man = ref([])
  147. const c_opt = ref([])
  148. const typedef = ref("")
  149. </script>
  150. <template>
  151. <div class="card">
  152. <div class="card-body" v-if="selectedNode != null && dynNode != null">
  153. <h5 class="card-title">Dynamic Node</h5>
  154. <div class="card-text">
  155. <div class="input-group mb-3">
  156. <div class="input-group-prepend">
  157. <span class="input-group-text" id="inputGroup-sizing-default">Parent Node</span>
  158. </div>
  159. <input type="text" class="form-control" aria-label="Default"
  160. aria-describedby="inputGroup-sizing-default" v-model="selectedNode.nodeId" disabled>
  161. </div>
  162. <div class="input-group mb-3">
  163. <div class="input-group-prepend">
  164. <span class="input-group-text" id="inputGroup-sizing-default">Namespace</span>
  165. </div>
  166. <input type="text" class="form-control" aria-label="Default" aria-describedby="inputGroup-sizing-default" v-model="nameSpaceName" disabled>
  167. </div>
  168. <div class="input-group mb-3">
  169. <div class="input-group-prepend">
  170. <span class="input-group-text" id="inputGroup-sizing-default">Name Dynamic Definition</span>
  171. </div>
  172. <input type="text" class="form-control" aria-label="Default"
  173. aria-describedby="inputGroup-sizing-default" v-model="dynNode.name" v-bind:key="'...'">
  174. </div>
  175. <div class="input-group mb-3">
  176. <div class="input-group-prepend">
  177. <span class="input-group-text" id="inputGroup-sizing-default">Update Interval in ms</span>
  178. </div>
  179. <input type="text" class="form-control" aria-label="Default"
  180. aria-describedby="inputGroup-sizing-default" v-model="dynNode.checkInterval" v-bind:key="1000">
  181. </div>
  182. <div class="input-group mb-3">
  183. <div class="input-group-prepend">
  184. <span class="input-group-text" id="inputGroup-sizing-default">NodeVersion</span>
  185. </div>
  186. <input type="text" class="form-control" aria-label="Default"
  187. aria-describedby="inputGroup-sizing-default" :value="getNodeVersion(selectedNode.nodeId.toString(), dynNode)" disabled>
  188. </div>
  189. <div class="input-group mb-3">
  190. <div class="input-group-prepend">
  191. <span class="input-group-text" id="inputGroup-sizing-default">Reference</span>
  192. </div>
  193. <select class="form-select" aria-label="Default select example">
  194. <option v-for="option in getRefTypes()" :value="option.nodeId.toString()" v-bind:key="option.nodeId.toString()">
  195. {{ option.displayName }}
  196. </option>
  197. </select>
  198. </div>
  199. <div class="input-group mb-3">
  200. <div class="input-group-prepend">
  201. <span class="input-group-text" id="inputGroup-sizing-default">Ident</span>
  202. </div>
  203. <input type="text" class="form-control" aria-label="Default"
  204. aria-describedby="inputGroup-sizing-default" v-model="dynNode.ident" v-bind:key="'...'">
  205. </div>
  206. <div class="input-group mb-3">
  207. <div class="input-group-prepend">
  208. <input type="checkbox" id="checkbox" v-model="checked" />
  209. <label for="checkbox">{{ defType(checked) }}</label>
  210. </div>
  211. </div>
  212. <div class="input-group mb-3">
  213. <div class="input-group-prepend">
  214. <span class="input-group-text" id="inputGroup-sizing-default">Type Definition</span>
  215. </div>
  216. <select v-model="typedef" class="form-select" aria-label="Default select example" >
  217. <option v-for="option1 in getObjTypes(checked)" :value="option1.nodeId.toString()" v-bind:key="option1.nodeId.toString()">
  218. {{ option1.displayName }}
  219. </option>
  220. </select>
  221. </div>
  222. <div class="input-group mb-3">
  223. <ul class="no-bullets"><b>Mandatory Components</b>
  224. <li v-for="item of getComponents(typedef).mandatory">
  225. <input type="checkbox" id="checkbox-digg-{{ item }}" :checked="true" :disabled="true">
  226. <label for="checkbox-digg-{{ item}}">{{ item}}</label>
  227. </li>
  228. </ul>
  229. </div>
  230. <div>
  231. <ul class="no-bullets"><b>Optional Components</b>
  232. <li v-for="(item1,index) of getComponents(typedef).optionals" :key="typedef">
  233. <input type="checkbox" id="checkbox-digg-{{ item1 }}" v-model="dynNode.o_check![index]" :value="item1" :checked="dynNode.o_check![index]">
  234. <label for="checkbox-digg-{{ item1 }}">{{ item1 }}</label>
  235. </li>
  236. </ul>
  237. </div>
  238. <div>
  239. <button class="btn btn-light" @click.prevent="createDynamic()">Create</button>
  240. </div>
  241. </div>
  242. </div>
  243. </div>
  244. </template>
  245. <style scoped>
  246. ul.no-bullets {
  247. list-style-type: none;
  248. margin: 0;
  249. padding: 0;
  250. }
  251. </style>