{"version":3,"file":"vendor.openbim-components-e54f7391.adf1111b90777ec8.bundle.js","mappings":"0JACO,MAAMA,EAA0B,uD,cCIhC,MAAMC,EACLC,YAAQC,GACRC,KAAKC,MAAMH,QAAUC,EACrBC,KAAKE,WAAW,GAAGJ,QAAUC,EAC7BC,KAAKE,WAAW,GAAGJ,QAAUC,EAC7BC,KAAKG,MAAML,QAAUC,CACzB,CACIK,aAASC,GACTL,KAAKM,IAAMD,EACX,MAAME,EAAWP,KAAKQ,MAAMC,SAASC,WAChCH,SACLA,EAASI,OAAO,EAAGN,EAAMO,EAAGP,EAAMQ,EAAGR,EAAMS,GAC3CP,EAASQ,aAAc,EACvBf,KAAKE,WAAW,GAAGc,MAAMT,SAASU,KAAKZ,GACvCL,KAAKkB,aACT,CACIC,eAAWd,GACXL,KAAKoB,MAAQf,EACb,MAAME,EAAWP,KAAKQ,MAAMC,SAASC,WAChCH,SACLA,EAASI,OAAO,EAAGN,EAAMO,EAAGP,EAAMQ,EAAGR,EAAMS,GAC3CP,EAASQ,aAAc,EACvBf,KAAKE,WAAW,GAAGc,MAAMT,SAASU,KAAKZ,GACvCL,KAAKkB,aACT,CACIG,cACA,IAAIC,EAAMtB,KAAKM,IAAIiB,QAAQC,IAAIxB,KAAKoB,OACpC,MAAMK,EAAqB,GAAfH,EAAII,SAEhB,OADAJ,EAAMA,EAAIK,YAAYC,eAAeH,GAC9BzB,KAAKoB,MAAMG,QAAQM,IAAIP,EAClC,CACAQ,YAAYC,EAAYC,GACpBhC,KAAKiC,YAAc,IAAI,OACvBjC,KAAKG,MAAQ,IAAI,QACjBH,KAAKE,WAAa,GAClBF,KAAKkC,YAAcH,EACnB/B,KAAKoB,MAAQY,EAAKZ,MAClBpB,KAAKM,IAAM0B,EAAK1B,IAChBN,KAAKmC,QAAUnC,KAAKoC,YACpBpC,KAAKQ,MAAQR,KAAKqC,WAAWL,GAC7BhC,KAAKsC,mBAAmBN,EAAKO,iBAE7BvC,KAAKsC,mBAAmBN,EAAKO,gBAAgBC,WAAU,IACvDxC,KAAKC,MAAQD,KAAKyC,UAClBzC,KAAKG,MAAMuC,YAAc,EACzB1C,KAAKkC,YAAYS,MAAM3B,MAAMa,IAAI7B,KAAKG,MAC1C,CACAyC,gBACI,MAAMC,QAAiB7C,KAAKkC,YAAYY,MAAM9B,IAAI,MAClDhB,KAAKF,SAAU,EACf+C,EAASE,QAAQ/C,KAAKG,OACtB0C,EAASE,QAAQ/C,KAAKQ,OACtB,IAAK,MAAMwC,KAAUhD,KAAKE,iBAChB8C,EAAOC,UAEjBjD,KAAKE,WAAWwB,OAAS,QACnB1B,KAAKC,MAAMgD,UACbjD,KAAKiC,aACLY,EAASE,QAAQ/C,KAAKiC,aAE1BjC,KAAKkC,YAAc,IACvB,CACAgB,oBACIlD,KAAKiC,YAAYxB,SAAW,IAAI,cAAkB,EAAG,EAAGT,KAAKmC,SAC7DnC,KAAKiC,YAAY1B,SAASU,KAAKjB,KAAKqB,SACpCrB,KAAKiC,YAAYkB,OAAOnD,KAAKM,KAC7BN,KAAKiC,YAAYnC,SAAU,EAC3BE,KAAKG,MAAM0B,IAAI7B,KAAKiC,YACxB,CACAmB,cACIpD,KAAKC,MAAMoD,kBACf,CACAf,mBAAmBgB,GACf,MACM/C,EADqC,IAA3BP,KAAKE,WAAWwB,OACL1B,KAAKoB,MAAQpB,KAAKM,IACvC0C,EAAS,IAAI,KAAehD,KAAKkC,YAAaoB,GACpDN,EAAOhC,MAAMT,SAASU,KAAKV,GAC3BP,KAAKE,WAAWqD,KAAKP,GACrBhD,KAAKG,MAAM0B,IAAImB,EAAOhC,MAC1B,CACAE,cACIlB,KAAKmC,QAAUnC,KAAKoC,YACpBpC,KAAKC,MAAMe,MAAMsC,QAAQE,YAAcxD,KAAKyD,iBAC5CzD,KAAKC,MAAMe,MAAMT,SAASU,KAAKjB,KAAKqB,SACpCrB,KAAKQ,MAAMkD,sBACf,CACArB,WAAWL,GACP,MAAM2B,EAAW,IAAI,iBACrBA,EAASC,cAAc,CAAC5B,EAAKZ,MAAOY,EAAK1B,MACzC,MAAMuD,EAAO,IAAI,OAAWF,EAAU3B,EAAK8B,cAE3C,OADA9D,KAAKG,MAAM0B,IAAIgC,GACRA,CACX,CACApB,UACI,MAAMsB,EAAWC,SAASC,cAAc,OACxCF,EAASG,UAAYtE,EACrBmE,EAASP,YAAcxD,KAAKyD,iBAC5B,MAAMxD,EAAQ,IAAI,KAAeD,KAAKkC,YAAa6B,GAGnD,OAFA9D,EAAMe,MAAMT,SAASU,KAAKjB,KAAKqB,SAC/BrB,KAAKG,MAAM0B,IAAI5B,EAAMe,OACdf,CACX,CACAwD,iBACI,MAAO,GAAGzD,KAAKmC,QAAUtC,EAAoBsE,SAAStE,EAAoBuE,OAC9E,CACAhC,YACI,OAAOiC,WAAWrE,KAAKoB,MAAMkD,WAAWtE,KAAKM,KAAKiE,QAAQ,GAC9D,EAEJ1E,EAAoBsE,MAAQ,EAC5BtE,EAAoBuE,MAAQ,I,mDCxGrB,MAAMI,UAA0B,IAE/BC,cACA,OAAOzE,KAAK0E,QAChB,CAEID,YAAQ1E,GACHA,GACDC,KAAK2E,iBACT3E,KAAK0E,SAAW3E,EAChBC,KAAK4E,cAAcH,QAAU1E,EACzBC,KAAK+B,WAAW8C,YACH7E,KAAK8E,UAAU9D,IAAI,QAC3B+D,OAAShF,EAEtB,CAEID,cACA,OAAOE,KAAKgF,QAChB,CAEIlF,YAAQC,GACRC,KAAKgF,SAAWjF,EAChB,IAAK,MAAMkF,KAAajF,KAAKkF,cACzBD,EAAUnF,QAAUC,CAE5B,CAKIoF,UAAMA,GACNnF,KAAKoF,cAAcD,MAAQA,CAC/B,CACArD,YAAYC,GACRsD,MAAMtD,GAEN/B,KAAKsF,WAAa,IAAI,IAEtBtF,KAAKuF,eAAiB,IAAI,IAE1BvF,KAAKwF,cAAgB,IAAI,IAEzBxF,KAAKyF,cAAgB,IAAI,IAEzBzF,KAAK0F,eAAiB,IAAI,IAE1B1F,KAAK2F,cAAgB,IAAI,IAEzB3F,KAAK4F,eAAiB,IAAI,IAE1B5F,KAAK6F,eAAiB,IAAI,IAE1B7F,KAAK8F,cAAgB,IAAI,IACzB9F,KAAK8E,UAAY,IAAI,IAErB9E,KAAK+F,aAAe,IACpB/F,KAAKoF,cAAgB,IAAI,oBAAwB,CAC7CD,MAAO,UACPa,UAAW,EACXC,WAAW,IAEfjG,KAAKkF,cAAgB,GACrBlF,KAAKgF,UAAW,EAChBhF,KAAK0E,UAAW,EAEhB1E,KAAKkG,MAAQ,CACTC,YAAY,EACZ/E,MAAO,IAAI,UACXd,IAAK,IAAI,UACT2E,eAAWmB,GAQfpG,KAAKqG,OAASzD,MAAOZ,IACjB,MAAMsE,EAAQtE,aAAgB,WAAiBA,OAAOoE,EACjDpG,KAAK0E,iBAEJ1E,KAAK0F,eAAea,QAAQvG,MAC7BA,KAAKkG,MAAMC,iBAIVnG,KAAKwG,cAHPxG,KAAKyG,UAAUH,GAGK,EAE5BtG,KAAK0G,UAAaC,IACT3G,KAAKyE,SAEI,WAAVkC,EAAEC,MACE5G,KAAKkG,MAAMC,WACXnG,KAAK2E,iBAGL3E,KAAKyE,SAAU,EAEvB,EAEJzE,KAAK+B,WAAWe,MAAMjB,IAAI2C,EAAkBqC,KAAM7G,MAClDA,KAAK8G,WAAa,IAAI,KAAgB9G,KAAK+B,YAC3C/B,KAAK4E,cAAgB,IAAImC,EAAA,EAAahF,EAAY,CAC9CiF,eAAgBhH,KAAKiH,cACrBlB,aAAc/F,KAAK+F,eAEnBhE,EAAW8C,WACX7E,KAAKkH,OAEb,CACAA,QACI,MAAMC,EAAO,IAAI,KAAOnH,KAAK+B,YAC7B/B,KAAK8E,UAAUsC,IAAI,CAAED,SACrBA,EAAKE,aAAe,aACpBF,EAAKG,QAAQzF,KAAI,KACR7B,KAAKyE,SAMNzE,KAAKyE,SAAU,EACf0C,EAAKpC,QAAS,EACd/E,KAAKuH,aAAY,KAPjBvH,KAAKuH,aAAY,GACjBJ,EAAKpC,QAAS,EACd/E,KAAKyE,SAAU,EAMnB,GAER,CAEAzD,MACI,OAAOhB,KAAKkF,aAChB,CAEAtC,gBACI5C,KAAKuH,aAAY,GACjBvH,KAAKyE,SAAU,EACfzE,KAAKuF,eAAeiC,QACpBxH,KAAKwF,cAAcgC,QACnBxH,KAAK0F,eAAe8B,QACpBxH,KAAKyF,cAAc+B,QACnBxH,KAAK4F,eAAe4B,QACpBxH,KAAK2F,cAAc6B,QACnBxH,KAAK6F,eAAe2B,QACpBxH,KAAK8F,cAAc0B,QACnBxH,KAAK8E,UAAU7B,UACXjD,KAAKgH,gBACLhH,KAAKgH,eAAeS,SAExB,IAAK,MAAMC,KAAW1H,KAAKkF,oBACjBwC,EAAQzE,UAElBjD,KAAKoF,cAAcnC,UACnBjD,KAAKkF,cAAgB,SACflF,KAAK4E,cAAc3B,gBACnBjD,KAAKsF,WAAWiB,QAAQ/B,EAAkBqC,MAChD7G,KAAKsF,WAAWkC,OACpB,CAEA5E,aAAa+E,GACL3H,KAAK0E,iBACC1E,KAAKuF,eAAegB,QAAQvG,MAC9BA,KAAKkG,MAAMC,YACXnG,KAAK4H,sBAEH5H,KAAKwF,cAAce,QAAQvG,MAEzC,CAEA4C,eACI,IAAK5C,KAAK0E,UAA0C,IAA9B1E,KAAKkF,cAAcxD,OACrC,OACJ,MAAMmG,EAAgB7H,KAAK8H,mBACrBC,EAAY/H,KAAK8G,WAAWkB,QAAQH,GAC1C,IAAKE,EACD,OACJ,MAAM9C,EAAYjF,KAAKkF,cAAc+C,MAAMC,GAAQA,EAAIjG,cAAgB8F,EAAUI,SACjF,GAAIlD,EAAW,CACX,MAAMmD,EAAQpI,KAAKkF,cAAcmD,QAAQpD,GACzCjF,KAAKkF,cAAcoD,OAAOF,EAAO,SAC3BnD,EAAUhC,gBACVjD,KAAK2F,cAAcY,QAAQvG,KACrC,CACJ,CACA4C,wBAAwB2F,GACpB,GAAIA,EAAa,CACb,MAAMH,EAAQpI,KAAKkF,cAAcmD,QAAQE,GACzCvI,KAAKkF,cAAcoD,OAAOF,EAAO,SAC3BG,EAAYtF,gBACZjD,KAAK2F,cAAcY,QAAQvG,KACrC,CACJ,CAEA4C,kBACI,IAAK,MAAMsF,KAAOlI,KAAKkF,oBACbgD,EAAIjF,gBACJjD,KAAK2F,cAAcY,QAAQvG,MAErCA,KAAKkF,cAAgB,EACzB,CAEAP,iBACI,IAAI6D,EACCxI,KAAKkG,MAAMjB,YAEhBjF,KAAKkG,MAAMC,YAAa,EACQ,QAA/BqC,EAAKxI,KAAKkG,MAAMjB,iBAA8B,IAAPuD,GAAyBA,EAAGvF,UACpEjD,KAAKkG,MAAMjB,eAAYmB,EAC3B,CACAK,UAAUH,GACN,MAAMmC,EAAQnC,EAAQ,CAACA,QAASF,EAC1BsC,EAAa1I,KAAK8G,WAAWkB,QAAQS,GACrCpI,EAAQL,KAAK4E,cAAc5D,MAC3B0H,GAAcrI,IAEpBL,KAAKkG,MAAMC,YAAa,EACxBnG,KAAKkG,MAAM9E,MAAQkF,EAAQoC,EAAWrI,MAAQA,EAClD,CACAuH,gBAEI,IADmB5H,KAAK8G,WAAWkB,UAE/B,OACJ,MAAMW,EAAQ3I,KAAK4E,cAAc5D,MAC5B2H,IAEL3I,KAAKkG,MAAM5F,IAAMqI,EACZ3I,KAAKkG,MAAMjB,YACZjF,KAAKkG,MAAMjB,UAAYjF,KAAK4I,iBAEhC5I,KAAKkG,MAAMjB,UAAU7E,SAAWJ,KAAKkG,MAAM5F,IAC/C,CACAsC,oBACS5C,KAAKkG,MAAMjB,YAEhBjF,KAAKkG,MAAMjB,UAAU/B,oBACrBlD,KAAKkF,cAAc3B,KAAKvD,KAAKkG,MAAMjB,iBAC7BjF,KAAKyF,cAAcc,QAAQvG,KAAKkG,MAAMjB,WAC5CjF,KAAKkG,MAAMjB,eAAYmB,EACvBpG,KAAKkG,MAAMC,YAAa,EAC5B,CACAyC,gBACI,OAAO,IAAI/I,EAAoBG,KAAK+B,WAAY,CAC5CX,MAAOpB,KAAKkG,MAAM9E,MAClBd,IAAKN,KAAKkG,MAAM5F,IAChBwD,aAAc9D,KAAKoF,cACnB7C,gBAAiBvC,KAAKiH,eAE9B,CACAA,cACI,MAAM3D,EAAUU,SAASC,cAAc,OAEvC,OADAX,EAAQY,UAAY,kCACbZ,CACX,CACAwE,mBACI,OAAO9H,KAAKkF,cACP2D,KAAKX,GAAQA,EAAIjG,cACjB6G,QAAQC,QAAgB3C,IAAR2C,GACzB,CACAxB,YAAYxC,GACR,MAAMiE,EAAkBhJ,KAAK+B,WAAWkH,SAASjI,MAAMkI,WAAWC,cAC7DH,IAEDjE,GACAiE,EAAgBI,iBAAiB,QAASpJ,KAAKqG,QAC/CgD,OAAOD,iBAAiB,UAAWpJ,KAAK0G,aAGxCsC,EAAgBM,oBAAoB,QAAStJ,KAAKqG,QAClDgD,OAAOC,oBAAoB,UAAWtJ,KAAK0G,YAEnD,EAEJlC,EAAkBqC,KAAO,uCACzB,sBAA+BrC,EAAkBqC,K,uHCvR1C,MAAM0C,UAA2B,IACpCzH,YAAYC,EAAYyH,GACpBnE,MAAMtD,GACN/B,KAAKyJ,KAAO,YACZzJ,KAAKyE,SAAU,EACfzE,KAAKF,SAAU,EACfE,KAAKwJ,OAAS,GACdxJ,KAAK0J,aAAe,KAEpB1J,KAAKsF,WAAa,IAAI,IACtBtF,KAAK2J,gBAAkB,KACvB3J,KAAK4J,gBAAkB,GACvB5J,KAAK6J,qBAAuB,IAAI,oBAAwB,CAAE1E,MAAO,QACjEnF,KAAK8J,eAAiB,IAAI,IAC1B9J,KAAK+J,uBAAyB,IAAI,IAClC/J,KAAKgK,aAAe,IAAI,IACxBhK,KAAKiK,eAAiB,IAAI,IAC1B,MAAMlG,EAAWC,SAASC,cAAc,OACxCF,EAASG,UAAY,KACrBlE,KAAKkK,YAAc,IAAI,KAAenI,EAAYgC,GAClD/D,KAAKkK,YAAYpK,SAAU,EAC3BE,KAAKgK,aAAanI,KAAKxB,IACQ,IAAvBL,KAAKwJ,OAAO9H,QAAiB1B,KAAK4J,gBAAgB,KAClD5J,KAAKmK,iBAAiB9J,EAAOL,KAAKwJ,OAAO,IACzCxJ,KAAKkK,YAAYpK,SAAU,EAC/B,IAEJ0J,SAAgDA,EAAOY,SAAS/J,GAAUL,KAAKqK,SAAShK,IAC5F,CACAgK,SAAShK,EAAO+H,GACZ,IAAIkC,EAOJ,GAFIA,EAJClC,IAC+B,IAAvBpI,KAAKwJ,OAAO9H,OAAe,EAAI1B,KAAKwJ,OAAO9H,QAKzC,IAAX4I,EAEA,YADAtK,KAAKwJ,OAAO,GAAKnJ,GAGrB,GAAIiK,EAAS,GAAKA,EAAStK,KAAKwJ,OAAO9H,OACnC,OACJ,MAAM6I,EAAgBvK,KAAKwJ,OAAO9H,OAAS4I,EAC3CtK,KAAKwJ,OAAOc,GAAUjK,EACtBL,KAAKgK,aAAazD,QAAQlG,GACrBkK,GACDvK,KAAKmK,iBAAiBnK,KAAKwJ,OAAOc,EAAS,GAAIjK,GAEnD,MAAM,aAAEmK,EAAY,SAAEC,GAAazK,KAAK0K,qBAAqBJ,GACzDE,IACAA,EAAapK,SAAWC,GACxBoK,IACAA,EAAStJ,WAAad,EAC9B,CACAsK,YAAYvC,GACR,GAA2B,IAAvBpI,KAAKwJ,OAAO9H,OACZ,OACJ1B,KAAKwJ,OAAOlB,OAAOF,EAAO,GAC1B,MAAM,aAAEoC,EAAY,SAAEC,GAAazK,KAAK0K,qBAAqBtC,GACzDqC,IACAD,EAAapK,SAAWqK,EAASnK,KACrCmK,SAAoDA,EAASxH,UAC7DjD,KAAK4J,gBAAgBtB,OAAOF,EAAO,GACnCpI,KAAKiK,eAAe1D,SACxB,CACAnD,cACIpD,KAAKkK,YAAY7G,kBACrB,CACA8G,iBAAiB/I,EAAOd,GACpB,MAAMgD,EAAUU,SAASC,cAAc,OACvCX,EAAQY,UAAY,kCACpB,MAAM0G,EAAgB,IAAI,KAAoB5K,KAAK+B,WAAY,CAC3DX,QACAd,MACAwD,aAAc9D,KAAK6J,qBACnBtH,gBAAiBe,IASrB,OAPAsH,EAAcxH,cACVpD,KAAK4J,gBAAgBlI,OAAS,EAC9B1B,KAAK4J,gBAAgBtB,OAAOtI,KAAK4J,gBAAgBlI,OAAS,EAAG,EAAGkJ,GAGhE5K,KAAK4J,gBAAgBrG,KAAKqH,GAEvBA,CACX,CACAF,qBAAqBtC,GACjB,MAAMyC,EAA8B,IAAVzC,EAAcpI,KAAK4J,gBAAgBlI,OAAS,EAAI0G,EAAQ,EAGlF,MAAO,CAAEoC,aAFYxK,KAAK4J,gBAAgBiB,GAEnBJ,SADNzK,KAAK4J,gBAAgBxB,GAE1C,CACA0C,sBACI9K,KAAK0J,cAAe,IAAI,SAAcqB,sBAAsB/K,KAAKwJ,OAAO,GAAIxJ,KAAKwJ,OAAO,GAAIxJ,KAAKwJ,OAAO,IACxG,MAAMwB,EAAkB,IAAI,UAAc,EAAG,EAAG,GAC1CC,EAAQjL,KAAK0J,aAAawB,OAAOC,QAAQH,GACzCI,GAAe,IAAI,WACpBC,aAAarL,KAAK0J,aAAawB,OAAQF,GACvCrJ,YACL3B,KAAK2J,iBAAkB,IAAI,WAAgB2B,iBAAiBF,EAAcH,GAC1EjL,KAAK+J,uBAAuBxD,QAAQvG,KAAK0J,aAC7C,CACA6B,cACI,IAAMvL,KAAK2J,kBAAmB3J,KAAK0J,aAE/B,OADA1J,KAAK8J,eAAevD,QAAQ,GACrB,EAEX,IAAIiF,EAAO,EACPC,EAAO,EACX,MAAMC,EAAY1L,KAAK2J,gBACjBgC,EAAY3L,KAAKwJ,OAAOX,KAAKxI,IAC/B,MAAMuL,EAAmBvL,EAAMkB,QAAQsK,aAAaH,GAC9CI,EAAW,IAAI,UAAcF,EAAiBhL,EAAGgL,EAAiB9K,GAGxE,OAFA0K,GAAQM,EAASlL,EACjB6K,GAAQK,EAASjL,EACViL,CAAQ,IAEbC,EAAOC,KAAKC,IAAI,kBAAsBN,IAO5C,OANA3L,KAAKkK,YAAYlJ,MAAMsC,QAAQE,YAAc,GAAGuI,EAAKxH,QAAQ,QAC7DvE,KAAKkK,YACAlJ,MACAT,SAAS6G,IAAIoE,EAAOG,EAAUjK,QAAS1B,KAAK0J,aAAawC,SAAUT,EAAOE,EAAUjK,QACpFmK,aAAaH,EAAUnK,QAAQ4K,UACpCnM,KAAK8J,eAAevD,QAAQwF,GACrBA,CACX,CACAnJ,gBACI5C,KAAK8J,eAAetC,QACpBxH,KAAK+J,uBAAuBvC,QAC5BxH,KAAKgK,aAAaxC,QAClBxH,KAAKiK,eAAezC,QACpB,IAAK,MAAM3D,KAAQ7D,KAAK4J,gBACpB/F,EAAKZ,gBAEHjD,KAAKkK,YAAYjH,UACvBjD,KAAK4J,gBAAkB,GACvB5J,KAAKwJ,OAAS,GACdxJ,KAAK2J,gBAAkB,KACvB3J,KAAK0J,aAAe,KACpB1J,KAAK6J,qBAAqB5G,UAC1BjD,KAAK+B,WAAa,WACZ/B,KAAKsF,WAAWiB,UACtBvG,KAAKsF,WAAWkC,OACpB,CACAxG,MACI,MAAO,CACHwI,OAAQxJ,KAAKwJ,OACbE,aAAc1J,KAAK0J,aACnBqC,KAAM/L,KAAKuL,cAEnB,ECtJG,MAAMa,UAAwB,IAC7B3H,YAAQ1E,GACRC,KAAK0E,SAAW3E,EAChBC,KAAK4E,cAAcH,QAAU1E,EACzBC,KAAK+B,WAAW8C,YACH7E,KAAK8E,UAAU9D,IAAI,QAC3B+D,OAAShF,GAElBC,KAAKuH,YAAYxH,GACZA,GACDC,KAAK2E,gBACb,CACIF,cACA,OAAOzE,KAAK0E,QAChB,CACIgF,iBAAapD,GACbtG,KAAK4E,cAAc8E,aAAepD,CACtC,CACIoD,mBACA,OAAO1J,KAAK4E,cAAc8E,YAC9B,CACA5H,YAAYC,GACRsD,MAAMtD,GAEN/B,KAAKsF,WAAa,IAAI,IACtBtF,KAAK8E,UAAY,IAAI,IACrB9E,KAAK0E,UAAW,EAChB1E,KAAKqM,oBAAsB,KAC3BrM,KAAKsM,YAAc,EACnBtM,KAAKkF,cAAgB,GACrBlF,KAAK0F,eAAiB,IAAI,IAC1B1F,KAAKyF,cAAgB,IAAI,IACzBzF,KAAK6F,eAAiB,IAAI,IAC1B7F,KAAK8F,cAAgB,IAAI,IACzB9F,KAAK4F,eAAiB,IAAI,IAC1B5F,KAAK2F,cAAgB,IAAI,IACzB3F,KAAKqG,OAAS,KACV,IAAKrG,KAAKyE,QACN,OACJ,MAAMpE,EAAQL,KAAK4E,cAAc5D,MACjC,GAAKX,EAAL,CAEA,IAAKL,KAAKqM,oBAAqB,CAC3B,MAAME,EAAY,IAAIhD,EAAmBvJ,KAAK+B,YAC9CwK,EAAUvC,aAAanI,KAAI,KACE,IAArB7B,KAAKsM,aAAsBC,EAAU7C,eACrC6C,EAAUzB,sBACV9K,KAAK4E,cAAc8E,aAAe6C,EAAU7C,aAChD,IAEJ6C,EAAUtC,eAAepI,KAAI,IAAM7B,KAAKsM,gBACxCtM,KAAKqM,oBAAsBE,CAC/B,CACAvM,KAAKqM,oBAAoBhC,SAAShK,EAAOL,KAAKsM,aAC9CtM,KAAKqM,oBAAoBd,cACzBvL,KAAKsM,aAdK,CAcQ,EAEtBtM,KAAKwM,YAAc,KACf,MAAMnM,EAAQL,KAAK4E,cAAc5D,MAC3BX,GAASL,KAAKqM,sBAEpBrM,KAAKqM,oBAAoBhC,SAAShK,EAAOL,KAAKsM,aAC9CtM,KAAKqM,oBAAoBd,cAAa,EAE1CvL,KAAKyM,UAAa9F,IACT3G,KAAKyE,UAEI,MAAVkC,EAAEC,KAAeD,EAAE+F,SAAW1M,KAAKqM,qBACnCrM,KAAKqM,oBAAoB1B,YAAY3K,KAAKsM,YAAc,GAC9C,UAAV3F,EAAEC,KAAmB5G,KAAKqM,qBAC1BrM,KAAKwG,cACK,WAAVG,EAAEC,MACuB,IAArB5G,KAAKsM,aAAsBtM,KAAKqM,oBAIhCrM,KAAK2E,iBAHL3E,KAAKyE,SAAU,GAKvB,EAEJzE,KAAK+B,WAAWe,MAAMjB,IAAIuK,EAAgBvF,KAAM7G,MAEhDA,KAAK4E,cAAgB,IAAImC,EAAA,EAAahF,GAClCA,EAAW8C,WACX7E,KAAKkH,OAEb,CACAtE,gBACI5C,KAAKuH,aAAY,GACjBvH,KAAK0F,eAAe8B,QACpBxH,KAAKyF,cAAc+B,QACnBxH,KAAK6F,eAAe2B,QACpBxH,KAAK8F,cAAc0B,QACnBxH,KAAK4F,eAAe4B,QACpBxH,KAAK2F,cAAc6B,QACnBxH,KAAK8E,UAAU7B,gBACTjD,KAAK4E,cAAc3B,UACrBjD,KAAKqM,2BACCrM,KAAKqM,oBAAoBpJ,UAEnC,IAAK,MAAMyE,KAAW1H,KAAKkF,oBACjBwC,EAAQzE,UAElBjD,KAAK+B,WAAa,WACZ/B,KAAKsF,WAAWiB,QAAQ6F,EAAgBvF,MAC9C7G,KAAKsF,WAAWkC,OACpB,CACAN,QACI,MAAMC,EAAO,IAAI,KAAOnH,KAAK+B,YAC7BoF,EAAKE,aAAe,0BACpBF,EAAKG,QAAQzF,KAAI,KACR7B,KAAKyE,SAKNzE,KAAKyE,SAAU,EACf0C,EAAKpC,QAAS,IALdoC,EAAKpC,QAAS,EACd/E,KAAKyE,SAAU,EAKnB,IAEJzE,KAAK8E,UAAUsC,IAAI,CAAED,QACzB,CACAwF,SAAW,CAEX/J,kBACI,IAAK,MAAMsF,KAAOlI,KAAKkF,oBACbgD,EAAIjF,gBACJjD,KAAK2F,cAAcY,QAAQvG,MAErCA,KAAKkF,cAAgB,EACzB,CACAsB,cACQxG,KAAKqM,sBACLrM,KAAKkF,cAAc3B,KAAKvD,KAAKqM,qBAC7BrM,KAAKqM,oBAAoB1B,YAAY3K,KAAKsM,aAC1CtM,KAAKqM,oBAAoBvB,sBACzB9K,KAAKqM,oBAAoBd,cACzBvL,KAAKqM,oBAAsB,MAE/BrM,KAAK4E,cAAc8E,aAAe,KAClC1J,KAAKsM,YAAc,CACvB,CACA3H,iBACQ3E,KAAKqM,sBACLrM,KAAKqM,oBAAoBpJ,UACzBjD,KAAKqM,oBAAsB,MAE/BrM,KAAK4E,cAAc8E,aAAe,KAClC1J,KAAKsM,YAAc,CACvB,CACAtL,MACI,OAAOhB,KAAKkF,aAChB,CACAqC,YAAYxC,GACR,MAAMiE,EAAkBhJ,KAAK+B,WAAW6K,GAAG5D,gBACvCjE,GACAiE,EAAgBI,iBAAiB,QAASpJ,KAAKqG,QAC/C2C,EAAgBI,iBAAiB,YAAapJ,KAAKwM,aACnDnD,OAAOD,iBAAiB,UAAWpJ,KAAKyM,aAGxCzD,EAAgBM,oBAAoB,QAAStJ,KAAKqG,QAClD2C,EAAgBM,oBAAoB,YAAatJ,KAAKwM,aACtDnD,OAAOC,oBAAoB,UAAWtJ,KAAKyM,WAEnD,EAEJL,EAAgBvF,KAAO,uCACvB,sBAA+BuF,EAAgBvF,M","sources":["webpack://client-app/./node_modules/openbim-components/src/measurement/LengthMeasurement/src/types.js","webpack://client-app/./node_modules/openbim-components/src/measurement/LengthMeasurement/src/index.js","webpack://client-app/./node_modules/openbim-components/src/measurement/LengthMeasurement/index.js","webpack://client-app/./node_modules/openbim-components/src/measurement/AreaMeasurement/src/index.js","webpack://client-app/./node_modules/openbim-components/src/measurement/AreaMeasurement/index.js"],"sourcesContent":["/** The name of the CSS class that styles the dimension label. */\r\nexport const DimensionLabelClassName = \"text-white text-sm bg-ifcjs-100 rounded-md px-3 py-1\";\r\n/** The name of the CSS class that styles the dimension label. */\r\nexport const DimensionPreviewClassName = \"bg-ifcjs-100 rounded-full w-[8px] h-[8px]\";\r\n//# sourceMappingURL=types.js.map","import * as THREE from \"three\";\r\nimport { DimensionLabelClassName } from \"./types\";\r\nimport { Disposer, Simple2DMarker } from \"../../../core\";\r\nexport * from \"./types\";\r\n// TODO: Document + clean up this: way less parameters, clearer logic\r\nexport class SimpleDimensionLine {\r\n set visible(value) {\r\n this.label.visible = value;\r\n this._endpoints[0].visible = value;\r\n this._endpoints[1].visible = value;\r\n this._root.visible = value;\r\n }\r\n set endPoint(point) {\r\n this.end = point;\r\n const position = this._line.geometry.attributes\r\n .position;\r\n position.setXYZ(1, point.x, point.y, point.z);\r\n position.needsUpdate = true;\r\n this._endpoints[1].get().position.copy(point);\r\n this.updateLabel();\r\n }\r\n set startPoint(point) {\r\n this.start = point;\r\n const position = this._line.geometry.attributes\r\n .position;\r\n position.setXYZ(0, point.x, point.y, point.z);\r\n position.needsUpdate = true;\r\n this._endpoints[0].get().position.copy(point);\r\n this.updateLabel();\r\n }\r\n get _center() {\r\n let dir = this.end.clone().sub(this.start);\r\n const len = dir.length() * 0.5;\r\n dir = dir.normalize().multiplyScalar(len);\r\n return this.start.clone().add(dir);\r\n }\r\n constructor(components, data) {\r\n this.boundingBox = new THREE.Mesh();\r\n this._root = new THREE.Group();\r\n this._endpoints = [];\r\n this._components = components;\r\n this.start = data.start;\r\n this.end = data.end;\r\n this._length = this.getLength();\r\n this._line = this.createLine(data);\r\n this.newEndpointElement(data.endpointElement);\r\n // @ts-ignore\r\n this.newEndpointElement(data.endpointElement.cloneNode(true));\r\n this.label = this.newText();\r\n this._root.renderOrder = 2;\r\n this._components.scene.get().add(this._root);\r\n }\r\n async dispose() {\r\n const disposer = await this._components.tools.get(Disposer);\r\n this.visible = false;\r\n disposer.destroy(this._root);\r\n disposer.destroy(this._line);\r\n for (const marker of this._endpoints) {\r\n await marker.dispose();\r\n }\r\n this._endpoints.length = 0;\r\n await this.label.dispose();\r\n if (this.boundingBox) {\r\n disposer.destroy(this.boundingBox);\r\n }\r\n this._components = null;\r\n }\r\n createBoundingBox() {\r\n this.boundingBox.geometry = new THREE.BoxGeometry(1, 1, this._length);\r\n this.boundingBox.position.copy(this._center);\r\n this.boundingBox.lookAt(this.end);\r\n this.boundingBox.visible = false;\r\n this._root.add(this.boundingBox);\r\n }\r\n toggleLabel() {\r\n this.label.toggleVisibility();\r\n }\r\n newEndpointElement(element) {\r\n const isFirst = this._endpoints.length === 0;\r\n const position = isFirst ? this.start : this.end;\r\n const marker = new Simple2DMarker(this._components, element);\r\n marker.get().position.copy(position);\r\n this._endpoints.push(marker);\r\n this._root.add(marker.get());\r\n }\r\n updateLabel() {\r\n this._length = this.getLength();\r\n this.label.get().element.textContent = this.getTextContent();\r\n this.label.get().position.copy(this._center);\r\n this._line.computeLineDistances();\r\n }\r\n createLine(data) {\r\n const axisGeom = new THREE.BufferGeometry();\r\n axisGeom.setFromPoints([data.start, data.end]);\r\n const line = new THREE.Line(axisGeom, data.lineMaterial);\r\n this._root.add(line);\r\n return line;\r\n }\r\n newText() {\r\n const htmlText = document.createElement(\"div\");\r\n htmlText.className = DimensionLabelClassName;\r\n htmlText.textContent = this.getTextContent();\r\n const label = new Simple2DMarker(this._components, htmlText);\r\n label.get().position.copy(this._center);\r\n this._root.add(label.get());\r\n return label;\r\n }\r\n getTextContent() {\r\n return `${this._length / SimpleDimensionLine.scale} ${SimpleDimensionLine.units}`;\r\n }\r\n getLength() {\r\n return parseFloat(this.start.distanceTo(this.end).toFixed(2));\r\n }\r\n}\r\nSimpleDimensionLine.scale = 1;\r\nSimpleDimensionLine.units = \"m\";\r\n//# sourceMappingURL=index.js.map","import * as THREE from \"three\";\r\nimport { SimpleDimensionLine } from \"./src\";\r\nimport { Component, Event, UIElement, } from \"../../base-types\";\r\nimport { SimpleRaycaster, ToolComponent } from \"../../core\";\r\nimport { Button } from \"../../ui\";\r\nimport { VertexPicker } from \"../../utils\";\r\nexport * from \"./src\";\r\n/**\r\n * A basic dimension tool to measure distances between 2 points in 3D and\r\n * display a 3D symbol displaying the numeric value.\r\n */\r\nexport class LengthMeasurement extends Component {\r\n /** {@link Component.enabled} */\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n /** {@link Component.enabled} */\r\n set enabled(value) {\r\n if (!value)\r\n this.cancelCreation();\r\n this._enabled = value;\r\n this._vertexPicker.enabled = value;\r\n if (this.components.uiEnabled) {\r\n const main = this.uiElement.get(\"main\");\r\n main.active = value;\r\n }\r\n }\r\n /** {@link Hideable.visible} */\r\n get visible() {\r\n return this._visible;\r\n }\r\n /** {@link Hideable.visible} */\r\n set visible(value) {\r\n this._visible = value;\r\n for (const dimension of this._measurements) {\r\n dimension.visible = value;\r\n }\r\n }\r\n /**\r\n * The [Color](https://threejs.org/docs/#api/en/math/Color)\r\n * of the geometry of the dimensions.\r\n */\r\n set color(color) {\r\n this._lineMaterial.color = color;\r\n }\r\n constructor(components) {\r\n super(components);\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n /** {@link Updateable.onBeforeUpdate} */\r\n this.onBeforeUpdate = new Event();\r\n /** {@link Updateable.onAfterUpdate} */\r\n this.onAfterUpdate = new Event();\r\n /** {@link Createable.onAfterCreate} */\r\n this.onAfterCreate = new Event();\r\n /** {@link Createable.onBeforeCreate} */\r\n this.onBeforeCreate = new Event();\r\n /** {@link Createable.onAfterDelete} */\r\n this.onAfterDelete = new Event();\r\n /** {@link Createable.onBeforeDelete} */\r\n this.onBeforeDelete = new Event();\r\n /** {@link Createable.onBeforeCancel} */\r\n this.onBeforeCancel = new Event();\r\n /** {@link Createable.onAfterCancel} */\r\n this.onAfterCancel = new Event();\r\n this.uiElement = new UIElement();\r\n /** The minimum distance to force the dimension cursor to a vertex. */\r\n this.snapDistance = 0.25;\r\n this._lineMaterial = new THREE.LineBasicMaterial({\r\n color: \"#DC2626\",\r\n linewidth: 2,\r\n depthTest: false,\r\n });\r\n this._measurements = [];\r\n this._visible = true;\r\n this._enabled = false;\r\n /** Temporary variables for internal operations */\r\n this._temp = {\r\n isDragging: false,\r\n start: new THREE.Vector3(),\r\n end: new THREE.Vector3(),\r\n dimension: undefined,\r\n };\r\n /**\r\n * Starts or finishes drawing a new dimension line.\r\n *\r\n * @param data - forces the dimension to be drawn on a plane. Use this if you are drawing\r\n * dimensions in floor plan navigation.\r\n */\r\n this.create = async (data) => {\r\n const plane = data instanceof THREE.Object3D ? data : undefined;\r\n if (!this._enabled)\r\n return;\r\n await this.onBeforeCreate.trigger(this);\r\n if (!this._temp.isDragging) {\r\n this.drawStart(plane);\r\n return;\r\n }\r\n await this.endCreation();\r\n };\r\n this.onKeyDown = (e) => {\r\n if (!this.enabled)\r\n return;\r\n if (e.key === \"Escape\") {\r\n if (this._temp.isDragging) {\r\n this.cancelCreation();\r\n }\r\n else {\r\n this.enabled = false;\r\n }\r\n }\r\n };\r\n this.components.tools.add(LengthMeasurement.uuid, this);\r\n this._raycaster = new SimpleRaycaster(this.components);\r\n this._vertexPicker = new VertexPicker(components, {\r\n previewElement: this.newEndpoint(),\r\n snapDistance: this.snapDistance,\r\n });\r\n if (components.uiEnabled) {\r\n this.setUI();\r\n }\r\n }\r\n setUI() {\r\n const main = new Button(this.components);\r\n this.uiElement.set({ main });\r\n main.materialIcon = \"straighten\";\r\n main.onClick.add(() => {\r\n if (!this.enabled) {\r\n this.setupEvents(true);\r\n main.active = true;\r\n this.enabled = true;\r\n }\r\n else {\r\n this.enabled = false;\r\n main.active = false;\r\n this.setupEvents(false);\r\n }\r\n });\r\n }\r\n /** {@link Component.get} */\r\n get() {\r\n return this._measurements;\r\n }\r\n /** {@link Disposable.dispose} */\r\n async dispose() {\r\n this.setupEvents(false);\r\n this.enabled = false;\r\n this.onBeforeUpdate.reset();\r\n this.onAfterUpdate.reset();\r\n this.onBeforeCreate.reset();\r\n this.onAfterCreate.reset();\r\n this.onBeforeDelete.reset();\r\n this.onAfterDelete.reset();\r\n this.onBeforeCancel.reset();\r\n this.onAfterCancel.reset();\r\n this.uiElement.dispose();\r\n if (this.previewElement) {\r\n this.previewElement.remove();\r\n }\r\n for (const measure of this._measurements) {\r\n await measure.dispose();\r\n }\r\n this._lineMaterial.dispose();\r\n this._measurements = [];\r\n await this._vertexPicker.dispose();\r\n await this.onDisposed.trigger(LengthMeasurement.uuid);\r\n this.onDisposed.reset();\r\n }\r\n /** {@link Updateable.update} */\r\n async update(_delta) {\r\n if (this._enabled) {\r\n await this.onBeforeUpdate.trigger(this);\r\n if (this._temp.isDragging) {\r\n this.drawInProcess();\r\n }\r\n await this.onAfterUpdate.trigger(this);\r\n }\r\n }\r\n /** Deletes the dimension that the user is hovering over with the mouse or touch event. */\r\n async delete() {\r\n if (!this._enabled || this._measurements.length === 0)\r\n return;\r\n const boundingBoxes = this.getBoundingBoxes();\r\n const intersect = this._raycaster.castRay(boundingBoxes);\r\n if (!intersect)\r\n return;\r\n const dimension = this._measurements.find((dim) => dim.boundingBox === intersect.object);\r\n if (dimension) {\r\n const index = this._measurements.indexOf(dimension);\r\n this._measurements.splice(index, 1);\r\n await dimension.dispose();\r\n await this.onAfterDelete.trigger(this);\r\n }\r\n }\r\n async deleteMeasurement(measurement) {\r\n if (measurement) {\r\n const index = this._measurements.indexOf(measurement);\r\n this._measurements.splice(index, 1);\r\n await measurement.dispose();\r\n await this.onAfterDelete.trigger(this);\r\n }\r\n }\r\n /** Deletes all the dimensions that have been previously created. */\r\n async deleteAll() {\r\n for (const dim of this._measurements) {\r\n await dim.dispose();\r\n await this.onAfterDelete.trigger(this);\r\n }\r\n this._measurements = [];\r\n }\r\n /** Cancels the drawing of the current dimension. */\r\n cancelCreation() {\r\n var _a;\r\n if (!this._temp.dimension)\r\n return;\r\n this._temp.isDragging = false;\r\n (_a = this._temp.dimension) === null || _a === void 0 ? void 0 : _a.dispose();\r\n this._temp.dimension = undefined;\r\n }\r\n drawStart(plane) {\r\n const items = plane ? [plane] : undefined;\r\n const intersects = this._raycaster.castRay(items);\r\n const point = this._vertexPicker.get();\r\n if (!(intersects && point))\r\n return;\r\n this._temp.isDragging = true;\r\n this._temp.start = plane ? intersects.point : point;\r\n }\r\n drawInProcess() {\r\n const intersects = this._raycaster.castRay();\r\n if (!intersects)\r\n return;\r\n const found = this._vertexPicker.get();\r\n if (!found)\r\n return;\r\n this._temp.end = found;\r\n if (!this._temp.dimension) {\r\n this._temp.dimension = this.drawDimension();\r\n }\r\n this._temp.dimension.endPoint = this._temp.end;\r\n }\r\n async endCreation() {\r\n if (!this._temp.dimension)\r\n return;\r\n this._temp.dimension.createBoundingBox();\r\n this._measurements.push(this._temp.dimension);\r\n await this.onAfterCreate.trigger(this._temp.dimension);\r\n this._temp.dimension = undefined;\r\n this._temp.isDragging = false;\r\n }\r\n drawDimension() {\r\n return new SimpleDimensionLine(this.components, {\r\n start: this._temp.start,\r\n end: this._temp.end,\r\n lineMaterial: this._lineMaterial,\r\n endpointElement: this.newEndpoint(),\r\n });\r\n }\r\n newEndpoint() {\r\n const element = document.createElement(\"div\");\r\n element.className = \"w-2 h-2 bg-red-600 rounded-full\";\r\n return element;\r\n }\r\n getBoundingBoxes() {\r\n return this._measurements\r\n .map((dim) => dim.boundingBox)\r\n .filter((box) => box !== undefined);\r\n }\r\n setupEvents(active) {\r\n const viewerContainer = this.components.renderer.get().domElement.parentElement;\r\n if (!viewerContainer)\r\n return;\r\n if (active) {\r\n viewerContainer.addEventListener(\"click\", this.create);\r\n window.addEventListener(\"keydown\", this.onKeyDown);\r\n }\r\n else {\r\n viewerContainer.removeEventListener(\"click\", this.create);\r\n window.removeEventListener(\"keydown\", this.onKeyDown);\r\n }\r\n }\r\n}\r\nLengthMeasurement.uuid = \"2f9bcacf-18a9-4be6-a293-e898eae64ea1\";\r\nToolComponent.libraryUUIDs.add(LengthMeasurement.uuid);\r\n//# sourceMappingURL=index.js.map","import * as THREE from \"three\";\r\nimport { Simple2DMarker } from \"../../../core\";\r\nimport { Event, Component } from \"../../../base-types\";\r\nimport { DimensionLabelClassName, SimpleDimensionLine, } from \"../../LengthMeasurement\";\r\nexport class AreaMeasureElement extends Component {\r\n constructor(components, points) {\r\n super(components);\r\n this.name = \"AreaShape\";\r\n this.enabled = true;\r\n this.visible = true;\r\n this.points = [];\r\n this.workingPlane = null;\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n this._rotationMatrix = null;\r\n this._dimensionLines = [];\r\n this._defaultLineMaterial = new THREE.LineBasicMaterial({ color: \"red\" });\r\n this.onAreaComputed = new Event();\r\n this.onWorkingPlaneComputed = new Event();\r\n this.onPointAdded = new Event();\r\n this.onPointRemoved = new Event();\r\n const htmlText = document.createElement(\"div\");\r\n htmlText.className = DimensionLabelClassName;\r\n this.labelMarker = new Simple2DMarker(components, htmlText);\r\n this.labelMarker.visible = false;\r\n this.onPointAdded.add((point) => {\r\n if (this.points.length === 3 && !this._dimensionLines[2]) {\r\n this.addDimensionLine(point, this.points[0]);\r\n this.labelMarker.visible = true;\r\n }\r\n });\r\n points === null || points === void 0 ? void 0 : points.forEach((point) => this.setPoint(point));\r\n }\r\n setPoint(point, index) {\r\n let _index;\r\n if (!index) {\r\n _index = this.points.length === 0 ? 0 : this.points.length;\r\n }\r\n else {\r\n _index = index;\r\n }\r\n if (_index === 0) {\r\n this.points[0] = point;\r\n return;\r\n }\r\n if (_index < 0 || _index > this.points.length)\r\n return;\r\n const existingIndex = this.points.length > _index;\r\n this.points[_index] = point;\r\n this.onPointAdded.trigger(point);\r\n if (!existingIndex) {\r\n this.addDimensionLine(this.points[_index - 1], point);\r\n }\r\n const { previousLine, nextLine } = this.getLinesBetweenIndex(_index);\r\n if (previousLine)\r\n previousLine.endPoint = point;\r\n if (nextLine)\r\n nextLine.startPoint = point;\r\n }\r\n removePoint(index) {\r\n if (this.points.length === 3)\r\n return;\r\n this.points.splice(index, 1);\r\n const { previousLine, nextLine } = this.getLinesBetweenIndex(index);\r\n if (nextLine)\r\n previousLine.endPoint = nextLine.end;\r\n nextLine === null || nextLine === void 0 ? void 0 : nextLine.dispose();\r\n this._dimensionLines.splice(index, 1);\r\n this.onPointRemoved.trigger();\r\n }\r\n toggleLabel() {\r\n this.labelMarker.toggleVisibility();\r\n }\r\n addDimensionLine(start, end) {\r\n const element = document.createElement(\"div\");\r\n element.className = \"w-2 h-2 bg-red-600 rounded-full\";\r\n const dimensionLine = new SimpleDimensionLine(this.components, {\r\n start,\r\n end,\r\n lineMaterial: this._defaultLineMaterial,\r\n endpointElement: element,\r\n });\r\n dimensionLine.toggleLabel();\r\n if (this._dimensionLines.length > 1) {\r\n this._dimensionLines.splice(this._dimensionLines.length - 1, 0, dimensionLine);\r\n }\r\n else {\r\n this._dimensionLines.push(dimensionLine);\r\n }\r\n return dimensionLine;\r\n }\r\n getLinesBetweenIndex(index) {\r\n const previousLineIndex = index === 0 ? this._dimensionLines.length - 1 : index - 1;\r\n const previousLine = this._dimensionLines[previousLineIndex];\r\n const nextLine = this._dimensionLines[index];\r\n return { previousLine, nextLine };\r\n }\r\n computeWorkingPlane() {\r\n this.workingPlane = new THREE.Plane().setFromCoplanarPoints(this.points[0], this.points[1], this.points[2]);\r\n const referenceVector = new THREE.Vector3(0, 1, 0);\r\n const theta = this.workingPlane.normal.angleTo(referenceVector);\r\n const rotationAxis = new THREE.Vector3()\r\n .crossVectors(this.workingPlane.normal, referenceVector)\r\n .normalize();\r\n this._rotationMatrix = new THREE.Matrix4().makeRotationAxis(rotationAxis, theta);\r\n this.onWorkingPlaneComputed.trigger(this.workingPlane);\r\n }\r\n computeArea() {\r\n if (!(this._rotationMatrix && this.workingPlane)) {\r\n this.onAreaComputed.trigger(0);\r\n return 0;\r\n }\r\n let xSum = 0;\r\n let ySum = 0;\r\n const rotMatrix = this._rotationMatrix;\r\n const vectors2D = this.points.map((point) => {\r\n const transformedPoint = point.clone().applyMatrix4(rotMatrix);\r\n const vector2D = new THREE.Vector2(transformedPoint.x, transformedPoint.z);\r\n xSum += vector2D.x;\r\n ySum += vector2D.y;\r\n return vector2D;\r\n });\r\n const area = Math.abs(THREE.ShapeUtils.area(vectors2D));\r\n this.labelMarker.get().element.textContent = `${area.toFixed(2)} m²`;\r\n this.labelMarker\r\n .get()\r\n .position.set(xSum / vectors2D.length, -this.workingPlane.constant, ySum / vectors2D.length)\r\n .applyMatrix4(rotMatrix.clone().invert());\r\n this.onAreaComputed.trigger(area);\r\n return area;\r\n }\r\n async dispose() {\r\n this.onAreaComputed.reset();\r\n this.onWorkingPlaneComputed.reset();\r\n this.onPointAdded.reset();\r\n this.onPointRemoved.reset();\r\n for (const line of this._dimensionLines) {\r\n line.dispose();\r\n }\r\n await this.labelMarker.dispose();\r\n this._dimensionLines = [];\r\n this.points = [];\r\n this._rotationMatrix = null;\r\n this.workingPlane = null;\r\n this._defaultLineMaterial.dispose();\r\n this.components = null;\r\n await this.onDisposed.trigger();\r\n this.onDisposed.reset();\r\n }\r\n get() {\r\n return {\r\n points: this.points,\r\n workingPlane: this.workingPlane,\r\n area: this.computeArea(),\r\n };\r\n }\r\n}\r\n//# sourceMappingURL=index.js.map","import { Event, Component, UIElement, } from \"../../base-types\";\r\nimport { ToolComponent } from \"../../core\";\r\nimport { Button } from \"../../ui\";\r\nimport { VertexPicker } from \"../../utils\";\r\nimport { AreaMeasureElement } from \"./src\";\r\nexport class AreaMeasurement extends Component {\r\n set enabled(value) {\r\n this._enabled = value;\r\n this._vertexPicker.enabled = value;\r\n if (this.components.uiEnabled) {\r\n const main = this.uiElement.get(\"main\");\r\n main.active = value;\r\n }\r\n this.setupEvents(value);\r\n if (!value)\r\n this.cancelCreation();\r\n }\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n set workingPlane(plane) {\r\n this._vertexPicker.workingPlane = plane;\r\n }\r\n get workingPlane() {\r\n return this._vertexPicker.workingPlane;\r\n }\r\n constructor(components) {\r\n super(components);\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n this.uiElement = new UIElement();\r\n this._enabled = false;\r\n this._currentAreaElement = null;\r\n this._clickCount = 0;\r\n this._measurements = [];\r\n this.onBeforeCreate = new Event();\r\n this.onAfterCreate = new Event();\r\n this.onBeforeCancel = new Event();\r\n this.onAfterCancel = new Event();\r\n this.onBeforeDelete = new Event();\r\n this.onAfterDelete = new Event();\r\n this.create = () => {\r\n if (!this.enabled)\r\n return;\r\n const point = this._vertexPicker.get();\r\n if (!point)\r\n return;\r\n if (!this._currentAreaElement) {\r\n const areaShape = new AreaMeasureElement(this.components);\r\n areaShape.onPointAdded.add(() => {\r\n if (this._clickCount === 3 && !areaShape.workingPlane) {\r\n areaShape.computeWorkingPlane();\r\n this._vertexPicker.workingPlane = areaShape.workingPlane;\r\n }\r\n });\r\n areaShape.onPointRemoved.add(() => this._clickCount--);\r\n this._currentAreaElement = areaShape;\r\n }\r\n this._currentAreaElement.setPoint(point, this._clickCount);\r\n this._currentAreaElement.computeArea();\r\n this._clickCount++;\r\n };\r\n this.onMouseMove = () => {\r\n const point = this._vertexPicker.get();\r\n if (!(point && this._currentAreaElement))\r\n return;\r\n this._currentAreaElement.setPoint(point, this._clickCount);\r\n this._currentAreaElement.computeArea();\r\n };\r\n this.onKeydown = (e) => {\r\n if (!this.enabled)\r\n return;\r\n if (e.key === \"z\" && e.ctrlKey && this._currentAreaElement)\r\n this._currentAreaElement.removePoint(this._clickCount - 1);\r\n if (e.key === \"Enter\" && this._currentAreaElement)\r\n this.endCreation();\r\n if (e.key === \"Escape\") {\r\n if (this._clickCount === 0 && !this._currentAreaElement) {\r\n this.enabled = false;\r\n }\r\n else {\r\n this.cancelCreation();\r\n }\r\n }\r\n };\r\n this.components.tools.add(AreaMeasurement.uuid, this);\r\n // TODO: Make vertexpicker a tool?\r\n this._vertexPicker = new VertexPicker(components);\r\n if (components.uiEnabled) {\r\n this.setUI();\r\n }\r\n }\r\n async dispose() {\r\n this.setupEvents(false);\r\n this.onBeforeCreate.reset();\r\n this.onAfterCreate.reset();\r\n this.onBeforeCancel.reset();\r\n this.onAfterCancel.reset();\r\n this.onBeforeDelete.reset();\r\n this.onAfterDelete.reset();\r\n this.uiElement.dispose();\r\n await this._vertexPicker.dispose();\r\n if (this._currentAreaElement) {\r\n await this._currentAreaElement.dispose();\r\n }\r\n for (const measure of this._measurements) {\r\n await measure.dispose();\r\n }\r\n this.components = null;\r\n await this.onDisposed.trigger(AreaMeasurement.uuid);\r\n this.onDisposed.reset();\r\n }\r\n setUI() {\r\n const main = new Button(this.components);\r\n main.materialIcon = \"check_box_outline_blank\";\r\n main.onClick.add(() => {\r\n if (!this.enabled) {\r\n main.active = true;\r\n this.enabled = true;\r\n }\r\n else {\r\n this.enabled = false;\r\n main.active = false;\r\n }\r\n });\r\n this.uiElement.set({ main });\r\n }\r\n delete() { }\r\n /** Deletes all the dimensions that have been previously created. */\r\n async deleteAll() {\r\n for (const dim of this._measurements) {\r\n await dim.dispose();\r\n await this.onAfterDelete.trigger(this);\r\n }\r\n this._measurements = [];\r\n }\r\n endCreation() {\r\n if (this._currentAreaElement) {\r\n this._measurements.push(this._currentAreaElement);\r\n this._currentAreaElement.removePoint(this._clickCount);\r\n this._currentAreaElement.computeWorkingPlane();\r\n this._currentAreaElement.computeArea();\r\n this._currentAreaElement = null;\r\n }\r\n this._vertexPicker.workingPlane = null;\r\n this._clickCount = 0;\r\n }\r\n cancelCreation() {\r\n if (this._currentAreaElement) {\r\n this._currentAreaElement.dispose();\r\n this._currentAreaElement = null;\r\n }\r\n this._vertexPicker.workingPlane = null;\r\n this._clickCount = 0;\r\n }\r\n get() {\r\n return this._measurements;\r\n }\r\n setupEvents(active) {\r\n const viewerContainer = this.components.ui.viewerContainer;\r\n if (active) {\r\n viewerContainer.addEventListener(\"click\", this.create);\r\n viewerContainer.addEventListener(\"mousemove\", this.onMouseMove);\r\n window.addEventListener(\"keydown\", this.onKeydown);\r\n }\r\n else {\r\n viewerContainer.removeEventListener(\"click\", this.create);\r\n viewerContainer.removeEventListener(\"mousemove\", this.onMouseMove);\r\n window.removeEventListener(\"keydown\", this.onKeydown);\r\n }\r\n }\r\n}\r\nAreaMeasurement.uuid = \"c453a99e-f054-4781-9060-33df617db4a5\";\r\nToolComponent.libraryUUIDs.add(AreaMeasurement.uuid);\r\n//# sourceMappingURL=index.js.map"],"names":["DimensionLabelClassName","SimpleDimensionLine","visible","value","this","label","_endpoints","_root","endPoint","point","end","position","_line","geometry","attributes","setXYZ","x","y","z","needsUpdate","get","copy","updateLabel","startPoint","start","_center","dir","clone","sub","len","length","normalize","multiplyScalar","add","constructor","components","data","boundingBox","_components","_length","getLength","createLine","newEndpointElement","endpointElement","cloneNode","newText","renderOrder","scene","async","disposer","tools","destroy","marker","dispose","createBoundingBox","lookAt","toggleLabel","toggleVisibility","element","push","textContent","getTextContent","computeLineDistances","axisGeom","setFromPoints","line","lineMaterial","htmlText","document","createElement","className","scale","units","parseFloat","distanceTo","toFixed","LengthMeasurement","enabled","_enabled","cancelCreation","_vertexPicker","uiEnabled","uiElement","active","_visible","dimension","_measurements","color","_lineMaterial","super","onDisposed","onBeforeUpdate","onAfterUpdate","onAfterCreate","onBeforeCreate","onAfterDelete","onBeforeDelete","onBeforeCancel","onAfterCancel","snapDistance","linewidth","depthTest","_temp","isDragging","undefined","create","plane","trigger","endCreation","drawStart","onKeyDown","e","key","uuid","_raycaster","VertexPicker","previewElement","newEndpoint","setUI","main","set","materialIcon","onClick","setupEvents","reset","remove","measure","_delta","drawInProcess","boundingBoxes","getBoundingBoxes","intersect","castRay","find","dim","object","index","indexOf","splice","measurement","_a","items","intersects","found","drawDimension","map","filter","box","viewerContainer","renderer","domElement","parentElement","addEventListener","window","removeEventListener","AreaMeasureElement","points","name","workingPlane","_rotationMatrix","_dimensionLines","_defaultLineMaterial","onAreaComputed","onWorkingPlaneComputed","onPointAdded","onPointRemoved","labelMarker","addDimensionLine","forEach","setPoint","_index","existingIndex","previousLine","nextLine","getLinesBetweenIndex","removePoint","dimensionLine","previousLineIndex","computeWorkingPlane","setFromCoplanarPoints","referenceVector","theta","normal","angleTo","rotationAxis","crossVectors","makeRotationAxis","computeArea","xSum","ySum","rotMatrix","vectors2D","transformedPoint","applyMatrix4","vector2D","area","Math","abs","constant","invert","AreaMeasurement","_currentAreaElement","_clickCount","areaShape","onMouseMove","onKeydown","ctrlKey","delete","ui"],"sourceRoot":""}