icn3d 3.44.0 → 3.44.1

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.
Files changed (32) hide show
  1. package/README.md +4 -4
  2. package/css/lib/fonts/la-brands-400.eot +0 -0
  3. package/css/lib/fonts/la-brands-400.svg +0 -0
  4. package/css/lib/fonts/la-brands-400.ttf +0 -0
  5. package/css/lib/fonts/la-brands-400.woff +0 -0
  6. package/css/lib/fonts/la-brands-400.woff2 +0 -0
  7. package/css/lib/fonts/la-regular-400.eot +0 -0
  8. package/css/lib/fonts/la-regular-400.svg +0 -0
  9. package/css/lib/fonts/la-regular-400.ttf +0 -0
  10. package/css/lib/fonts/la-regular-400.woff +0 -0
  11. package/css/lib/fonts/la-regular-400.woff2 +0 -0
  12. package/css/lib/fonts/la-solid-900.eot +0 -0
  13. package/css/lib/fonts/la-solid-900.svg +0 -0
  14. package/css/lib/fonts/la-solid-900.ttf +0 -0
  15. package/css/lib/fonts/la-solid-900.woff +0 -0
  16. package/css/lib/fonts/la-solid-900.woff2 +0 -0
  17. package/css/lib/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  18. package/css/lib/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  19. package/css/lib/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  20. package/css/lib/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  21. package/css/lib/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  22. package/css/lib/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  23. package/css/lib/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  24. package/css/lib/images/ui-icons_222222_256x240.png +0 -0
  25. package/css/lib/images/ui-icons_228ef1_256x240.png +0 -0
  26. package/css/lib/images/ui-icons_ef8c08_256x240.png +0 -0
  27. package/css/lib/images/ui-icons_ffd27a_256x240.png +0 -0
  28. package/css/lib/images/ui-icons_ffffff_256x240.png +0 -0
  29. package/icn3d.js +194 -45
  30. package/icn3d.min.js +4 -4
  31. package/icn3d.module.js +194 -45
  32. package/package.json +1 -1
package/README.md CHANGED
@@ -102,11 +102,11 @@ Usage
102
102
  If your typescript compiler complains about missing type definition files, create a file named icn3d.d.ts in your project's root directory and fill it with the following:
103
103
 
104
104
  declare module 'icn3d/module' {
105
- export class iCn3DUI {
106
- constructor(cfg: object);
105
+ export class iCn3DUI {
106
+ constructor(cfg: object);
107
107
 
108
- show3DStructure(): Promise<void>;
109
- }
108
+ show3DStructure(): Promise<void>;
109
+ }
110
110
  }
111
111
 
112
112
  declare module 'icn3d/three' {}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/icn3d.js CHANGED
@@ -56237,6 +56237,13 @@ class ClickMenu {
56237
56237
  }
56238
56238
  }
56239
56239
  }
56240
+
56241
+ //https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid
56242
+ uuidv4() {
56243
+ return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, c =>
56244
+ (+c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c / 4).toString(16)
56245
+ );
56246
+ }
56240
56247
 
56241
56248
  displayShownMenus() { let me = this.icn3dui; me.icn3d;
56242
56249
  let html = "<form name='" + me.pre + "selmenu'>";
@@ -56525,6 +56532,132 @@ class ClickMenu {
56525
56532
  ic.saveFileCls.saveFile(file_pref + '_statefile.txt', 'command');
56526
56533
  });
56527
56534
 
56535
+ me.myEventCls.onIds("#" + me.pre + "mn1_exportCamera", "click", async function(e) { let ic = me.icn3d; //e.preventDefault();
56536
+ thisClass.setLogCmd("export bcf viewpoint", false);
56537
+ let file_pref = Object.keys(ic.structures).join(',');
56538
+ //ic.saveFileCls.saveFile(file_pref + '_camera.bcf', 'bcf');
56539
+
56540
+ let url = './script/jszip.min.js';
56541
+ await me.getAjaxPromise(url, 'script');
56542
+
56543
+ let data, jszip = new JSZip();
56544
+
56545
+ let uuid1 = thisClass.uuidv4();
56546
+ let uuid2 = thisClass.uuidv4();
56547
+
56548
+ data = '';
56549
+ data += '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
56550
+ data += ' <Version VersionId="3.0"/>\n';
56551
+
56552
+ jszip.file("bcf.version", data);
56553
+
56554
+ data = '';
56555
+ data += '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
56556
+ data += ' <Extensions>\n';
56557
+ data += ' <TopicTypes>\n';
56558
+ data += ' <TopicType>ERROR</TopicType>\n';
56559
+ data += ' <TopicType>WARNING</TopicType>\n';
56560
+ data += ' <TopicType>INFORMATION</TopicType>\n';
56561
+ data += ' <TopicType>CLASH</TopicType>\n';
56562
+ data += ' <TopicType>OTHER</TopicType>\n';
56563
+ data += ' </TopicTypes>\n';
56564
+ data += ' <TopicStatuses>\n';
56565
+ data += ' <TopicStatus>OPEN</TopicStatus>\n';
56566
+ data += ' <TopicStatus>IN_PROGRESS</TopicStatus>\n';
56567
+ data += ' <TopicStatus>SOLVED</TopicStatus>\n';
56568
+ data += ' <TopicStatus>CLOSED</TopicStatus>\n';
56569
+ data += ' </TopicStatuses>\n';
56570
+ data += ' <Priorities>\n';
56571
+ data += ' <Priority>LOW</Priority>\n';
56572
+ data += ' <Priority>MEDIUM</Priority>\n';
56573
+ data += ' <Priority>HIGH</Priority>\n';
56574
+ data += ' <Priority>CRITICAL</Priority>\n';
56575
+ data += ' </Priorities>\n';
56576
+ data += ' <TopicLabels/>\n';
56577
+ data += ' <Users/>\n';
56578
+ data += ' <SnippetTypes/>\n';
56579
+ data += ' <Stages/>\n';
56580
+ data += ' </Extensions>\n';
56581
+
56582
+ jszip.file("extensions.xml", data);
56583
+
56584
+ let folder = jszip.folder(uuid1);
56585
+
56586
+ data = '';
56587
+ data += '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
56588
+ data += ' <Markup>\n';
56589
+ data += ' <Header>\n';
56590
+ data += ' <Files/>\n';
56591
+ data += ' </Header> \n';
56592
+ data += ' <Topic Guid="' + uuid1 + '">\n';
56593
+ data += ' <Title>Perspective camera</Title>\n';
56594
+
56595
+ let now = new Date();
56596
+ const isoString = now.toISOString();
56597
+
56598
+ data += ' <CreationDate>' + isoString + '</CreationDate>\n';
56599
+ data += ' <CreationAuthor>https://www.ncbi.nlm.nih.gov/Structure/icn3d</CreationAuthor>\n';
56600
+ data += ' <DocumentReferences/>\n';
56601
+ data += ' <RelatedTopics/>\n';
56602
+ data += ' <Comments/>\n';
56603
+ data += ' <Viewpoints>\n';
56604
+ data += ' <ViewPoint Guid="' + uuid2 + '">\n';
56605
+ data += ' <Viewpoint>viewpoint-' + uuid2 + '.bcfv</Viewpoint>\n';
56606
+ data += ' <Snapshot>snapshot-' + uuid2 + '.png</Snapshot>\n';
56607
+ data += ' </ViewPoint>\n';
56608
+ data += ' </Viewpoints>\n';
56609
+ data += ' </Topic>\n';
56610
+ data += ' </Markup>\n';
56611
+
56612
+ folder.file("markup.bcf", data);
56613
+ let blob = await ic.saveFileCls.saveFile('any', 'png', undefined, undefined, true);
56614
+
56615
+ folder.file("snapshot-" + uuid2 + ".png", blob);
56616
+
56617
+ data = '';
56618
+
56619
+ data += '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
56620
+ data += ' <VisualizationInfo Guid="' + uuid2 + '">\n';
56621
+ data += ' <Components>\n';
56622
+ data += ' <Selection/>\n';
56623
+ data += ' <Visibility DefaultVisibility="true" />\n';
56624
+ data += ' <Coloring/>\n';
56625
+ data += ' </Components>\n';
56626
+ data += ' <PerspectiveCamera>\n';
56627
+ data += ' <CameraViewPoint>\n';
56628
+ data += ' <X>' + ic.cam.position.x + '</X>\n';
56629
+ data += ' <Y>' + ic.cam.position.y + '</Y>\n';
56630
+ data += ' <Z>' + ic.cam.position.z + '</Z>\n';
56631
+ data += ' </CameraViewPoint>\n';
56632
+
56633
+ let direction = (new Vector3$1(0, 0, -1)).applyQuaternion(ic.cam.quaternion);
56634
+
56635
+ data += ' <CameraDirection>\n';
56636
+ data += ' <X>' + direction.x + '</X>\n';
56637
+ data += ' <Y>' + direction.y + '</Y>\n';
56638
+ data += ' <Z>' + direction.z + '</Z>\n';
56639
+ data += ' </CameraDirection>\n';
56640
+ data += ' <CameraUpVector>\n';
56641
+ data += ' <X>' + ic.cam.up.x + '</X>\n';
56642
+ data += ' <Y>' + ic.cam.up.y + '</Y>\n';
56643
+ data += ' <Z>' + ic.cam.up.z + '</Z>\n';
56644
+ data += ' </CameraUpVector>\n';
56645
+ data += ' <FieldOfView>' + ic.cam.fov + '</FieldOfView>\n'; // 20
56646
+ data += ' <AspectRatio>' + ic.container.whratio + '</AspectRatio>\n';
56647
+ data += ' </PerspectiveCamera>\n';
56648
+ data += ' <Lines/>\n';
56649
+ data += ' <ClippingPlanes/>\n';
56650
+ data += ' <Bitmaps/> \n';
56651
+ data += ' </VisualizationInfo>\n';
56652
+
56653
+ folder.file("viewpoint-" + uuid2 + ".bcfv", data);
56654
+
56655
+ jszip.generateAsync({type:"blob"})
56656
+ .then(function(content) {
56657
+ saveAs(content, file_pref + "_viewpoint.bcf");
56658
+ });
56659
+ });
56660
+
56528
56661
  me.myEventCls.onIds("#" + me.pre + "mn1_exportVideo", "click", function(e) { me.icn3d; //e.preventDefault();
56529
56662
  thisClass.setLogCmd("export video", false);
56530
56663
  me.htmlCls.dialogCls.openDlg('dl_video', 'Save canvas changes in a video');
@@ -58265,13 +58398,13 @@ class ClickMenu {
58265
58398
  thisClass.setLogCmd(value, true);
58266
58399
  let axis;
58267
58400
  if(direction == 'x') {
58268
- axis = new THREE.Vector3(1,0,0);
58401
+ axis = new Vector3$1(1,0,0);
58269
58402
  }
58270
58403
  else if(direction == 'y') {
58271
- axis = new THREE.Vector3(0,1,0);
58404
+ axis = new Vector3$1(0,1,0);
58272
58405
  }
58273
58406
  else if(direction == 'z') {
58274
- axis = new THREE.Vector3(0,0,1);
58407
+ axis = new Vector3$1(0,0,1);
58275
58408
  }
58276
58409
  let angle = 0.5 * Math.PI;
58277
58410
  ic.transformCls.setRotation(axis, angle);
@@ -58582,8 +58715,8 @@ class ClickMenu {
58582
58715
  if(!ic.quaternion) {
58583
58716
  // reset parameters
58584
58717
  ic._zoomFactor = 1.0;
58585
- ic.mouseChange = new THREE.Vector2(0,0);
58586
- ic.quaternion = new THREE.Quaternion(0,0,0,1);
58718
+ ic.mouseChange = new Vector2$1(0,0);
58719
+ ic.quaternion = new Quaternion(0,0,0,1);
58587
58720
  }
58588
58721
 
58589
58722
  transformation.factor = ic._zoomFactor;
@@ -59388,6 +59521,7 @@ class SetMenu {
59388
59521
  html += this.getLink('mn1_exportKabat', 'Kabat', undefined, 3);
59389
59522
  html += this.getLink('mn1_exportImgt', 'IMGT', undefined, 3);
59390
59523
  html += "</ul>";
59524
+ html += this.getLink('mn1_exportCamera', 'BCF Viewpoint', undefined, 2);
59391
59525
 
59392
59526
  html += "<li><br/></li>";
59393
59527
 
@@ -60602,6 +60736,7 @@ class SetMenu {
60602
60736
 
60603
60737
  html += this.getMenuText('mn6_develop', 'Develop', undefined, undefined, 1);
60604
60738
  html += "<ul>";
60739
+ html += this.getMenuUrl('dev_contribute', me.htmlCls.baseUrl + "icn3d/icn3d.html#HowToContribute", "Become a Contributor", undefined, 2);
60605
60740
  html += this.getMenuUrl('dev_embedicn3d2', me.htmlCls.baseUrl + "icn3d/icn3d.html#HowToUse", "Embed iCn3D", undefined, 2);
60606
60741
  html += this.getMenuUrl('dev_urlpara', me.htmlCls.baseUrl + "icn3d/icn3d.html#parameters", "URL Parameters", undefined, 2);
60607
60742
  html += this.getMenuUrl('dev_command', me.htmlCls.baseUrl + "icn3d/icn3d.html#commands", "Commands", undefined, 2);
@@ -62831,9 +62966,9 @@ class SetDialog {
62831
62966
 
62832
62967
  group2tpl['IgFN3'] = ['Contactin1_2ee2A_human_FN3-n9', 'IL6Rb_1bquB_human_FN3-n2', 'IL6Rb_1bquB_human_FN3-n3', 'InsulinR_8guyE_human_FN3-n1', 'InsulinR_8guyE_human_FN3-n2', 'Sidekick2_1wf5A_human_FN3-n7'];
62833
62968
 
62834
- group2tpl['IgFN3-like'] = ['ASF1A_2iijA_human', 'BArrestin1_4jqiA_rat_n1', 'C3_2qkiD_human_n1', 'MPT63_1lmiA_bacteria', 'NaCaExchanger_2fwuA_dog_n2', 'RBPJ_6py8C_human_Unk-n1', 'RBPJ_6py8C_human_Unk-n2', 'TEAD1_3kysC_human'];
62969
+ group2tpl['IgFN3-like'] = ['ASF1A_2iijA_human', 'BArrestin1_4jqiA_rat_n1', 'C3_2qkiD_human_n1', 'MPT63_1lmiA_bacteria', 'NaCaExchanger_2fwuA_dog_n2', 'RBPJ_6py8C_human_Unk-n1', 'TEAD1_3kysC_human'];
62835
62970
 
62836
- group2tpl['Other Ig'] = ['CD19_6al5A_human-n1', 'CuZnSuperoxideDismutase_1hl5C_human', 'ECadherin_4zt1A_human_n2', 'LaminAC_1ifrA_human', 'ORF7a_1xakA_virus'];
62971
+ group2tpl['Other Ig'] = ['CD19_6al5A_human-n1', 'CuZnSuperoxideDismutase_1hl5C_human', 'ECadherin_4zt1A_human_n2', 'LaminAC_1ifrA_human', 'ORF7a_1xakA_virus', 'RBPJ_6py8C_human_Unk-n2'];
62837
62972
 
62838
62973
  let tpl2strandsig = {};
62839
62974
  tpl2strandsig['ASF1A_2iijA_human'] = "A A' B C C' E F G G+";
@@ -94044,9 +94179,12 @@ class Domain3d {
94044
94179
 
94045
94180
  // let subdomains = result.subdomains;
94046
94181
  // let substruct = result.substruct;
94182
+ let jsonStr = '{"data": [';
94047
94183
 
94048
94184
  let residueHash = ic.firstAtomObjCls.getResiduesFromAtoms(atoms);
94049
94185
  let residueArray = Object.keys(residueHash);
94186
+ if(residueArray.length == 0) return jsonStr + ']}';
94187
+
94050
94188
  let chnid = residueArray[0].substr(0, residueArray[0].lastIndexOf('_'));
94051
94189
 
94052
94190
  // let resid1 = residueArray[0];
@@ -94097,7 +94235,7 @@ class Domain3d {
94097
94235
  substruct = this.standardizeSubstruct(chnid, substruct, pos2resi);
94098
94236
 
94099
94237
  // m_domains1: {"data": [ {"ss": [[1,20,30,x,y,z,x,y,z], [2,50,60,x,y,z,x,y,z]], "domain": [[1,43,x,y,z],[2,58,x,y,z], ...]}, {"ss": [[1,20,30,x,y,z,x,y,z], [2,50,60,x,y,z,x,y,z]],"domain": [[1,43,x,y,z],[2,58,x,y,z], ...]} ] }
94100
- let jsonStr = '{"data": [';
94238
+
94101
94239
  //merge all subdomains into one domain
94102
94240
  jsonStr += '{"ss": ['; //secondary structure
94103
94241
 
@@ -117489,12 +117627,12 @@ class DefinedSets {
117489
117627
  }
117490
117628
 
117491
117629
  setPredefinedInMenu() { let ic = this.icn3d, me = ic.icn3dui;
117492
- // predefined sets: all chains
117493
- this.setChainsInMenu();
117494
-
117495
117630
  // predefined sets: proteins,nucleotides, chemicals
117496
117631
  this.setProtNuclLigInMenu();
117497
117632
 
117633
+ // predefined sets: all chains
117634
+ this.setChainsInMenu();
117635
+
117498
117636
  // show 3d domains for mmdbid
117499
117637
  if(me.cfg.mmdbid !== undefined || me.cfg.gi !== undefined || me.cfg.chainalign !== undefined || me.cfg.mmdbafid !== undefined) {
117500
117638
  for(let tddomainName in ic.tddomains) {
@@ -117592,10 +117730,15 @@ class DefinedSets {
117592
117730
  return html;
117593
117731
  }
117594
117732
 
117595
- setChainsInMenu() { let ic = this.icn3d; ic.icn3dui;
117733
+ setChainsInMenu() { let ic = this.icn3d, me = ic.icn3dui;
117734
+ let nonProtNuclResHash = {};
117735
+
117596
117736
  for(let chainid in ic.chains) {
117597
- // skip chains with one residue/chemical
117598
- if(ic.chainsSeq[chainid] && ic.chainsSeq[chainid].length > 1) {
117737
+ let atom = ic.firstAtomObjCls.getFirstAtomObj(ic.chains[chainid]);
117738
+
117739
+ // protein or nucleotide
117740
+ // if(ic.chainsSeq[chainid] && ic.chainsSeq[chainid].length > 1) {
117741
+ if(ic.proteins.hasOwnProperty(atom.serial) || ic.nucleotides.hasOwnProperty(atom.serial)) {
117599
117742
  //ic.defNames2Atoms[chainid] = Object.keys(ic.chains[chainid]);
117600
117743
  ic.defNames2Residues[chainid] = Object.keys(ic.firstAtomObjCls.getResiduesFromAtoms(ic.chains[chainid]));
117601
117744
  ic.defNames2Descr[chainid] = chainid;
@@ -117606,6 +117749,25 @@ class DefinedSets {
117606
117749
 
117607
117750
  ic.defNames2Command[chainid] = 'select $' + structure + '.' + chain;
117608
117751
  }
117752
+ else { // chemicals, etc
117753
+ let resid = atom.structure + '_' + atom.chain + '_' + atom.resi;
117754
+ let resn = atom.resn.substr(0, 3);
117755
+
117756
+ if(!nonProtNuclResHash[resn]) {
117757
+ nonProtNuclResHash[resn] = ic.residues[resid];
117758
+ }
117759
+ else {
117760
+ nonProtNuclResHash[resn] = me.hashUtilsCls.unionHash(nonProtNuclResHash[atom.resn], ic.residues[resid]);
117761
+ }
117762
+ }
117763
+ }
117764
+
117765
+ // chemicals etc
117766
+ for(let resn in nonProtNuclResHash) {
117767
+ ic.defNames2Residues[resn] = Object.keys(ic.firstAtomObjCls.getResiduesFromAtoms(nonProtNuclResHash[resn]));
117768
+ ic.defNames2Descr[resn] = resn;
117769
+
117770
+ ic.defNames2Command[resn] = 'select :3' + resn;
117609
117771
  }
117610
117772
 
117611
117773
  // select whole structure
@@ -121884,7 +122046,7 @@ class Dssp {
121884
122046
  ic.ref2igtype['PDL1_4z18B_human_V-n1'] = 'IgV';
121885
122047
  ic.ref2igtype['Palladin_2dm3A_human_Iset-n1'] = 'IgI';
121886
122048
  ic.ref2igtype['RBPJ_6py8C_human_Unk-n1'] = 'IgFN3-like';
121887
- ic.ref2igtype['RBPJ_6py8C_human_Unk-n2'] = 'IgFN3-like';
122049
+ //ic.ref2igtype['RBPJ_6py8C_human_Unk-n2'] = 'IgFN3-like';
121888
122050
  ic.ref2igtype['Sidekick2_1wf5A_human_FN3-n7'] = 'IgFN3';
121889
122051
  ic.ref2igtype['Siglec3_5j0bB_human_C1-n2'] = 'IgC1';
121890
122052
  ic.ref2igtype['TCRa_6jxrm_human_C1-n2'] = 'IgC1';
@@ -127978,7 +128140,7 @@ class SaveFile {
127978
128140
  //The type "png" is used to save the current canvas image. The type "html" is used to save html file with the
127979
128141
  //"data". This can be used to save any text. The type "text" is used to save an array of text, where "data" is
127980
128142
  //actually an array. The type "binary" is used to save an array of binary, where "data" is actually an array.
127981
- saveFile(filename, type, text, bBlob) { let ic = this.icn3d, me = ic.icn3dui;
128143
+ async saveFile(filename, type, text, bBlob, bReturnBlobOnly) { let ic = this.icn3d, me = ic.icn3dui;
127982
128144
  let thisClass = this;
127983
128145
 
127984
128146
  //Save file
@@ -128020,7 +128182,12 @@ class SaveFile {
128020
128182
 
128021
128183
  if(me.utilsCls.isIE()) {
128022
128184
  blob = ic.renderer.domElement.msToBlob();
128185
+ }
128186
+ else {
128187
+ blob = await this.getBlobFromNonIE();
128188
+ }
128023
128189
 
128190
+ if(!bReturnBlobOnly) {
128024
128191
  if(bAddURL) {
128025
128192
  let reader = new FileReader();
128026
128193
  reader.onload = function(e) {
@@ -128046,33 +128213,7 @@ class SaveFile {
128046
128213
  }
128047
128214
  }
128048
128215
  else {
128049
- ic.renderer.domElement.toBlob(function(data) {
128050
- if(bAddURL) {
128051
- let reader = new FileReader();
128052
- reader.onload = function(e) {
128053
- let arrayBuffer = e.target.result; // or = reader.result;
128054
-
128055
- let text = ic.shareLinkCls.getPngText();
128056
-
128057
- blob = me.convertTypeCls.getBlobFromBufferAndText(arrayBuffer, text);
128058
-
128059
- //ic.createLinkForBlob(blob, filename);
128060
- thisClass.saveBlob(blob, filename, bBlob, width, height);
128061
-
128062
- return blob;
128063
- };
128064
-
128065
- reader.readAsArrayBuffer(data);
128066
- }
128067
- else {
128068
- blob = data;
128069
-
128070
- //ic.createLinkForBlob(blob, filename);
128071
- thisClass.saveBlob(blob, filename, bBlob, width, height);
128072
-
128073
- return blob;
128074
- }
128075
- });
128216
+ return blob;
128076
128217
  }
128077
128218
 
128078
128219
  // reset the image size
@@ -128106,12 +128247,20 @@ class SaveFile {
128106
128247
 
128107
128248
  if(type !== 'png') {
128108
128249
  //https://github.com/eligrey/FileSaver.js/
128109
- saveAs(blob, filename);
128250
+ if(!bReturnBlobOnly) saveAs(blob, filename);
128110
128251
  }
128111
128252
 
128112
128253
  return blob;
128113
128254
  }
128114
128255
 
128256
+ getBlobFromNonIE() { let ic = this.icn3d; ic.icn3dui;
128257
+ return new Promise(function(resolve, reject) {
128258
+ ic.renderer.domElement.toBlob(function(data) {
128259
+ resolve(data);
128260
+ });
128261
+ })
128262
+ }
128263
+
128115
128264
  saveBlob(blob, filename, bBlob, width, height) { let ic = this.icn3d; ic.icn3dui;
128116
128265
  if(bBlob) {
128117
128266
  let urlCreator = window.URL || window.webkitURL;
@@ -132411,7 +132560,7 @@ class iCn3DUI {
132411
132560
  //even when multiple iCn3D viewers are shown together.
132412
132561
  this.pre = this.cfg.divid + "_";
132413
132562
 
132414
- this.REVISION = '3.44.0';
132563
+ this.REVISION = '3.44.1';
132415
132564
 
132416
132565
  // In nodejs, iCn3D defines "window = {navigator: {}}"
132417
132566
  this.bNode = (Object.keys(window).length < 2) ? true : false;