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":""}