@abi-software/scaffoldvuer 1.3.3 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abi-software/scaffoldvuer",
3
- "version": "1.3.3",
3
+ "version": "1.4.0",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -41,7 +41,7 @@
41
41
  "*.js"
42
42
  ],
43
43
  "dependencies": {
44
- "@abi-software/map-utilities": "^1.0.0",
44
+ "@abi-software/map-utilities": "^1.1.0",
45
45
  "@abi-software/sparc-annotation": "^0.3.1",
46
46
  "@abi-software/svg-sprite": "^1.0.0",
47
47
  "@element-plus/icons-vue": "^2.3.1",
@@ -55,7 +55,7 @@
55
55
  "vue": "^3.4.15",
56
56
  "vue-router": "^4.2.5",
57
57
  "vue3-component-svg-sprite": "^0.0.1",
58
- "zincjs": "^1.10.2"
58
+ "zincjs": "^1.11.1"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@vitejs/plugin-vue": "^4.6.2",
package/src/App.vue CHANGED
@@ -422,7 +422,7 @@ export default {
422
422
  "body proper": 9,
423
423
  "Spinal cord": 8,
424
424
  "lung": 11,
425
- "stomach": 12,
425
+ "stomach": {number:12, imgURL: 'https://mapcore-bucket1.s3.us-west-2.amazonaws.com/texture/arm1/jpg/0984.jpg'},
426
426
  "urinary bladder": 11,
427
427
  "Brainstem": 11,
428
428
  "heart": 9,
@@ -646,6 +646,7 @@ export default {
646
646
  }
647
647
  }
648
648
  this.scaffoldRef = this.$refs.scaffold;
649
+ // this.scaffoldRef.changeViewingMode('Annotation')
649
650
  },
650
651
  addLinesWithNormal: function (coord, normal) {
651
652
  if (coord && normal) {
@@ -97,7 +97,7 @@
97
97
  /* eslint-disable no-alert, no-console */
98
98
  // This is not in use at this moment, due to
99
99
  // limited support to line width
100
- import { shallowRef } from 'vue';
100
+ import { markRaw, shallowRef } from 'vue';
101
101
  import {
102
102
  getLineDistance,
103
103
  moveAndExtendLine,
@@ -146,26 +146,24 @@ export default {
146
146
  ElIconArrowLeft: shallowRef(ElIconArrowLeft),
147
147
  ElIconArrowRight: shallowRef(ElIconArrowRight),
148
148
  edited: false,
149
+ zincObject: undefined,
149
150
  };
150
151
  },
151
152
  watch: {
152
153
  "createData.faceIndex": {
153
154
  handler: function (value) {
154
- if (this._zincObject?.isLines2) {
155
+ if (this.zincObject?.isLines2) {
155
156
  this.currentIndex = value;
156
- this.distance = getLineDistance(this._zincObject, this.currentIndex);
157
+ this.distance = getLineDistance(this.zincObject, this.currentIndex);
157
158
  }
158
159
  },
159
160
  immediate: true,
160
161
  },
161
162
  },
162
- mounted: function () {
163
- this._zincObject = undefined;
164
- },
165
163
  methods: {
166
164
  changeIndex: function(increment) {
167
165
  if (increment) {
168
- const dist = getLineDistance(this._zincObject, this.currentIndex + 1);
166
+ const dist = getLineDistance(this.zincObject, this.currentIndex + 1);
169
167
  if (dist > 0) {
170
168
  this.currentIndex++;
171
169
  this.reset();
@@ -179,7 +177,7 @@ export default {
179
177
  if (this.newDistance !== 0) {
180
178
  this.distance = this.newDistance;
181
179
  this.edited = moveAndExtendLine(
182
- this._zincObject, this.currentIndex, this.newDistance, true) || this.edited;
180
+ this.zincObject, this.currentIndex, this.newDistance, true) || this.edited;
183
181
  } else {
184
182
  this.newDistance = this.distance;
185
183
  }
@@ -187,22 +185,22 @@ export default {
187
185
  onLengthSliding: function() {
188
186
  this.newDistance = Math.pow(10, this.lengthScale) * this.distance;
189
187
  this.edited = moveAndExtendLine(
190
- this._zincObject, this.currentIndex, this.newDistance, true) || this.edited;
188
+ this.zincObject, this.currentIndex, this.newDistance, true) || this.edited;
191
189
  },
192
190
  onMoveSliding: function() {
193
191
  const diff = (this.adjust - this.pAdjust) * this.distance;
194
192
  this.edited = moveAndExtendLine(
195
- this._zincObject, this.currentIndex, diff, false) || this.edited;
193
+ this.zincObject, this.currentIndex, diff, false) || this.edited;
196
194
  this.pAdjust = this.adjust;
197
195
  },
198
196
  reset: function() {
199
197
  this.adjust = 0;
200
198
  this.pAdjust = 0;
201
199
  this.lengthScale = 0;
202
- this.distance = getLineDistance(this._zincObject, this.currentIndex);
200
+ this.distance = getLineDistance(this.zincObject, this.currentIndex);
203
201
  this.newDistance = this.distance;
204
202
  if (this.edited) {
205
- this.$emit("primitivesUpdated", this._zincObject);
203
+ this.$emit("primitivesUpdated", this.zincObject);
206
204
  this.edited = false;
207
205
  }
208
206
  },
@@ -210,19 +208,19 @@ export default {
210
208
  this.currentIndex = -1;
211
209
  this.distance = 0;
212
210
  if (object.isLines2) {
213
- this._zincObject = object;
214
- this.width = this._zincObject.getMorph().material.linewidth;
211
+ this.zincObject = markRaw(object);
212
+ this.width = this.zincObject.getMorph().material.linewidth;
215
213
  if (object.isEditable) {
216
214
  this.currentIndex = 0;
217
215
  this.distance = getLineDistance(object, this.currentIndex);
218
216
  }
219
217
  } else {
220
- this._zincObject = undefined;
221
- this.linewidth = 10;
218
+ this.zincObject = undefined;
219
+ this.width = 10;
222
220
  }
223
221
  },
224
222
  modifyWidth: function () {
225
- this._zincObject.setWidth(this.width);
223
+ this.zincObject.setWidth(this.width);
226
224
  },
227
225
  },
228
226
  };
@@ -125,7 +125,7 @@
125
125
 
126
126
  <script>
127
127
  /* eslint-disable no-alert, no-console */
128
- import { shallowRef } from 'vue';
128
+ import { markRaw, shallowRef } from 'vue';
129
129
  import {
130
130
  movePoint,
131
131
  } from "../scripts/Utilities.js";
@@ -184,11 +184,9 @@ export default {
184
184
  ElIconArrowLeft: shallowRef(ElIconArrowLeft),
185
185
  ElIconArrowRight: shallowRef(ElIconArrowRight),
186
186
  edited: false,
187
+ zincObject: undefined,
187
188
  };
188
189
  },
189
- mounted: function () {
190
- this._zincObject = undefined;
191
- },
192
190
  watch: {
193
191
  boundingDims: {
194
192
  handler: function (value) {
@@ -211,7 +209,7 @@ export default {
211
209
  methods: {
212
210
  changeIndex: function(increment) {
213
211
  if (increment) {
214
- if (this._zincObject.drawRange > this.currentIndex + 1) {
212
+ if (this.zincObject.drawRange > this.currentIndex + 1) {
215
213
  this.currentIndex++;
216
214
  this.reset();
217
215
  }
@@ -226,7 +224,7 @@ export default {
226
224
  this.translation[1] - this.pTranslation[1],
227
225
  this.translation[2] - this.pTranslation[2],
228
226
  ];
229
- this.edited = movePoint(this._zincObject, this.currentIndex, diff) || this.edited;
227
+ this.edited = movePoint(this.zincObject, this.currentIndex, diff) || this.edited;
230
228
  for (let i = 0; i < 3; i++) {
231
229
  this.pTranslation[i] = this.translation[i];
232
230
  }
@@ -235,33 +233,33 @@ export default {
235
233
  this.translation = [0, 0, 0];
236
234
  this.pTranslation = [0, 0, 0];
237
235
  if (this.edited) {
238
- this.$emit("primitivesUpdated", this._zincObject);
236
+ this.$emit("primitivesUpdated", this.zincObject);
239
237
  this.edited = false;
240
238
  }
241
239
  },
242
240
  setObject: function (object) {
243
241
  this.currentIndex = -1;
244
242
  if (object.isPointset) {
245
- this._zincObject = object;
246
- this.size = this._zincObject.morph.material.size;
247
- this.attenuation = this._zincObject.morph.material.sizeAttenuation;
243
+ this.zincObject = markRaw(object);
244
+ this.size = this.zincObject.morph.material.size;
245
+ this.attenuation = this.zincObject.morph.material.sizeAttenuation;
248
246
  if (object.isEditable) {
249
- if (this._zincObject.drawRange > 0) {
247
+ if (this.zincObject.drawRange > 0) {
250
248
  this.currentIndex = 0;
251
249
  }
252
250
  }
253
251
  } else {
254
- this._zincObject = undefined;
252
+ this.zincObject = undefined;
255
253
  this.size = 10;
256
254
  this.attenuation = false;
257
255
  }
258
256
  },
259
257
  modifyAttenuation: function(flag) {
260
258
  this.attenuation = flag;
261
- this._zincObject.setSizeAttenuation(flag);
259
+ this.zincObject.setSizeAttenuation(flag);
262
260
  },
263
261
  modifySize: function () {
264
- this._zincObject.setSize(this.size);
262
+ this.zincObject.setSize(this.size);
265
263
  },
266
264
  },
267
265
  };
@@ -51,7 +51,7 @@
51
51
 
52
52
  <script>
53
53
  /* eslint-disable no-alert, no-console */
54
- import { ref, shallowRef } from 'vue';
54
+ import { markRaw } from 'vue';
55
55
  import {
56
56
  ArrowRight as ElIconArrowRight,
57
57
  } from '@element-plus/icons-vue';
@@ -96,6 +96,7 @@ export default {
96
96
  drawerOpen: true,
97
97
  zincObject: undefined,
98
98
  isEditable: false,
99
+ displayString: "100%"
99
100
  };
100
101
  },
101
102
  methods: {
@@ -108,7 +109,7 @@ export default {
108
109
  },
109
110
  setObject: function(object) {
110
111
  if (object) {
111
- this.zincObject = shallowRef(object);
112
+ this.zincObject = markRaw(object);
112
113
  } else {
113
114
  this.zincObject = undefined;
114
115
  }
@@ -136,7 +137,7 @@ export default {
136
137
  }
137
138
  }
138
139
  if (object && object.getMorph()) {
139
- this.material = ref(object.getMorph().material);
140
+ this.material = object.getMorph().material;
140
141
  } else {
141
142
  this.material = undefined;
142
143
  }
@@ -37,6 +37,7 @@ import {
37
37
  } from "../scripts/Utilities.js";
38
38
  import { TreeControls } from "@abi-software/map-utilities";
39
39
  import "@abi-software/map-utilities/dist/style.css";
40
+ import { markRaw } from "vue";
40
41
 
41
42
  const nameSorting = (a, b) => {
42
43
  const labelA = a.label.toUpperCase();
@@ -74,6 +75,8 @@ export default {
74
75
  active: [],
75
76
  hover: [],
76
77
  drawerOpen: true,
78
+ nodeNumbers: 0,
79
+ module: undefined,
77
80
  };
78
81
  },
79
82
  computed: {
@@ -104,7 +107,7 @@ export default {
104
107
  parentContainer.sort((a, b) => {
105
108
  return nameSorting(a, b);
106
109
  });
107
- this.__nodeNumbers++;
110
+ this.nodeNumbers++;
108
111
  this.$nextTick(() => {
109
112
  const checked =
110
113
  this.$refs.treeControls.$refs.regionTree.getCheckedKeys();
@@ -117,8 +120,8 @@ export default {
117
120
  // '__r/'
118
121
  findOrCreateRegion: function (data, paths, prefix) {
119
122
  //check if root region has been set
120
- if (this.rootID === undefined && this.$module && this.$module.scene) {
121
- this.treeData[0].id = this.$module.scene.getRootRegion().uuid;
123
+ if (this.module && this.module.scene) {
124
+ this.treeData[0].id = this.module.scene.getRootRegion().uuid;
122
125
  this.treeData[0].isRegion = true;
123
126
  }
124
127
  if (paths.length > 0) {
@@ -127,7 +130,7 @@ export default {
127
130
  (child) => child.label == _paths[0]
128
131
  );
129
132
  const path = prefix + "/" + paths[0];
130
- const region = this.$module.scene
133
+ const region = this.module.scene
131
134
  .getRootRegion()
132
135
  .findChildFromPath(path);
133
136
  if (!childRegionItem) {
@@ -185,7 +188,7 @@ export default {
185
188
  for (let i = 0; i < regionData.children.length; i++) {
186
189
  if (regionData.children[i].label === group) {
187
190
  regionData.children.splice(i, 1);
188
- this.__nodeNumbers--;
191
+ this.nodeNumbers--;
189
192
  return;
190
193
  }
191
194
  }
@@ -196,7 +199,7 @@ export default {
196
199
  const isRegion = node.isRegion;
197
200
  const isPrimitives = node.isPrimitives;
198
201
  const isChecked = data.checkedKeys.includes(node.id);
199
- const region = this.$module.scene
202
+ const region = this.module.scene
200
203
  .getRootRegion()
201
204
  .findChildFromPath(node.regionPath);
202
205
  if (isRegion) {
@@ -238,7 +241,7 @@ export default {
238
241
  * Select a region by its name.
239
242
  */
240
243
  changeActiveByNames: function (names, regionPath, propagate) {
241
- const rootRegion = this.$module.scene.getRootRegion();
244
+ const rootRegion = this.module.scene.getRootRegion();
242
245
  const targetObjects = findObjectsWithNames(
243
246
  rootRegion,
244
247
  names,
@@ -251,7 +254,7 @@ export default {
251
254
  * Hover a region by its name.
252
255
  */
253
256
  changeHoverByNames: function (names, regionPath, propagate) {
254
- const rootRegion = this.$module.scene.getRootRegion();
257
+ const rootRegion = this.module.scene.getRootRegion();
255
258
  const targetObjects = findObjectsWithNames(
256
259
  rootRegion,
257
260
  names,
@@ -293,7 +296,7 @@ export default {
293
296
  clear: function () {
294
297
  this.active.length = 0;
295
298
  this.hover.length = 0;
296
- this.__nodeNumbers = 0;
299
+ this.nodeNumbers = 0;
297
300
  this.$refs.treeControls.$refs.regionTree.updateKeyChildren(
298
301
  this.treeData[0].id,
299
302
  []
@@ -315,7 +318,7 @@ export default {
315
318
  return "#FFFFFF";
316
319
  },
317
320
  getZincObjectsFromNode: function (node, transverse) {
318
- const rootRegion = this.$module.scene.getRootRegion();
321
+ const rootRegion = this.module.scene.getRootRegion();
319
322
  if (node.isPrimitives) {
320
323
  return findObjectsWithNames(
321
324
  rootRegion,
@@ -335,14 +338,14 @@ export default {
335
338
  },
336
339
  //Set this right at the beginning.
337
340
  setModule: function (moduleIn) {
338
- this.$module = moduleIn;
339
- this.__nodeNumbers = 0;
340
- const objects = this.$module.scene.getRootRegion().getAllObjects(true);
341
+ this.module = markRaw(moduleIn);
342
+ this.nodeNumbers = 0;
343
+ const objects = this.module.scene.getRootRegion().getAllObjects(true);
341
344
  objects.forEach((zincObject) => {
342
345
  this.zincObjectAdded(zincObject);
343
346
  });
344
- this.$module.addOrganPartAddedCallback(this.zincObjectAdded);
345
- this.$module.addOrganPartRemovedCallback(this.zincObjectRemoved);
347
+ this.module.addOrganPartAddedCallback(this.zincObjectAdded);
348
+ this.module.addOrganPartRemovedCallback(this.zincObjectRemoved);
346
349
  },
347
350
  setColourField: function (treeData, nodeData = undefined) {
348
351
  treeData
@@ -382,7 +385,7 @@ export default {
382
385
  }
383
386
  },
384
387
  visibilityToggle: function (item, event) {
385
- this.$module.changeOrganPartsVisibility(item, event);
388
+ this.module.changeOrganPartsVisibility(item, event);
386
389
  if (event == false) {
387
390
  if (this.activeRegion === item) {
388
391
  this.removeActive(true);
@@ -414,7 +417,7 @@ export default {
414
417
  list.splice(index, 1);
415
418
  ids.push(node.id);
416
419
  }
417
- const region = this.$module.scene
420
+ const region = this.module.scene
418
421
  .getRootRegion()
419
422
  .findChildFromPath(node.regionPath);
420
423
  if (nodeName && nodeName !== "__r") {
@@ -444,13 +447,13 @@ export default {
444
447
  getState: function () {
445
448
  let checkedItems =
446
449
  this.$refs.treeControls.$refs.regionTree.getCheckedKeys();
447
- if (checkedItems.length === this.__nodeNumbers) {
450
+ if (checkedItems.length === this.nodeNumbers) {
448
451
  return { checkAll: true, version: "2.0" };
449
452
  } else {
450
453
  //We cannot use the generated uuid as the identifier for permastate,
451
454
  //convert it back to paths
452
455
  let paths = convertUUIDsToFullPaths(
453
- this.$module.scene.getRootRegion(),
456
+ this.module.scene.getRootRegion(),
454
457
  checkedItems
455
458
  );
456
459
  return { checkedItems: paths, version: "2.0" };
@@ -287,26 +287,28 @@
287
287
  width="128"
288
288
  :teleported="false"
289
289
  trigger="click"
290
- popper-class="background-popper non-selectable"
290
+ popper-class="background-popper non-selectable h-auto"
291
291
  virtual-triggering
292
292
  >
293
293
  <div>
294
294
  <el-row class="backgroundText">Viewing Mode</el-row>
295
295
  <el-row class="backgroundControl">
296
- <el-select
297
- :teleported="false"
298
- v-model="viewingMode"
299
- placeholder="Select"
300
- class="scaffold-select-box viewing-mode"
301
- popper-class="scaffold_viewer_dropdown"
302
- @change="viewingModeChange"
303
- >
304
- <el-option v-for="item in viewingModes" :key="item" :label="item" :value="item">
305
- <el-row>
306
- <el-col :span="12">{{ item }}</el-col>
307
- </el-row>
308
- </el-option>
309
- </el-select>
296
+ <div style="margin-bottom: 2px;">
297
+ <template
298
+ v-for="(value, key, index) in viewingModes"
299
+ :key="key"
300
+ >
301
+ <template v-if="key === viewingMode">
302
+ <span class="viewing-mode-title"><b >{{ key }}</b></span>
303
+ </template>
304
+ <template v-else>
305
+ <span class="viewing-mode-unselected" @click="changeViewingMode(key)">{{ key }}</span>
306
+ </template>
307
+ </template>
308
+ </div>
309
+ <el-row class="viewing-mode-description">
310
+ {{ viewingModes[viewingMode] }}
311
+ </el-row>
310
312
  </el-row>
311
313
  <el-row class="backgroundSpacer"></el-row>
312
314
  <el-row class="backgroundText"> Change background </el-row>
@@ -564,6 +566,20 @@ export default {
564
566
  type: Boolean,
565
567
  default: false,
566
568
  },
569
+ /**
570
+ * GroupName to value pair.
571
+ * The value can be a single number or and object in the following
572
+ * form:
573
+ *
574
+ * {
575
+ * number: Number,
576
+ * imgURL: String
577
+ * }
578
+ *
579
+ * When imgURL is specified, scaffoldvuer will attempt to render
580
+ * the image in imgURL as marker instead.
581
+ *
582
+ */
567
583
  markerLabels : {
568
584
  type: Object,
569
585
  default: function () {
@@ -776,10 +792,10 @@ export default {
776
792
  fileFormat: "metadata",
777
793
  previousMarkerLabels: markRaw({}),
778
794
  viewingMode: "Exploration",
779
- viewingModes: [
780
- "Annotation",
781
- "Exploration",
782
- ],
795
+ viewingModes: {
796
+ "Exploration": "View and explore detailed visualization of 3D scaffolds",
797
+ "Annotation": "View internal identifiers of features",
798
+ },
783
799
  openMapRef: undefined,
784
800
  backgroundIconRef: undefined,
785
801
  userInformation: undefined,
@@ -1863,9 +1879,13 @@ export default {
1863
1879
  },
1864
1880
  /**
1865
1881
  * Callback on viewing mode change
1882
+ * Optional, can be used to update the view mode.
1866
1883
  */
1867
- viewingModeChange: function () {
1884
+ changeViewingMode: function (modeName) {
1868
1885
  if (this.$module) {
1886
+ if (modeName) {
1887
+ this.viewingMode = modeName
1888
+ }
1869
1889
  if (this.viewingMode === "Annotation") {
1870
1890
  let authenticated = false;
1871
1891
  if (this.userInformation) {
@@ -1919,13 +1939,19 @@ export default {
1919
1939
  /**
1920
1940
  * Set the marker modes for objects with the provided name, mode can
1921
1941
  * be "on", "off" or "inherited".
1942
+ * Value can either be number or an object containing number and
1943
+ * imgURL.
1922
1944
  */
1923
- setMarkerModeForObjectsWithName: function (name, number, mode) {
1945
+ setMarkerModeForObjectsWithName: function (name, value, mode) {
1924
1946
  if (name && this.$module.scene) {
1947
+ let options = value;
1948
+ if (typeof value === 'number') {
1949
+ options = { number: value, imgURL: undefined };
1950
+ }
1925
1951
  const rootRegion = this.$module.scene.getRootRegion();
1926
1952
  const groups = [name];
1927
1953
  const objects = findObjectsWithNames(rootRegion, groups, "", true);
1928
- objects.forEach(object => object.setMarkerMode(mode, { number }));
1954
+ objects.forEach(object => object.setMarkerMode(mode, options));
1929
1955
  }
1930
1956
  },
1931
1957
  /**
@@ -2478,6 +2504,10 @@ export default {
2478
2504
  }
2479
2505
  }
2480
2506
 
2507
+ :deep(.background-popper.el-popover.el-popper.h-auto) {
2508
+ height: auto !important;
2509
+ }
2510
+
2481
2511
  :deep(.open-map-popper.el-popover.el-popper) {
2482
2512
  padding-top: 5px;
2483
2513
  padding-bottom: 5px;
@@ -2680,15 +2710,38 @@ export default {
2680
2710
  }
2681
2711
  }
2682
2712
 
2713
+ .viewing-mode-title {
2714
+ font-size: 14px;
2715
+ font-weight: 600;
2716
+ color: $app-primary-color;
2717
+ margin: 8px;
2718
+ text-decoration: underline;
2719
+ cursor: pointer;
2720
+ }
2721
+
2722
+ .viewing-mode-unselected {
2723
+ font-size: 11px;
2724
+ font-weight: 600;
2725
+ color: rgb(48, 49, 51);
2726
+ margin: 8px;
2727
+ opacity: 0.5;
2728
+ cursor: pointer;
2729
+ }
2730
+
2731
+ .viewing-mode-description {
2732
+ font-size: 12px;
2733
+ color: rgb(48, 49, 51);
2734
+ text-align: left;
2735
+ padding-bottom: 4px;
2736
+ margin-left: 8px;
2737
+ }
2738
+
2683
2739
  .scaffold-select-box {
2684
2740
  border-radius: 4px;
2685
2741
  border: 1px solid rgb(144, 147, 153);
2686
2742
  background-color: var(--white);
2687
2743
  font-weight: 500;
2688
2744
  color: rgb(48, 49, 51);
2689
- &.viewing-mode {
2690
- width: 150px!important;
2691
- }
2692
2745
 
2693
2746
  &.speed {
2694
2747
  margin-left: 8px;
@@ -79,6 +79,7 @@ import {
79
79
  ElSlider as Slider,
80
80
  ElOption as Option,
81
81
  } from "element-plus";
82
+ import { markRaw } from 'vue';
82
83
 
83
84
  /**
84
85
  * A component to control the opacity of the target object.
@@ -116,39 +117,37 @@ export default {
116
117
  label: "z",
117
118
  },
118
119
  ],
120
+ zincObject: undefined,
119
121
  };
120
122
  },
121
- mounted: function () {
122
- this._zincObject = undefined;
123
- },
124
123
  methods: {
125
124
  setObject: function (object) {
126
125
  if (object.isTextureSlides) {
127
- this._zincObject = object;
128
- this.settings = this._zincObject.getTextureSettings();
126
+ this.zincObject = markRaw(object);
127
+ this.settings = this.zincObject.getTextureSettings();
129
128
  } else {
130
- this._zincObject = undefined;
129
+ this.zincObject = undefined;
131
130
  this.settings = [];
132
131
  }
133
132
  },
134
133
  addNewSlide: function () {
135
134
  const newSettings = { direction: "x", value: 0 };
136
- const returnSettings = this._zincObject.createSlide(newSettings);
135
+ const returnSettings = this.zincObject.createSlide(newSettings);
137
136
  this.settings.push(returnSettings);
138
137
  },
139
138
  modifyDirection: function(direction, slide) {
140
139
  if (slide) {
141
140
  slide.direction = direction;
142
- this._zincObject.modifySlideSettings(slide);
141
+ this.zincObject.modifySlideSettings(slide);
143
142
  }
144
143
  },
145
144
  modifySlide: function (slide) {
146
145
  if (slide) {
147
- this._zincObject.modifySlideSettings(slide);
146
+ this.zincObject.modifySlideSettings(slide);
148
147
  }
149
148
  },
150
149
  removeSlide: function (index, slide) {
151
- this._zincObject.removeSlideWithId(slide.id);
150
+ this.zincObject.removeSlideWithId(slide.id);
152
151
  this.settings.splice(index, 1);
153
152
  },
154
153
  },
@@ -119,6 +119,7 @@ import {
119
119
  ElMain as Main,
120
120
  ElSlider as Slider,
121
121
  } from "element-plus";
122
+ import { markRaw } from "vue";
122
123
 
123
124
  /**
124
125
  * A component to control the opacity of the target object.
@@ -141,6 +142,7 @@ export default {
141
142
  scale: 1,
142
143
  min: [0, 0, 0],
143
144
  max: [1, 1, 1],
145
+ zincObject: undefined,
144
146
  };
145
147
  },
146
148
  watch: {
@@ -163,14 +165,11 @@ export default {
163
165
  deep: true,
164
166
  },
165
167
  },
166
- mounted: function () {
167
- this._zincObject = undefined;
168
- },
169
168
  methods: {
170
169
  setObject: function (object) {
171
170
  if (object.isZincObject) {
172
- this._zincObject = object;
173
- const morph = this._zincObject.getGroup();
171
+ this.zincObject = markRaw(object);
172
+ const morph = this.zincObject.getGroup();
174
173
  if (morph && morph.position) {
175
174
  this.x = morph.position.x;
176
175
  this.y = morph.position.y;
@@ -178,7 +177,7 @@ export default {
178
177
  this.scale = morph.scale.x;
179
178
  }
180
179
  } else {
181
- this._zincObject = undefined;
180
+ this.zincObject = undefined;
182
181
  this.x = 0;
183
182
  this.y = 0;
184
183
  this.z = 0;
@@ -186,10 +185,10 @@ export default {
186
185
  }
187
186
  },
188
187
  modifyPosition: function() {
189
- this._zincObject.setPosition(this.x, this.y, this.z);
188
+ this.zincObject.setPosition(this.x, this.y, this.z);
190
189
  },
191
190
  modifyScale: function() {
192
- this._zincObject.setScaleAll(this.scale);
191
+ this.zincObject.setScaleAll(this.scale);
193
192
  },
194
193
  },
195
194
  };