{"version":3,"file":"app-2e6db95c.4c097332db6cf3ae.bundle.js","mappings":"+IAQO,MAAMA,EAAb,cA+BC,KAAAC,YAAuB,CAAC,CAEzB,EAEO,SAASC,EAAmBC,GAIlC,OAH2BA,EAAKC,IAAI,MACJC,KAAKC,SAASC,OAAOC,MACDC,MAAMC,KAE3D,C,kEC5CO,MAAMC,EAIT,WAAAC,CAAoBC,GAAA,KAAAA,WAAAA,EACtBC,KAAKC,WAAaD,KAAKD,WAAWT,IAAI,MACtCU,KAAKC,WAAWC,aAAe,EAC/BF,KAAKC,WAAWE,MAAQH,KAAKD,WAAWT,IAAI,MAAYC,KAAKC,SAASC,OAAOC,MAC7EM,KAAKC,WAAWG,SAAU,CAC3B,CAEA,cAAMC,GACLL,KAAKC,WAAWG,SAAU,EAC1B,MAAMD,EAAQH,KAAKD,WAAWT,IAAI,MAAYC,KAAKC,SAASC,OAAOC,MACnEM,KAAKC,WAAWE,MAAQA,CACzB,CAEA,gBAAMG,GACLN,KAAKC,WAAWG,SAAU,EAC1BJ,KAAKC,WAAWM,WACjB,CAEA,mBAAMC,CAAcC,GACpB,CAEA,iBAAMC,CAAYD,GAClB,CAEA,eAAME,CAAUF,GAChB,CAEA,aAAMG,CAAQH,GACQ,IAAjBA,EAAMI,OACTb,KAAKC,WAAWa,SAES,IAAjBL,EAAMI,QACdb,KAAKC,WAAWc,gBAElB,E,aCvCM,MAAMC,EAMZ,WAAAlB,CAAoBC,GAAA,KAAAA,WAAAA,EAJZ,KAAAK,SAAmB,EAK1BJ,KAAKiB,QAAUlB,EAAWT,IAAI,MAE9B,MAAM4B,EAAyClB,KAAKD,WAAWT,IAAI,MACnEU,KAAKmB,OAASnB,KAAKD,WAAWT,IAAI,MAElC4B,EAAiBE,kBAAkBC,KAAIC,IACtC,MAAMnB,EAAQH,KAAKmB,OAAO5B,KAAKC,SAASC,OAAOC,MAC/CM,KAAKG,MAAQA,CAAK,GAEpB,CAEG,iBAAMO,CAAYD,GACrB,CACA,eAAME,CAAUF,GACb,CAEH,aAAMG,CAAQH,GAGTT,KAAKI,SAA4B,IAAjBK,EAAMI,QAAgBb,KAAKG,QAC1CM,EAAMc,QACTvB,KAAKiB,QAAQO,OAAOxB,KAAKG,OAEzBH,KAAKiB,QAAQH,OAAOd,KAAKG,OAE5B,CACA,mBAAMK,CAAcC,GACjB,CACH,cAAMJ,GACLoB,QAAQC,IAAI,qBACZ1B,KAAKI,SAAU,EACfJ,KAAKiB,QAAQb,SAAU,CAExB,CACA,gBAAME,GACLmB,QAAQC,IAAI,uBACZ1B,KAAKI,SAAU,CAEb,EC5CG,MAAMuB,EAIT,WAAA7B,CAAoBC,GAAA,KAAAA,WAAAA,EACtBC,KAAK4B,gBAAkB7B,EAAWT,IAAI,MACtCU,KAAK4B,gBAAgBzB,MAAQH,KAAKD,WAAWT,IAAI,MAAYC,KAAKC,SAASC,OAAOC,MAClFM,KAAK4B,gBAAgBxB,SAAU,CAChC,CAEA,cAAMC,GACLL,KAAK4B,gBAAgBxB,SAAU,CAChC,CAEA,gBAAME,GACLN,KAAK4B,gBAAgBxB,SAAU,EAC/BJ,KAAK4B,gBAAgBrB,WACtB,CAEA,mBAAMC,CAAcC,GACpB,CAEA,iBAAMC,CAAYD,GAClB,CAEA,eAAME,CAAUF,GAChB,CAEA,aAAMG,CAAQH,GACQ,IAAjBA,EAAMI,QACTb,KAAK4B,gBAAgBd,SACrBW,QAAQC,IAAI,2BAEa,IAAjBjB,EAAMI,SACdb,KAAK4B,gBAAgBC,cACrBJ,QAAQC,IAAI,+BAEd,E,4CCrBM,MAAMI,EAWZ,WAAAhC,CAAoBiC,EAAsCC,EAAgCC,GAAtE,KAAAF,YAAAA,EAAsC,KAAAC,eAAAA,EACzD,MAAMjC,EAAaiC,EAAe3C,KAClCW,KAAKiC,oBAAsBA,EAC3BjC,KAAKkC,kBAAoB,IAAIrC,EAAkBE,GAC/CC,KAAKmC,gBAAkB,IAAIR,EAAgB5B,GAC3CC,KAAKoC,SAAW,IAAIpB,EAASjB,GAE7BC,KAAKqC,eAAiBtC,EAAWT,IAAIgD,EAAA,GACrCtC,KAAKuC,mBAAqB,IAAIC,EAAA,EAAmBR,GACjDhC,KAAKyC,mBAAqB,IAAIC,EAAA,EAAmB3C,EAClD,CAEA,wBAAM4C,CAAmBC,GAExB,OADAnB,QAAQC,IAAI,gDAAiDkB,GACrDA,GACP,KAAK,IAASC,sBACP7C,KAAK+B,YAAYe,QAAQ9C,KAAKiC,qBACpC,MACD,KAAK,IAASc,oBACP/C,KAAK+B,YAAYe,QAAQ9C,KAAKkC,mBACpC,MACD,KAAK,IAASc,kBACPhD,KAAK+B,YAAYe,QAAQ9C,KAAKmC,iBACpC,MACD,KAAK,IAASnB,eACPhB,KAAK+B,YAAYe,QAAQ9C,KAAKoC,UAGvC,CACA,oBAAMa,SACCjD,KAAKqC,eAAea,SAC3B,CACA,yBAAMC,SACCnD,KAAKqC,eAAee,cAC3B,CACA,oBAAMC,SACCrD,KAAKqC,eAAeiB,SAC3B,CACA,kBAAMC,CAAaC,SACZxD,KAAKqC,eAAeoB,sBAAsBD,GAChD/B,QAAQC,IAAI,0CAA2C8B,EACxD,CAEA,mBAAME,CAAcC,G,MACnBlC,QAAQC,IAAI,iCAAkCiC,EAAUA,UAAUC,OAAO,UAAWD,EAAUE,eAAeD,QAC7G5D,KAAK8D,iBAAiBH,GACtB,MAAMI,EAA4BJ,EAAUA,UAEtCK,GAD8C,QAAnB,EAAAhE,KAAKgC,sBAAc,eAAEiC,UACEC,eAAeH,GAYjEI,EAAiBC,OAAOC,KAAKL,GAAyBJ,OAC5DnC,QAAQC,IAAI,sDAAuDqC,EAClE,kBAAmBI,GAKpB,MAAMG,EAActE,KAAKgC,eAAgBsC,aACzC,QAAuBA,EAAaN,EACrC,CAEA,gBAAAF,CAAiBH,G,MAChB,MAAMY,EAAuC,QAAnB,EAAAvE,KAAKgC,sBAAc,eAAE7C,YAE/C,IAAK,IAAIqF,KAAcb,EAAUE,eAAgB,CAChD,IAAKW,EAAY,CAAE/C,QAAQC,IAAI,6BAA8B8C,GAAa,Q,CAC1E,KAAMA,KAAcD,GAAW,CAAE9C,QAAQC,IAAI,yBAA0B8C,GAAa,Q,CACpF,MAAMC,EAAsBF,EAASC,GACjCC,EAAWb,QAAU,EAAKnC,QAAQC,IAAI,0CAA2C8C,EAAYC,GACjGhD,QAAQC,IAAI,oDAAqD8C,EAAYC,E,CAE/E,CAEA,mBAAMC,CAAcf,G,MACnB,MAAMgB,EAAiE,QAAzB,EAAA3E,KAAKgC,eAAe7B,aAAK,eAAEwE,OACzE,IAAKA,EAAU,OAGf,GAA6C,IAAzC3E,KAAKgC,eAAe4C,IAAKC,OAAOC,KACnC,MAAM,IAAIC,MAAM,sDAGjB,MACMC,EADqBhF,KAAKgC,eAAe4C,IAAKC,OAAOrF,SAASC,OAAOC,MACVwE,eAAeP,EAAUA,WACpFsB,EAAoBjF,KAAKuC,mBAAmB2C,uBAAuBF,GAGzEL,EAAOQ,SAASC,YAAYH,EAAaI,kBAAkB,IAAI,QAAW,GACxEC,MAAKC,GAAK9D,QAAQC,IAAI,YAAa6D,IACtC,CAEA,iBAAMC,CAAY7B,G,UACjBlC,QAAQC,IAAI,sBACZ,MAAM+D,EAA2B,QAAnB,EAAAzF,KAAKgC,sBAAc,eAAEiC,SAAUC,eAAeP,EAAUA,WAC7C,QAAzB,EAAmB,QAAnB,EAAA3D,KAAKgC,sBAAc,eAAE3C,YAAI,SAAEC,IAAI,MAAWoG,KAAI,EAAOD,EACtD,CAEA,iBAAME,CAAYhC,GACjB,MAAM,IAAIoB,MAAM,0BACjB,CAEA,sBAAMa,CAAiBjC,GACtB,MAAM,IAAIoB,MAAM,0BACjB,CAEA,gBAAMc,CAAWlC,G,gBACV3D,KAAKqD,iBACX,MAAMoC,EAA2B,QAAnB,EAAAzF,KAAKgC,sBAAc,eAAEiC,SAAUC,eAAeP,EAAUA,WAE7C,QAAzB,EAAmB,QAAnB,EAAA3D,KAAKgC,sBAAc,eAAE3C,YAAI,SAAEC,IAAI,MAAWwG,QAAQL,EACnD,CAEA,qBAAMM,CAAgBC,SACfhG,KAAKqD,uBACLrD,KAAKiG,4BACLjG,KAAKqC,eAAe0D,gBAAgBC,EAC3C,CAGA,oBAAME,CAAeC,SACdnG,KAAKyC,mBAAmByD,eAAeC,EAC9C,CAEA,yBAAMF,SACCjG,KAAKyC,mBAAmBwD,4BACxBjG,KAAKqD,gBACZ,CAEA,oBAAM+C,CAAeC,SACdrG,KAAKyC,mBAAmB6D,UAAUD,EACzC,CAEA,yBAAME,CAAoBF,SACnBrG,KAAKyC,mBAAmB+D,eAAeH,EAC9C,CAEA,oBAAMI,CAAeJ,SACdrG,KAAKyC,mBAAmBiE,UAAUL,EACzC,E,sICvKM,MAAMM,UAA2B,KAqBvC,WAAA7G,CAAYC,GACX6G,MAAM7G,GArBC,KAAA8G,YAAqB,qBAMrB,KAAAC,wBAAuD,IAAIC,IAG3D,KAAAC,WAAa,IAAI,MAAM,UACvB,KAAAC,cAA0B,IAAI,MAAkB,CACvDC,MAAOlH,KAAKgH,WACZG,QAAS,GACTC,aAAa,EACbC,YAAY,IAkIL,KAAAC,SAAW,CAAC,YAuBpB,KAAAlH,SAAmB,EAEZ,KAAAmH,qBAAiC,GAnJvCxH,EAAWsB,IAAIsF,EAAmBa,KAAMxH,MAExCA,KAAKyH,WAAa1H,EAAWT,IAAI,KACjCU,KAAK0H,MAAQ1H,KAAKD,WAAWT,IAAI,MACjCU,KAAK2H,WAAa3H,KAAKD,WAAWT,IAAI,MACtCU,KAAK4H,qBAAuB5H,KAAKD,WAAWT,IAAI,IACjD,CAMA,WAAMuI,CAAMC,EAAgCC,EAAwBC,GAEnE,GADAvG,QAAQC,IAAI,4BACRqG,GAAU,EAAAE,eAAeC,KAAOH,GAAU,EAAAE,eAAeE,KAAOJ,GAAU,EAAAE,eAAeG,QAAS,CACrG,MAAMC,EAAM,uCAAuCN,KAEnD,MADAtG,QAAQ6G,MAAMD,GACRA,C,CAGP,MAAME,EAAiBvI,KAAKwI,UAAUV,EAAgBC,EAAQC,GAC9DvG,QAAQC,IAAI,sBAAuB6G,SAE7BvI,KAAKyD,sBAAsBuE,EAClC,CAEA,SAAAQ,CAAUV,EAAgCC,EAAwBC,GACjEvG,QAAQC,IAAI,gCAEZ1B,KAAK8G,wBAAwBpB,IAAIoC,EAAeW,GAAIV,GAEpDtG,QAAQC,IAAI,kEACZ,MAAMgH,EAA0B1I,KAAKyH,WAAWkB,2BAA2Bb,EAAgB9H,KAAKsH,SAAUS,GAI1G,GAHA/H,KAAKuH,qBAAuBmB,EAC5BjH,QAAQC,IAAI,4CAA6C,MAAOgH,EAAgB,aAAc1I,KAAKuH,qBAAsB,QAASvH,MAEjG4I,MAA7B5I,KAAKuH,qBAAmC,CAC3C,MAAMc,EAAM,iEAIZ,MAHA5G,QAAQoH,KAAKR,GACb5G,QAAQoH,KAAK,iBAAkB7I,KAAKyH,YACpChG,QAAQoH,KAAK,qCAAsC7I,MAC7CqI,C,CAGP,IACCrI,KAAK8I,UAAYhB,EAAe5D,eAAelE,KAAKuH,qB,CACnD,MAAOwB,GAIR,MAHAtH,QAAQoH,KAAK,yBACbpH,QAAQoH,KAAK,wBAAyB7I,KAAKuH,sBAC3C9F,QAAQoH,KAAK,kBAAmBf,GAC1BiB,C,CAGP/I,KAAKgJ,cAAgBlB,EAErB9H,KAAK2H,WAAWsB,SAASjJ,KAAK8I,UAAW9I,KAAKgH,YAE9C,MAAMkC,EAAgC9E,OAAOC,KAAKrE,KAAK8I,WAevD,OAdA9I,KAAKgJ,cAAcG,UAAUC,IAEtBA,aAAgB,MAGlBF,EAAoBG,SAASD,EAAKE,SAASb,MAC9CW,EAAKG,SAAW,CAACvJ,KAAKiH,e,IAKxBjH,KAAKwJ,gCAAgC1B,EAAgBC,GAG9C,EACL,CAEK,+BAAAyB,CAAgC1B,EAAgCC,GAGvE,GAAsB,MAAlB/H,KAAK8I,UAER,YADArH,QAAQoH,KAAK,mFAId,MAAMY,EAAcC,MAAMC,KAAKvF,OAAOC,KAAKrE,KAAK8I,YAEtBhB,EAAe8B,MAAMC,QAAOP,GAC9CG,EAAYJ,SAASC,EAASb,MAGpBqB,SAAQR,IACzB,MAAMS,EAAeT,EAASF,KAC9BW,EAAaC,eAAgB,EAC7B,MAEMC,EAAuBjK,KAAK8I,UAAWQ,EAASb,IACtD,IAAK,IAAIyB,KAAUD,EAAS,CAE3B,MAAME,EAAeb,EAASc,gBAAgBF,GAC9C,GAAoB,MAAhBC,EAEJ,IAAK,IAAIE,KAAcF,EAAc,CACpC,MAAMG,EAAS,IAAI,MACnBP,EAAaQ,YAAYF,EAAYC,GAErC,MAAME,EAAW,IAAI,MACfC,EAAa,IAAI,MACjBC,EAAQ,IAAI,MAElBJ,EAAOK,UAAUH,EAAUC,EAAYC,GACvCA,EAAME,eAjBY,KAmBlB,MAAMC,EAAY,IAAI,MACtBA,EAAUC,QAAQN,EAAUC,EAAYC,GAExCX,EAAagB,YAAYV,EAAYQ,E,EAIvCd,EAAaiB,eAAeC,aAAc,CAAI,GAEhD,CAQA,2BAAMxH,CAAsBD,GAEL,MAAlBxD,KAAK8I,WAKLtF,EACHxD,KAAK0H,MAAMhC,KAAI,EAAM1F,KAAK8I,WAG1B9I,KAAK0H,MAAMhC,KAAI,EAAO1F,KAAK8I,WAG5B9I,KAAK4H,qBAAqBsD,uBAAuBlL,KAAK8I,UAAWtF,IAXhE/B,QAAQoH,KAAK,sEAYf,EAnKgB,EAAArB,KAAO,sC,uGCVjB,MAAM2D,UAAsB,KAMlC,GAAA7L,GAEA,CAKA,WAAAQ,CAAYC,GACX6G,MAAM7G,GAVP,KAAAK,SAAmB,EAYlB,MAAMgL,EAAkBrL,EAAWT,IAAI,MACvCS,EAAWsB,IAAI8J,EAAc3D,KAAMxH,MAEnCA,KAAKqL,mBAAqBtL,EAAWT,IAAI,KACzCU,KAAKsL,mBAAqBvL,EAAWT,IAAI,MAEzC8L,EAAgBhK,kBAAkBC,KACjCkK,MAAMC,IACL/J,QAAQC,IAAI,kCAAmC8J,EAAKC,SAAS1D,cACvD/H,KAAK0L,eAAeF,EAAMA,EAAKC,SAAS1D,OAAO,GAGxD,CAEA,oBAAM2D,CAAe5D,EAAgCC,GAChDA,IAAW,EAAAE,eAAeC,MAI9BlI,KAAKsL,mBAAmBK,UACxB3L,KAAKsL,mBAAmBM,SAAS9D,GAC/B,CAEI,0BAAAa,CAA2BkD,EAAuBvE,EAAoBS,GAE5E,OADAtG,QAAQC,IAAI,6CAA8CqG,GAClDA,GACP,KAAK,EAAAE,eAAeC,IAEnB,OADAzG,QAAQC,IAAI,YACL1B,KAAK8L,8BAA8BxE,GAC3C,KAAK,EAAAW,eAAeE,IAEnB,OADA1G,QAAQC,IAAI,YACL1B,KAAK+L,8BAA8BF,EAAOvE,GAClD,KAAK,EAAAW,eAAeG,QAEnB,MADA3G,QAAQC,IAAI,gBACN,uDACP,QAEC,MADAD,QAAQC,IAAI,kBAAkBqG,KACxB,6BAA6BA,IAEtC,CAEQ,6BAAAgE,CAA8BF,EAAuBvE,GAC5D7F,QAAQC,IAAI,iCAEZ,MAAMsK,EAAQH,EAAMI,qBACpB,IAAKD,EAEJ,OADAvK,QAAQC,IAAI,2CACL,GAGR,IAAIuI,EAAoB,GAGpBiC,EADU9H,OAAO5E,OAAOwM,GACNnC,QAAOsC,GAAK7E,EAAS8E,MAAKC,IAAI,MAAC,OAAAA,EAAEC,gBAA6B,QAAZ,EAAAH,EAAW,eAAC,eAAEG,cAAc,MACpG,IAAK,IAAIC,KAASL,EAAS,CAC1B,IAAIM,EAAWD,EAAgB,SAC/B,GAAIC,EAAU,CACb,MAAMC,EAA2DzM,KAAKqL,mBAAmBqB,uBAAuBb,EAAMpD,IACtH,IAAKgE,EACJ,SAGD,IAAIhE,EAAKgE,EAAsBE,gBAAgBrN,IAAIkN,GAC/C/D,GACHwB,EAAQ2C,KAAKnE,E,EAMhB,OADAhH,QAAQC,IAAI,mDAAoDuI,GACzDA,CACR,CAEQ,6BAAA6B,CAA8BxE,GACrC7F,QAAQC,IAAI,iCACZ,MAEMmL,EAAwC,GAExCC,EAJqC9M,KAAKsL,mBAAmB/L,KAIlCuN,SACjC,GAAIA,EACH,IAAK,IAAIC,KAAWzF,EAAU,CAC7B,IAAI0F,EAAwBF,EAASC,EAAQT,eAC7C,GAAIU,EAAQ,CAEX,MAAMC,EAAe7I,OAAO5E,OAAOwN,GAAQE,SAAQf,GAAKzC,MAAMyD,MAAMhB,KACpEU,EAA4BD,QAAQK,E,EAMvC,OADAxL,QAAQC,IAAI,uEAAwEmL,GAC7EA,CACR,EA3GgB,EAAArF,KAAO,sC,iCCCjB,MAAM4F,EAGZ,WAAAtN,CAAYuN,GAiBJ,KAAAC,cAAwB,EAhB/BtN,KAAKuN,WAAaF,EAClBrN,KAAKuN,WAAWlN,UACjB,CAEO,aAAMyC,CAAQF,GACpBnB,QAAQC,IAAI,0BAA2BkB,GACnC5C,KAAKuN,kBACFvN,KAAKuN,WAAWjN,aAGvBN,KAAKuN,WAAa3K,EACd5C,KAAKuN,kBACFvN,KAAKuN,WAAWlN,UAExB,CAIO,iBAAMK,CAAYD,GACxBT,KAAKsN,cAAgB7M,EAAM+M,UAEvBxN,KAAKuN,kBACFvN,KAAKuN,WAAW7M,YAAYD,EAEpC,CAEO,eAAME,CAAUF,GAElBA,EAAM+M,UAAYxN,KAAKsN,cAAgB,KACtCtN,KAAKuN,kBACFvN,KAAKuN,WAAW3M,QAAQH,GAI5BT,KAAKuN,kBACFvN,KAAKuN,WAAW5M,UAAUF,EAElC,CAEO,mBAAMD,CAAcC,GACtBT,KAAKuN,kBACFvN,KAAKuN,WAAW/M,cAAcC,EAEtC,CAEO,oCAAOgN,CAA8BC,EAAwBC,GACnED,EAAUE,iBAAiB,aAAarC,MAAO9K,GAAqBkN,EAAgBjN,YAAYD,KAChGiN,EAAUE,iBAAmB,WAAWrC,MAAO9K,GAAqBkN,EAAgBhN,UAAUF,KAC9FiN,EAAUE,iBAAiB,YAAYrC,MAAO9K,GAAqBkN,EAAgBnN,cAAcC,IAClG,E,gDCjDM,MAAMoN,EAEZ,WAAA/N,CAAoBgO,EAA4BxJ,EAAuCyJ,GAAnE,KAAAD,GAAAA,EAA4B,KAAAxJ,YAAAA,EAAuC,KAAAyJ,gBAAAA,CACvF,CAEA,cAAM1N,GACDL,KAAKsE,cACRtE,KAAKsE,YAAYlE,SAAU,EAC7B,CAEA,gBAAME,GACDN,KAAKsE,cACRtE,KAAKsE,YAAYlE,SAAU,GAE5BJ,KAAKsE,YAAY0J,MAAM,MACvBhO,KAAKsE,YAAY0J,MAAM,KACxB,CAEA,mBAAMxN,CAAcC,GACpB,CAEA,iBAAMC,CAAYD,GAClB,CAEA,eAAME,CAAUF,GAChB,CAEA,aAAMG,CAAQH,GACb,MAAMwN,IAAwBxN,EAAMc,QACpCE,QAAQC,IAAI,UAAWjB,EAAMc,SACR,IAAjBd,EAAMI,cACHgN,EAAoBK,iBAAiBlO,KAAKsE,YAActE,KAAK8N,GAAI9N,KAAK+N,gBAAiBE,EAE/F,CAEQ,6BAAaC,CAAiB5J,EAA+BwJ,EAAoBK,EAAuBF,G,cAO/G,MAAMG,QAA6D9J,EAAY+J,UAAU,MAN3D,GAO9B5M,QAAQC,IAAI,cAAe0M,GAC3B,MAAME,EAAyBhK,EAAYiK,UAAU,MAGrD,GAFA9M,QAAQC,IAAI,kBAAmB4M,IAE1BF,EAEJ,YADA3M,QAAQC,IAAI,cAcb,MAAM8M,EAAwBC,OAAOL,EAAI3F,IAEnCiG,EAAatK,OAAOC,KAAK+J,EAAIO,WAAW,GACxCC,EAAuC,QAAN,EAAAd,EAAGlJ,WAAG,eAAErF,KAAKD,IAAIoP,GAClD7C,EAAoC+C,aAAQ,EAARA,EAAU/C,MAC9CG,EAAmCH,aAAK,EAALA,EAAOI,qBAC1C4C,EAA6C7C,EAAQA,EAAMwC,QAAiB5F,EAElF,IACC,MAAMkG,EAA6C,QAA1B,EAAmB,QAAnB,EAAAD,aAAc,EAAdA,EAAgBE,WAAG,eAAErP,aAAK,QAAI,iBACjDsP,EAAqBH,aAAc,EAAdA,EAAgBI,KAGrCC,EAAM,CAACV,gBAAeM,WAAUE,aAAYG,YAFE,QAAxB,EAAAN,aAAc,EAAdA,EAAgBO,gBAAQ,eAAE1P,MAES2P,QADnB,QAApB,EAAAR,aAAc,EAAdA,EAAgBS,YAAI,eAAE5P,OAG9C+B,QAAQC,IAAIwN,GACZlP,KAAKuP,sBAAsBpB,EAAMG,EAASR,EAAIoB,E,CAC7C,MAAOM,GACR/N,QAAQoH,KAAK2G,EAAGX,E,CAElB,CAEQ,4BAAOU,CACdpB,EACAG,EACAR,EACAoB,GAQA,MAAMO,GAAU,QAAkBnB,GAClC7M,QAAQC,IAAI,0BAA2B+N,GACvCtB,EAAKuB,QAAQ,8BAA+B,CAC3CjP,MAAO,mBACPkD,UAAW8L,GAEb,E,oEC3FM,MAAME,UAA6B,KAMzC,WAAA7P,CAAYC,GACX6G,MAAM7G,GAHC,KAAA6P,YAAuC,IAAI7I,IAOhD,KAAA8I,WAAyB,IAAI,KAE7B,KAAAzP,SAAmB,EAUd,KAAAwH,qBAA8C,IAAIb,IAIlD,KAAAI,QAAU,GAnBjBpH,EAAWsB,IAAIsO,EAAqBnI,KAAMxH,KAC3C,CAKA,SAAIG,GACH,OAAOH,KAAK8P,MACb,CAEA,SAAI3P,CAAMT,GACTM,KAAK8P,OAASpQ,CACf,CAcO,0BAAAqQ,CAA2BC,G,QAQjC,GANAhQ,KAAKiQ,oBAAsB,IAAI,MAAoB,CAClD7I,aAAa,EACbD,QAASnH,KAAKmH,QACdE,YAAY,KAGRrH,KAAK8P,OACT,MAAM,IAAI/K,MAAM,iBAGjB/E,KAAK4H,qBAAuB,IAAIb,IAEhC,IAAK,IAAImJ,KAAQF,EAAe,CAG/B,IAAIG,EAAuB,IAAIzG,MAC/B,IAAK,MAAMH,KAAY2G,EAAK9G,KAAKG,SAChC4G,EAAqBA,EAAqBvM,QAAU5D,KAAKoQ,0BAA0B7G,GAIpF,IAAI8G,EAAkB,IAAI,KAASH,EAAK9G,KAAKkH,SAAUH,EAAsB,GAC7EE,EAAMjH,KAAKmH,cAAgBL,EAAK9G,KAAKmH,cAGrC,IAAIC,EAA2B,GAC/B,IAAK,MAAMC,KAAOP,EAAKQ,IAAK,CAC3B,MAAMC,EAAOT,EAAK5Q,IAAImR,GACtB,IAAIG,EAAc,CAAEnI,GAAIkI,EAAKlI,GAAIoI,WAAY,GAAIC,OAAQ,IACzD,IAAK,MAAMC,KAAKJ,EAAKE,WACpBD,EAAMC,WAAYD,EAAMC,WAAYjN,QAAUmN,EAAEC,QAGjD,GAAKL,EAAKG,OAAV,CAEA,IAAK,MAAMG,KAAKN,EAAKG,OACpBF,EAAME,OAAQF,EAAME,OAAQlN,QAAUqN,EAAED,QAEzCR,EAAiBA,EAAiB5M,QAAUgN,CALlB,C,CAO3BP,EAAMhP,IAAImP,GAGVH,EAAMxE,MAAQqE,EAAKrE,MACnBwE,EAAMa,eAAc,GACpBlR,KAAK4H,qBAAqBlC,IAAIwK,EAAKzH,GAAI4H,GAGvCA,EAAMjH,KAAKY,eAAgB,EAGhB,QAAX,EAAAhK,KAAK8P,cAAM,SAAEnQ,MAAMC,MAAMyB,IAAIgP,EAAMjH,MACxB,QAAX,EAAApJ,KAAK8P,cAAM,SAAEqB,OAAO9P,IAAIgP,EAAMjH,K,CAGhC,CAOQ,yBAAAgH,CAA0B7G,GAIhC,OAAOvJ,KAAKiQ,mBAqBd,CAQO,sBAAA/E,CAAuBkG,EAA8BhK,G,MAE3D,IAAK,MAAMsH,KAAc0C,EAAe,CACvC,IAAIpR,KAAK4H,qBAAqByJ,IAAI3C,GAKjC,MAAM,IAAI3J,MAAM,YAAc2J,EAAa,cALG,CAC9C,MAAMgC,EAAM,IAAKU,EAAc1C,IACU,QAAzC,EAAA1O,KAAK4H,qBAAqBtI,IAAIoP,UAAW,SAAEwC,cAAc9J,EAAasJ,E,EAOzE,CAEO,2BAAAY,CAA4BC,EAA4BnK,GAC9D,MAAMgK,EAAgBG,EAAWH,cAE3BI,EAA6B,GAEnC,IAAK,MAAM9C,KAAc0C,EACxB,GAAIpR,KAAK4H,qBAAqByJ,IAAI3C,GAAa,CAC9C,MAAMgC,EAAM,IAAKU,EAAc1C,IACQ1O,KAAK4H,qBAAqBtI,IAAIoP,GAEhDwC,cAAc9J,EAAasJ,E,MAGhDc,EAAiB5E,KAAK8B,GAIpB8C,EAAiB5N,OAAS,GAC7BnC,QAAQoH,KAAK,uBAAwB2I,EAEvC,CAGO,WAAAC,GACN,IAAK,MAAMnI,KAAYtJ,KAAK4H,qBAAqBpI,SAChD,IACC8J,EAASoI,Y,CAEV,MAAOC,G,CAIT,CAMO,qBAAAC,CAAsBxK,GAC5B,IAAK,MAAO,CAAE8I,KAASlQ,KAAK4H,qBAC3BsI,EAAKgB,cAAc9J,EAErB,CAEO,OAAAuE,G,QACN,MAAMkG,EAAqB7R,KAAKD,WAAWT,IAAI,MAEzCwS,EAA6C9R,KAAK4H,qBACxD,IAAK,MAAMmK,KAAOD,EAAqB,CACtC,IAAI5B,EAAO4B,EAAoBxS,IAAIyS,GAC9B7B,IAEM,QAAX,EAAAlQ,KAAK8P,cAAM,SAAEnQ,MAAMC,MAAMoS,OAAO9B,EAAK9G,MAC1B,QAAX,EAAApJ,KAAK8P,cAAM,SAAEqB,OAAO3P,OAAO0O,EAAK9G,MAChCyI,EAASI,QAAQ/B,EAAK9G,MACtB8G,EAAKvE,UACLmG,EAAoBtQ,OAAOuQ,G,CAE7B,CAEA,uBAAAG,CAAwBd,EAA8BhK,GAGnCsC,MAAMC,KAAK3J,KAAK4H,qBAAqBpI,UAC7CsK,SAAQqI,GAAKA,EAAEjB,cAAc9J,KAGvC,IAAK,MAAMsH,KAAc0C,EAAe,CACvC,IAAIpR,KAAK4H,qBAAqByJ,IAAI3C,GAMjC,MAAM,IAAI3J,MAAM,YAAY2J,eANkB,CAC9C,MAAMgC,EAAM,IAAKU,EAAc1C,IACzBpF,EAAWtJ,KAAK4H,qBAAqBtI,IAAIoP,GAE/CpF,SAAAA,EAAU4H,eAAe9J,EAAasJ,E,EAOzC,EA9Ne,EAAAlJ,KAAe,sC","sources":["webpack://client-app/./src/app/project/ifc-fun/OpenBimHandles.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/LengthMeasureTool.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/CropTool.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/AreaMeasureTool.ts","webpack://client-app/./src/app/project/ifc-fun/OpenBimViewerThreeDService.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/IfcSpaceVisibility.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/IfcTypeFilter.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/ModeToolHandler.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/ObjectSelectionTool.ts","webpack://client-app/./src/app/project/ifc-fun/Tools/TransparentFragments.ts"],"sourcesContent":["import { FragmentsGroup } from \"@thatopen/fragments\";\r\nimport {EgFragmentLoader} from \"./EgMessagePackLoader/EgFragmentLoader\";\r\nimport {OpenBimViewerThreeDService} from \"./OpenBimViewerThreeDService\";\r\nimport { RevitMap } from \"./openbim-container\";\r\nimport * as OBC from \"@thatopen/components\";\r\nimport * as OBCF from \"@thatopen/components-front\";\r\nimport * as THREE from \"three\";\r\n\r\nexport class OpenBimHandles {\r\n\t/* JG: Denne klasse kan ogsaa opfattes \r\n\tsom et 'openBim SCOPE' eller en 'openBim CONTEXT'.\r\n\t Brugs-intentionen er følgende:\r\n\tEt parent/hosting objekt laver en instans af den,\r\n\tog styrer derved lifetime/lifecycle for det openBim-scope.\r\n\r\n\tDerudover videregiver den dette scope-objekt\r\n\ttil diverse nestede conceptuelle children.\r\n\tDels aurelia element/component children,\r\n\thvor den kan 'passe' ved at binde egenskaben som en input-parameter på det child.\r\n\tAlternativt ved direkte at assigne/kalde metoder,\r\n\tpå children den selv har referencer til.\r\n\t Det fungerer, idet det er en objekt-reference.\r\n\tDerved er det ikke så skrøbeligt som aurealias value-passing mekanisme for simple value bindings\r\n\t(e.g. af strings eller numbers), hvor vi oplever at ændringer i den bundne værdi ikke altid reflekteres.\r\n\t Det hjælper også, \r\n\tat vi ikke er afhængige af OpenBimHandles i rendered views/DOM elementer\r\n\t(ie vi har ikke behov for, at disse re-renderes.)\r\n\t*/\r\n\tcomp: OBC.Components | undefined;\r\n\tmgr: OBC.FragmentsManager | undefined;\r\n\tloader: OBC.IfcLoader | undefined;\r\n\tmpkLoader: EgFragmentLoader | undefined;\t// Loader for the message pack format\r\n\thighlighter: OBCF.Highlighter | undefined; // in-for openbim-container. MAY NOT BE NECESSARY, instead we could request it from COMPONENTS? \r\n\r\n\t// fixme, should be robust for >1 model/revision loaded!\r\n\ttheModel: FragmentsGroup | undefined;\r\n\r\n\topenbimViewerThreeDService: OpenBimViewerThreeDService|undefined;\r\n\r\n\ttmpRevitMap:RevitMap = {};\r\n\tworld: OBC.World | undefined;\r\n}\r\n\r\nexport function getFirstThreeScene(comp: OBC.Components): THREE.Scene {\r\n\tconst worlds: OBC.Worlds = comp.get(OBC.Worlds);\r\n\tconst world: OBC.World = worlds.list.values().next().value!;\r\n\tconst THREE_scene: THREE.Scene = world.scene.three;\r\n\treturn THREE_scene;\r\n}\r\n","import * as OBC from \"@thatopen/components\";\r\nimport * as OBCF from \"@thatopen/components-front\";\r\nimport {ModeTool} from \"./ModeTool\";\r\n\r\nexport class LengthMeasureTool implements ModeTool {\r\n\r\n\tprivate dimensions: OBCF.LengthMeasurement;\r\n\r\n constructor(private components: OBC.Components) {\r\n\t\tthis.dimensions = this.components.get(OBCF.LengthMeasurement);\r\n\t\tthis.dimensions.snapDistance = 1;\r\n\t\tthis.dimensions.world = this.components.get(OBC.Worlds).list.values().next().value;\r\n\t\tthis.dimensions.enabled = false;\r\n\t}\r\n\r\n\tasync activate(): Promise {\r\n\t\tthis.dimensions.enabled = true;\r\n\t\tconst world = this.components.get(OBC.Worlds).list.values().next().value;\r\n\t\tthis.dimensions.world = world;\r\n\t}\r\n\r\n\tasync deactivate(): Promise {\r\n\t\tthis.dimensions.enabled = false;\r\n\t\tthis.dimensions.deleteAll();\r\n\t}\r\n\r\n\tasync onDoubleClick(event: MouseEvent): Promise {\r\n\t}\r\n\t\r\n\tasync onMouseDown(event: MouseEvent): Promise {\r\n\t}\r\n\r\n\tasync onMouseUp(event: MouseEvent): Promise {\r\n\t}\r\n\t\r\n\tasync onClick(event: MouseEvent): Promise {\r\n\t\tif (event.button === 0) { // Left mouse button \r\n\t\t\tthis.dimensions.create();\r\n\t\t}\r\n\t\telse if (event.button === 2) { // Right mouse button\r\n\t\t\tthis.dimensions.cancelCreation();\r\n\t\t}\r\n\t}\r\n}\r\n","import {ModeTool} from \"./ModeTool\";\r\nimport * as OBC from \"@thatopen/components\";\r\n\r\nexport class CropTool implements ModeTool {\r\n\tprivate clipper: OBC.Clipper;\r\n\tprivate enabled: boolean = false;\r\n\tprivate worlds: OBC.Worlds;\r\n\tprivate world: OBC.World | undefined;\r\n\t\r\n\tconstructor(private components: OBC.Components) {\r\n\t\tthis.clipper = components.get(OBC.Clipper)\r\n\r\n\t\tconst fragmentsManager: OBC.FragmentsManager = this.components.get(OBC.FragmentsManager);\r\n\t\tthis.worlds = this.components.get(OBC.Worlds);\r\n\t\t\r\n\t\tfragmentsManager.onFragmentsLoaded.add(_ => {\r\n\t\t\tconst world = this.worlds.list.values().next().value;\r\n\t\t\tthis.world = world;\r\n\t\t})\r\n\t}\r\n\t\r\n async onMouseDown(event: MouseEvent): Promise {\r\n\t}\r\n\tasync onMouseUp(event: Event): Promise {\r\n }\r\n\t\r\n\tasync onClick(event: MouseEvent): Promise {\r\n\t\t\r\n\t\t\r\n\t\tif (this.enabled && event.button === 0 && this.world) { // Left mouse button\r\n\t\t\tif (event.ctrlKey)\r\n\t\t\t\tthis.clipper.delete(this.world);\r\n\t\t\telse\r\n\t\t\t\tthis.clipper.create(this.world);\r\n\t\t}\r\n\t}\r\n\tasync onDoubleClick(event: Event): Promise {\r\n }\r\n\tasync activate(): Promise {\r\n\t\tconsole.log('croptool activate');\r\n\t\tthis.enabled = true;\r\n\t\tthis.clipper.enabled = true;\r\n\t\t//this.clipper.enabled = true;\r\n\t}\r\n\tasync deactivate(): Promise {\r\n\t\tconsole.log('croptool deactivate');\r\n\t\tthis.enabled = false;\r\n //this.clipper.enabled = false;\r\n }\r\n\t\r\n}\r\n","import * as OBC from \"@thatopen/components\";\r\nimport * as OBCF from \"@thatopen/components-front\";\r\nimport {ModeTool} from \"./ModeTool\";\r\n\r\nexport class AreaMeasureTool implements ModeTool {\r\n\r\n\tprivate areaMeasurement: OBCF.AreaMeasurement;\r\n\r\n constructor(private components: OBC.Components) {\r\n\t\tthis.areaMeasurement = components.get(OBCF.AreaMeasurement);\r\n\t\tthis.areaMeasurement.world = this.components.get(OBC.Worlds).list.values().next().value;\r\n\t\tthis.areaMeasurement.enabled = false;\r\n\t}\r\n\r\n\tasync activate(): Promise {\r\n\t\tthis.areaMeasurement.enabled = true;\r\n\t}\r\n\r\n\tasync deactivate(): Promise {\r\n\t\tthis.areaMeasurement.enabled = false;\r\n\t\tthis.areaMeasurement.deleteAll();\r\n\t}\r\n\r\n\tasync onDoubleClick(event: MouseEvent): Promise {\r\n\t}\r\n\t\r\n\tasync onMouseDown(event: MouseEvent): Promise {\r\n\t}\r\n\r\n\tasync onMouseUp(event: MouseEvent): Promise {\r\n\t}\r\n\t\r\n\tasync onClick(event: MouseEvent): Promise {\r\n\t\tif (event.button === 0) { // Left mouse button \r\n\t\t\tthis.areaMeasurement.create();\r\n\t\t\tconsole.log('AreaMeasureTool create');\r\n\t\t}\r\n\t\telse if (event.button === 2) { // Right mouse button\r\n\t\t\tthis.areaMeasurement.endCreation();\r\n\t\t\tconsole.log('AreaMeasureTool endCreation');\r\n\t\t}\r\n\t}\r\n}\r\n","import {ToolEnum, ViewerThreeDServiceIF} from \"app/services/ViewerThreeDServiceIF\";\r\nimport * as OBC from \"@thatopen/components\";\r\nimport {ModeToolHandler} from \"./Tools/ModeToolHandler\";\r\nimport {LengthMeasureTool} from \"./Tools/LengthMeasureTool\";\r\nimport {ObjectSelectionTool} from \"./Tools/ObjectSelectionTool\";\r\nimport {VisibilityTool} from \"./Tools/VisibilityTool\";\r\nimport {CropTool} from \"./Tools/CropTool\";\r\nimport {AreaMeasureTool} from \"./Tools/AreaMeasureTool\";\r\nimport {ObjectIDsIF, RevitMap} from \"./openbim-container\";\r\nimport {FragmentIdMap, FragmentsGroup} from \"@thatopen/fragments\";\r\nimport {openbim_highlightOnIDs} from \"./openbim-highlighter\";\r\nimport {OpenBimHandles} from \"./OpenBimHandles\";\r\nimport {Box3, Sphere} from \"three\";\r\nimport {InstanceColorDataCollection} from \"../../models/color-legend-dto\";\r\nimport {BoundingBoxUtility} from \"./Utilities/BoundingBoxUtility\";\r\nimport {ColorLegendHandler} from \"./Utilities/ColorLegendHandler\";\r\n\r\n/**\r\n * Facade class for viewer functionality.\r\n */\r\nexport class OpenBimViewerThreeDService implements ViewerThreeDServiceIF {\r\n\tprivate readonly objectSelectionTool: ObjectSelectionTool;\r\n\tprivate readonly lengthMeasureTool: LengthMeasureTool;\r\n\tprivate readonly areaMeasureTool: AreaMeasureTool;\r\n\tprivate readonly cropTool: CropTool;\r\n\t\r\n\tprivate readonly visibilityTool: VisibilityTool;\r\n\tprivate readonly boundingBoxUtility: BoundingBoxUtility;\r\n\t\r\n\tpublic readonly colorLegendHandler: ColorLegendHandler;\r\n\r\n\tconstructor(private toolHandler: ModeToolHandler, private openBimHandles: OpenBimHandles, objectSelectionTool: ObjectSelectionTool) {\r\n\t\tconst components = openBimHandles.comp!;\r\n\t\tthis.objectSelectionTool = objectSelectionTool;\r\n\t\tthis.lengthMeasureTool = new LengthMeasureTool(components);\r\n\t\tthis.areaMeasureTool = new AreaMeasureTool(components);\r\n\t\tthis.cropTool = new CropTool(components);\r\n\r\n\t\tthis.visibilityTool = components.get(VisibilityTool);\r\n\t\tthis.boundingBoxUtility = new BoundingBoxUtility(openBimHandles);\r\n\t\tthis.colorLegendHandler = new ColorLegendHandler(components);\r\n\t}\r\n\t\r\n\tasync changeSelectedTool(tool: ToolEnum) {\r\n\t\tconsole.log('OpenBimViewerThreeDService.changeSelectedTool', tool);\r\n\t\tswitch (tool) {\r\n\t\t\tcase ToolEnum.ObjectSelection:\r\n\t\t\t\tawait this.toolHandler.setTool(this.objectSelectionTool);\t// Object selection is always on\r\n\t\t\t\tbreak;\r\n\t\t\tcase ToolEnum.LengthMeasure:\r\n\t\t\t\tawait this.toolHandler.setTool(this.lengthMeasureTool);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ToolEnum.AreaMeasure:\r\n\t\t\t\tawait this.toolHandler.setTool(this.areaMeasureTool);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ToolEnum.CropTool:\r\n\t\t\t\tawait this.toolHandler.setTool(this.cropTool);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\tasync hideAllObjects() { \r\n\t\tawait this.visibilityTool.hideAll();\r\n\t}\r\n\tasync transluteAllObjects() {\r\n\t\tawait this.visibilityTool.transluteAll();\r\n\t}\r\n\tasync showAllObjects() {\r\n\t\tawait this.visibilityTool.showAll();\r\n\t}\r\n\tasync handleSpaces(shouldShowSpaces: boolean) { \r\n\t\tawait this.visibilityTool.setIfcSpaceVisibility(shouldShowSpaces);\r\n\t\tconsole.log('OpenBimViewerThreeDService.handleSpaces', shouldShowSpaces);\r\n\t}\r\n\r\n\tasync selectObjects(objectIds: ObjectIDsIF): Promise {\r\n\t\tconsole.log('findObjectsToHandle, #express:', objectIds.objectIds.length,'#revit:', objectIds.revitObjectIds.length);\r\n\t\tthis.checkRevitStatus(objectIds);\r\n\t\tconst listOfObjectNRs: number[] = objectIds.objectIds;\r\n\t\tconst fragModel:FragmentsGroup = this.openBimHandles?.theModel!; //OpenbimContainer.theModel!; // let's party..\r\n\t\tconst fragmentMapToSelect_new:FragmentIdMap = fragModel.getFragmentMap(listOfObjectNRs);\r\n\r\n\t\t/* one way we could solve transitive selection in IFC for openBim,\r\n\t\twould be to compare the input list listOfObjectNRs,\r\n\t\twhich the actually occuring expressIDs in its output 'fragmentMapToSelect_new'.\r\n\t\tThose input IDs NOT occuring, are those we need to\r\n\t\tdo transitive selection for.\r\n\t\t Alternatively, we will probably make it BL/domain based (ie exploiting knowledge of the actual\r\n\t Revit entity inter-relationships, for e.g. CurtainWalls. )\r\n\t\t*/\r\n\r\n\r\n\t\tconst mapSize:number = Object.keys(fragmentMapToSelect_new).length;\r\n\t\tconsole.log('OpenBim_ViewerObjectInfoService.findObjectsToHandle', listOfObjectNRs,\r\n\t\t\t'sel-frag-map #:', mapSize);\r\n\t\t// FragmentsGroup.getFragmentMap and pass a set/array of expressIDs.\r\n\t\t//let fragmentMapToSelect_old:OBC.FragmentIdMap = {};\r\n\t\t//for (const expressId of listOfObjectNRs) { this.addElmToSelMap(expressId, fragmentMapToSelect_old, fragModel); }\r\n\r\n\t\tconst highlighter = this.openBimHandles!.highlighter!;\r\n\t\topenbim_highlightOnIDs(highlighter, fragmentMapToSelect_new);\r\n\t}\r\n\r\n\tcheckRevitStatus(objectIds: ObjectIDsIF) {\r\n\t\tconst revitMap:RevitMap = this.openBimHandles?.tmpRevitMap!;\r\n\r\n\t\tfor (let revitElmId of objectIds.revitObjectIds) {\r\n\t\t\tif (!revitElmId) { console.log('ignoring empty revitElmId:', revitElmId); continue; }\r\n\t\t\tif (!(revitElmId in revitMap)) { console.log('revitElmId not in map:', revitElmId); continue; }\r\n\t\t\tconst expressIDs:number[] = revitMap[revitElmId];\r\n\t\t\tif (expressIDs.length <= 1) { console.log('just a single expressID for revitElmId:', revitElmId, expressIDs); continue; }\r\n\t\t\tconsole.log('interesting - multiple expressIDs for revitElmId:', revitElmId, expressIDs);\r\n\t\t}\r\n\t}\r\n\r\n\tasync lookAtObjects(objectIds: ObjectIDsIF): Promise {\t\t\r\n\t\tconst camera = this.openBimHandles.world?.camera;\r\n\t\tif (!camera) { return; }\r\n\r\n\t\t// Only supports a single model per scene\r\n\t\tif (this.openBimHandles.mgr!.groups.size !== 1) {\r\n\t\t\tthrow new Error('Only a single model is supported for lookAtObjects');\r\n\t\t}\r\n\r\n\t\tconst firstFragmentGroup = this.openBimHandles.mgr!.groups.values().next().value;\r\n\t\tconst fragmentIdToItemIdMap: FragmentIdMap = firstFragmentGroup!.getFragmentMap(objectIds.objectIds);\r\n\t\tconst boundingBox: Box3 = this.boundingBoxUtility.getBoundingBoxForItems(fragmentIdToItemIdMap);\r\n\r\n\t\t// Move the camera to the calculated position\r\n\t\tcamera.controls.fitToSphere(boundingBox!.getBoundingSphere(new Sphere()), true)\r\n\t\t\t.then(r => console.log('fitToBox:', r));\r\n\t}\r\n\r\n\tasync hideObjects(objectIds: ObjectIDsIF): Promise {\r\n\t\tconsole.log('OBV3DS.hideObjects');\r\n\t\tconst idMap = this.openBimHandles?.theModel!.getFragmentMap(objectIds.objectIds);\r\n\t\tthis.openBimHandles?.comp?.get(OBC.Hider).set(false, idMap);\r\n\t}\r\n\r\n\tasync showObjects(objectIds: ObjectIDsIF): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync transluteObjects(objectIds: ObjectIDsIF): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync hideOthers(objectIds: ObjectIDsIF): Promise {\r\n\t\tawait this.showAllObjects();\r\n\t\tconst idMap = this.openBimHandles?.theModel!.getFragmentMap(objectIds.objectIds);\r\n\t\t// Hide all objects except the selected ones\r\n\t\tthis.openBimHandles?.comp?.get(OBC.Hider).isolate(idMap!); // Not \"isolate\" like the transparency feature\r\n\t}\r\n\t\r\n\tasync transluteOthers(selectedObjectIds: ObjectIDsIF): Promise {\r\n\t\tawait this.showAllObjects();\r\n\t\tawait this.resetColorInstances();\r\n\t\tawait this.visibilityTool.transluteOthers(selectedObjectIds);\r\n\t}\r\n\r\n\t// color-menus/actions:\r\n\tasync colorInstances(colorData: InstanceColorDataCollection): Promise {\r\n\t\tawait this.colorLegendHandler.colorInstances(colorData);\r\n\t}\r\n\r\n\tasync resetColorInstances(): Promise {\r\n\t\tawait this.colorLegendHandler.resetColorInstances();\r\n\t\tawait this.showAllObjects();\r\n\t}\r\n\r\n\tasync showColorGroup(groupName: string): Promise {\r\n\t\tawait this.colorLegendHandler.showGroup(groupName);\r\n\t}\r\n\t\r\n\tasync transluteColorGroup(groupName: string): Promise {\r\n\t\tawait this.colorLegendHandler.transluteGroup(groupName);\r\n\t}\r\n\t\r\n\tasync hideColorGroup(groupName: string): Promise {\r\n\t\tawait this.colorLegendHandler.hideGroup(groupName);\r\n\t}\r\n}\r\n\r\n","import * as OBC from '@thatopen/components';\r\nimport * as OBCF from '@thatopen/components-front';\r\nimport {FragmentIdMap, FragmentMesh, FragmentsGroup, IfcProperties} from \"@thatopen/fragments\";\r\nimport {FragmentSource} from \"../openbim-container\";\r\nimport {IfcTypeFilter} from \"./IfcTypeFilter\";\r\nimport {Color, Material, Matrix4, MeshBasicMaterial, Quaternion, Vector3} from \"three\";\r\nimport {TransparentFragments} from \"./TransparentFragments\";\r\n\r\n/**\r\n * This class is responsible for the visibility of the IFC Spaces in the model.\r\n * It uses the FragmentHighlighter class for showing the spaces to make sure only the IfcSpaces are shown in the IfcSpace color.\r\n */\r\nexport class IfcSpaceVisibility extends OBC.Component {\r\n\tprivate aaaa_markUs:string = 'IfcSpaceVisibility'; // a property to let us recognise proper instances of IfcSpaceVisibility.\r\n\r\n\tstatic readonly uuid = \"37d34cf0-9c6b-48ec-85e9-f5c44ef5b90b\";\r\n\r\n\tprivate typeFilter: IfcTypeFilter;\r\n\r\n\tprivate fragmentGroupIdToSource: Map = new Map();\r\n\tprivate classifier: OBC.Classifier;\r\n\r\n\tprivate spaceColor = new Color(0xffd500);\r\n\tprivate spaceMaterial: Material = new MeshBasicMaterial({\r\n\t\tcolor: this.spaceColor,\t// Yellow\r\n\t\topacity: 0.2,\r\n\t\ttransparent: true,\r\n\t\tdepthWrite: false\r\n\t})\r\n\tprivate fragmentGroup: FragmentsGroup | undefined;\r\n\tprivate readonly hider: OBC.Hider;\r\n\tprivate readonly transparentFragments: TransparentFragments;\r\n\r\n\tconstructor(components: OBC.Components) {\r\n\t\tsuper(components);\r\n\t\tcomponents.add(IfcSpaceVisibility.uuid, this);\r\n\t\t\r\n\t\tthis.typeFilter = components.get(IfcTypeFilter);\r\n\t\tthis.hider = this.components.get(OBC.Hider);\r\n\t\tthis.classifier = this.components.get(OBC.Classifier);\r\n\t\tthis.transparentFragments = this.components.get(TransparentFragments);\r\n\t}\r\n\r\n\t// Do we support loading multiple models from differing sources?\r\n\r\n\tprivate ifcSpaces: FragmentIdMap | undefined;\r\n\r\n\tasync setup(fragmentsGroup: FragmentsGroup, source: FragmentSource, ifcSpaceVisibility: boolean): Promise {\r\n\t\tconsole.log('IfcSpaceVisibility.setup');\r\n\t\tif (source != FragmentSource.IFC && source != FragmentSource.MPK && source != FragmentSource.Unknown) {\r\n\t\t\tconst err = `ISV.setup, 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\tconst checker:number = this.setupImpl(fragmentsGroup, source, ifcSpaceVisibility);\r\n\t\tconsole.log('setupImpl returned:', checker);\r\n\r\n\t\tawait this.setIfcSpaceVisibility(ifcSpaceVisibility);\r\n\t}\r\n\r\n\tsetupImpl(fragmentsGroup: FragmentsGroup, source: FragmentSource, ifcSpaceVisibility: boolean): number {\r\n\t\tconsole.log('IfcSpaceVisibility.setupImpl');\r\n\t\r\n\t\tthis.fragmentGroupIdToSource.set(fragmentsGroup.id, source);\r\n\r\n\t\tconsole.log('calling getEntityLabelsForIfcTypes in IfcSpaceVisibility.setup');\r\n\t\tconst returnedResult:number[] = this.typeFilter.getEntityLabelsForIfcTypes(fragmentsGroup, this.ifcTypes, source);//setupImpl\r\n\t\tthis.ifcSpaceEntityLabels = returnedResult;\r\n\t\tconsole.log('after getEntityLabelsForIfcTypes returns,', 'RR:', returnedResult, 'this.ISEL:', this.ifcSpaceEntityLabels, 'THIS:', this);\r\n\r\n\t\tif (this.ifcSpaceEntityLabels == undefined) {\r\n\t\t\tconst err = 'ifcSpaceEntityLabels is undefined, in IfcSpaceVisibility.setup';\r\n\t\t\tconsole.warn(err);\r\n\t\t\tconsole.warn('typeFilter is:', this.typeFilter);\r\n\t\t\tconsole.warn('is our this-IfcSpaceVisibility OK?', this)\r\n\t\t\tthrow err;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tthis.ifcSpaces = fragmentsGroup.getFragmentMap(this.ifcSpaceEntityLabels);\r\n\t\t} catch (ex) { //https://jira.eg.dk/browse/AJC-3854\r\n\t\t\tconsole.warn('getFragmentMap failed');\r\n\t\t\tconsole.warn('ifcSpaceEntityLabels:', this.ifcSpaceEntityLabels);\r\n\t\t\tconsole.warn('fragmentsGroup:', fragmentsGroup);\r\n\t\t\tthrow ex; // rethrow.\r\n\t\t}\r\n\r\n\t\tthis.fragmentGroup = fragmentsGroup;\r\n\t\t\r\n\t\tthis.classifier.setColor(this.ifcSpaces, this.spaceColor);\r\n\t\t\r\n\t\tconst ifcSpaceFragmentIds: string[] = Object.keys(this.ifcSpaces);\r\n\t\tthis.fragmentGroup.traverse((mesh) => {\r\n\t\t\t\r\n\t\t\tif (!(mesh instanceof FragmentMesh))\r\n\t\t\t\treturn;\r\n\t\t\t\r\n\t\t\tif (ifcSpaceFragmentIds.includes(mesh.fragment.id)) {\r\n\t\t\t\tmesh.material = [this.spaceMaterial];\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\t\t// This has not effect when using highlights for some reason?\r\n\t\tthis.scaleIfcSpacesToAvoidFlickering(fragmentsGroup, source);\r\n\r\n\t\t//this.fragmentGroup?.items.forEach(fragment => fragment.setColor(this.spaceColor, this.ifcSpaceEntityLabels));\r\n\t\treturn 42;\r\n }\r\n\r\n\tprivate scaleIfcSpacesToAvoidFlickering(fragmentsGroup: FragmentsGroup, source: FragmentSource) {\r\n\t\t// Filter out the IFCSPACE fragments from the group\r\n\r\n\t\tif (this.ifcSpaces == null) {\r\n\t\t\tconsole.warn(\"Could not scale IFC Spaces to avoid flickering, as the fragment map is not set.\")\r\n\t\t\treturn\r\n\t\t}\r\n\t\t\r\n\t\tconst fragmentIds = Array.from(Object.keys(this.ifcSpaces));\r\n\r\n\t\tconst ifcSpaceFragments = fragmentsGroup.items.filter(fragment => {\r\n\t\t\treturn fragmentIds.includes(fragment.id);\r\n\t\t});\r\n\r\n\t\tifcSpaceFragments.forEach(fragment => {\r\n\t\t\tconst fragmentMesh = fragment.mesh;\r\n\t\t\tfragmentMesh.frustumCulled = false;\r\n\t\t\tconst scaleFactor = 0.99;\r\n\r\n\t\t\tconst itemIds: Set = this.ifcSpaces![fragment.id];\r\n\t\t\tfor (let itemId of itemIds) {\r\n\r\n\t\t\t\tconst instancesIDs = fragment.getInstancesIDs(itemId);\r\n\t\t\t\tif (instancesIDs == null) continue;\r\n\r\n\t\t\t\tfor (let instanceID of instancesIDs) {\r\n\t\t\t\t\tconst matrix = new Matrix4();\r\n\t\t\t\t\tfragmentMesh.getMatrixAt(instanceID, matrix);\r\n\r\n\t\t\t\t\tconst position = new Vector3();\r\n\t\t\t\t\tconst quaternion = new Quaternion();\r\n\t\t\t\t\tconst scale = new Vector3();\r\n\r\n\t\t\t\t\tmatrix.decompose(position, quaternion, scale);\r\n\t\t\t\t\tscale.multiplyScalar(scaleFactor);\r\n\r\n\t\t\t\t\tconst newMatrix = new Matrix4();\r\n\t\t\t\t\tnewMatrix.compose(position, quaternion, scale);\r\n\r\n\t\t\t\t\tfragmentMesh.setMatrixAt(instanceID, newMatrix);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfragmentMesh.instanceMatrix.needsUpdate = true;\r\n\t\t});\r\n\t}\r\n\r\n\tprivate ifcTypes = [\"IFCSPACE\"];\r\n\r\n\t/**\r\n\t * Set the visibility of the actual IFC Spaces. The \"highlighter\" IfcSpaces are not affected\r\n\t * @param shouldShowSpaces\r\n\t */\r\n\tasync setIfcSpaceVisibility(shouldShowSpaces: boolean) : Promise {\r\n\r\n\t\tif (this.ifcSpaces == null) {\r\n\t\t\tconsole.warn(\"Could not set IFC Space visibility, as the fragment map is not set.\")\r\n\t\t\treturn\r\n\t\t}\r\n\t\t\r\n\t\tif (shouldShowSpaces) {\r\n\t\t\tthis.hider.set(true, this.ifcSpaces);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.hider.set(false, this.ifcSpaces);\r\n\t\t}\r\n\r\n\t\tthis.transparentFragments.setTransparencyByIdMap(this.ifcSpaces, shouldShowSpaces);\r\n\t}\r\n\r\n\tenabled: boolean = true;\r\n\r\n\tpublic ifcSpaceEntityLabels: number[] = [];\r\n}\r\n\r\nexport interface VisibilityToolIF {\r\n\tshowOrHideIfcTypeForFragmentGroup(ifcTypes: string[], group: FragmentsGroup, show: boolean): void;\r\n}\r\n\r\nexport class MpkVisibility implements VisibilityToolIF {\r\n\tprivate typeFilter: IfcTypeFilter;\r\n\r\n\tconstructor(private components: OBC.Components) {\r\n\t\tthis.typeFilter = components.get(IfcTypeFilter);\r\n\t}\r\n\tshowOrHideIfcTypeForFragmentGroup(ifcTypes: string[], group: FragmentsGroup, show: boolean): void {\r\n\t\tconst fragmentHider: OBC.Hider = this.components.get(OBC.Hider);\r\n\r\n\t\tconst props: IfcProperties | undefined = group.getLocalProperties();\r\n\t\tif (!props)\r\n\t\t\treturn;\r\n\r\n\t\tlet itemIds: number[] | null = this.typeFilter.getEntityLabelsForIfcTypes(group, ifcTypes, FragmentSource.MPK);//MpkVisibility.showOrHideIfcTypeForFragmentGroup\r\n\r\n\t\tif (itemIds == null)\r\n\t\t\treturn;\r\n\r\n\t\tconst fragmentMap = group.getFragmentMap(itemIds);\r\n\t\t\r\n\t\tfragmentHider.set(show, fragmentMap);\r\n\t}\r\n}\r\n\r\nexport class IfcVisibility implements VisibilityToolIF {\r\n\tprivate typeFilter: IfcTypeFilter;\r\n\r\n\tconstructor(private components: OBC.Components) {\r\n\t\tthis.typeFilter = components.get(IfcTypeFilter);\r\n\t}\r\n\r\n\tshowOrHideIfcTypeForFragmentGroup(ifcTypes: string[], group: FragmentsGroup, show: boolean): void {\r\n\t\tconst fragmentHider: OBC.Hider = this.components.get(OBC.Hider);\r\n\r\n\t\tconst entityLabelsForIfcTypes: number[] = this.typeFilter.getEntityLabelsForIfcTypes(group, ifcTypes, FragmentSource.IFC);//IfcVisibility.showOrHideIfcTypeForFragmentGroup\r\n\t\tconst fragmentIdMapOfTypes: FragmentIdMap = group.getFragmentMap(entityLabelsForIfcTypes);\r\n\t\tfragmentHider.set(show, fragmentIdMapOfTypes);\r\n\t}\r\n}\r\n","import {FragmentIdMap, FragmentsGroup} from \"@thatopen/fragments\";\r\nimport * as OBC from \"@thatopen/components\";\r\nimport { FragmentSource } from \"../openbim-container\";\r\nimport {FragmentGroupMappings, IdMappingComponent} from \"../Utilities/IdMappingComponent\";\r\n\r\nexport class IfcTypeFilter extends OBC.Component {\r\n\r\n\tstatic readonly uuid = \"DA486451-6D04-4FC8-987F-F109BD99E365\";\r\n\r\n\tenabled: boolean = true;\r\n\r\n\tget(): void {\r\n\t\treturn;\r\n\t}\r\n\r\n\tprivate idMappingComponent: IdMappingComponent;\r\n\tprivate fragmentClassifier: OBC.Classifier;\r\n\r\n\tconstructor(components: OBC.Components) {\r\n\t\tsuper(components);\r\n\r\n\t\tconst fragmentManager = components.get(OBC.FragmentsManager);\r\n\t\tcomponents.add(IfcTypeFilter.uuid, this);\r\n\t\t\r\n\t\tthis.idMappingComponent = components.get(IdMappingComponent);\r\n\t\tthis.fragmentClassifier = components.get(OBC.Classifier);\r\n\t\t\r\n\t\tfragmentManager.onFragmentsLoaded.add(\r\n\t\t\tasync data => {\r\n\t\t\t\tconsole.log('IfcTypeFilter.onFragmentsLoaded', data.userData.source);\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\r\n\tasync afterModelLoad(fragmentsGroup: FragmentsGroup, source: FragmentSource): Promise {\r\n\t\tif (source !== FragmentSource.IFC) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.fragmentClassifier.dispose();\r\n\t\tthis.fragmentClassifier.byEntity(fragmentsGroup);\r\n }\r\n\r\n\tpublic getEntityLabelsForIfcTypes(group: FragmentsGroup, ifcTypes: string[], source: FragmentSource): number[] { // UB: \r\n\t\tconsole.log('IfcTypeFilter.getEntityLabelsForIfcTypes..', source); \r\n\t\tswitch (source) {\r\n\t\t\tcase FragmentSource.IFC:\r\n\t\t\t\tconsole.log('case IFC');\r\n\t\t\t\treturn this.getEntityLabelsForIfcTypesIfc(ifcTypes);\r\n\t\t\tcase FragmentSource.MPK:\r\n\t\t\t\tconsole.log('case MPK');\r\n\t\t\t\treturn this.getEntityLabelsForIfcTypesMpk(group, ifcTypes);\r\n\t\t\tcase FragmentSource.Unknown:\r\n\t\t\t\tconsole.log('case unknown');\r\n\t\t\t\tthrow \"Entity labels can't be retrieved for unknown source.\";\r\n\t\t\tdefault:\r\n\t\t\t\tconsole.log(`case messed-up:${source}`);\r\n\t\t\t\tthrow `FragmentSource messed-up: ${source}`;\r\n\t\t\t}\r\n\t}\r\n\r\n\tprivate getEntityLabelsForIfcTypesMpk(group: FragmentsGroup, ifcTypes: string[]): number[] {\r\n\t\tconsole.log('getEntityLabelsForIfcTypesMpk');\t\t\r\n\r\n\t\tconst props = group.getLocalProperties();\r\n\t\tif (!props) {\r\n\t\t\tconsole.log('getEntityLabelsForIfcTypesMpk, no props');\t\t\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tlet itemIds: number[] = [];\r\n\r\n\t\tlet entries = Object.values(props);\r\n\t\tlet matches = entries.filter(i => ifcTypes.some(x => x.toUpperCase() == i[\"ifcType\"]?.toUpperCase()));\r\n\t\tfor (let match of matches) {\r\n\t\t\tlet globalId = match[\"globalId\"];\r\n\t\t\tif (globalId) {\r\n\t\t\t\tconst fragmentGroupMappings: FragmentGroupMappings | undefined = this.idMappingComponent.getFromFragmentGroupId(group.id);\r\n\t\t\t\tif (!fragmentGroupMappings) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet id = fragmentGroupMappings.globalIdMapping.get(globalId);\r\n\t\t\t\tif (id) {\r\n\t\t\t\t\titemIds.push(id);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconsole.log('end of getEntityLabelsForIfcTypesMpk, itemIds is', itemIds);\r\n\t\treturn itemIds;\r\n\t}\r\n\r\n\tprivate getEntityLabelsForIfcTypesIfc(ifcTypes: string[]) : number[] {\r\n\t\tconsole.log('getEntityLabelsForIfcTypesIfc');\r\n\t\tconst classification: OBC.Classification = this.fragmentClassifier.list;\r\n\t\t\r\n\t\tconst allEntityLabelsOfGivenTypes: number[] = [];\r\n\r\n\t\tconst entities = classification!.entities;\r\n\t\tif (entities) {\r\n\t\t\tfor (let ifcType of ifcTypes) {\r\n\t\t\t\tlet entity: FragmentIdMap = entities[ifcType.toUpperCase()];\r\n\t\t\t\tif (entity) {\r\n\r\n\t\t\t\t\tconst entityLabels = Object.values(entity).flatMap(i => Array.of(...i));\r\n\t\t\t\t\tallEntityLabelsOfGivenTypes.push(...entityLabels);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tconsole.log('end of getEntityLabelsForIfcTypesIfc, allEntityLabelsOfGivenTypes is', allEntityLabelsOfGivenTypes);\r\n\t\treturn allEntityLabelsOfGivenTypes;\r\n\t}\r\n}\r\n","import {ModeTool} from \"./ModeTool\";\r\n\r\n/**\r\n * This class is responsible for handling the mode tools.\r\n * There are two kinds of tools. ModeTools and OneOffTools.\r\n * ModeTools are tools that are active until another tool is activated.\r\n * OneOffTools are tools that are active only for one event. These are implemented as functions elsewhere.\r\n */\r\nexport class ModeToolHandler {\r\n\tprivate activeTool: ModeTool;\r\n\t\r\n\tconstructor(defaultTool: ModeTool) {\r\n\t\tthis.activeTool = defaultTool;\r\n\t\tthis.activeTool.activate();\r\n\t}\r\n\t\r\n\tpublic async setTool(tool: ModeTool) {\r\n\t\tconsole.log('ModeToolHandler.setTool', tool)\r\n\t\tif (this.activeTool) {\r\n\t\t\tawait this.activeTool.deactivate();\r\n\t\t}\r\n\t\t\r\n\t\tthis.activeTool = tool;\r\n\t\tif (this.activeTool) {\r\n\t\t\tawait this.activeTool.activate();\r\n\t\t}\r\n\t}\r\n\t\r\n\tprivate lastClickTime: number = 0;\r\n\t\r\n\tpublic async onMouseDown(event: MouseEvent) {\r\n\t\tthis.lastClickTime = event.timeStamp;\r\n\t\t\r\n\t\tif (this.activeTool) {\r\n\t\t\tawait this.activeTool.onMouseDown(event);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic async onMouseUp(event: MouseEvent) {\r\n\t\t// Check if the click was fast enough to be considered a click.\r\n\t\tif (event.timeStamp - this.lastClickTime < 160) {\r\n\t\t\tif (this.activeTool) {\r\n\t\t\t\tawait this.activeTool.onClick(event);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif (this.activeTool) {\r\n\t\t\tawait this.activeTool.onMouseUp(event);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic async onDoubleClick(event: MouseEvent) {\r\n\t\tif (this.activeTool) {\r\n\t\t\tawait this.activeTool.onDoubleClick(event);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static setupToolEventsWithoutAurelia(container: HTMLElement, modeToolHandler: ModeToolHandler) {\r\n\t\tcontainer.addEventListener('mousedown', async (event:MouseEvent) => modeToolHandler.onMouseDown(event));\r\n\t\tcontainer.addEventListener( 'mouseup', async (event:MouseEvent) => modeToolHandler.onMouseUp(event));\r\n\t\tcontainer.addEventListener('dblclick', async (event:MouseEvent) => modeToolHandler.onDoubleClick(event));\r\n\t}\r\n}\r\n","import * as OBCF from \"@thatopen/components-front\";\r\nimport {EventAggregator} from \"aurelia-event-aggregator\";\r\nimport {Fragment, FragmentIdMap, FragmentsGroup, IfcProperties} from \"@thatopen/fragments\";\r\nimport {ModeTool} from \"./ModeTool\";\r\nimport {OpenBimHandles} from \"../OpenBimHandles\";\r\nimport {\r\n\tcollectIDsFromMap,\r\n\thoverName, // why import it if we are not using it?\r\n\tObjPropertySet,\r\n\tselectionHighlightName\r\n} from \"../openbim-highlighter\";\r\n\r\nexport class ObjectSelectionTool implements ModeTool {\r\n\r\n\tconstructor(private OB: OpenBimHandles, private highlighter: OBCF.Highlighter, private eventAggregator: EventAggregator) {\r\n\t}\r\n\r\n\tasync activate(): Promise {\r\n\t\tif (this.highlighter)\r\n\t\t\tthis.highlighter.enabled = true;\r\n\t}\r\n\r\n\tasync deactivate(): Promise {\r\n\t\tif (this.highlighter)\r\n\t\t\tthis.highlighter.enabled = false;\r\n\t\t\r\n\t\tthis.highlighter.clear(hoverName)\r\n\t\tthis.highlighter.clear(selectionHighlightName);\r\n\t}\r\n\r\n\tasync onDoubleClick(event: MouseEvent): Promise {\r\n\t}\r\n\r\n\tasync onMouseDown(event: MouseEvent): Promise {\r\n\t}\r\n\r\n\tasync onMouseUp(event: MouseEvent): Promise {\r\n\t}\r\n\t\r\n\tasync onClick(event: MouseEvent): Promise {\r\n\t\tconst isDeselect:boolean = (!!event.ctrlKey);\r\n\t\tconsole.log('onClick', event.ctrlKey);\r\n\t\tif (event.button === 0) { // Left mouse button \r\n\t\t\tawait ObjectSelectionTool.highlightOnClick(this.highlighter!, this.OB, this.eventAggregator, isDeselect);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate static async highlightOnClick(highlighter: OBCF.Highlighter, OB: OpenBimHandles, aggr: EventAggregator, isDeselect:boolean): Promise {\r\n\t\tlet singleSelection = {value: false}; //true };\r\n\t\t\r\n\t\t/* JG: OBCF.Highlighter is the component from ThatOpenCompany/OpenBim, which deals with selection, highlight, focus.\r\n\r\n\t\tTodo-fix-how: Hvordan faar man OBCF.Highlighter til at deselecte??\r\n\t\t*/\r\n\t\tconst sel: { id: number; fragments: FragmentIdMap } | null = await highlighter.highlight(selectionHighlightName, singleSelection.value);\r\n\t\tconsole.log('sel result:', sel);\r\n\t\tconst realSel: FragmentIdMap = highlighter.selection[selectionHighlightName];\r\n\t\tconsole.log('realsel result:', realSel);\r\n\r\n\t\tif (!sel) {\r\n\t\t\tconsole.log('(null sel)');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* We can find a revitTag by doing\r\n\t\t fragment.fragmentsGroup.[getLocalProperties[expressId]]/objPropertySet.Tag.value\r\n\t\t But we must do it for the proper/relevant expressIDs.\r\n\t\t So, we need to find fragmentGroups.\r\n\r\n\t\t We could do the work in remember_ModelInformation(),\r\n\t\t ie we pass that way when we get a new fragmentsGroup model.\r\n\t\t We should look at fragmentsGroup.objProperties.\r\n\t\t*/\r\n\r\n\t\tconst sel_expressId: number = Number(sel.id);\r\n\r\n\t\tconst fragmentId = Object.keys(sel.fragments)[0];\r\n\t\tconst someFrag: Fragment | undefined = OB.mgr?.list.get(fragmentId);\r\n\t\tconst group: FragmentsGroup | undefined = someFrag?.group;\r\n\t\tconst props: IfcProperties | undefined = group?.getLocalProperties();\r\n\t\tconst objPropertySet: ObjPropertySet | undefined = props ? props[sel_expressId] : undefined; // https://standards.buildingsmart.org/IFC/RELEASE/IFC4_1/FINAL/HTML/schema/templates/property-sets-for-objects.htm\r\n\r\n\t\ttry {\r\n\t\t\tconst revitTag: string = objPropertySet?.Tag?.value ?? '(no Tag field)';\r\n\t\t\tconst ifcTypeNum: number = objPropertySet?.type;\r\n\t\t\tconst ifcGlobalId: string = objPropertySet?.GlobalId?.value;\r\n\t\t\tconst ifcName: string = objPropertySet?.Name?.value;\r\n\t\t\tconst inf = {sel_expressId, revitTag, ifcTypeNum, ifcGlobalId, ifcName};\r\n\t\t\t//console.table(inf);\r\n\t\t\tconsole.log(inf);\r\n\t\t\tthis.send_ElmsSelect_Event(aggr, realSel, OB, inf);//highlightOnClick\r\n\t\t} catch (s) {\r\n\t\t\tconsole.warn(s, objPropertySet);\r\n\t\t}\r\n\t}\r\n\t\r\n\tprivate static send_ElmsSelect_Event( // UB: highlightOnClick.\r\n\t\taggr: EventAggregator, // we need this one, so we can send messages.\r\n\t\trealSel: FragmentIdMap, // we need this one, to actually HAVE the current selection.\r\n\t\tOB: OpenBimHandles, // optional, not used, if-we-might-need-it.\r\n\t\tinf: { // other earlier hints for selection. Think of cases where we are not only using expressIDs, e.g. IfcGlobalId.\r\n\t\t\tsel_expressId: number,\r\n\t\t\trevitTag: string, //= objPropertySet?.Tag?.value ?? '(no Tag field)';\r\n\t\t\tifcTypeNum: number, //= objPropertySet.type;\r\n\t\t\tifcGlobalId: string, //= objPropertySet.GlobalId.value;\r\n\t\t\tifcName: string //= objPropertySet.Name.value;\r\n\t\t},\r\n\t) {\r\n\t\tconst asArray = collectIDsFromMap(realSel);\r\n\t\tconsole.log('A-expressIDs collected:', asArray);\r\n\t\taggr.publish('base-viewer-combined:select', { // for the benefit of pivot-grid-component, and PivotGridComponent.highlightMatchingRows().\r\n\t\t\tevent: 'no-event-for-you',\r\n\t\t\tobjectIds: asArray\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport class NoOpTool implements ModeTool {\r\n\tasync activate(): Promise {\r\n\t}\r\n\r\n\tasync deactivate(): Promise {\r\n\t}\r\n\r\n\tasync onDoubleClick(event: MouseEvent): Promise {\r\n\t}\r\n\r\n\tasync onMouseDown(event: MouseEvent): Promise {\r\n\t}\r\n\r\n\tasync onMouseUp(event: MouseEvent): Promise {\r\n\t}\r\n\t\r\n\tasync onClick(event: MouseEvent): Promise {\r\n\t}\r\n}\r\n","import {\r\n\tSimpleWorld,\r\n\tDisposer, Component, Disposable, Event, World, Components\r\n}\r\n\tfrom \"@thatopen/components\";\r\nimport {\r\n\tFragment,\r\n\tFragmentIdMap, FragmentsGroup,\r\n\tItem\r\n}\r\n\tfrom \"@thatopen/fragments\";\r\nimport {\r\n\tColor,\r\n\tMaterial, MeshBasicMaterial,\r\n\tMeshLambertMaterial,\r\n}\r\n\tfrom 'three';\r\nimport {ColorGroupData} from \"../Utilities/ColorLegendHandler\";\r\n\r\n/**\r\n * Based on this post: \r\n * https://people.thatopen.com/c/how-i-ve-done-it/make-elements-transparent-in-thatopen-2-0\r\n */\r\nexport class TransparentFragments extends Component implements Disposable {\r\n\t\r\n\tprivate static uuid: string = \"06a41ff1-9988-4e4b-bd05-35b6d9028157\";\r\n\t// A map storing the unique materials and their corresponding transparent materials\r\n\tprivate materialMap: Map = new Map();\r\n\t\r\n\tconstructor(components: Components) {\r\n\t\tsuper(components);\r\n\t\tcomponents.add(TransparentFragments.uuid, this);\r\n\t}\r\n\t\r\n onDisposed: Event = new Event();\r\n\t\r\n enabled: boolean = true;\r\n\tget world(): SimpleWorld | undefined {\r\n\t\treturn this._world;\r\n\t}\r\n\r\n\tset world(value: SimpleWorld | undefined) {\r\n\t\tthis._world = value;\r\n\t}\r\n\r\n\tprivate _world: SimpleWorld | undefined;\r\n\tprivate transparentFragments: Map = new Map();\r\n\r\n\tprivate translucentMaterial: MeshLambertMaterial | undefined;\r\n\r\n\tprivate opacity = 0.1\r\n\r\n\t/**\r\n\t * Creates a transparent copy of each Fragment, with the selected opacity level\r\n\t * @param baseFragments\r\n\t * @returns\r\n\t */\r\n\tpublic createTransparentFragments(baseFragments: Fragment[]): void {\r\n\t\t\r\n\t\tthis.translucentMaterial = new MeshLambertMaterial({\r\n\t\t\ttransparent: true,\r\n\t\t\topacity: this.opacity,\r\n\t\t\tdepthWrite: false,\r\n\t\t});\r\n\t\t\r\n\t\tif (!this._world) {\r\n\t\t\tthrow new Error(\"World not set\");\r\n\t\t}\r\n\r\n\t\tthis.transparentFragments = new Map();\r\n\r\n\t\tfor (let frag of baseFragments) {\r\n\r\n\t\t\t//create transparent materials for fragment\r\n\t\t\tlet transparentMaterials = new Array();\r\n\t\t\tfor (const material of frag.mesh.material) {\r\n\t\t\t\ttransparentMaterials[transparentMaterials.length] = this.copyToTransparentMaterial(material)!;\r\n\t\t\t}\r\n\r\n\t\t\t//create new transparent fragment\r\n\t\t\tlet tFrag: Fragment = new Fragment(frag.mesh.geometry, transparentMaterials, 1);\r\n\t\t\ttFrag.mesh.instanceColor = frag.mesh.instanceColor;\t// Connect the instance color to the new fragment\r\n\r\n\t\t\t//copy items\r\n\t\t\tlet transparentItems: Item[] = [];\r\n\t\t\tfor (const iid of frag.ids) {\r\n\t\t\t\tconst item = frag.get(iid);\r\n\t\t\t\tlet tItem: Item = { id: item.id, transforms: [], colors: [] };\r\n\t\t\t\tfor (const m of item.transforms) {\r\n\t\t\t\t\ttItem.transforms![tItem.transforms!.length] = m.clone();\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif (!item.colors) continue;\r\n\t\t\t\t\r\n\t\t\t\tfor (const c of item.colors) {\r\n\t\t\t\t\ttItem.colors![tItem.colors!.length] = c.clone();\r\n\t\t\t\t}\r\n\t\t\t\ttransparentItems[transparentItems.length] = tItem;\r\n\t\t\t}\r\n\t\t\ttFrag.add(transparentItems);\r\n\r\n\t\t\t//finalize creation\r\n\t\t\ttFrag.group = frag.group;\r\n\t\t\ttFrag.setVisibility(false);\r\n\t\t\tthis.transparentFragments.set(frag.id, tFrag);\r\n\t\t\t\r\n\t\t\t// Solves the issue where the model disappears when zooming in\r\n\t\t\ttFrag.mesh.frustumCulled = false;\r\n\r\n\t\t\t//add fragment to scene\r\n\t\t\tthis._world?.scene.three.add(tFrag.mesh);\r\n\t\t\tthis._world?.meshes.add(tFrag.mesh);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a transparent copy or a material\r\n\t * @param material the source material\r\n\t * @returns\r\n\t */\r\n\tprivate copyToTransparentMaterial(material: Material) {\r\n\t\tconst performanceMode = true;\r\n\t\t\r\n\t\tif (performanceMode) {\r\n\t\t\treturn this.translucentMaterial;\r\n\t\t}\r\n\t\t\r\n\t\t// Map to store unique materials and their corresponding transparent materials\r\n\r\n\t\t// Check if the material already has a transparent copy\r\n\t\tif (this.materialMap.has(material)) {\r\n\t\t\treturn this.materialMap.get(material);\r\n\t\t}\r\n\r\n\t\t// Create a new transparent material\r\n\t\tconst transparentMaterial = new MeshLambertMaterial();\r\n\t\ttransparentMaterial.copy(material);\r\n\t\ttransparentMaterial.transparent = true;\r\n\t\ttransparentMaterial.opacity = 0.5;\r\n\t\ttransparentMaterial.depthWrite = true;\r\n\r\n\t\t// Store the transparent material in the map\r\n\t\tthis.materialMap.set(material, transparentMaterial);\r\n\r\n\t\treturn transparentMaterial;\r\n\t}\r\n\r\n\t/**\r\n\t * Changes visibility of transparent elements.\r\n\t * Visibility of base elements shall be managed elsewhere, as it may depend upon other circumstances.\r\n\t * @param fragmentIdMap elements to act upon\r\n\t * @param transparent whether the transparent elements shall be visible or not\r\n\t */\r\n\tpublic setTransparencyByIdMap(fragmentIdMap: FragmentIdMap, transparent: boolean) {\r\n\t\t\r\n\t\tfor (const fragmentId in fragmentIdMap) {\r\n\t\t\tif (this.transparentFragments.has(fragmentId)) {\r\n\t\t\t\tconst ids = [...(fragmentIdMap[fragmentId])]\r\n\t\t\t\tthis.transparentFragments.get(fragmentId)?.setVisibility(transparent, ids);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthrow new Error(\"Fragment \" + fragmentId + \" not found\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tpublic setTransparencyOfColorGroup(colorGroup: ColorGroupData, transparent: boolean) {\r\n\t\tconst fragmentIdMap = colorGroup.fragmentIdMap;\r\n\t\t\r\n\t\tconst missingFragments: string[] = [];\r\n\t\t\r\n\t\tfor (const fragmentId in fragmentIdMap) {\r\n\t\t\tif (this.transparentFragments.has(fragmentId)) {\r\n\t\t\t\tconst ids = [...(fragmentIdMap[fragmentId])]\r\n\t\t\t\tconst transparentFragment : Fragment = this.transparentFragments.get(fragmentId)!;\r\n\t\t\t\t\r\n\t\t\t\ttransparentFragment!.setVisibility(transparent, ids);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tmissingFragments.push(fragmentId);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif (missingFragments.length > 0) {\r\n\t\t\tconsole.warn(\"Fragments not found:\", missingFragments);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tpublic resetColors() {\r\n\t\tfor (const fragment of this.transparentFragments.values()) {\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 - it fails when it cannot find a original color and this is when it has not been colored, which is fine.\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Hides all transparent objects. Corresponding opaque objects are not shown automatically, as they might be hidden for other reasons.\r\n\t */\r\n\tpublic setTransparencyForAll(transparent: boolean) {\r\n\t\tfor (const [, frag] of this.transparentFragments) {\r\n\t\t\tfrag.setVisibility(transparent);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic dispose() {\r\n\t\tconst disposer: Disposer = this.components.get(Disposer);\r\n\t\t\r\n\t\tconst transparentFragment: Map = this.transparentFragments;\r\n\t\tfor (const fid in transparentFragment) {\r\n\t\t\tlet frag = transparentFragment.get(fid);\r\n\t\t\tif (!frag) continue;\r\n\r\n\t\t\tthis._world?.scene.three.remove(frag.mesh);\r\n\t\t\tthis._world?.meshes.delete(frag.mesh);\r\n\t\t\tdisposer.destroy(frag.mesh);\r\n\t\t\tfrag.dispose();\r\n\t\t\ttransparentFragment.delete(fid);\r\n\t\t}\r\n\t}\r\n\r\n\tsetTransparencyOfOthers(fragmentIdMap: FragmentIdMap, transparent: boolean) {\r\n\t\t\r\n\t\t// Update the visibility of all fragments\r\n\t\tconst fragments = Array.from(this.transparentFragments.values());\r\n\t\tfragments.forEach(f => f.setVisibility(transparent));\r\n\r\n\t\t// Update the visibility of the selected fragments to the opposite of the others\r\n\t\tfor (const fragmentId in fragmentIdMap) {\r\n\t\t\tif (this.transparentFragments.has(fragmentId)) {\r\n\t\t\t\tconst ids = [...(fragmentIdMap[fragmentId])]\r\n\t\t\t\tconst fragment = this.transparentFragments.get(fragmentId);\r\n\t\t\t\t\r\n\t\t\t\tfragment?.setVisibility(!transparent, ids);\r\n\t\t\t} else {\r\n\t\t\t\tthrow new Error(`Fragment ${fragmentId} not found`);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// This leaves the selected fragments visible and the others hidden or opposite.\r\n\t}\r\n}\r\n"],"names":["OpenBimHandles","tmpRevitMap","getFirstThreeScene","comp","get","list","values","next","value","scene","three","LengthMeasureTool","constructor","components","this","dimensions","snapDistance","world","enabled","activate","deactivate","deleteAll","onDoubleClick","event","onMouseDown","onMouseUp","onClick","button","create","cancelCreation","CropTool","clipper","fragmentsManager","worlds","onFragmentsLoaded","add","_","ctrlKey","delete","console","log","AreaMeasureTool","areaMeasurement","endCreation","OpenBimViewerThreeDService","toolHandler","openBimHandles","objectSelectionTool","lengthMeasureTool","areaMeasureTool","cropTool","visibilityTool","VisibilityTool","boundingBoxUtility","BoundingBoxUtility","colorLegendHandler","ColorLegendHandler","changeSelectedTool","tool","ObjectSelection","setTool","LengthMeasure","AreaMeasure","hideAllObjects","hideAll","transluteAllObjects","transluteAll","showAllObjects","showAll","handleSpaces","shouldShowSpaces","setIfcSpaceVisibility","selectObjects","objectIds","length","revitObjectIds","checkRevitStatus","listOfObjectNRs","fragmentMapToSelect_new","theModel","getFragmentMap","mapSize","Object","keys","highlighter","revitMap","revitElmId","expressIDs","lookAtObjects","camera","mgr","groups","size","Error","fragmentIdToItemIdMap","boundingBox","getBoundingBoxForItems","controls","fitToSphere","getBoundingSphere","then","r","hideObjects","idMap","set","showObjects","transluteObjects","hideOthers","isolate","transluteOthers","selectedObjectIds","resetColorInstances","colorInstances","colorData","showColorGroup","groupName","showGroup","transluteColorGroup","transluteGroup","hideColorGroup","hideGroup","IfcSpaceVisibility","super","aaaa_markUs","fragmentGroupIdToSource","Map","spaceColor","spaceMaterial","color","opacity","transparent","depthWrite","ifcTypes","ifcSpaceEntityLabels","uuid","typeFilter","hider","classifier","transparentFragments","setup","fragmentsGroup","source","ifcSpaceVisibility","FragmentSource","IFC","MPK","Unknown","err","error","checker","setupImpl","id","returnedResult","getEntityLabelsForIfcTypes","undefined","warn","ifcSpaces","ex","fragmentGroup","setColor","ifcSpaceFragmentIds","traverse","mesh","includes","fragment","material","scaleIfcSpacesToAvoidFlickering","fragmentIds","Array","from","items","filter","forEach","fragmentMesh","frustumCulled","itemIds","itemId","instancesIDs","getInstancesIDs","instanceID","matrix","getMatrixAt","position","quaternion","scale","decompose","multiplyScalar","newMatrix","compose","setMatrixAt","instanceMatrix","needsUpdate","setTransparencyByIdMap","IfcTypeFilter","fragmentManager","idMappingComponent","fragmentClassifier","async","data","userData","afterModelLoad","dispose","byEntity","group","getEntityLabelsForIfcTypesIfc","getEntityLabelsForIfcTypesMpk","props","getLocalProperties","matches","i","some","x","toUpperCase","match","globalId","fragmentGroupMappings","getFromFragmentGroupId","globalIdMapping","push","allEntityLabelsOfGivenTypes","entities","ifcType","entity","entityLabels","flatMap","of","ModeToolHandler","defaultTool","lastClickTime","activeTool","timeStamp","setupToolEventsWithoutAurelia","container","modeToolHandler","addEventListener","ObjectSelectionTool","OB","eventAggregator","clear","isDeselect","highlightOnClick","aggr","sel","highlight","realSel","selection","sel_expressId","Number","fragmentId","fragments","someFrag","objPropertySet","revitTag","Tag","ifcTypeNum","type","inf","ifcGlobalId","GlobalId","ifcName","Name","send_ElmsSelect_Event","s","asArray","publish","TransparentFragments","materialMap","onDisposed","_world","createTransparentFragments","baseFragments","translucentMaterial","frag","transparentMaterials","copyToTransparentMaterial","tFrag","geometry","instanceColor","transparentItems","iid","ids","item","tItem","transforms","colors","m","clone","c","setVisibility","meshes","fragmentIdMap","has","setTransparencyOfColorGroup","colorGroup","missingFragments","resetColors","resetColor","e","setTransparencyForAll","disposer","transparentFragment","fid","remove","destroy","setTransparencyOfOthers","f"],"sourceRoot":""}