{"version":3,"file":"app-ed42640d.c40d3d99ae155a2f.bundle.js","mappings":"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","sources":["webpack://client-app/./src/app/project/ifc-fun/openbim-container.scss","webpack://client-app/./src/app/project/ifc-fun/openbim-testbed.scss","webpack://client-app/./src/app/project/ifc-fun/openbim-container.html","webpack://client-app/./src/app/project/ifc-fun/openbim-testbed.html","webpack://client-app/./src/app/project/ifc-fun/openbim-container.ts","webpack://client-app/./src/app/project/ifc-fun/openbim-highlighter.ts","webpack://client-app/./src/app/project/ifc-fun/openbim-initcontainer.ts","webpack://client-app/./src/app/project/ifc-fun/openbim-testbed.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, `#container{position:relative}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/app/project/ifc-fun/openbim-container.scss\"],\"names\":[],\"mappings\":\"AAEA,WACC,iBAAA\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// 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:0px purple solid;background:gray}.whynogeneralcontainerclass2{height:calc(100vh - 4em);overflow:hidden}.openbim-testbed-class{background:pink;border:0px red solid}#container{height:100%;border:0px blue solid}#model-revision-container{position:relative;left:632px;top:-425px;width:50%}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/app/project/ifc-fun/openbim-testbed.scss\"],\"names\":[],\"mappings\":\"AAMA,YACC,YAAA,CACA,qBAAA,CACA,YAAA,CACA,uBAAA,CACA,eAAA,CAsBD,6BACC,wBAAA,CACG,eAAA,CAGJ,uBACC,eAAA,CACA,oBAAA,CAWD,WACC,WAAA,CACA,qBAAA,CAGD,0BACC,iBAAA,CAAA,UAAA,CAAA,UAAA,CACA,SAAA\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Module\nvar code = ` `;\n// Exports\nexport default code;","// Module\nvar code = ` `;\n// Exports\nexport default code;","import {FragmentLoader, FragmentLoaderIF} from \"./fragment-loader\";\r\nimport * as THREE from \"three\"; // ALSO: npm i --save-dev @types/three\r\nimport * as OBC from \"@thatopen/components\";\r\nimport {FragmentsGroup, IfcProperties} from '@thatopen/fragments'; // ,FragmentMap, IfcProperties, Fragment\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 {\r\n\tFileAndRevisionDto,\r\n\tOB_RevisionInformation3d,\r\n\tTurnOnRevision3dResponse\r\n} from \"../work-area/split-viewer-interfaces\";\r\nimport {InstanceColorDataCollection} from \"app/models/color-legend-dto\";\r\nimport {ToolEnum, ViewerThreeDServiceIF} from \"app/services/ViewerThreeDServiceIF\";\r\nimport {OpenBimViewerThreeDService} from \"./OpenBimViewerThreeDService\";\r\nimport {autoinject, bindable} from \"aurelia-framework\";\r\nimport {CollabHighlightInitiator} from \"./openbim-highlighter\";\r\nimport {init_OpenBimComponents, initPrimaryWorld, makeIfcLoader} from \"./openbim-initcontainer\";\r\nimport {getFirstThreeScene, OpenBimHandles} from \"./OpenBimHandles\";\r\nimport {EgFragmentLoader} from \"./EgMessagePackLoader/EgFragmentLoader\";\r\nimport {Three_Sel} from \"app/components/base-viewer-three-d/Three_Sel\";\r\nimport {ModeToolHandler} from \"./Tools/ModeToolHandler\";\r\nimport {ObjectSelectionTool} from \"./Tools/ObjectSelectionTool\";\r\nimport {BaseViewerCombined} from \"app/components/base-viewer-combined/base-viewer-combined\";\r\nimport {EntityIdFinderService} from \"../../services/entity-id-finder-service\";\r\nimport {IfcTypeFilter} from \"./Tools/IfcTypeFilter\";\r\nimport {ObjectRow} from \"../../services/object-list/object-list-row\";\r\nimport {IdMappingComponent} from \"./Utilities/IdMappingComponent\";\r\nimport { ApiClient } from \"app/services/api-client\";\r\nimport { AppContextService } from \"app/services/app-context-service\";\r\nimport { DialogService } from \"aurelia-dialog\";\r\n\r\n@autoinject\r\nexport class OpenbimContainer {\r\n\t@bindable threeSel:Three_Sel|undefined;\r\n\r\n\t@bindable public OB:OpenBimHandles = {}; //\r\n\t@bindable public projectId:string = 'no-prj-yet3';\r\n\t@bindable public orgId2:string = 'no-org-yet3';\r\n\r\n\t@bindable public fileId:string = 'no-fileId-yet';\r\n\t@bindable public revisionId:string|undefined = undefined; //'no-revId-yet';\r\n\t\r\n\tpublic useMessagePack:boolean = BaseViewerCombined.useMPKFragments_Master; // false; //true;\r\n \tpublic projectIdForMRP : string = 'no-prj-yet'; // arggh, binds to this!\r\n\t//public orgId:string = 'no-org-yet1';\r\n \tpublic viewerThreeDService: ViewerThreeDServiceIF | undefined = undefined;\r\n\tprivate modeToolHandler: ModeToolHandler | undefined = undefined;\r\n\r\n\tprivate subscriptions: Subscription[] = [];\r\n\r\n\tprivate fragmentLoader:FragmentLoaderIF;\r\n\r\n\tconstructor(\r\n\t\tprivate aggr: EventAggregator,\r\n\t\tprivate entityIdFinderService: EntityIdFinderService,\r\n\t\t//private fragmentLoader3: FragmentLoader,\r\n\t\tprivate api: ApiClient, private ctx: AppContextService, private dlg: DialogService\r\n\t) {\r\n\t\tconsole.log('OpenbimContainer, OB is now:', this.OB);\r\n\t\t//this.fragmentLoader = {}; //fragmentLoader3;\r\n\t\tthis.fragmentLoader = this.factory_FragmentLoader(api,ctx,dlg);\r\n\t}\r\n\r\n\tfactory_FragmentLoader(api: ApiClient, ctx: AppContextService, dlg: DialogService):FragmentLoader { \r\n\t\treturn new FragmentLoader(api,ctx,dlg); \r\n\t}\r\n\r\n\tasync revisionIdChanged(n:string,o:string) {\r\n\t\tconsole.log('op-c, revId changed from', o, 'to:', n, this.revisionId);\r\n\t\tif (!this.revisionId) { return; }\r\n\t\tlet fragModel:FragmentsGroup|null = await this.loadModel(this.fileId, this.revisionId!, 'revisionIdChanged');//in-revisionIdChanged\r\n\t}\r\n\r\n\tactivate(params:any) {\r\n\t\tconsole.warn('not currently relying on openbimContainer.activate');\r\n\t\tconsole.log('OpenbimContainer.activate, OB is now:', this.OB);\r\n\t} // called first.\r\n\r\n\tpublic turnOnHoverHighlight: boolean = false;\r\n\r\n\tasync attached() { // called second.\r\n\t\tconsole.log('openbimContainer attached is called, projectId is:', this.projectId); \r\n\t\tconsole.log('bound info was:', this.fileId, this.revisionId);\r\n\t\tconsole.log('OpenbimContainer.attached, OB is now:', this.OB);\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\r\n\t\tconst fancyExtras_YES = true;\r\n\t\tthis.OB.comp = await init_OpenBimComponents(container, fancyExtras_YES, false);\r\n\t\tthis.OB.world = await initPrimaryWorld(this.OB.comp, container, false);\r\n\t\t\r\n\t /* NB: init_OpenBimComponents won't work before here/this place, because we need DOM,\r\n to get viewerContainer, which is: UIManager._components.renderer.get().domElement.parentElement */\r\n\t\t\r\n\t\tthis.OB.highlighter = CollabHighlightInitiator.initHighlighter(this.OB.comp, this.OB, this.turnOnHoverHighlight);\r\n\t\tif (this.threeSel != null) {\r\n\t\t\tthis.threeSel.OB = this.OB;\r\n\t\t}\r\n\t\tconsole.log('openbim-container has now given ThreeSel access to OB/highlighter.');\r\n\t\t\r\n\t\tthis.OB.mgr = this.OB.comp!.get(OBC.FragmentsManager); \r\n\r\n\t\tconsole.log('openbim-container.attached calling makeIfcLoader.');\r\n\t\tthis.OB.loader = await makeIfcLoader(this.OB.comp);\r\n\t\tthis.OB.mpkLoader = new EgFragmentLoader(this.OB.comp);\r\n\r\n\t\tthis.setupTools();\r\n\t\t\r\n\t\tconsole.log('now .model-revision-container is draggable..');\r\n\t\t$('.model-revision-container').draggable();\r\n\t\t\r\n\t\tconsole.log('XYQ openbim-container.attached wants to call load_An_IfcUrl with bound this.revisionId', this.revisionId);\r\n\t\tif (this.revisionId) {\r\n\t\t\tlet fragModel:FragmentsGroup|null = await this.loadModel(this.fileId, this.revisionId, 'OpenbimContainer.attached' );//in-attached \r\n\t\t} else {\r\n\t\t\tconsole.warn('(OBC-attached: - as no revisionId yet, not trying to load anything yet.)');\r\n\t\t}\r\n\t}\r\n\t\r\n\r\n\tprivate setupTools() {\r\n\t\tconst objectSelectionTool = new ObjectSelectionTool(this.OB, this.OB.highlighter!, this.aggr);\r\n\t\tthis.modeToolHandler = new ModeToolHandler(objectSelectionTool);\r\n\t\tconst container: HTMLElement | null = document.getElementById('container');\r\n\t\tif (container == null) {\r\n\t\t\tthrow new Error('Could not find the container element. Please set the OpenBim viewer container id to \"container\"');\r\n\t\t}\r\n\t\tModeToolHandler.setupToolEventsWithoutAurelia(container, this.modeToolHandler);\r\n\t\tif (this.OB.comp) {\r\n\t\t\tconst openBimViewerThreeDService = new OpenBimViewerThreeDService(this.modeToolHandler, this.OB, objectSelectionTool);\r\n\t\t\tthis.viewerThreeDService = openBimViewerThreeDService;\r\n\t\t\tthis.OB.openbimViewerThreeDService = openBimViewerThreeDService;\r\n\t\t}\r\n\t}\r\n\r\n\tasync loadModel(fileId: string, revisionId: string, who:string) : Promise {\r\n\t\tconsole.log('openbimContainer.loadModel, projectId is now:', this.projectId);\r\n\r\n\t\tconsole.log('GGG-A,OpenbimContainer.loadModel');\r\n\t\tconst fragmentsGroup: FragmentsGroup | null = await this.fragmentLoader.getFragmentForRevision(fileId, revisionId, this.OB, this.useMessagePack);\r\n\r\n\t\tif (!fragmentsGroup) {\r\n\t\t\tconsole.warn('load_An_IfcUrl got no fragmentsGroup');\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\t\r\n\t\tif (!fragmentsGroup.userData.source) {\r\n\t\t\tthrow new Error('FragmentsGroup has no source set. This should always be set in the fragment loader.');\r\n\t\t}\r\n\r\n\t\tthis.OB.theModel = fragmentsGroup;\r\n\t\t\r\n\t\tconst THREE_scene:THREE.Scene = this.OB.world!.scene.three;\r\n\t\tTHREE_scene.add(fragmentsGroup);\t// (No Culler used here.)\r\n\r\n\t\t// Necessary for ray casting to work on the loaded model (like the length tool)\r\n\t\tfor (const child of fragmentsGroup.children) {\r\n\t\t\tif (child instanceof THREE.Mesh) {\r\n\t\t\t\tthis.OB.world!.meshes.add(child);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// Call all subscribers that the model is loaded\r\n\t\tthis.OB.mgr?.onFragmentsLoaded.trigger(fragmentsGroup);\r\n\r\n\t\tthis.makeRevitIdMap(fragmentsGroup!);\r\n\r\n\t\treturn fragmentsGroup;\r\n\t}\r\n\t\r\n\tprivate loadedRevisions: Map = new Map(); //Key revision, ModelInfo\r\n\t\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\tshouldLookAtModel(): boolean { return !this.hasModelShowing(); }\r\n\r\n\tasync loadRevisionEventHandler(fileAndRevision: FileAndRevisionDto) { // triggered by event 'base-viewer-combined:loadRevision'\r\n\t\tconsole.log('loadRevision_EH',fileAndRevision);\r\n\t\tconsole.log('bound info was:', this.fileId, this.revisionId);\r\n\t\tlet fragmentGroup: FragmentsGroup | null = await this.loadModel(fileAndRevision.fileId, fileAndRevision.revisionId,'OBC.loadRevisionEventHandler');//in-loadRevision_EH\r\n\r\n\t\t//if (fragmentGroup) { this.makeRevitIdMap(fragmentGroup!); }\r\n\t\t// LoadRevision is sort of an alternative to turnOnRevision3d.\r\n\t}\r\n\r\n\tasync turnOnRevision3d(model: BimViewerFileDtoSplitView, revision: BimViewerRevisionDtoSplitView): Promise {\t\r\n\t\t// called by turnOn_3dRevision_EH.\r\n\r\n\t\tconsole.log('openbimContainer.turnOnRevision3d, retrieving/loading ifc revision.');\r\n\t\tlet fragmentModel : FragmentsGroup | null = await this.loadModel(model.id, revision.id, 'OBC.turnOnRevision3d');//turnOnRevision3d\r\n\t\tconsole.info('altUpload?', model.altUpload, revision.altUpload);\r\n\t\tlet allOK = fragmentModel != null; // If we got a model, all is OK.\t\r\n\r\n\t\tif (fragmentModel) {\r\n\t\t\tthis.rememberModelInformation(revision, fragmentModel);\r\n\t\t}\r\n\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} )\r\n\t\treturn new TurnOnRevision3dResponse(allOK, allOK);\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(earlier, GetAllObjectIdsForRevision is also used.)\r\n\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\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\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\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\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\trememberModelInformation(revision: BimViewerRevisionDtoSplitView, fragModel:FragmentsGroup): void { \r\n\t\t// is this ever called? by who? by OpenbimContainer.turnOnRevision3d\r\n\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);\t\t\r\n\t\t// fixme, do we ever REMOVE from loadedRevisions?\r\n\r\n\t\tthis.makeRevitIdMap(fragModel);\r\n\t}\r\n\t\r\n\t/* We can find a revitTag by doing\r\n\t\tfragment.fragmentsGroup.[getLocalProperties[expressId]]/objPropertySet.Tag.value\r\n\t\tBut we must do it for the proper/relevant expressIDs.\r\n\t\tSo, we need to find fragmentGroups.\r\n\r\n\t\tWe could do the work in remember_ModelInformation(),\r\n\t\tie we pass that way when we get a new fragmentsGroup model.\r\n\t\tWe should look at fragmentsGroup.objProperties.\r\n\t*/\r\n\t/* TODOs:\r\n\t- we'd (either) have to pool these for sub-models, or \r\n\tkeep them as separate sets and iterate over all of them.\r\n\t- we should remove them again, when they are toggled off.\r\n\t- we should also employ them during some selection.\r\n\t- in general, we must STORE them somewhere.\r\n\t */\r\n\tmakeRevitIdMap(group: FragmentsGroup) {\r\n\t\ttry { this.makeRevitIdMapImpl(group); } catch (e) { console.error(e); }\r\n\t}\r\n\t\r\n\tmakeRevitIdMapImpl(group: FragmentsGroup) {\r\n\t\t//let revitMap:RevitMap = this.tmpRevitMap; // a temp access so far.\r\n\t\tlet revitMap:RevitMap = this.OB.tmpRevitMap; // a temp access so far.\r\n\r\n\t\tlet allProps:IfcProperties|undefined = group.getLocalProperties();\r\n\t\tconst totalPropCount = Object.entries(allProps!).length;\r\n\t\tfor (const expressId_ in allProps) { // :number, but we are not allowed to write that.\r\n\t\t\tconst expressId:number = expressId_;\r\n\t\t\tconst entityProps = allProps[expressId];\r\n\t\t\tif (! ('Tag' in entityProps)) { continue; } \r\n\t\t\tconst revitTagValue = entityProps.Tag;\r\n\t\t\tif (revitTagValue == null) { console.log('(Tag was null)'); continue; }\r\n\t\t\tconst revitTag_:string = revitTagValue.value; // (It arrives as a string, but we 'know' it really holds a numeric value.)\r\n\t\t\tconst revitTag:number = Number(revitTag_);\r\n\t\t\tif (typeof revitTag != 'number') { console.log('tag:', revitTag, typeof revitTag); }\r\n\r\n\t\t\tif (!(revitTag in revitMap)) {\r\n\t\t\t\trevitMap[revitTag] = [expressId];\r\n\t\t\t} else { // fixme, we should either check for duplicates or use a set.\r\n\t\t\t\trevitMap[revitTag].push(expressId);\r\n\t\t\t}\r\n\t\t} // for expressIDs.\r\n\r\n this.uniqueMap(revitMap); // our method could cause duplicates, which we remove here.\r\n\r\n\t\tconsole.log('total # of expressIDs with properties:', totalPropCount);\r\n\t\tconst revitIdCount = Object.entries(revitMap).length;\r\n\t\tconsole.log('total # of revit elm IDs:', revitIdCount);\r\n\t\tconsole.log('makeRevitIdMap got us:', revitMap);\r\n\t} // makeRevitIdMap.\r\n\r\n uniqueMap(revitMap: RevitMap) {\r\n for (let revitId_ in Object.entries(revitMap)) {\r\n\t\t\tconst revitId:number = revitId_; // what is the proper way to do this..?\r\n let expressIDs = revitMap[revitId];\r\n let uqExpressIDs = Array.from(new Set(expressIDs))\r\n revitMap[revitId] = uqExpressIDs;\r\n }\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) { console.log('revision is not loaded:', revision.id); return; }\r\n\r\n\t\tlet loadedRevision:OB_RevisionInformation3d = has_loadedRevision;\r\n\t\tif (!loadedRevision.isModelShowing) { console.log('revision is not showing:', revision.id, loadedRevision.isModelShowing); return; }\r\n\t\t\r\n\t\tlet model = loadedRevision.openBim_model!;\r\n\t\tconst THREE_scene:THREE.Scene = this.OB.world!.scene.three;\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;\t\r\n\t}\r\n\r\n\tisNewestPluginRevisionActive:boolean = false;\r\n\tsetIsNewestPlugin(isNewestPlugin: boolean): void { this.isNewestPluginRevisionActive = isNewestPlugin; }\r\n\t// those were the three founding methods. The rest are fancy tools..\r\n\tasync lookAtSelectedObjects(objectListMgr: ObjectListManager): Promise {\r\n\t\tlet objectIds: ObjectIDsIF = await this.entityIdFinderService.getSelectedObjectsAsObjectIdsIF(objectListMgr, this.viewerThreeDService!);\r\n\t\tawait this.viewerThreeDService!.lookAtObjects(objectIds)\r\n\t}\r\n\tasync highlightSelectedObjects(objectListMgr : ObjectListManager): Promise {\r\n\t\tlet objectIds: ObjectIDsIF = \r\n\t\t await \r\n\t\t\tthis.entityIdFinderService.getSelectedObjectsAsObjectIdsIF(\r\n\t\t\t\tobjectListMgr, \r\n\t\t\t\tthis.viewerThreeDService!\r\n\t\t\t);\r\n\t\tawait this.viewerThreeDService!.selectObjects(objectIds);//highlightSelectedObjects\r\n\t}\r\n\tasync highlightSimilarElements(objectListMgr: ObjectListManager) {\r\n\t\t\r\n\t\tconst itemsToBeSelected = new Set();\r\n\r\n\t\tconst allTypeIds = objectListMgr.selectedItems.map(item => item.value?.typeId);\r\n\t\tlet typeIds = [...new Set(allTypeIds)];\t// Remove duplicates\r\n\t\t\r\n\t\tfor (let typeId of typeIds) {\r\n\t\t\t// Take the currently selected row and find all instances that is of that type.\r\n\t\t\t// Then select those instances.\r\n\t\t\t\r\n\t\t\tif (!typeId) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tobjectListMgr.shownItems.filter(item => item.value?.typeId === typeId)\r\n\t\t\t\t.forEach(item => itemsToBeSelected.add(item));\r\n\t\t}\r\n\r\n\t\tfor (let selectedItem of objectListMgr.selectedItems) {\t// Don't toggle any already selected items.\r\n\t\t\titemsToBeSelected.delete(selectedItem);\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\tconst objectIds = await this.entityIdFinderService.getAllSimilarInstancesAsObjectIdsIF(objectListMgr, this.viewerThreeDService!);\r\n\t\tawait this.viewerThreeDService!.selectObjects(objectIds);//highlightSimilarElements\r\n\t\t\r\n\t\tawait objectListMgr.toggleSelectedElementsOn(Array.of(...itemsToBeSelected));\r\n\t}\r\n\r\n\tasync isolateSelectedObjects(objectListMgr: ObjectListManager): Promise {\r\n\t\tlet selectedObjectIds: ObjectIDsIF = await this.entityIdFinderService.getSelectedObjectsAsObjectIdsIF(objectListMgr, this.viewerThreeDService!);\r\n\t\tawait this.viewerThreeDService!.transluteOthers(selectedObjectIds);\r\n\t}\r\n\r\n\tasync hideSelectedObjects(objectListMgr: ObjectListManager) {\r\n\t\tlet selectedObjectIds: ObjectIDsIF = await this.entityIdFinderService.getSelectedObjectsAsObjectIdsIF(objectListMgr, this.viewerThreeDService!);\r\n\t\tconsole.log('openbim-container.hideSelectedObjects, selectedObjectIds:', selectedObjectIds);\r\n\t\tawait this.viewerThreeDService!.hideObjects( selectedObjectIds); \r\n\t}\r\n\r\n\tasync hideAllOtherObjects(objectListMgr: ObjectListManager) {\r\n\t\tlet selectedObjectIds: ObjectIDsIF = await this.entityIdFinderService.getSelectedObjectsAsObjectIdsIF(objectListMgr, this.viewerThreeDService!);\r\n\t\tawait this.viewerThreeDService!.hideOthers(selectedObjectIds);\r\n\t}\r\n\r\n\r\n\t\r\n\tresetColors(): void {\r\n\t\tthis.viewerThreeDService?.resetColorInstances();\r\n\t}\r\n\t\r\n\tcolorInstances(colorData: InstanceColorDataCollection): void {\r\n\t\tthis.viewerThreeDService?.colorInstances(colorData);\r\n\t}\r\n\t\r\n\tasync cropModel(direction: string[]): Promise {\r\n\t\tconsole.log('OBC.cropModel, empty placeholder.');\r\n\t}\r\n\r\n\tremoveRevisionIdListFromLoadedRevisions(revisions: string[]): void {}\r\n\tsetupViewerBindings(): void {}\r\n\t// END bim-viewer-three-d INTERFACE.\r\n\r\n\tasync turnOn3dRevisionEventHandler(parameter: BimViewerModelAndRevision) {\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) { return; }\r\n\r\n\t\tif (parameter.isNewestPluginRevision) { this.setIsNewestPlugin(parameter.isNewestPluginRevision); } // 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', {model: parameter.model, revisionId: parameter.revision.id} )\r\n\t\t} else {\r\n\t\t\tconsole.log('IF, firing RevisionTurnedOn');\r\n\t\t\tthis.aggr.publish('Revision:RevisionTurnedOn', {model: parameter.model, revision: parameter.revision, is2d: false});\r\n\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\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\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) { this.setIsNewestPlugin(!parameter.isNewestPluginRevision); }\r\n\t\tthis.aggr.publish('Revision:RevisionTurnedOff', {model: parameter.model, revision: parameter.revision, is2d: false}); \r\n\t}\r\n\r\n\tstatic nrOfTimesSubscribed:number = 0;\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', ++OpenbimContainer.nrOfTimesSubscribed);\r\n\t\tif (OpenbimContainer.nrOfTimesSubscribed>1) {\r\n\t\t\tconsole.error('\\n WRONG WRONG, too many subscriptions!', OpenbimContainer.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\twe 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\r\n\t\tSUMMARY: \r\n\t\t(1) (mouse-)selection-mode/selection-model.\r\n\t\t(2) elements/items\r\n\t\tMy hunch is to start with mouse (1) to easier learn about (2).\r\n\t\t*/\r\n\r\n\t\t// \t\tself.events.publish('base-viewer-combined:loadRevision',{fileAndRevisionId: fileAndRevisionId});\r\n\r\n\t\tlet self = this;\r\n\t\tthis.subscriptions = [\r\n\t\tthis.aggr.subscribe('base-viewer-combined:loadRevision', async (fileAndRevision: FileAndRevisionDto) => self.loadRevisionEventHandler(fileAndRevision) ),\r\n\r\n\t\tthis.aggr.subscribe('3dViewer:ChangeTool', async (tool: ToolEnum) => {await this.viewerThreeDService?.changeSelectedTool(tool)}),\r\n\t\tthis.aggr.subscribe('3dViewer:crop', async (direction: string[]) => {await self.cropModel(direction)}),\r\n\r\n\t\tthis.aggr.subscribe('3dViewer:focus-selected-items', async (objectListMgr: ObjectListManager) => { await self.lookAtSelectedObjects(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:HideAll', () => { if (self.loadedRevisions) { self.viewerThreeDService?.hideAllObjects(); } }),\r\n\t\tthis.aggr.subscribe('3dViewer:highlight-selected-items', async (objectListMgr: ObjectListManager) => { await self.highlightSelectedObjects(objectListMgr);}),//'3dViewer:highlight-selected-items'\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-selected-items', async (objectListMgr: ObjectListManager) => { await self.hideSelectedObjects(objectListMgr);}),\r\n\t\tthis.aggr.subscribe('3dViewer:removeRevisions', (revisionIds: string[]) => {self.removeRevisionIdListFromLoadedRevisions(revisionIds)}),\r\n\r\n\t\tthis.aggr.subscribe('3dViewer:select-all-instances', async (objectListMgr: ObjectListManager) => {await self.highlightSimilarElements(objectListMgr)}),\r\n\t\r\n\t\tthis.aggr.subscribe('3dViewer:color-instances', (instanceColorDataCollection: InstanceColorDataCollection) => { self.colorInstances(instanceColorDataCollection)}),\r\n\t\tthis.aggr.subscribe('3dViewer:reset-colors', async () => { this.resetColors()}),\r\n\t\tthis.aggr.subscribe('3dViewer:show-color-group', \t\tasync (groupName: string) => await self.viewerThreeDService?.showColorGroup(groupName) ),\r\n\t\tthis.aggr.subscribe('3dViewer:translute-color-group', \tasync (groupName: string) => await self.viewerThreeDService?.transluteColorGroup(groupName) ),\r\n\t\tthis.aggr.subscribe('3dViewer:hide-color-group', \t\tasync (groupName: string) => await self.viewerThreeDService?.hideColorGroup(groupName) ),\r\n\r\n\t\tthis.aggr.subscribe('3dViewer:ShowAll', () => { if (self.loadedRevisions) { self.viewerThreeDService?.showAllObjects(); } }),\r\n\t\tthis.aggr.subscribe('3dViewer:ShowSpaces', (shouldShowSpaces: boolean) => { self.viewerThreeDService?.handleSpaces(shouldShowSpaces);}),\r\n\t\tthis.aggr.subscribe('3dViewer:TransluteAll', () => { if (self.loadedRevisions) { self.viewerThreeDService?.transluteAllObjects(); } }),\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); }),\r\n\t\tthis.aggr.subscribe('3dViewer:TurnOn3dRevision', async (parameter: BimViewerModelAndRevision) => { await self.turnOn3dRevisionEventHandler(parameter); }),\r\n\t\r\n\t\tthis.aggr.subscribe('viewer:enable-bindings-and-options', () => { self.setupViewerBindings(); }), //Ensuring viewers are setup before bindings are handled.\r\n\t\tthis.aggr.subscribe('viewer:hide', async (objectIds: ObjectIDsIF) => { await this.viewerThreeDService?.hideObjects(objectIds); }),\r\n\t\tthis.aggr.subscribe('viewer:hideOthers', async (objectIds: ObjectIDsIF) => { await this.viewerThreeDService?.hideOthers(objectIds); }),\r\n\t\tthis.aggr.subscribe('viewer:highlight', async (objectIds: ObjectIDsIF) => { await this.viewerThreeDService?.selectObjects(objectIds);/*'viewer:highlight'*/ }),\r\n\t\tthis.aggr.subscribe('viewer:isolate', async (objectIds: ObjectIDsIF) => { await this.viewerThreeDService?.transluteOthers(objectIds); }),\r\n\t\tthis.aggr.subscribe('viewer:lookAt', async (objectIds: ObjectIDsIF) => { await this.viewerThreeDService?.lookAtObjects(objectIds); }),\r\n\t\tthis.aggr.subscribe('viewer:translucent', async (objectIds: ObjectIDsIF) => { await this.viewerThreeDService?.transluteObjects(objectIds); }),\r\n\t\t\t\r\n\t\tthis.aggr.subscribe('debug:useFragments', async (useFragmentsDto:UseFragmentsDto) => {\r\n\t\t\tconsole.log('receive debug:useFragments, useFrags?', useFragmentsDto.useFragments,'reload?', useFragmentsDto.reload);\r\n\t\t\t// vi har et problem - OBC kan ikke se viewerMenu.useFragments, til at initialisere useMessagePack.\r\n\t\t\tself.useMessagePack = useFragmentsDto.useFragments;\r\n\t\t\tif (useFragmentsDto.reload) {\r\n\t\t\t\t//self.OB.comp?.scene.get().clear();\r\n\t\t\t\tArray.of(...self.OB.mgr?.groups.values()!).forEach(value => self.OB.mgr?.disposeGroup(value));\r\n\t\t\t\tself.OB.mgr?.dispose();\r\n\t\t\t\tawait self.loadModel(self.fileId, self.revisionId!, 'useFragments-event');//-in-'debug:useFragments'.\r\n\t\t\t}\r\n\t\t})\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--OpenbimContainer.nrOfTimesSubscribed;\r\n\t\tthis.subscriptions.forEach((subscription: Subscription) => subscription.dispose());\r\n\t\tthis.OB.comp?.dispose();\r\n\t}\r\n\t\r\n}//end-class-openbimContainer.\r\n\r\n\r\nexport interface RevisionMediaStatus {\r\n\tifcUrl: string;\r\n\tfragmentUrl: string;\r\n\thasIfc: boolean;\r\n\thasFragment: boolean;\r\n}\r\n\r\nexport interface UseFragmentsDto {\r\n\tuseFragments: boolean;\r\n\treload: boolean;\r\n}\r\n\r\n\r\nexport interface RevitMap {\r\n\t[revitTag: number]: number[]\r\n}\r\n\r\nexport interface ObjectIDsIF {\r\n\tobjectIds: number[];\r\n\trevitObjectIds: number[];\r\n}\r\n\r\nexport interface FragmentResult {\r\n\tfragmentsGroup: FragmentsGroup;\r\n\tsource: FragmentSource;\r\n}\r\n\r\nexport enum FragmentSource {\r\n\tUnknown = 'Unknown',\r\n\tIFC = 'IFC',\r\n\tMPK = 'MPK'\r\n}\r\n","//import { FragmentIdMap } from './openbim-highlighter';\r\n// openbim-highlighter\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\nimport {Fragment, IfcProperties, FragmentsGroup, FragmentIdMap} from '@thatopen/fragments';\r\n\r\n\r\nimport {OpenBimHandles} from \"./OpenBimHandles\";\r\n\r\nimport { EventAggregator } from 'aurelia-event-aggregator';\r\nimport { ModeTool } from \"./Tools/ModeTool\";\r\nimport { PivotGridComponent } from \"app/components/pivot-grid-component/pivot-grid-component\";\r\nimport {Highlighter} from \"@thatopen/components-front\";\r\nimport {Components} from \"@thatopen/components\";\r\n\r\n\r\nexport type HighlightResult = {\r\n\tid: string; // JG: Hmm, WHAT is this an ID for? The 3d-elm-instance? IfcId?\r\n\tfragments: Fragment[];\r\n} | null;\r\n\r\nexport interface ObjPropertySet {\r\n\t[attribute: string]: any;\r\n}\r\n\r\nexport const selectionHighlightName = 'selection';\r\nexport const hoverName = 'hover';\r\n\r\nexport function openbim_highlightOnIDs(\r\n\thighlighter:OBCF.Highlighter, \r\n\tnumIDsToSelect:FragmentIdMap, //idsToSelect_:OBC.FragmentIdMap\r\n) {\r\n\tif (Object.keys(numIDsToSelect).length == 0) { // aah javascript, hvorfor skal du sutte saa meget.\r\n\t\tconsole.warn('openbim_highlightOnIDs - as we need to highlight ZERO items, we deselect and bail out.');\r\n\t\thighlighter.clear(selectionHighlightName);\r\n\t\treturn;\r\n\t}\r\n\r\n\thighlighter.highlightByID(selectionHighlightName, numIDsToSelect);\r\n\r\n\t// Hmm, FragmentIdMap is this..:\r\n\t/**\r\n\t A list of IDs indexed by the fragments where they exist. As an item can be\r\n\t made of multiple fragments, there might be repeated IDs across entries.\r\n\t \r\n\texport interface FragmentMap {\r\n\t\t[fragmentID: string]: Set;\r\n\t}\r\n\texport interface FragmentIdMap {\r\n\t\t[fragmentID: string]: Set;\r\n\t}\r\n\t \r\n\t */\r\n}\r\n\r\n/*\r\nfunction map2IDMap(numIDsToSelect: FragmentMap):OBC.FragmentIdMap {\r\n\tlet o:OBC.FragmentIdMap = {};\r\n\tfor (const fragmentId in numIDsToSelect) {\r\n\t\tconst numbers:Set = numIDsToSelect[fragmentId];\r\n\t\tconst strings:Set = new Set(Array.from(numbers, n => ''+n));\r\n\t\to[fragmentId] = strings;\r\n\t}\r\n\treturn o;\r\n}\r\n*/\r\n\r\nexport function collectIDsFromMap(selMap: FragmentIdMap):number[] {\r\n\t// returns the unique set of expressIDs that the fragmentIdMap has references to.\r\n\tconsole.log('realSel:', selMap);\r\n\r\n\tlet os = new Set();\r\n\r\n\tfor (const fragmentId in selMap) {\r\n\t\tconst expressIDs_for_Fragment:Set = selMap[fragmentId];\r\n\t\tfor (const expressId of expressIDs_for_Fragment) {\r\n\t\t\tconst expressId_asNumber:number = Number(expressId);\r\n\t\t if (os.has(expressId_asNumber)) {\r\n\t\t\t\t// (do nothing, because we already have it.)\r\n\t\t\t} else { // (only log and add, IF we haven't seen it before.)\r\n\t\t\t\tconsole.log('frag:', fragmentId, 'expressIDs:', expressIDs_for_Fragment);\r\n\t\t\t\tconsole.log('expressId:', expressId);\r\n\t\t\t\tos.add( expressId_asNumber );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tconst asNumbers:number[] = Array.from(os);\r\n\treturn asNumbers;\r\n}\r\n\r\nexport interface Our_OB_ColorsIF {\r\n\thover: string | undefined;\r\n\tbackground:string, selection:string, outline:string;\r\n\toutline_w:number;\r\n}\r\n\r\nconst Old_OB_Colors:Our_OB_ColorsIF = {\r\n\tbackground: 'blue',\r\n\tselection: '#FF80FF', //'pink',\r\n\thover: undefined,\r\n\toutline: 'lime', \r\n\toutline_w:0.3\r\n}\r\n\r\nexport const TH_OB_Colors:Our_OB_ColorsIF = {\r\n\tbackground: '#c0d0e8', //'#edf6ff',\r\n\tselection: '#198754', //'#63AC93', // '#198754', //FF80FF', //'pink',\r\n\toutline: '#198754', //'#63AC93', \r\n\thover:\t \t'lime',\r\n\toutline_w:0.3\r\n}\r\n\r\n\r\nfunction rnd():number { return Math.floor( Math.random()*255 ); }\r\nfunction rndCol():string {\r\n\tlet r = rnd(), g=rnd(), b=rnd();\r\n\treturn `rgb(${r},${g},${b})`;\r\n}\r\nfunction randomCols() {\r\n\tOld_OB_Colors.background = rndCol();\r\n\tOld_OB_Colors.selection = rndCol();\r\n\tOld_OB_Colors.outline = rndCol();\r\n}\r\n\r\nexport class CollabHighlightInitiator {\r\n\tpublic static initHighlighter(\r\n\t\tcomp: Components,\r\n\t\tOB: OpenBimHandles, // we may need to turn it into an interface, to avoid circular dep? we just need a way to pass it an event-sender thing.\r\n\t\tturnOnHoverHighlight: boolean) : Highlighter\r\n\t{\r\n\t\t/* JG: This is a 'higher level' approach, which works OBC fragment entities instead. \r\n\t\tThat is, it has some..? OBC/IFC knowledge - as I understand it.\r\n\t\tIn their stomach/insides, the OBC fragments presumably still hold basic THREE entities. */\r\n\t\r\n\t\t// LIGHTS\r\n\t\r\n\t\t// https://docs.thatopen.com/Tutorials/FragmentHighlighter\r\n\t\tconst highlighter = comp.get(OBCF.Highlighter);//, fragments);\r\n\t\thighlighter.setup({\r\n\t\t\tselectName: selectionHighlightName,\t\r\n\t\t\thoverName: hoverName,\r\n\t\t\tworld: comp.get(OBC.Worlds).list.values().next().value,\r\n\t\t\t//hoverColor: turnOnHoverHighlight ? new THREE.Color(TH_OB_Colors.hover) : undefined,\r\n\t\t\tautoHighlightOnClick: true,\r\n\t\t});\r\n\t\t\r\n\t\t// Seems FragmentHighlighter refuses to work with SimpleRenderer:\r\n\t\t//const realRenderer:OBC.SimpleRenderer = comp.renderer;\r\n\t\t//const realRenderer:OBCF.PostproductionRenderer = comp.renderer;\r\n\t\t\r\n\t\t// Error: Custom effects not initialized!\r\n\t\t//console.log('highlighter, do you have outlineEnabled?', highlighter);\r\n\t\t\r\n\t\t// if (realRenderer.postproduction.enabled) {\r\n\t\t// \trealRenderer.postproduction.customEffects.outlineEnabled = true; // (otherwise highlighter.outlineEnabled gives error: \"Custom effects not initialized!\" \r\n\t\t// \thighlighter.outlineEnabled = true; // hvis vi saetter FALSE her, faar vi ikke en fejl, men intet visuelt feedback.\r\n\t\t// } else {\r\n\t\t// \t/* We don't have do do anything actively in CollabHighlightInitiator to respect openbimFlag_EG_OutlineEnabled, \r\n \t\t// \t because it happens automatically by realRenderer.postproduction being DISABLED.\r\n\t\t// \t*/\r\n\t\t// \t//!openbimFlag_EG_OutlineEnabled();\r\n\t\t// \t//highlighter.outlineEnabled = false;\r\n\t\t// }\r\n\t\t// highlighter.fillEnabled = true; // har sgu ingen effekt.\r\n\t\r\n\t\t//randomCols(); // Our_OB_Colors\r\n\t\t\r\n\t\t// AEP: Why do we do this here? Shouldn't this be when creating the scene in the first place?\r\n\t\t// I moved this to when we create the scene\r\n\t\t//const THREE_scene:THREE.Scene = comp.scene.get();\r\n\t\t//THREE_scene.background = new THREE.Color(TH_OB_Colors.background); //'blue');\r\n\t\t\r\n\t\t//const hiliteMaterialName:string = 'default1';\r\n\t\t//highlighter.add(selectionHighlightName, new THREE.Color(TH_OB_Colors.selection)); // configure a named styling.\r\n\t\t\r\n\t\t// let outline = highlighter.outlineMaterial;\r\n\t\t// outline.color.set(TH_OB_Colors.outline) ; // 'cyan'); \r\n\t\t// outline.opacity = TH_OB_Colors.outline_w; // 0.15; //21; //9;\r\n\t\t\r\n\t\t//outline.wireframeLinewidth = 12; //4; // these have no effect?\r\n\t\t//outline.wireframe = false; //true;\r\n\t\r\n\t\t//console.log('highlighter.outlineMaterial:',highlighter.outlineMaterial);\r\n\t\r\n\t\t// must happen just after fragmentLoader.load\r\n\t\t//highlighter.update(); // set i tutorial\r\n\t\r\n\t\t// (related to Error: Postproduction renderer is needed for outlines!)\r\n\t\t// (end of postproduction-styling crap.)\r\n\t\r\n\t\t// (app-dev, what did I mean with that?)\r\n\t\t//highlighter.update(); // JG: In earlier incarnation, app-dev would interact with this.. what did it do/when does it apply?\r\n\t\r\n\t\r\n\t\t// This needs to be moved out into the object selection tool.\r\n\t\t// Other than duration, we might look at how far the mouse has moved. For SELECTION, the mouse should not move much!\r\n\t\t//let mouseDownTime:number = 0;\r\n\t\t//container.addEventListener('mousedown', async (event:MouseEvent) => { mouseDownTime = event.timeStamp; } );\r\n\t\t//container.addEventListener( 'mouseup', async (event:MouseEvent) => highlightOnClick(event, event.timeStamp-mouseDownTime, highlighter, OB, aggr));\r\n\t\t//container.addEventListener('click', async (event:MouseEvent) => highlightOnClick(event));\r\n\t\t\r\n\t\treturn highlighter;\r\n\t} //initHighlighter\r\n}\r\n","import * 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\nimport {FragmentsGroup} from '@thatopen/fragments'; \r\nimport {IUniform, Scene} from \"three\";\r\nimport Stats from \"stats.js\";\r\n\r\nimport * as environment from '../../../../config/environment.json';\r\nimport {BaseScene, Components, SimpleGrid, World} from \"@thatopen/components\";\r\nimport {TH_OB_Colors} from \"./openbim-highlighter\";\r\n\r\n//type UniformsMapType = { [uniform: string]: IUniform };\r\ninterface ShaderMat_UniformsMap { [uniform: string]: IUniform }\r\n\r\nlet ix=0;\r\n\r\nfunction fixFPS(stats:Stats) {\r\n\tlet found=false;\r\n\tfor (const c of document.body.children) {\r\n\t\tif (c == stats.dom) { found=true;break;}\r\n\t}\r\n\tif (!found) {\r\n\t\tdocument.body.append(stats.dom);\r\n\t\tconsole.log('readding stats.', ++ix);\r\n\t}\r\n\t//const body = document.body;\r\n\t//const children = body.children;\r\n\t//const len = children.length;\r\n}\r\nfunction fixIt(stats:Stats) {\r\n\t//stats.dom.style.background = 'red';\r\n\t//stats.dom.innerHTML = 'BOB';\r\n\tconst elm1:HTMLCanvasElement = stats.dom.children[0];\r\n\telm1.style.display = 'inline-block';\r\n\tconst elm2:HTMLCanvasElement = stats.dom.children[1];\r\n\telm2.style.display = 'inline-block';\r\n}\r\nfunction addFPSCounter(world: World) {\r\n\t// https://github.com/IFCjs/components/blob/main/src/core/SimpleScene/index.html\r\n\tconst stats = new Stats();\r\n\tstats.showPanel(2);\r\n\tdocument.body.append(stats.dom);\r\n\tstats.dom.style.left = '0px';\r\n\tconsole.log('we added fps!');\r\n\tfixIt(stats);\r\n\r\n\tconst renderer2 = world.renderer;\r\n\trenderer2.onBeforeUpdate.add(() => stats.begin());\r\n\trenderer2.onAfterUpdate.add(() => {\r\n\t\tstats.end();\r\n\t\t//fixIt(stats);\r\n\t});\t\r\n}\r\n\r\nlet ofCourseTrue:boolean = true;\r\n\r\nexport async function initPrimaryWorld(comp: Components, container: HTMLElement, showFpsCounter: boolean = false) : Promise {\r\n\tconst worlds: OBC.Worlds = comp.get(OBC.Worlds);\r\n\r\n\t// onBeforeUpdate on renderer?\r\n\r\n\tconst OBC_scene1 = new OBC.SimpleScene(comp);\r\n\r\n\tconst world: OBC.World = worlds.create();\r\n\r\n\tworld.scene = OBC_scene1; // 1\r\n\r\n\tlet postProductionRenderer: OBCF.PostproductionRenderer | undefined;\r\n\tif (!ofCourseTrue) { //fancyExtras) { // NB - not an option when we want selection/hover.\r\n\t\tworld.renderer = new OBC.SimpleRenderer(comp, container, {logarithmicDepthBuffer: true}); // 2 \r\n\t} else {\r\n\t\tpostProductionRenderer = new OBCF.PostproductionRenderer(comp, container, {logarithmicDepthBuffer: true}); // 2 \r\n\t\tworld.renderer = postProductionRenderer;\r\n\t}\r\n\r\n\tworld.camera = new OBC.SimpleCamera(comp); // 3\r\n\tnew OBC.SimpleRaycaster(comp, world); // 4\r\n\t\r\n\tcomp.init();\r\n\r\n\tconst THREE_scene: THREE.Scene = world.scene.three;\r\n\r\n\tTHREE_scene.background = new THREE.Color(TH_OB_Colors.background); //'blue');\r\n\r\n\tconst diagnostic: boolean = (environment.testing || environment.debug);\r\n\tif (diagnostic) {\r\n\t\tawait activateQOL_Grid(comp, world);\r\n\t} // seems to 'cost' about 10-FPS.\r\n\r\n\r\n\t//if (ofCourseTrue || fancyExtras) { addMyOwnLights(THREE_scene); } // not needed because of scene.setup() \r\n\r\n\tOBC_scene1.setup(); //comp.scene.setup(); // would add default lights. \r\n\r\n\tif (showFpsCounter) {\r\n\t\taddFPSCounter(world);\r\n\t}\r\n\t\r\n\treturn world;\r\n}\r\n\r\nexport async function init_OpenBimComponents(container:HTMLElement, fancyExtras:boolean, FPS_Counter:boolean):Promise {\r\n\t// view-source:https://ifcjs.github.io/components/src/ui/UIManager/index.html\r\n //const container = document.getElementById('container')!; // Get the
element where the scene will be displayed\r\n\tconsole.log('OBC init run, container:', container);\r\n\tconst comp: OBC.Components = new OBC.Components(); // Initialize the basic components needed to use this library\r\n\treturn comp;\r\n}\r\n\r\nasync function activateQOL_Grid(comp: Components, world: World) {\r\n\tconst grids = comp.get(OBC.Grids);\r\n\tconst simpleGrid = grids.create(world);\r\n\r\n\ttryToExamineGrid_Issues(simpleGrid);\r\n //addRedDemoBox(world, comp, 0.5);\r\n}\r\n\r\nfunction tryToExamineGrid_Issues(grid: OBC.SimpleGrid) {\r\n\tconst mat:THREE.ShaderMaterial = grid.material;\r\n\tconst sm_uniforms:ShaderMat_UniformsMap = mat.uniforms;\r\n\tconsole.log('sm_uniforms:', sm_uniforms);\r\n\tif (sm_uniforms == undefined) {\r\n\t\tconsole.warn('initializing uniforms map on SimpleGrids THREE.ShaderMaterial because it is empty');\r\n\t\tmat.uniforms = {};\r\n\t}\r\n\t// we might use SimpleCamera.OnBeforeUpdate to inspect what is happening with the grid material?\r\n}\r\n\r\n\r\nexport function addRedDemoBox(world: World, comp: Components, size:number) { // Cube\r\n\tconst boxGeom = new THREE.BoxGeometry(size,size,size); //0.5,0.5,0.5); // Add some elements to the scene\r\n\tconst boxMat = new THREE.MeshStandardMaterial({ color: \"red\" });\r\n\tconst boxMesh = new THREE.Mesh(boxGeom, boxMat);\r\n\tboxMesh.position.set(0, 0, 0);\r\n\tworld.scene.three.add(boxMesh); \r\n\t// JG: Jeg fjerner den ene, fordi jeg tror ikke vi behoever den.\r\n\t//comp.meshes.push(boxMesh); // hvorfor er det nu, at det er en god ide at adde begge steder? \t\t\r\n}\r\n\r\nfunction addMyOwnLights(scene:THREE.Scene) { \r\n\tconsole.log('addMyOwnLights');\r\n\tconst light1 = new THREE.DirectionalLight('lightblue');\r\n\tlight1.position.set(5, 10, 3);\r\n\tlight1.intensity = 0.35;\r\n\tscene.add(light1);\r\n\tconst light2 = new THREE.AmbientLight('lightyellow');\r\n\tlight2.intensity = 0.75;\r\n\tscene.add(light2); \r\n}\r\n\r\n\r\n///////////////////////////////////////////////////////////////////////////////////\r\n\r\nexport async function add_a_default_fragment_on_startup(frag_url:string, components:OBC.Components,mgr:OBC.FragmentsManager):Promise {\r\n\tconsole.log('inside add_a_default_fragment_on_startup');\r\n\tconst file = await fetch(frag_url); // 400k. // NO STATIC/leave out the static prefix!\r\n\tconst arrayBuffer = await file.arrayBuffer(); // returns type ArrayBuffer\r\n\tconst FRAGMENT_buffer = new Uint8Array(arrayBuffer); // convert ArrayBuffer to UI8A.\r\n \r\n\tconst model:FragmentsGroup = mgr.load(FRAGMENT_buffer); // is really fragmentsGroup.\r\n \r\n\t// view-source:https://ifcjs.github.io/components/src/fragments/FragmentManager/index.html\r\n\t// Hmm, would the fragmentsManager.load above here actually display 3d model directly,\r\n\t// if we did not have the culler?\r\n\t\r\n\t// modelThroughCuller(components, model);\r\n\tconsole.log('add_a_default_fragment_on_startup, model:', model);\r\n\treturn model;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////////\r\n\r\nlet toolbar = undefined;\r\n\r\nexport async function makeIfcLoader(comp: OBC.Components): Promise {\r\n\tconsole.log('init - makeIfcLoader, including fragmentIfcLoader.setup; this ought to trigger .wasm load.');\r\n\tlet fragmentIfcLoader = comp.get(OBC.IfcLoader);\r\n\tawait fragmentIfcLoader.setup();\t// Sets the options automatically // in makeIfcLoader.\r\n\t// fragmentIfcLoader.settings.wasm = { path: \"https://unpkg.com/web-ifc@0.0.46/\", absolute: true };\r\n\r\n\t// fragmentIfcLoader.settings.wasm = { path: \"./node_modules/web-ifc/\", absolute: true }; \r\n\t// https://unpkg.com/web-ifc@0.0.55/web-ifc.wasm is where it currently loads it from.\r\n /*\r\n\tc:\\dev\\aoc\\AO.Client\\ClientApp>grep web-ifc package.json\r\n \"web-ifc\": \"^0.0.55\",\r\n\t */\r\n\treturn fragmentIfcLoader;\r\n}\r\n\r\n// export function init_IfcLoader_Toolbars(comp:OBC.Components, mgr:OBC.FragmentsManager, fragmentIfcLoader:OBC.IfcLoader):OBC.Toolbar {\r\n// // noget gaar galt med disse toolbars,\r\n// // maaske er de der hvor revisions-UI vises?\r\n//\r\n// // https://top-docs.vercel.app/docs/Tutorials/FragmentIfcLoader\r\n// //let fragmentIfcLoader = new OBC.FragmentIfcLoader(comp);\r\n// //\r\n// toolbar = new OBC.Toolbar(comp); //const \r\n// comp.ui.addToolbar(toolbar);\r\n// // \r\n// const loadIfc_button:OBC.SimpleUIComponent = fragmentIfcLoader.uiElement.get(\"main\"); // (the 'primary' action of a tool is presumably named main)\r\n// const loaderButton:OBC.Button = loadIfc_button;\r\n// // why is there this mismatch between button and button?\r\n// toolbar.addChild(loaderButton); //loadIfc_button); // what does it mean when we accept ...Button[] ?\r\n// console.log('added fragmentIfcLoader-button to mainToolbar, tb is:', toolbar);\r\n//\r\n// toolbar.addChild(mgr.uiElement.get(\"main\"));\r\n// return toolbar;\r\n// }\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n","import {autoinject} from \"aurelia-framework\";\r\nimport { AppContextService } from \"app/services/app-context-service\";\r\nimport { OpenBimHandles } from \"./OpenBimHandles\"; //import {EventAggregator} from \"aurelia-event-aggregator\";\r\n\r\n@autoinject\r\nexport class OpenbimTestbed { \r\n /*\r\n NB! OpenbimTestbed is just a vehicle for ,\r\n ie a container to host an element.\r\n That is, it provisions/provides the element\r\n with its necessary inputs \r\n (project-id and file-id bindings,\r\n AND its openBimHandles instance!)\r\n */\r\n public openBimHandles:OpenBimHandles = new OpenBimHandles();\r\n public projectIdForMRP : string = 'no-prj-yet'; // arggh, binds to this!\r\n public orgIdForOB:string = 'obtb-no-orgId-yet';\r\n fileId_forBind:string|undefined = undefined; //'obtb-has-no-fileId';\r\n revisionId_forBind:string|undefined = undefined; //'obtb-has-no-revId';\r\n constructor(private appContext: AppContextService ) {} // private aggr: EventAggregator, \r\n activate(params:any) {\r\n\ttry {\r\n\t\tconsole.log('OpenbimTestbed.activate sets projectId to ', params.projectId);\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\tthis.orgIdForOB = 'OBTB-gotNoOrgId_From_Prj';\r\n\t\t} else {\r\n\t\t\tthis.orgIdForOB = prj.ownerCompanyId; //orgId\r\n\t\t}\r\n\t} catch {\r\n\t\tconsole.log('wtf');\r\n\t} \r\n } // called first.\r\n async attached() { console.log('OpenbimTestbed attached is called.'); } // called second.\r\n} //end-class-OpenbimTestbed.\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","OpenbimContainer","constructor","aggr","entityIdFinderService","api","ctx","dlg","OB","projectId","orgId2","fileId","revisionId","undefined","useMessagePack","BaseViewerCombined","useMPKFragments_Master","projectIdForMRP","viewerThreeDService","modeToolHandler","subscriptions","turnOnHoverHighlight","loadedRevisions","Map","isNewestPluginRevisionActive","console","log","this","fragmentLoader","factory_FragmentLoader","revisionIdChanged","n","o","loadModel","activate","params","warn","attached","setupSubscriptions","container","document","getElementById","comp","world","highlighter","initHighlighter","threeSel","mgr","get","loader","mpkLoader","setupTools","draggable","objectSelectionTool","Error","setupToolEventsWithoutAurelia","openBimViewerThreeDService","openbimViewerThreeDService","who","fragmentsGroup","getFragmentForRevision","userData","source","theModel","scene","three","add","child","children","meshes","onFragmentsLoaded","trigger","makeRevitIdMap","hasModelShowing","Array","from","values","find","r","isModelShowing","shouldLookAtModel","loadRevisionEventHandler","fileAndRevision","turnOnRevision3d","model","revision","fragmentModel","info","altUpload","allOK","rememberModelInformation","publish","fragModel","revisionInfo3d","openBim_model","set","group","makeRevitIdMapImpl","e","error","revitMap","tmpRevitMap","allProps","getLocalProperties","totalPropCount","Object","entries","length","expressId_","expressId","entityProps","revitTagValue","Tag","revitTag_","value","revitTag","Number","uniqueMap","revitIdCount","revitId_","revitId","expressIDs","uqExpressIDs","Set","turnOffRevision3d","has_loadedRevision","loadedRevision","remove","setIsNewestPlugin","isNewestPlugin","lookAtSelectedObjects","objectListMgr","objectIds","getSelectedObjectsAsObjectIdsIF","lookAtObjects","highlightSelectedObjects","selectObjects","highlightSimilarElements","itemsToBeSelected","allTypeIds","selectedItems","map","item","typeId","typeIds","shownItems","filter","forEach","selectedItem","delete","getAllSimilarInstancesAsObjectIdsIF","toggleSelectedElementsOn","of","isolateSelectedObjects","selectedObjectIds","transluteOthers","hideSelectedObjects","hideObjects","hideAllOtherObjects","hideOthers","resetColors","resetColorInstances","colorInstances","colorData","cropModel","direction","removeRevisionIdListFromLoadedRevisions","revisions","setupViewerBindings","turnOn3dRevisionEventHandler","parameter","success","isNewestPluginRevision","objectsIdNotDoneLoading","is2d","turnOff_Multiple","turnOff_3dRevision","nrOfTimesSubscribed","self","subscribe","async","tool","changeSelectedTool","hideAllObjects","revisionIds","instanceColorDataCollection","groupName","showColorGroup","transluteColorGroup","hideColorGroup","showAllObjects","shouldShowSpaces","handleSpaces","transluteAllObjects","transluteObjects","useFragmentsDto","useFragments","reload","groups","disposeGroup","dispose","unbind","subscription","FragmentSource","bindable","autoinject","EventAggregator","DialogService","selectionHighlightName","hoverName","openbim_highlightOnIDs","numIDsToSelect","keys","clear","highlightByID","collectIDsFromMap","selMap","os","fragmentId","expressIDs_for_Fragment","expressId_asNumber","has","TH_OB_Colors","background","selection","outline","hover","outline_w","CollabHighlightInitiator","setup","selectName","list","next","autoHighlightOnClick","ofCourseTrue","initPrimaryWorld","showFpsCounter","worlds","OBC_scene1","create","postProductionRenderer","logarithmicDepthBuffer","renderer","camera","init","grid","mat","material","sm_uniforms","uniforms","tryToExamineGrid_Issues","activateQOL_Grid","stats","showPanel","body","append","dom","style","left","display","fixIt","renderer2","onBeforeUpdate","begin","onAfterUpdate","end","addFPSCounter","init_OpenBimComponents","fancyExtras","FPS_Counter","addRedDemoBox","size","boxGeom","boxMat","color","boxMesh","position","add_a_default_fragment_on_startup","frag_url","components","file","fetch","arrayBuffer","FRAGMENT_buffer","Uint8Array","load","makeIfcLoader","fragmentIfcLoader","OpenbimTestbed","appContext","openBimHandles","orgIdForOB","fileId_forBind","revisionId_forBind","setProject","prj","getSelectedProject","ownerCompanyId","projects"],"sourceRoot":""}