@abi-software/scaffoldvuer 1.21.1-beta.2 → 2.0.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/README.md +31 -12
- package/dist/index.html +9 -6
- package/dist/scaffoldvuer.js +14095 -13154
- package/dist/scaffoldvuer.umd.cjs +48 -48
- package/dist/style.css +1 -1
- package/eslint.config.js +37 -9
- package/package.json +10 -3
- package/public/index.html +9 -6
- package/src/App.vue +312 -279
- package/src/ScaffoldVuer-wc.js +4 -4
- package/src/app/DropZone.vue +11 -27
- package/src/app/ModelsInformation.js +22 -19
- package/src/app/ModelsTable.vue +42 -65
- package/src/app/TextureDemos.js +38 -64
- package/src/assets/_variables.scss +12 -10
- package/src/components/GlyphsControls.vue +3 -23
- package/src/components/LinesControls.vue +27 -66
- package/src/components/OpacityControls.vue +22 -26
- package/src/components/PointsControls.vue +20 -71
- package/src/components/PrimitiveControls.vue +35 -49
- package/src/components/ScaffoldOverlay.vue +63 -63
- package/src/components/ScaffoldTooltip.vue +36 -49
- package/src/components/ScaffoldTreeControls.vue +81 -129
- package/src/components/ScaffoldVuer.vue +509 -498
- package/src/components/TextureSlidesControls.vue +22 -64
- package/src/components/TransformationControls.vue +15 -42
- package/src/components/index.js +2 -2
- package/src/main.js +16 -18
- package/src/scripts/Annotation.js +3 -3
- package/src/scripts/BaseModule.js +26 -30
- package/src/scripts/EventNotifier.js +30 -36
- package/src/scripts/GraphicsHighlight.js +43 -50
- package/src/scripts/LocalFilesHelper.js +27 -26
- package/src/scripts/MappedNerves.js +2139 -697
- package/src/scripts/MappedOrgans.js +24 -25
- package/src/scripts/OrgansRenderer.js +445 -425
- package/src/scripts/RendererModule.js +133 -122
- package/src/scripts/Search.js +135 -151
- package/src/scripts/Utilities.js +129 -127
- package/src/scripts/WebGL.js +57 -91
- package/src/scripts/niftiHelper.js +3 -3
- package/src/store/index.js +7 -7
- package/vite.config.js +51 -50
- package/vite.static-build.js +7 -7
- package/vuese-generator.js +48 -56
package/src/ScaffoldVuer-wc.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import Vue from 'vue'
|
|
1
|
+
import Vue from 'vue';
|
|
2
2
|
import vueCustomElement from 'vue-custom-element';
|
|
3
3
|
|
|
4
4
|
Vue.use(vueCustomElement);
|
|
5
5
|
|
|
6
|
-
import ScaffoldVuer from
|
|
6
|
+
import ScaffoldVuer from './components/ScaffoldVuer.vue';
|
|
7
7
|
|
|
8
|
-
Vue.customElement(
|
|
8
|
+
Vue.customElement('scaffoldvuer-wc', ScaffoldVuer);
|
|
9
9
|
|
|
10
10
|
/*
|
|
11
11
|
const wrappedElement = wrap(Vue, ScaffoldVuer);
|
|
12
12
|
|
|
13
13
|
window.customElements.define("scaffoldvuer-wc", wrappedElement);
|
|
14
|
-
*/
|
|
14
|
+
*/
|
package/src/app/DropZone.vue
CHANGED
|
@@ -1,30 +1,17 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div
|
|
3
|
-
ref="dropEl"
|
|
4
|
-
class="dropzone"
|
|
5
|
-
>
|
|
2
|
+
<div ref="dropEl" class="dropzone">
|
|
6
3
|
<slot />
|
|
7
|
-
<input
|
|
8
|
-
ref="fileInput"
|
|
9
|
-
type="file"
|
|
10
|
-
>
|
|
4
|
+
<input ref="fileInput" type="file" />
|
|
11
5
|
</div>
|
|
12
6
|
</template>
|
|
13
7
|
|
|
14
8
|
<script>
|
|
15
|
-
/* eslint-disable no-alert, no-console */
|
|
16
9
|
import { markRaw } from 'vue';
|
|
17
|
-
import { SimpleDropzone } from
|
|
18
|
-
import { createURLFromFiles } from
|
|
19
|
-
|
|
20
|
-
const getJSON = async (URL) => {
|
|
21
|
-
return fetch(URL)
|
|
22
|
-
.then((response) => response.json())
|
|
23
|
-
.then((responseJson) => {return responseJson});
|
|
24
|
-
}
|
|
10
|
+
import { SimpleDropzone } from 'simple-dropzone';
|
|
11
|
+
import { createURLFromFiles } from '../scripts/LocalFilesHelper.js';
|
|
25
12
|
|
|
26
13
|
export default {
|
|
27
|
-
name:
|
|
14
|
+
name: 'DropZone',
|
|
28
15
|
data: function () {
|
|
29
16
|
return {
|
|
30
17
|
objectURLs: markRaw([]),
|
|
@@ -32,20 +19,17 @@ export default {
|
|
|
32
19
|
};
|
|
33
20
|
},
|
|
34
21
|
mounted: function () {
|
|
35
|
-
const dropCtrl = new SimpleDropzone(
|
|
36
|
-
|
|
37
|
-
this.$refs.fileInput
|
|
38
|
-
);
|
|
39
|
-
dropCtrl.on("drop", ({ files }) => {
|
|
22
|
+
const dropCtrl = new SimpleDropzone(this.$refs.dropEl, this.$refs.fileInput);
|
|
23
|
+
dropCtrl.on('drop', ({ files }) => {
|
|
40
24
|
this.localDrop(files);
|
|
41
25
|
});
|
|
42
26
|
},
|
|
43
27
|
methods: {
|
|
44
|
-
findRealFilename: function(objectURL) {
|
|
45
|
-
return this.filesMapping[objectURL]
|
|
28
|
+
findRealFilename: function (objectURL) {
|
|
29
|
+
return this.filesMapping[objectURL];
|
|
46
30
|
},
|
|
47
31
|
revokeURLs: function () {
|
|
48
|
-
this.objectURLs.forEach(objectURL => URL.revokeObjectURL(objectURL));
|
|
32
|
+
this.objectURLs.forEach((objectURL) => URL.revokeObjectURL(objectURL));
|
|
49
33
|
this.objectURLs.length = 0;
|
|
50
34
|
this.filesMapping = markRaw({});
|
|
51
35
|
},
|
|
@@ -61,7 +45,7 @@ export default {
|
|
|
61
45
|
Object.assign(this.filesMapping, data.filesMapping);
|
|
62
46
|
}
|
|
63
47
|
if (data.format && data.url) {
|
|
64
|
-
this.$emit(
|
|
48
|
+
this.$emit('files-drop', { url: data.url, format: data.format });
|
|
65
49
|
}
|
|
66
50
|
}
|
|
67
51
|
},
|
|
@@ -26,38 +26,41 @@ export default async function(keywords, spreadsheet_id, service_email, service_k
|
|
|
26
26
|
}
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
-
export default async function(keywords, spreadsheet_id) {
|
|
29
|
+
export default async function (keywords, spreadsheet_id) {
|
|
30
30
|
const gid = '0';
|
|
31
|
-
const response = await fetch(
|
|
31
|
+
const response = await fetch(
|
|
32
|
+
`https://docs.google.com/spreadsheets/d/${spreadsheet_id}/gviz/tq?tqx=out:json&tq&gid=${gid}`,
|
|
33
|
+
);
|
|
32
34
|
const txt = await response.text();
|
|
33
35
|
|
|
34
36
|
const jsonString = txt.match(/(?<="table":).*(?=}\);)/g)[0];
|
|
35
37
|
const json = JSON.parse(jsonString);
|
|
36
38
|
const tableData = [];
|
|
37
39
|
const labelRow = [];
|
|
38
|
-
json.cols.forEach(colonne => labelRow.push(colonne.label));
|
|
40
|
+
json.cols.forEach((colonne) => labelRow.push(colonne.label));
|
|
39
41
|
const keywordsIndex = [];
|
|
40
|
-
keywords.forEach(key => keywordsIndex.push(labelRow.indexOf(key)));
|
|
42
|
+
keywords.forEach((key) => keywordsIndex.push(labelRow.indexOf(key)));
|
|
41
43
|
const rawTable = [];
|
|
42
|
-
json.rows.forEach(r => {
|
|
43
|
-
const row = []
|
|
44
|
-
r.c.forEach(cel => {
|
|
45
|
-
let value
|
|
46
|
-
try{
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
44
|
+
json.rows.forEach((r) => {
|
|
45
|
+
const row = [];
|
|
46
|
+
r.c.forEach((cel) => {
|
|
47
|
+
let value;
|
|
48
|
+
try {
|
|
49
|
+
value = cel.f ? cel.f : cel.v;
|
|
50
|
+
} catch (_e) {
|
|
51
|
+
value = '';
|
|
52
|
+
}
|
|
53
|
+
row.push(value);
|
|
54
|
+
});
|
|
55
|
+
rawTable.push(row);
|
|
56
|
+
});
|
|
57
|
+
rawTable.forEach((row) => {
|
|
53
58
|
const mappedData = {};
|
|
54
|
-
keywordsIndex.forEach(index => {
|
|
59
|
+
keywordsIndex.forEach((index) => {
|
|
55
60
|
mappedData[labelRow[index]] = row[index];
|
|
56
|
-
|
|
57
61
|
});
|
|
58
62
|
tableData.push(mappedData);
|
|
59
63
|
});
|
|
60
|
-
|
|
61
64
|
|
|
62
|
-
return tableData
|
|
65
|
+
return tableData;
|
|
63
66
|
}
|
package/src/app/ModelsTable.vue
CHANGED
|
@@ -1,51 +1,26 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div>
|
|
3
|
-
<el-input
|
|
4
|
-
v-model="search"
|
|
5
|
-
size="small"
|
|
6
|
-
placeholder="Type to search"
|
|
7
|
-
/>
|
|
3
|
+
<el-input v-model="search" size="small" placeholder="Type to search" />
|
|
8
4
|
<el-table
|
|
9
|
-
:data="
|
|
10
|
-
|
|
11
|
-
data
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
5
|
+
:data="
|
|
6
|
+
tableData.filter(
|
|
7
|
+
(data) =>
|
|
8
|
+
!search ||
|
|
9
|
+
data.Organ.toLowerCase().includes(search.toLowerCase()) ||
|
|
10
|
+
data.Species.toLowerCase().includes(search.toLowerCase()) ||
|
|
11
|
+
data.Note.toLowerCase().includes(search.toLowerCase()),
|
|
12
|
+
)
|
|
13
|
+
"
|
|
14
|
+
style="width: 100%"
|
|
15
15
|
height="600"
|
|
16
16
|
>
|
|
17
|
-
<el-table-column
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
<el-table-column
|
|
23
|
-
prop="Species"
|
|
24
|
-
label="Species"
|
|
25
|
-
width="100"
|
|
26
|
-
/>
|
|
27
|
-
<el-table-column
|
|
28
|
-
prop="Note"
|
|
29
|
-
label="Note"
|
|
30
|
-
width="200"
|
|
31
|
-
/>
|
|
32
|
-
<el-table-column
|
|
33
|
-
prop="Last modified"
|
|
34
|
-
label="Last modified"
|
|
35
|
-
width="250"
|
|
36
|
-
/>
|
|
37
|
-
<el-table-column
|
|
38
|
-
fixed="right"
|
|
39
|
-
label="Action"
|
|
40
|
-
width="300"
|
|
41
|
-
>
|
|
17
|
+
<el-table-column prop="Organ" label="Organ" width="100" />
|
|
18
|
+
<el-table-column prop="Species" label="Species" width="100" />
|
|
19
|
+
<el-table-column prop="Note" label="Note" width="200" />
|
|
20
|
+
<el-table-column prop="Last modified" label="Last modified" width="250" />
|
|
21
|
+
<el-table-column fixed="right" label="Action" width="300">
|
|
42
22
|
<template #default="scope">
|
|
43
|
-
<el-button
|
|
44
|
-
size="small"
|
|
45
|
-
@click="handleView(scope.row)"
|
|
46
|
-
>
|
|
47
|
-
View
|
|
48
|
-
</el-button>
|
|
23
|
+
<el-button size="small" @click="handleView(scope.row)">View</el-button>
|
|
49
24
|
<el-button
|
|
50
25
|
v-if="scope.row.Discover !== 'Not even'"
|
|
51
26
|
size="small"
|
|
@@ -61,33 +36,35 @@
|
|
|
61
36
|
Blackfynn
|
|
62
37
|
</el-button>
|
|
63
38
|
</template>
|
|
64
|
-
</el-table-column>
|
|
39
|
+
</el-table-column>
|
|
65
40
|
</el-table>
|
|
66
41
|
</div>
|
|
67
42
|
</template>
|
|
68
43
|
|
|
69
44
|
<script>
|
|
70
|
-
|
|
71
|
-
import getTableData from "./ModelsInformation.js";
|
|
45
|
+
import getTableData from './ModelsInformation.js';
|
|
72
46
|
|
|
73
|
-
import {
|
|
47
|
+
import {
|
|
74
48
|
ElButton as Button,
|
|
75
49
|
ElInput as Input,
|
|
76
50
|
ElTable as Table,
|
|
77
|
-
ElTableColumn as TableColumn
|
|
78
|
-
} from
|
|
51
|
+
ElTableColumn as TableColumn,
|
|
52
|
+
} from 'element-plus';
|
|
79
53
|
|
|
80
54
|
export default {
|
|
81
|
-
name:
|
|
82
|
-
components: [
|
|
83
|
-
Button,
|
|
84
|
-
Input,
|
|
85
|
-
Table,
|
|
86
|
-
TableColumn
|
|
87
|
-
],
|
|
55
|
+
name: 'ModelsTable',
|
|
56
|
+
components: [Button, Input, Table, TableColumn],
|
|
88
57
|
async setup() {
|
|
89
|
-
const keywords = [
|
|
90
|
-
|
|
58
|
+
const keywords = [
|
|
59
|
+
'Organ',
|
|
60
|
+
'Species',
|
|
61
|
+
'Note',
|
|
62
|
+
'Location',
|
|
63
|
+
'Last modified',
|
|
64
|
+
'Blackfynn dataset',
|
|
65
|
+
'Published',
|
|
66
|
+
'Discover',
|
|
67
|
+
];
|
|
91
68
|
const spreadsheet_id = import.meta.env.VITE_GOOGLE_SPREADSHEET_ID;
|
|
92
69
|
const service_email = import.meta.env.VITE_GOOGLE_SERVICE_SCAFFOLDVUER_EMAIL;
|
|
93
70
|
const service_key = import.meta.env.VITE_GOOGLE_PRIVATE_SCAFFOLDVUER_KEY;
|
|
@@ -97,18 +74,18 @@ export default {
|
|
|
97
74
|
data() {
|
|
98
75
|
return {
|
|
99
76
|
search: '',
|
|
100
|
-
}
|
|
77
|
+
};
|
|
101
78
|
},
|
|
102
79
|
methods: {
|
|
103
|
-
handleView: function(row) {
|
|
104
|
-
this.$emit(
|
|
80
|
+
handleView: function (row) {
|
|
81
|
+
this.$emit('viewModelClicked', row.Location);
|
|
105
82
|
},
|
|
106
|
-
handleDiscover: function(row) {
|
|
107
|
-
window.open(row.Discover,
|
|
83
|
+
handleDiscover: function (row) {
|
|
84
|
+
window.open(row.Discover, '_blank');
|
|
108
85
|
},
|
|
109
|
-
handleBlackfynn: function(row) {
|
|
110
|
-
window.open(row['Blackfynn dataset'],
|
|
86
|
+
handleBlackfynn: function (row) {
|
|
87
|
+
window.open(row['Blackfynn dataset'], '_blank');
|
|
111
88
|
},
|
|
112
|
-
}
|
|
89
|
+
},
|
|
113
90
|
};
|
|
114
91
|
</script>
|
package/src/app/TextureDemos.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import * as volumeTexture from
|
|
1
|
+
import * as volumeTexture from 'zincjs/src/shaders/volumeTexture.js';
|
|
2
2
|
|
|
3
3
|
const getVolumeTexture = (texture) => {
|
|
4
4
|
const myUniforms = volumeTexture.getUniforms();
|
|
5
5
|
myUniforms.volume_scale.value.set(
|
|
6
6
|
texture.size.width / texture.size.depth,
|
|
7
7
|
texture.size.height / texture.size.depth,
|
|
8
|
-
1
|
|
8
|
+
1,
|
|
9
9
|
);
|
|
10
10
|
myUniforms.diffuse.value = texture.impl;
|
|
11
11
|
myUniforms.depth.value = texture.size.depth;
|
|
@@ -33,7 +33,7 @@ const getTexture = async (scaffoldModule, texture_prefix) => {
|
|
|
33
33
|
export const testVolume = async (scaffoldVuer, texture_prefix) => {
|
|
34
34
|
const cube = new scaffoldVuer.$module.Zinc.THREE.BoxGeometry(1, 1, 1);
|
|
35
35
|
const zincObject = new scaffoldVuer.$module.Zinc.Geometry();
|
|
36
|
-
zincObject.setName(
|
|
36
|
+
zincObject.setName('Texture volume');
|
|
37
37
|
cube.translate(0.5, 0.5, 0.5);
|
|
38
38
|
let meshOptions = {};
|
|
39
39
|
meshOptions.opacity = 1.0;
|
|
@@ -44,70 +44,53 @@ export const testVolume = async (scaffoldVuer, texture_prefix) => {
|
|
|
44
44
|
const material = texture.getMaterial(options);
|
|
45
45
|
zincObject.createMesh(cube, material, meshOptions);
|
|
46
46
|
scaffoldVuer.addZincObject(zincObject);
|
|
47
|
-
zincObject.getMorph().matrix.set(
|
|
48
|
-
-100,
|
|
49
|
-
0,
|
|
50
|
-
0,
|
|
51
|
-
-60,
|
|
52
|
-
0,
|
|
53
|
-
-100,
|
|
54
|
-
0,
|
|
55
|
-
-100,
|
|
56
|
-
0,
|
|
57
|
-
0,
|
|
58
|
-
-100,
|
|
59
|
-
30,
|
|
60
|
-
0,
|
|
61
|
-
0,
|
|
62
|
-
0,
|
|
63
|
-
1
|
|
64
|
-
);
|
|
47
|
+
zincObject.getMorph().matrix.set(-100, 0, 0, -60, 0, -100, 0, -100, 0, 0, -100, 30, 0, 0, 0, 1);
|
|
65
48
|
window.texture = zincObject;
|
|
66
49
|
};
|
|
67
50
|
|
|
68
|
-
const addCylinder = (scaffoldVuer) => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
51
|
+
// const addCylinder = (scaffoldVuer) => {
|
|
52
|
+
// const THREE = scaffoldVuer.$module.Zinc.THREE;
|
|
53
|
+
// const cylinderGeometry = new THREE.CylinderGeometry(50, 50, 200, 80);
|
|
54
|
+
// const material = new THREE.MeshPhongMaterial({ color: 0xffff00, side: THREE.DoubleSide });
|
|
55
|
+
// const cylinderMesh = new THREE.Mesh(cylinderGeometry, material);
|
|
56
|
+
// const zincGeometry = new scaffoldVuer.$module.Zinc.Geometry();
|
|
57
|
+
// zincGeometry.setMesh(cylinderMesh, false, false);
|
|
58
|
+
// zincGeometry.setName('Cylinder');
|
|
59
|
+
// scaffoldVuer.addZincObject(zincGeometry);
|
|
60
|
+
// };
|
|
78
61
|
|
|
79
62
|
export const testSlides = async (scaffoldVuer, texture_prefix) => {
|
|
80
63
|
const scaffoldModule = scaffoldVuer.$module;
|
|
81
64
|
const texture = await getTexture(scaffoldModule, texture_prefix);
|
|
82
65
|
const textureSlides = new scaffoldModule.Zinc.TextureSlides(texture);
|
|
83
|
-
textureSlides.setName(
|
|
66
|
+
textureSlides.setName('Texture slides');
|
|
84
67
|
textureSlides.createSlides([
|
|
85
68
|
{
|
|
86
|
-
direction:
|
|
69
|
+
direction: 'y',
|
|
87
70
|
value: 0.1,
|
|
88
71
|
},
|
|
89
72
|
{
|
|
90
|
-
direction:
|
|
73
|
+
direction: 'y',
|
|
91
74
|
value: 0.3,
|
|
92
75
|
},
|
|
93
76
|
{
|
|
94
|
-
direction:
|
|
77
|
+
direction: 'y',
|
|
95
78
|
value: 0.5,
|
|
96
79
|
},
|
|
97
80
|
{
|
|
98
|
-
direction:
|
|
81
|
+
direction: 'y',
|
|
99
82
|
value: 0.7,
|
|
100
83
|
},
|
|
101
84
|
{
|
|
102
|
-
direction:
|
|
85
|
+
direction: 'y',
|
|
103
86
|
value: 0.9,
|
|
104
87
|
},
|
|
105
88
|
{
|
|
106
|
-
direction:
|
|
89
|
+
direction: 'x',
|
|
107
90
|
value: 0.5,
|
|
108
91
|
},
|
|
109
92
|
{
|
|
110
|
-
direction:
|
|
93
|
+
direction: 'z',
|
|
111
94
|
value: 0.5,
|
|
112
95
|
},
|
|
113
96
|
]);
|
|
@@ -125,25 +108,24 @@ export const testSlides = async (scaffoldVuer, texture_prefix) => {
|
|
|
125
108
|
|
|
126
109
|
const padNumber = (number) => {
|
|
127
110
|
let string = number.toString();
|
|
128
|
-
while(string.length < 4) {
|
|
129
|
-
string =
|
|
111
|
+
while (string.length < 4) {
|
|
112
|
+
string = '0' + string;
|
|
130
113
|
}
|
|
131
114
|
return string;
|
|
132
|
-
}
|
|
115
|
+
};
|
|
133
116
|
|
|
134
117
|
const getArmTexture = async (scaffoldModule) => {
|
|
135
118
|
const imgArray = [];
|
|
136
|
-
const prefix =
|
|
119
|
+
const prefix = 'https://mapcore-bucket1.s3.us-west-2.amazonaws.com/texture/arm1/jpg';
|
|
137
120
|
const texture = new scaffoldModule.Zinc.TextureArray();
|
|
138
121
|
for (let i = 984; i <= 2184;) {
|
|
139
122
|
imgArray.push(`${prefix}/${padNumber(i)}.jpg`);
|
|
140
|
-
i = i + 10
|
|
123
|
+
i = i + 10;
|
|
141
124
|
}
|
|
142
125
|
await texture.loadFromImages(imgArray);
|
|
143
126
|
return texture;
|
|
144
127
|
};
|
|
145
128
|
|
|
146
|
-
|
|
147
129
|
/*
|
|
148
130
|
{
|
|
149
131
|
"id": "mesh-location-orientation",
|
|
@@ -162,8 +144,8 @@ const getArmTexture = async (scaffoldModule) => {
|
|
|
162
144
|
*/
|
|
163
145
|
|
|
164
146
|
//https://threejs.org/docs/#manual/en/introduction/Matrix-transformations
|
|
165
|
-
const applyTransformation = (scaffoldVuer, mesh, rotation, position, scale,
|
|
166
|
-
//if (
|
|
147
|
+
const applyTransformation = (scaffoldVuer, mesh, rotation, position, scale, _reference) => {
|
|
148
|
+
//if (_reference === "centre") {
|
|
167
149
|
// mesh.geometry.translate(-0.5, -0.5, -0.5);
|
|
168
150
|
//}
|
|
169
151
|
const THREE = scaffoldVuer.$module.Zinc.THREE;
|
|
@@ -184,48 +166,40 @@ const applyTransformation = (scaffoldVuer, mesh, rotation, position, scale, refe
|
|
|
184
166
|
0,
|
|
185
167
|
0,
|
|
186
168
|
0,
|
|
187
|
-
0
|
|
169
|
+
0,
|
|
188
170
|
);
|
|
189
171
|
const quaternion = new THREE.Quaternion().setFromRotationMatrix(matrix);
|
|
190
172
|
mesh.position.set(...position);
|
|
191
|
-
mesh.quaternion.copy(
|
|
173
|
+
mesh.quaternion.copy(quaternion);
|
|
192
174
|
mesh.scale.set(...scale);
|
|
193
175
|
mesh.updateMatrix();
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
|
|
176
|
+
};
|
|
197
177
|
|
|
198
178
|
export const testArmSlides = async (scaffoldVuer) => {
|
|
199
179
|
const scaffoldModule = scaffoldVuer.$module;
|
|
200
180
|
const texture = await getArmTexture(scaffoldModule);
|
|
201
181
|
const textureSlides = new scaffoldModule.Zinc.TextureSlides(texture);
|
|
202
|
-
textureSlides.setName(
|
|
182
|
+
textureSlides.setName('Arm texture');
|
|
203
183
|
textureSlides.createSlides([
|
|
204
184
|
{
|
|
205
|
-
direction:
|
|
185
|
+
direction: 'x',
|
|
206
186
|
value: 0.5,
|
|
207
187
|
},
|
|
208
188
|
{
|
|
209
|
-
direction:
|
|
189
|
+
direction: 'y',
|
|
210
190
|
value: 0.5,
|
|
211
191
|
},
|
|
212
192
|
{
|
|
213
|
-
direction:
|
|
193
|
+
direction: 'z',
|
|
214
194
|
value: 0.5,
|
|
215
195
|
},
|
|
216
196
|
]);
|
|
217
197
|
|
|
218
|
-
const rotation = [
|
|
219
|
-
0, 0, 1,
|
|
220
|
-
0, 1, 0,
|
|
221
|
-
-1, 0, 0
|
|
222
|
-
];
|
|
198
|
+
const rotation = [0, 0, 1, 0, 1, 0, -1, 0, 0];
|
|
223
199
|
const position = [0, -1.0, 0.95];
|
|
224
200
|
const scale = [1.6, 1.6, 1.2];
|
|
225
|
-
const reference =
|
|
201
|
+
const reference = 'corner';
|
|
226
202
|
applyTransformation(scaffoldVuer, textureSlides.morph, rotation, position, scale, reference);
|
|
227
203
|
scaffoldVuer.addZincObject(textureSlides);
|
|
228
204
|
scaffoldVuer.fitWindow();
|
|
229
205
|
};
|
|
230
|
-
|
|
231
|
-
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
// Primary colors
|
|
2
|
-
$purple: #
|
|
3
|
-
$darkBlue: #
|
|
2
|
+
$purple: #8300bf;
|
|
3
|
+
$darkBlue: #24245b;
|
|
4
4
|
$grey: #303133;
|
|
5
5
|
|
|
6
6
|
// Secondary colors
|
|
7
|
-
$lightPurple: #
|
|
8
|
-
$blue: #
|
|
7
|
+
$lightPurple: #bc00fc;
|
|
8
|
+
$blue: #0026ff;
|
|
9
9
|
|
|
10
10
|
// Status colors
|
|
11
11
|
$success: #5e9f69;
|
|
12
|
-
$warning: #
|
|
12
|
+
$warning: #ff8400;
|
|
13
13
|
$danger: #b51d09;
|
|
14
14
|
|
|
15
15
|
// Text colors
|
|
@@ -18,12 +18,12 @@ $mediumGrey: #606266;
|
|
|
18
18
|
$lightGrey: #909399;
|
|
19
19
|
|
|
20
20
|
// Line colors
|
|
21
|
-
$lineColor1: #
|
|
22
|
-
$lineColor2: #
|
|
21
|
+
$lineColor1: #dcdfe6;
|
|
22
|
+
$lineColor2: #e4e7ed;
|
|
23
23
|
|
|
24
24
|
// Background colors
|
|
25
|
-
$background: #
|
|
26
|
-
$cochlear: #
|
|
25
|
+
$background: #f5f7fa;
|
|
26
|
+
$cochlear: #ffffff;
|
|
27
27
|
|
|
28
28
|
//Search box colors
|
|
29
29
|
$darkGrey: #606266;
|
|
@@ -33,7 +33,9 @@ $app-secondary-color: $darkBlue;
|
|
|
33
33
|
$text-color: $grey;
|
|
34
34
|
$input-text: $grey;
|
|
35
35
|
|
|
36
|
-
$system-font:
|
|
36
|
+
$system-font:
|
|
37
|
+
-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell,
|
|
38
|
+
'Helvetica Neue', sans-serif !important;
|
|
37
39
|
$font-family: 'Asap', sans-serif;
|
|
38
40
|
|
|
39
41
|
// Viewport Sizes
|
|
@@ -1,33 +1,17 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<el-container class="glyph-container">
|
|
3
|
-
<el-checkbox
|
|
4
|
-
v-model="displayLabels"
|
|
5
|
-
class="block"
|
|
6
|
-
>
|
|
7
|
-
Display labels
|
|
8
|
-
</el-checkbox>
|
|
3
|
+
<el-checkbox v-model="displayLabels" class="block">Display labels</el-checkbox>
|
|
9
4
|
</el-container>
|
|
10
5
|
</template>
|
|
11
6
|
|
|
12
7
|
<script>
|
|
13
|
-
/* eslint-disable no-alert, no-console */
|
|
14
8
|
import { markRaw } from 'vue';
|
|
15
|
-
import {
|
|
16
|
-
ElCheckbox as Checkbox,
|
|
17
|
-
ElContainer as Container,
|
|
18
|
-
ElMain as Main,
|
|
19
|
-
} from "element-plus";
|
|
20
9
|
|
|
21
10
|
/**
|
|
22
11
|
* A component to control the opacity of the target object.
|
|
23
12
|
*/
|
|
24
13
|
export default {
|
|
25
|
-
name:
|
|
26
|
-
components: {
|
|
27
|
-
Checkbox,
|
|
28
|
-
Container,
|
|
29
|
-
Main,
|
|
30
|
-
},
|
|
14
|
+
name: 'GlyphsControls',
|
|
31
15
|
data: function () {
|
|
32
16
|
return {
|
|
33
17
|
displayLabels: true,
|
|
@@ -45,7 +29,7 @@ export default {
|
|
|
45
29
|
},
|
|
46
30
|
},
|
|
47
31
|
methods: {
|
|
48
|
-
reset: function() {
|
|
32
|
+
reset: function () {
|
|
49
33
|
this.displayLabels = true;
|
|
50
34
|
},
|
|
51
35
|
setObject: function (object) {
|
|
@@ -62,7 +46,6 @@ export default {
|
|
|
62
46
|
|
|
63
47
|
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
|
64
48
|
<style scoped lang="scss">
|
|
65
|
-
|
|
66
49
|
.block {
|
|
67
50
|
left: 40px;
|
|
68
51
|
:deep(.el-checkbox__label) {
|
|
@@ -75,7 +58,4 @@ export default {
|
|
|
75
58
|
height: auto;
|
|
76
59
|
overflow-y: none;
|
|
77
60
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
61
|
</style>
|