TheModels.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <!-- eslint-disable no-fallthrough -->
  2. <script setup lang="ts">
  3. import { AddressSpace } from '@/ua/AddressSpace';
  4. import { UANodeSet } from '@/ua/UANodeSet';
  5. import { useStore } from '@/util/store'
  6. import { ref } from 'vue';
  7. import VDialog from './VDialog.vue'
  8. const store = useStore()
  9. const newDialogOpen = ref(false);
  10. const newDialogDisabled = ref(false);
  11. const projectType = ref("ua");
  12. async function exportProject() {
  13. const blob = await store.addressSpace?.export();
  14. if (blob)
  15. downloadBlob(blob, "proj.zip");
  16. }
  17. function downloadBlob(blob: Blob, filename: string) {
  18. let link = document.createElement('a')
  19. link.href = window.URL.createObjectURL(blob)
  20. link.download = filename
  21. document.body.appendChild(link);
  22. link.click()
  23. document.body.removeChild(link);
  24. }
  25. async function newProject() {
  26. newDialogDisabled.value=true;
  27. store.addressSpace = new AddressSpace([] as UANodeSet[])
  28. let nodesets:string[]=[];
  29. switch(projectType.value) {
  30. case "emco":
  31. nodesets.push("nodesets/emco_machine_tools.xml");
  32. case "machinetool":
  33. nodesets.push("nodesets/Opc.Ua.MachineTool.Nodeset2.xml");
  34. nodesets.push("nodesets/Opc.Ua.Machinery.NodeSet2.xml");
  35. nodesets.push("nodesets/Opc.Ua.Ia.NodeSet2.xml");
  36. nodesets.push("nodesets/Opc.Ua.Di.NodeSet2.xml");
  37. case "ua":
  38. nodesets.push("nodesets/Opc.Ua.NodeSet2.xml");
  39. default:
  40. break;
  41. }
  42. let as= await AddressSpace.load(nodesets.reverse());
  43. store.setAddressSpace(as);
  44. newDialogOpen.value=false;
  45. newDialogDisabled.value=false;
  46. }
  47. async function handleDrop(e:DragEvent) {
  48. if(!e.dataTransfer)
  49. return;
  50. for(let file of e.dataTransfer.files) {
  51. let xmlString= await file.text();
  52. store.addNodeset(await UANodeSet.parse(xmlString, file.name));
  53. }
  54. }
  55. </script>
  56. <template>
  57. <div v-if="store.addressSpace" >
  58. <div class="card" @drop.prevent="handleDrop($event)" dropzone="copy" @dragover="$event.preventDefault();">
  59. <div class="card-body" v-if="store.addressSpace">
  60. <h5 class="card-title">Models</h5>
  61. <p class="card-text">
  62. <ul class="list-group list-group-flush" v-for="nodeset in store.addressSpace.nodesets"
  63. v-bind:key="nodeset.models[0].modelUri">
  64. <div v-for="model in nodeset.models" v-bind:key="model.modelUri">
  65. <li class="list-group-item">{{ model.modelUri }}</li>
  66. </div>
  67. </ul>
  68. </p>
  69. </div>
  70. </div>
  71. <button class="btn btn-light" @click.prevent="exportProject()">Export</button>
  72. <button class="btn btn-light" @click="newDialogOpen = true">New project</button>
  73. </div>
  74. <v-dialog :open="newDialogOpen" @cancel="newDialogOpen=false">
  75. <p>New project</p>
  76. <div class="form-check">
  77. <input class="form-check-input" type="radio" name="projectType" id="empty" value="empty" v-model="projectType">
  78. <label class="form-check-label" for="empty">Empty Namespace</label>
  79. </div>
  80. <div class="form-check">
  81. <input class="form-check-input" type="radio" name="projectType" id="ua" value="ua" v-model="projectType" checked>
  82. <label class="form-check-label" for="ua">http://opcfoundation.org/UA/ Namespace</label>
  83. </div>
  84. <div class="form-check">
  85. <input class="form-check-input" type="radio" name="projectType" id="machinetool" value="machinetool" v-model="projectType">
  86. <label class="form-check-label" for="machinetool">Machinetool Namespace +dependencies</label>
  87. </div>
  88. <div class="form-check">
  89. <input class="form-check-input" type="radio" name="projectType" id="emco" value="emco" v-model="projectType">
  90. <label class="form-check-label" for="emco">Full EMCO Project</label>
  91. </div>
  92. <button @click="newProject()" :disabled="newDialogDisabled">OK</button>
  93. <button @click="newDialogOpen = false" :disabled="newDialogDisabled">Cancel</button>
  94. </v-dialog>
  95. </template>
  96. <style></style>