{"version":3,"file":"app-0fa77864.c6823aa147ec4303.bundle.js","mappings":"2NASO,MAAMA,UAAuB,KAkBnC,WAAAC,CAAYC,GACXC,MAAMD,GAhBG,KAAAE,SAAmB,EAOZ,KAAAC,+BAAsE,IAAIC,IAInF,KAAAC,oBAA8B,EAMrCL,EAAWM,IAAIR,EAAeS,KAAMC,MAEpCA,KAAKC,WAAaT,EAAWU,IAAI,MACjCF,KAAKG,cAAgBX,EAAWU,IAAI,MAEpCF,KAAKI,oBAAsBJ,KAAKK,4BAEhCL,KAAKM,2BAA6Bd,EAAWU,IAAI,KACjDF,KAAKO,uBAAyBf,EAAWU,IAAI,MAE7CF,KAAKQ,cAAgBhB,EAAWU,IAAI,KAEpCF,KAAKR,WAAWU,IAAI,MAAkBO,kBAAkBX,KACvDY,MAAMC,IACLX,KAAKY,WAAWD,GAChB,MAAME,EAASF,EAAMG,SAASD,OAC9B,GAAIA,GAAU,EAAAE,eAAeC,KAAOH,GAAU,EAAAE,eAAeE,KAAOJ,GAAU,EAAAE,eAAeG,QAAS,CACrG,MAAMC,EAAM,+CAA+CN,KAE3D,MADAO,QAAQC,MAAMF,GACRA,C,OAGDnB,KAAKsB,eAAeX,EAAOA,EAAMG,SAASD,OAAO,GAG1D,CAEA,UAAAD,CAAWW,GACeC,MAArBD,EAAET,SAASD,OAIW,SAAtBU,EAAET,SAASW,SACdL,QAAQM,IAAI,+DACZH,EAAET,SAASD,OAAU,EAAAE,eAAeE,MAEpCG,QAAQM,IAAI,+DACZH,EAAET,SAASD,OAAU,EAAAE,eAAeC,KARpCI,QAAQM,IAAI,mCAAmCH,EAAET,SAASD,4BAU5D,CAEQ,yBAAAR,GACP,MAAMsB,EAAoB,IAAI,MAAY,YAQ1C,OAP4B,IAAI,MAA0B,CACzDC,MAAOD,EACPE,aAAa,EACbC,QAAS,GACTC,YAAY,EACZC,SAAU,OAGZ,CAEA,oBAAMV,CAAeW,EAAgCpB,GASpD,GAPAb,KAAKkC,cAAgBD,EAErBjC,KAAKM,2BAA2B6B,MAAQnC,KAAKR,WAAWU,IAAI,MAAQkC,KAAKC,SAASC,OAAOC,MAGzFvC,KAAKM,2BAA2BkC,2BAA2BP,EAAeQ,OAEtE5B,GAAU,EAAAE,eAAeC,KAAOH,GAAU,EAAAE,eAAeE,KAAOJ,GAAU,EAAAE,eAAeG,QAAS,CACrG,MAAMC,EAAM,4CAA4CN,KAExD,MADAO,QAAQC,MAAMF,GACRA,C,OAGDnB,KAAKO,uBAAuBmC,MAAMT,EAAgBpB,EAAQb,KAAKH,mBACtE,CAEQ,wBAAA8C,CAAyBV,GAEhC,MAAMW,EAAiC5C,KAAKQ,cAAcqC,2BAA2BZ,EAAgB,CAAC,YAAaA,EAAenB,SAASD,QACrIiC,EAA2Bb,EAAec,eAAeH,GACzDI,EAAgCC,OAAOC,KAAKJ,GAElD,OAD0Cb,EAAeQ,MAAMU,QAAOC,IAAaJ,EAAoBK,SAASD,EAASE,KAE1H,CAEA,aAAMC,GACLvD,KAAKM,2BAA2BkD,uBAAsB,GACtDpC,QAAQM,IAAI,kBACZ1B,KAAKyD,sBAAqB,SACpBzD,KAAKO,uBAAuBmD,sBAAsB1D,KAAKH,oBAC7DuB,QAAQM,IAAI,gBACb,CAEA,kBAAMiC,GACL3D,KAAKM,2BAA2BkD,uBAAsB,GACtDpC,QAAQM,IAAI,uBACZ1B,KAAKyD,sBAAqB,SACpBzD,KAAKO,uBAAuBmD,sBAAsB1D,KAAKH,oBAE7DuB,QAAQM,IAAI,qBACb,CAEA,aAAMkC,GACL5D,KAAKM,2BAA2BkD,uBAAsB,GACtDpC,QAAQM,IAAI,kBACZ1B,KAAKyD,sBAAqB,SACpBzD,KAAKO,uBAAuBmD,uBAAsB,GACxDtC,QAAQM,IAAI,gBACb,CAEQ,oBAAA+B,CAAqBI,GAC5B7D,KAAKG,cAAc2D,IAAID,EACxB,CAEQ,qBAAAE,G,MACW,QAAlB,EAAA/D,KAAKkC,qBAAa,SAAE8B,UAASC,IAExBA,aAAiB,OAAcA,EAAMnD,SAASoD,mBAEjDD,EAAME,SAAWF,EAAMnD,SAASoD,iB,GAGnC,CAEO,qBAAME,CAAgBC,SACtBrE,KAAKO,uBAAuBmD,uBAAsB,GACxD,MACMY,EADkBtE,KAAKR,WAAWU,IAAI,MACRqE,OAAOlC,SAASC,OAAOC,MAAMQ,eAAesB,EAAkBG,WAClGxE,KAAKM,2BAA2BmE,wBAAwBH,GAAa,GACrEtE,KAAKG,cAAcuE,QAAQJ,GAC3BlD,QAAQM,IAAI,kBAAmB2C,EAChC,CAEA,2BAAMX,CAAsBiB,GAC3B3E,KAAKH,mBAAqB8E,QACpB3E,KAAKO,uBAAuBmD,sBAAsBiB,EACzD,EAtJgB,EAAA5E,KAAO,sC,gDCNjB,MAAM6E,EAEZ,WAAArF,CAAoBsF,GAAA,KAAAA,eAAAA,CACpB,CAEO,sBAAAC,CAAuBC,GAE7B,IAAK/E,KAAK6E,eAAeG,IACxB,MAAM,IAAIC,MAAM,6BAGjB,MAAMC,EAAiBlF,KAAK6E,eAAeG,IAAIG,OAAOhC,QAAOiC,QAED5D,IAApDuD,EAD0CK,EACPhC,SAASE,MAI9C+B,EAAyB,IAAI,MACnC,IAAK,MAAMC,KAAUJ,EAAgB,CACpC,MAAMK,EAA2CD,EAE3ClC,EAAqBmC,EAAanC,SAElCoC,EAAcZ,EAAmBa,yBAAyBV,EAAuB3B,GAEjFsC,EAAgC1F,KAAK2F,2BAA2BJ,EAAcC,GACpFH,EAAkBO,MAAMF,E,CAEzB,OAAOL,CACR,CAUQ,+BAAOI,CAAyBV,EAAsC3B,GAQ7E,OAP0ByC,MAAMC,KAAKf,EAAsB3B,EAASE,KAE9ByC,SAAQC,GAEnB,IADiB5C,EAAS6C,gBAAgBD,KAKtE,CAEQ,0BAAAL,CAA2BO,EAA8BV,GAEhE,MAAMW,EAAc,IAAI,MAClBC,EAAU,IAAI,MACdC,EAAa,IAAI,MAgBvB,OAdAb,EAAYc,SAAQC,IACnBL,EAAcM,YAAYD,EAAYF,GAGtC,MAAMI,EAA2BP,EAAcO,SAC1CA,EAASN,aACbM,EAASC,qBAEVN,EAAQO,KAAKF,EAASN,aAAcS,aAAaP,GAGjDF,EAAYP,MAAMQ,EAAQ,IAGpBD,CACR,E,8EClEM,MAAMU,UAA2B,KAUpC,GAAA3G,IAAO4G,GAAkB,CAE5B,WAAAvH,CAAYC,GACXC,MAAMD,GAXJ,KAAAE,SAAmB,EAEtB,KAAAK,KAAO,uCAmBC,KAAAgH,iBAAgD,IAAInH,IAR3DJ,EAAWM,IAAIE,KAAKD,KAAMC,MAC1BA,KAAKR,WAAaA,EAClBQ,KAAKgH,gBAAkBxH,EAAWU,IAAI,MACtCF,KAAKG,cAAgBX,EAAWU,IAAI,MACpCF,KAAKO,uBAAyBf,EAAWU,IAAI,MAC7CF,KAAKiH,sBAAwBzH,EAAWU,IAAI,IAC7C,CAIO,oBAAMgH,CAAeC,EAAwCC,GAAuB,GAG1FhG,QAAQM,IAAI,oCAAqCyF,GAEjD,MAAME,GAoFiCjF,EApF0B+E,EAAUG,UAoFzBC,EApFoCC,GAAYA,EAASjF,MAqFrGH,EAAKqF,QAAO,CAACC,EAAUC,KAC7B,IAAIhH,EAAQ4G,EAAOI,GAGnB,OAFKD,EAAS/G,KAAQ+G,EAAS/G,GAAS,IACxC+G,EAAS/G,GAAOiH,KAAKD,GACdD,CAAQ,GACI,CAAC,IANtB,IAAyCtF,EAAWmF,EAlFlD,MAAMM,EAA+BV,EAAUU,SAE/C,IAAK,IAAKC,EAAWlG,KAAUiG,EAASE,UAAW,CAElD,MAAMC,EAAyBhI,KAAKiI,wBAAwBZ,EAAaS,GAEpE9H,KAAK+G,iBAAiBmB,IAAIJ,UACxB9H,KAAKmI,WAAWL,EAAWlG,GAGlC,MAAMwG,EAAiCpI,KAAK+G,iBAAiB7G,IAAI4H,GACjEM,EAAeC,+BAA+BL,GAG9C,MAAM/F,EAAkCjC,KAAKgH,gBAAgBzC,OAAOlC,SAASC,OAAOC,MAC9E+B,EAA6BrC,EAAec,eAAeiF,GAC3DM,EAAwBrF,OAAOC,KAAKoB,GACJrC,EAAeQ,MAAMU,QAAOoF,GAAQD,EAAYjF,SAASkF,EAAKjF,MAGlFgD,SAASlD,GAAuBA,EAASoF,SAASJ,EAAexG,MAAO0C,EAAYlB,EAASE,M,CAEjH,CAEQ,gBAAM6E,CAAWL,EAAmBlG,GAC3C,MAAM6G,EAA2B,IAAI,MAAY7G,EAAM8G,aACjDzG,EAAiBjC,KAAKgH,gBAAgBzC,OAAOlC,SAASC,OAAOC,MAC7DK,EAAuB5C,KAAKO,uBAAuBqC,qBACzD5C,KAAK+G,iBAAiBjD,IAAIgE,EAAW,IAAIa,EAAeF,EAAYxG,EAAgBW,GACrF,CAEQ,uBAAAqF,CAAwBZ,EAAkDS,GACjF,MAAMc,EAA6BvB,EAAYS,GAC/C,OAAKc,EAE0BA,EAAMC,KAAIC,GAAQA,EAAKC,cAFnC,EAIpB,CAEO,yBAAMC,GAC4BhJ,KAAKgH,gBAAgBzC,OAAOlC,SAASC,OAAOC,MACrEE,MAAM6D,SAASlD,IAC7B,IACCA,EAAS6F,Y,CAEV,MAAOC,G,KAIRlJ,KAAKiH,sBAAsBkC,cAE3BnJ,KAAK+G,iBAAiBqC,OACvB,CAEO,oBAAMC,CAAe9G,GAE3B,MAAM+G,EAAwCtJ,KAAK+G,iBAAiB7G,IAAIqC,GACnE+G,IAELtJ,KAAKiH,sBAAsBsC,4BAA4BD,GAAW,GAClEtJ,KAAKG,cAAc2D,KAAI,EAAOwF,EAAUE,eACzC,CAEO,eAAMC,CAAUlH,GAEtB,MAAM+G,EAAYtJ,KAAK+G,iBAAiB7G,IAAIqC,GACvC+G,IAELtJ,KAAKiH,sBAAsBsC,4BAA4BD,GAAW,GAClEtJ,KAAKG,cAAc2D,KAAI,EAAMwF,EAAUE,eACxC,CAEO,eAAME,CAAUnH,GAEtB,MAAM+G,EAAYtJ,KAAK+G,iBAAiB7G,IAAIqC,GACvC+G,IAELtJ,KAAKiH,sBAAsBsC,4BAA4BD,GAAW,GAClEtJ,KAAKG,cAAc2D,KAAI,EAAOwF,EAAUE,eACzC,EAYM,MAAMb,EACZ,WAAApJ,CAAmBqC,EAA4BK,EAAwCW,GAApE,KAAAhB,MAAAA,EAA4B,KAAAK,eAAAA,EAAwC,KAAAW,qBAAAA,EAE/E,KAAAoF,aAAyB,EAFuF,CAIjH,8BAAAK,CAA+BL,GACrChI,KAAKgI,aAAaJ,QAAQI,EAC3B,CAEA,iBAAIwB,GACH,MAAMG,EAAa3J,KAAKgI,aAAa7E,QAAOG,IAAOtD,KAAK4C,qBAAqBS,SAASC,KACtF,OAAOtD,KAAKiC,eAAec,eAAe4G,EAC3C,E,gDC3IM,MAAMC,UAA2B,KAIvC,WAAArK,CAAYC,GACXC,MAAMD,GAHC,KAAAqK,wBAA8D,IAAIjK,IAqC1E,KAAAF,SAAmB,EAhClBM,KAAKR,WAAWU,IAAI,MAAsBO,kBAAkBX,KAC3DY,MAAMoI,IAEL1H,QAAQM,IAAI,uCAAwCoH,EAAKhI,SAASD,OAAQiI,SACpE9I,KAAKsB,eAAewH,EAAMA,EAAKhI,SAASD,OAAO,GAGxD,CAEG,oBAAMS,CAAeW,EAAmCpB,GAC1D,MAAMiJ,EAAa7H,EAAe8H,qBAClC,IAAKD,EACJ,OAED,MAAME,EAAe,IAAIpK,IACnBqK,EAAe,IAAIrK,IAEzBqC,EAAeiI,sBAAsB5D,SAAQhD,IAC5C,MAAM6G,EAA2BL,EAAWxG,GACtC8G,EAAsBD,aAAQ,EAARA,EAAUE,SAElCD,IACHJ,EAAalG,IAAIR,EAAI8G,GACrBH,EAAanG,IAAIsG,EAAa9G,G,IAKhCtD,KAAK6J,wBAAwB/F,IAAI7B,EAAeqB,GAAI,CAACgH,gBAAiBL,EAAcM,UAAWP,GAC7F,CAKH,GAAA9J,CAAI4G,GAEH,OAD8B9G,KAAK6J,wBAAwB3J,IAAI4G,EAAK0D,QAErE,CAEA,sBAAAC,CAAuBC,GAEtB,OAD8B1K,KAAK6J,wBAAwB3J,IAAIwK,EAEhE,EAXgB,EAAA3K,KAAO,sC","sources":["webpack://client-app/./src/app/project/ifc-fun/Tools/VisibilityTool.ts","webpack://client-app/./src/app/project/ifc-fun/Utilities/BoundingBoxUtility.ts","webpack://client-app/./src/app/project/ifc-fun/Utilities/ColorLegendHandler.ts","webpack://client-app/./src/app/project/ifc-fun/Utilities/IdMappingComponent.ts"],"sourcesContent":["import {Classifier, Component, Components, FragmentsManager, Hider, Worlds} from \"@thatopen/components\";\r\nimport * as THREE from \"three\";\r\nimport {Fragment, FragmentIdMap, FragmentsGroup} from \"@thatopen/fragments\";\r\nimport {FragmentSource, ObjectIDsIF} from \"../openbim-container\";\r\nimport {IfcSpaceVisibility} from \"./IfcSpaceVisibility\";\r\nimport {TransparentFragments} from \"./TransparentFragments\";\r\nimport {Material} from \"three\";\r\nimport {IfcTypeFilter} from \"./IfcTypeFilter\";\r\n\r\nexport class VisibilityTool extends Component {\r\n\tstatic readonly uuid = \"6dbbe9c9-9149-4166-aa0e-0c10340fc976\";\r\n\t\r\n public enabled: boolean = true;\r\n\tprivate fragmentGroup: FragmentsGroup | undefined;\r\n\t\r\n\tprivate classifier: Classifier;\r\n\tprivate fragmentHider: Hider;\r\n\r\n\tprivate readonly translucentMaterial: THREE.Material;\r\n\tprivate readonly opaqueToTransparentMaterialMap: Map = new Map();\r\n\r\n\tprivate fragmentTransparencyStyler: TransparentFragments;\r\n\r\n\tprivate ifcSpaceVisibility: boolean = false;\r\n\tprivate ifcSpaceVisibilityTool: IfcSpaceVisibility;\r\n\tprivate ifcTypeFilter: IfcTypeFilter;\r\n\r\n\tconstructor(components: Components) {\r\n\t\tsuper(components);\r\n\t\tcomponents.add(VisibilityTool.uuid, this);\r\n\t\t\r\n\t\tthis.classifier = components.get(Classifier);\r\n\t\tthis.fragmentHider = components.get(Hider);\r\n\r\n\t\tthis.translucentMaterial = this.createTranslucentMaterial();\r\n\r\n\t\tthis.fragmentTransparencyStyler = components.get(TransparentFragments);\r\n\t\tthis.ifcSpaceVisibilityTool = components.get(IfcSpaceVisibility);\r\n\t\t\r\n\t\tthis.ifcTypeFilter = components.get(IfcTypeFilter);\r\n\r\n\t\tthis.components.get(FragmentsManager).onFragmentsLoaded.add(\r\n\t\t\tasync group => {\r\n\t\t\t\tthis.initSource(group);\r\n\t\t\t\tconst source = group.userData.source;\r\n\t\t\t\tif (source != FragmentSource.IFC && source != FragmentSource.MPK && source != FragmentSource.Unknown) {\r\n\t\t\t\t\tconst err = `onFragmentsLoaded, invalid fragmentSource: [${source}]`;\r\n\t\t\t\t\tconsole.error(err);\t\t\t\r\n\t\t\t\t\tthrow err;\r\n\t\t\t\t}\t\r\n\r\n\t\t\t\tawait this.afterModelLoad(group, group.userData.source);\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\tinitSource(g: FragmentsGroup) {\r\n\t\tif (g.userData.source != undefined) {\r\n\t\t\tconsole.log(`(GGG initSource: already set to ${g.userData.source}, so not touching.)`);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (g.userData.source2 == 'IsMPK') {\r\n\t\t\tconsole.log('GGG initSource, setting source to MPK, as source2 == IsMPK ')\r\n\t\t\tg.userData.source = FragmentSource.MPK;\r\n\t\t} else {\r\n\t\t\tconsole.log('GGG initSource, setting source to IFC, as source2 != IsMPK ')\r\n\t\t\tg.userData.source = FragmentSource.IFC;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate createTranslucentMaterial() {\r\n\t\tconst transparencyColor = new THREE.Color('darkblue');\r\n\t\tconst translucentMaterial = new THREE.MeshLambertMaterial({\r\n\t\t\tcolor: transparencyColor,\r\n\t\t\ttransparent: true,\r\n\t\t\topacity: 0.1,\r\n\t\t\tdepthWrite: false,\r\n\t\t\tblending: THREE.NormalBlending\r\n\t\t});\r\n\t\treturn translucentMaterial;\r\n\t}\r\n\r\n\tasync afterModelLoad(fragmentsGroup: FragmentsGroup, source: FragmentSource): Promise {\r\n\t\t// We need to add the meshes to the translucent material every time a new model is loaded.\r\n\t\tthis.fragmentGroup = fragmentsGroup;\r\n\t\t\r\n\t\tthis.fragmentTransparencyStyler.world = this.components.get(Worlds).list.values().next().value;\r\n\r\n\t\t//const fragmentsExceptSpaces: Fragment[] = this.getFragmentsExceptSpaces(fragmentsGroup);\r\n\t\tthis.fragmentTransparencyStyler.createTransparentFragments(fragmentsGroup.items);\r\n\t\t\r\n\t\tif (source != FragmentSource.IFC && source != FragmentSource.MPK && source != FragmentSource.Unknown) {\r\n\t\t\tconst err = `afterModelLoad, invalid fragmentSource: [${source}]`;\r\n\t\t\tconsole.error(err);\t\t\t\r\n\t\t\tthrow err;\r\n\t\t}\r\n\r\n\t\tawait this.ifcSpaceVisibilityTool.setup(fragmentsGroup, source, this.ifcSpaceVisibility);\r\n\t}\r\n\r\n\tprivate getFragmentsExceptSpaces(fragmentsGroup: FragmentsGroup) : Fragment[] {\r\n\t\t// Remove all ifcSpace fragments\r\n\t\tconst ifcSpaceEntityLabels: number[] = this.ifcTypeFilter.getEntityLabelsForIfcTypes(fragmentsGroup, [\"IFCSPACE\"], fragmentsGroup.userData.source);//getFragmentsExceptSpaces\r\n\t\tconst ifcSpaces: FragmentIdMap = fragmentsGroup.getFragmentMap(ifcSpaceEntityLabels);\r\n\t\tconst ifcSpaceFragmentIds: string[] = Object.keys(ifcSpaces);\r\n\t\tconst fragmentsExceptSpaces: Fragment[] = fragmentsGroup.items.filter(fragment => !ifcSpaceFragmentIds.includes(fragment.id));\r\n\t\treturn fragmentsExceptSpaces;\r\n\t}\r\n\r\n\tasync showAll() {\r\n\t\tthis.fragmentTransparencyStyler.setTransparencyForAll(false);\r\n\t\tconsole.log('Before showAll');\r\n\t\tthis.setVisibilityOfModel(true);\r\n\t\tawait this.ifcSpaceVisibilityTool.setIfcSpaceVisibility(this.ifcSpaceVisibility);\r\n\t\tconsole.log('After showAll');\r\n\t}\r\n\r\n\tasync transluteAll() {\r\n\t\tthis.fragmentTransparencyStyler.setTransparencyForAll(true);\r\n\t\tconsole.log('Before transluteAll');\r\n\t\tthis.setVisibilityOfModel(false);\r\n\t\tawait this.ifcSpaceVisibilityTool.setIfcSpaceVisibility(this.ifcSpaceVisibility);\r\n\r\n\t\tconsole.log('After transluteAll');\r\n\t}\r\n\r\n\tasync hideAll() {\r\n\t\tthis.fragmentTransparencyStyler.setTransparencyForAll(false);\r\n\t\tconsole.log('Before hideAll');\r\n\t\tthis.setVisibilityOfModel(false);\r\n\t\tawait this.ifcSpaceVisibilityTool.setIfcSpaceVisibility(false);\r\n\t\tconsole.log('After hideAll');\r\n\t}\r\n\r\n\tprivate setVisibilityOfModel(visibility: boolean) {\r\n\t\tthis.fragmentHider.set(visibility);\r\n\t}\r\n\t\r\n\tprivate setToOriginalMaterial() {\r\n\t\tthis.fragmentGroup?.traverse(child => {\r\n\t\t\t\r\n\t\t\tif (child instanceof THREE.Mesh && child.userData.originalMaterial) {\r\n\t\t\t\t\r\n\t\t\t\tchild.material = child.userData.originalMaterial;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic async transluteOthers(selectedObjectIds: ObjectIDsIF) {\r\n\t\tawait this.ifcSpaceVisibilityTool.setIfcSpaceVisibility(false);\r\n\t\tconst fragmentManager = this.components.get(FragmentsManager);\r\n\t\tconst fragmentMap = fragmentManager.groups.values().next().value.getFragmentMap(selectedObjectIds.objectIds);\r\n\t\tthis.fragmentTransparencyStyler.setTransparencyOfOthers(fragmentMap, true);\r\n\t\tthis.fragmentHider.isolate(fragmentMap);\r\n\t\tconsole.log('transluteOthers', selectedObjectIds);\r\n\t}\r\n\r\n\tasync setIfcSpaceVisibility(shouldShowSpaces: boolean) {\r\n\t\tthis.ifcSpaceVisibility = shouldShowSpaces;\r\n\t\tawait this.ifcSpaceVisibilityTool.setIfcSpaceVisibility(shouldShowSpaces);\r\n\t}\r\n}\r\n","import {Box3, BufferGeometry, InstancedMesh, Matrix4, Mesh, Quaternion, Vector3} from \"three\";\r\nimport {Fragment, FragmentIdMap, FragmentMesh} from \"@thatopen/fragments\";\r\nimport {OpenBimHandles} from \"../OpenBimHandles\";\r\n\r\nexport class BoundingBoxUtility {\r\n\r\n\tconstructor(private openBimHandles: OpenBimHandles) {\r\n\t}\r\n\r\n\tpublic getBoundingBoxForItems(fragmentIdToItemIdMap: FragmentIdMap): Box3 {\r\n\r\n\t\tif (!this.openBimHandles.mgr) {\r\n\t\t\tthrow new Error(\"OpenBimHandles is not set\");\r\n\t\t}\r\n\t\t\r\n\t\tconst selectedMeshes = this.openBimHandles.mgr.meshes.filter(mesh => {\r\n\t\t\tconst fragmentMesh: FragmentMesh = mesh;\r\n\t\t\treturn fragmentIdToItemIdMap[fragmentMesh.fragment.id] !== undefined;\r\n\t\t});\r\n\r\n\t\t// Calculate the bounding box of the selected objects\r\n\t\tconst totalBoundingBox: Box3 = new Box3();\r\n\t\tfor (const object of selectedMeshes) {\r\n\t\t\tconst fragmentMesh: FragmentMesh = object;\r\n\t\t\t// All of this below can be elevated up so it only happens once per fragment\r\n\t\t\tconst fragment: Fragment = fragmentMesh.fragment;\r\n\r\n\t\t\tconst instanceIds = BoundingBoxUtility.getInstanceIdsOfFragment(fragmentIdToItemIdMap, fragment);\r\n\r\n\t\t\tconst boundingBoxForInstances: Box3 = this.getBoundingBoxForInstances(fragmentMesh, instanceIds);\r\n\t\t\ttotalBoundingBox!.union(boundingBoxForInstances);\r\n\t\t}\r\n\t\treturn totalBoundingBox;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the instance IDs of the fragment.\r\n\t * It only returns the instance IDs of the items that are present in the fragmentIdMap meaning only the items that\r\n\t * were given using their object ids.\r\n\t * @param fragmentIdToItemIdMap\r\n\t * @param fragment\r\n\t * @private\r\n\t */\r\n\tprivate static getInstanceIdsOfFragment(fragmentIdToItemIdMap: FragmentIdMap, fragment: Fragment) {\r\n\t\tconst itemIDs: number[] = Array.from(fragmentIdToItemIdMap[fragment.id]);\r\n\r\n\t\tconst instanceIds: number[] = itemIDs.flatMap(itemID => {\r\n\t\t\tconst instanceIdsSet: Set | null = fragment.getInstancesIDs(itemID);\r\n\t\t\tconst numbers: number[] = [...instanceIdsSet!];\r\n\t\t\treturn numbers;\r\n\t\t});\r\n\t\treturn instanceIds;\r\n\t}\r\n\r\n\tprivate getBoundingBoxForInstances(instancedMesh: InstancedMesh, instanceIds: number[]): Box3 {\r\n\r\n\t\tconst boundingBox = new Box3();\r\n\t\tconst tempBox = new Box3();\r\n\t\tconst tempMatrix = new Matrix4();\r\n\r\n\t\tinstanceIds.forEach(instanceId => {\r\n\t\t\tinstancedMesh.getMatrixAt(instanceId, tempMatrix);\r\n\r\n\t\t\t// Apply the transformation to a temporary geometry bounding box\r\n\t\t\tconst geometry: BufferGeometry = instancedMesh.geometry;\r\n\t\t\tif (!geometry.boundingBox) {\r\n\t\t\t\tgeometry.computeBoundingBox();\r\n\t\t\t}\r\n\t\t\ttempBox.copy(geometry.boundingBox!).applyMatrix4(tempMatrix);\r\n\r\n\t\t\t// Extend the main bounding box with the transformed bounding box\r\n\t\t\tboundingBox.union(tempBox);\r\n\t\t});\r\n\r\n\t\treturn boundingBox;\r\n\t}\r\n}\r\n","import * as OBC from \"@thatopen/components\";\r\nimport * as OBCF from \"@thatopen/components-front\";\r\nimport {InstanceColorData, InstanceColorDataCollection} from \"../../../models/color-legend-dto\";\r\nimport * as THREE from \"three\";\r\nimport Color from \"color\";\r\nimport {Fragment, FragmentIdMap, FragmentsGroup} from \"@thatopen/fragments\";\r\nimport {IfcSpaceVisibility} from \"../Tools/IfcSpaceVisibility\";\r\nimport {TransparentFragments} from \"../Tools/TransparentFragments\";\r\n\r\nexport class ColorLegendHandler extends OBC.Component {\r\n components: OBC.Components;\r\n enabled: boolean = true;\r\n\t\r\n\tuuid = \"d9b218c9-5d22-447c-af7e-b00dc58fdef4\";\r\n\tprivate readonly fragmentManager: OBC.FragmentsManager;\r\n\tprivate readonly fragmentHider: OBC.Hider;\r\n\tprivate readonly transparencyFragments: TransparentFragments;\r\n\tprivate readonly ifcSpaceVisibilityTool: IfcSpaceVisibility;\r\n\t\r\n get(...args: any): void {}\r\n\t\r\n\tconstructor(components: OBC.Components) {\r\n\t\tsuper(components);\r\n\t\t\r\n\t\tcomponents.add(this.uuid, this);\r\n\t\tthis.components = components;\r\n\t\tthis.fragmentManager = components.get(OBC.FragmentsManager);\r\n\t\tthis.fragmentHider = components.get(OBC.Hider);\r\n\t\tthis.ifcSpaceVisibilityTool = components.get(IfcSpaceVisibility);\r\n\t\tthis.transparencyFragments = components.get(TransparentFragments);\r\n\t}\r\n\t\r\n\tprivate valueNameToGroup: Map = new Map();\r\n\t\r\n\tpublic async colorInstances(colorData: InstanceColorDataCollection, colorSpaces: boolean = false): Promise {\r\n\t\t// Note: This runs in several batches meaning that the entity labels are gradually collected.\r\n\t\t\r\n\t\tconsole.log('ColorLegendHandler.colorInstances', colorData);\r\n\t\t\r\n\t\tconst colorGroups: Record = groupBy(colorData.instances, instance => instance.value);\r\n\t\t\r\n\t\tconst colorMap: Map = colorData.colorMap;\r\n\r\n\t\tfor (let [valueName, color] of colorMap.entries()) {\r\n\r\n\t\t\tconst entityLabels: number[] = this.getEntityLabelsForGroup(colorGroups, valueName);\r\n\t\t\t\r\n\t\t\tif (!this.valueNameToGroup.has(valueName)) {\r\n\t\t\t\tawait this.setupGroup(valueName, color);\t\r\n\t\t\t}\r\n\r\n\t\t\tconst colorGroupData: ColorGroupData = this.valueNameToGroup.get(valueName)!;\r\n\t\t\tcolorGroupData.addEntityLabelsForCurrentBatch(entityLabels);\r\n\r\n\t\t\t// Find fragments to be colored\r\n\t\t\tconst fragmentsGroup : FragmentsGroup = this.fragmentManager.groups.values().next().value;\r\n\t\t\tconst fragmentMap: FragmentIdMap = fragmentsGroup.getFragmentMap(entityLabels);\r\n\t\t\tconst fragmentIds: string[] = Object.keys(fragmentMap);\r\n\t\t\tconst relevantFragments: Fragment[] = fragmentsGroup.items.filter(item => fragmentIds.includes(item.id));\r\n\t\t\t\r\n\t\t\t// Color them\r\n\t\t\trelevantFragments.forEach((fragment: Fragment) => fragment.setColor(colorGroupData.color, fragmentMap[fragment.id]));\r\n\t\t}\r\n\t}\r\n\r\n\tprivate async setupGroup(valueName: string, color: Color) : Promise {\r\n\t\tconst threeColor : THREE.Color = new THREE.Color(color.rgbNumber());\r\n\t\tconst fragmentsGroup = this.fragmentManager.groups.values().next().value;\r\n\t\tconst ifcSpaceEntityLabels = this.ifcSpaceVisibilityTool.ifcSpaceEntityLabels;\r\n\t\tthis.valueNameToGroup.set(valueName, new ColorGroupData(threeColor, fragmentsGroup, ifcSpaceEntityLabels));\r\n\t}\r\n\r\n\tprivate getEntityLabelsForGroup(colorGroups: Record, valueName: string) : number[] {\r\n\t\tconst datum: InstanceColorData[] = colorGroups[valueName];\r\n\t\tif (!datum) return [];\r\n\t\t\r\n\t\tconst entityLabels: number[] = datum.map(data => data.entityLabel);\r\n\t\treturn entityLabels;\r\n\t}\r\n\t\r\n\tpublic async resetColorInstances() {\r\n\t\tconst fragmentsGroup : FragmentsGroup = this.fragmentManager.groups.values().next().value;\r\n\t\tfragmentsGroup.items.forEach((fragment: Fragment) => {\r\n\t\t\ttry {\r\n\t\t\t\tfragment.resetColor();\r\n\t\t\t}\r\n\t\t\tcatch (e) {\r\n\t\t\t\t// Ignore - Throws if it has not been colored yet\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis.transparencyFragments.resetColors();\r\n\t\t\r\n\t\tthis.valueNameToGroup.clear();\t// Otherwise old colors will be used between colorings\r\n\t}\r\n\r\n\tpublic async transluteGroup(value: string) {\r\n\r\n\t\tconst groupData: ColorGroupData | undefined = this.valueNameToGroup.get(value);\r\n\t\tif (!groupData) return;\r\n\t\t\r\n\t\tthis.transparencyFragments.setTransparencyOfColorGroup(groupData, true);\r\n\t\tthis.fragmentHider.set(false, groupData.fragmentIdMap);\r\n\t}\r\n\r\n\tpublic async showGroup(value: string) {\r\n\r\n\t\tconst groupData = this.valueNameToGroup.get(value);\r\n\t\tif (!groupData) return;\r\n\r\n\t\tthis.transparencyFragments.setTransparencyOfColorGroup(groupData, false);\r\n\t\tthis.fragmentHider.set(true, groupData.fragmentIdMap);\r\n\t}\r\n\r\n\tpublic async hideGroup(value: string) {\r\n\r\n\t\tconst groupData = this.valueNameToGroup.get(value);\r\n\t\tif (!groupData) return;\r\n\r\n\t\tthis.transparencyFragments.setTransparencyOfColorGroup(groupData, false);\r\n\t\tthis.fragmentHider.set(false, groupData.fragmentIdMap);\r\n\t}\r\n}\r\n\r\nfunction groupBy(list: T[], getKey: (item: T) => K): Record {\r\n\treturn list.reduce((previous, currentItem) => {\r\n\t\tlet group = getKey(currentItem);\r\n\t\tif (!previous[group]) previous[group] = [];\r\n\t\tprevious[group].push(currentItem);\r\n\t\treturn previous;\r\n\t}, > {});\r\n}\r\n\r\nexport class ColorGroupData {\r\n\tconstructor(public color: THREE.Color, private fragmentsGroup: FragmentsGroup, private ifcSpaceEntityLabels: number[]) {}\r\n\t\r\n\tprivate entityLabels: number[] = [];\r\n\t\r\n\tpublic addEntityLabelsForCurrentBatch(entityLabels: number[]) {\r\n\t\tthis.entityLabels.push(...entityLabels);\r\n\t}\r\n\t\r\n\tget fragmentIdMap() {\r\n\t\tconst expressIDs = this.entityLabels.filter(id => !this.ifcSpaceEntityLabels.includes(id));\r\n\t\treturn this.fragmentsGroup.getFragmentMap(expressIDs);\r\n\t}\r\n}\r\n","import * as OBC from \"@thatopen/components\";\r\nimport * as BF from \"@thatopen/fragments\";\r\nimport {FragmentSource} from \"../openbim-container\";\r\nimport {ObjPropertySet} from \"../openbim-highlighter\";\r\n\r\nexport class IdMappingComponent extends OBC.Component {\r\n\r\n\tprivate fragmentGroupToMappings: Map = new Map();\r\n\r\n\tconstructor(components: OBC.Components) {\r\n\t\tsuper(components);\r\n\r\n\t\tthis.components.get(OBC.FragmentsManager).onFragmentsLoaded.add(\r\n\t\t\tasync data => {\r\n\r\n\t\t\t\tconsole.log('IdMappingComponent.onFragmentsLoaded', data.userData.source, data);\t\t\t\t\t\t\t\t\r\n\t\t\t\tawait this.afterModelLoad(data, data.userData.source);\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\t\r\n async afterModelLoad(fragmentsGroup: BF.FragmentsGroup, source: FragmentSource): Promise {\r\n\t\tconst properties = fragmentsGroup.getLocalProperties();\r\n\t\tif (!properties)\r\n\t\t\treturn;\r\n\r\n\t\tconst idToGlobalId = new Map;\r\n\t\tconst globalIdToId = new Map;\r\n\r\n\t\tfragmentsGroup.getAllPropertiesIDs().forEach(id => {\r\n\t\t\tconst property: ObjPropertySet = properties[id];\r\n\t\t\tconst ifcGlobalId: string = property?.globalId;\r\n\r\n\t\t\tif (ifcGlobalId) {\r\n\t\t\t\tidToGlobalId.set(id, ifcGlobalId);\r\n\t\t\t\tglobalIdToId.set(ifcGlobalId, id);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\r\n\t\tthis.fragmentGroupToMappings.set(fragmentsGroup.id, {globalIdMapping: globalIdToId, idMapping: idToGlobalId});\r\n }\r\n\t\t\r\n\tstatic readonly uuid = \"198F91B0-98FD-4F96-BFD2-32C88D23AB94\";\r\n\tenabled: boolean = true;\r\n\r\n\tget(args: any): FragmentGroupMappings {\r\n\t\tconst fragmentGroupMappings = this.fragmentGroupToMappings.get(args.groupId)!;\r\n\t\treturn fragmentGroupMappings;\r\n\t}\r\n\r\n\tgetFromFragmentGroupId(fragmentGroupId: number) : FragmentGroupMappings | undefined {\r\n\t\tconst fragmentGroupMappings = this.fragmentGroupToMappings.get(fragmentGroupId);\r\n\t\treturn fragmentGroupMappings;\r\n\t}\r\n}\r\n\r\nexport interface FragmentGroupMappings {\r\n\tglobalIdMapping: Map;\r\n\tidMapping: Map;\r\n}\r\n"],"names":["VisibilityTool","constructor","components","super","enabled","opaqueToTransparentMaterialMap","Map","ifcSpaceVisibility","add","uuid","this","classifier","get","fragmentHider","translucentMaterial","createTranslucentMaterial","fragmentTransparencyStyler","ifcSpaceVisibilityTool","ifcTypeFilter","onFragmentsLoaded","async","group","initSource","source","userData","FragmentSource","IFC","MPK","Unknown","err","console","error","afterModelLoad","g","undefined","source2","log","transparencyColor","color","transparent","opacity","depthWrite","blending","fragmentsGroup","fragmentGroup","world","list","values","next","value","createTransparentFragments","items","setup","getFragmentsExceptSpaces","ifcSpaceEntityLabels","getEntityLabelsForIfcTypes","ifcSpaces","getFragmentMap","ifcSpaceFragmentIds","Object","keys","filter","fragment","includes","id","showAll","setTransparencyForAll","setVisibilityOfModel","setIfcSpaceVisibility","transluteAll","hideAll","visibility","set","setToOriginalMaterial","traverse","child","originalMaterial","material","transluteOthers","selectedObjectIds","fragmentMap","groups","objectIds","setTransparencyOfOthers","isolate","shouldShowSpaces","BoundingBoxUtility","openBimHandles","getBoundingBoxForItems","fragmentIdToItemIdMap","mgr","Error","selectedMeshes","meshes","mesh","totalBoundingBox","object","fragmentMesh","instanceIds","getInstanceIdsOfFragment","boundingBoxForInstances","getBoundingBoxForInstances","union","Array","from","flatMap","itemID","getInstancesIDs","instancedMesh","boundingBox","tempBox","tempMatrix","forEach","instanceId","getMatrixAt","geometry","computeBoundingBox","copy","applyMatrix4","ColorLegendHandler","args","valueNameToGroup","fragmentManager","transparencyFragments","colorInstances","colorData","colorSpaces","colorGroups","instances","getKey","instance","reduce","previous","currentItem","push","colorMap","valueName","entries","entityLabels","getEntityLabelsForGroup","has","setupGroup","colorGroupData","addEntityLabelsForCurrentBatch","fragmentIds","item","setColor","threeColor","rgbNumber","ColorGroupData","datum","map","data","entityLabel","resetColorInstances","resetColor","e","resetColors","clear","transluteGroup","groupData","setTransparencyOfColorGroup","fragmentIdMap","showGroup","hideGroup","expressIDs","IdMappingComponent","fragmentGroupToMappings","properties","getLocalProperties","idToGlobalId","globalIdToId","getAllPropertiesIDs","property","ifcGlobalId","globalId","globalIdMapping","idMapping","groupId","getFromFragmentGroupId","fragmentGroupId"],"sourceRoot":""}