@abi-software/scaffoldvuer 1.21.0 → 1.21.1-beta.2

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.
@@ -148,15 +148,11 @@ const OrgansSceneData = function() {
148
148
  }
149
149
 
150
150
  const preRenderUpdateCallback = function() {
151
- return function() {
152
- preRenderTimeUpdate();
153
- }
151
+ preRenderTimeUpdate();
154
152
  }
155
153
 
156
154
  const postRenderUpdateCallback = function() {
157
- return function() {
158
- postRenderSelectedCoordinatesUpdate();
159
- }
155
+ postRenderSelectedCoordinatesUpdate();
160
156
  }
161
157
 
162
158
  /**
@@ -431,237 +427,206 @@ const OrgansSceneData = function() {
431
427
  }
432
428
  }
433
429
 
434
- /**
435
- * New organs geometry has been added to the scene, add UIs and make
436
- * sure the viewport is correct.
437
- */
438
- const _addOrganPartCallback = function(systemName, partName, useDefautColour) {
439
- return function(zincObject) {
440
- addOrganPart(systemName, partName, useDefautColour, zincObject);
441
- }
442
- }
430
+ /**
431
+ * New organs geometry has been added to the scene, add UIs and make
432
+ * sure the viewport is correct.
433
+ */
434
+ const _addOrganPartCallback = function(systemName, partName, useDefautColour) {
435
+ return function(zincObject) {
436
+ addOrganPart(systemName, partName, useDefautColour, zincObject);
437
+ }
438
+ }
443
439
 
444
- /**
445
- * Organs geometry has been removed to the scene.
446
- */
447
- const _removeOrganPartCallback = function(systemName, partName, useDefautColour) {
448
- return function(zincObject) {
449
- removeOrganPart(systemName, partName, useDefautColour, zincObject);
450
- }
451
- }
440
+ /**
441
+ * Organs geometry has been removed to the scene.
442
+ */
443
+ const _removeOrganPartCallback = function(systemName, partName, useDefautColour) {
444
+ return function(zincObject) {
445
+ removeOrganPart(systemName, partName, useDefautColour, zincObject);
446
+ }
447
+ }
452
448
 
453
- const downloadCompletedCallback = function() {
454
- return function() {
455
- _this.settingsChanged();
456
- _this.sceneData.timeVarying = _this.scene.isTimeVarying();
457
- if (finishDownloadCallback)
458
- finishDownloadCallback();
459
- }
460
- }
449
+ const downloadCompletedCallback = function() {
450
+ return function() {
451
+ _this.settingsChanged();
452
+ _this.sceneData.timeVarying = _this.scene.isTimeVarying();
453
+ if (finishDownloadCallback)
454
+ finishDownloadCallback();
455
+ }
456
+ }
461
457
 
462
- //The payload can either be a zinc object when the loading is successful or
463
- //an object containg the details of error message on failure.
464
- //We only use it to handle an error
465
- const singleItemFinishCallback = function() {
466
- return function(payload) {
467
-
468
- if (payload?.type === "Error") {
469
- if (downloadErrorCallback) {
470
- const error = {
471
- xhr: payload.xhr,
472
- type: "download-error",
473
- };
474
- downloadErrorCallback(error);
475
- }
476
- }
458
+ //The payload can either be a zinc object when the loading is successful or
459
+ //an object containg the details of error message on failure.
460
+ //We only use it to handle an error
461
+ const singleItemFinishCallback = function() {
462
+ return function(payload) {
463
+ if (payload?.type === "Error") {
464
+ if (downloadErrorCallback) {
465
+ const error = {
466
+ xhr: payload.xhr,
467
+ type: "download-error",
468
+ };
469
+ downloadErrorCallback(error);
470
+ }
477
471
  }
478
- }
472
+ }
473
+ }
479
474
 
480
- /**
481
- * Toggle data field displays. Data fields displays flow/pressure and <button @click="play">Play</button>
482
- * other activities of the organs.
483
- */
484
- this.updateFieldvisibility = function(dataFields, value) {
485
- for ( let i = 0; i < dataFields.length; i ++ ) {
486
- if (value != i) {
487
- const geometryName = dataFields[i].PartName;
488
- _this.changeOrganPartsVisibility(geometryName, false);
489
- }
475
+ /**
476
+ * Toggle data field displays. Data fields displays flow/pressure and <button @click="play">Play</button>
477
+ * other activities of the organs.
478
+ */
479
+ this.updateFieldvisibility = function(dataFields, value) {
480
+ for ( let i = 0; i < dataFields.length; i ++ ) {
481
+ if (value != i) {
482
+ const geometryName = dataFields[i].PartName;
483
+ _this.changeOrganPartsVisibility(geometryName, false);
490
484
  }
491
- if (value > -1) {
492
- const partName = dataFields[value].PartName;
493
- if ((_this.scene.findGeometriesWithGroupName(partName).length > 0) ||
494
- (_this.scene.findGlyphsetsWithGroupName(partName).length > 0)) {
495
- _this.changeOrganPartsVisibility(partName, true);
496
- } else {
497
- const partDetails = getOrganDetails(dataFields[value].SystemName, partName);
498
- if (partDetails != undefined) {
499
- _this.scene.loadMetadataURL(modelsLoader.getOrgansDirectoryPrefix() + "/" + partDetails.meta);
500
- }
485
+ }
486
+ if (value > -1) {
487
+ const partName = dataFields[value].PartName;
488
+ if ((_this.scene.findGeometriesWithGroupName(partName).length > 0) ||
489
+ (_this.scene.findGlyphsetsWithGroupName(partName).length > 0)) {
490
+ _this.changeOrganPartsVisibility(partName, true);
491
+ } else {
492
+ const partDetails = getOrganDetails(dataFields[value].SystemName, partName);
493
+ if (partDetails != undefined) {
494
+ _this.scene.loadMetadataURL(modelsLoader.getOrgansDirectoryPrefix() + "/" + partDetails.meta);
501
495
  }
502
- }
503
- }
504
-
505
- /**
506
- * Return an array containing name(s) of species that also contains the
507
- * currently displayed organs.
508
- *
509
- * @returns {Array} containing species name
510
- */
511
- this.getAvailableSpecies = function(currentSpecies, currentSystem, currentPart) {
512
- const availableSpecies = new Array();
513
- availableSpecies.push("none");
514
- const keysArray = Object.keys(organsFileMap);
515
- for (index in keysArray) {
516
- const species = keysArray[index];
517
- if (species != currentSpecies) {
518
- if (organsFileMap[species].hasOwnProperty(currentSystem) &&
519
- organsFileMap[species][currentSystem].hasOwnProperty(currentPart)) {
520
- availableSpecies.push(species);
521
- }
522
- }
523
- }
524
- return availableSpecies;
525
- }
526
-
527
- /**
528
- * Return the center and size of the cuurrent viewing scene
529
- */
530
- this.getCentreAndSize = function() {
531
- const vector = new THREE.Vector3();
532
- const boundingBox = this.scene.getBoundingBox();
533
- boundingBox.getCenter(vector);
534
- const centre = [vector.x, vector.y, vector.z];
535
- boundingBox.getSize(vector);
536
- const size = [vector.x, vector.y, vector.z];
537
- return {centre, size};
538
- }
496
+ }
497
+ }
498
+ }
539
499
 
540
- const setSceneData = function(speciesName, systemName, partName, organsDetails) {
541
- _this.sceneData.nerveMapIsActive = false;
542
- _this.sceneData.nerveMap = undefined;
543
- _this.sceneData.metaURL = "";
544
- _this.sceneData.viewURL = "";
545
- _this.sceneData.currentSpecies = speciesName;
546
- _this.sceneData.currentSystem = systemName;
547
- _this.sceneData.currentPart = partName;
548
- _this.sceneData.currentTime = 0.0;
549
- _this.sceneData.timeVarying = false;
550
- // This is used as title
551
- let name = "";
552
- if (speciesName)
553
- name = speciesName + "/";
554
- if (systemName)
555
- name = systemName + "/";
556
- if (partName)
557
- name = partName;
558
- _this.sceneData.currentName = name;
559
- }
500
+ /**
501
+ * Return an array containing name(s) of species that also contains the
502
+ * currently displayed organs.
503
+ *
504
+ * @returns {Array} containing species name
505
+ */
506
+ this.getAvailableSpecies = function(currentSpecies, currentSystem, currentPart) {
507
+ const availableSpecies = new Array();
508
+ availableSpecies.push("none");
509
+ const keysArray = Object.keys(organsFileMap);
510
+ for (index in keysArray) {
511
+ const species = keysArray[index];
512
+ if (species != currentSpecies) {
513
+ if (organsFileMap[species].hasOwnProperty(currentSystem) &&
514
+ organsFileMap[species][currentSystem].hasOwnProperty(currentPart)) {
515
+ availableSpecies.push(species);
516
+ }
517
+ }
518
+ }
519
+ return availableSpecies;
520
+ }
560
521
 
561
- this.loadOrgansFromURL = function(url, speciesName, systemName, partName, viewURL, clearFirst, options) {
562
- if (_this.zincRenderer) {
563
- if (partName && (_this.sceneData.metaURL !== url)) {
564
- setSceneData(speciesName, systemName, partName, undefined);
565
- const name = _this.sceneData.currentName;
566
- let organScene = _this.zincRenderer.getSceneByName(name);
567
- if (organScene) {
568
- if (clearFirst)
569
- organScene.clearAll();
570
- } else {
571
- organScene = _this.zincRenderer.createScene(name);
572
- }
573
- _this.selectObjectOnPick = true;
574
- for (let i = 0; i < sceneChangedCallbacks.length;i++) {
575
- sceneChangedCallbacks[i](_this.sceneData);
576
- }
577
- if (viewURL && viewURL != "") {
578
- _this.sceneData.viewURL = viewURL;
579
- organScene.loadViewURL(_this.sceneData.viewURL);
580
- } else {
581
- _this.sceneData.viewURL = undefined;
582
- }
583
- _this.sceneData.metaURL = url;
584
- organScene.addZincObjectAddedCallbacks(_addOrganPartCallback(systemName, partName, false));
585
- organScene.addZincObjectRemovedCallbacks(_removeOrganPartCallback(undefined, partName, false));
586
- organScene.loadMetadataURL(url, singleItemFinishCallback(), downloadCompletedCallback(), options);
587
- _this.scene = organScene;
588
- _this.zincRenderer.setCurrentScene(organScene);
589
- _this.graphicsHighlight.reset();
590
- const zincCameraControl = organScene.getZincCameraControls();
591
- zincCameraControl.enableRaycaster(organScene, _pickingCallback(), _hoverCallback());
592
- zincCameraControl.setMouseButtonAction("AUXILIARY", "ZOOM");
593
- zincCameraControl.setMouseButtonAction("SECONDARY", "PAN");
594
- }
595
- }
596
- }
522
+ /**
523
+ * Return the center and size of the cuurrent viewing scene
524
+ */
525
+ this.getCentreAndSize = function() {
526
+ const vector = new THREE.Vector3();
527
+ const boundingBox = this.scene.getBoundingBox();
528
+ boundingBox.getCenter(vector);
529
+ const centre = [vector.x, vector.y, vector.z];
530
+ boundingBox.getSize(vector);
531
+ const size = [vector.x, vector.y, vector.z];
532
+ return {centre, size};
533
+ }
597
534
 
598
- this.loadGLTFFromURL = function(url, partName, clearFirst) {
599
- if (_this.zincRenderer) {
600
- if (partName && (_this.sceneData.metaURL !== url)) {
601
- setSceneData(undefined, undefined, partName, undefined);
602
- const name = _this.sceneData.currentName;
603
- let organScene = _this.zincRenderer.getSceneByName(name);
604
- if (organScene) {
605
- if (clearFirst)
606
- organScene.clearAll();
607
- } else {
608
- organScene = _this.zincRenderer.createScene(name);
609
- }
610
- for (let i = 0; i < sceneChangedCallbacks.length;i++) {
611
- sceneChangedCallbacks[i](_this.sceneData);
612
- }
613
- _this.sceneData.viewURL = undefined;
614
- _this.sceneData.metaURL = url;
615
- organScene.addZincObjectAddedCallbacks(_addOrganPartCallback(undefined, partName, false));
616
- organScene.addZincObjectRemovedCallbacks(_removeOrganPartCallback(undefined, partName, false));
617
- organScene.loadGLTF(url, undefined, downloadCompletedCallback());
618
- _this.scene = organScene;
619
- _this.zincRenderer.setCurrentScene(organScene);
620
- _this.graphicsHighlight.reset();
621
- const zincCameraControl = organScene.getZincCameraControls();
622
- zincCameraControl.enableRaycaster(organScene, _pickingCallback(), _hoverCallback());
623
- zincCameraControl.setMouseButtonAction("AUXILIARY", "ZOOM");
624
- zincCameraControl.setMouseButtonAction("SECONDARY", "PAN");
625
- }
626
- }
627
- }
535
+ const setSceneData = function(speciesName, systemName, partName, organsDetails) {
536
+ _this.sceneData.nerveMapIsActive = false;
537
+ _this.sceneData.nerveMap = undefined;
538
+ _this.sceneData.metaURL = "";
539
+ _this.sceneData.viewURL = "";
540
+ _this.sceneData.currentSpecies = speciesName;
541
+ _this.sceneData.currentSystem = systemName;
542
+ _this.sceneData.currentPart = partName;
543
+ _this.sceneData.currentTime = 0.0;
544
+ _this.sceneData.timeVarying = false;
545
+ // This is used as title
546
+ let name = "";
547
+ if (speciesName)
548
+ name = speciesName + "/";
549
+ if (systemName)
550
+ name = systemName + "/";
551
+ if (partName)
552
+ name = partName;
553
+ _this.sceneData.currentName = name;
554
+ }
628
555
 
629
- this.alignCameraWithSelectedObject = function(transitionTime) {
630
- const objects = _this.graphicsHighlight.getSelected();
631
- if (objects && objects[0] && objects[0].userData) {
632
- _this.scene.alignObjectToCameraView(objects[0].userData, transitionTime);
633
- }
634
- }
556
+ this.loadOrgansFromURL = function(url, speciesName, systemName, partName, viewURL, clearFirst, options) {
557
+ if (_this.zincRenderer) {
558
+ if (partName && (_this.sceneData.metaURL !== url)) {
559
+ setSceneData(speciesName, systemName, partName, undefined);
560
+ const name = _this.sceneData.currentName;
561
+ let organScene = _this.zincRenderer.getSceneByName(name);
562
+ if (organScene) {
563
+ if (clearFirst)
564
+ organScene.clearAll();
565
+ } else {
566
+ organScene = _this.zincRenderer.createScene(name);
567
+ }
568
+ _this.selectObjectOnPick = true;
569
+ for (let i = 0; i < sceneChangedCallbacks.length;i++) {
570
+ sceneChangedCallbacks[i](_this.sceneData);
571
+ }
572
+ if (viewURL && viewURL != "") {
573
+ _this.sceneData.viewURL = viewURL;
574
+ organScene.loadViewURL(_this.sceneData.viewURL);
575
+ } else {
576
+ _this.sceneData.viewURL = undefined;
577
+ }
578
+ _this.sceneData.metaURL = url;
579
+ organScene.addZincObjectAddedCallbacks(_addOrganPartCallback(systemName, partName, false));
580
+ organScene.addZincObjectRemovedCallbacks(_removeOrganPartCallback(undefined, partName, false));
581
+ organScene.loadMetadataURL(url, singleItemFinishCallback(), downloadCompletedCallback(), options);
582
+ _this.scene = organScene;
583
+ _this.zincRenderer.setCurrentScene(organScene);
584
+ _this.graphicsHighlight.reset();
585
+ const zincCameraControl = organScene.getZincCameraControls();
586
+ zincCameraControl.enableRaycaster(organScene, _pickingCallback(), _hoverCallback());
587
+ zincCameraControl.setMouseButtonAction("AUXILIARY", "ZOOM");
588
+ zincCameraControl.setMouseButtonAction("SECONDARY", "PAN");
589
+ }
590
+ }
591
+ }
635
592
 
636
- this.exportSettings = function() {
637
- const settings = {};
638
- settings.name = _this.instanceName;
639
- if (_this.sceneData.currentSystem)
640
- settings.system = _this.sceneData.currentSystem;
641
- if (_this.sceneData.currentSpecies)
642
- settings.species = _this.sceneData.currentSpecies;
643
- if (_this.sceneData.currentPart)
644
- settings.part = _this.sceneData.currentPart;
645
- settings.metaURL = _this.sceneData.metaURL;
646
- if (_this.sceneData.viewURL)
647
- settings.viewURL = _this.sceneData.viewURL;
648
- settings.dialog = "Organ Viewer";
649
- return settings;
650
- }
593
+ this.loadGLTFFromURL = function(url, partName, clearFirst) {
594
+ if (_this.zincRenderer) {
595
+ if (partName && (_this.sceneData.metaURL !== url)) {
596
+ setSceneData(undefined, undefined, partName, undefined);
597
+ const name = _this.sceneData.currentName;
598
+ let organScene = _this.zincRenderer.getSceneByName(name);
599
+ if (organScene) {
600
+ if (clearFirst)
601
+ organScene.clearAll();
602
+ } else {
603
+ organScene = _this.zincRenderer.createScene(name);
604
+ }
605
+ for (let i = 0; i < sceneChangedCallbacks.length;i++) {
606
+ sceneChangedCallbacks[i](_this.sceneData);
607
+ }
608
+ _this.sceneData.viewURL = undefined;
609
+ _this.sceneData.metaURL = url;
610
+ organScene.addZincObjectAddedCallbacks(_addOrganPartCallback(undefined, partName, false));
611
+ organScene.addZincObjectRemovedCallbacks(_removeOrganPartCallback(undefined, partName, false));
612
+ organScene.loadGLTF(url, undefined, downloadCompletedCallback());
613
+ _this.scene = organScene;
614
+ _this.zincRenderer.setCurrentScene(organScene);
615
+ _this.graphicsHighlight.reset();
616
+ const zincCameraControl = organScene.getZincCameraControls();
617
+ zincCameraControl.enableRaycaster(organScene, _pickingCallback(), _hoverCallback());
618
+ zincCameraControl.setMouseButtonAction("AUXILIARY", "ZOOM");
619
+ zincCameraControl.setMouseButtonAction("SECONDARY", "PAN");
620
+ }
621
+ }
622
+ }
651
623
 
652
- this.importSettings = function(settings) {
653
- if (settings && (settings.dialog == this.typeName)) {
654
- _this.setName(settings.name);
655
- if (settings.metaURL !== undefined && settings.metaURL != "") {
656
- _this.loadOrgansFromURL(settings.metaURL, settings.species,
657
- settings.system, settings.part, settings.viewURL, true);
658
- } else {
659
- _this.loadOrgans(settings.species, settings.system, settings.part);
660
- }
661
- return true;
662
- }
663
- return false;
664
- }
624
+ this.alignCameraWithSelectedObject = function(transitionTime) {
625
+ const objects = _this.graphicsHighlight.getSelected();
626
+ if (objects && objects[0] && objects[0].userData) {
627
+ _this.scene.alignObjectToCameraView(objects[0].userData, transitionTime);
628
+ }
629
+ }
665
630
 
666
631
  /**
667
632
  * initialise loading of the html layout for the organs panel, this is
@@ -669,16 +634,18 @@ const OrgansSceneData = function() {
669
634
  *
670
635
  * @async
671
636
  */
672
- const initialise = function() {
673
- _this.initialiseRenderer(undefined);
637
+ this.initialise = async function(displayAreaIn) {
638
+ await _this.initialiseRenderer(displayAreaIn);
674
639
  if (_this.zincRenderer) {
675
- _this.zincRenderer.addPreRenderCallbackFunction(preRenderUpdateCallback());
676
- _this.zincRenderer.addPostRenderCallbackFunction(postRenderUpdateCallback());
640
+ _this.zincRenderer.addPreRenderCallbackFunction(() => {
641
+ preRenderUpdateCallback();
642
+ });
643
+ _this.zincRenderer.addPostRenderCallbackFunction(() => {
644
+ postRenderUpdateCallback()
645
+ });
677
646
  }
678
647
  }
679
648
 
680
- initialise();
681
-
682
649
  }
683
650
 
684
651
  OrgansViewer.prototype = Object.create(RendererModule.prototype);
@@ -11,14 +11,14 @@ import { objectsToZincObjects } from "./Utilities";
11
11
  * @param {String} elementID - id of the target dom element.
12
12
  * @returns {Zinc.Renderer}
13
13
  */
14
- const createRenderer = function () {
14
+ const createRenderer = async function () {
15
15
  const localContainer = document.createElement( 'div' );
16
16
  let localRenderer = undefined;;
17
17
  localContainer.style.height = "100%";
18
18
  if (WEBGL.isWebGLAvailable()) {
19
19
  localRenderer = new Zinc.Renderer(localContainer, window);
20
20
  Zinc.defaultMaterialColor = 0xFFFF9C;
21
- localRenderer.initialiseVisualisation();
21
+ await localRenderer.initialiseVisualisation();
22
22
  localRenderer.playAnimation = false;
23
23
  } else {
24
24
  const warning = WEBGL.getWebGLErrorMessage();
@@ -279,9 +279,9 @@ RendererModule.prototype.getPlayRate = function(value) {
279
279
  * and picker for the 3D renderer.
280
280
  *
281
281
  */
282
- RendererModule.prototype.initialiseRenderer = function(displayAreaIn) {
282
+ RendererModule.prototype.initialiseRenderer = async function(displayAreaIn) {
283
283
  if (this.zincRenderer === undefined || this.rendererContainer === undefined) {
284
- let returnedValue = createRenderer();
284
+ let returnedValue = await createRenderer();
285
285
  this.Zinc = returnedValue["Zinc"];
286
286
  this.zincRenderer = returnedValue["renderer"];
287
287
  this.rendererContainer = returnedValue["container"];
@@ -306,12 +306,23 @@ export const getObjectsFromAnnotations = (scene, annotations) => {
306
306
 
307
307
  const getCoordinatesForAnnotationFeature = (zincObject) => {
308
308
  const mesh = zincObject.getMorph();
309
+ const coords = [];
310
+ let vIndex = 0;
311
+ if (zincObject.isPointset) {
312
+ const positionArray = mesh.pointPositions;
313
+ for (let i = 0; i < zincObject.drawRange; i++) {
314
+ coords.push([
315
+ positionArray[vIndex++],
316
+ positionArray[vIndex++],
317
+ positionArray[vIndex++],
318
+ ]);
319
+ }
320
+ return coords;
321
+ }
309
322
  let attr = 'position';
310
323
  if (zincObject.isLines2) {
311
324
  attr = 'instanceStart';
312
325
  }
313
- const coords = [];
314
- let vIndex = 0;
315
326
  const position = mesh.geometry.getAttribute( attr );
316
327
  for (let i = 0; i < zincObject.drawRange; i++) {
317
328
  coords.push([