@itwin/editor-frontend 4.5.0-dev.26 → 4.5.0-dev.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -1
- package/lib/cjs/CreateElementTool.d.ts +62 -0
- package/lib/cjs/CreateElementTool.d.ts.map +1 -1
- package/lib/cjs/CreateElementTool.js +62 -0
- package/lib/cjs/CreateElementTool.js.map +1 -1
- package/lib/cjs/EditTool.js.map +1 -1
- package/lib/cjs/EditToolIpc.js.map +1 -1
- package/lib/cjs/ModifyElementTool.js.map +1 -1
- package/lib/cjs/ProjectLocation/ProjectExtentsDecoration.js.map +1 -1
- package/lib/cjs/ProjectLocation/ProjectGeolocation.js.map +1 -1
- package/lib/cjs/TransformElementsTool.js.map +1 -1
- package/lib/cjs/UndoRedoTool.js.map +1 -1
- package/lib/cjs/editor-frontend.js.map +1 -1
- package/lib/esm/CreateElementTool.d.ts +62 -0
- package/lib/esm/CreateElementTool.d.ts.map +1 -1
- package/lib/esm/CreateElementTool.js +62 -0
- package/lib/esm/CreateElementTool.js.map +1 -1
- package/lib/esm/EditTool.js.map +1 -1
- package/lib/esm/EditToolIpc.js.map +1 -1
- package/lib/esm/ModifyElementTool.js.map +1 -1
- package/lib/esm/ProjectLocation/ProjectExtentsDecoration.js.map +1 -1
- package/lib/esm/ProjectLocation/ProjectGeolocation.js.map +1 -1
- package/lib/esm/TransformElementsTool.js.map +1 -1
- package/lib/esm/UndoRedoTool.js.map +1 -1
- package/lib/esm/editor-frontend.js.map +1 -1
- package/lib/public/locales/en/Editor.json +79 -79
- package/package.json +14 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectGeolocation.js","sourceRoot":"","sources":["../../../src/ProjectLocation/ProjectGeolocation.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,wDAAiW;AACjW,wDAAyF;AACzF,oDAAwE;AACxE,yEAA0E;AAC1E,0DAA2F;AAC3F,0CAAwC;AAExC,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,oBAAS,CAAC,SAAS,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;AAC/D,CAAC;AACD,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,oBAAS,CAAC,SAAS,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,gBAAgB;AAChB,MAAM,eAAe;IAKnB,YAAY,aAAqB,EAAE,KAAa;QAJzC,kBAAa,GAAG,IAAI,uBAAO,EAAE,CAAC;QAC9B,aAAQ,GAAG,IAAI,uBAAO,EAAE,CAAC;QAI9B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEM,cAAc,CAAC,GAA6B;QACjD,GAAG,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC5B,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,qCAAqC;QACrF,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC;QAEnE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;QAClB,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC;QAC1B,GAAG,CAAC,SAAS,GAAG,gBAAgB,CAAC;QACjC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC;QAC1B,GAAG,CAAC,UAAU,GAAG,EAAE,CAAC;QACpB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;QAC3E,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;QAE7E,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC;QACxB,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;QACzB,GAAG,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC5B,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAEM,WAAW,CAAC,EAAY;QAC7B,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,gCAAgC;QAChG,OAAO,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAEM,aAAa,CAAC,OAAwB;QAC3C,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC;YACpC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAa,2BAA4B,SAAQ,6BAAa;IAA9D;;QAOY,sBAAiB,GAAG,KAAK,CAAC;QAC1B,0BAAqB,GAAG,KAAK,CAAC;QAE9B,YAAO,GAAG,KAAK,CAAC;QAChB,WAAM,GAAG,GAAG,CAAC;IA4QzB,CAAC;IAnRQ,MAAM,KAAc,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,KAAc,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,oDAAoD;IAUvF,oBAAoB,CAAC,EAAwB,EAAE,oBAA6B,IAAa,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,EAAE,oBAAoB,CAAC,IAAI,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;IACxM,eAAe,CAAC,GAAkB,EAAE,cAAuB,IAAa,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,6DAA6D;IACpJ,sBAAsB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,oCAAoC;IACxF,KAAK,CAAC,aAAa;QACjC,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAEe,KAAK,CAAC,SAAS;QAC7B,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,aAAa,KAAK,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACxC,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;IAGrE,IAAW,gBAAgB;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YACzB,IAAI,CAAC,iBAAiB,GAAG,IAAI,+BAAc,CAAS,IAAI,gCAAgB,CAAC,UAAU,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3H,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,QAAQ,KAAa,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,IAAW,QAAQ,CAAC,KAAa,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;IAG3E,IAAW,iBAAiB;QAC1B,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAC1B,IAAI,CAAC,kBAAkB,GAAG,IAAI,+BAAc,CAAS,IAAI,gCAAgB,CAAC,WAAW,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9H,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,IAAW,SAAS,KAAa,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,IAAW,SAAS,CAAC,KAAa,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;IAG7E,IAAW,gBAAgB;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YACzB,IAAI,CAAC,iBAAiB,GAAG,IAAI,+BAAc,CAAS,IAAI,iCAAiB,CAAC,UAAU,EAAE,yBAAS,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9I,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAW,QAAQ,KAAa,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,IAAW,QAAQ,CAAC,KAAa,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;IAG3E,IAAW,aAAa;QACtB,IAAI,CAAC,IAAI,CAAC,cAAc;YACtB,IAAI,CAAC,cAAc,GAAG,IAAI,+BAAc,CAAS,IAAI,gCAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClH,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAW,KAAK,KAAa,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,IAAW,KAAK,CAAC,KAAa,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;IAE7D,2BAA2B;QACjC,IAAI,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClK,CAAC;IAEe,KAAK,CAAC,8BAA8B,CAAC,YAAoC;QACvF,OAAO,IAAI,CAAC,8BAA8B,CAAC,YAAY,CAAC,CAAC;IAC3D,CAAC;IAEe,4BAA4B;QAC1C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,MAAM,YAAY,GAAG,IAAI,KAAK,EAAc,CAAC;QAC7C,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1F,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3F,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1F,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,YAAY,CAAC;IACtB,CAAC;IAES,qBAAqB;QAC7B,MAAM,SAAS,GAAG,yBAAS,CAAC,SAAS,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;QACjI,MAAM,SAAS,GAAG,yBAAS,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAClE,MAAM,eAAe,GAAG,8BAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACtK,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAE7C,MAAM,iBAAiB,GAAgC,EAAE,CAAC;QAC1D,iBAAiB,CAAC,IAAI,CAAC,8BAAc,CAAC,iBAAiB,CAAC,mCAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3I,iBAAiB,CAAC,IAAI,CAAC,8BAAc,CAAC,iBAAiB,CAAC,mCAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5I,QAAQ,CAAC,IAAI,CAAC,8BAAc,CAAC,aAAa,CAAC,iBAAiB,EAAE,8BAAc,CAAC,WAAW,CAAC,CAAC,CAAC;QAE3F,MAAM,iBAAiB,GAAgC,EAAE,CAAC;QAC1D,IAAI,CAAC,8BAAc,CAAC,6BAA6B,CAAC,iBAAiB,CAAC;YAClE,iBAAiB,CAAC,IAAI,CAAC,8BAAc,CAAC,iBAAiB,CAAC,mCAAmB,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/I,iBAAiB,CAAC,IAAI,CAAC,8BAAc,CAAC,iBAAiB,CAAC,mCAAmB,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7I,QAAQ,CAAC,IAAI,CAAC,8BAAc,CAAC,aAAa,CAAC,iBAAiB,EAAE,8BAAc,CAAC,WAAW,CAAC,CAAC,CAAC;QAE3F,MAAM,YAAY,GAAG,8BAAc,CAAC,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAClF,yBAAS,CAAC,aAAa,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC1D,CAAC;IAES,2BAA2B;QACnC,yBAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO;YACf,OAAO;QAET,MAAM,IAAI,GAAG,uDAA4B,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI;YACpB,OAAO;QAET,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;QACnB,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;YACnB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAEpB,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QACtC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IAEO,oBAAoB;QAC1B,MAAM,IAAI,GAAG,uDAA4B,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI;YACpB,IAAI,CAAC,6BAA6B,GAAG,KAAK,CAAC;IAC/C,CAAC;IAEe,QAAQ,CAAC,OAAwB;QAC/C,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE;YACtE,OAAO;QAET,MAAM,IAAI,GAAG,uDAA4B,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI;YACpB,OAAO;QAET,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;QAC1C,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAE3D,IAAI,SAAS,KAAK,IAAI,CAAC,UAAU;YAC/B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAEe,KAAK,CAAC,aAAa,CAAC,EAAiB;QACnD,IAAI,SAAS,KAAK,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO;YAC3C,OAAO;QAET,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,EAAE,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;IACtC,CAAC;IAEe,KAAK,CAAC,eAAe,CAAC,GAAkB;QACtD,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,iCAAiC;QAC9D,OAAO,4BAAY,CAAC,EAAE,CAAC;IACzB,CAAC;IAES,qBAAqB;QAC7B,uFAAuF;QACvF,IAAI,CAAC,QAAQ,GAAG,qBAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,qBAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;IACnB,CAAC;IAEM,mBAAmB,CAAC,EAAiB;QAC1C,MAAM,IAAI,GAAG,uDAA4B,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI;YACpB,OAAO;QAET,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,oEAAoE;QACzF,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAE3F,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;YAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;gBAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC7E,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC;gBACtC,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;gBACxC,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC;gBACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC,OAAO,CAAC;aACtD;iBAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAClC,IAAI,CAAC,qBAAqB,EAAE,CAAC;aAC9B;SACF;QAED,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACnC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,0DAA0D;QAClF,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,iBAAiB;QAC5B,MAAM,IAAI,GAAG,uDAA4B,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI;YACpB,OAAO;QAET,MAAM,MAAM,GAAG,0BAAY,CAAC,WAAW,CAAC,EAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC,CAAC;QACrH,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,qBAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjF,OAAO;QAET,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,iCAAiC;IACjE,CAAC;IAEe,KAAK,CAAC,gBAAgB,CAAC,EAAiB;QACtD,IAAI,SAAS,KAAK,EAAE,CAAC,QAAQ;YAC3B,OAAO,4BAAY,CAAC,EAAE,CAAC,CAAC,6BAA6B;QAEvD,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,iBAAiB;YACpB,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAE/B,MAAM,eAAe,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,CAAC;QACrE,IAAI,CAAC,eAAe;YAClB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEjC,OAAO,4BAAY,CAAC,EAAE,CAAC;IACzB,CAAC;IAEe,KAAK,CAAC,SAAS;QAC7B,IAAI,CAAC,uDAA4B,CAAC,uBAAuB,CAAC,KAAK,CAAC;YAC9D,OAAO,KAAK,CAAC;QAEf,6GAA6G;QAC7G,IAAI,CAAC,mCAAmC,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAErI,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACa,KAAK,CAAC,WAAW,CAAC,GAAG,SAAmB;QACtD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;YAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM;gBACpB,SAAS;YAEX,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBAC3B,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,qBAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC3G,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;iBACnC;aACF;iBAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAClD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;oBAC5B,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,qBAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC7G,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;iBACnC;aACF;iBAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBAC3B,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC9E,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;iBACnC;aACF;iBAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;oBACxB,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,qBAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBACrG,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;iBACnC;aACF;SACF;QAED,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,SAAS,KAAuB,OAAO,IAAI,2BAA2B,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;;AArR9E,kCAAM,GAAG,mCAAmC,AAAtC,CAAuC;AAC7C,oCAAQ,GAAG,YAAY,AAAf,CAAgB,CAAC,4DAA4D;AAFjG,kEAA2B;AAyRxC;;GAEG;AACH,MAAa,2BAA4B,SAAQ,6BAAa;IAM5C,oBAAoB,CAAC,EAAwB,EAAE,oBAA6B,IAAa,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,EAAE,oBAAoB,CAAC,IAAI,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;IACxM,eAAe,CAAC,GAAkB,EAAE,cAAuB,IAAa,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,6DAA6D;IACpJ,sBAAsB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,oCAAoC;IACxF,KAAK,CAAC,aAAa;QACjC,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IACe,KAAK,CAAC,SAAS;QAC7B,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IACM,KAAK,CAAC,aAAa,KAAK,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACxC,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;IAE3D,qBAAqB;QAC7B,MAAM,SAAS,GAAG,yBAAS,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,yBAAS,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAClE,MAAM,eAAe,GAAG,8BAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QAC1J,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAE7C,MAAM,iBAAiB,GAAgC,EAAE,CAAC;QAC1D,iBAAiB,CAAC,IAAI,CAAC,8BAAc,CAAC,iBAAiB,CAAC,mCAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3I,iBAAiB,CAAC,IAAI,CAAC,8BAAc,CAAC,iBAAiB,CAAC,mCAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5I,QAAQ,CAAC,IAAI,CAAC,8BAAc,CAAC,aAAa,CAAC,iBAAiB,EAAE,8BAAc,CAAC,WAAW,CAAC,CAAC,CAAC;QAE3F,MAAM,iBAAiB,GAAgC,EAAE,CAAC;QAC1D,IAAI,CAAC,8BAAc,CAAC,6BAA6B,CAAC,iBAAiB,CAAC;YAClE,iBAAiB,CAAC,IAAI,CAAC,8BAAc,CAAC,iBAAiB,CAAC,mCAAmB,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/I,iBAAiB,CAAC,IAAI,CAAC,8BAAc,CAAC,iBAAiB,CAAC,mCAAmB,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7I,QAAQ,CAAC,IAAI,CAAC,8BAAc,CAAC,aAAa,CAAC,iBAAiB,EAAE,8BAAc,CAAC,WAAW,CAAC,CAAC,CAAC;QAE3F,MAAM,YAAY,GAAG,8BAAc,CAAC,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAClF,yBAAS,CAAC,aAAa,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC1D,CAAC;IAES,2BAA2B;QACnC,yBAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO;YAC5B,OAAO;QAET,MAAM,KAAK,GAAG,IAAI,mCAAmB,EAAE,CAAC;QACxC,KAAK,CAAC,WAAW,CAAC,wBAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,SAAS,EAAE,CAAC;IACpB,CAAC;IAEO,gBAAgB,CAAC,EAAiB;QACxC,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO;YAC5B,OAAO,SAAS,CAAC;QACnB,OAAO,mCAAmB,CAAC,yBAAyB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,wBAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,QAAS,EAAE,IAAI,CAAC,CAAC;IACrH,CAAC;IAEO,oBAAoB;QAC1B,MAAM,IAAI,GAAG,uDAA4B,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI;YACpB,IAAI,CAAC,6BAA6B,GAAG,KAAK,CAAC;IAC/C,CAAC;IAEO,iBAAiB,CAAC,EAAiB;QACzC,IAAI,SAAS,KAAK,EAAE,CAAC,QAAQ;YAC3B,OAAO;QAET,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS;YAC9B,IAAI,CAAC,SAAS,GAAG,qBAAK,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;;YAE1D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAEtF,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,SAAS,KAAK,KAAK;YACrB,OAAO;QAET,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,MAAM;YAC/C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,wBAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAErD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;IAC9C,CAAC;IAEe,QAAQ,CAAC,OAAwB;QAC/C,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE;YACxE,OAAO;QAET,MAAM,IAAI,GAAG,uDAA4B,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI;YACpB,OAAO;QAET,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;QAC1C,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAEe,KAAK,CAAC,eAAe,CAAC,QAAiB,EAAE,QAAuB;QAC9E,IAAI,4BAAY,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC;YACtE,OAAO,4BAAY,CAAC,GAAG,CAAC;QAC1B,OAAO,CAAC,QAAQ,IAAI,MAAM,iCAAiB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,4BAAY,CAAC,GAAG,CAAC,CAAC,CAAC,4BAAY,CAAC,EAAE,CAAC;IACjH,CAAC;IAEe,KAAK,CAAC,aAAa,CAAC,EAAiB;QACnD,IAAI,SAAS,KAAK,EAAE,CAAC,QAAQ;YAC3B,OAAO;QAET,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC3B,EAAE,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;IACtC,CAAC;IAEe,KAAK,CAAC,eAAe,CAAC,GAAkB;QACtD,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,iCAAiC;QAC9D,OAAO,4BAAY,CAAC,EAAE,CAAC;IACzB,CAAC;IAEe,KAAK,CAAC,gBAAgB,CAAC,EAAiB;QACtD,IAAI,SAAS,KAAK,EAAE,CAAC,QAAQ;YAC3B,OAAO,4BAAY,CAAC,EAAE,CAAC,CAAC,6BAA6B;QAEvD,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,EAAE;YAC9B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACnC,OAAO,4BAAY,CAAC,EAAE,CAAC;SACxB;QAED,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAE3B,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE;YAChC,MAAM,IAAI,GAAG,uDAA4B,CAAC,GAAG,EAAE,CAAC;YAChD,IAAI,SAAS,KAAK,IAAI;gBACpB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC7C;QAED,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,iCAAiC;QAC9D,OAAO,4BAAY,CAAC,EAAE,CAAC;IACzB,CAAC;IAEe,KAAK,CAAC,SAAS,KAAuB,OAAO,uDAA4B,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnH,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,OAAO,IAAI,2BAA2B,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;;AAhJ5D,kCAAM,GAAG,mCAAmC,CAAC;AAC7C,oCAAQ,GAAG,cAAc,CAAC,CAAC,4DAA4D;AAFnG,kEAA2B;AAoJxC;;GAEG;AACH,MAAa,0BAA2B,SAAQ,6BAAa;IAM3C,oBAAoB,CAAC,EAAwB,EAAE,oBAA6B,IAAa,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,EAAE,oBAAoB,CAAC,IAAI,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;IACxM,eAAe,CAAC,GAAkB,EAAE,cAAuB,IAAa,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,6DAA6D;IACpJ,sBAAsB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,oCAAoC;IACxF,KAAK,CAAC,aAAa;QACjC,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IACe,KAAK,CAAC,SAAS;QAC7B,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IACM,KAAK,CAAC,aAAa;QACxB,MAAM,IAAI,GAAG,IAAI,0BAA0B,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE;YACnB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAEe,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;IAE3D,qBAAqB;QAC7B,MAAM,SAAS,GAAG,yBAAS,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,yBAAS,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAClE,MAAM,eAAe,GAAG,8BAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QAC3J,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAE7C,MAAM,iBAAiB,GAAgC,EAAE,CAAC;QAC1D,iBAAiB,CAAC,IAAI,CAAC,8BAAc,CAAC,iBAAiB,CAAC,mCAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3I,iBAAiB,CAAC,IAAI,CAAC,8BAAc,CAAC,iBAAiB,CAAC,mCAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5I,QAAQ,CAAC,IAAI,CAAC,8BAAc,CAAC,aAAa,CAAC,iBAAiB,EAAE,8BAAc,CAAC,WAAW,CAAC,CAAC,CAAC;QAE3F,MAAM,iBAAiB,GAAgC,EAAE,CAAC;QAC1D,IAAI,CAAC,8BAAc,CAAC,6BAA6B,CAAC,iBAAiB,CAAC;YAClE,iBAAiB,CAAC,IAAI,CAAC,8BAAc,CAAC,iBAAiB,CAAC,mCAAmB,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/I,iBAAiB,CAAC,IAAI,CAAC,8BAAc,CAAC,iBAAiB,CAAC,mCAAmB,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7I,QAAQ,CAAC,IAAI,CAAC,8BAAc,CAAC,aAAa,CAAC,iBAAiB,EAAE,8BAAc,CAAC,WAAW,CAAC,CAAC,CAAC;QAE3F,MAAM,YAAY,GAAG,8BAAc,CAAC,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAClF,yBAAS,CAAC,aAAa,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC1D,CAAC;IAES,2BAA2B;QACnC,yBAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO;YAC5B,OAAO;QAET,MAAM,KAAK,GAAG,IAAI,mCAAmB,EAAE,CAAC;QACxC,KAAK,CAAC,WAAW,CAAC,wBAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,SAAS,EAAE,CAAC;IACpB,CAAC;IAEO,oBAAoB;QAC1B,MAAM,IAAI,GAAG,uDAA4B,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI;YACpB,IAAI,CAAC,6BAA6B,GAAG,KAAK,CAAC;IAC/C,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,EAAiB;QAC1C,IAAI,SAAS,KAAK,EAAE,CAAC,QAAQ,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO;YACzD,OAAO;QAET,MAAM,IAAI,GAAG,uDAA4B,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI;YACpB,OAAO;QAET,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,6BAA6B,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;YAChD,OAAO;QAET,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,iCAAiC;IACjE,CAAC;IAEe,QAAQ,CAAC,OAAwB;QAC/C,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,IAAI,SAAS,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE;YACrG,OAAO;QAET,MAAM,IAAI,GAAG,uDAA4B,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI;YACpB,OAAO;QAET,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,2BAAW,CAAC,eAAe,CAAC,CAAC;QAChF,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,2BAAW,CAAC,YAAY,CAAC,CAAC;QAC7E,MAAM,WAAW,GAAG,sBAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9F,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAE/C,aAAa,CAAC,YAAY,CAAC,WAAW,EAAE,sBAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3D,aAAa,CAAC,YAAY,CAAC,WAAW,EAAE,sBAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,wBAAU,CAAC,KAAK,CAAC,CAAC;QAE7E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,eAAe,CAAC,wBAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEjH,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACnC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACnC,aAAa,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE3D,OAAO,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;QAChD,OAAO,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;QAEhD,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;IAC5C,CAAC;IAEe,KAAK,CAAC,eAAe,CAAC,QAAiB,EAAE,QAAuB;QAC9E,IAAI,4BAAY,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC;YACtE,OAAO,4BAAY,CAAC,GAAG,CAAC;QAC1B,OAAO,CAAC,QAAQ,IAAI,MAAM,iCAAiB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,4BAAY,CAAC,GAAG,CAAC,CAAC,CAAC,4BAAY,CAAC,EAAE,CAAC;IACjH,CAAC;IAEe,KAAK,CAAC,aAAa,CAAC,EAAiB;QACnD,IAAI,SAAS,KAAK,EAAE,CAAC,QAAQ;YAC3B,OAAO;QAET,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;IACtC,CAAC;IAEe,KAAK,CAAC,eAAe,CAAC,GAAkB;QACtD,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO;YAC5B,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,0DAA0D;;YAEjF,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,yBAAyB;QACxD,OAAO,4BAAY,CAAC,EAAE,CAAC;IACzB,CAAC;IAEe,KAAK,CAAC,gBAAgB,CAAC,EAAiB;QACtD,IAAI,SAAS,KAAK,EAAE,CAAC,QAAQ;YAC3B,OAAO,4BAAY,CAAC,EAAE,CAAC,CAAC,6BAA6B;QAEvD,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,EAAE;YAC9B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACnC,OAAO,4BAAY,CAAC,EAAE,CAAC;SACxB;QAED,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC5B,OAAO,4BAAY,CAAC,EAAE,CAAC;IACzB,CAAC;IAEe,KAAK,CAAC,SAAS,KAAuB,OAAO,uDAA4B,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnH,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,OAAO,IAAI,0BAA0B,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;;AAnJ3D,iCAAM,GAAG,kCAAkC,CAAC;AAC5C,mCAAQ,GAAG,WAAW,CAAC,CAAC,4DAA4D;AAFhG,gEAA0B","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Editing\n */\n\nimport { AccuDrawHintBuilder, AccuDrawShortcuts, AngleDescription, BeButtonEvent, CanvasDecoration, CoreTools, DecorateContext, EventHandled, GraphicType, IModelApp, LengthDescription, PrimitiveTool, ToolAssistance, ToolAssistanceImage, ToolAssistanceInputMethod, ToolAssistanceInstruction, ToolAssistanceSection, Viewport } from \"@itwin/core-frontend\";\nimport { Angle, Matrix3d, Point3d, Ray3d, Vector3d, XYAndZ } from \"@itwin/core-geometry\";\nimport { Cartographic, ColorDef, LinePixels } from \"@itwin/core-common\";\nimport { ProjectExtentsClipDecoration } from \"./ProjectExtentsDecoration\";\nimport { DialogItem, DialogProperty, DialogPropertySyncItem } from \"@itwin/appui-abstract\";\nimport { EditTools } from \"../EditTool\";\n\nfunction translatePrompt(key: string) {\n return EditTools.translate(`ProjectLocation:Prompts.${key}`);\n}\nfunction translateMessage(key: string) {\n return EditTools.translate(`ProjectLocation:Message.${key}`);\n}\n\n/** @internal */\nclass LabelDecoration implements CanvasDecoration {\n public worldLocation = new Point3d();\n public position = new Point3d();\n public label: string;\n\n constructor(worldLocation: XYAndZ, label: string) {\n this.worldLocation.setFrom(worldLocation);\n this.label = label;\n }\n\n public drawDecoration(ctx: CanvasRenderingContext2D): void {\n ctx.font = \"16px san-serif\";\n const labelHeight = ctx.measureText(\"M\").width; // Close enough for border padding...\n const labelWidth = ctx.measureText(this.label).width + labelHeight;\n\n ctx.lineWidth = 1;\n ctx.strokeStyle = \"white\";\n ctx.fillStyle = \"rgba(0,0,0,.4)\";\n ctx.shadowColor = \"black\";\n ctx.shadowBlur = 10;\n ctx.fillRect(-(labelWidth / 2), -labelHeight, labelWidth, labelHeight * 2);\n ctx.strokeRect(-(labelWidth / 2), -labelHeight, labelWidth, labelHeight * 2);\n\n ctx.fillStyle = \"white\";\n ctx.shadowBlur = 0;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(this.label, 0, 0);\n }\n\n public setPosition(vp: Viewport): boolean {\n vp.worldToView(this.worldLocation, this.position);\n this.position.y -= Math.floor(vp.pixelsFromInches(0.45)) + 0.5; // Offset from world location...\n return vp.viewRect.containsPoint(this.position);\n }\n\n public addDecoration(context: DecorateContext) {\n if (this.setPosition(context.viewport))\n context.addCanvasDecoration(this);\n }\n}\n\n/** Change or update geolocation for project.\n * To show tool settings for specifying lat/long, make sure formatting and parsing data are cached before the tool starts\n * by calling QuantityFormatter.onInitialized at app startup.\n * @beta\n */\nexport class ProjectGeolocationPointTool extends PrimitiveTool {\n public static override toolId = \"ProjectLocation.Geolocation.Point\";\n public static override iconSpec = \"icon-globe\"; // <== Tool button should use whatever icon you have here...\n\n public static override get minArgs() { return 0; }\n public static override get maxArgs() { return 4; } // latitude, longitude, altitude, north direction...\n\n protected _haveToolSettings = false;\n protected _cartographicFromArgs = false;\n\n protected _accept = false;\n protected _scale = 1.0;\n protected _origin?: Point3d;\n protected _labelDeco?: LabelDecoration;\n\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && vp.view.isSpatialView()); }\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; } // Allow snapping to terrain, etc. outside project extents...\n public override requireWriteableTarget(): boolean { return false; } // Tool doesn't modify the imodel...\n public override async onPostInstall() {\n await super.onPostInstall();\n this.setupAndPromptForNextAction();\n }\n\n public override async onCleanup() {\n await super.onCleanup();\n this.unsuspendDecorations();\n }\n\n public async onRestartTool() { return this.exitTool(); }\n public override async onUnsuspend() { this.provideToolAssistance(); }\n\n private _latitudeProperty: DialogProperty<number> | undefined;\n public get latitudeProperty() {\n if (!this._latitudeProperty)\n this._latitudeProperty = new DialogProperty<number>(new AngleDescription(\"latitude\", translateMessage(\"Latitude\")), 0.0);\n return this._latitudeProperty;\n }\n\n public get latitude(): number { return this.latitudeProperty.value; }\n public set latitude(value: number) { this.latitudeProperty.value = value; }\n\n private _longitudeProperty: DialogProperty<number> | undefined;\n public get longitudeProperty() {\n if (!this._longitudeProperty)\n this._longitudeProperty = new DialogProperty<number>(new AngleDescription(\"longitude\", translateMessage(\"Longitude\")), 0.0);\n return this._longitudeProperty;\n }\n\n public get longitude(): number { return this.longitudeProperty.value; }\n public set longitude(value: number) { this.longitudeProperty.value = value; }\n\n private _altitudeProperty: DialogProperty<number> | undefined;\n public get altitudeProperty() {\n if (!this._altitudeProperty)\n this._altitudeProperty = new DialogProperty<number>(new LengthDescription(\"altitude\", CoreTools.translate(\"Measure.Labels.Altitude\")), 0.0);\n return this._altitudeProperty;\n }\n\n public get altitude(): number { return this.altitudeProperty.value; }\n public set altitude(value: number) { this.altitudeProperty.value = value; }\n\n private _northProperty: DialogProperty<number> | undefined;\n public get northProperty() {\n if (!this._northProperty)\n this._northProperty = new DialogProperty<number>(new AngleDescription(\"north\", translateMessage(\"North\")), 0.0);\n return this._northProperty;\n }\n\n public get north(): number { return this.northProperty.value; }\n public set north(value: number) { this.northProperty.value = value; }\n\n private syncToolSettingsCoordinates(): void {\n this.syncToolSettingsProperties([this.latitudeProperty.syncItem, this.longitudeProperty.syncItem, this.altitudeProperty.syncItem, this.northProperty.syncItem]);\n }\n\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\n return this.changeToolSettingPropertyValue(updatedValue);\n }\n\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\n this._haveToolSettings = true;\n const toolSettings = new Array<DialogItem>();\n toolSettings.push(this.latitudeProperty.toDialogItem({ rowPriority: 1, columnIndex: 2 }));\n toolSettings.push(this.longitudeProperty.toDialogItem({ rowPriority: 2, columnIndex: 2 }));\n toolSettings.push(this.altitudeProperty.toDialogItem({ rowPriority: 3, columnIndex: 2 }));\n toolSettings.push(this.northProperty.toDialogItem({ rowPriority: 4, columnIndex: 2 }));\n return toolSettings;\n }\n\n protected provideToolAssistance(): void {\n const acceptMsg = CoreTools.translate(undefined === this._origin ? \"ElementSet.Inputs.AcceptPoint\" : \"ElementSet.Inputs.Accept\");\n const rejectMsg = CoreTools.translate(\"ElementSet.Inputs.Cancel\");\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, translatePrompt(undefined === this._origin ? \"IdentifyKnownLocation\" : \"ConfirmCoordinates\"));\n const sections: ToolAssistanceSection[] = [];\n\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, acceptMsg, false, ToolAssistanceInputMethod.Mouse));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, rejectMsg, false, ToolAssistanceInputMethod.Mouse));\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\n\n const touchInstructions: ToolAssistanceInstruction[] = [];\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, acceptMsg, false, ToolAssistanceInputMethod.Touch));\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, rejectMsg, false, ToolAssistanceInputMethod.Touch));\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\n\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n protected setupAndPromptForNextAction(): void {\n IModelApp.accuSnap.enableSnap(undefined === this._origin);\n this.provideToolAssistance();\n }\n\n private pulseDecoration() {\n if (!this._accept)\n return;\n\n const deco = ProjectExtentsClipDecoration.get();\n if (undefined === deco)\n return;\n\n this._scale += 0.1;\n if (this._scale > 1.6)\n this._scale = 1.0;\n\n deco.viewport.invalidateDecorations();\n setTimeout(() => this.pulseDecoration(), 100);\n }\n\n private unsuspendDecorations() {\n const deco = ProjectExtentsClipDecoration.get();\n if (undefined !== deco)\n deco.suspendGeolocationDecorations = false;\n }\n\n public override decorate(context: DecorateContext): void {\n if (undefined === this._origin || !context.viewport.view.isSpatialView())\n return;\n\n const deco = ProjectExtentsClipDecoration.get();\n if (undefined === deco)\n return;\n\n deco.suspendGeolocationDecorations = true;\n deco.drawMonumentPoint(context, this._origin, this._scale);\n\n if (undefined !== this._labelDeco)\n this._labelDeco.addDecoration(context);\n }\n\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\n if (undefined === ev.viewport || this._accept)\n return;\n\n this._origin = ev.point.clone();\n ev.viewport.invalidateDecorations();\n }\n\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\n await this.onReinitialize(); // Calls onRestartTool to exit...\n return EventHandled.No;\n }\n\n protected acceptDefaultLocation(): void {\n // Greenwich is better default when testing control handle w/o tool settings support...\n this.latitude = Angle.createDegrees(51.4934).radians;\n this.longitude = Angle.createDegrees(0.0098).radians;\n this.altitude = 50.0;\n this.north = 0.0;\n }\n\n public acceptKnownLocation(ev: BeButtonEvent): void {\n const deco = ProjectExtentsClipDecoration.get();\n if (undefined === deco)\n return;\n\n this._accept = true; // Require explicit accept to give user a chance to change values...\n this._origin = ev.point.clone();\n this._labelDeco = new LabelDecoration(this._origin, translatePrompt(\"SpecifyCoordinates\"));\n\n if (!this._cartographicFromArgs) {\n if (this.iModel.isGeoLocated) {\n const cartographic = this.iModel.spatialToCartographicFromEcef(this._origin);\n this.latitude = cartographic.latitude;\n this.longitude = cartographic.longitude;\n this.altitude = cartographic.height;\n this.north = deco.getClockwiseAngleToNorth().radians;\n } else if (!this._haveToolSettings) {\n this.acceptDefaultLocation();\n }\n }\n\n this.syncToolSettingsCoordinates();\n this.pulseDecoration(); // Pulse to indicate that we are waiting for user input...\n this.setupAndPromptForNextAction();\n }\n\n public async acceptCoordinates(): Promise<void> {\n const deco = ProjectExtentsClipDecoration.get();\n if (undefined === deco)\n return;\n\n const origin = Cartographic.fromRadians({longitude: this.longitude, latitude: this.latitude, height: this.altitude});\n if (!deco.updateEcefLocation(origin, this._origin, Angle.createRadians(this.north)))\n return;\n\n return this.onReinitialize(); // Calls onRestartTool to exit...\n }\n\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n if (undefined === ev.viewport)\n return EventHandled.No; // Shouldn't really happen...\n\n const haveKnownLocation = this._accept;\n if (!haveKnownLocation)\n this.acceptKnownLocation(ev);\n\n const needAcceptPoint = !haveKnownLocation && this._haveToolSettings;\n if (!needAcceptPoint)\n await this.acceptCoordinates();\n\n return EventHandled.No;\n }\n\n public override async onInstall(): Promise<boolean> {\n if (!ProjectExtentsClipDecoration.allowEcefLocationChange(false))\n return false;\n\n // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...\n this.initializeToolSettingPropertyValues([this.latitudeProperty, this.longitudeProperty, this.altitudeProperty, this.northProperty]);\n\n return true;\n }\n\n /** The keyin takes the following arguments, all of which are optional:\n * - `latitude=number` Latitude of accept point in degrees.\n * - `longitude=number` Longitude of accept point in degrees.\n * - `altitude=number` Height above ellipsoid of accept point.\n * - `north=number` North direction in degrees of accept point.\n */\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\n for (const arg of inputArgs) {\n const parts = arg.split(\"=\");\n if (2 !== parts.length)\n continue;\n\n if (parts[0].toLowerCase().startsWith(\"la\")) {\n const latitude = Number.parseFloat(parts[1]);\n if (!Number.isNaN(latitude)) {\n this.saveToolSettingPropertyValue(this.latitudeProperty, { value: Angle.createDegrees(latitude).radians });\n this._cartographicFromArgs = true;\n }\n } else if (parts[0].toLowerCase().startsWith(\"lo\")) {\n const longitude = Number.parseFloat(parts[1]);\n if (!Number.isNaN(longitude)) {\n this.saveToolSettingPropertyValue(this.longitudeProperty, { value: Angle.createDegrees(longitude).radians });\n this._cartographicFromArgs = true;\n }\n } else if (parts[0].toLowerCase().startsWith(\"al\")) {\n const altitude = Number.parseFloat(parts[1]);\n if (!Number.isNaN(altitude)) {\n this.saveToolSettingPropertyValue(this.altitudeProperty, { value: altitude });\n this._cartographicFromArgs = true;\n }\n } else if (parts[0].toLowerCase().startsWith(\"no\")) {\n const north = Number.parseFloat(parts[1]);\n if (!Number.isNaN(north)) {\n this.saveToolSettingPropertyValue(this.northProperty, { value: Angle.createDegrees(north).radians });\n this._cartographicFromArgs = true;\n }\n }\n }\n\n return this.run();\n }\n\n public static async startTool(): Promise<boolean> { return new ProjectGeolocationPointTool().run(); }\n}\n\n/** Change or update geolocation direction to true north.\n * @beta\n */\nexport class ProjectGeolocationNorthTool extends PrimitiveTool {\n public static override toolId = \"ProjectLocation.Geolocation.North\";\n public static override iconSpec = \"icon-sort-up\"; // <== Tool button should use whatever icon you have here...\n protected _origin?: Point3d;\n protected _northDir?: Ray3d;\n\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && vp.view.isSpatialView()); }\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; } // Allow snapping to terrain, etc. outside project extents...\n public override requireWriteableTarget(): boolean { return false; } // Tool doesn't modify the imodel...\n public override async onPostInstall() {\n await super.onPostInstall();\n this.setupAndPromptForNextAction();\n }\n public override async onCleanup() {\n await super.onCleanup();\n this.unsuspendDecorations();\n }\n public async onRestartTool() { return this.exitTool(); }\n public override async onUnsuspend() { this.provideToolAssistance(); }\n\n protected provideToolAssistance(): void {\n const acceptMsg = CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\");\n const rejectMsg = CoreTools.translate(\"ElementSet.Inputs.Cancel\");\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, translatePrompt(undefined === this._origin ? \"IdentifyRefPoint\" : \"DefineAngle\"));\n const sections: ToolAssistanceSection[] = [];\n\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, acceptMsg, false, ToolAssistanceInputMethod.Mouse));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, rejectMsg, false, ToolAssistanceInputMethod.Mouse));\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\n\n const touchInstructions: ToolAssistanceInstruction[] = [];\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, acceptMsg, false, ToolAssistanceInputMethod.Touch));\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, rejectMsg, false, ToolAssistanceInputMethod.Touch));\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\n\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n protected setupAndPromptForNextAction(): void {\n IModelApp.accuSnap.enableSnap(true);\n this.provideToolAssistance();\n\n if (undefined === this._origin)\n return;\n\n const hints = new AccuDrawHintBuilder();\n hints.setRotation(Matrix3d.createIdentity());\n hints.setOrigin(this._origin);\n hints.setModePolar();\n hints.setOriginFixed = true;\n hints.setLockZ = true;\n hints.sendHints();\n }\n\n private getAdjustedPoint(ev: BeButtonEvent): Point3d | undefined {\n if (undefined === this._origin)\n return undefined;\n return AccuDrawHintBuilder.projectPointToPlaneInView(ev.point, this._origin, Vector3d.unitZ(), ev.viewport!, true);\n }\n\n private unsuspendDecorations() {\n const deco = ProjectExtentsClipDecoration.get();\n if (undefined !== deco)\n deco.suspendGeolocationDecorations = false;\n }\n\n private updateNorthVector(ev: BeButtonEvent): void {\n if (undefined === ev.viewport)\n return;\n\n if (undefined === this._northDir)\n this._northDir = Ray3d.create(ev.point, Vector3d.unitY());\n else\n this._northDir.origin.setFrom(undefined !== this._origin ? this._origin : ev.point);\n\n const dirPt = this.getAdjustedPoint(ev);\n if (undefined === dirPt)\n return;\n\n this._northDir.direction.setStartEnd(this._northDir.origin, dirPt);\n if (this._northDir.direction.magnitude() < 1.0e-6)\n this._northDir.direction.setFrom(Vector3d.unitY());\n\n this._northDir.direction.z = 0.0;\n this._northDir.direction.normalizeInPlace();\n }\n\n public override decorate(context: DecorateContext): void {\n if (undefined === this._northDir || !context.viewport.view.isSpatialView())\n return;\n\n const deco = ProjectExtentsClipDecoration.get();\n if (undefined === deco)\n return;\n\n deco.suspendGeolocationDecorations = true;\n deco.drawNorthArrow(context, this._northDir);\n }\n\n public override async onKeyTransition(wentDown: boolean, keyEvent: KeyboardEvent): Promise<EventHandled> {\n if (EventHandled.Yes === await super.onKeyTransition(wentDown, keyEvent))\n return EventHandled.Yes;\n return (wentDown && await AccuDrawShortcuts.processShortcutKey(keyEvent)) ? EventHandled.Yes : EventHandled.No;\n }\n\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\n if (undefined === ev.viewport)\n return;\n\n this.updateNorthVector(ev);\n ev.viewport.invalidateDecorations();\n }\n\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\n await this.onReinitialize(); // Calls onRestartTool to exit...\n return EventHandled.No;\n }\n\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n if (undefined === ev.viewport)\n return EventHandled.No; // Shouldn't really happen...\n\n if (undefined === this._origin) {\n this._origin = ev.point.clone();\n this.setupAndPromptForNextAction();\n return EventHandled.No;\n }\n\n this.updateNorthVector(ev);\n\n if (undefined !== this._northDir) {\n const deco = ProjectExtentsClipDecoration.get();\n if (undefined !== deco)\n deco.updateNorthDirection(this._northDir);\n }\n\n await this.onReinitialize(); // Calls onRestartTool to exit...\n return EventHandled.No;\n }\n\n public override async onInstall(): Promise<boolean> { return ProjectExtentsClipDecoration.allowEcefLocationChange(true); }\n\n public static async startTool() { return new ProjectGeolocationNorthTool().run(); }\n}\n\n/** Move a geolocated model by specifying two points to define the offset.\n * @beta\n */\nexport class ProjectGeolocationMoveTool extends PrimitiveTool {\n public static override toolId = \"ProjectLocation.Geolocation.Move\";\n public static override iconSpec = \"icon-move\"; // <== Tool button should use whatever icon you have here...\n protected _origin?: Point3d;\n protected _current?: Point3d;\n\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && vp.view.isSpatialView()); }\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; } // Allow snapping to terrain, etc. outside project extents...\n public override requireWriteableTarget(): boolean { return false; } // Tool doesn't modify the imodel...\n public override async onPostInstall() {\n await super.onPostInstall();\n this.setupAndPromptForNextAction();\n }\n public override async onCleanup() {\n await super.onCleanup();\n this.unsuspendDecorations();\n }\n public async onRestartTool() {\n const tool = new ProjectGeolocationMoveTool();\n if (!await tool.run())\n return this.exitTool();\n }\n\n public override async onUnsuspend() { this.provideToolAssistance(); }\n\n protected provideToolAssistance(): void {\n const acceptMsg = CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\");\n const rejectMsg = CoreTools.translate(\"ElementSet.Inputs.Cancel\");\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, translatePrompt(undefined === this._origin ? \"IdentifyRefPoint\" : \"DefineOffset\"));\n const sections: ToolAssistanceSection[] = [];\n\n const mouseInstructions: ToolAssistanceInstruction[] = [];\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, acceptMsg, false, ToolAssistanceInputMethod.Mouse));\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, rejectMsg, false, ToolAssistanceInputMethod.Mouse));\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\n\n const touchInstructions: ToolAssistanceInstruction[] = [];\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, acceptMsg, false, ToolAssistanceInputMethod.Touch));\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, rejectMsg, false, ToolAssistanceInputMethod.Touch));\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\n\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\n IModelApp.notifications.setToolAssistance(instructions);\n }\n\n protected setupAndPromptForNextAction(): void {\n IModelApp.accuSnap.enableSnap(true);\n this.provideToolAssistance();\n\n if (undefined === this._origin)\n return;\n\n const hints = new AccuDrawHintBuilder();\n hints.setRotation(Matrix3d.createIdentity());\n hints.setOrigin(this._origin);\n hints.setModePolar();\n hints.setOriginFixed = true;\n hints.sendHints();\n }\n\n private unsuspendDecorations() {\n const deco = ProjectExtentsClipDecoration.get();\n if (undefined !== deco)\n deco.suspendGeolocationDecorations = false;\n }\n\n private async acceptOffset(ev: BeButtonEvent): Promise<void> {\n if (undefined === ev.viewport || undefined === this._origin)\n return;\n\n const deco = ProjectExtentsClipDecoration.get();\n if (undefined === deco)\n return;\n\n const origin = this.iModel.spatialToCartographicFromEcef(ev.point);\n if (!deco.updateEcefLocation(origin, this._origin))\n return;\n\n return this.onReinitialize(); // Calls onRestartTool to exit...\n }\n\n public override decorate(context: DecorateContext): void {\n if (undefined === this._origin || undefined === this._current || !context.viewport.view.isSpatialView())\n return;\n\n const deco = ProjectExtentsClipDecoration.get();\n if (undefined === deco)\n return;\n\n const builderAccVis = context.createGraphicBuilder(GraphicType.WorldDecoration);\n const builderAccHid = context.createGraphicBuilder(GraphicType.WorldOverlay);\n const colorAccVis = ColorDef.white.adjustedForContrast(context.viewport.view.backgroundColor);\n const colorAccHid = colorAccVis.withAlpha(100);\n\n builderAccVis.setSymbology(colorAccVis, ColorDef.black, 3);\n builderAccHid.setSymbology(colorAccHid, ColorDef.black, 1, LinePixels.Code2);\n\n const extents = this.iModel.projectExtents.cloneTranslated(Vector3d.createStartEnd(this._origin, this._current));\n\n builderAccVis.addRangeBox(extents);\n builderAccHid.addRangeBox(extents);\n builderAccHid.addLineString([this._origin, this._current]);\n\n context.addDecorationFromBuilder(builderAccVis);\n context.addDecorationFromBuilder(builderAccHid);\n\n deco.suspendGeolocationDecorations = true;\n }\n\n public override async onKeyTransition(wentDown: boolean, keyEvent: KeyboardEvent): Promise<EventHandled> {\n if (EventHandled.Yes === await super.onKeyTransition(wentDown, keyEvent))\n return EventHandled.Yes;\n return (wentDown && await AccuDrawShortcuts.processShortcutKey(keyEvent)) ? EventHandled.Yes : EventHandled.No;\n }\n\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\n if (undefined === ev.viewport)\n return;\n\n this._current = ev.point;\n ev.viewport.invalidateDecorations();\n }\n\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\n if (undefined === this._origin)\n await this.exitTool(); // exit to select tool if we haven't gotten first point...\n else\n await this.onReinitialize(); // Calls onRestartTool...\n return EventHandled.No;\n }\n\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\n if (undefined === ev.viewport)\n return EventHandled.No; // Shouldn't really happen...\n\n if (undefined === this._origin) {\n this._origin = ev.point.clone();\n this.setupAndPromptForNextAction();\n return EventHandled.No;\n }\n\n await this.acceptOffset(ev);\n return EventHandled.No;\n }\n\n public override async onInstall(): Promise<boolean> { return ProjectExtentsClipDecoration.allowEcefLocationChange(true); }\n\n public static async startTool() { return new ProjectGeolocationMoveTool().run(); }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"ProjectGeolocation.js","sourceRoot":"","sources":["../../../src/ProjectLocation/ProjectGeolocation.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Editing\r\n */\r\n\r\nimport { AccuDrawHintBuilder, AccuDrawShortcuts, AngleDescription, BeButtonEvent, CanvasDecoration, CoreTools, DecorateContext, EventHandled, GraphicType, IModelApp, LengthDescription, PrimitiveTool, ToolAssistance, ToolAssistanceImage, ToolAssistanceInputMethod, ToolAssistanceInstruction, ToolAssistanceSection, Viewport } from \"@itwin/core-frontend\";\r\nimport { Angle, Matrix3d, Point3d, Ray3d, Vector3d, XYAndZ } from \"@itwin/core-geometry\";\r\nimport { Cartographic, ColorDef, LinePixels } from \"@itwin/core-common\";\r\nimport { ProjectExtentsClipDecoration } from \"./ProjectExtentsDecoration\";\r\nimport { DialogItem, DialogProperty, DialogPropertySyncItem } from \"@itwin/appui-abstract\";\r\nimport { EditTools } from \"../EditTool\";\r\n\r\nfunction translatePrompt(key: string) {\r\n return EditTools.translate(`ProjectLocation:Prompts.${key}`);\r\n}\r\nfunction translateMessage(key: string) {\r\n return EditTools.translate(`ProjectLocation:Message.${key}`);\r\n}\r\n\r\n/** @internal */\r\nclass LabelDecoration implements CanvasDecoration {\r\n public worldLocation = new Point3d();\r\n public position = new Point3d();\r\n public label: string;\r\n\r\n constructor(worldLocation: XYAndZ, label: string) {\r\n this.worldLocation.setFrom(worldLocation);\r\n this.label = label;\r\n }\r\n\r\n public drawDecoration(ctx: CanvasRenderingContext2D): void {\r\n ctx.font = \"16px san-serif\";\r\n const labelHeight = ctx.measureText(\"M\").width; // Close enough for border padding...\r\n const labelWidth = ctx.measureText(this.label).width + labelHeight;\r\n\r\n ctx.lineWidth = 1;\r\n ctx.strokeStyle = \"white\";\r\n ctx.fillStyle = \"rgba(0,0,0,.4)\";\r\n ctx.shadowColor = \"black\";\r\n ctx.shadowBlur = 10;\r\n ctx.fillRect(-(labelWidth / 2), -labelHeight, labelWidth, labelHeight * 2);\r\n ctx.strokeRect(-(labelWidth / 2), -labelHeight, labelWidth, labelHeight * 2);\r\n\r\n ctx.fillStyle = \"white\";\r\n ctx.shadowBlur = 0;\r\n ctx.textAlign = \"center\";\r\n ctx.textBaseline = \"middle\";\r\n ctx.fillText(this.label, 0, 0);\r\n }\r\n\r\n public setPosition(vp: Viewport): boolean {\r\n vp.worldToView(this.worldLocation, this.position);\r\n this.position.y -= Math.floor(vp.pixelsFromInches(0.45)) + 0.5; // Offset from world location...\r\n return vp.viewRect.containsPoint(this.position);\r\n }\r\n\r\n public addDecoration(context: DecorateContext) {\r\n if (this.setPosition(context.viewport))\r\n context.addCanvasDecoration(this);\r\n }\r\n}\r\n\r\n/** Change or update geolocation for project.\r\n * To show tool settings for specifying lat/long, make sure formatting and parsing data are cached before the tool starts\r\n * by calling QuantityFormatter.onInitialized at app startup.\r\n * @beta\r\n */\r\nexport class ProjectGeolocationPointTool extends PrimitiveTool {\r\n public static override toolId = \"ProjectLocation.Geolocation.Point\";\r\n public static override iconSpec = \"icon-globe\"; // <== Tool button should use whatever icon you have here...\r\n\r\n public static override get minArgs() { return 0; }\r\n public static override get maxArgs() { return 4; } // latitude, longitude, altitude, north direction...\r\n\r\n protected _haveToolSettings = false;\r\n protected _cartographicFromArgs = false;\r\n\r\n protected _accept = false;\r\n protected _scale = 1.0;\r\n protected _origin?: Point3d;\r\n protected _labelDeco?: LabelDecoration;\r\n\r\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && vp.view.isSpatialView()); }\r\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; } // Allow snapping to terrain, etc. outside project extents...\r\n public override requireWriteableTarget(): boolean { return false; } // Tool doesn't modify the imodel...\r\n public override async onPostInstall() {\r\n await super.onPostInstall();\r\n this.setupAndPromptForNextAction();\r\n }\r\n\r\n public override async onCleanup() {\r\n await super.onCleanup();\r\n this.unsuspendDecorations();\r\n }\r\n\r\n public async onRestartTool() { return this.exitTool(); }\r\n public override async onUnsuspend() { this.provideToolAssistance(); }\r\n\r\n private _latitudeProperty: DialogProperty<number> | undefined;\r\n public get latitudeProperty() {\r\n if (!this._latitudeProperty)\r\n this._latitudeProperty = new DialogProperty<number>(new AngleDescription(\"latitude\", translateMessage(\"Latitude\")), 0.0);\r\n return this._latitudeProperty;\r\n }\r\n\r\n public get latitude(): number { return this.latitudeProperty.value; }\r\n public set latitude(value: number) { this.latitudeProperty.value = value; }\r\n\r\n private _longitudeProperty: DialogProperty<number> | undefined;\r\n public get longitudeProperty() {\r\n if (!this._longitudeProperty)\r\n this._longitudeProperty = new DialogProperty<number>(new AngleDescription(\"longitude\", translateMessage(\"Longitude\")), 0.0);\r\n return this._longitudeProperty;\r\n }\r\n\r\n public get longitude(): number { return this.longitudeProperty.value; }\r\n public set longitude(value: number) { this.longitudeProperty.value = value; }\r\n\r\n private _altitudeProperty: DialogProperty<number> | undefined;\r\n public get altitudeProperty() {\r\n if (!this._altitudeProperty)\r\n this._altitudeProperty = new DialogProperty<number>(new LengthDescription(\"altitude\", CoreTools.translate(\"Measure.Labels.Altitude\")), 0.0);\r\n return this._altitudeProperty;\r\n }\r\n\r\n public get altitude(): number { return this.altitudeProperty.value; }\r\n public set altitude(value: number) { this.altitudeProperty.value = value; }\r\n\r\n private _northProperty: DialogProperty<number> | undefined;\r\n public get northProperty() {\r\n if (!this._northProperty)\r\n this._northProperty = new DialogProperty<number>(new AngleDescription(\"north\", translateMessage(\"North\")), 0.0);\r\n return this._northProperty;\r\n }\r\n\r\n public get north(): number { return this.northProperty.value; }\r\n public set north(value: number) { this.northProperty.value = value; }\r\n\r\n private syncToolSettingsCoordinates(): void {\r\n this.syncToolSettingsProperties([this.latitudeProperty.syncItem, this.longitudeProperty.syncItem, this.altitudeProperty.syncItem, this.northProperty.syncItem]);\r\n }\r\n\r\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\r\n return this.changeToolSettingPropertyValue(updatedValue);\r\n }\r\n\r\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\r\n this._haveToolSettings = true;\r\n const toolSettings = new Array<DialogItem>();\r\n toolSettings.push(this.latitudeProperty.toDialogItem({ rowPriority: 1, columnIndex: 2 }));\r\n toolSettings.push(this.longitudeProperty.toDialogItem({ rowPriority: 2, columnIndex: 2 }));\r\n toolSettings.push(this.altitudeProperty.toDialogItem({ rowPriority: 3, columnIndex: 2 }));\r\n toolSettings.push(this.northProperty.toDialogItem({ rowPriority: 4, columnIndex: 2 }));\r\n return toolSettings;\r\n }\r\n\r\n protected provideToolAssistance(): void {\r\n const acceptMsg = CoreTools.translate(undefined === this._origin ? \"ElementSet.Inputs.AcceptPoint\" : \"ElementSet.Inputs.Accept\");\r\n const rejectMsg = CoreTools.translate(\"ElementSet.Inputs.Cancel\");\r\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, translatePrompt(undefined === this._origin ? \"IdentifyKnownLocation\" : \"ConfirmCoordinates\"));\r\n const sections: ToolAssistanceSection[] = [];\r\n\r\n const mouseInstructions: ToolAssistanceInstruction[] = [];\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, acceptMsg, false, ToolAssistanceInputMethod.Mouse));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, rejectMsg, false, ToolAssistanceInputMethod.Mouse));\r\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\r\n\r\n const touchInstructions: ToolAssistanceInstruction[] = [];\r\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, acceptMsg, false, ToolAssistanceInputMethod.Touch));\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, rejectMsg, false, ToolAssistanceInputMethod.Touch));\r\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\r\n\r\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\r\n IModelApp.notifications.setToolAssistance(instructions);\r\n }\r\n\r\n protected setupAndPromptForNextAction(): void {\r\n IModelApp.accuSnap.enableSnap(undefined === this._origin);\r\n this.provideToolAssistance();\r\n }\r\n\r\n private pulseDecoration() {\r\n if (!this._accept)\r\n return;\r\n\r\n const deco = ProjectExtentsClipDecoration.get();\r\n if (undefined === deco)\r\n return;\r\n\r\n this._scale += 0.1;\r\n if (this._scale > 1.6)\r\n this._scale = 1.0;\r\n\r\n deco.viewport.invalidateDecorations();\r\n setTimeout(() => this.pulseDecoration(), 100);\r\n }\r\n\r\n private unsuspendDecorations() {\r\n const deco = ProjectExtentsClipDecoration.get();\r\n if (undefined !== deco)\r\n deco.suspendGeolocationDecorations = false;\r\n }\r\n\r\n public override decorate(context: DecorateContext): void {\r\n if (undefined === this._origin || !context.viewport.view.isSpatialView())\r\n return;\r\n\r\n const deco = ProjectExtentsClipDecoration.get();\r\n if (undefined === deco)\r\n return;\r\n\r\n deco.suspendGeolocationDecorations = true;\r\n deco.drawMonumentPoint(context, this._origin, this._scale);\r\n\r\n if (undefined !== this._labelDeco)\r\n this._labelDeco.addDecoration(context);\r\n }\r\n\r\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\r\n if (undefined === ev.viewport || this._accept)\r\n return;\r\n\r\n this._origin = ev.point.clone();\r\n ev.viewport.invalidateDecorations();\r\n }\r\n\r\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\r\n await this.onReinitialize(); // Calls onRestartTool to exit...\r\n return EventHandled.No;\r\n }\r\n\r\n protected acceptDefaultLocation(): void {\r\n // Greenwich is better default when testing control handle w/o tool settings support...\r\n this.latitude = Angle.createDegrees(51.4934).radians;\r\n this.longitude = Angle.createDegrees(0.0098).radians;\r\n this.altitude = 50.0;\r\n this.north = 0.0;\r\n }\r\n\r\n public acceptKnownLocation(ev: BeButtonEvent): void {\r\n const deco = ProjectExtentsClipDecoration.get();\r\n if (undefined === deco)\r\n return;\r\n\r\n this._accept = true; // Require explicit accept to give user a chance to change values...\r\n this._origin = ev.point.clone();\r\n this._labelDeco = new LabelDecoration(this._origin, translatePrompt(\"SpecifyCoordinates\"));\r\n\r\n if (!this._cartographicFromArgs) {\r\n if (this.iModel.isGeoLocated) {\r\n const cartographic = this.iModel.spatialToCartographicFromEcef(this._origin);\r\n this.latitude = cartographic.latitude;\r\n this.longitude = cartographic.longitude;\r\n this.altitude = cartographic.height;\r\n this.north = deco.getClockwiseAngleToNorth().radians;\r\n } else if (!this._haveToolSettings) {\r\n this.acceptDefaultLocation();\r\n }\r\n }\r\n\r\n this.syncToolSettingsCoordinates();\r\n this.pulseDecoration(); // Pulse to indicate that we are waiting for user input...\r\n this.setupAndPromptForNextAction();\r\n }\r\n\r\n public async acceptCoordinates(): Promise<void> {\r\n const deco = ProjectExtentsClipDecoration.get();\r\n if (undefined === deco)\r\n return;\r\n\r\n const origin = Cartographic.fromRadians({longitude: this.longitude, latitude: this.latitude, height: this.altitude});\r\n if (!deco.updateEcefLocation(origin, this._origin, Angle.createRadians(this.north)))\r\n return;\r\n\r\n return this.onReinitialize(); // Calls onRestartTool to exit...\r\n }\r\n\r\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\r\n if (undefined === ev.viewport)\r\n return EventHandled.No; // Shouldn't really happen...\r\n\r\n const haveKnownLocation = this._accept;\r\n if (!haveKnownLocation)\r\n this.acceptKnownLocation(ev);\r\n\r\n const needAcceptPoint = !haveKnownLocation && this._haveToolSettings;\r\n if (!needAcceptPoint)\r\n await this.acceptCoordinates();\r\n\r\n return EventHandled.No;\r\n }\r\n\r\n public override async onInstall(): Promise<boolean> {\r\n if (!ProjectExtentsClipDecoration.allowEcefLocationChange(false))\r\n return false;\r\n\r\n // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...\r\n this.initializeToolSettingPropertyValues([this.latitudeProperty, this.longitudeProperty, this.altitudeProperty, this.northProperty]);\r\n\r\n return true;\r\n }\r\n\r\n /** The keyin takes the following arguments, all of which are optional:\r\n * - `latitude=number` Latitude of accept point in degrees.\r\n * - `longitude=number` Longitude of accept point in degrees.\r\n * - `altitude=number` Height above ellipsoid of accept point.\r\n * - `north=number` North direction in degrees of accept point.\r\n */\r\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\r\n for (const arg of inputArgs) {\r\n const parts = arg.split(\"=\");\r\n if (2 !== parts.length)\r\n continue;\r\n\r\n if (parts[0].toLowerCase().startsWith(\"la\")) {\r\n const latitude = Number.parseFloat(parts[1]);\r\n if (!Number.isNaN(latitude)) {\r\n this.saveToolSettingPropertyValue(this.latitudeProperty, { value: Angle.createDegrees(latitude).radians });\r\n this._cartographicFromArgs = true;\r\n }\r\n } else if (parts[0].toLowerCase().startsWith(\"lo\")) {\r\n const longitude = Number.parseFloat(parts[1]);\r\n if (!Number.isNaN(longitude)) {\r\n this.saveToolSettingPropertyValue(this.longitudeProperty, { value: Angle.createDegrees(longitude).radians });\r\n this._cartographicFromArgs = true;\r\n }\r\n } else if (parts[0].toLowerCase().startsWith(\"al\")) {\r\n const altitude = Number.parseFloat(parts[1]);\r\n if (!Number.isNaN(altitude)) {\r\n this.saveToolSettingPropertyValue(this.altitudeProperty, { value: altitude });\r\n this._cartographicFromArgs = true;\r\n }\r\n } else if (parts[0].toLowerCase().startsWith(\"no\")) {\r\n const north = Number.parseFloat(parts[1]);\r\n if (!Number.isNaN(north)) {\r\n this.saveToolSettingPropertyValue(this.northProperty, { value: Angle.createDegrees(north).radians });\r\n this._cartographicFromArgs = true;\r\n }\r\n }\r\n }\r\n\r\n return this.run();\r\n }\r\n\r\n public static async startTool(): Promise<boolean> { return new ProjectGeolocationPointTool().run(); }\r\n}\r\n\r\n/** Change or update geolocation direction to true north.\r\n * @beta\r\n */\r\nexport class ProjectGeolocationNorthTool extends PrimitiveTool {\r\n public static override toolId = \"ProjectLocation.Geolocation.North\";\r\n public static override iconSpec = \"icon-sort-up\"; // <== Tool button should use whatever icon you have here...\r\n protected _origin?: Point3d;\r\n protected _northDir?: Ray3d;\r\n\r\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && vp.view.isSpatialView()); }\r\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; } // Allow snapping to terrain, etc. outside project extents...\r\n public override requireWriteableTarget(): boolean { return false; } // Tool doesn't modify the imodel...\r\n public override async onPostInstall() {\r\n await super.onPostInstall();\r\n this.setupAndPromptForNextAction();\r\n }\r\n public override async onCleanup() {\r\n await super.onCleanup();\r\n this.unsuspendDecorations();\r\n }\r\n public async onRestartTool() { return this.exitTool(); }\r\n public override async onUnsuspend() { this.provideToolAssistance(); }\r\n\r\n protected provideToolAssistance(): void {\r\n const acceptMsg = CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\");\r\n const rejectMsg = CoreTools.translate(\"ElementSet.Inputs.Cancel\");\r\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, translatePrompt(undefined === this._origin ? \"IdentifyRefPoint\" : \"DefineAngle\"));\r\n const sections: ToolAssistanceSection[] = [];\r\n\r\n const mouseInstructions: ToolAssistanceInstruction[] = [];\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, acceptMsg, false, ToolAssistanceInputMethod.Mouse));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, rejectMsg, false, ToolAssistanceInputMethod.Mouse));\r\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\r\n\r\n const touchInstructions: ToolAssistanceInstruction[] = [];\r\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, acceptMsg, false, ToolAssistanceInputMethod.Touch));\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, rejectMsg, false, ToolAssistanceInputMethod.Touch));\r\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\r\n\r\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\r\n IModelApp.notifications.setToolAssistance(instructions);\r\n }\r\n\r\n protected setupAndPromptForNextAction(): void {\r\n IModelApp.accuSnap.enableSnap(true);\r\n this.provideToolAssistance();\r\n\r\n if (undefined === this._origin)\r\n return;\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n hints.setRotation(Matrix3d.createIdentity());\r\n hints.setOrigin(this._origin);\r\n hints.setModePolar();\r\n hints.setOriginFixed = true;\r\n hints.setLockZ = true;\r\n hints.sendHints();\r\n }\r\n\r\n private getAdjustedPoint(ev: BeButtonEvent): Point3d | undefined {\r\n if (undefined === this._origin)\r\n return undefined;\r\n return AccuDrawHintBuilder.projectPointToPlaneInView(ev.point, this._origin, Vector3d.unitZ(), ev.viewport!, true);\r\n }\r\n\r\n private unsuspendDecorations() {\r\n const deco = ProjectExtentsClipDecoration.get();\r\n if (undefined !== deco)\r\n deco.suspendGeolocationDecorations = false;\r\n }\r\n\r\n private updateNorthVector(ev: BeButtonEvent): void {\r\n if (undefined === ev.viewport)\r\n return;\r\n\r\n if (undefined === this._northDir)\r\n this._northDir = Ray3d.create(ev.point, Vector3d.unitY());\r\n else\r\n this._northDir.origin.setFrom(undefined !== this._origin ? this._origin : ev.point);\r\n\r\n const dirPt = this.getAdjustedPoint(ev);\r\n if (undefined === dirPt)\r\n return;\r\n\r\n this._northDir.direction.setStartEnd(this._northDir.origin, dirPt);\r\n if (this._northDir.direction.magnitude() < 1.0e-6)\r\n this._northDir.direction.setFrom(Vector3d.unitY());\r\n\r\n this._northDir.direction.z = 0.0;\r\n this._northDir.direction.normalizeInPlace();\r\n }\r\n\r\n public override decorate(context: DecorateContext): void {\r\n if (undefined === this._northDir || !context.viewport.view.isSpatialView())\r\n return;\r\n\r\n const deco = ProjectExtentsClipDecoration.get();\r\n if (undefined === deco)\r\n return;\r\n\r\n deco.suspendGeolocationDecorations = true;\r\n deco.drawNorthArrow(context, this._northDir);\r\n }\r\n\r\n public override async onKeyTransition(wentDown: boolean, keyEvent: KeyboardEvent): Promise<EventHandled> {\r\n if (EventHandled.Yes === await super.onKeyTransition(wentDown, keyEvent))\r\n return EventHandled.Yes;\r\n return (wentDown && await AccuDrawShortcuts.processShortcutKey(keyEvent)) ? EventHandled.Yes : EventHandled.No;\r\n }\r\n\r\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\r\n if (undefined === ev.viewport)\r\n return;\r\n\r\n this.updateNorthVector(ev);\r\n ev.viewport.invalidateDecorations();\r\n }\r\n\r\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\r\n await this.onReinitialize(); // Calls onRestartTool to exit...\r\n return EventHandled.No;\r\n }\r\n\r\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\r\n if (undefined === ev.viewport)\r\n return EventHandled.No; // Shouldn't really happen...\r\n\r\n if (undefined === this._origin) {\r\n this._origin = ev.point.clone();\r\n this.setupAndPromptForNextAction();\r\n return EventHandled.No;\r\n }\r\n\r\n this.updateNorthVector(ev);\r\n\r\n if (undefined !== this._northDir) {\r\n const deco = ProjectExtentsClipDecoration.get();\r\n if (undefined !== deco)\r\n deco.updateNorthDirection(this._northDir);\r\n }\r\n\r\n await this.onReinitialize(); // Calls onRestartTool to exit...\r\n return EventHandled.No;\r\n }\r\n\r\n public override async onInstall(): Promise<boolean> { return ProjectExtentsClipDecoration.allowEcefLocationChange(true); }\r\n\r\n public static async startTool() { return new ProjectGeolocationNorthTool().run(); }\r\n}\r\n\r\n/** Move a geolocated model by specifying two points to define the offset.\r\n * @beta\r\n */\r\nexport class ProjectGeolocationMoveTool extends PrimitiveTool {\r\n public static override toolId = \"ProjectLocation.Geolocation.Move\";\r\n public static override iconSpec = \"icon-move\"; // <== Tool button should use whatever icon you have here...\r\n protected _origin?: Point3d;\r\n protected _current?: Point3d;\r\n\r\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && vp.view.isSpatialView()); }\r\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; } // Allow snapping to terrain, etc. outside project extents...\r\n public override requireWriteableTarget(): boolean { return false; } // Tool doesn't modify the imodel...\r\n public override async onPostInstall() {\r\n await super.onPostInstall();\r\n this.setupAndPromptForNextAction();\r\n }\r\n public override async onCleanup() {\r\n await super.onCleanup();\r\n this.unsuspendDecorations();\r\n }\r\n public async onRestartTool() {\r\n const tool = new ProjectGeolocationMoveTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n\r\n public override async onUnsuspend() { this.provideToolAssistance(); }\r\n\r\n protected provideToolAssistance(): void {\r\n const acceptMsg = CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\");\r\n const rejectMsg = CoreTools.translate(\"ElementSet.Inputs.Cancel\");\r\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, translatePrompt(undefined === this._origin ? \"IdentifyRefPoint\" : \"DefineOffset\"));\r\n const sections: ToolAssistanceSection[] = [];\r\n\r\n const mouseInstructions: ToolAssistanceInstruction[] = [];\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, acceptMsg, false, ToolAssistanceInputMethod.Mouse));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, rejectMsg, false, ToolAssistanceInputMethod.Mouse));\r\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\r\n\r\n const touchInstructions: ToolAssistanceInstruction[] = [];\r\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, acceptMsg, false, ToolAssistanceInputMethod.Touch));\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, rejectMsg, false, ToolAssistanceInputMethod.Touch));\r\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\r\n\r\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\r\n IModelApp.notifications.setToolAssistance(instructions);\r\n }\r\n\r\n protected setupAndPromptForNextAction(): void {\r\n IModelApp.accuSnap.enableSnap(true);\r\n this.provideToolAssistance();\r\n\r\n if (undefined === this._origin)\r\n return;\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n hints.setRotation(Matrix3d.createIdentity());\r\n hints.setOrigin(this._origin);\r\n hints.setModePolar();\r\n hints.setOriginFixed = true;\r\n hints.sendHints();\r\n }\r\n\r\n private unsuspendDecorations() {\r\n const deco = ProjectExtentsClipDecoration.get();\r\n if (undefined !== deco)\r\n deco.suspendGeolocationDecorations = false;\r\n }\r\n\r\n private async acceptOffset(ev: BeButtonEvent): Promise<void> {\r\n if (undefined === ev.viewport || undefined === this._origin)\r\n return;\r\n\r\n const deco = ProjectExtentsClipDecoration.get();\r\n if (undefined === deco)\r\n return;\r\n\r\n const origin = this.iModel.spatialToCartographicFromEcef(ev.point);\r\n if (!deco.updateEcefLocation(origin, this._origin))\r\n return;\r\n\r\n return this.onReinitialize(); // Calls onRestartTool to exit...\r\n }\r\n\r\n public override decorate(context: DecorateContext): void {\r\n if (undefined === this._origin || undefined === this._current || !context.viewport.view.isSpatialView())\r\n return;\r\n\r\n const deco = ProjectExtentsClipDecoration.get();\r\n if (undefined === deco)\r\n return;\r\n\r\n const builderAccVis = context.createGraphicBuilder(GraphicType.WorldDecoration);\r\n const builderAccHid = context.createGraphicBuilder(GraphicType.WorldOverlay);\r\n const colorAccVis = ColorDef.white.adjustedForContrast(context.viewport.view.backgroundColor);\r\n const colorAccHid = colorAccVis.withAlpha(100);\r\n\r\n builderAccVis.setSymbology(colorAccVis, ColorDef.black, 3);\r\n builderAccHid.setSymbology(colorAccHid, ColorDef.black, 1, LinePixels.Code2);\r\n\r\n const extents = this.iModel.projectExtents.cloneTranslated(Vector3d.createStartEnd(this._origin, this._current));\r\n\r\n builderAccVis.addRangeBox(extents);\r\n builderAccHid.addRangeBox(extents);\r\n builderAccHid.addLineString([this._origin, this._current]);\r\n\r\n context.addDecorationFromBuilder(builderAccVis);\r\n context.addDecorationFromBuilder(builderAccHid);\r\n\r\n deco.suspendGeolocationDecorations = true;\r\n }\r\n\r\n public override async onKeyTransition(wentDown: boolean, keyEvent: KeyboardEvent): Promise<EventHandled> {\r\n if (EventHandled.Yes === await super.onKeyTransition(wentDown, keyEvent))\r\n return EventHandled.Yes;\r\n return (wentDown && await AccuDrawShortcuts.processShortcutKey(keyEvent)) ? EventHandled.Yes : EventHandled.No;\r\n }\r\n\r\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\r\n if (undefined === ev.viewport)\r\n return;\r\n\r\n this._current = ev.point;\r\n ev.viewport.invalidateDecorations();\r\n }\r\n\r\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\r\n if (undefined === this._origin)\r\n await this.exitTool(); // exit to select tool if we haven't gotten first point...\r\n else\r\n await this.onReinitialize(); // Calls onRestartTool...\r\n return EventHandled.No;\r\n }\r\n\r\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\r\n if (undefined === ev.viewport)\r\n return EventHandled.No; // Shouldn't really happen...\r\n\r\n if (undefined === this._origin) {\r\n this._origin = ev.point.clone();\r\n this.setupAndPromptForNextAction();\r\n return EventHandled.No;\r\n }\r\n\r\n await this.acceptOffset(ev);\r\n return EventHandled.No;\r\n }\r\n\r\n public override async onInstall(): Promise<boolean> { return ProjectExtentsClipDecoration.allowEcefLocationChange(true); }\r\n\r\n public static async startTool() { return new ProjectGeolocationMoveTool().run(); }\r\n}\r\n\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformElementsTool.js","sourceRoot":"","sources":["../../src/TransformElementsTool.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Editing\n */\n\nimport { BentleyError, Id64, Id64Arg, Id64String } from \"@itwin/core-bentley\";\nimport { GeometricElementProps, IModelStatus, isPlacement2dProps, PersistentGraphicsRequestProps, Placement, Placement2d, Placement3d } from \"@itwin/core-common\";\nimport { AccuDrawHintBuilder, BeButtonEvent, DynamicsContext, ElementSetTool, GraphicBranch, IModelApp, IModelConnection, IpcApp, ModifyElementSource, NotifyMessageDetails, OutputMessagePriority, readElementGraphics, RenderGraphic, RenderGraphicOwner } from \"@itwin/core-frontend\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { editorBuiltInCmdIds } from \"@itwin/editor-common\";\nimport { EditTools } from \"./EditTool\";\nimport { basicManipulationIpc } from \"./EditToolIpc\";\n\n/** Geometric element id, placement, and RenderGraphic managed by [[TransformGraphicsProvider]].\n * @beta\n */\nexport interface TransformGraphicsData {\n id: Id64String;\n placement: Placement;\n graphic: RenderGraphicOwner;\n}\n\n/** A class for creating and managing RenderGraphics representing geometric elements for the purpose of interactive tool dynamics.\n * @beta\n */\nexport class TransformGraphicsProvider {\n public readonly iModel: IModelConnection;\n public readonly data: TransformGraphicsData[];\n public readonly pending: Map<Id64String, string>;\n public readonly prefix: string;\n /** Chord tolerance to use to stroke the element's geometry in meters. */\n public chordTolerance = 0.01;\n\n constructor(iModel: IModelConnection, prefix: string) {\n this.iModel = iModel;\n this.prefix = prefix;\n this.data = new Array<TransformGraphicsData>();\n this.pending = new Map<Id64String, string>();\n }\n\n private getRequestId(id: Id64String): string { return `${this.prefix}-${id}`; }\n private getToleranceLog10(): number { return Math.floor(Math.log10(this.chordTolerance)); }\n\n private async createRequest(id: Id64String): Promise<TransformGraphicsData | undefined> {\n const elementProps = (await this.iModel.elements.getProps(id)) as GeometricElementProps[];\n if (0 === elementProps.length)\n return;\n\n const placementProps = elementProps[0].placement;\n if (undefined === placementProps)\n return;\n\n const placement = isPlacement2dProps(placementProps) ? Placement2d.fromJSON(placementProps) : Placement3d.fromJSON(placementProps);\n if (!placement.isValid)\n return; // Ignore assembly parents w/o geometry, etc...\n\n const requestProps: PersistentGraphicsRequestProps = {\n id: this.getRequestId(id),\n elementId: id,\n toleranceLog10: this.getToleranceLog10(),\n };\n\n this.pending.set(id, requestProps.id); // keep track of requests so they can be cancelled...\n\n const graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\n if (undefined === graphicData)\n return;\n\n const graphic = await readElementGraphics(graphicData, this.iModel, elementProps[0].model, placement.is3d, { noFlash: true, noHilite: true });\n if (undefined === graphic)\n return;\n\n return { id, placement, graphic: IModelApp.renderSystem.createGraphicOwner(graphic) };\n }\n\n private disposeOfGraphics(): void {\n this.data.forEach((data) => {\n data.graphic.disposeGraphic();\n });\n\n this.data.length = 0;\n }\n\n private async cancelPendingRequests(): Promise<void> {\n const requests = new Array<string>();\n for (const [_key, id] of this.pending)\n requests.push(id);\n\n this.pending.clear();\n if (0 === requests.length)\n return;\n\n return IpcApp.appFunctionIpc.cancelElementGraphicsRequests(this.iModel.key, requests);\n }\n\n /** Call to request a RenderGraphic for the supplied element id.\n * @see [[cleanupGraphics]] Must be called when the tool exits.\n */\n public async createSingleGraphic(id: Id64String): Promise<boolean> {\n try {\n const info = await this.createRequest(id);\n\n if (undefined !== info?.id)\n this.pending.delete(info.id);\n\n if (undefined === info?.graphic)\n return false;\n\n this.data.push(info);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Call to request RenderGraphics for the supplied element ids. Does not wait for results as\n * generating graphics for a large number of elements can take time. Instead an array of [[RenderGraphicOwner]]\n * is populated as requests are resolved and the current dynamics frame displays what is available.\n * @see [[cleanupGraphics]] Must be called when the tool exits.\n */\n public createGraphics(elements: Id64Arg): void {\n if (0 === Id64.sizeOf(elements))\n return;\n\n try {\n for (const id of Id64.iterable(elements)) {\n const promise = this.createRequest(id);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n promise.then((info) => {\n if (undefined !== info?.id)\n this.pending.delete(info.id);\n\n if (undefined !== info?.graphic)\n this.data.push(info);\n });\n }\n } catch { }\n }\n\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]] and cancel requests that are still pending.\n * @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.\n */\n public async cleanupGraphics(): Promise<void> {\n await this.cancelPendingRequests();\n this.disposeOfGraphics();\n }\n\n public addSingleGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void {\n const branch = new GraphicBranch(false);\n branch.add(graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n\n public addGraphics(transform: Transform, context: DynamicsContext): void {\n if (0 === this.data.length)\n return;\n\n const branch = new GraphicBranch(false);\n for (const data of this.data)\n branch.add(data.graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n}\n\n/** Edit tool base class for applying a transform to element placements.\n * Example of a tool that would translate elements:\n * ```ts\n * class SampleMoveElementsTool extends TransformElementsTool {\n * public static override toolId = \"SampleMoveElements\";\n * public static override iconSpec = \"icon-move\";\n * protected calculateTransform(ev: BeButtonEvent): Transform | undefined {\n * return (this.anchorPoint ? Transform.createTranslation(ev.point.minus(this.anchorPoint)) : undefined);\n * }\n * public async onRestartTool(): Promise<void> {\n * const tool = new SampleMoveElementsTool();\n * if (!await tool.run()) return this.exitTool();\n * }\n * }\n * ```\n * @beta\n */\nexport abstract class TransformElementsTool extends ElementSetTool {\n protected override get allowSelectionSet(): boolean { return true; }\n protected override get allowGroups(): boolean { return true; }\n protected override get allowDragSelect(): boolean { return true; }\n protected override get controlKeyContinuesSelection(): boolean { return true; }\n protected override get wantAccuSnap(): boolean { return true; }\n protected override get wantDynamics(): boolean { return true; }\n protected get wantMakeCopy(): boolean { return false; }\n protected get wantRepeatOperation(): boolean { return this.wantMakeCopy && !this.agenda.isEmpty; }\n protected _graphicsProvider?: TransformGraphicsProvider;\n protected _startedCmd?: string;\n\n protected abstract calculateTransform(ev: BeButtonEvent): Transform | undefined;\n\n protected async createAgendaGraphics(changed: boolean): Promise<void> {\n if (changed) {\n if (undefined === this._graphicsProvider)\n return; // Not yet needed...\n } else {\n if (undefined !== this._graphicsProvider)\n return; // Use existing graphics...\n }\n\n if (undefined === this._graphicsProvider)\n this._graphicsProvider = new TransformGraphicsProvider(this.iModel, this.toolId);\n else\n await this._graphicsProvider.cleanupGraphics();\n\n if (1 === this.agenda.length) {\n await this._graphicsProvider.createSingleGraphic(this.agenda.elements[0]);\n return;\n }\n\n this._graphicsProvider.createGraphics(this.agenda.elements);\n }\n\n protected async clearAgendaGraphics(): Promise<void> {\n if (undefined === this._graphicsProvider)\n return;\n await this._graphicsProvider.cleanupGraphics();\n this._graphicsProvider = undefined;\n }\n\n protected override async onAgendaModified(): Promise<void> {\n await this.createAgendaGraphics(true);\n }\n\n protected override async initAgendaDynamics(): Promise<boolean> {\n await this.createAgendaGraphics(false);\n return super.initAgendaDynamics();\n }\n\n protected transformAgendaDynamics(transform: Transform, context: DynamicsContext): void {\n if (undefined !== this._graphicsProvider)\n this._graphicsProvider.addGraphics(transform, context);\n }\n\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\n const transform = this.calculateTransform(ev);\n if (undefined === transform)\n return;\n this.transformAgendaDynamics(transform, context);\n }\n\n protected updateAnchorLocation(transform: Transform): void {\n // Update anchor point to support creating additional copies (repeat vs. restart)...\n if (undefined === this.anchorPoint)\n return;\n\n transform.multiplyPoint3d(this.anchorPoint, this.anchorPoint);\n\n const hints = new AccuDrawHintBuilder();\n hints.setOrigin(this.anchorPoint);\n hints.sendHints();\n }\n\n protected async startCommand(): Promise<string> {\n if (undefined !== this._startedCmd)\n return this._startedCmd;\n return EditTools.startCommand<string>({ commandId: editorBuiltInCmdIds.cmdBasicManipulation, iModelKey: this.iModel.key });\n }\n\n protected async replaceAgenda(newIds: Id64Arg | undefined): Promise<void> {\n this.agenda.clear();\n\n if (undefined !== newIds)\n this.agenda.add(newIds);\n\n if (this.isSelectionSetModify) {\n if (this.agenda.isEmpty)\n this.iModel.selectionSet.emptyAll();\n else\n this.iModel.selectionSet.replace(this.agenda.elements);\n\n this.agenda.setSource(ModifyElementSource.SelectionSet);\n this.setPreferredElementSource(); // Update \"use selection set\" flag...\n }\n\n return this.onAgendaModified();\n }\n\n protected async transformAndCopyAgenda(_transform: Transform): Promise<Id64Arg | undefined> {\n return undefined;\n }\n\n protected async transformAgenda(transform: Transform): Promise<void> {\n try {\n this._startedCmd = await this.startCommand();\n if (IModelStatus.Success === await basicManipulationIpc.transformPlacement(this.agenda.compressIds(), transform.toJSON()))\n await this.saveChanges();\n } catch (err) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\n }\n }\n\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\n const transform = this.calculateTransform(ev);\n if (undefined === transform)\n return;\n\n if (this.wantMakeCopy)\n await this.replaceAgenda(await this.transformAndCopyAgenda(transform));\n else\n await this.transformAgenda(transform);\n\n this.updateAnchorLocation(transform);\n }\n\n public override async onProcessComplete(): Promise<void> {\n if (this.wantRepeatOperation)\n return; // Continue with current agenda instead of restarting (ex. create additional copies)\n return super.onProcessComplete();\n }\n\n public override async onCleanup() {\n await this.clearAgendaGraphics();\n return super.onCleanup();\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"TransformElementsTool.js","sourceRoot":"","sources":["../../src/TransformElementsTool.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Editing\r\n */\r\n\r\nimport { BentleyError, Id64, Id64Arg, Id64String } from \"@itwin/core-bentley\";\r\nimport { GeometricElementProps, IModelStatus, isPlacement2dProps, PersistentGraphicsRequestProps, Placement, Placement2d, Placement3d } from \"@itwin/core-common\";\r\nimport { AccuDrawHintBuilder, BeButtonEvent, DynamicsContext, ElementSetTool, GraphicBranch, IModelApp, IModelConnection, IpcApp, ModifyElementSource, NotifyMessageDetails, OutputMessagePriority, readElementGraphics, RenderGraphic, RenderGraphicOwner } from \"@itwin/core-frontend\";\r\nimport { Transform } from \"@itwin/core-geometry\";\r\nimport { editorBuiltInCmdIds } from \"@itwin/editor-common\";\r\nimport { EditTools } from \"./EditTool\";\r\nimport { basicManipulationIpc } from \"./EditToolIpc\";\r\n\r\n/** Geometric element id, placement, and RenderGraphic managed by [[TransformGraphicsProvider]].\r\n * @beta\r\n */\r\nexport interface TransformGraphicsData {\r\n id: Id64String;\r\n placement: Placement;\r\n graphic: RenderGraphicOwner;\r\n}\r\n\r\n/** A class for creating and managing RenderGraphics representing geometric elements for the purpose of interactive tool dynamics.\r\n * @beta\r\n */\r\nexport class TransformGraphicsProvider {\r\n public readonly iModel: IModelConnection;\r\n public readonly data: TransformGraphicsData[];\r\n public readonly pending: Map<Id64String, string>;\r\n public readonly prefix: string;\r\n /** Chord tolerance to use to stroke the element's geometry in meters. */\r\n public chordTolerance = 0.01;\r\n\r\n constructor(iModel: IModelConnection, prefix: string) {\r\n this.iModel = iModel;\r\n this.prefix = prefix;\r\n this.data = new Array<TransformGraphicsData>();\r\n this.pending = new Map<Id64String, string>();\r\n }\r\n\r\n private getRequestId(id: Id64String): string { return `${this.prefix}-${id}`; }\r\n private getToleranceLog10(): number { return Math.floor(Math.log10(this.chordTolerance)); }\r\n\r\n private async createRequest(id: Id64String): Promise<TransformGraphicsData | undefined> {\r\n const elementProps = (await this.iModel.elements.getProps(id)) as GeometricElementProps[];\r\n if (0 === elementProps.length)\r\n return;\r\n\r\n const placementProps = elementProps[0].placement;\r\n if (undefined === placementProps)\r\n return;\r\n\r\n const placement = isPlacement2dProps(placementProps) ? Placement2d.fromJSON(placementProps) : Placement3d.fromJSON(placementProps);\r\n if (!placement.isValid)\r\n return; // Ignore assembly parents w/o geometry, etc...\r\n\r\n const requestProps: PersistentGraphicsRequestProps = {\r\n id: this.getRequestId(id),\r\n elementId: id,\r\n toleranceLog10: this.getToleranceLog10(),\r\n };\r\n\r\n this.pending.set(id, requestProps.id); // keep track of requests so they can be cancelled...\r\n\r\n const graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\r\n if (undefined === graphicData)\r\n return;\r\n\r\n const graphic = await readElementGraphics(graphicData, this.iModel, elementProps[0].model, placement.is3d, { noFlash: true, noHilite: true });\r\n if (undefined === graphic)\r\n return;\r\n\r\n return { id, placement, graphic: IModelApp.renderSystem.createGraphicOwner(graphic) };\r\n }\r\n\r\n private disposeOfGraphics(): void {\r\n this.data.forEach((data) => {\r\n data.graphic.disposeGraphic();\r\n });\r\n\r\n this.data.length = 0;\r\n }\r\n\r\n private async cancelPendingRequests(): Promise<void> {\r\n const requests = new Array<string>();\r\n for (const [_key, id] of this.pending)\r\n requests.push(id);\r\n\r\n this.pending.clear();\r\n if (0 === requests.length)\r\n return;\r\n\r\n return IpcApp.appFunctionIpc.cancelElementGraphicsRequests(this.iModel.key, requests);\r\n }\r\n\r\n /** Call to request a RenderGraphic for the supplied element id.\r\n * @see [[cleanupGraphics]] Must be called when the tool exits.\r\n */\r\n public async createSingleGraphic(id: Id64String): Promise<boolean> {\r\n try {\r\n const info = await this.createRequest(id);\r\n\r\n if (undefined !== info?.id)\r\n this.pending.delete(info.id);\r\n\r\n if (undefined === info?.graphic)\r\n return false;\r\n\r\n this.data.push(info);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /** Call to request RenderGraphics for the supplied element ids. Does not wait for results as\r\n * generating graphics for a large number of elements can take time. Instead an array of [[RenderGraphicOwner]]\r\n * is populated as requests are resolved and the current dynamics frame displays what is available.\r\n * @see [[cleanupGraphics]] Must be called when the tool exits.\r\n */\r\n public createGraphics(elements: Id64Arg): void {\r\n if (0 === Id64.sizeOf(elements))\r\n return;\r\n\r\n try {\r\n for (const id of Id64.iterable(elements)) {\r\n const promise = this.createRequest(id);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n promise.then((info) => {\r\n if (undefined !== info?.id)\r\n this.pending.delete(info.id);\r\n\r\n if (undefined !== info?.graphic)\r\n this.data.push(info);\r\n });\r\n }\r\n } catch { }\r\n }\r\n\r\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]] and cancel requests that are still pending.\r\n * @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.\r\n */\r\n public async cleanupGraphics(): Promise<void> {\r\n await this.cancelPendingRequests();\r\n this.disposeOfGraphics();\r\n }\r\n\r\n public addSingleGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void {\r\n const branch = new GraphicBranch(false);\r\n branch.add(graphic);\r\n\r\n const branchGraphic = context.createBranch(branch, transform);\r\n context.addGraphic(branchGraphic);\r\n }\r\n\r\n public addGraphics(transform: Transform, context: DynamicsContext): void {\r\n if (0 === this.data.length)\r\n return;\r\n\r\n const branch = new GraphicBranch(false);\r\n for (const data of this.data)\r\n branch.add(data.graphic);\r\n\r\n const branchGraphic = context.createBranch(branch, transform);\r\n context.addGraphic(branchGraphic);\r\n }\r\n}\r\n\r\n/** Edit tool base class for applying a transform to element placements.\r\n * Example of a tool that would translate elements:\r\n * ```ts\r\n * class SampleMoveElementsTool extends TransformElementsTool {\r\n * public static override toolId = \"SampleMoveElements\";\r\n * public static override iconSpec = \"icon-move\";\r\n * protected calculateTransform(ev: BeButtonEvent): Transform | undefined {\r\n * return (this.anchorPoint ? Transform.createTranslation(ev.point.minus(this.anchorPoint)) : undefined);\r\n * }\r\n * public async onRestartTool(): Promise<void> {\r\n * const tool = new SampleMoveElementsTool();\r\n * if (!await tool.run()) return this.exitTool();\r\n * }\r\n * }\r\n * ```\r\n * @beta\r\n */\r\nexport abstract class TransformElementsTool extends ElementSetTool {\r\n protected override get allowSelectionSet(): boolean { return true; }\r\n protected override get allowGroups(): boolean { return true; }\r\n protected override get allowDragSelect(): boolean { return true; }\r\n protected override get controlKeyContinuesSelection(): boolean { return true; }\r\n protected override get wantAccuSnap(): boolean { return true; }\r\n protected override get wantDynamics(): boolean { return true; }\r\n protected get wantMakeCopy(): boolean { return false; }\r\n protected get wantRepeatOperation(): boolean { return this.wantMakeCopy && !this.agenda.isEmpty; }\r\n protected _graphicsProvider?: TransformGraphicsProvider;\r\n protected _startedCmd?: string;\r\n\r\n protected abstract calculateTransform(ev: BeButtonEvent): Transform | undefined;\r\n\r\n protected async createAgendaGraphics(changed: boolean): Promise<void> {\r\n if (changed) {\r\n if (undefined === this._graphicsProvider)\r\n return; // Not yet needed...\r\n } else {\r\n if (undefined !== this._graphicsProvider)\r\n return; // Use existing graphics...\r\n }\r\n\r\n if (undefined === this._graphicsProvider)\r\n this._graphicsProvider = new TransformGraphicsProvider(this.iModel, this.toolId);\r\n else\r\n await this._graphicsProvider.cleanupGraphics();\r\n\r\n if (1 === this.agenda.length) {\r\n await this._graphicsProvider.createSingleGraphic(this.agenda.elements[0]);\r\n return;\r\n }\r\n\r\n this._graphicsProvider.createGraphics(this.agenda.elements);\r\n }\r\n\r\n protected async clearAgendaGraphics(): Promise<void> {\r\n if (undefined === this._graphicsProvider)\r\n return;\r\n await this._graphicsProvider.cleanupGraphics();\r\n this._graphicsProvider = undefined;\r\n }\r\n\r\n protected override async onAgendaModified(): Promise<void> {\r\n await this.createAgendaGraphics(true);\r\n }\r\n\r\n protected override async initAgendaDynamics(): Promise<boolean> {\r\n await this.createAgendaGraphics(false);\r\n return super.initAgendaDynamics();\r\n }\r\n\r\n protected transformAgendaDynamics(transform: Transform, context: DynamicsContext): void {\r\n if (undefined !== this._graphicsProvider)\r\n this._graphicsProvider.addGraphics(transform, context);\r\n }\r\n\r\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\r\n const transform = this.calculateTransform(ev);\r\n if (undefined === transform)\r\n return;\r\n this.transformAgendaDynamics(transform, context);\r\n }\r\n\r\n protected updateAnchorLocation(transform: Transform): void {\r\n // Update anchor point to support creating additional copies (repeat vs. restart)...\r\n if (undefined === this.anchorPoint)\r\n return;\r\n\r\n transform.multiplyPoint3d(this.anchorPoint, this.anchorPoint);\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n hints.setOrigin(this.anchorPoint);\r\n hints.sendHints();\r\n }\r\n\r\n protected async startCommand(): Promise<string> {\r\n if (undefined !== this._startedCmd)\r\n return this._startedCmd;\r\n return EditTools.startCommand<string>({ commandId: editorBuiltInCmdIds.cmdBasicManipulation, iModelKey: this.iModel.key });\r\n }\r\n\r\n protected async replaceAgenda(newIds: Id64Arg | undefined): Promise<void> {\r\n this.agenda.clear();\r\n\r\n if (undefined !== newIds)\r\n this.agenda.add(newIds);\r\n\r\n if (this.isSelectionSetModify) {\r\n if (this.agenda.isEmpty)\r\n this.iModel.selectionSet.emptyAll();\r\n else\r\n this.iModel.selectionSet.replace(this.agenda.elements);\r\n\r\n this.agenda.setSource(ModifyElementSource.SelectionSet);\r\n this.setPreferredElementSource(); // Update \"use selection set\" flag...\r\n }\r\n\r\n return this.onAgendaModified();\r\n }\r\n\r\n protected async transformAndCopyAgenda(_transform: Transform): Promise<Id64Arg | undefined> {\r\n return undefined;\r\n }\r\n\r\n protected async transformAgenda(transform: Transform): Promise<void> {\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n if (IModelStatus.Success === await basicManipulationIpc.transformPlacement(this.agenda.compressIds(), transform.toJSON()))\r\n await this.saveChanges();\r\n } catch (err) {\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\r\n }\r\n }\r\n\r\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\r\n const transform = this.calculateTransform(ev);\r\n if (undefined === transform)\r\n return;\r\n\r\n if (this.wantMakeCopy)\r\n await this.replaceAgenda(await this.transformAndCopyAgenda(transform));\r\n else\r\n await this.transformAgenda(transform);\r\n\r\n this.updateAnchorLocation(transform);\r\n }\r\n\r\n public override async onProcessComplete(): Promise<void> {\r\n if (this.wantRepeatOperation)\r\n return; // Continue with current agenda instead of restarting (ex. create additional copies)\r\n return super.onProcessComplete();\r\n }\r\n\r\n public override async onCleanup() {\r\n await this.clearAgendaGraphics();\r\n return super.onCleanup();\r\n }\r\n}\r\n\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UndoRedoTool.js","sourceRoot":"","sources":["../../src/UndoRedoTool.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AAEH,wDAA+D;AAE/D;;GAEG;AACH,MAAa,WAAY,SAAQ,oBAAI;IAEnB,KAAK,CAAC,GAAG;QACvB,MAAM,MAAM,GAAG,yBAAS,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC;QAC/D,IAAI,SAAS,KAAK,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,qBAAqB;YAC5E,OAAO,IAAI,CAAC;QAEd,MAAM,sBAAM,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEtD,8HAA8H;QAC9H,IAAI,SAAS,KAAK,yBAAS,CAAC,SAAS,CAAC,aAAa;YACjD,MAAM,yBAAS,CAAC,SAAS,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;;AAZsB,kBAAM,GAAG,SAAS,CAAC;AAD/B,kCAAW;AAgBxB;;GAEG;AACH,MAAa,QAAS,SAAQ,oBAAI;IAEhB,KAAK,CAAC,GAAG;QACvB,MAAM,yBAAS,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;;AAJsB,eAAM,GAAG,MAAM,CAAC;AAD5B,4BAAQ;AAQrB;;GAEG;AACH,MAAa,QAAS,SAAQ,oBAAI;IAEhB,KAAK,CAAC,GAAG;QACvB,MAAM,yBAAS,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;;AAJsB,eAAM,GAAG,MAAM,CAAC;AAD5B,4BAAQ","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Editing\n */\n\nimport { IModelApp, IpcApp, Tool } from \"@itwin/core-frontend\";\n\n/** Undo all element changes\n * @beta\n */\nexport class UndoAllTool extends Tool {\n public static override toolId = \"UndoAll\";\n public override async run(): Promise<boolean> {\n const imodel = IModelApp.viewManager.selectedView?.view.iModel;\n if (undefined === imodel || imodel.isReadonly || !imodel.isBriefcaseConnection)\n return true;\n\n await IpcApp.appFunctionIpc.reverseAllTxn(imodel.key);\n\n // ### TODO Restart of primitive tool should be handled by Txn event listener...needs to happen even if not the active tool...\n if (undefined !== IModelApp.toolAdmin.primitiveTool)\n await IModelApp.toolAdmin.primitiveTool.onRestartTool();\n return true;\n }\n}\n\n/** Undo active tool steps, or element changes\n * @beta\n */\nexport class UndoTool extends Tool {\n public static override toolId = \"Undo\";\n public override async run(): Promise<boolean> {\n await IModelApp.toolAdmin.doUndoOperation();\n return true;\n }\n}\n\n/** Redo active tool steps, or element changes\n * @beta\n */\nexport class RedoTool extends Tool {\n public static override toolId = \"Redo\";\n public override async run(): Promise<boolean> {\n await IModelApp.toolAdmin.doRedoOperation();\n return true;\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"UndoRedoTool.js","sourceRoot":"","sources":["../../src/UndoRedoTool.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AAEH,wDAA+D;AAE/D;;GAEG;AACH,MAAa,WAAY,SAAQ,oBAAI;IAEnB,KAAK,CAAC,GAAG;QACvB,MAAM,MAAM,GAAG,yBAAS,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC;QAC/D,IAAI,SAAS,KAAK,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,qBAAqB;YAC5E,OAAO,IAAI,CAAC;QAEd,MAAM,sBAAM,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEtD,8HAA8H;QAC9H,IAAI,SAAS,KAAK,yBAAS,CAAC,SAAS,CAAC,aAAa;YACjD,MAAM,yBAAS,CAAC,SAAS,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;;AAZsB,kBAAM,GAAG,SAAS,CAAC;AAD/B,kCAAW;AAgBxB;;GAEG;AACH,MAAa,QAAS,SAAQ,oBAAI;IAEhB,KAAK,CAAC,GAAG;QACvB,MAAM,yBAAS,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;;AAJsB,eAAM,GAAG,MAAM,CAAC;AAD5B,4BAAQ;AAQrB;;GAEG;AACH,MAAa,QAAS,SAAQ,oBAAI;IAEhB,KAAK,CAAC,GAAG;QACvB,MAAM,yBAAS,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;;AAJsB,eAAM,GAAG,MAAM,CAAC;AAD5B,4BAAQ","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Editing\r\n */\r\n\r\nimport { IModelApp, IpcApp, Tool } from \"@itwin/core-frontend\";\r\n\r\n/** Undo all element changes\r\n * @beta\r\n */\r\nexport class UndoAllTool extends Tool {\r\n public static override toolId = \"UndoAll\";\r\n public override async run(): Promise<boolean> {\r\n const imodel = IModelApp.viewManager.selectedView?.view.iModel;\r\n if (undefined === imodel || imodel.isReadonly || !imodel.isBriefcaseConnection)\r\n return true;\r\n\r\n await IpcApp.appFunctionIpc.reverseAllTxn(imodel.key);\r\n\r\n // ### TODO Restart of primitive tool should be handled by Txn event listener...needs to happen even if not the active tool...\r\n if (undefined !== IModelApp.toolAdmin.primitiveTool)\r\n await IModelApp.toolAdmin.primitiveTool.onRestartTool();\r\n return true;\r\n }\r\n}\r\n\r\n/** Undo active tool steps, or element changes\r\n * @beta\r\n */\r\nexport class UndoTool extends Tool {\r\n public static override toolId = \"Undo\";\r\n public override async run(): Promise<boolean> {\r\n await IModelApp.toolAdmin.doUndoOperation();\r\n return true;\r\n }\r\n}\r\n\r\n/** Redo active tool steps, or element changes\r\n * @beta\r\n */\r\nexport class RedoTool extends Tool {\r\n public static override toolId = \"Redo\";\r\n public override async run(): Promise<boolean> {\r\n await IModelApp.toolAdmin.doRedoOperation();\r\n return true;\r\n }\r\n}\r\n\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-frontend.js","sourceRoot":"","sources":["../../src/editor-frontend.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,sDAAoC;AACpC,6CAA2B;AAC3B,gDAA8B;AAC9B,sDAAoC;AACpC,6EAA2D;AAC3D,uEAAqD;AACrD,0DAAwC;AACxC,iDAA+B;AAE/B;;GAEG;AAEH;;;GAGG","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nexport * from \"./CreateElementTool\";\nexport * from \"./EditTool\";\nexport * from \"./EditToolIpc\";\nexport * from \"./ModifyElementTool\";\nexport * from \"./ProjectLocation/ProjectExtentsDecoration\";\nexport * from \"./ProjectLocation/ProjectGeolocation\";\nexport * from \"./TransformElementsTool\";\nexport * from \"./UndoRedoTool\";\n\n/** @docs-package-description\n * The editor-frontend package contains frontend capabilities for editing iModels.\n */\n\n/**\n * @docs-group-description Editing\n * Classes containing functionality for editing iModels on the frontend.\n */\n"]}
|
|
1
|
+
{"version":3,"file":"editor-frontend.js","sourceRoot":"","sources":["../../src/editor-frontend.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,sDAAoC;AACpC,6CAA2B;AAC3B,gDAA8B;AAC9B,sDAAoC;AACpC,6EAA2D;AAC3D,uEAAqD;AACrD,0DAAwC;AACxC,iDAA+B;AAE/B;;GAEG;AAEH;;;GAGG","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nexport * from \"./CreateElementTool\";\r\nexport * from \"./EditTool\";\r\nexport * from \"./EditToolIpc\";\r\nexport * from \"./ModifyElementTool\";\r\nexport * from \"./ProjectLocation/ProjectExtentsDecoration\";\r\nexport * from \"./ProjectLocation/ProjectGeolocation\";\r\nexport * from \"./TransformElementsTool\";\r\nexport * from \"./UndoRedoTool\";\r\n\r\n/** @docs-package-description\r\n * The editor-frontend package contains frontend capabilities for editing iModels.\r\n */\r\n\r\n/**\r\n * @docs-group-description Editing\r\n * Classes containing functionality for editing iModels on the frontend.\r\n */\r\n"]}
|
|
@@ -87,27 +87,89 @@ export declare abstract class CreateElementTool extends PrimitiveTool {
|
|
|
87
87
|
}
|
|
88
88
|
/** Placement tool base class for creating new elements that use dynamics to show intermediate results.
|
|
89
89
|
* @beta
|
|
90
|
+
* @usage Subclasses should override the following methods in addition to the
|
|
91
|
+
* abstract methods. See the method descriptions for more details:
|
|
92
|
+
* - Override: [[isComplete]], [[updateElementData]], [[doCreateElement]], [[setupAccuDraw]], [[cancelPoint]]
|
|
93
|
+
* - As necessary: [[wantAccuSnap]], [[wantDynamics]]
|
|
94
|
+
* - Ensure the parent's implementation is called: [[setupAndPromptForNextAction]], [[onPostInstall]]
|
|
95
|
+
*
|
|
96
|
+
* This class expects subclasses to call [[setupAndPromptForNextAction]] as moving between the subclass's internal state.
|
|
97
|
+
* @note To trigger an element to be inserted on [[onDataButtonDown]], ensure [[isComplete]] returns `true`
|
|
98
|
+
* @caution Subclasses typically do not override the following methods. Instead, overwrite the methods they call as described here:
|
|
99
|
+
* - [[onMouseMotion]]: See [[updateElementData]].
|
|
100
|
+
* - [[onDataButtonDown]]:
|
|
101
|
+
* - - See [[updateElementData]] for accepting data points.
|
|
102
|
+
* - - See [[isComplete]] & [[doCreateElement` for creating the finalized element.
|
|
103
|
+
* - - (With caution) See [[acceptPoint]] for preventing the mouse click event from propagating to the base tools.
|
|
104
|
+
* - [[onResetButtonUp]]: See [[cancelPoint]].
|
|
90
105
|
*/
|
|
91
106
|
export declare abstract class CreateElementWithDynamicsTool extends CreateElementTool {
|
|
92
107
|
protected _graphicsProvider?: DynamicGraphicsProvider;
|
|
93
108
|
protected get wantAccuSnap(): boolean;
|
|
94
109
|
protected get wantDynamics(): boolean;
|
|
95
110
|
protected clearGraphics(): void;
|
|
111
|
+
/**
|
|
112
|
+
* This method is intended to update the dynamic graphics displayed by the tool.
|
|
113
|
+
*
|
|
114
|
+
* It expects [[updateDynamicData]] to return `true`. If it returns `false`, no graphics are created.
|
|
115
|
+
*
|
|
116
|
+
* It expects [[getPlacementProps]] and [[getGeometryProps]] to be defined as it uses these functions to create the dynamic graphic.
|
|
117
|
+
*/
|
|
96
118
|
protected createGraphics(ev: BeButtonEvent): Promise<void>;
|
|
97
119
|
onDynamicFrame(_ev: BeButtonEvent, context: DynamicsContext): void;
|
|
120
|
+
/** Invoked when the cursor is moving
|
|
121
|
+
* Propagates event to [[updateElementData]].
|
|
122
|
+
* @caution Subclasses typically don't override this.
|
|
123
|
+
*/
|
|
98
124
|
onMouseMotion(ev: BeButtonEvent): Promise<void>;
|
|
99
125
|
protected abstract getPlacementProps(): PlacementProps | undefined;
|
|
100
126
|
protected abstract getGeometryProps(placement: PlacementProps): JsonGeometryStream | FlatBufferGeometryStream | undefined;
|
|
101
127
|
protected abstract getElementProps(placement: PlacementProps): GeometricElementProps | undefined;
|
|
128
|
+
/**
|
|
129
|
+
* Creates a new element in the iModel by interfacing with the core/editor backend.
|
|
130
|
+
*
|
|
131
|
+
* This method is called by [[onDataButtonDown]] only if `isComplete` is true.
|
|
132
|
+
*
|
|
133
|
+
* @param _props Argument passed in is based on the return value from the [[getElementProps]] method.
|
|
134
|
+
*/
|
|
102
135
|
protected doCreateElement(_props: GeometricElementProps): Promise<void>;
|
|
136
|
+
/** This method is intended to update information related to the element. This method is called in 2 scenarios:
|
|
137
|
+
* 1. [[onMouseMotion]] as a dynamics
|
|
138
|
+
* 2. [[onDataButtonDown]] when accepting the next point of the tool
|
|
139
|
+
* @param ev - The mouse event triggering this call.
|
|
140
|
+
* @param isDynamics it is `true` in scenario [1] and `false` in scenario [2].
|
|
141
|
+
*/
|
|
103
142
|
protected updateElementData(_ev: BeButtonEvent, _isDynamics: boolean): Promise<void>;
|
|
143
|
+
/**
|
|
144
|
+
* This function does not handle updating data itself, instead, it directly calls [[updateElementData]] to handle that.
|
|
145
|
+
* @returns `true` if dynamics are active, `false` otherwise.
|
|
146
|
+
* @caution Subclasses typically don't override this.
|
|
147
|
+
*/
|
|
104
148
|
protected updateDynamicData(ev: BeButtonEvent): Promise<boolean>;
|
|
105
149
|
protected createElement(): Promise<void>;
|
|
150
|
+
/** Intended to be used to setupAccuSnap. Is called by [[setupAndPromptForNextAction]].
|
|
151
|
+
* @note Has not checked for [[wantAccuSnap]] at this point. Directly, *after* this method is called in [[setupAndPromptForNextAction]], AccuSnap will be enabled/disabled based on [[wantAccuSnap]].
|
|
152
|
+
*/
|
|
106
153
|
protected setupAccuDraw(): void;
|
|
107
154
|
protected setupAndPromptForNextAction(): void;
|
|
155
|
+
/** Called by [[onDataButtonDown]].
|
|
156
|
+
* @returns return `false` if the event has been handled.
|
|
157
|
+
* @caution Subclasses typically don't override this.
|
|
158
|
+
*/
|
|
108
159
|
protected acceptPoint(ev: BeButtonEvent): Promise<boolean>;
|
|
160
|
+
/** Invoked when the data button is pressed.
|
|
161
|
+
* Propagates event to [[updateElementData]] by way of [[acceptPoint]].
|
|
162
|
+
* @caution Subclasses typically don't override this.
|
|
163
|
+
*/
|
|
109
164
|
onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled>;
|
|
165
|
+
/** Called by [[onResetButtonUp]].
|
|
166
|
+
* @returns return `false` if the event has been handled.
|
|
167
|
+
*/
|
|
110
168
|
protected cancelPoint(_ev: BeButtonEvent): Promise<boolean>;
|
|
169
|
+
/** Invoked when the reset button is released.
|
|
170
|
+
* Propagates event to [[cancelPoint]].
|
|
171
|
+
* @caution Subclasses typically don't override this.
|
|
172
|
+
*/
|
|
111
173
|
onResetButtonUp(ev: BeButtonEvent): Promise<EventHandled>;
|
|
112
174
|
onCleanup(): Promise<void>;
|
|
113
175
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateElementTool.d.ts","sourceRoot":"","sources":["../../src/CreateElementTool.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"CreateElementTool.d.ts","sourceRoot":"","sources":["../../src/CreateElementTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -242,6 +242,21 @@ export class CreateElementTool extends PrimitiveTool {
|
|
|
242
242
|
}
|
|
243
243
|
/** Placement tool base class for creating new elements that use dynamics to show intermediate results.
|
|
244
244
|
* @beta
|
|
245
|
+
* @usage Subclasses should override the following methods in addition to the
|
|
246
|
+
* abstract methods. See the method descriptions for more details:
|
|
247
|
+
* - Override: [[isComplete]], [[updateElementData]], [[doCreateElement]], [[setupAccuDraw]], [[cancelPoint]]
|
|
248
|
+
* - As necessary: [[wantAccuSnap]], [[wantDynamics]]
|
|
249
|
+
* - Ensure the parent's implementation is called: [[setupAndPromptForNextAction]], [[onPostInstall]]
|
|
250
|
+
*
|
|
251
|
+
* This class expects subclasses to call [[setupAndPromptForNextAction]] as moving between the subclass's internal state.
|
|
252
|
+
* @note To trigger an element to be inserted on [[onDataButtonDown]], ensure [[isComplete]] returns `true`
|
|
253
|
+
* @caution Subclasses typically do not override the following methods. Instead, overwrite the methods they call as described here:
|
|
254
|
+
* - [[onMouseMotion]]: See [[updateElementData]].
|
|
255
|
+
* - [[onDataButtonDown]]:
|
|
256
|
+
* - - See [[updateElementData]] for accepting data points.
|
|
257
|
+
* - - See [[isComplete]] & [[doCreateElement` for creating the finalized element.
|
|
258
|
+
* - - (With caution) See [[acceptPoint]] for preventing the mouse click event from propagating to the base tools.
|
|
259
|
+
* - [[onResetButtonUp]]: See [[cancelPoint]].
|
|
245
260
|
*/
|
|
246
261
|
export class CreateElementWithDynamicsTool extends CreateElementTool {
|
|
247
262
|
get wantAccuSnap() { return true; }
|
|
@@ -252,6 +267,13 @@ export class CreateElementWithDynamicsTool extends CreateElementTool {
|
|
|
252
267
|
this._graphicsProvider.cleanupGraphic();
|
|
253
268
|
this._graphicsProvider = undefined;
|
|
254
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* This method is intended to update the dynamic graphics displayed by the tool.
|
|
272
|
+
*
|
|
273
|
+
* It expects [[updateDynamicData]] to return `true`. If it returns `false`, no graphics are created.
|
|
274
|
+
*
|
|
275
|
+
* It expects [[getPlacementProps]] and [[getGeometryProps]] to be defined as it uses these functions to create the dynamic graphic.
|
|
276
|
+
*/
|
|
255
277
|
async createGraphics(ev) {
|
|
256
278
|
if (!await this.updateDynamicData(ev))
|
|
257
279
|
return;
|
|
@@ -272,11 +294,33 @@ export class CreateElementWithDynamicsTool extends CreateElementTool {
|
|
|
272
294
|
if (undefined !== this._graphicsProvider)
|
|
273
295
|
this._graphicsProvider.addGraphic(context);
|
|
274
296
|
}
|
|
297
|
+
/** Invoked when the cursor is moving
|
|
298
|
+
* Propagates event to [[updateElementData]].
|
|
299
|
+
* @caution Subclasses typically don't override this.
|
|
300
|
+
*/
|
|
275
301
|
async onMouseMotion(ev) {
|
|
276
302
|
return this.createGraphics(ev);
|
|
277
303
|
}
|
|
304
|
+
/**
|
|
305
|
+
* Creates a new element in the iModel by interfacing with the core/editor backend.
|
|
306
|
+
*
|
|
307
|
+
* This method is called by [[onDataButtonDown]] only if `isComplete` is true.
|
|
308
|
+
*
|
|
309
|
+
* @param _props Argument passed in is based on the return value from the [[getElementProps]] method.
|
|
310
|
+
*/
|
|
278
311
|
async doCreateElement(_props) { }
|
|
312
|
+
/** This method is intended to update information related to the element. This method is called in 2 scenarios:
|
|
313
|
+
* 1. [[onMouseMotion]] as a dynamics
|
|
314
|
+
* 2. [[onDataButtonDown]] when accepting the next point of the tool
|
|
315
|
+
* @param ev - The mouse event triggering this call.
|
|
316
|
+
* @param isDynamics it is `true` in scenario [1] and `false` in scenario [2].
|
|
317
|
+
*/
|
|
279
318
|
async updateElementData(_ev, _isDynamics) { }
|
|
319
|
+
/**
|
|
320
|
+
* This function does not handle updating data itself, instead, it directly calls [[updateElementData]] to handle that.
|
|
321
|
+
* @returns `true` if dynamics are active, `false` otherwise.
|
|
322
|
+
* @caution Subclasses typically don't override this.
|
|
323
|
+
*/
|
|
280
324
|
async updateDynamicData(ev) {
|
|
281
325
|
if (!IModelApp.viewManager.inDynamicsMode)
|
|
282
326
|
return false; // Don't need to create graphic if dynamics aren't yet active...
|
|
@@ -302,21 +346,39 @@ export class CreateElementWithDynamicsTool extends CreateElementTool {
|
|
|
302
346
|
}
|
|
303
347
|
return this.doCreateElement(elemProps);
|
|
304
348
|
}
|
|
349
|
+
/** Intended to be used to setupAccuSnap. Is called by [[setupAndPromptForNextAction]].
|
|
350
|
+
* @note Has not checked for [[wantAccuSnap]] at this point. Directly, *after* this method is called in [[setupAndPromptForNextAction]], AccuSnap will be enabled/disabled based on [[wantAccuSnap]].
|
|
351
|
+
*/
|
|
305
352
|
setupAccuDraw() { }
|
|
306
353
|
setupAndPromptForNextAction() {
|
|
307
354
|
this.setupAccuDraw();
|
|
308
355
|
super.setupAndPromptForNextAction();
|
|
309
356
|
}
|
|
357
|
+
/** Called by [[onDataButtonDown]].
|
|
358
|
+
* @returns return `false` if the event has been handled.
|
|
359
|
+
* @caution Subclasses typically don't override this.
|
|
360
|
+
*/
|
|
310
361
|
async acceptPoint(ev) {
|
|
311
362
|
await this.updateElementData(ev, false);
|
|
312
363
|
return true;
|
|
313
364
|
}
|
|
365
|
+
/** Invoked when the data button is pressed.
|
|
366
|
+
* Propagates event to [[updateElementData]] by way of [[acceptPoint]].
|
|
367
|
+
* @caution Subclasses typically don't override this.
|
|
368
|
+
*/
|
|
314
369
|
async onDataButtonDown(ev) {
|
|
315
370
|
if (!await this.acceptPoint(ev))
|
|
316
371
|
return EventHandled.Yes;
|
|
317
372
|
return super.onDataButtonDown(ev);
|
|
318
373
|
}
|
|
374
|
+
/** Called by [[onResetButtonUp]].
|
|
375
|
+
* @returns return `false` if the event has been handled.
|
|
376
|
+
*/
|
|
319
377
|
async cancelPoint(_ev) { return true; }
|
|
378
|
+
/** Invoked when the reset button is released.
|
|
379
|
+
* Propagates event to [[cancelPoint]].
|
|
380
|
+
* @caution Subclasses typically don't override this.
|
|
381
|
+
*/
|
|
320
382
|
async onResetButtonUp(ev) {
|
|
321
383
|
if (!await this.cancelPoint(ev))
|
|
322
384
|
return EventHandled.Yes;
|