CloudExplorerTool.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * CloudExplorerTool.js
  3. *
  4. * @author realor
  5. */
  6. import { Tool } from './Tool.js'
  7. import { FileExplorer } from '../ui/FileExplorer.js'
  8. import { SaveDialog } from '../ui/SaveDialog.js'
  9. import { MessageDialog } from '../ui/MessageDialog.js'
  10. import { Toast } from '../ui/Toast.js'
  11. import { ObjectUtils } from '../utils/ObjectUtils.js'
  12. import { IOManager } from '../io/IOManager.js'
  13. import { Metadata, Result } from '../io/FileService.js'
  14. class CloudExplorerTool extends Tool {
  15. constructor(application, options) {
  16. super(application)
  17. this.name = 'cloud_explorer'
  18. this.label = 'tool.cloud_explorer.label'
  19. this.help = 'tool.cloud_explorer.help'
  20. this.className = 'cloud_explorer'
  21. this.setOptions(options)
  22. const panel = new FileExplorer(application)
  23. this.panel = panel
  24. panel.title = this.label
  25. panel.group = 'model'
  26. panel.addContextButton(
  27. 'save',
  28. 'button.save',
  29. () => this.showSaveDialog(),
  30. () => panel.service !== null
  31. )
  32. panel.openFile = (url, data) => this.openFile(url, data)
  33. application.panelManager.addPanel(this.panel)
  34. }
  35. activate() {
  36. this.panel.visible = true
  37. if (this.panel.service === null) {
  38. this.panel.goHome()
  39. }
  40. }
  41. deactivate() {
  42. this.panel.visible = false
  43. }
  44. openFile(url, data) {
  45. const application = this.application
  46. const panel = this.panel
  47. const onCompleted = object => {
  48. object.updateMatrix()
  49. application.initControllers(object)
  50. application.addObject(object, application.baseObject, false, true)
  51. let container = application.container
  52. let aspect = container.clientWidth / container.clientHeight
  53. let camera = application.camera
  54. object.updateMatrixWorld(true)
  55. ObjectUtils.zoomAll(camera, object, aspect)
  56. application.notifyObjectsChanged(camera, this)
  57. application.progressBar.visible = false
  58. panel.showButtonsPanel()
  59. }
  60. // read FILE
  61. const intent = {
  62. url: url,
  63. data: data,
  64. onCompleted: onCompleted,
  65. onProgress: data => panel.setProgress(data.progress, data.message),
  66. onError: error => {
  67. console.error(error)
  68. panel.showButtonsPanel()
  69. MessageDialog.create('ERROR', error)
  70. .setClassName('error')
  71. .setI18N(application.i18n)
  72. .show()
  73. },
  74. manager: this.application.loadingManager,
  75. units: this.application.units
  76. }
  77. panel.showProgressBar()
  78. IOManager.load(intent)
  79. }
  80. showSaveDialog() {
  81. const panel = this.panel
  82. let dialog = new SaveDialog('title.save_to_cloud', panel.entryName)
  83. dialog.setI18N(this.application.i18n)
  84. dialog.onSave = (name, format, onlySelection) => {
  85. panel.entryName = name
  86. panel.entryType = Metadata.FILE
  87. this.saveFile(panel.basePath + '/' + name, onlySelection)
  88. }
  89. dialog.show()
  90. }
  91. saveFile(path, onlySelection) {
  92. const application = this.application
  93. const panel = this.panel
  94. const roots = application.selection.roots
  95. const object = application.getModelRoot(onlySelection)
  96. const intent = {
  97. name: path,
  98. object: object,
  99. onCompleted: data => {
  100. panel.savePath(path, data)
  101. },
  102. onProgress: data => panel.setProgress(data.progress, data.message),
  103. onError: message => {
  104. panel.showButtonsPanel()
  105. MessageDialog.create('ERROR', message)
  106. .setClassName('error')
  107. .setI18N(application.i18n)
  108. .show()
  109. },
  110. options: { units: this.application.units }
  111. }
  112. panel.showProgressBar()
  113. IOManager.export(intent)
  114. }
  115. }
  116. export { CloudExplorerTool }