|
@@ -1,21 +1,15 @@
|
|
|
<script setup lang="ts">
|
|
|
import { useStore } from '@/util/store'
|
|
|
-import { computed, ref } from 'vue';
|
|
|
+import { computed, ref, watch } from 'vue';
|
|
|
import { UABaseNode } from '@/ua/UABaseNode';
|
|
|
-import { ReferenceTypeIds } from '@/ua/opcua_node_ids';
|
|
|
+import { ObjectIds, ReferenceTypeIds } from '@/ua/opcua_node_ids';
|
|
|
import type { UAReferenceType } from '@/ua/UAReferenceType';
|
|
|
-import type { UAObjectType } from '@/ua/UAObjectType';
|
|
|
import type { UAVariableType } from '@/ua/UAVariableType';
|
|
|
-import { UAObject } from '@/ua/UAObject';
|
|
|
-import { UAVariable } from '@/ua/UAVariable';
|
|
|
import { DynamicNode} from '@/ua/DynamicNode';
|
|
|
import { storeToRefs } from 'pinia';
|
|
|
const store = useStore();
|
|
|
-
|
|
|
const { selectedNode} = storeToRefs(store)
|
|
|
|
|
|
-
|
|
|
-
|
|
|
const nameSpaceName = computed(() => {
|
|
|
if(!selectedNode.value)
|
|
|
return "";
|
|
@@ -33,9 +27,16 @@ let opt = {
|
|
|
name:"...",
|
|
|
startIndex:0
|
|
|
};
|
|
|
+const dynNode = ref(new DynamicNode(opt));
|
|
|
+const checked = ref("")
|
|
|
+const typedef = ref("")
|
|
|
|
|
|
-let dynNode = new DynamicNode(opt);
|
|
|
-
|
|
|
+watch(selectedNode, async (newNode, _oldNode) => {
|
|
|
+ if(!newNode)
|
|
|
+ return;
|
|
|
+ //TODO: what id does typedef hold?
|
|
|
+ typedef.value=newNode.nodeId.toString();
|
|
|
+})
|
|
|
|
|
|
function getRefTypes():UABaseNode[] {
|
|
|
let list=(store.addressSpace?.getSubTreeAsList("ns=0;i="+ReferenceTypeIds.HierarchicalReferences)||[]) as UAReferenceType[];
|
|
@@ -43,68 +44,31 @@ function getRefTypes():UABaseNode[] {
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
-function getObjTypes(flag:any):UABaseNode[] {
|
|
|
- let list = [];
|
|
|
- if(flag){
|
|
|
- list=(store.addressSpace?.getSubTreeAsList("ns=0;i=89")||[]) as UAVariableType[];
|
|
|
- }else{
|
|
|
- list=(store.addressSpace?.getSubTreeAsList("ns=0;i=88")||[]) as UAObjectType[];
|
|
|
- }
|
|
|
- list=list.filter((node) => node.isAbstract==false)
|
|
|
- return list;
|
|
|
-}
|
|
|
-
|
|
|
-function defType(flag:any ):String{
|
|
|
- let lab = "ObjectType";
|
|
|
- if(flag){
|
|
|
- lab = "VariableType";
|
|
|
- }
|
|
|
- return lab;
|
|
|
+function getObjTypes(nid: string):UABaseNode[] {
|
|
|
+ const list=(store.addressSpace?.getSubTreeAsList(nid)||[]) as UAVariableType[];
|
|
|
+ return list.filter((node) => node.isAbstract==false)
|
|
|
}
|
|
|
|
|
|
-function getInstanceDecl(nid="ns=0;i=84"){
|
|
|
- if(nid==""){nid="ns=0;i=84"}
|
|
|
- let component_refs:String[] = [];
|
|
|
- let res_man:any[] = [];
|
|
|
- let res_opt:any[] = [];
|
|
|
- dynNode.mandatory = [];
|
|
|
- dynNode.optionals = [];
|
|
|
- let res:any[] = [];
|
|
|
- let node = (store.addressSpace?.findNode(nid)) as UABaseNode;
|
|
|
- let refs = node.references;
|
|
|
- let list = (store.addressSpace?.getSubTreeAsList("ns=0;i="+ReferenceTypeIds.Aggregates)||[]) as UABaseNode[];
|
|
|
- list.forEach((item) => {
|
|
|
- component_refs.push(item.browseName);
|
|
|
+function getInstanceDecl(nid: string, mrType: string){
|
|
|
+ //TODO: why aggregates?
|
|
|
+ const aggregates = (store.addressSpace?.getSubTreeAsList("ns=0;i="+ReferenceTypeIds.Aggregates)||[]) as UABaseNode[];
|
|
|
+ let aggStrings:String[] = [];
|
|
|
+ aggregates.forEach((item) => {
|
|
|
+ aggStrings.push(item.browseName);
|
|
|
})
|
|
|
- refs.forEach((item) => {
|
|
|
- if(component_refs.includes(item.referenceType) && item.isForward){
|
|
|
- let mr = "";
|
|
|
- if(item.toNode.nodeClass == "Object"){
|
|
|
- let i = item.toNode as UAObject;
|
|
|
- mr = i.getModellingRule()||"";
|
|
|
- }else if(item.toNode.nodeClass == "Variable"){
|
|
|
- let i = item.toNode as UAVariable;
|
|
|
- mr = i.getModellingRule()||"";
|
|
|
- }
|
|
|
- if(mr == "Mandatory"){
|
|
|
- res_man.push(item.toNode.displayName);
|
|
|
- }else{
|
|
|
- res_opt.push(item.toNode.displayName);
|
|
|
+ let node = (store.addressSpace?.findNode(nid)) as UABaseNode;
|
|
|
+ let res:string[] = [];
|
|
|
+ node.references.forEach((item) => {
|
|
|
+ if(aggStrings.includes(item.referenceType) && item.isForward){
|
|
|
+ let mr = item.toNode.getModellingRule()||"";
|
|
|
+ if(mr == mrType){
|
|
|
+ res.push(item.toNode.displayName||"");
|
|
|
}
|
|
|
- dynNode.mandatory = res_man;
|
|
|
- dynNode.optionals = res_opt;
|
|
|
- dynNode.o_check = new Array(res_opt.length).fill(false);
|
|
|
}
|
|
|
})
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-function getComponents(nid:string):DynamicNode{
|
|
|
- getInstanceDecl(nid);
|
|
|
- return dynNode;
|
|
|
-}
|
|
|
-
|
|
|
function getNodeVersion(nid:string){
|
|
|
let node = (store.addressSpace?.findNode(nid)) as UABaseNode;
|
|
|
if(!node)
|
|
@@ -119,18 +83,16 @@ function getNodeVersion(nid:string){
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
async function createDynamic() {
|
|
|
//dynNode.namespaceUri = nameSpaceName.value;
|
|
|
//dynNode.parentNodeId = selectedNode.value?.nodeId.toString();
|
|
|
- dynNode.typeNodeId = typedef.value.toString();
|
|
|
+ dynNode.value.typeNodeId = typedef.value.toString();
|
|
|
|
|
|
// console.log(dynNode);
|
|
|
//console.log(c_man);
|
|
|
//console.log(c_opt.value);
|
|
|
- console.log(dynNode.optionals)
|
|
|
- console.log(dynNode.o_check)
|
|
|
+ console.log(dynNode.value.optionals)
|
|
|
+ console.log(dynNode.value.o_check)
|
|
|
//dynNode = new DynamicNode(opt);
|
|
|
|
|
|
/*
|
|
@@ -145,8 +107,7 @@ async function createDynamic() {
|
|
|
|
|
|
|
|
|
}
|
|
|
-const checked = ref("")
|
|
|
-const typedef = ref("")
|
|
|
+
|
|
|
|
|
|
function okPressed() {
|
|
|
console.log('TODO: Handle OK Button');
|
|
@@ -213,7 +174,7 @@ defineExpose({ okPressed })
|
|
|
<div class="input-group mb-3">
|
|
|
<div class="input-group-prepend">
|
|
|
<input type="checkbox" id="checkbox" v-model="checked" />
|
|
|
- <label for="checkbox">{{ defType(checked) }}</label>
|
|
|
+ <label for="checkbox">{{ checked?"ObjectType":"VariableType" }}</label>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="input-group mb-3">
|
|
@@ -221,14 +182,14 @@ defineExpose({ okPressed })
|
|
|
<span class="input-group-text" id="inputGroup-sizing-default">Type Definition</span>
|
|
|
</div>
|
|
|
<select v-model="typedef" class="form-select" aria-label="Default select example" >
|
|
|
- <option v-for="option1 in getObjTypes(checked)" :value="option1.nodeId.toString()" v-bind:key="option1.nodeId.toString()">
|
|
|
+ <option v-for="option1 in getObjTypes('ns=0;i='+ ObjectIds.VariableTypesFolder)" :value="option1.nodeId.toString()" v-bind:key="option1.nodeId.toString()">
|
|
|
{{ option1.displayName }}
|
|
|
</option>
|
|
|
</select>
|
|
|
</div>
|
|
|
<div class="input-group mb-3">
|
|
|
<ul class="no-bullets"><b>Mandatory Components</b>
|
|
|
- <li v-for="item of getComponents(typedef).mandatory" v-bind:key = item>
|
|
|
+ <li v-for="item of getInstanceDecl(typedef, 'Mandatory')" v-bind:key = item>
|
|
|
<input type="checkbox" id="checkbox-digg-{{ item }}" :checked="true" :disabled="true">
|
|
|
<label for="checkbox-digg-{{ item}}">{{ item}}</label>
|
|
|
</li>
|
|
@@ -236,7 +197,7 @@ defineExpose({ okPressed })
|
|
|
</div>
|
|
|
<div>
|
|
|
<ul class="no-bullets"><b>Optional Components</b>
|
|
|
- <li v-for="(item1,index) of getComponents(typedef).optionals" v-bind:key = item1>
|
|
|
+ <li v-for="(item1,index) of getInstanceDecl(typedef, 'Optional')" v-bind:key = item1>
|
|
|
<input type="checkbox" id="checkbox-digg-{{ item1 }}" v-model="dynNode.o_check![index]" :value="item1" :checked="dynNode.o_check![index]">
|
|
|
<label for="checkbox-digg-{{ item1 }}">{{ item1 }}</label>
|
|
|
</li>
|