{"version":3,"file":"app-41647330.5dc23e54b187fd23.bundle.js","mappings":"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","sources":["webpack://client-app/./src/app/project/ifc-fun/ifc-fun.scss","webpack://client-app/./src/app/project/ifc-fun/ifc-fun.html","webpack://client-app/./src/app/project/ifc-fun/fragment-loader.ts","webpack://client-app/./src/app/project/ifc-fun/ifc-fun.ts"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `router-view{display:flex;flex-direction:column;height:100vh;border:3px purple solid;background:gray}#clickButton{position:absolute;left:50px;top:50px;z-index:99999;background:red}.ifcfun-css-class{height:calc(100vh - 4em);background:gray}#container{height:100%;border:3px blue solid}#model-revision-container{position:relative;left:632px;top:-325px;width:50%}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/app/project/ifc-fun/ifc-fun.scss\"],\"names\":[],\"mappings\":\"AAEA,YACC,YAAA,CACA,qBAAA,CACA,YAAA,CACA,uBAAA,CACA,eAAA,CAGD,aACC,iBAAA,CACA,SAAA,CAAA,QAAA,CACA,aAAA,CACA,cAAA,CAID,kBACC,wBAAA,CAGA,eAAA,CAGD,WAEI,WAAA,CACA,qBAAA,CAGJ,0BACC,iBAAA,CAAA,UAAA,CAAA,UAAA,CAAA,SAAA\",\"sourcesContent\":[\"@import \\\"/src/resources/customized-styles/variables.scss\\\";\\r\\n\\r\\nrouter-view {\\r\\n\\tdisplay: flex;\\r\\n\\tflex-direction: column;\\r\\n\\theight: 100vh;\\r\\n\\tborder: 3px purple solid;\\r\\n\\tbackground: gray;\\r\\n}\\r\\n\\r\\n#clickButton {\\r\\n\\tposition: absolute;\\r\\n\\tleft: 50px; top: 50px;\\r\\n\\tz-index: 99999;\\r\\n\\tbackground: red;\\r\\n}\\r\\n\\r\\n//.whynogeneralcontainerclass { } // TL;DR: Don't try to size this as a flex-item (ie with simple flex-rules.)\\r\\n.ifcfun-css-class { \\r\\n\\theight: calc(100vh - $top-bar-height);\\r\\n //overflow: hidden;\\r\\n\\t//height: 100%; //70%; // becomes 900px if we set this to 100%. \\t// weird, it becomes 1300px high, if we don't say anything?\\r\\n\\tbackground: gray;\\r\\n} \\r\\n\\r\\n#container { // maaske skal container flyttes til openbim-container filen?\\r\\n //zheight: 95%; \\r\\n height: 100%; // let's us see the broken openbim toolbars.\\r\\n border: 3px blue solid;\\t \\r\\n} \\r\\n\\r\\n#model-revision-container {\\r\\n\\tposition: relative; left: 632px; top: -325px; width:50%;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","module.exports = \"\\r\\n\\r\\n\";","import {Fragment, FragmentsGroup} from \"bim-fragment\";\r\nimport {GroupAndIdMappings} from \"./EgMessagePackLoader/IfcDataWrapper\";\r\nimport * as THREE from \"three\";\r\nimport {DownloadModel, DownloadProgress, update_IFC_Progress} from \"../test-model-revision/download-progress\";\r\nimport {DialogCloseResult, DialogService} from \"aurelia-dialog\";\r\nimport {FragmentResult, FragmentSource, RevisionMediaStatus} from \"./openbim-container\";\r\nimport {OpenBimHandles} from \"./OpenBimHandles\";\r\nimport {ApiClient} from \"../../services/api-client\";\r\nimport {AppContextService} from \"../../services/app-context-service\";\r\nimport {autoinject} from \"aurelia-framework\";\r\n\r\n@autoinject()\r\nexport class FragmentLoader {\r\n\r\n\tprivate openBimHandles: OpenBimHandles | null = null;\t// Beware! It's only set when called from 'getFragmentForRevision'!\r\n\r\n\tconstructor(private api: ApiClient, private appContext: AppContextService, private dlg: DialogService) {\r\n\t}\r\n\t\r\n\tpublic async getFragmentForRevision(fileId: string, revisionId: string, openBimHandles: OpenBimHandles, useMessagePack: boolean = true) : Promise {\r\n\t\tthis.openBimHandles = openBimHandles;\r\n\t\tif (!this.openBimHandles.mgr) { throw new Error(\"OpenBimHandles is not set\"); }\r\n\t\t\r\n\t\tconsole.log('fileId:', fileId);\r\n\t\tconst media:RevisionMediaStatus = await this.getRevisionMediaStatus(revisionId, fileId);\r\n\t\tconsole.log('GetRevision_MediaStatus said:', media);\r\n\r\n\t\tif (media.hasFragment && useMessagePack) {\r\n\t\t\tlet fromMpk: FragmentsGroup | null;\r\n\t\t\tconsole.log('will attempt MPK');\r\n\t\t\tfromMpk = await this.loadMpk(media);\r\n\t\t\tif (fromMpk) {\r\n\t\t\t\tconsole.log('got from MPK:', fromMpk);\r\n\t\t\t\treturn { fragmentsGroup: fromMpk, source: FragmentSource.MPK };\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (media.hasIfc) {\r\n\t\t\tlet fromIfc: FragmentsGroup | null;\r\n\t\t\tconsole.log('will attempt IFC');\r\n\t\t\tfromIfc = await this.loadIfcAsFragment(media);\r\n\t\t\tconsole.log('got from IFC:', fromIfc);\r\n\t\t\tif (fromIfc) {\r\n\t\t\t\treturn { fragmentsGroup: fromIfc, source: FragmentSource.IFC };\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconsole.warn('no media found for revisionId:', revisionId);\r\n\t\treturn null;\r\n\t}\r\n\r\n\tprivate async parseMPK(fragmentZipData:ArrayBuffer|null): Promise {\r\n\t\tif (fragmentZipData == null) { return null; }\r\n\r\n\t\tconst fragmentBuffer = new Uint8Array(fragmentZipData);\r\n\r\n\t\tconst groupAndIdMappings: GroupAndIdMappings = await this.openBimHandles!.mpkLoader?.loadFromMessagePackZip(fragmentBuffer, \"example\")!;\r\n\t\tconst fragmentsGroup : FragmentsGroup = groupAndIdMappings.group;\r\n\t\tif (fragmentsGroup) {\r\n\t\t\tthis.openBimHandles!.mgr?.groups.push(fragmentsGroup);\r\n\t\t} else {\r\n\t\t\tthrow new Error(\"Could not load data\");\r\n\t\t}\r\n\r\n\t\tfragmentsGroup.items.forEach(f => {\r\n\t\t\tif (!this.openBimHandles!.mgr) { return null; }\r\n\r\n\t\t\tthis.openBimHandles!.mgr.meshes.push(f.mesh);\r\n\t\t\t//this.Manager.list[f.mesh.uuid] = f;\r\n\t\t\tthis.openBimHandles!.mgr.list[f.id] = f;\r\n\t\t});\r\n\r\n\t\tawait this.openBimHandles!.mgr?.updateWindow();\r\n\r\n\t\t// Raycast will not work without this\r\n\t\tfragmentsGroup.items.forEach((fragment: Fragment) => {\r\n\t\t\tthis.openBimHandles!.comp?.meshes.add(fragment.mesh);\r\n\t\t})\r\n\r\n\t\tconst camera = this.openBimHandles!.comp?.camera.get();\r\n\t\tcamera.updateMatrixWorld(true);\r\n\t\tcamera.updateProjectionMatrix();\r\n\t\tawait this.openBimHandles!.highlighter!.updateHighlight();\r\n\t\treturn fragmentsGroup;\r\n\t}\r\n\r\n\tprivate async loadMpk(media:RevisionMediaStatus):Promise {\r\n\t\ttry {\r\n\t\t\tconst fragGroup:FragmentsGroup|null = await this.fetchMpkBlob(media.fragmentUrl);\r\n\t\t\treturn fragGroup;\r\n\t\t} catch (error) { console.error('Loading of fragment failed. Aborting.', error); }\r\n\t\treturn null;\r\n\t}\r\n\r\n\tprivate async fetchMpkBlob(fragment_url:string) : Promise {\r\n\t\tconst self = this;\r\n\t\tconst model:DownloadModel = {\r\n\t\t\turl: fragment_url,\r\n\t\t\tasync action(_inputModel: DownloadModel, arrayBuffer:ArrayBuffer) : Promise {\r\n\t\t\t\tupdate_IFC_Progress(50,'Parsing MPK to Fragment Group');\r\n\t\t\t\treturn await self.parseMPK(arrayBuffer);\r\n\t\t\t}\r\n\t\t};\r\n\t\tconst anyBlock: FragmentsGroup | null = await this.fetchBlobAsAny(model);\r\n\t\treturn anyBlock;\r\n\t}\r\n\r\n\tprivate async fetchBlobAsAny(model: DownloadModel) : Promise {\r\n\t\tconsole.log('fetch_UrlBlob_asArrayBuffer', model.url);\r\n\t\tlet dlgResult:DialogCloseResult =\r\n\t\t\tawait (this.dlg.open({model:model, viewModel:DownloadProgress}).whenClosed()); // (whenClosed corresponds to a double-await through .closeResult.)\t\r\n\r\n\t\tconsole.log('openBimHandles-container got DialogCloseResult:', dlgResult);\r\n\t\tconst fragGroupOrArrayBuffer:any|null = dlgResult.output;\r\n\t\tconsole.log('got fragmentsGroup:', fragGroupOrArrayBuffer);\r\n\t\treturn fragGroupOrArrayBuffer;\r\n\t}\r\n\r\n\tprivate async loadIfcAsFragment(media : RevisionMediaStatus) : Promise {\r\n\t\tconst self = this;\r\n\t\tconst model: DownloadModel = {\r\n\t\t\turl:media.ifcUrl,\r\n\t\t\tasync action(_inputModel: DownloadModel, arrayBuffer: ArrayBuffer) : Promise {\r\n\t\t\t\tupdate_IFC_Progress(50,'Parsing IFC to Fragment Group');\r\n\t\t\t\tconst fragmentGroup: FragmentsGroup | null = await self.parseIfcToFragmentGroup(arrayBuffer);\r\n\t\t\t\treturn fragmentGroup;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst fragmentGroup: FragmentsGroup | null = await this.fetchBlobAsAny(model);\r\n\t\treturn fragmentGroup;\r\n\t}\r\n\r\n\tprivate async parseIfcToFragmentGroup(ifcData: ArrayBuffer | null) : Promise {\r\n\t\tif (!ifcData) { return null; }\r\n\r\n\t\ttry {\r\n\t\t\tconst ifcBuffer = new Uint8Array(ifcData);\r\n\t\t\tconst ifcToFragmentLoader = this.openBimHandles!.loader!;\r\n\t\t\tconst fragmentsGroup: FragmentsGroup = await ifcToFragmentLoader.load(ifcBuffer); // mon vi burde sikre, at det NAME er bedre end 'example'? (hvis det f.eks. ryger i et map.)\r\n\t\t\tconsole.log('load_An_IfcUrl got FragmentsGroup', fragmentsGroup);\r\n\t\t\tawait this.openBimHandles!.highlighter!.updateHighlight(); // https://jira.eg.dk/browse/AJC-3735\t\r\n\t\t\tconsole.log('doing highlight-update!', this.openBimHandles!.highlighter);\r\n\t\t\treturn fragmentsGroup;\r\n\t\t}\r\n\t\tcatch (error) {\r\n\t\t\tconsole.error('loadIfcAsFragment, exc:', error);\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate async getRevisionMediaStatus(revisionId: string, modelId: string) : Promise {\r\n\t\tconst path = `BimViewer/GetRevisionMediaStatus?aocProjectId=${this.appContext.projectId}&modelId=${modelId}&revisionId=${revisionId}`;\r\n\t\tlet mediaStatus: RevisionMediaStatus =\r\n\t\t\tawait this.api.project(this.appContext.projectId).get(path).jsonResult();\r\n\t\treturn mediaStatus;\r\n\t}\r\n}\r\n","import {ModeToolHandler} from \"./Tools/ModeToolHandler\";\r\n\r\n\r\nconsole.log(' is ifc-fun.ts ever loaded?');\r\n//import { } from \"bim-fragment\"; //base-types //.d.ts\r\n//import { FragmentMesh } from \"bim-fragment/fragment-mesh\"; //import { IFragmentMesh } from \"bim-fragment\";\r\n\r\nimport * as THREE from \"three\"; // ALSO: npm i --save-dev @types/three\r\nimport * as OBC from \"openbim-components\"; \r\nimport { FragmentsGroup} from 'bim-fragment'; // ,FragmentMap, IfcProperties, Fragment\r\n\r\nimport $ from 'jquery'; //Declaring the var instead of this import makes draggable method call fail.\r\nimport 'jquery-ui/ui/widgets/draggable';\r\n\r\nimport {EventAggregator, Subscription} from \"aurelia-event-aggregator\";\r\nimport { BimViewerFileDtoSplitView, BimViewerModelAndAllRevisions, BimViewerModelAndRevision, BimViewerRevisionDtoSplitView } from \"app/models/viewer-dtos/Dtos/bimviewer-dtos\";\r\nimport { ObjectListManager } from \"app/services/object-list/object-list-manager\";\r\nimport { OB_RevisionInformation3d, TurnOnRevision3dResponse } from \"../work-area/split-viewer-interfaces\";\r\nimport { InstanceColorDataCollection } from \"app/models/color-legend-dto\";\r\nimport {ViewerThreeDServiceIF, ToolEnum} from \"app/services/ViewerThreeDServiceIF\";\r\nimport { OpenBimViewerThreeDService } from \"./OpenBimViewerThreeDService\";\r\nimport {autoinject} from \"aurelia-framework\";\r\nimport { AppContextService } from \"app/services/app-context-service\";\r\nimport {CollabHighlightInitiator} from \"./openbim-highlighter\";\r\nimport { initHover_RayCaster } from \"./openbim-hover\";\r\nimport { add_a_default_fragment_on_startup, init_IfcLoader_Toolbars, init_OpenBimComponents, makeIfcLoader } from \"./openbim-initcontainer\";\r\nimport { OpenBimHandles } from \"./OpenBimHandles\";\r\nimport { ModalService } from \"app/services/modal-service\";\r\nimport { Color } from \"three\";\r\nimport {FragmentManager} from \"openbim-components\";\r\nimport {ObjectSelectionTool} from \"./Tools/ObjectSelectionTool\";\r\nimport {ObjectIDsIF} from \"./openbim-container\";\r\n\r\n@autoinject\r\nexport class IfcFun { // todo Rename to OpenBim3dViewer, OB3dViewer.\r\n public projectIdForMRP : string = 'no-prj-yet'; // arggh, binds to this!\r\n public orgId:string = 'no-org-yet';\r\n public T3D_Svc: ViewerThreeDServiceIF | undefined;\r\n\r\n constructor(\r\n\tprivate aggr: EventAggregator, \r\n\tprivate appContext: AppContextService,\r\n\tprivate modalMsg: ModalService\r\n\t//private modalMessage:ModalMessage\r\n ) {\r\n } \r\n \r\n activate(params:any) {\r\n\ttry {\r\n\t\tconsole.log('ifcFun.activate sets projectId to ', params.projectId);\r\n\r\n\t\tthis.projectIdForMRP = params.projectId; // because binds to it, sigh.\r\n\t\tthis.appContext.setProject(params.projectId);\r\n\t\tlet prj = this.appContext.getSelectedProject()!;\r\n\t\tif (!prj) {\r\n\t\t\tconsole.log('avail projects:', this.appContext.projects);\r\n\t\t\tconsole.error('no selected project!');\r\n\t\t} else {\r\n\t\t\tthis.orgId = prj.ownerCompanyId;\r\n\t\t}\r\n\t} catch {\r\n\t\tconsole.log('wtf');\r\n\t}\r\n\r\n } // called first.\r\n\r\n comp:OBC.Components|undefined;\r\n mgr:OBC.FragmentManager|undefined;\r\n loader:OBC.FragmentIfcLoader|undefined;\r\n\r\n highlighter:OBC.FragmentHighlighter|undefined;\r\n\r\n //shutup1:number = 1;\r\n //shutup2:number = 2;\r\n ofCourseTrue:boolean = true;\r\n\r\n public turnOn_hoverHighlight:boolean = false; //true;//false;\r\n\r\n async attached() { // called second.\r\n\tconsole.log('IfcFun attached is called.'); \r\n\r\n\tconsole.log('before setupSubscriptions');\r\n\tthis.setupSubscriptions(); // cloned from bim-viewer-three-d.ts\r\n\tconsole.log('after setupSubscriptions');\r\n\r\n\tconsole.log('calling the_init');\r\n const container:HTMLElement = document.getElementById('container')!; // Get the
element where the scene will be displayed\r\n\tconst fancyExtras = true; //false;\r\n\tconst FPS_Meter = true;\r\n\tthis.comp = await init_OpenBimComponents(container, fancyExtras, FPS_Meter); \r\n\t/* NB: init_OpenBimComponents won't work before here/this place, because we need DOM,\r\n\t to get viewerContainer, which is: UIManager._components.renderer.get().domElement.parentElement */\r\n\r\n\tif (this.ofCourseTrue) { //fancyExtras_NO) { //this.shutup1 == this.shutup2) {\r\n\t\tif (this.turnOn_hoverHighlight) {\r\n\t\t initHover_RayCaster(this.comp);\r\n\t\t} // just after init_OpenBimComponents.\r\n\r\n\t\tconst No_OB:OpenBimHandles = undefined;\r\n\t\tthis.highlighter = CollabHighlightInitiator.initSelection_Highlighter(this.comp, No_OB); // Todo, we need to figure out how IfcFun should integrate with initSelection_RayCaster.\r\n\t\tconst objectSelectionTool = new ObjectSelectionTool(No_OB, this.highlighter, this.aggr);\r\n\r\n\t\tconst modeToolHandler = new ModeToolHandler(objectSelectionTool);\r\n\t\tModeToolHandler.setupToolEventsWithoutAurelia(container, modeToolHandler);\r\n\t\tthis.T3D_Svc = new OpenBimViewerThreeDService(modeToolHandler, No_OB, objectSelectionTool);\r\n\t}\r\n\r\n\tthis.mgr = this.comp.tools.get(FragmentManager); \r\n\r\n\t//await this.loadAFragment();// await add_a_default_fragment_on_startup(comp, mgr);\r\n\r\n\tthis.loader = makeIfcLoader(this.comp);\r\n\tinit_IfcLoader_Toolbars(this.comp, this.mgr, this.loader);\r\n\t// todo, get openbim css in, for tailwind.\r\n\t\r\n\tconsole.log('now .model-revision-container is draggable..');\r\n\t$('.model-revision-container').draggable();\r\n } \r\n\r\n buttonClicked() {\r\n\tconsole.log('button clicked!');\r\n\tthis.modalMsg.OpenMessage('title','message', true);\r\n }\r\n\r\n async load_A_FRAGMENT(model: BimViewerFileDtoSplitView, revision: BimViewerRevisionDtoSplitView):Promise {\t\r\n\tlet url = 'small.frag';\r\n\tlet orgId = this.orgId;\r\n\tlet prjId = this.appContext.projectId; //projectId;\r\n\t/* vi opbevarer\r\n\t - oprindelige IFC/src (mulighed 1 - bare load-og-konverter raat-direkte-hvergang)\r\n\t - (mulighed 2): fragment resultat fra job-submit til lars/william\r\n\t - (mulighed 3): ELLER en vi selv konverterer direkte med OpenBim's funktion!\r\n\t*/\r\n\tlet fragments:FragmentsGroup = await add_a_default_fragment_on_startup(url, this.comp!, this.mgr!);\r\n\treturn fragments;\r\n }\r\n\r\n async load_An_IfcUrl(IFC_model: BimViewerFileDtoSplitView, revision: BimViewerRevisionDtoSplitView):Promise {\r\n\tlet orgId = this.orgId;\r\n\tlet prjId = this.appContext.projectId;\r\n\tlet url4 = `https://aoc1bim1sa.blob.core.windows.net/org-${orgId}/prj-${prjId}/file-${IFC_model.id}/rev-${revision.id}.ifc`;\r\n\r\n\tconst IFC_file:Response = await fetch(url4); \r\n\tconst IFC_data:ArrayBuffer = await IFC_file.arrayBuffer();\r\n\tconst IFC_buffer = new Uint8Array(IFC_data);\r\n\r\n\tconst IFC2Frag_loader = this.loader!;\r\n\tconst fragModel:FragmentsGroup = await IFC2Frag_loader.load(IFC_buffer);\r\n\r\n\tthis.highlighter!.updateHighlight();\r\n\r\n\tconst THREE_scene:THREE.Scene = this.comp!.scene.get();\r\n\tTHREE_scene.add(fragModel);\t// (No Culler used here.)\r\n\tconsole.log('any background?', THREE_scene);\r\n\r\n\t//const bg = THREE_scene.background;\r\n\tTHREE_scene.background = new Color('#c0d0e8'); // 'lime');\r\n\r\n\treturn fragModel;\r\n }\r\n\r\n async exportFragments(fragments:OBC.FragmentManager) { \r\n\tif (!fragments.groups.length) return;\r\n\tconst group = fragments.groups[0];\r\n\tconst data = fragments.export(group);\r\n\tconst blob = new Blob([data]);\r\n\tconst fragmentFile = new File([blob], 'small.frag');\r\n\tconst files = [];\r\n\tfiles.push(fragmentFile);\r\n\tfiles.push(new File([JSON.stringify(group.getLocalProperties())], 'small.json'));\r\n\t// JG: Something is broken in the openBim sample here.\r\n\tconst result = new File([],'x'); //await this.downloadZip(files).blob();\r\n\tthis.download(result);\r\n }\r\n async downloadZip(files:File[]):Promise{ return files[0]; } // helper for exportFragments.\r\n\r\n download(file:File) { // helper for exportFragments.\r\n\tconst link = document.createElement('a');\r\n\tlink.href = URL.createObjectURL(file);\r\n\tlink.download = file.name;\r\n\tdocument.body.appendChild(link);\r\n\tlink.click();\r\n\tlink.remove();\r\n }\r\n\r\n // function disposeFragments() { fragments.dispose(); }\r\n\r\n // A lot of this, we should define an interface for it?\r\n // cloned from bim-viewer-three-d.ts\r\n private subscriptions: Subscription[] = [];\r\n\r\n // We want our own OB-'RevisionInformation3d' to remember openBim stuff.\r\n private loadedRevisions: Map = new Map(); //Key revision, ModelInfo\r\n \r\n hasModelShowing(): boolean {\r\n\tlet revs = Array.from( this.loadedRevisions.values() );\r\n\treturn !!revs.find(r=>r.isModelShowing);\r\n }\r\n shouldLookAtModel(): boolean { return !this.hasModelShowing(); }\r\n\r\n // BEGIN bim-viewer-three-d INTERFACE:\r\n async turnOnRevision3d(model: BimViewerFileDtoSplitView, revision: BimViewerRevisionDtoSplitView): Promise {\t\r\n\tconsole.log('IfcFun.turnOnRevision3d, retrieving/loading ifc revision.');\r\n\t//await this.load_A_FRAGMENT(model,revision); // (Raw-fragment (converted/prebaked IFC) loader.)\r\n\tlet fragModel:FragmentsGroup = await this.load_An_IfcUrl(model,revision); \r\n\tconsole.info('altUpload?', model.altUpload, revision.altUpload);\r\n\tlet allOK = !!fragModel; // If we got a model, all is OK.\t\r\n\tthis.remember_ModelInformation(revision, fragModel);\r\n\t// (vi har ikke, behøver ikke, loadingModels tool her.)\r\n\t// this.eventAggregator.publish('ModelRevision:ModelReady', {model: model, revisionId: revision.id});\r\n\r\n\t/* We must fire the event 'Revision3FinishedLoading'\r\n\twhen we are 'pretty sure the model has loaded', because this is \r\n\twhat moves the UI '3D' button-indicator from the gray '..still..loading..' state to the black 'confirmed fully loaded' state,\r\n\tand THIS is what will enable us to turn-off-unload the revision again, by clicking its button again.\r\n\t*/\r\n\tthis.aggr.publish('Revision:Revision3FinishedLoading', {model: model, revisionId: revision.id} ) //model:BimViewerFileDtoSplitView\r\n\treturn new TurnOnRevision3dResponse(allOK,allOK); //false,false); //hasModelBeenLoaded, success); //hasModelBeenLoaded, success);\r\n\r\n\t/* The chain for turnOnRevision3d used to be:\r\n\tturnOnRevision3d -> loadUrl_forRevision -> loadUrl_forRevision_Catenda -> handleFinishedGettingObjectIds -> setupModelInformation (which registers 'allObjIDs'). \r\n\t\t(earlier, GetAllObjectIdsForRevision is also used.)\r\n\t\t*/\r\n\r\n\t/*\r\n\tlet hasModelBeenLoaded = false; //this.loadedRevisions.has(revision.id); \r\n\tlet success = hasModelBeenLoaded;\r\n\tif (hasModelBeenLoaded) {\r\n\t\tlet currentRevision: RevisionInformation3d = this.loadedRevisions.get(revision.id)!;\r\n\t\tif (currentRevision.isModelShowing != true) {\r\n\t\t\t//this.T3D_Svc.turnOnRevision(this.loadedRevisions, revision, this.shouldLookAtModel());\r\n\t\t\tcurrentRevision.isModelShowing = true;\r\n\t\t}\r\n\t} else { // (!hasModelBeenLoaded) \r\n\t\tconsole.log('turnOnRevision3d calls BV3D.loadUrl');\r\n\t\t//success = await this.loadUrl_forRevision(revision, model);\r\n\t}\r\n\t*/\r\n\r\n\t/* JG: Alt det der roderi-crap, har været knyttet til catendas\r\n\tunderlige ikke-korrekte-haandtering af at kunne swappe del-modeller ind og ud.\r\n\tFordi de kunne TILFOEJE del-modeller, men ikke 'tage dem af' igen,\r\n\tså har vi haft alt dette underlige gymnastik med \r\n\tat rode rundt med deres enkelte instans-element ID'er.\r\n\r\n\tVi skal istedet bare reducere det til \"loadUrl\" casen igen, i første omgang.\r\n\t */\r\n }\r\n\r\n remember_ModelInformation(revision: BimViewerRevisionDtoSplitView, fragModel:FragmentsGroup): void { \r\n\tlet revisionInfo3d = new OB_RevisionInformation3d(); // in setupModelInformation.\r\n\t//revisionInfo3d.boundingBox = get_boundingBox;\r\n\t//revisionInfo3d.otherObjectIdsList = allObjectIds.otherObjectIdsList; // PROBABLY won't need that (at least, we will enumerate through in-memory fragment, not from server?)\r\n\t//revisionInfo3d.spaceIds = allObjectIds.spaceObjectIds;\r\n\t//revisionInfo3d.revisionBimId = revision.id; //.bimRevisionId; // not relevant, as no separate IDs (.. I think?)\r\n\trevisionInfo3d.openBim_model = fragModel; // We will have to decide if we store the parent, FragmentsGroup, or the child, Three.Scene. We probably end up needing the parent instead.\r\n\trevisionInfo3d.isModelShowing = true;\r\n\tthis.loadedRevisions.set(revision.id, revisionInfo3d);\r\n\t// fixme, do we ever REMOVE from loadedRevisions?\r\n }\r\n\r\n\r\n async turnOffRevision3d(revision: BimViewerRevisionDtoSplitView): Promise {\r\n\tlet has_loadedRevision:OB_RevisionInformation3d|undefined = this.loadedRevisions?.get(revision.id);\r\n\tif (!has_loadedRevision) { console.log('revision is not loaded:', revision.id); return; }\r\n\r\n\tlet loadedRevision:OB_RevisionInformation3d = has_loadedRevision;\r\n\tif (!loadedRevision.isModelShowing) { console.log('revision is not showing:', revision.id, loadedRevision.isModelShowing); return; }\r\n\t\r\n\tlet model = loadedRevision.openBim_model!;\r\n\tconst THREE_scene:THREE.Scene = this.comp!.scene.get();\r\n\r\n\t// symmetric remove:\r\n\tTHREE_scene.remove(model); // THREE_scene.add(model);\t\t \r\n\tloadedRevision.isModelShowing = false;\t\r\n }\r\n\r\n isNewestPluginRevisionActive:boolean = false;\r\n setIsNewestPlugin(isNewestPlugin: boolean): void { this.isNewestPluginRevisionActive = isNewestPlugin; }\r\n // those were the three founding methods. The rest are fancy tools..\r\n async lookAtSelectedObjects(objectListMgr: ObjectListManager): Promise {}\r\n async highlightSelectedObjects(objectListMgr : ObjectListManager): Promise {\r\n\t/* in our catenda impl, this method uses as input, the number[] result from\r\n\tentityIdFinderService.getSelectedObjectsAsEntityIds.\r\n\tThat again is implemented by delegating to objectListMgr.selectedItems.filter(.) \r\n\tThe TLDR is, that on a high level, our selections are handled as a list of IFC_EntityId numbers,\r\n\twhich you can query from the EntityIdFinderService class.\r\n\t But EntityIdFinderService gets its data from ObjectListManager - who tells him?\r\n\r\n\tHmm, but how does ObjectListManager.selectedItems get changed?\r\n\tI GAVE UP: We have not yet guessed how OLM.selectedItems is updated\r\n\twhen user clicks catenda 3d model.\r\n\t*/\r\n }\r\n async highlightSimilarElements(objectListMgr: ObjectListManager) {}\r\n async isolateSelectedObjects(objectListMgr: ObjectListManager): Promise {}\r\n async hideAllOtherObjects(objectListMgr: ObjectListManager) {}\r\n resetColors(): void {}\r\n colorInstances(colorData: InstanceColorDataCollection): void {}\r\n async cropModel(direction: string[]): Promise {}\r\n removeRevisionIdListFromLoadedRevisions(revisions: string[]): void {}\r\n setupViewerBindings(): void {}\r\n // END bim-viewer-three-d INTERFACE.\r\n\r\n async turnOn_3dRevision_EH(parameter: BimViewerModelAndRevision) { // EH is 'EventHandler'.\r\n\tconsole.log('(IF)the event 3dViewer:TurnOn3dRevision calls our turnOnRevision3d.', parameter.model.id, parameter.revision.id);\r\n\tif (!(await this.turnOnRevision3d(parameter.model, parameter.revision)).success) { return; }\r\n\r\n\tif (parameter.isNewestPluginRevision == true) { this.setIsNewestPlugin(parameter.isNewestPluginRevision); } // who turns this off??\r\n\t// JG: WTF is the meaning of this - why would you NOT want to fire the else-case?\r\n\tif (parameter.revision.objectsIdNotDoneLoading == false) { // head-spin, it means DoneLoading is true..\r\n\t\tconsole.log('IF, firing Revision3FinishedLoading');\r\n\t\tthis.aggr.publish('Revision:Revision3FinishedLoading', {model: parameter.model, revisionId: parameter.revision.id} )\r\n\t} else {\r\n\t\tconsole.log('IF, firing RevisionTurnedOn');\r\n\t\tthis.aggr.publish('Revision:RevisionTurnedOn', {model: parameter.model, revision: parameter.revision, is2d: false});\r\n\t}\r\n\tthis.aggr.publish('ModelRevision:HandleStateChange');\r\n }\r\n\r\n async turnOff_Multiple(parameter: BimViewerModelAndAllRevisions): Promise {\r\n\tfor (let revision of parameter.revisions) {\r\n\t\tawait this.turnOffRevision3d(revision);\r\n\t\tif (parameter.isNewestPluginRevision) { this.setIsNewestPlugin(!parameter.isNewestPluginRevision); }\r\n\t\tthis.aggr.publish('Revision:RevisionTurnedOff', {model: parameter.model, revision: revision, is2d: false});\r\n\t}\r\n }\r\n\r\n async turnOff_3dRevision(parameter: BimViewerModelAndRevision) {\r\n\tawait this.turnOffRevision3d(parameter.revision);\r\n\tif (parameter.isNewestPluginRevision) { this.setIsNewestPlugin(!parameter.isNewestPluginRevision); }\r\n\tthis.aggr.publish('Revision:RevisionTurnedOff', {model: parameter.model, revision: parameter.revision, is2d: false}); \r\n }\r\n\r\n static nrOfTimesSubscribed:number = 0;\r\n setupSubscriptions(): void { // it is wrong to call this from attached, unless we also unsubscribe in detach! Hmm, we clean up below in dispose?\r\n\tconsole.log('setupSubscriptions', ++IfcFun.nrOfTimesSubscribed);\r\n\tif (IfcFun.nrOfTimesSubscribed>1) {\r\n\t\tconsole.error('\\n WRONG WRONG, too many subscriptions!', IfcFun.nrOfTimesSubscribed);\r\n\t\treturn;\r\n\t}\r\n\t/* cookbook, ingredients:\r\n\t - load/unload REVISIONS (TurnOn3dRevision,TurnOff3dRevision,TurnOffMultiple3dRevision)\r\n\t - also, 'removeRevisions' - exactly what is it used for? (only catenda needs it?)\r\n\t - element-instance SELECTION (e.g. isolate-selected-items, highlight-selected-items)\r\n\t we count at least 8 events concerning ITEMS(..'selection').\r\n\t - a number of 'ALL-*' operations, I wonder what that signifies, it mostly sounds like 'reset'..? hide-all? show-all?\r\n\t - SUNDRY:\r\n\t - - SPACES, concerning.\r\n\t - - item-COLORING, concerning.\r\n\t - - CROP/\"chop\",(cut-away) concerning.\r\n\r\n\t SUMMARY: \r\n\t (1) (mouse-)selection-mode/selection-model.\r\n\t (2) elements/items\r\n\t My hunch is to start with mouse (1) to easier learn about (2).\r\n\t */\r\n\tlet self = this;\r\n\tthis.subscriptions = [\r\n\t\tthis.aggr.subscribe('3dViewer:TurnOn3dRevision', async (parameter: BimViewerModelAndRevision) => { await self.turnOn_3dRevision_EH(parameter); }),\r\n\t\tthis.aggr.subscribe('3dViewer:TurnOff3dRevision', async (parameter: BimViewerModelAndRevision) => { await self.turnOff_3dRevision(parameter); }),\r\n\t\tthis.aggr.subscribe('3dViewer:TurnOffMultiple3dRevision', async (parameter: BimViewerModelAndAllRevisions) => { await self.turnOff_Multiple(parameter); }),\t\t\r\n\t\tthis.aggr.subscribe('3dViewer:isolate-selected-items', async (objectListMgr: ObjectListManager) => {await self.isolateSelectedObjects(objectListMgr)}),\r\n\t\tthis.aggr.subscribe('3dViewer:hide-other-items', async (objectListMgr: ObjectListManager) => {await self.hideAllOtherObjects(objectListMgr)}),\r\n\t\tthis.aggr.subscribe('3dViewer:focus-selected-items', async (objectListMgr: ObjectListManager) => { await self.lookAtSelectedObjects(objectListMgr)}),\r\n\t\tthis.aggr.subscribe('3dViewer:select-all-instances', async (objectListMgr: ObjectListManager) => {await self.highlightSimilarElements(objectListMgr)}),\r\n\t\tthis.aggr.subscribe('3dViewer:highlight-selected-items', async (objectListMgr: ObjectListManager) => { await self.highlightSelectedObjects(objectListMgr)}),\r\n\t\tthis.aggr.subscribe('3dViewer:isolate-items',async (objectIds: ObjectIDsIF) => await self.T3D_Svc?.transluteObjects(objectIds) ),\r\n\t\tthis.aggr.subscribe('3dViewer:hide-items', async (objectIds: ObjectIDsIF) => await self.T3D_Svc?.hideObjects(objectIds) ),\r\n\t\tthis.aggr.subscribe('3dViewer:show-items', async (objectIds: ObjectIDsIF) => await self.T3D_Svc?.showObjects(objectIds) ),\r\n\t\tthis.aggr.subscribe('3dViewer:ChangeTool', async (tool: ToolEnum) => await self.T3D_Svc?.changeSelectedTool(tool)),\r\n\t\tthis.aggr.subscribe('3dViewer:TransluteAll', async () => { if (self.loadedRevisions) { self.T3D_Svc?.transluteAllObjects(); } }),\r\n\t\tthis.aggr.subscribe('3dViewer:ShowAll', async () => { if (self.loadedRevisions) { self.T3D_Svc?.showAllObjects(); } }),\r\n\t\tthis.aggr.subscribe('3dViewer:HideAll', async () => { if (self.loadedRevisions) { self.T3D_Svc?.hideAllObjects(); } }),\r\n\t\tthis.aggr.subscribe('3dViewer:ShowSpaces', (shouldShowSpaces: boolean) => { if (self.loadedRevisions) { self.T3D_Svc?.handleSpaces(shouldShowSpaces); } }),\r\n\t\tthis.aggr.subscribe('3dViewer:removeRevisions', (revisionIds: string[]) => {self.removeRevisionIdListFromLoadedRevisions(revisionIds)}),\r\n\t\tthis.aggr.subscribe('3dViewer:color-instances', (instanceColorDataCollection: InstanceColorDataCollection) => { self.colorInstances(instanceColorDataCollection)}),\r\n\t\tthis.aggr.subscribe('3dViewer:reset-colors', () => {self.resetColors()}),\r\n\t\tthis.aggr.subscribe('3dViewer:crop', async (direction: string[]) => {await self.cropModel(direction)}),\r\n\t\tthis.aggr.subscribe('viewer:enable-bindings-and-options', () => { self.setupViewerBindings(); }) //Ensuring viewers are setup before bindings are handled.\r\n\t];\r\n\tconsole.log('subs:', this.subscriptions);\r\n } //setupSubscriptions..\r\n\r\n unbind(): void {\r\n\t--IfcFun.nrOfTimesSubscribed;\r\n\tthis.subscriptions.forEach((subscription: Subscription) => subscription.dispose());\r\n }\r\n\r\n}//end-class-ifcFun.\r\n\r\n\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","exports","FragmentLoader","constructor","api","appContext","dlg","openBimHandles","getFragmentForRevision","fileId","revisionId","useMessagePack","this","mgr","Error","console","log","media","getRevisionMediaStatus","hasFragment","fromMpk","loadMpk","fragmentsGroup","source","FragmentSource","MPK","hasIfc","fromIfc","loadIfcAsFragment","IFC","warn","parseMPK","fragmentZipData","fragmentBuffer","Uint8Array","mpkLoader","loadFromMessagePackZip","group","groups","items","forEach","f","meshes","mesh","list","updateWindow","fragment","comp","add","camera","get","updateMatrixWorld","updateProjectionMatrix","highlighter","updateHighlight","fetchMpkBlob","fragmentUrl","error","fragment_url","self","model","url","async","_inputModel","arrayBuffer","fetchBlobAsAny","dlgResult","open","viewModel","whenClosed","fragGroupOrArrayBuffer","output","ifcUrl","parseIfcToFragmentGroup","ifcData","ifcBuffer","ifcToFragmentLoader","loader","load","modelId","path","projectId","project","jsonResult","autoinject","DialogService","IfcFun","aggr","modalMsg","projectIdForMRP","orgId","ofCourseTrue","turnOn_hoverHighlight","subscriptions","loadedRevisions","Map","isNewestPluginRevisionActive","activate","params","setProject","prj","getSelectedProject","ownerCompanyId","projects","attached","setupSubscriptions","container","document","getElementById","i","No_OB","undefined","initSelection_Highlighter","objectSelectionTool","modeToolHandler","setupToolEventsWithoutAurelia","T3D_Svc","tools","draggable","buttonClicked","OpenMessage","load_A_FRAGMENT","revision","load_An_IfcUrl","IFC_model","url4","IFC_file","fetch","IFC_data","IFC_buffer","IFC2Frag_loader","fragModel","THREE_scene","scene","background","Color","exportFragments","fragments","length","data","export","blob","Blob","fragmentFile","File","files","JSON","stringify","getLocalProperties","result","download","downloadZip","file","link","createElement","href","URL","createObjectURL","name","body","appendChild","click","remove","hasModelShowing","Array","from","values","find","r","isModelShowing","shouldLookAtModel","turnOnRevision3d","info","altUpload","allOK","remember_ModelInformation","publish","revisionInfo3d","openBim_model","set","turnOffRevision3d","has_loadedRevision","loadedRevision","setIsNewestPlugin","isNewestPlugin","lookAtSelectedObjects","objectListMgr","highlightSelectedObjects","highlightSimilarElements","isolateSelectedObjects","hideAllOtherObjects","resetColors","colorInstances","colorData","cropModel","direction","removeRevisionIdListFromLoadedRevisions","revisions","setupViewerBindings","turnOn_3dRevision_EH","parameter","success","isNewestPluginRevision","objectsIdNotDoneLoading","is2d","turnOff_Multiple","turnOff_3dRevision","nrOfTimesSubscribed","subscribe","objectIds","transluteObjects","hideObjects","showObjects","tool","changeSelectedTool","transluteAllObjects","showAllObjects","hideAllObjects","shouldShowSpaces","handleSpaces","revisionIds","instanceColorDataCollection","unbind","subscription","dispose","EventAggregator"],"sourceRoot":""}