{"version":3,"file":"app-41647330.a4acac859f6b717b.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\":\"AAGA,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\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Module\nvar code = ` `;\n// Exports\nexport default code;","import {Fragment, FragmentsGroup} from \"@thatopen/fragments\";\r\n\r\n//import {GroupAndIdMappings} from \"./EgMessagePackLoader/IfcDataWrapper\";\r\nimport {GroupAndIdMappings} from \"app/project/ifc-fun/EgMessagePackLoader/GroupResultManager\"; //import {GroupAndIdMappings} from \"./EgMessagePackLoader/IfcDataWrapper\";\r\n\r\nimport * as THREE from \"three\";\r\n\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\nimport { EgFragmentLoader } from \"./EgMessagePackLoader/EgFragmentLoader\";\r\n\r\nexport interface FragmentLoaderIF {\r\n\t//getFragmentForRevision(fileId: string, revisionId: string, OB: OpenBimHandles, useMessagePack: boolean): FragmentsGroup | PromiseLike | null;\r\n\t//async \r\n\tgetFragmentForRevision(fileId: string, revisionId: string, openBimHandles: OpenBimHandles, useMessagePack: boolean) : Promise;\r\n}\r\n\r\n\r\n@autoinject()\r\nexport class FragmentLoader {\r\n\tpublic static hvadErDerGaltMedDig():number { return 42; }\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\tconsole.log('GGG-B,FragmentLoader.getFragmentForRevision');\r\n\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\tconst disabledForDevDiagnostics:boolean = false; //true;\r\n\t\tif (media.hasFragment && useMessagePack && !disabledForDevDiagnostics) {\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('setting fromMpk.userData.source, got from MPK:', fromMpk);\r\n\t\t\t\tfromMpk.userData.source = FragmentSource.MPK;\r\n\t\t\t\treturn fromMpk;\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log('NO userData.source through mpk');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// (fallthrough.)\r\n\t\tif (media.hasIfc) {\r\n\t\t\tlet fromIfc: FragmentsGroup | null;\r\n\t\t\tconsole.log('will attempt IFC, calling loadIfcAsFragment');\r\n\t\t\tfromIfc = await this.loadIfcAsFragment(media);\r\n\r\n\t\t\t// This appears to be too late?\r\n\t\t\t// The problem is, that event onFragmentsLoaded is issued\r\n\t\t\t// BEFORE we get back here..?\r\n\t\t\tconsole.log('GGG-B-DONE,After calling loadIfcAsFragment');\r\n\t\t\tconsole.log('setting fromIfc.userData.source, got from IFC:', fromIfc);\r\n\t\t\tif (fromIfc) {\r\n\t\t\t\tfromIfc.userData.source = FragmentSource.IFC;\r\n\t\t\t\treturn fromIfc;\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log('NO userData.source through 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 openBimHandles:OpenBimHandles = this.openBimHandles!;\r\n\t\tconsole.log('in parseMPK, openBimHandles is:', openBimHandles);\r\n\r\n\t\tconst mpkLoader:EgFragmentLoader = openBimHandles.mpkLoader!;\r\n\t\tconsole.log('in parseMPK, mpkLoader is:', mpkLoader);\r\n\r\n\t\tconsole.log('in parseMPK, fragmentZipData is:', fragmentZipData);\t\t\r\n\t\tconst fragmentBuffer = new Uint8Array(fragmentZipData);\r\n\t\tconsole.log('in parseMPK, fragmentBuffer is:', fragmentBuffer);\t\t\r\n\r\n\t\tconst fragmentGroupId = \"example\";\r\n\r\n\t\tconst groupAndIdMappings: GroupAndIdMappings = \r\n\t\t await \r\n\t\t mpkLoader.loadFromMessagePackZip(fragmentBuffer, fragmentGroupId); \r\n\t\t\tconsole.log('in parseMPK, groupAndIdMappings is:', groupAndIdMappings);\t\t\r\n\r\n\t\tconst fragmentsGroup : FragmentsGroup = groupAndIdMappings.group;\t\t\r\n\t\tif (fragmentsGroup) {\r\n\t\t\tfragmentsGroup.userData.source2 = 'IsMPK';\r\n\t\t\tconsole.log('GGG setting userData.source2 to IsMPK');\r\n\t\t\tthis.openBimHandles!.mgr?.groups.set(fragmentGroupId, 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.set(f.id, f);\r\n\t\t});\r\n\r\n\t\t// Raycast will not work without this\r\n\t\tfragmentsGroup.items.forEach((fragment: Fragment) => {\r\n\t\t\t// this.openBimHandles!.comp?.meshes.add(fragment.mesh);\t// TODO: Figure out if raycast still works without this in the new version\r\n\t\t})\r\n\r\n\t\tconst camera = this.openBimHandles!.world!.camera.three;\r\n\t\tcamera.updateMatrixWorld(true);\r\n\t\tcamera.updateProjectionMatrix();\r\n\t\treturn fragmentsGroup;\r\n\t}\r\n\r\n\t// \t\tconsole.log('GGG-B,FragmentLoader.getFragmentForRevision');\r\n\r\n\tprivate async loadMpk(media:RevisionMediaStatus):Promise {\r\n\t\tconsole.log('GGG-C, FragmentLoader.loadMpk');\t\t\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 reader_ID_instance_A = 11;\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', reader_ID_instance_A);\r\n\t\t\t\treturn await self.parseMPK(arrayBuffer);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconsole.log('GGG-D, FragmentLoader.fetchMpkBlob');\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\r\n\t\tconsole.log('GGG-E, FragmentLoader.fetchBlobAsAny');\r\n\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\tconsole.log('GGG-C2, FragmentLoader.loadIfcAsFragment');\t\t\r\n\t\tconsole.log('(no GGG-D with FragmentLoader.loadIfcAsFragment), -> fetchBlobAsAny');\r\n\t\t\r\n\t\tconst reader_ID_instance_B = 22;\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', reader_ID_instance_B);\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\t// We have the problem, that IfcLoader.load(..) issues onFragmentsLoaded, BEFORE we return here.\r\n\r\n\t\t\tconsole.log('load_An_IfcUrl got FragmentsGroup', fragmentsGroup);\r\n\t\t\t//await 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\tpublic 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 \"@thatopen/components\";\r\nimport * as OBCF from \"@thatopen/components-front\";\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 {\r\n\tBimViewerFileDtoSplitView,\r\n\tBimViewerModelAndAllRevisions,\r\n\tBimViewerModelAndRevision,\r\n\tBimViewerRevisionDtoSplitView\r\n} 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 {\r\n\tadd_a_default_fragment_on_startup,\r\n\tinit_OpenBimComponents,\r\n\tinitPrimaryWorld,\r\n\tmakeIfcLoader\r\n} from \"./openbim-initcontainer\";\r\nimport {getFirstThreeScene, OpenBimHandles} from \"./OpenBimHandles\";\r\nimport {ModalService} from \"app/services/modal-service\";\r\nimport {Color} from \"three\";\r\nimport {ObjectSelectionTool} from \"./Tools/ObjectSelectionTool\";\r\nimport {ObjectIDsIF} from \"./openbim-container\";\r\nimport {FragmentsGroup} from \"@thatopen/fragments\";\r\n\r\n@autoinject\r\nexport class IfcFun { // todo Rename to OpenBim3dViewer, OB3dViewer.\r\n\tpublic projectIdForMRP: string = 'no-prj-yet'; // arggh, binds to this!\r\n\tpublic orgId: string = 'no-org-yet';\r\n\tpublic T3D_Svc: ViewerThreeDServiceIF | undefined;\r\n\tprivate world: OBC.World |undefined;\r\n\r\n\tconstructor(\r\n\t\tprivate aggr: EventAggregator,\r\n\t\tprivate appContext: AppContextService,\r\n\t\tprivate modalMsg: ModalService\r\n\t\t//private modalMessage:ModalMessage\r\n\t) {\r\n\t}\r\n\r\n\tactivate(params: any) {\r\n\t\ttry {\r\n\t\t\tconsole.log('ifcFun.activate sets projectId to ', params.projectId);\r\n\r\n\t\t\tthis.projectIdForMRP = params.projectId; // because binds to it, sigh.\r\n\t\t\tthis.appContext.setProject(params.projectId);\r\n\t\t\tlet prj = this.appContext.getSelectedProject()!;\r\n\t\t\tif (!prj) {\r\n\t\t\t\tconsole.log('avail projects:', this.appContext.projects);\r\n\t\t\t\tconsole.error('no selected project!');\r\n\t\t\t} else {\r\n\t\t\t\tthis.orgId = prj.ownerCompanyId;\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\tconsole.log('wtf');\r\n\t\t}\r\n\r\n\t} // called first.\r\n\r\n\tcomp: OBC.Components | undefined;\r\n\tmgr: OBC.FragmentsManager | undefined;\r\n\tloader: OBC.IfcLoader | undefined;\r\n\r\n\thighlighter: OBCF.Highlighter | undefined;\r\n\r\n\t//shutup1:number = 1;\r\n\t//shutup2:number = 2;\r\n\tofCourseTrue: boolean = true;\r\n\r\n\tpublic turnOn_hoverHighlight: boolean = false; //true;//false;\r\n\r\n\tasync attached() { // called second.\r\n\t\tconsole.log('IfcFun attached is called.');\r\n\r\n\t\tconsole.log('before setupSubscriptions');\r\n\t\tthis.setupSubscriptions(); // cloned from bim-viewer-three-d.ts\r\n\t\tconsole.log('after setupSubscriptions');\r\n\r\n\t\tconsole.log('calling the_init');\r\n\t\tconst container: HTMLElement = document.getElementById('container')!; // Get the
element where the scene will be displayed\r\n\t\tconst fancyExtras = true; //false;\r\n\t\tconst FPS_Meter = true;\r\n\t\tthis.comp = await init_OpenBimComponents(container, fancyExtras, FPS_Meter);\r\n\t\tthis.world = await initPrimaryWorld(this.comp, container, false);\r\n\t\t/* NB: init_OpenBimComponents won't work before here/this place, because we need DOM,\r\n\t\t to get viewerContainer, which is: UIManager._components.renderer.get().domElement.parentElement */\r\n\r\n\t\tif (this.ofCourseTrue) { //fancyExtras_NO) { //this.shutup1 == this.shutup2) {\r\n\r\n\t\t\tconst No_OB: OpenBimHandles = undefined;\r\n\t\t\tthis.highlighter = CollabHighlightInitiator.initHighlighter(this.comp, No_OB, this.turnOn_hoverHighlight); // Todo, we need to figure out how IfcFun should integrate with initSelection_RayCaster.\r\n\t\t\tconst objectSelectionTool = new ObjectSelectionTool(No_OB, this.highlighter, this.aggr);\r\n\r\n\t\t\tconst modeToolHandler = new ModeToolHandler(objectSelectionTool);\r\n\t\t\tModeToolHandler.setupToolEventsWithoutAurelia(container, modeToolHandler);\r\n\t\t\tthis.T3D_Svc = new OpenBimViewerThreeDService(modeToolHandler, No_OB, objectSelectionTool);\r\n\t\t}\r\n\r\n\t\tthis.mgr = this.comp?.get(OBC.FragmentsManager);\r\n\r\n\t\t//await this.loadAFragment();// await add_a_default_fragment_on_startup(comp, mgr);\r\n\r\n\t\tthis.loader = await makeIfcLoader(this.comp);//in-IFcFun.attached.\r\n\t\t//init_IfcLoader_Toolbars(this.comp, this.mgr, this.loader);\r\n\t\t// todo, get openbim css in, for tailwind.\r\n\r\n\t\tconsole.log('now .model-revision-container is draggable..');\r\n\t\t$('.model-revision-container').draggable();\r\n\t}\r\n\r\n\tbuttonClicked() {\r\n\t\tconsole.log('button clicked!');\r\n\t\tthis.modalMsg.OpenMessage('title', 'message', true);\r\n\t}\r\n\r\n\tasync load_A_FRAGMENT(model: BimViewerFileDtoSplitView, revision: BimViewerRevisionDtoSplitView): Promise {\r\n\t\tlet url = 'small.frag';\r\n\t\tlet orgId = this.orgId;\r\n\t\tlet prjId = this.appContext.projectId; //projectId;\r\n\t\t/* vi opbevarer\r\n\t\t - oprindelige IFC/src (mulighed 1 - bare load-og-konverter raat-direkte-hvergang)\r\n\t\t - (mulighed 2): fragment resultat fra job-submit til lars/william\r\n\t\t - (mulighed 3): ELLER en vi selv konverterer direkte med OpenBim's funktion!\r\n\t\t*/\r\n\t\tlet fragments: FragmentsGroup = await add_a_default_fragment_on_startup(url, this.comp!, this.mgr!);\r\n\t\treturn fragments;\r\n\t}\r\n\r\n\tasync load_An_IfcUrl(IFC_model: BimViewerFileDtoSplitView, revision: BimViewerRevisionDtoSplitView): Promise {\r\n\t\tlet orgId = this.orgId;\r\n\t\tlet prjId = this.appContext.projectId;\r\n\t\tlet url4 = `https://aoc1bim1sa.blob.core.windows.net/org-${orgId}/prj-${prjId}/file-${IFC_model.id}/rev-${revision.id}.ifc`;\r\n\r\n\t\tconst IFC_file: Response = await fetch(url4);\r\n\t\tconst IFC_data: ArrayBuffer = await IFC_file.arrayBuffer();\r\n\t\tconst IFC_buffer = new Uint8Array(IFC_data);\r\n\r\n\t\tconst IFC2Frag_loader = this.loader!;\r\n\t\tconst fragModel: FragmentsGroup = await IFC2Frag_loader.load(IFC_buffer);\r\n\r\n\t\t// this.highlighter!.updateHighlight(); // TODO: I think this is not necessary anymore\r\n\t\tconst THREE_scene = getFirstThreeScene(this.comp!);\r\n\t\tTHREE_scene.add(fragModel);\t// (No Culler used here.)\r\n\t\tconsole.log('any background?', THREE_scene);\r\n\r\n\t\t//const bg = THREE_scene.background;\r\n\t\tTHREE_scene.background = new Color('#c0d0e8'); // 'lime');\r\n\r\n\t\treturn fragModel;\r\n\t}\r\n\r\n\tasync exportFragments(fragments: OBC.FragmentsManager) {\r\n\t\tif (!fragments.groups.size) return;\r\n\r\n\t\t// JG: this is broken, or at least has some problem.\r\n\t\t// The only reason we don't get trouble, is because we are not currently using it?\r\n\t\t// But the weird thing is, that VSCode flags it, but webpack/typescript compiler doesn't??\r\n\t\t//const group1: FragmentsGroup = fragments.groups.entries().next().value;\r\n\r\n\t\tlet fragmentGroupsMap = fragments.groups;\r\n\t\tlet entriesIterator = fragmentGroupsMap.entries();\r\n\t\tlet nextEntryPair = entriesIterator.next();\r\n\t\tlet nextEntryVal = nextEntryPair.value;\r\n\t\t//const group2: FragmentsGroup = nextEntryVal!;\r\n\t\tconst group: FragmentsGroup = nextEntryVal![1]; // fragments.groups.entries().next().value;\r\n\t\t\r\n\r\n\t\tconst data = fragments.export(group);\r\n\t\tconst blob = new Blob([data]);\r\n\t\tconst fragmentFile = new File([blob], 'small.frag');\r\n\t\tconst files = [];\r\n\t\tfiles.push(fragmentFile);\r\n\t\tfiles.push(new File([JSON.stringify(group.getLocalProperties())], 'small.json'));\r\n\t\t// JG: Something is broken in the openBim sample here.\r\n\t\tconst result = new File([], 'x'); //await this.downloadZip(files).blob();\r\n\t\tthis.download(result);\r\n\t}\r\n\r\n\tasync downloadZip(files: File[]): Promise {\r\n\t\treturn files[0];\r\n\t} // helper for exportFragments.\r\n\r\n\tdownload(file: File) { // helper for exportFragments.\r\n\t\tconst link = document.createElement('a');\r\n\t\tlink.href = URL.createObjectURL(file);\r\n\t\tlink.download = file.name;\r\n\t\tdocument.body.appendChild(link);\r\n\t\tlink.click();\r\n\t\tlink.remove();\r\n\t}\r\n\r\n\t// function disposeFragments() { fragments.dispose(); }\r\n\r\n\t// A lot of this, we should define an interface for it?\r\n\t// cloned from bim-viewer-three-d.ts\r\n\tprivate subscriptions: Subscription[] = [];\r\n\r\n\t// We want our own OB-'RevisionInformation3d' to remember openBim stuff.\r\n\tprivate loadedRevisions: Map = new Map(); //Key revision, ModelInfo\r\n\r\n\thasModelShowing(): boolean {\r\n\t\tlet revs = Array.from(this.loadedRevisions.values());\r\n\t\treturn !!revs.find(r => r.isModelShowing);\r\n\t}\r\n\r\n\tshouldLookAtModel(): boolean {\r\n\t\treturn !this.hasModelShowing();\r\n\t}\r\n\r\n\t// BEGIN bim-viewer-three-d INTERFACE:\r\n\tasync turnOnRevision3d(model: BimViewerFileDtoSplitView, revision: BimViewerRevisionDtoSplitView): Promise {\r\n\t\tconsole.log('IfcFun.turnOnRevision3d, retrieving/loading ifc revision.');\r\n\t\t//await this.load_A_FRAGMENT(model,revision); // (Raw-fragment (converted/prebaked IFC) loader.)\r\n\t\tlet fragModel: FragmentsGroup = await this.load_An_IfcUrl(model, revision);\r\n\t\tconsole.info('altUpload?', model.altUpload, revision.altUpload);\r\n\t\tlet allOK = !!fragModel; // If we got a model, all is OK.\t\r\n\t\tthis.remember_ModelInformation(revision, fragModel);\r\n\t\t// (vi har ikke, behøver ikke, loadingModels tool her.)\r\n\t\t// this.eventAggregator.publish('ModelRevision:ModelReady', {model: model, revisionId: revision.id});\r\n\r\n\t\t/* We must fire the event 'Revision3FinishedLoading'\r\n\t\twhen we are 'pretty sure the model has loaded', because this is \r\n\t\twhat moves the UI '3D' button-indicator from the gray '..still..loading..' state to the black 'confirmed fully loaded' state,\r\n\t\tand THIS is what will enable us to turn-off-unload the revision again, by clicking its button again.\r\n\t\t*/\r\n\t\tthis.aggr.publish('Revision:Revision3FinishedLoading', {model: model, revisionId: revision.id}) //model:BimViewerFileDtoSplitView\r\n\t\treturn new TurnOnRevision3dResponse(allOK, allOK); //false,false); //hasModelBeenLoaded, success); //hasModelBeenLoaded, success);\r\n\r\n\t\t/* The chain for turnOnRevision3d used to be:\r\n\t\tturnOnRevision3d -> loadUrl_forRevision -> loadUrl_forRevision_Catenda -> handleFinishedGettingObjectIds -> setupModelInformation (which registers 'allObjIDs'). \r\n\t\t\t(earlier, GetAllObjectIdsForRevision is also used.)\r\n\t\t\t*/\r\n\r\n\t\t/*\r\n\t\tlet hasModelBeenLoaded = false; //this.loadedRevisions.has(revision.id); \r\n\t\tlet success = hasModelBeenLoaded;\r\n\t\tif (hasModelBeenLoaded) {\r\n\t\t\tlet currentRevision: RevisionInformation3d = this.loadedRevisions.get(revision.id)!;\r\n\t\t\tif (currentRevision.isModelShowing != true) {\r\n\t\t\t\t//this.T3D_Svc.turnOnRevision(this.loadedRevisions, revision, this.shouldLookAtModel());\r\n\t\t\t\tcurrentRevision.isModelShowing = true;\r\n\t\t\t}\r\n\t\t} else { // (!hasModelBeenLoaded) \r\n\t\t\tconsole.log('turnOnRevision3d calls BV3D.loadUrl');\r\n\t\t\t//success = await this.loadUrl_forRevision(revision, model);\r\n\t\t}\r\n\t\t*/\r\n\r\n\t\t/* JG: Alt det der roderi-crap, har været knyttet til catendas\r\n\t\tunderlige ikke-korrekte-haandtering af at kunne swappe del-modeller ind og ud.\r\n\t\tFordi de kunne TILFOEJE del-modeller, men ikke 'tage dem af' igen,\r\n\t\tså har vi haft alt dette underlige gymnastik med \r\n\t\tat rode rundt med deres enkelte instans-element ID'er.\r\n\t\r\n\t\tVi skal istedet bare reducere det til \"loadUrl\" casen igen, i første omgang.\r\n\t\t */\r\n\t}\r\n\r\n\tremember_ModelInformation(revision: BimViewerRevisionDtoSplitView, fragModel: FragmentsGroup): void {\r\n\t\tlet revisionInfo3d = new OB_RevisionInformation3d(); // in setupModelInformation.\r\n\t\t//revisionInfo3d.boundingBox = get_boundingBox;\r\n\t\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\t//revisionInfo3d.spaceIds = allObjectIds.spaceObjectIds;\r\n\t\t//revisionInfo3d.revisionBimId = revision.id; //.bimRevisionId; // not relevant, as no separate IDs (.. I think?)\r\n\t\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\t\trevisionInfo3d.isModelShowing = true;\r\n\t\tthis.loadedRevisions.set(revision.id, revisionInfo3d);\r\n\t\t// fixme, do we ever REMOVE from loadedRevisions?\r\n\t}\r\n\r\n\r\n\tasync turnOffRevision3d(revision: BimViewerRevisionDtoSplitView): Promise {\r\n\t\tlet has_loadedRevision: OB_RevisionInformation3d | undefined = this.loadedRevisions?.get(revision.id);\r\n\t\tif (!has_loadedRevision) {\r\n\t\t\tconsole.log('revision is not loaded:', revision.id);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet loadedRevision: OB_RevisionInformation3d = has_loadedRevision;\r\n\t\tif (!loadedRevision.isModelShowing) {\r\n\t\t\tconsole.log('revision is not showing:', revision.id, loadedRevision.isModelShowing);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet model = loadedRevision.openBim_model!;\r\n\t\tconst THREE_scene: THREE.Scene = getFirstThreeScene(this.comp!);\r\n\r\n\t\t// symmetric remove:\r\n\t\tTHREE_scene.remove(model); // THREE_scene.add(model);\t\t \r\n\t\tloadedRevision.isModelShowing = false;\r\n\t}\r\n\r\n\tisNewestPluginRevisionActive: boolean = false;\r\n\r\n\tsetIsNewestPlugin(isNewestPlugin: boolean): void {\r\n\t\tthis.isNewestPluginRevisionActive = isNewestPlugin;\r\n\t}\r\n\r\n\t// those were the three founding methods. The rest are fancy tools..\r\n\tasync lookAtSelectedObjects(objectListMgr: ObjectListManager): Promise {\r\n\t}\r\n\r\n\tasync highlightSelectedObjects(objectListMgr: ObjectListManager): Promise {\r\n\t\t/* in our catenda impl, this method uses as input, the number[] result from\r\n\t\tentityIdFinderService.getSelectedObjectsAsEntityIds.\r\n\t\tThat again is implemented by delegating to objectListMgr.selectedItems.filter(.) \r\n\t\tThe TLDR is, that on a high level, our selections are handled as a list of IFC_EntityId numbers,\r\n\t\twhich you can query from the EntityIdFinderService class.\r\n\t\t But EntityIdFinderService gets its data from ObjectListManager - who tells him?\r\n\t\r\n\t\tHmm, but how does ObjectListManager.selectedItems get changed?\r\n\t\tI GAVE UP: We have not yet guessed how OLM.selectedItems is updated\r\n\t\twhen user clicks catenda 3d model.\r\n\t\t*/\r\n\t}\r\n\r\n\tasync highlightSimilarElements(objectListMgr: ObjectListManager) {\r\n\t}\r\n\r\n\tasync isolateSelectedObjects(objectListMgr: ObjectListManager): Promise {\r\n\t}\r\n\r\n\tasync hideAllOtherObjects(objectListMgr: ObjectListManager) {\r\n\t}\r\n\r\n\tresetColors(): void {\r\n\t}\r\n\r\n\tcolorInstances(colorData: InstanceColorDataCollection): void {\r\n\t}\r\n\r\n\tasync cropModel(direction: string[]): Promise {\r\n\t}\r\n\r\n\tremoveRevisionIdListFromLoadedRevisions(revisions: string[]): void {\r\n\t}\r\n\r\n\tsetupViewerBindings(): void {\r\n\t}\r\n\r\n\t// END bim-viewer-three-d INTERFACE.\r\n\r\n\tasync turnOn_3dRevision_EH(parameter: BimViewerModelAndRevision) { // EH is 'EventHandler'.\r\n\t\tconsole.log('(IF)the event 3dViewer:TurnOn3dRevision calls our turnOnRevision3d.', parameter.model.id, parameter.revision.id);\r\n\t\tif (!(await this.turnOnRevision3d(parameter.model, parameter.revision)).success) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (parameter.isNewestPluginRevision == true) {\r\n\t\t\tthis.setIsNewestPlugin(parameter.isNewestPluginRevision);\r\n\t\t} // who turns this off??\r\n\t\t// JG: WTF is the meaning of this - why would you NOT want to fire the else-case?\r\n\t\tif (parameter.revision.objectsIdNotDoneLoading == false) { // head-spin, it means DoneLoading is true..\r\n\t\t\tconsole.log('IF, firing Revision3FinishedLoading');\r\n\t\t\tthis.aggr.publish('Revision:Revision3FinishedLoading', {\r\n\t\t\t\tmodel: parameter.model,\r\n\t\t\t\trevisionId: parameter.revision.id\r\n\t\t\t})\r\n\t\t} else {\r\n\t\t\tconsole.log('IF, firing RevisionTurnedOn');\r\n\t\t\tthis.aggr.publish('Revision:RevisionTurnedOn', {\r\n\t\t\t\tmodel: parameter.model,\r\n\t\t\t\trevision: parameter.revision,\r\n\t\t\t\tis2d: false\r\n\t\t\t});\r\n\t\t}\r\n\t\tthis.aggr.publish('ModelRevision:HandleStateChange');\r\n\t}\r\n\r\n\tasync turnOff_Multiple(parameter: BimViewerModelAndAllRevisions): Promise {\r\n\t\tfor (let revision of parameter.revisions) {\r\n\t\t\tawait this.turnOffRevision3d(revision);\r\n\t\t\tif (parameter.isNewestPluginRevision) {\r\n\t\t\t\tthis.setIsNewestPlugin(!parameter.isNewestPluginRevision);\r\n\t\t\t}\r\n\t\t\tthis.aggr.publish('Revision:RevisionTurnedOff', {model: parameter.model, revision: revision, is2d: false});\r\n\t\t}\r\n\t}\r\n\r\n\tasync turnOff_3dRevision(parameter: BimViewerModelAndRevision) {\r\n\t\tawait this.turnOffRevision3d(parameter.revision);\r\n\t\tif (parameter.isNewestPluginRevision) {\r\n\t\t\tthis.setIsNewestPlugin(!parameter.isNewestPluginRevision);\r\n\t\t}\r\n\t\tthis.aggr.publish('Revision:RevisionTurnedOff', {\r\n\t\t\tmodel: parameter.model,\r\n\t\t\trevision: parameter.revision,\r\n\t\t\tis2d: false\r\n\t\t});\r\n\t}\r\n\r\n\tstatic nrOfTimesSubscribed: number = 0;\r\n\r\n\tsetupSubscriptions(): void { // it is wrong to call this from attached, unless we also unsubscribe in detach! Hmm, we clean up below in dispose?\r\n\t\tconsole.log('setupSubscriptions', ++IfcFun.nrOfTimesSubscribed);\r\n\t\tif (IfcFun.nrOfTimesSubscribed > 1) {\r\n\t\t\tconsole.error('\\n WRONG WRONG, too many subscriptions!', IfcFun.nrOfTimesSubscribed);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t/* cookbook, ingredients:\r\n\t\t - load/unload REVISIONS (TurnOn3dRevision,TurnOff3dRevision,TurnOffMultiple3dRevision)\r\n\t\t - also, 'removeRevisions' - exactly what is it used for? (only catenda needs it?)\r\n\t\t - element-instance SELECTION (e.g. isolate-selected-items, highlight-selected-items)\r\n\t\t we count at least 8 events concerning ITEMS(..'selection').\r\n\t\t - a number of 'ALL-*' operations, I wonder what that signifies, it mostly sounds like 'reset'..? hide-all? show-all?\r\n\t\t - SUNDRY:\r\n\t\t - - SPACES, concerning.\r\n\t\t - - item-COLORING, concerning.\r\n\t\t - - CROP/\"chop\",(cut-away) concerning.\r\n\t\r\n\t\t SUMMARY: \r\n\t\t (1) (mouse-)selection-mode/selection-model.\r\n\t\t (2) elements/items\r\n\t\t My hunch is to start with mouse (1) to easier learn about (2).\r\n\t\t */\r\n\t\tlet self = this;\r\n\t\tthis.subscriptions = [\r\n\t\t\tthis.aggr.subscribe('3dViewer:TurnOn3dRevision', async (parameter: BimViewerModelAndRevision) => {\r\n\t\t\t\tawait self.turnOn_3dRevision_EH(parameter);\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:TurnOff3dRevision', async (parameter: BimViewerModelAndRevision) => {\r\n\t\t\t\tawait self.turnOff_3dRevision(parameter);\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:TurnOffMultiple3dRevision', async (parameter: BimViewerModelAndAllRevisions) => {\r\n\t\t\t\tawait self.turnOff_Multiple(parameter);\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:isolate-selected-items', async (objectListMgr: ObjectListManager) => {\r\n\t\t\t\tawait self.isolateSelectedObjects(objectListMgr)\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:hide-other-items', async (objectListMgr: ObjectListManager) => {\r\n\t\t\t\tawait self.hideAllOtherObjects(objectListMgr)\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:focus-selected-items', async (objectListMgr: ObjectListManager) => {\r\n\t\t\t\tawait self.lookAtSelectedObjects(objectListMgr)\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:select-all-instances', async (objectListMgr: ObjectListManager) => {\r\n\t\t\t\tawait self.highlightSimilarElements(objectListMgr)\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:highlight-selected-items', async (objectListMgr: ObjectListManager) => {\r\n\t\t\t\tawait self.highlightSelectedObjects(objectListMgr)\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:isolate-items', async (objectIds: ObjectIDsIF) => await self.T3D_Svc?.transluteObjects(objectIds)),\r\n\t\t\tthis.aggr.subscribe('3dViewer:hide-items', async (objectIds: ObjectIDsIF) => await self.T3D_Svc?.hideObjects(objectIds)),\r\n\t\t\tthis.aggr.subscribe('3dViewer:show-items', async (objectIds: ObjectIDsIF) => await self.T3D_Svc?.showObjects(objectIds)),\r\n\t\t\tthis.aggr.subscribe('3dViewer:ChangeTool', async (tool: ToolEnum) => await self.T3D_Svc?.changeSelectedTool(tool)),\r\n\t\t\tthis.aggr.subscribe('3dViewer:TransluteAll', async () => {\r\n\t\t\t\tif (self.loadedRevisions) {\r\n\t\t\t\t\tself.T3D_Svc?.transluteAllObjects();\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:ShowAll', async () => {\r\n\t\t\t\tif (self.loadedRevisions) {\r\n\t\t\t\t\tself.T3D_Svc?.showAllObjects();\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:HideAll', async () => {\r\n\t\t\t\tif (self.loadedRevisions) {\r\n\t\t\t\t\tself.T3D_Svc?.hideAllObjects();\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:ShowSpaces', (shouldShowSpaces: boolean) => {\r\n\t\t\t\tif (self.loadedRevisions) {\r\n\t\t\t\t\tself.T3D_Svc?.handleSpaces(shouldShowSpaces);\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:removeRevisions', (revisionIds: string[]) => {\r\n\t\t\t\tself.removeRevisionIdListFromLoadedRevisions(revisionIds)\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:color-instances', (instanceColorDataCollection: InstanceColorDataCollection) => {\r\n\t\t\t\tself.colorInstances(instanceColorDataCollection)\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:reset-colors', () => {\r\n\t\t\t\tself.resetColors()\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('3dViewer:crop', async (direction: string[]) => {\r\n\t\t\t\tawait self.cropModel(direction)\r\n\t\t\t}),\r\n\t\t\tthis.aggr.subscribe('viewer:enable-bindings-and-options', () => {\r\n\t\t\t\tself.setupViewerBindings();\r\n\t\t\t}) //Ensuring viewers are setup before bindings are handled.\r\n\t\t];\r\n\t\tconsole.log('subs:', this.subscriptions);\r\n\t} //setupSubscriptions..\r\n\r\n\tunbind(): void {\r\n\t\t--IfcFun.nrOfTimesSubscribed;\r\n\t\tthis.subscriptions.forEach((subscription: Subscription) => subscription.dispose());\r\n\t}\r\n\r\n}//end-class-ifcFun.\r\n\r\n\r\n "],"names":["___CSS_LOADER_EXPORT___","push","module","id","FragmentLoader","hvadErDerGaltMedDig","constructor","api","appContext","dlg","openBimHandles","getFragmentForRevision","fileId","revisionId","useMessagePack","console","log","this","mgr","Error","media","getRevisionMediaStatus","hasFragment","fromMpk","loadMpk","userData","source","FragmentSource","MPK","hasIfc","fromIfc","loadIfcAsFragment","IFC","warn","parseMPK","fragmentZipData","mpkLoader","fragmentBuffer","Uint8Array","fragmentGroupId","groupAndIdMappings","loadFromMessagePackZip","fragmentsGroup","group","source2","groups","set","items","forEach","f","meshes","mesh","list","fragment","camera","world","three","updateMatrixWorld","updateProjectionMatrix","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","highlighter","modelId","path","projectId","project","get","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","comp","No_OB","undefined","initHighlighter","objectSelectionTool","modeToolHandler","setupToolEventsWithoutAurelia","T3D_Svc","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","add","background","exportFragments","fragments","size","entries","next","value","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","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":""}