@itwin/core-frontend 5.12.0-dev.13 → 5.12.0-dev.15

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.
Files changed (39) hide show
  1. package/lib/cjs/AccuDraw.d.ts.map +1 -1
  2. package/lib/cjs/AccuDraw.js +7 -2
  3. package/lib/cjs/AccuDraw.js.map +1 -1
  4. package/lib/cjs/AuxCoordSys.d.ts +11 -4
  5. package/lib/cjs/AuxCoordSys.d.ts.map +1 -1
  6. package/lib/cjs/AuxCoordSys.js +12 -6
  7. package/lib/cjs/AuxCoordSys.js.map +1 -1
  8. package/lib/cjs/EntityState.js +1 -1
  9. package/lib/cjs/EntityState.js.map +1 -1
  10. package/lib/cjs/IpcApp.d.ts +37 -0
  11. package/lib/cjs/IpcApp.d.ts.map +1 -1
  12. package/lib/cjs/IpcApp.js +56 -26
  13. package/lib/cjs/IpcApp.js.map +1 -1
  14. package/lib/cjs/tile/TileRequestChannel.js.map +1 -1
  15. package/lib/cjs/tools/AccuDrawTool.d.ts +20 -3
  16. package/lib/cjs/tools/AccuDrawTool.d.ts.map +1 -1
  17. package/lib/cjs/tools/AccuDrawTool.js +108 -58
  18. package/lib/cjs/tools/AccuDrawTool.js.map +1 -1
  19. package/lib/esm/AccuDraw.d.ts.map +1 -1
  20. package/lib/esm/AccuDraw.js +8 -3
  21. package/lib/esm/AccuDraw.js.map +1 -1
  22. package/lib/esm/AuxCoordSys.d.ts +11 -4
  23. package/lib/esm/AuxCoordSys.d.ts.map +1 -1
  24. package/lib/esm/AuxCoordSys.js +13 -7
  25. package/lib/esm/AuxCoordSys.js.map +1 -1
  26. package/lib/esm/EntityState.js +1 -1
  27. package/lib/esm/EntityState.js.map +1 -1
  28. package/lib/esm/IpcApp.d.ts +37 -0
  29. package/lib/esm/IpcApp.d.ts.map +1 -1
  30. package/lib/esm/IpcApp.js +56 -27
  31. package/lib/esm/IpcApp.js.map +1 -1
  32. package/lib/esm/tile/TileRequestChannel.js.map +1 -1
  33. package/lib/esm/tools/AccuDrawTool.d.ts +20 -3
  34. package/lib/esm/tools/AccuDrawTool.d.ts.map +1 -1
  35. package/lib/esm/tools/AccuDrawTool.js +109 -59
  36. package/lib/esm/tools/AccuDrawTool.js.map +1 -1
  37. package/lib/public/scripts/parse-imdl-worker.js +1 -1
  38. package/lib/workers/webpack/parse-imdl-worker.js +1 -1
  39. package/package.json +23 -23
@@ -40,11 +40,18 @@ export declare abstract class AuxCoordSystemState extends ElementState implement
40
40
  description?: string;
41
41
  static fromProps(props: AuxCoordSystemProps, iModel: IModelConnection): AuxCoordSystemState;
42
42
  /** Create a new AuxCoordSystemState.
43
- * @param acsName the name for the new AuxCoordSystem
44
- * @param iModel the iModel for which the ACS applies.
45
- * @note call this method with the appropriate subclass (e.g. AuxCoordSystemSpatialState, AuxCoordSystem2dState, etc), not on AuxCoordSystemState directly
43
+ * @param _acsName unused, this method creates an empty code as it lacks sufficient information to do otherwise.
44
+ * @param iModel the iModel for which the ACS applies
45
+ * @note Inserting a new named ACS element requires creating a CodeProps for the type of view and the view's definition model.
46
+ * This method doesn't have the information to do this so it creates an empty code.
47
+ * @example
48
+ * ```typescript
49
+ * const codeSpecName = vp.view.isSpatialView() ? BisCodeSpec.auxCoordSystemSpatial : (vp.view.is3d() ? BisCodeSpec.auxCoordSystem3d : BisCodeSpec.auxCoordSystem2d);
50
+ * const codeSpec = await vp.iModel.codeSpecs.getByName(codeSpecName);
51
+ * const code = new Code({ spec: codeSpec.id, scope: vp.view.model, value: acsName });
52
+ * ```
46
53
  */
47
- static createNew(acsName: string, iModel: IModelConnection): AuxCoordSystemState;
54
+ static createNew(_acsName: string, iModel: IModelConnection): AuxCoordSystemState;
48
55
  constructor(props: AuxCoordSystemProps, iModel: IModelConnection);
49
56
  toJSON(): AuxCoordSystemProps;
50
57
  isValidForView(view: ViewState): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"AuxCoordSys.d.ts","sourceRoot":"","sources":["../../src/AuxCoordSys.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAA4B,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAuB,KAAK,EAAE,MAAM,EAAsB,MAAM,sBAAsB,CAAC;AACpJ,OAAO,EACL,qBAAqB,EAAE,qBAAqB,EAAE,mBAAmB,EAClE,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC;;;GAGG;AACH,oBAAY,OAAO;IACjB,IAAI,IAAI;IACR,WAAW,IAAI;IACf,WAAW,IAAI;IACf,SAAS,IAAI;CACd;AAED;;;GAGG;AACH,oBAAY,iBAAiB;IAC3B,IAAI,IAAI,CAAE,oCAAoC;IAC9C,MAAM,IAAW;IACjB,YAAY,IAAW;IACvB,MAAM,IAAW;IACjB,YAAY,IAAW;IACvB,QAAQ,KAAW;CACpB;AAgBD;;;GAGG;AACH,8BAAsB,mBAAoB,SAAQ,YAAa,YAAW,mBAAmB;IAC3F,WAA2B,SAAS,WAA+B;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;WAEd,SAAS,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,gBAAgB,GAAG,mBAAmB;IAWlG;;;;OAIG;WACW,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,mBAAmB;gBAKpE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,gBAAgB;IAKvD,MAAM,IAAI,mBAAmB;IAOtC,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO;aAM/B,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;aACpC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IACpD,wDAAwD;aACxC,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ;aACxC,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI;IAChD,IAAW,IAAI,IAAI,OAAO,CAAkD;IAErE,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAO/C,wDAAwD;IACxD,OAAO,CAAC,MAAM,CAAC,UAAU;IAEzB;;;OAGG;WACW,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO;IA+BrG,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,YAAY;IA2BpB,OAAO,CAAC,OAAO;IAwDf,6DAA6D;IAC7D,OAAO,CAAC,oBAAoB;IA8BrB,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,iBAAiB;CAKpE;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,mBAAoB,YAAW,qBAAqB;IAC7F,WAA2B,SAAS,WAAiC;IACrE,SAAgB,MAAM,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;gBAExB,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,gBAAgB;IAOlD,MAAM,IAAI,qBAAqB;IAOxC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IACpC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IACpC,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ;IACxC,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI;CAKxC;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,mBAAoB,YAAW,qBAAqB;IAC7F,WAA2B,SAAS,WAAiC;IACrE,SAAgB,MAAM,EAAE,OAAO,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;gBAExB,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,gBAAgB;IAUlD,MAAM,IAAI,qBAAqB;IASxC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IACpC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IACpC,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ;IACxC,WAAW,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI;CAO5C;AAED;;;GAGG;AACH,qBAAa,0BAA2B,SAAQ,qBAAqB;IACnE,WAA2B,SAAS,WAAsC;CAC3E"}
1
+ {"version":3,"file":"AuxCoordSys.d.ts","sourceRoot":"","sources":["../../src/AuxCoordSys.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { JsonUtils } from "@itwin/core-bentley";
9
9
  import { Angle, AngleSweep, Arc3d, Matrix3d, Point2d, Point3d, Transform, Vector3d, YawPitchRollAngles } from "@itwin/core-geometry";
10
- import { BisCodeSpec, Code, ColorDef, IModel, LinePixels, Npc, } from "@itwin/core-common";
10
+ import { Code, ColorDef, IModel, LinePixels, Npc, } from "@itwin/core-common";
11
11
  import { ElementState } from "./EntityState";
12
12
  import { CoordSystem } from "./CoordSystem";
13
13
  import { GraphicType } from "./common/render/GraphicType";
@@ -52,13 +52,19 @@ export class AuxCoordSystemState extends ElementState {
52
52
  return new AuxCoordSystemSpatialState(props, iModel);
53
53
  }
54
54
  /** Create a new AuxCoordSystemState.
55
- * @param acsName the name for the new AuxCoordSystem
56
- * @param iModel the iModel for which the ACS applies.
57
- * @note call this method with the appropriate subclass (e.g. AuxCoordSystemSpatialState, AuxCoordSystem2dState, etc), not on AuxCoordSystemState directly
55
+ * @param _acsName unused, this method creates an empty code as it lacks sufficient information to do otherwise.
56
+ * @param iModel the iModel for which the ACS applies
57
+ * @note Inserting a new named ACS element requires creating a CodeProps for the type of view and the view's definition model.
58
+ * This method doesn't have the information to do this so it creates an empty code.
59
+ * @example
60
+ * ```typescript
61
+ * const codeSpecName = vp.view.isSpatialView() ? BisCodeSpec.auxCoordSystemSpatial : (vp.view.is3d() ? BisCodeSpec.auxCoordSystem3d : BisCodeSpec.auxCoordSystem2d);
62
+ * const codeSpec = await vp.iModel.codeSpecs.getByName(codeSpecName);
63
+ * const code = new Code({ spec: codeSpec.id, scope: vp.view.model, value: acsName });
64
+ * ```
58
65
  */
59
- static createNew(acsName, iModel) {
60
- const myCode = new Code({ spec: BisCodeSpec.auxCoordSystemSpatial, scope: IModel.dictionaryId.toString(), value: acsName });
61
- return new AuxCoordSystemSpatialState({ model: IModel.dictionaryId, code: myCode, classFullName: this.classFullName }, iModel);
66
+ static createNew(_acsName, iModel) {
67
+ return new AuxCoordSystemSpatialState({ model: IModel.dictionaryId, code: Code.createEmpty(), classFullName: this.classFullName }, iModel);
62
68
  }
63
69
  constructor(props, iModel) {
64
70
  super(props, iModel);
@@ -1 +1 @@
1
- {"version":3,"file":"AuxCoordSys.js","sourceRoot":"","sources":["../../src/AuxCoordSys.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/** @packageDocumentation\n * @module Views\n */\n\nimport { JsonUtils } from \"@itwin/core-bentley\";\nimport { Angle, AngleSweep, Arc3d, Matrix3d, Point2d, Point3d, Transform, Vector3d, XAndY, XYAndZ, YawPitchRollAngles } from \"@itwin/core-geometry\";\nimport {\n AuxCoordSystem2dProps, AuxCoordSystem3dProps, AuxCoordSystemProps, BisCodeSpec, Code, ColorDef, IModel, LinePixels, Npc,\n} from \"@itwin/core-common\";\nimport { ElementState } from \"./EntityState\";\nimport { IModelConnection } from \"./IModelConnection\";\nimport { GraphicBuilder } from \"./render/GraphicBuilder\";\nimport { DecorateContext } from \"./ViewContext\";\nimport { CoordSystem } from \"./CoordSystem\";\nimport { Viewport } from \"./Viewport\";\nimport { ViewState } from \"./ViewState\";\nimport { GraphicType } from \"./common/render/GraphicType\";\n\n/**\n * @public\n * @extensions\n */\nexport enum ACSType {\n None = 0,\n Rectangular = 1,\n Cylindrical = 2,\n Spherical = 3,\n}\n\n/**\n * @public\n * @extensions\n */\nexport enum ACSDisplayOptions {\n None = 0, // used for testing individual bits.\n Active = (1 << 0),\n Deemphasized = (1 << 1),\n Hilite = (1 << 2),\n CheckVisible = (1 << 3),\n Dynamics = (1 << 4),\n}\n\nconst enum ACSDisplaySizes { // eslint-disable-line no-restricted-syntax\n TriadSizeInches = 0.6,\n ArrowBaseStart = 0.3,\n ArrowBaseWidth = 0.2,\n ArrowTipEnd = 1.25,\n ArrowTipStart = 0.85,\n ArrowTipFlange = 0.75,\n ArrowTipWidth = 0.4,\n ZAxisLength = 0.65,\n LabelStart = 0.4, // eslint-disable-line @typescript-eslint/no-duplicate-enum-values\n LabelEnd = 0.8,\n LabelWidth = 0.15,\n}\n\n/** The state of an AuxCoordSystem element in the frontend\n * @public\n * @extensions\n */\nexport abstract class AuxCoordSystemState extends ElementState implements AuxCoordSystemProps {\n public static override get className() { return \"AuxCoordSystem\"; }\n public type: number;\n public description?: string;\n\n public static fromProps(props: AuxCoordSystemProps, iModel: IModelConnection): AuxCoordSystemState {\n const name = props.classFullName.toLowerCase();\n if (name.endsWith(\"system2d\"))\n return new AuxCoordSystem2dState(props, iModel);\n\n if (name.endsWith(\"system3d\"))\n return new AuxCoordSystem3dState(props, iModel);\n\n return new AuxCoordSystemSpatialState(props, iModel);\n }\n\n /** Create a new AuxCoordSystemState.\n * @param acsName the name for the new AuxCoordSystem\n * @param iModel the iModel for which the ACS applies.\n * @note call this method with the appropriate subclass (e.g. AuxCoordSystemSpatialState, AuxCoordSystem2dState, etc), not on AuxCoordSystemState directly\n */\n public static createNew(acsName: string, iModel: IModelConnection): AuxCoordSystemState {\n const myCode = new Code({ spec: BisCodeSpec.auxCoordSystemSpatial, scope: IModel.dictionaryId.toString(), value: acsName });\n return new AuxCoordSystemSpatialState({ model: IModel.dictionaryId, code: myCode, classFullName: this.classFullName }, iModel);\n }\n\n public constructor(props: AuxCoordSystemProps, iModel: IModelConnection) {\n super(props, iModel);\n this.type = JsonUtils.asInt(props.type, ACSType.None);\n this.description = props.description;\n }\n public override toJSON(): AuxCoordSystemProps {\n const val = super.toJSON() as AuxCoordSystemProps;\n val.type = this.type;\n val.description = this.description;\n return val;\n }\n\n public isValidForView(view: ViewState): boolean {\n if (view.isSpatialView())\n return this instanceof AuxCoordSystemSpatialState;\n return (view.is3d() === this.is3d);\n }\n\n public abstract getOrigin(result?: Point3d): Point3d;\n public abstract setOrigin(val: XYAndZ | XAndY): void;\n /** get a *copy of* the rotation matrix for this ACS. */\n public abstract getRotation(result?: Matrix3d): Matrix3d;\n public abstract setRotation(val: Matrix3d): void;\n public get is3d(): boolean { return this instanceof AuxCoordSystem3dState; }\n\n public drawGrid(context: DecorateContext): void {\n // Called for active ACS when grid orientation is GridOrientationType::ACS.\n const view = context.viewport.view;\n const fixedRepsAuto = Point2d.create(); // limit grid to project extents\n context.drawStandardGrid(this.getOrigin(), this.getRotation(), view.getGridSpacing(), view.getGridsPerRef(), false, fixedRepsAuto);\n }\n\n /** Returns the value, clamped to the supplied range. */\n private static limitRange(min: number, max: number, val: number): number { return Math.max(min, Math.min(max, val)); }\n\n /**\n * Given an origin point, returns whether the point falls within the view or not. If adjustOrigin is set to true, a point outside\n * the view will be modified to fall within the appropriate range.\n */\n public static isOriginInView(drawOrigin: Point3d, viewport: Viewport, adjustOrigin: boolean): boolean {\n const testPtView = viewport.worldToView(drawOrigin);\n const frustum = viewport.getFrustum(CoordSystem.View);\n const screenRange = Point3d.create();\n screenRange.x = frustum.points[Npc._000].distance(frustum.points[Npc._100]);\n screenRange.y = frustum.points[Npc._000].distance(frustum.points[Npc._010]);\n screenRange.z = frustum.points[Npc._000].distance(frustum.points[Npc._001]);\n\n // Check if current acs origin is outside view...\n const inView = (!((testPtView.x < 0 || testPtView.x > screenRange.x) || (testPtView.y < 0 || testPtView.y > screenRange.y)));\n\n if (!adjustOrigin)\n return inView;\n\n if (!inView) {\n const offset = viewport.pixelsFromInches(ACSDisplaySizes.TriadSizeInches);\n testPtView.x = AuxCoordSystemState.limitRange(offset, screenRange.x - offset, testPtView.x);\n testPtView.y = AuxCoordSystemState.limitRange(offset, screenRange.y - offset, testPtView.y);\n }\n\n // Limit point to NPC box to prevent triad from being clipped from display...\n const originPtNpc = viewport.viewToNpc(testPtView);\n originPtNpc.x = AuxCoordSystemState.limitRange(0, 1, originPtNpc.x);\n originPtNpc.y = AuxCoordSystemState.limitRange(0, 1, originPtNpc.y);\n originPtNpc.z = AuxCoordSystemState.limitRange(0, 1, originPtNpc.z);\n viewport.npcToView(originPtNpc, testPtView);\n viewport.viewToWorld(testPtView, drawOrigin);\n\n return inView;\n }\n\n private getAdjustedColor(inColor: ColorDef, isFill: boolean, viewport: Viewport, options: ACSDisplayOptions): ColorDef {\n let color;\n if ((options & ACSDisplayOptions.Hilite) !== ACSDisplayOptions.None) {\n color = viewport.hilite.color;\n } else if ((options & ACSDisplayOptions.Active) !== ACSDisplayOptions.None) {\n color = inColor.equals(ColorDef.white) ? viewport.getContrastToBackgroundColor() : inColor;\n } else {\n color = ColorDef.from(150, 150, 150, 0);\n }\n\n color = color.adjustedForContrast(viewport.view.backgroundColor);\n\n if (isFill)\n color = color.withTransparency((options & (ACSDisplayOptions.Deemphasized | ACSDisplayOptions.Dynamics)) !== ACSDisplayOptions.None ? 225 : 200);\n else\n color = color.withTransparency((options & ACSDisplayOptions.Deemphasized) !== ACSDisplayOptions.None ? 150 : 75);\n\n return color;\n }\n\n private addAxisLabel(builder: GraphicBuilder, axis: number, options: ACSDisplayOptions, vp: Viewport) {\n const color = ColorDef.white;\n const lineColor = this.getAdjustedColor(color, false, vp, options);\n builder.setSymbology(lineColor, lineColor, 2);\n\n const linePts1: Point3d[] = [];\n if (0 === axis) {\n linePts1[0] = Point3d.create(ACSDisplaySizes.LabelStart, -ACSDisplaySizes.LabelWidth);\n linePts1[1] = Point3d.create(ACSDisplaySizes.LabelEnd, ACSDisplaySizes.LabelWidth);\n } else {\n linePts1[0] = Point3d.create(0.0, ACSDisplaySizes.LabelStart);\n linePts1[1] = Point3d.create(0.0, (ACSDisplaySizes.LabelStart + ACSDisplaySizes.LabelEnd) * 0.5);\n }\n builder.addLineString(linePts1);\n\n const linePts2: Point3d[] = []; // NOTE: Don't use same point array, addPointString/addLineString don't deep copy...\n if (0 === axis) {\n linePts2[0] = Point3d.create(ACSDisplaySizes.LabelStart, ACSDisplaySizes.LabelWidth);\n linePts2[1] = Point3d.create(ACSDisplaySizes.LabelEnd, -ACSDisplaySizes.LabelWidth);\n } else {\n linePts2[0] = Point3d.create(ACSDisplaySizes.LabelWidth, ACSDisplaySizes.LabelEnd);\n linePts2[1] = Point3d.create(0.0, (ACSDisplaySizes.LabelStart + ACSDisplaySizes.LabelEnd) * 0.5);\n linePts2[2] = Point3d.create(-ACSDisplaySizes.LabelWidth, ACSDisplaySizes.LabelEnd);\n }\n builder.addLineString(linePts2);\n }\n\n private addAxis(builder: GraphicBuilder, axis: number, options: ACSDisplayOptions, vp: Viewport) {\n const color = (0 === axis ? ColorDef.red : (1 === axis ? ColorDef.green : ColorDef.blue));\n const lineColor = this.getAdjustedColor(color, false, vp, options);\n const fillColor = this.getAdjustedColor(color, true, vp, options);\n\n if (axis === 2) {\n builder.setSymbology(lineColor, lineColor, 6);\n builder.addPointString([Point3d.create(0.0, 0.0, ACSDisplaySizes.ZAxisLength)]); // NOTE: ACS origin point will be drawn separately as a pickable world decoration...\n\n const linePts2: Point3d[] = [Point3d.create(), Point3d.create()]; // NOTE: Don't use same point array, addPointString/addLineString don't deep copy...\n linePts2[1].z = ACSDisplaySizes.ZAxisLength;\n builder.setSymbology(lineColor, lineColor, 1, (options & ACSDisplayOptions.Dynamics) === ACSDisplayOptions.None ? LinePixels.Solid : LinePixels.Code2);\n builder.addLineString(linePts2);\n\n const scale = ACSDisplaySizes.ArrowTipWidth / 2;\n const center = Point3d.create();\n const viewRMatrix = vp.rotation;\n\n const xVec = viewRMatrix.getRow(0);\n const yVec = viewRMatrix.getRow(1);\n\n builder.placement.matrix.multiplyTransposeVectorInPlace(xVec);\n builder.placement.matrix.multiplyTransposeVectorInPlace(yVec);\n\n xVec.normalize(xVec);\n yVec.normalize(yVec);\n\n const ellipse = Arc3d.createScaledXYColumns(center, Matrix3d.createColumns(xVec, yVec, Vector3d.create()), scale, scale, AngleSweep.createStartEnd(Angle.createRadians(0), Angle.createRadians(Math.PI * 2)));\n builder.addArc(ellipse, false, false);\n\n builder.setBlankingFill(fillColor);\n builder.addArc(ellipse, true, true);\n return;\n }\n\n const shapePts: Point3d[] = [];\n shapePts[0] = Point3d.create(ACSDisplaySizes.ArrowTipEnd, 0.0);\n shapePts[1] = Point3d.create(ACSDisplaySizes.ArrowTipFlange, ACSDisplaySizes.ArrowTipWidth);\n shapePts[2] = Point3d.create(ACSDisplaySizes.ArrowTipStart, ACSDisplaySizes.ArrowBaseWidth);\n shapePts[3] = Point3d.create(ACSDisplaySizes.ArrowBaseStart, ACSDisplaySizes.ArrowBaseWidth);\n shapePts[4] = Point3d.create(ACSDisplaySizes.ArrowBaseStart, -ACSDisplaySizes.ArrowBaseWidth);\n shapePts[5] = Point3d.create(ACSDisplaySizes.ArrowTipStart, -ACSDisplaySizes.ArrowBaseWidth);\n shapePts[6] = Point3d.create(ACSDisplaySizes.ArrowTipFlange, -ACSDisplaySizes.ArrowTipWidth);\n shapePts[7] = shapePts[0].clone();\n if (1 === axis)\n shapePts.forEach((tmpPt) => tmpPt.set(tmpPt.y, tmpPt.x));\n\n builder.setSymbology(lineColor, lineColor, 1, (options & ACSDisplayOptions.Dynamics) === ACSDisplayOptions.None ? LinePixels.Solid : LinePixels.Code2);\n builder.addLineString(shapePts);\n\n this.addAxisLabel(builder, axis, options, vp);\n\n builder.setBlankingFill(fillColor);\n builder.addShape(shapePts);\n }\n\n /** Returns a GraphicBuilder for this AuxCoordSystemState. */\n private createGraphicBuilder(context: DecorateContext, options: ACSDisplayOptions): GraphicBuilder {\n const checkOutOfView = (options & ACSDisplayOptions.CheckVisible) !== ACSDisplayOptions.None;\n const drawOrigin = this.getOrigin();\n\n if (checkOutOfView && !AuxCoordSystemState.isOriginInView(drawOrigin, context.viewport, true))\n options = options | ACSDisplayOptions.Deemphasized;\n\n let pixelSize = context.viewport.pixelsFromInches(ACSDisplaySizes.TriadSizeInches);\n\n if ((options & ACSDisplayOptions.Deemphasized) !== ACSDisplayOptions.None)\n pixelSize *= 0.8;\n else if ((options & ACSDisplayOptions.Active) !== ACSDisplayOptions.None)\n pixelSize *= 0.9;\n\n const exaggerate = context.viewport.view.getAspectRatioSkew();\n const scale = context.getPixelSizeAtPoint(drawOrigin) * pixelSize;\n const rMatrix = this.getRotation();\n\n rMatrix.transposeInPlace();\n rMatrix.scaleColumns(scale, scale / exaggerate, scale, rMatrix);\n const transform = Transform.createRefs(drawOrigin, rMatrix);\n\n const builder = context.createGraphicBuilder(GraphicType.WorldOverlay, transform);\n const vp = context.viewport;\n this.addAxis(builder, 0, options, vp);\n this.addAxis(builder, 1, options, vp);\n this.addAxis(builder, 2, options, vp);\n return builder;\n }\n\n public display(context: DecorateContext, options: ACSDisplayOptions) {\n const builder = this.createGraphicBuilder(context, options);\n if (undefined !== builder)\n context.addDecorationFromBuilder(builder);\n }\n}\n\n/** The state of an AuxCoordSystem2d element in the frontend\n * @public\n * @extensions\n */\nexport class AuxCoordSystem2dState extends AuxCoordSystemState implements AuxCoordSystem2dProps {\n public static override get className() { return \"AuxCoordSystem2d\"; }\n public readonly origin: Point2d;\n public angle: number; // in degrees\n private readonly _rMatrix: Matrix3d;\n\n constructor(props: AuxCoordSystem2dProps, iModel: IModelConnection) {\n super(props, iModel);\n this.origin = Point2d.fromJSON(props.origin);\n this.angle = JsonUtils.asDouble(props.angle);\n this._rMatrix = Matrix3d.createRotationAroundVector(Vector3d.unitZ(), Angle.createDegrees(this.angle)) ?? Matrix3d.createIdentity();\n }\n\n public override toJSON(): AuxCoordSystem2dProps {\n const val = super.toJSON() as AuxCoordSystem2dProps;\n val.origin = this.origin;\n val.angle = this.angle;\n return val;\n }\n\n public getOrigin(result?: Point3d): Point3d { return Point3d.createFrom(this.origin, result); }\n public setOrigin(val: XYAndZ | XAndY): void { this.origin.setFrom(val); }\n public getRotation(result?: Matrix3d): Matrix3d { return this._rMatrix.clone(result); }\n public setRotation(val: Matrix3d): void {\n this._rMatrix.setFrom(val);\n const angle = YawPitchRollAngles.createFromMatrix3d(val);\n this.angle = (undefined !== angle ? angle.yaw.degrees : 0.0);\n }\n}\n\n/** The state of an AuxCoordSystem3d element in the frontend\n * @public\n * @extensions\n */\nexport class AuxCoordSystem3dState extends AuxCoordSystemState implements AuxCoordSystem3dProps {\n public static override get className() { return \"AuxCoordSystem3d\"; }\n public readonly origin: Point3d;\n public yaw: number; // in degrees\n public pitch: number; // in degrees\n public roll: number; // in degrees\n private readonly _rMatrix: Matrix3d;\n\n constructor(props: AuxCoordSystem3dProps, iModel: IModelConnection) {\n super(props, iModel);\n this.origin = Point3d.fromJSON(props.origin);\n this.yaw = JsonUtils.asDouble(props.yaw);\n this.pitch = JsonUtils.asDouble(props.pitch);\n this.roll = JsonUtils.asDouble(props.roll);\n const angles = new YawPitchRollAngles(Angle.createDegrees(this.yaw), Angle.createDegrees(this.pitch), Angle.createDegrees(this.roll));\n this._rMatrix = angles.toMatrix3d();\n }\n\n public override toJSON(): AuxCoordSystem3dProps {\n const val = super.toJSON() as AuxCoordSystem3dProps;\n val.origin = this.origin;\n val.yaw = this.yaw;\n val.pitch = this.pitch;\n val.roll = this.roll;\n return val;\n }\n\n public getOrigin(result?: Point3d): Point3d { return Point3d.createFrom(this.origin, result); }\n public setOrigin(val: XYAndZ | XAndY): void { this.origin.setFrom(val); }\n public getRotation(result?: Matrix3d): Matrix3d { return this._rMatrix.clone(result); }\n public setRotation(rMatrix: Matrix3d): void {\n this._rMatrix.setFrom(rMatrix);\n const angles = YawPitchRollAngles.createFromMatrix3d(rMatrix);\n this.yaw = (undefined !== angles ? angles.yaw.degrees : 0.0);\n this.pitch = (undefined !== angles ? angles.pitch.degrees : 0.0);\n this.roll = (undefined !== angles ? angles.roll.degrees : 0.0);\n }\n}\n\n/** The state of an AuxCoordSystemSpatial element in the frontend\n * @public\n * @extensions\n */\nexport class AuxCoordSystemSpatialState extends AuxCoordSystem3dState {\n public static override get className() { return \"AuxCoordSystemSpatial\"; }\n}\n"]}
1
+ {"version":3,"file":"AuxCoordSys.js","sourceRoot":"","sources":["../../src/AuxCoordSys.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAiB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACpJ,OAAO,EAC8D,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,GAC3G,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D;;;GAGG;AACH,MAAM,CAAN,IAAY,OAKX;AALD,WAAY,OAAO;IACjB,qCAAQ,CAAA;IACR,mDAAe,CAAA;IACf,mDAAe,CAAA;IACf,+CAAa,CAAA;AACf,CAAC,EALW,OAAO,KAAP,OAAO,QAKlB;AAED;;;GAGG;AACH,MAAM,CAAN,IAAY,iBAOX;AAPD,WAAY,iBAAiB;IAC3B,yDAAQ,CAAA;IACR,6DAAiB,CAAA;IACjB,yEAAuB,CAAA;IACvB,6DAAiB,CAAA;IACjB,yEAAuB,CAAA;IACvB,kEAAmB,CAAA;AACrB,CAAC,EAPW,iBAAiB,KAAjB,iBAAiB,QAO5B;AAgBD;;;GAGG;AACH,MAAM,OAAgB,mBAAoB,SAAQ,YAAY;IACrD,MAAM,KAAc,SAAS,KAAK,OAAO,gBAAgB,CAAC,CAAC,CAAC;IAC5D,IAAI,CAAS;IACb,WAAW,CAAU;IAErB,MAAM,CAAC,SAAS,CAAC,KAA0B,EAAE,MAAwB;QAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC3B,OAAO,IAAI,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAElD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC3B,OAAO,IAAI,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAElD,OAAO,IAAI,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAED;;;;;;;;;;;OAWG;IACI,MAAM,CAAC,SAAS,CAAC,QAAgB,EAAE,MAAwB;QAChE,OAAO,IAAI,0BAA0B,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7I,CAAC;IAED,YAAmB,KAA0B,EAAE,MAAwB;QACrE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACvC,CAAC;IACe,MAAM;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAyB,CAAC;QAClD,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC;IAEM,cAAc,CAAC,IAAe;QACnC,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,OAAO,IAAI,YAAY,0BAA0B,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAOD,IAAW,IAAI,KAAc,OAAO,IAAI,YAAY,qBAAqB,CAAC,CAAC,CAAC;IAErE,QAAQ,CAAC,OAAwB;QACtC,2EAA2E;QAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnC,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,gCAAgC;QACxE,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;IACrI,CAAC;IAED,wDAAwD;IAChD,MAAM,CAAC,UAAU,CAAC,GAAW,EAAE,GAAW,EAAE,GAAW,IAAY,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtH;;;OAGG;IACI,MAAM,CAAC,cAAc,CAAC,UAAmB,EAAE,QAAkB,EAAE,YAAqB;QACzF,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACrC,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAE5E,iDAAiD;QACjD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7H,IAAI,CAAC,YAAY;YACf,OAAO,MAAM,CAAC;QAEhB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,2CAAiC,CAAC;YAC1E,UAAU,CAAC,CAAC,GAAG,mBAAmB,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;YAC5F,UAAU,CAAC,CAAC,GAAG,mBAAmB,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9F,CAAC;QAED,6EAA6E;QAC7E,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnD,WAAW,CAAC,CAAC,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QACpE,WAAW,CAAC,CAAC,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QACpE,WAAW,CAAC,CAAC,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QACpE,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC5C,QAAQ,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAE7C,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,gBAAgB,CAAC,OAAiB,EAAE,MAAe,EAAE,QAAkB,EAAE,OAA0B;QACzG,IAAI,KAAK,CAAC;QACV,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,iBAAiB,CAAC,IAAI,EAAE,CAAC;YACpE,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QAChC,CAAC;aAAM,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,iBAAiB,CAAC,IAAI,EAAE,CAAC;YAC3E,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAEjE,IAAI,MAAM;YACR,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,GAAG,CAAC,iBAAiB,CAAC,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;;YAEjJ,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,GAAG,iBAAiB,CAAC,YAAY,CAAC,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEnH,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,YAAY,CAAC,OAAuB,EAAE,IAAY,EAAE,OAA0B,EAAE,EAAY;QAClG,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QACnE,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAE9C,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,uCAA6B,sCAA2B,CAAC,CAAC;YACtF,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,2EAAsD,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,uCAA6B,CAAC;YAC9D,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,yEAAqD,CAAC,GAAG,GAAG,CAAC,CAAC;QACnG,CAAC;QACD,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAEhC,MAAM,QAAQ,GAAc,EAAE,CAAC,CAAC,oFAAoF;QACpH,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,6EAAwD,CAAC;YACrF,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,qCAA2B,sCAA2B,CAAC,CAAC;QACtF,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,2EAAsD,CAAC;YACnF,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,yEAAqD,CAAC,GAAG,GAAG,CAAC,CAAC;YACjG,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,sCAA2B,qCAA2B,CAAC;QACtF,CAAC;QACD,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAEO,OAAO,CAAC,OAAuB,EAAE,IAAY,EAAE,OAA0B,EAAE,EAAY;QAC7F,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1F,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QAElE,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,yCAA8B,CAAC,CAAC,CAAC,CAAC,oFAAoF;YAErK,MAAM,QAAQ,GAAc,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,oFAAoF;YACtJ,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,yCAA8B,CAAC;YAC5C,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvJ,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAEhC,MAAM,KAAK,GAAG,0CAAgC,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC;YAEhC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAEnC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC;YAC9D,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC;YAE9D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAErB,MAAM,OAAO,GAAG,KAAK,CAAC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9M,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAEtC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YACnC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,yCAA8B,GAAG,CAAC,CAAC;QAC/D,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,oFAA+D,CAAC;QAC5F,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,oFAA+D,CAAC;QAC5F,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,oFAAgE,CAAC;QAC7F,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,2CAAiC,yCAA+B,CAAC,CAAC;QAC9F,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,2CAAgC,yCAA+B,CAAC,CAAC;QAC7F,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,4CAAiC,wCAA8B,CAAC,CAAC;QAC7F,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,IAAI;YACZ,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3D,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvJ,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAEhC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAE9C,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,6DAA6D;IACrD,oBAAoB,CAAC,OAAwB,EAAE,OAA0B;QAC/E,MAAM,cAAc,GAAG,CAAC,OAAO,GAAG,iBAAiB,CAAC,YAAY,CAAC,KAAK,iBAAiB,CAAC,IAAI,CAAC;QAC7F,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEpC,IAAI,cAAc,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;YAC3F,OAAO,GAAG,OAAO,GAAG,iBAAiB,CAAC,YAAY,CAAC;QAErD,IAAI,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,gBAAgB,2CAAiC,CAAC;QAEnF,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,YAAY,CAAC,KAAK,iBAAiB,CAAC,IAAI;YACvE,SAAS,IAAI,GAAG,CAAC;aACd,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,iBAAiB,CAAC,IAAI;YACtE,SAAS,IAAI,GAAG,CAAC;QAEnB,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC3B,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAE5D,MAAM,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAClF,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,OAAO,CAAC,OAAwB,EAAE,OAA0B;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,SAAS,KAAK,OAAO;YACvB,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,qBAAsB,SAAQ,mBAAmB;IACrD,MAAM,KAAc,SAAS,KAAK,OAAO,kBAAkB,CAAC,CAAC,CAAC;IACrD,MAAM,CAAU;IACzB,KAAK,CAAS,CAAC,aAAa;IAClB,QAAQ,CAAW;IAEpC,YAAY,KAA4B,EAAE,MAAwB;QAChE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,0BAA0B,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;IACtI,CAAC;IAEe,MAAM;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAA2B,CAAC;QACpD,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,OAAO,GAAG,CAAC;IACb,CAAC;IAEM,SAAS,CAAC,MAAgB,IAAa,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACxF,SAAS,CAAC,GAAmB,IAAU,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,WAAW,CAAC,MAAiB,IAAc,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChF,WAAW,CAAC,GAAa;QAC9B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,KAAK,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,GAAG,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,qBAAsB,SAAQ,mBAAmB;IACrD,MAAM,KAAc,SAAS,KAAK,OAAO,kBAAkB,CAAC,CAAC,CAAC;IACrD,MAAM,CAAU;IACzB,GAAG,CAAS,CAAC,aAAa;IAC1B,KAAK,CAAS,CAAC,aAAa;IAC5B,IAAI,CAAS,CAAC,aAAa;IACjB,QAAQ,CAAW;IAEpC,YAAY,KAA4B,EAAE,MAAwB;QAChE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtI,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACtC,CAAC;IAEe,MAAM;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAA2B,CAAC;QACpD,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACnB,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,OAAO,GAAG,CAAC;IACb,CAAC;IAEM,SAAS,CAAC,MAAgB,IAAa,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACxF,SAAS,CAAC,GAAmB,IAAU,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,WAAW,CAAC,MAAiB,IAAc,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChF,WAAW,CAAC,OAAiB;QAClC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAI,CAAC,GAAG,GAAG,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,GAAG,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,0BAA2B,SAAQ,qBAAqB;IAC5D,MAAM,KAAc,SAAS,KAAK,OAAO,uBAAuB,CAAC,CAAC,CAAC;CAC3E","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 Views\n */\n\nimport { JsonUtils } from \"@itwin/core-bentley\";\nimport { Angle, AngleSweep, Arc3d, Matrix3d, Point2d, Point3d, Transform, Vector3d, XAndY, XYAndZ, YawPitchRollAngles } from \"@itwin/core-geometry\";\nimport {\n AuxCoordSystem2dProps, AuxCoordSystem3dProps, AuxCoordSystemProps, Code, ColorDef, IModel, LinePixels, Npc,\n} from \"@itwin/core-common\";\nimport { ElementState } from \"./EntityState\";\nimport { IModelConnection } from \"./IModelConnection\";\nimport { GraphicBuilder } from \"./render/GraphicBuilder\";\nimport { DecorateContext } from \"./ViewContext\";\nimport { CoordSystem } from \"./CoordSystem\";\nimport { Viewport } from \"./Viewport\";\nimport { ViewState } from \"./ViewState\";\nimport { GraphicType } from \"./common/render/GraphicType\";\n\n/**\n * @public\n * @extensions\n */\nexport enum ACSType {\n None = 0,\n Rectangular = 1,\n Cylindrical = 2,\n Spherical = 3,\n}\n\n/**\n * @public\n * @extensions\n */\nexport enum ACSDisplayOptions {\n None = 0, // used for testing individual bits.\n Active = (1 << 0),\n Deemphasized = (1 << 1),\n Hilite = (1 << 2),\n CheckVisible = (1 << 3),\n Dynamics = (1 << 4),\n}\n\nconst enum ACSDisplaySizes { // eslint-disable-line no-restricted-syntax\n TriadSizeInches = 0.6,\n ArrowBaseStart = 0.3,\n ArrowBaseWidth = 0.2,\n ArrowTipEnd = 1.25,\n ArrowTipStart = 0.85,\n ArrowTipFlange = 0.75,\n ArrowTipWidth = 0.4,\n ZAxisLength = 0.65,\n LabelStart = 0.4, // eslint-disable-line @typescript-eslint/no-duplicate-enum-values\n LabelEnd = 0.8,\n LabelWidth = 0.15,\n}\n\n/** The state of an AuxCoordSystem element in the frontend\n * @public\n * @extensions\n */\nexport abstract class AuxCoordSystemState extends ElementState implements AuxCoordSystemProps {\n public static override get className() { return \"AuxCoordSystem\"; }\n public type: number;\n public description?: string;\n\n public static fromProps(props: AuxCoordSystemProps, iModel: IModelConnection): AuxCoordSystemState {\n const name = props.classFullName.toLowerCase();\n if (name.endsWith(\"system2d\"))\n return new AuxCoordSystem2dState(props, iModel);\n\n if (name.endsWith(\"system3d\"))\n return new AuxCoordSystem3dState(props, iModel);\n\n return new AuxCoordSystemSpatialState(props, iModel);\n }\n\n /** Create a new AuxCoordSystemState.\n * @param _acsName unused, this method creates an empty code as it lacks sufficient information to do otherwise.\n * @param iModel the iModel for which the ACS applies\n * @note Inserting a new named ACS element requires creating a CodeProps for the type of view and the view's definition model.\n * This method doesn't have the information to do this so it creates an empty code.\n * @example\n * ```typescript\n * const codeSpecName = vp.view.isSpatialView() ? BisCodeSpec.auxCoordSystemSpatial : (vp.view.is3d() ? BisCodeSpec.auxCoordSystem3d : BisCodeSpec.auxCoordSystem2d);\n * const codeSpec = await vp.iModel.codeSpecs.getByName(codeSpecName);\n * const code = new Code({ spec: codeSpec.id, scope: vp.view.model, value: acsName });\n * ```\n */\n public static createNew(_acsName: string, iModel: IModelConnection): AuxCoordSystemState {\n return new AuxCoordSystemSpatialState({ model: IModel.dictionaryId, code: Code.createEmpty(), classFullName: this.classFullName }, iModel);\n }\n\n public constructor(props: AuxCoordSystemProps, iModel: IModelConnection) {\n super(props, iModel);\n this.type = JsonUtils.asInt(props.type, ACSType.None);\n this.description = props.description;\n }\n public override toJSON(): AuxCoordSystemProps {\n const val = super.toJSON() as AuxCoordSystemProps;\n val.type = this.type;\n val.description = this.description;\n return val;\n }\n\n public isValidForView(view: ViewState): boolean {\n if (view.isSpatialView())\n return this instanceof AuxCoordSystemSpatialState;\n return (view.is3d() === this.is3d);\n }\n\n public abstract getOrigin(result?: Point3d): Point3d;\n public abstract setOrigin(val: XYAndZ | XAndY): void;\n /** get a *copy of* the rotation matrix for this ACS. */\n public abstract getRotation(result?: Matrix3d): Matrix3d;\n public abstract setRotation(val: Matrix3d): void;\n public get is3d(): boolean { return this instanceof AuxCoordSystem3dState; }\n\n public drawGrid(context: DecorateContext): void {\n // Called for active ACS when grid orientation is GridOrientationType::ACS.\n const view = context.viewport.view;\n const fixedRepsAuto = Point2d.create(); // limit grid to project extents\n context.drawStandardGrid(this.getOrigin(), this.getRotation(), view.getGridSpacing(), view.getGridsPerRef(), false, fixedRepsAuto);\n }\n\n /** Returns the value, clamped to the supplied range. */\n private static limitRange(min: number, max: number, val: number): number { return Math.max(min, Math.min(max, val)); }\n\n /**\n * Given an origin point, returns whether the point falls within the view or not. If adjustOrigin is set to true, a point outside\n * the view will be modified to fall within the appropriate range.\n */\n public static isOriginInView(drawOrigin: Point3d, viewport: Viewport, adjustOrigin: boolean): boolean {\n const testPtView = viewport.worldToView(drawOrigin);\n const frustum = viewport.getFrustum(CoordSystem.View);\n const screenRange = Point3d.create();\n screenRange.x = frustum.points[Npc._000].distance(frustum.points[Npc._100]);\n screenRange.y = frustum.points[Npc._000].distance(frustum.points[Npc._010]);\n screenRange.z = frustum.points[Npc._000].distance(frustum.points[Npc._001]);\n\n // Check if current acs origin is outside view...\n const inView = (!((testPtView.x < 0 || testPtView.x > screenRange.x) || (testPtView.y < 0 || testPtView.y > screenRange.y)));\n\n if (!adjustOrigin)\n return inView;\n\n if (!inView) {\n const offset = viewport.pixelsFromInches(ACSDisplaySizes.TriadSizeInches);\n testPtView.x = AuxCoordSystemState.limitRange(offset, screenRange.x - offset, testPtView.x);\n testPtView.y = AuxCoordSystemState.limitRange(offset, screenRange.y - offset, testPtView.y);\n }\n\n // Limit point to NPC box to prevent triad from being clipped from display...\n const originPtNpc = viewport.viewToNpc(testPtView);\n originPtNpc.x = AuxCoordSystemState.limitRange(0, 1, originPtNpc.x);\n originPtNpc.y = AuxCoordSystemState.limitRange(0, 1, originPtNpc.y);\n originPtNpc.z = AuxCoordSystemState.limitRange(0, 1, originPtNpc.z);\n viewport.npcToView(originPtNpc, testPtView);\n viewport.viewToWorld(testPtView, drawOrigin);\n\n return inView;\n }\n\n private getAdjustedColor(inColor: ColorDef, isFill: boolean, viewport: Viewport, options: ACSDisplayOptions): ColorDef {\n let color;\n if ((options & ACSDisplayOptions.Hilite) !== ACSDisplayOptions.None) {\n color = viewport.hilite.color;\n } else if ((options & ACSDisplayOptions.Active) !== ACSDisplayOptions.None) {\n color = inColor.equals(ColorDef.white) ? viewport.getContrastToBackgroundColor() : inColor;\n } else {\n color = ColorDef.from(150, 150, 150, 0);\n }\n\n color = color.adjustedForContrast(viewport.view.backgroundColor);\n\n if (isFill)\n color = color.withTransparency((options & (ACSDisplayOptions.Deemphasized | ACSDisplayOptions.Dynamics)) !== ACSDisplayOptions.None ? 225 : 200);\n else\n color = color.withTransparency((options & ACSDisplayOptions.Deemphasized) !== ACSDisplayOptions.None ? 150 : 75);\n\n return color;\n }\n\n private addAxisLabel(builder: GraphicBuilder, axis: number, options: ACSDisplayOptions, vp: Viewport) {\n const color = ColorDef.white;\n const lineColor = this.getAdjustedColor(color, false, vp, options);\n builder.setSymbology(lineColor, lineColor, 2);\n\n const linePts1: Point3d[] = [];\n if (0 === axis) {\n linePts1[0] = Point3d.create(ACSDisplaySizes.LabelStart, -ACSDisplaySizes.LabelWidth);\n linePts1[1] = Point3d.create(ACSDisplaySizes.LabelEnd, ACSDisplaySizes.LabelWidth);\n } else {\n linePts1[0] = Point3d.create(0.0, ACSDisplaySizes.LabelStart);\n linePts1[1] = Point3d.create(0.0, (ACSDisplaySizes.LabelStart + ACSDisplaySizes.LabelEnd) * 0.5);\n }\n builder.addLineString(linePts1);\n\n const linePts2: Point3d[] = []; // NOTE: Don't use same point array, addPointString/addLineString don't deep copy...\n if (0 === axis) {\n linePts2[0] = Point3d.create(ACSDisplaySizes.LabelStart, ACSDisplaySizes.LabelWidth);\n linePts2[1] = Point3d.create(ACSDisplaySizes.LabelEnd, -ACSDisplaySizes.LabelWidth);\n } else {\n linePts2[0] = Point3d.create(ACSDisplaySizes.LabelWidth, ACSDisplaySizes.LabelEnd);\n linePts2[1] = Point3d.create(0.0, (ACSDisplaySizes.LabelStart + ACSDisplaySizes.LabelEnd) * 0.5);\n linePts2[2] = Point3d.create(-ACSDisplaySizes.LabelWidth, ACSDisplaySizes.LabelEnd);\n }\n builder.addLineString(linePts2);\n }\n\n private addAxis(builder: GraphicBuilder, axis: number, options: ACSDisplayOptions, vp: Viewport) {\n const color = (0 === axis ? ColorDef.red : (1 === axis ? ColorDef.green : ColorDef.blue));\n const lineColor = this.getAdjustedColor(color, false, vp, options);\n const fillColor = this.getAdjustedColor(color, true, vp, options);\n\n if (axis === 2) {\n builder.setSymbology(lineColor, lineColor, 6);\n builder.addPointString([Point3d.create(0.0, 0.0, ACSDisplaySizes.ZAxisLength)]); // NOTE: ACS origin point will be drawn separately as a pickable world decoration...\n\n const linePts2: Point3d[] = [Point3d.create(), Point3d.create()]; // NOTE: Don't use same point array, addPointString/addLineString don't deep copy...\n linePts2[1].z = ACSDisplaySizes.ZAxisLength;\n builder.setSymbology(lineColor, lineColor, 1, (options & ACSDisplayOptions.Dynamics) === ACSDisplayOptions.None ? LinePixels.Solid : LinePixels.Code2);\n builder.addLineString(linePts2);\n\n const scale = ACSDisplaySizes.ArrowTipWidth / 2;\n const center = Point3d.create();\n const viewRMatrix = vp.rotation;\n\n const xVec = viewRMatrix.getRow(0);\n const yVec = viewRMatrix.getRow(1);\n\n builder.placement.matrix.multiplyTransposeVectorInPlace(xVec);\n builder.placement.matrix.multiplyTransposeVectorInPlace(yVec);\n\n xVec.normalize(xVec);\n yVec.normalize(yVec);\n\n const ellipse = Arc3d.createScaledXYColumns(center, Matrix3d.createColumns(xVec, yVec, Vector3d.create()), scale, scale, AngleSweep.createStartEnd(Angle.createRadians(0), Angle.createRadians(Math.PI * 2)));\n builder.addArc(ellipse, false, false);\n\n builder.setBlankingFill(fillColor);\n builder.addArc(ellipse, true, true);\n return;\n }\n\n const shapePts: Point3d[] = [];\n shapePts[0] = Point3d.create(ACSDisplaySizes.ArrowTipEnd, 0.0);\n shapePts[1] = Point3d.create(ACSDisplaySizes.ArrowTipFlange, ACSDisplaySizes.ArrowTipWidth);\n shapePts[2] = Point3d.create(ACSDisplaySizes.ArrowTipStart, ACSDisplaySizes.ArrowBaseWidth);\n shapePts[3] = Point3d.create(ACSDisplaySizes.ArrowBaseStart, ACSDisplaySizes.ArrowBaseWidth);\n shapePts[4] = Point3d.create(ACSDisplaySizes.ArrowBaseStart, -ACSDisplaySizes.ArrowBaseWidth);\n shapePts[5] = Point3d.create(ACSDisplaySizes.ArrowTipStart, -ACSDisplaySizes.ArrowBaseWidth);\n shapePts[6] = Point3d.create(ACSDisplaySizes.ArrowTipFlange, -ACSDisplaySizes.ArrowTipWidth);\n shapePts[7] = shapePts[0].clone();\n if (1 === axis)\n shapePts.forEach((tmpPt) => tmpPt.set(tmpPt.y, tmpPt.x));\n\n builder.setSymbology(lineColor, lineColor, 1, (options & ACSDisplayOptions.Dynamics) === ACSDisplayOptions.None ? LinePixels.Solid : LinePixels.Code2);\n builder.addLineString(shapePts);\n\n this.addAxisLabel(builder, axis, options, vp);\n\n builder.setBlankingFill(fillColor);\n builder.addShape(shapePts);\n }\n\n /** Returns a GraphicBuilder for this AuxCoordSystemState. */\n private createGraphicBuilder(context: DecorateContext, options: ACSDisplayOptions): GraphicBuilder {\n const checkOutOfView = (options & ACSDisplayOptions.CheckVisible) !== ACSDisplayOptions.None;\n const drawOrigin = this.getOrigin();\n\n if (checkOutOfView && !AuxCoordSystemState.isOriginInView(drawOrigin, context.viewport, true))\n options = options | ACSDisplayOptions.Deemphasized;\n\n let pixelSize = context.viewport.pixelsFromInches(ACSDisplaySizes.TriadSizeInches);\n\n if ((options & ACSDisplayOptions.Deemphasized) !== ACSDisplayOptions.None)\n pixelSize *= 0.8;\n else if ((options & ACSDisplayOptions.Active) !== ACSDisplayOptions.None)\n pixelSize *= 0.9;\n\n const exaggerate = context.viewport.view.getAspectRatioSkew();\n const scale = context.getPixelSizeAtPoint(drawOrigin) * pixelSize;\n const rMatrix = this.getRotation();\n\n rMatrix.transposeInPlace();\n rMatrix.scaleColumns(scale, scale / exaggerate, scale, rMatrix);\n const transform = Transform.createRefs(drawOrigin, rMatrix);\n\n const builder = context.createGraphicBuilder(GraphicType.WorldOverlay, transform);\n const vp = context.viewport;\n this.addAxis(builder, 0, options, vp);\n this.addAxis(builder, 1, options, vp);\n this.addAxis(builder, 2, options, vp);\n return builder;\n }\n\n public display(context: DecorateContext, options: ACSDisplayOptions) {\n const builder = this.createGraphicBuilder(context, options);\n if (undefined !== builder)\n context.addDecorationFromBuilder(builder);\n }\n}\n\n/** The state of an AuxCoordSystem2d element in the frontend\n * @public\n * @extensions\n */\nexport class AuxCoordSystem2dState extends AuxCoordSystemState implements AuxCoordSystem2dProps {\n public static override get className() { return \"AuxCoordSystem2d\"; }\n public readonly origin: Point2d;\n public angle: number; // in degrees\n private readonly _rMatrix: Matrix3d;\n\n constructor(props: AuxCoordSystem2dProps, iModel: IModelConnection) {\n super(props, iModel);\n this.origin = Point2d.fromJSON(props.origin);\n this.angle = JsonUtils.asDouble(props.angle);\n this._rMatrix = Matrix3d.createRotationAroundVector(Vector3d.unitZ(), Angle.createDegrees(this.angle)) ?? Matrix3d.createIdentity();\n }\n\n public override toJSON(): AuxCoordSystem2dProps {\n const val = super.toJSON() as AuxCoordSystem2dProps;\n val.origin = this.origin;\n val.angle = this.angle;\n return val;\n }\n\n public getOrigin(result?: Point3d): Point3d { return Point3d.createFrom(this.origin, result); }\n public setOrigin(val: XYAndZ | XAndY): void { this.origin.setFrom(val); }\n public getRotation(result?: Matrix3d): Matrix3d { return this._rMatrix.clone(result); }\n public setRotation(val: Matrix3d): void {\n this._rMatrix.setFrom(val);\n const angle = YawPitchRollAngles.createFromMatrix3d(val);\n this.angle = (undefined !== angle ? angle.yaw.degrees : 0.0);\n }\n}\n\n/** The state of an AuxCoordSystem3d element in the frontend\n * @public\n * @extensions\n */\nexport class AuxCoordSystem3dState extends AuxCoordSystemState implements AuxCoordSystem3dProps {\n public static override get className() { return \"AuxCoordSystem3d\"; }\n public readonly origin: Point3d;\n public yaw: number; // in degrees\n public pitch: number; // in degrees\n public roll: number; // in degrees\n private readonly _rMatrix: Matrix3d;\n\n constructor(props: AuxCoordSystem3dProps, iModel: IModelConnection) {\n super(props, iModel);\n this.origin = Point3d.fromJSON(props.origin);\n this.yaw = JsonUtils.asDouble(props.yaw);\n this.pitch = JsonUtils.asDouble(props.pitch);\n this.roll = JsonUtils.asDouble(props.roll);\n const angles = new YawPitchRollAngles(Angle.createDegrees(this.yaw), Angle.createDegrees(this.pitch), Angle.createDegrees(this.roll));\n this._rMatrix = angles.toMatrix3d();\n }\n\n public override toJSON(): AuxCoordSystem3dProps {\n const val = super.toJSON() as AuxCoordSystem3dProps;\n val.origin = this.origin;\n val.yaw = this.yaw;\n val.pitch = this.pitch;\n val.roll = this.roll;\n return val;\n }\n\n public getOrigin(result?: Point3d): Point3d { return Point3d.createFrom(this.origin, result); }\n public setOrigin(val: XYAndZ | XAndY): void { this.origin.setFrom(val); }\n public getRotation(result?: Matrix3d): Matrix3d { return this._rMatrix.clone(result); }\n public setRotation(rMatrix: Matrix3d): void {\n this._rMatrix.setFrom(rMatrix);\n const angles = YawPitchRollAngles.createFromMatrix3d(rMatrix);\n this.yaw = (undefined !== angles ? angles.yaw.degrees : 0.0);\n this.pitch = (undefined !== angles ? angles.pitch.degrees : 0.0);\n this.roll = (undefined !== angles ? angles.roll.degrees : 0.0);\n }\n}\n\n/** The state of an AuxCoordSystemSpatial element in the frontend\n * @public\n * @extensions\n */\nexport class AuxCoordSystemSpatialState extends AuxCoordSystem3dState {\n public static override get className() { return \"AuxCoordSystemSpatial\"; }\n}\n"]}
@@ -93,7 +93,7 @@ export class ElementState extends EntityState {
93
93
  toJSON() {
94
94
  const val = super.toJSON();
95
95
  if (Id64.isValid(this.code.spec))
96
- val.code = this.code;
96
+ val.code = this.code.toJSON(); // Ensure _value with get accessor is serialized...
97
97
  val.model = this.model;
98
98
  val.parent = this.parent;
99
99
  val.federationGuid = this.federationGuid;
@@ -1 +1 @@
1
- {"version":3,"file":"EntityState.js","sourceRoot":"","sources":["../../src/EntityState.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/** @packageDocumentation\n * @module ElementState\n */\n\nimport { GuidString, Id64, Id64String } from \"@itwin/core-bentley\";\nimport { Code, ElementProps, EntityProps, RelatedElement } from \"@itwin/core-common\";\nimport { IModelConnection } from \"./IModelConnection\";\n\n/** The \"state\" of an Entity as represented in a web browser. Every subclass of EntityState handles one BIS class.\n * @public\n * @extensions\n */\nexport class EntityState implements EntityProps {\n /** The name of the BIS schema for this class.\n * @note Subclasses from other than the BisCore domain must override the static member \"schemaName\" with their schema name.\n */\n public static get schemaName() { return \"BisCore\"; }\n\n private get _ctor(): typeof EntityState { return this.constructor as typeof EntityState; }\n\n /** The name of the BIS class associated with this class.\n * @note Every subclass of EntityState **MUST** override this method to identify its BIS class.\n * Failure to do so will ordinarily result in an error when the class is registered, since there may only\n * be one JavaScript class for a given BIS class (usually the errant class will collide with its superclass.)\n */\n public static get className() { return \"Entity\"; }\n\n /** The name of the BIS class associated with this class. */\n public get className(): string { return this._ctor.className; }\n\n /** The Id of this Entity. May be invalid if the Entity has not yet been saved in the database. */\n public readonly id: Id64String;\n /** The iModel from which this Entity was loaded */\n public readonly iModel: IModelConnection;\n /** The full class name in the form \"schema:class\". */\n public readonly classFullName: string;\n /** Optional [json properties]($docs/bis/guide/fundamentals/element-fundamentals.md#jsonproperties) of this Entity. */\n public readonly jsonProperties: { [key: string]: any };\n\n /** Constructor for EntityState\n * @param props the properties of the Entity for this EntityState\n * @param iModel the iModel from which this EntityState is to be constructed\n * @param _state source EntityState for clone\n */\n constructor(props: EntityProps, iModel: IModelConnection, _state?: EntityState) {\n this.classFullName = props.classFullName ? props.classFullName : this._ctor.classFullName;\n this.iModel = iModel;\n this.id = Id64.fromJSON(props.id);\n this.jsonProperties = props.jsonProperties ? JSON.parse(JSON.stringify(props.jsonProperties)) : {}; // make sure we have our own copy\n }\n\n /** @internal */\n public toJSON(): EntityProps {\n const val: any = {};\n val.classFullName = this.classFullName;\n if (Id64.isValid(this.id))\n val.id = this.id;\n if (this.jsonProperties && Object.keys(this.jsonProperties).length > 0)\n val.jsonProperties = this.jsonProperties;\n return val;\n }\n\n /** Return true if this EntityState is equal to another one. */\n public equals(other: this): boolean { return JSON.stringify(this.toJSON()) === JSON.stringify(other.toJSON()); }\n\n /** Make an independent copy of this EntityState */\n public clone(iModel?: IModelConnection): this { return new this._ctor(this.toJSON(), iModel ? iModel : this.iModel, this) as this; }\n\n /** Get full BIS class name of this Entity in the form \"SchemaName:ClassName\". */\n public static get classFullName(): string { return `${this.schemaName}:${this.className}`; }\n}\n\n/** The \"state\" of an Element as represented in a web browser.\n * @public\n * @extensions\n */\nexport class ElementState extends EntityState implements ElementProps {\n public static override get className() { return \"Element\"; }\n\n /** The ModelId of the [Model]($docs/bis/guide/fundamentals/model-fundamentals.md) containing this element */\n public readonly model: Id64String;\n /** The [Code]($docs/bis/guide/fundamentals/codes.md) for this element */\n public readonly code: Code;\n /** The parent Element of this, or undefined if no parent. */\n public readonly parent?: RelatedElement;\n /** A [FederationGuid]($docs/bis/guide/fundamentals/element-fundamentals.md#federationguid) assigned to this element by some other federated database */\n public readonly federationGuid?: GuidString;\n /** A [user-assigned label]($docs/bis/guide/fundamentals/element-fundamentals.md#userlabel) for this element. */\n public readonly userLabel?: string;\n\n constructor(props: ElementProps, iModel: IModelConnection) {\n super(props, iModel);\n this.code = Code.fromJSON(props.code);\n this.model = RelatedElement.idFromJson(props.model);\n this.parent = RelatedElement.fromJSON(props.parent);\n if (undefined !== props.federationGuid)\n this.federationGuid = props.federationGuid;\n if (undefined !== props.userLabel)\n this.userLabel = props.userLabel;\n }\n\n /** Obtain this element's JSON representation. Subclasses of ElementState typically override this method with a more\n * specific return type.\n */\n public override toJSON(): ElementProps {\n const val = super.toJSON() as ElementProps;\n if (Id64.isValid(this.code.spec))\n val.code = this.code;\n\n val.model = this.model;\n val.parent = this.parent;\n val.federationGuid = this.federationGuid;\n val.userLabel = this.userLabel;\n return val;\n }\n}\n"]}
1
+ {"version":3,"file":"EntityState.js","sourceRoot":"","sources":["../../src/EntityState.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/** @packageDocumentation\n * @module ElementState\n */\n\nimport { GuidString, Id64, Id64String } from \"@itwin/core-bentley\";\nimport { Code, ElementProps, EntityProps, RelatedElement } from \"@itwin/core-common\";\nimport { IModelConnection } from \"./IModelConnection\";\n\n/** The \"state\" of an Entity as represented in a web browser. Every subclass of EntityState handles one BIS class.\n * @public\n * @extensions\n */\nexport class EntityState implements EntityProps {\n /** The name of the BIS schema for this class.\n * @note Subclasses from other than the BisCore domain must override the static member \"schemaName\" with their schema name.\n */\n public static get schemaName() { return \"BisCore\"; }\n\n private get _ctor(): typeof EntityState { return this.constructor as typeof EntityState; }\n\n /** The name of the BIS class associated with this class.\n * @note Every subclass of EntityState **MUST** override this method to identify its BIS class.\n * Failure to do so will ordinarily result in an error when the class is registered, since there may only\n * be one JavaScript class for a given BIS class (usually the errant class will collide with its superclass.)\n */\n public static get className() { return \"Entity\"; }\n\n /** The name of the BIS class associated with this class. */\n public get className(): string { return this._ctor.className; }\n\n /** The Id of this Entity. May be invalid if the Entity has not yet been saved in the database. */\n public readonly id: Id64String;\n /** The iModel from which this Entity was loaded */\n public readonly iModel: IModelConnection;\n /** The full class name in the form \"schema:class\". */\n public readonly classFullName: string;\n /** Optional [json properties]($docs/bis/guide/fundamentals/element-fundamentals.md#jsonproperties) of this Entity. */\n public readonly jsonProperties: { [key: string]: any };\n\n /** Constructor for EntityState\n * @param props the properties of the Entity for this EntityState\n * @param iModel the iModel from which this EntityState is to be constructed\n * @param _state source EntityState for clone\n */\n constructor(props: EntityProps, iModel: IModelConnection, _state?: EntityState) {\n this.classFullName = props.classFullName ? props.classFullName : this._ctor.classFullName;\n this.iModel = iModel;\n this.id = Id64.fromJSON(props.id);\n this.jsonProperties = props.jsonProperties ? JSON.parse(JSON.stringify(props.jsonProperties)) : {}; // make sure we have our own copy\n }\n\n /** @internal */\n public toJSON(): EntityProps {\n const val: any = {};\n val.classFullName = this.classFullName;\n if (Id64.isValid(this.id))\n val.id = this.id;\n if (this.jsonProperties && Object.keys(this.jsonProperties).length > 0)\n val.jsonProperties = this.jsonProperties;\n return val;\n }\n\n /** Return true if this EntityState is equal to another one. */\n public equals(other: this): boolean { return JSON.stringify(this.toJSON()) === JSON.stringify(other.toJSON()); }\n\n /** Make an independent copy of this EntityState */\n public clone(iModel?: IModelConnection): this { return new this._ctor(this.toJSON(), iModel ? iModel : this.iModel, this) as this; }\n\n /** Get full BIS class name of this Entity in the form \"SchemaName:ClassName\". */\n public static get classFullName(): string { return `${this.schemaName}:${this.className}`; }\n}\n\n/** The \"state\" of an Element as represented in a web browser.\n * @public\n * @extensions\n */\nexport class ElementState extends EntityState implements ElementProps {\n public static override get className() { return \"Element\"; }\n\n /** The ModelId of the [Model]($docs/bis/guide/fundamentals/model-fundamentals.md) containing this element */\n public readonly model: Id64String;\n /** The [Code]($docs/bis/guide/fundamentals/codes.md) for this element */\n public readonly code: Code;\n /** The parent Element of this, or undefined if no parent. */\n public readonly parent?: RelatedElement;\n /** A [FederationGuid]($docs/bis/guide/fundamentals/element-fundamentals.md#federationguid) assigned to this element by some other federated database */\n public readonly federationGuid?: GuidString;\n /** A [user-assigned label]($docs/bis/guide/fundamentals/element-fundamentals.md#userlabel) for this element. */\n public readonly userLabel?: string;\n\n constructor(props: ElementProps, iModel: IModelConnection) {\n super(props, iModel);\n this.code = Code.fromJSON(props.code);\n this.model = RelatedElement.idFromJson(props.model);\n this.parent = RelatedElement.fromJSON(props.parent);\n if (undefined !== props.federationGuid)\n this.federationGuid = props.federationGuid;\n if (undefined !== props.userLabel)\n this.userLabel = props.userLabel;\n }\n\n /** Obtain this element's JSON representation. Subclasses of ElementState typically override this method with a more\n * specific return type.\n */\n public override toJSON(): ElementProps {\n const val = super.toJSON() as ElementProps;\n if (Id64.isValid(this.code.spec))\n val.code = this.code.toJSON(); // Ensure _value with get accessor is serialized...\n\n val.model = this.model;\n val.parent = this.parent;\n val.federationGuid = this.federationGuid;\n val.userLabel = this.userLabel;\n return val;\n }\n}\n"]}
@@ -57,6 +57,18 @@ export declare class IpcApp {
57
57
  * primitive types and `ArrayBuffers` are allowed.
58
58
  */
59
59
  static send(channel: string, ...data: any[]): void;
60
+ /**
61
+ * Establish a handler for an Ipc channel to receive [[IpcHost.invoke]] calls
62
+ * @param channel The name of the channel for this handler.
63
+ * @param handler A function that supplies the implementation for `channel`
64
+ * @returns A function to call to remove the handler.
65
+ * @note If `handler` throws, or its returned Promise rejects, the thrown value is serialized (see
66
+ * [[serializeIpcError]]) and sent as the response instead of being rethrown here. Without this, the
67
+ * corresponding [[IpcHost.invoke]] call on the backend would never receive a reply and would hang (leaking
68
+ * its listener and `_pendingInvokes` entry) until [[IpcHost.shutdown]] is called.
69
+ * @beta
70
+ */
71
+ static handle(channel: string, handler: (...args: any[]) => Promise<any>): RemoveFunction;
60
72
  /**
61
73
  * Call a method on the backend through an Ipc channel.
62
74
  * @param channelName the channel registered by the backend handler.
@@ -114,4 +126,29 @@ export declare abstract class NotificationHandler {
114
126
  */
115
127
  static register(): RemoveFunction;
116
128
  }
129
+ /**
130
+ * Base class for all implementations of an Ipc interface.
131
+ *
132
+ * Create a subclass to implement your Ipc interface. Your class should be declared like this:
133
+ * ```ts
134
+ * class MyHandler extends IpcHandler implements MyInterface
135
+ * ```
136
+ * to ensure all methods and signatures are correct.
137
+ *
138
+ * Then, call `MyClass.register` at startup to connect your class to your channel.
139
+ * @beta
140
+ */
141
+ export declare abstract class IpcHandler {
142
+ abstract get channelName(): string;
143
+ /**
144
+ * Register this class as the handler for methods on its channel. This static method creates a new instance
145
+ * that becomes the handler and is `this` when its methods are called.
146
+ * @returns A function that can be called to remove the handler.
147
+ * @note Call this only once per channel. Each call registers an *additional* handler rather than
148
+ * replacing a previous one, so registering the same channel more than once causes every registered
149
+ * handler to run and reply to an invocation. To replace a handler, first call the [[RemoveFunction]]
150
+ * returned by the previous `register`.
151
+ */
152
+ static register(): RemoveFunction;
153
+ }
117
154
  //# sourceMappingURL=IpcApp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IpcApp.d.ts","sourceRoot":"","sources":["../../src/IpcApp.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAwD,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC7G,OAAO,EACsC,eAAe,EAAwC,WAAW,EAAE,iBAAiB,EAChI,cAAc,EACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAa,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED;;;GAGG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAgC;IACnD,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAA6B;IAC5D,qEAAqE;IAErE,OAAO,CAAC,MAAM,KAAK,GAAG,GAA0D;IAEhF,iIAAiI;IACjI,WAAkB,OAAO,IAAI,OAAO,CAAoC;IAExE;;;;;;;OAOG;WACW,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,cAAc;IAIhF;;;;OAIG;WACW,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW;IAInE;;;;;;;;;OASG;WACiB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAIzE;;;;;;OAMG;WACW,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIlD;;;;;;;;OAQG;WACiB,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAuB5G;;OAEG;WACiB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAIzG;;OAEG;WACW,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAS7F;;;OAGG;WACW,oBAAoB,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC;IASrG,+EAA+E;IAC/E,OAAc,cAAc,oCAAkE;IAE9F;qFACiF;WAC7D,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,aAAa;IAMxE,gBAAgB;WACI,QAAQ;CAK7B;AAED;;;;;;;;;;;;;GAaG;AACH,8BAAsB,mBAAmB;IACvC,wFAAwF;IACxF,aAAoB,WAAW,IAAI,MAAM,CAAC;IAEnC,YAAY,IAAI,cAAc;IAUrC;;;;;OAKG;WACW,QAAQ,IAAI,cAAc;CAGzC"}
1
+ {"version":3,"file":"IpcApp.d.ts","sourceRoot":"","sources":["../../src/IpcApp.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAA+B,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAC2E,eAAe,EAAwC,WAAW,EAAE,iBAAiB,EACrK,cAAc,EACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAa,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED;;;GAGG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAgC;IACnD,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAA6B;IAC5D,qEAAqE;IAErE,OAAO,CAAC,MAAM,KAAK,GAAG,GAA0D;IAEhF,iIAAiI;IACjI,WAAkB,OAAO,IAAI,OAAO,CAAoC;IAExE;;;;;;;OAOG;WACW,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,cAAc;IAIhF;;;;OAIG;WACW,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW;IAInE;;;;;;;;;OASG;WACiB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAIzE;;;;;;OAMG;WACW,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIlD;;;;;;;;;;OAUG;WACW,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc;IAahG;;;;;;;;OAQG;WACiB,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAM5G;;OAEG;WACiB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAIzG;;OAEG;WACW,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAI7F;;;OAGG;WACW,oBAAoB,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAIrG,+EAA+E;IAC/E,OAAc,cAAc,oCAAkE;IAE9F;qFACiF;WAC7D,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,aAAa;IAMxE,gBAAgB;WACI,QAAQ;CAK7B;AAED;;;;;;;;;;;;;GAaG;AACH,8BAAsB,mBAAmB;IACvC,wFAAwF;IACxF,aAAoB,WAAW,IAAI,MAAM,CAAC;IAEnC,YAAY,IAAI,cAAc;IAUrC;;;;;OAKG;WACW,QAAQ,IAAI,cAAc;CAGzC;AAQD;;;;;;;;;;;GAWG;AACH,8BAAsB,UAAU;IAE9B,aAAoB,WAAW,IAAI,MAAM,CAAC;IAE1C;;;;;;;;OAQG;WACW,QAAQ,IAAI,cAAc;CAIzC"}
package/lib/esm/IpcApp.js CHANGED
@@ -5,8 +5,8 @@
5
5
  /** @packageDocumentation
6
6
  * @module NativeApp
7
7
  */
8
- import { BentleyError, expectDefined, IModelStatus, JsonUtils } from "@itwin/core-bentley";
9
- import { BackendError, IModelError, ipcAppChannels, iTwinChannel, } from "@itwin/core-common";
8
+ import { expectDefined, IModelStatus } from "@itwin/core-bentley";
9
+ import { BackendError, createIpcDispatcher, createIpcProxy, IModelError, ipcAppChannels, iTwinChannel, serializeIpcError, unwrapIpcInvokeReturn, } from "@itwin/core-common";
10
10
  import { _callIpcChannel } from "./common/internal/Symbols";
11
11
  import { IModelApp } from "./IModelApp";
12
12
  /**
@@ -62,6 +62,29 @@ export class IpcApp {
62
62
  static send(channel, ...data) {
63
63
  return this.ipc.send(iTwinChannel(channel), ...data);
64
64
  }
65
+ /**
66
+ * Establish a handler for an Ipc channel to receive [[IpcHost.invoke]] calls
67
+ * @param channel The name of the channel for this handler.
68
+ * @param handler A function that supplies the implementation for `channel`
69
+ * @returns A function to call to remove the handler.
70
+ * @note If `handler` throws, or its returned Promise rejects, the thrown value is serialized (see
71
+ * [[serializeIpcError]]) and sent as the response instead of being rethrown here. Without this, the
72
+ * corresponding [[IpcHost.invoke]] call on the backend would never receive a reply and would hang (leaking
73
+ * its listener and `_pendingInvokes` entry) until [[IpcHost.shutdown]] is called.
74
+ * @beta
75
+ */
76
+ static handle(channel, handler) {
77
+ const listener = async (_evt, responseChannel, ...args) => {
78
+ try {
79
+ const response = await handler(...args);
80
+ this.ipc.send(responseChannel, response);
81
+ }
82
+ catch (err) {
83
+ this.ipc.send(responseChannel, serializeIpcError(err, true));
84
+ }
85
+ };
86
+ return this.addListener(channel, listener);
87
+ }
65
88
  /**
66
89
  * Call a method on the backend through an Ipc channel.
67
90
  * @param channelName the channel registered by the backend handler.
@@ -73,21 +96,8 @@ export class IpcApp {
73
96
  */
74
97
  static async [_callIpcChannel](channelName, methodName, ...args) {
75
98
  const retVal = (await this.invoke(channelName, methodName, ...args));
76
- if (retVal.error === undefined)
77
- return retVal.result; // method was successful
78
- // backend threw an exception, rethrow one on frontend
79
- const err = retVal.error;
80
- if (!JsonUtils.isObject(err)) {
81
- // Exception wasn't an object?
82
- throw retVal.error; // eslint-disable-line @typescript-eslint/only-throw-error
83
- }
84
- // Note: for backwards compatibility, if the exception was from a BentleyError on the backend, throw an exception of type `BackendError`.
85
- if (!BentleyError.isError(err))
86
- throw Object.assign(new Error(typeof err.message === "string" ? err.message : "unknown error"), err);
87
- const trimErr = { ...err };
88
- delete trimErr.iTwinErrorId; // these are methods on BackendError and will cause Object.assign to fail.
89
- delete trimErr.loggingMetadata;
90
- throw Object.assign(new BackendError(err.errorNumber, err.iTwinErrorId.key, err.message, err.loggingMetadata), trimErr);
99
+ // for backwards compatibility, if the exception was from a BentleyError on the backend, throw an exception of type `BackendError`.
100
+ return unwrapIpcInvokeReturn(retVal, BackendError);
91
101
  }
92
102
  /** @internal
93
103
  * @deprecated in 4.8 - might be removed in next major version. Use [[makeIpcProxy]] for a type-safe interface.
@@ -99,22 +109,14 @@ export class IpcApp {
99
109
  * @param channelName the channel registered by the backend handler.
100
110
  */
101
111
  static makeIpcProxy(channelName) {
102
- return new Proxy({}, {
103
- get(_target, methodName) {
104
- return async (...args) => IpcApp[_callIpcChannel](channelName, methodName, ...args);
105
- },
106
- });
112
+ return createIpcProxy(async (methodName, ...args) => IpcApp[_callIpcChannel](channelName, methodName, ...args));
107
113
  }
108
114
  /** Create a type safe Proxy object to call an IPC function on a of registered backend handler that accepts a "methodName" argument followed by optional arguments
109
115
  * @param channelName the channel registered by the backend handler.
110
116
  * @param functionName the function to call on the handler.
111
117
  */
112
118
  static makeIpcFunctionProxy(channelName, functionName) {
113
- return new Proxy({}, {
114
- get(_target, methodName) {
115
- return async (...args) => IpcApp[_callIpcChannel](channelName, functionName, methodName, ...args);
116
- },
117
- });
119
+ return createIpcProxy(async (methodName, ...args) => IpcApp[_callIpcChannel](channelName, functionName, methodName, ...args));
118
120
  }
119
121
  /** A Proxy to call one of the [IpcAppFunctions]($common) functions via IPC. */
120
122
  static appFunctionIpc = IpcApp.makeIpcProxy(ipcAppChannels.functions);
@@ -170,4 +172,31 @@ class IpcAppNotifyHandler extends NotificationHandler {
170
172
  get channelName() { return ipcAppChannels.appNotify; }
171
173
  notifyApp() { }
172
174
  }
175
+ /**
176
+ * Base class for all implementations of an Ipc interface.
177
+ *
178
+ * Create a subclass to implement your Ipc interface. Your class should be declared like this:
179
+ * ```ts
180
+ * class MyHandler extends IpcHandler implements MyInterface
181
+ * ```
182
+ * to ensure all methods and signatures are correct.
183
+ *
184
+ * Then, call `MyClass.register` at startup to connect your class to your channel.
185
+ * @beta
186
+ */
187
+ export class IpcHandler {
188
+ /**
189
+ * Register this class as the handler for methods on its channel. This static method creates a new instance
190
+ * that becomes the handler and is `this` when its methods are called.
191
+ * @returns A function that can be called to remove the handler.
192
+ * @note Call this only once per channel. Each call registers an *additional* handler rather than
193
+ * replacing a previous one, so registering the same channel more than once causes every registered
194
+ * handler to run and reply to an invocation. To replace a handler, first call the [[RemoveFunction]]
195
+ * returned by the previous `register`.
196
+ */
197
+ static register() {
198
+ const impl = new this(); // create an instance of subclass. "as any" is necessary because base class is abstract
199
+ return IpcApp.handle(impl.channelName, createIpcDispatcher(impl, impl.channelName, true));
200
+ }
201
+ }
173
202
  //# sourceMappingURL=IpcApp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IpcApp.js","sourceRoot":"","sources":["../../src/IpcApp.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/** @packageDocumentation\n * @module NativeApp\n */\n\nimport { BentleyError, expectDefined, IModelStatus, JsonUtils, PickAsyncMethods } from \"@itwin/core-bentley\";\nimport {\n BackendError, IModelError, ipcAppChannels, IpcAppFunctions, IpcAppNotifications, IpcInvokeReturn, IpcListener, IpcSocketFrontend, iTwinChannel,\n RemoveFunction,\n} from \"@itwin/core-common\";\nimport { _callIpcChannel } from \"./common/internal/Symbols\";\nimport { IModelApp, IModelAppOptions } from \"./IModelApp\";\n\n/**\n * Options for [[IpcApp.startup]]\n * @public\n */\nexport interface IpcAppOptions {\n iModelApp?: IModelAppOptions;\n}\n\n/**\n * The frontend of apps with a dedicated backend that can use [Ipc]($docs/learning/IpcInterface.md).\n * @public\n */\nexport class IpcApp {\n private static _ipc: IpcSocketFrontend | undefined;\n private static _removeAppNotify: RemoveFunction | undefined;\n /** Get the implementation of the [[IpcSocketFrontend]] interface. */\n\n private static get ipc(): IpcSocketFrontend { return expectDefined(this._ipc); }\n\n /** Determine whether Ipc is available for this frontend. This will only be true if [[startup]] has been called on this class. */\n public static get isValid(): boolean { return undefined !== this._ipc; }\n\n /**\n * Establish a message handler function for the supplied channel over Ipc. The handler will be called when messages are sent for\n * the channel via [[BackendIpc.send]].\n * @param channel the name of the channel\n * @param handler the message handler\n * @returns A function to remove the handler\n * @note Ipc is only supported if [[isValid]] is true.\n */\n public static addListener(channel: string, handler: IpcListener): RemoveFunction {\n return this.ipc.addListener(iTwinChannel(channel), handler);\n }\n\n /**\n * Remove a previously registered listener\n * @param channel The name of the channel for the listener previously registered with [[addListener]]\n * @param listener The function passed to [[addListener]]\n */\n public static removeListener(channel: string, listener: IpcListener) {\n this.ipc.removeListener(iTwinChannel(channel), listener);\n }\n\n /**\n * Send a message to the backend via `channel` and expect a result asynchronously. The handler must be established on the backend via [[BackendIpc.handle]]\n * @param channel The name of the channel for the method.\n * @see Electron [ipcRenderer.invoke](https://www.electronjs.org/docs/api/ipc-renderer) documentation for details.\n * Note that this interface may be implemented via Electron for desktop apps, or via\n * [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) for mobile or web-based\n * Ipc connections. In either case, the Electron documentation provides the specifications for how it works.\n * @note `args` are serialized with the [Structured Clone Algorithm](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm), so only\n * primitive types and `ArrayBuffers` are allowed.\n */\n public static async invoke(channel: string, ...args: any[]): Promise<any> {\n return this.ipc.invoke(iTwinChannel(channel), ...args);\n }\n\n /**\n * Send a message over the socket.\n * @param channel The name of the channel for the message.\n * @param data The optional data of the message.\n * @note `data` is serialized with the [Structured Clone Algorithm](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm), so only\n * primitive types and `ArrayBuffers` are allowed.\n */\n public static send(channel: string, ...data: any[]) {\n return this.ipc.send(iTwinChannel(channel), ...data);\n }\n\n /**\n * Call a method on the backend through an Ipc channel.\n * @param channelName the channel registered by the backend handler.\n * @param methodName the name of a method implemented by the backend handler.\n * @param args arguments to `methodName`\n * @return a Promise with the return value from `methodName`\n * @note If the backend implementation throws an exception, this method will throw an exception with its contents\n * @internal Use [[makeIpcProxy]] for a type-safe interface.\n */\n public static async [_callIpcChannel](channelName: string, methodName: string, ...args: any[]): Promise<any> {\n const retVal = (await this.invoke(channelName, methodName, ...args)) as IpcInvokeReturn;\n\n if (retVal.error === undefined)\n return retVal.result; // method was successful\n\n // backend threw an exception, rethrow one on frontend\n const err = retVal.error;\n if (!JsonUtils.isObject(err)) {\n // Exception wasn't an object?\n throw retVal.error; // eslint-disable-line @typescript-eslint/only-throw-error\n }\n\n // Note: for backwards compatibility, if the exception was from a BentleyError on the backend, throw an exception of type `BackendError`.\n if (!BentleyError.isError(err))\n throw Object.assign(new Error(typeof err.message === \"string\" ? err.message : \"unknown error\"), err);\n\n const trimErr = { ...err } as any;\n delete trimErr.iTwinErrorId // these are methods on BackendError and will cause Object.assign to fail.\n delete trimErr.loggingMetadata;\n throw Object.assign(new BackendError(err.errorNumber, err.iTwinErrorId.key, err.message, err.loggingMetadata), trimErr);\n }\n\n /** @internal\n * @deprecated in 4.8 - might be removed in next major version. Use [[makeIpcProxy]] for a type-safe interface.\n */\n public static async callIpcChannel(channelName: string, methodName: string, ...args: any[]): Promise<any> {\n return this[_callIpcChannel](channelName, methodName, ...args);\n }\n\n /** Create a type safe Proxy object to make IPC calls to a registered backend interface.\n * @param channelName the channel registered by the backend handler.\n */\n public static makeIpcProxy<K, C extends string = string>(channelName: C): PickAsyncMethods<K> {\n return new Proxy({} as PickAsyncMethods<K>, {\n get(_target, methodName: string) {\n return async (...args: any[]) =>\n IpcApp[_callIpcChannel](channelName, methodName, ...args);\n },\n });\n }\n\n /** Create a type safe Proxy object to call an IPC function on a of registered backend handler that accepts a \"methodName\" argument followed by optional arguments\n * @param channelName the channel registered by the backend handler.\n * @param functionName the function to call on the handler.\n */\n public static makeIpcFunctionProxy<K>(channelName: string, functionName: string): PickAsyncMethods<K> {\n return new Proxy({} as PickAsyncMethods<K>, {\n get(_target, methodName: string) {\n return async (...args: any[]) =>\n IpcApp[_callIpcChannel](channelName, functionName, methodName, ...args);\n },\n });\n }\n\n /** A Proxy to call one of the [IpcAppFunctions]($common) functions via IPC. */\n public static appFunctionIpc = IpcApp.makeIpcProxy<IpcAppFunctions>(ipcAppChannels.functions);\n\n /** start an IpcApp.\n * @note this should not be called directly. It is called by NativeApp.startup */\n public static async startup(ipc: IpcSocketFrontend, opts?: IpcAppOptions) {\n this._ipc = ipc;\n this._removeAppNotify = IpcAppNotifyHandler.register(); // receives notifications from backend\n await IModelApp.startup(opts?.iModelApp);\n }\n\n /** @internal */\n public static async shutdown() {\n this._removeAppNotify?.();\n this._ipc = undefined;\n await IModelApp.shutdown();\n }\n}\n\n/**\n * Base class for all implementations of an Ipc notification response interface. This class is implemented on your frontend to supply\n * methods to receive notifications from your backend.\n *\n * Create a subclass to implement your Ipc response interface. Your class should be declared like this:\n * ```ts\n * class MyNotificationHandler extends NotificationHandler implements MyNotifications\n * ```\n * to ensure all method names and signatures are correct. Your methods cannot have a return value.\n *\n * Then, call `MyNotificationHandler.register` at startup to connect your class to your channel.\n * @public\n * @extensions\n */\nexport abstract class NotificationHandler {\n /** All subclasses must implement this method to specify their response channel name. */\n public abstract get channelName(): string;\n\n public registerImpl(): RemoveFunction {\n return IpcApp.addListener(this.channelName, (_evt: Event, funcName: string, ...args: any[]) => {\n const func = (this as any)[funcName];\n if (typeof func !== \"function\")\n throw new IModelError(IModelStatus.FunctionNotFound, `Method \"${this.constructor.name}.${funcName}\" not found on NotificationHandler registered for channel: ${this.channelName}`);\n\n func.call(this, ...args);\n });\n }\n\n /**\n * Register this class as the handler for notifications on its channel. This static method creates a new instance\n * that becomes the notification handler and is `this` when its methods are called.\n * @returns A function that can be called to remove the handler.\n * @note this method should only be called once per channel. If it is called multiple times, multiple handlers are established.\n */\n public static register(): RemoveFunction {\n return (new (this as any)() as NotificationHandler).registerImpl(); // create an instance of subclass. \"as any\" is necessary because base class is abstract\n }\n}\n\n/** IpcApp notifications from backend */\nclass IpcAppNotifyHandler extends NotificationHandler implements IpcAppNotifications {\n public get channelName() { return ipcAppChannels.appNotify; }\n public notifyApp() { }\n}\n"]}
1
+ {"version":3,"file":"IpcApp.js","sourceRoot":"","sources":["../../src/IpcApp.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/** @packageDocumentation\n * @module NativeApp\n */\n\nimport { expectDefined, IModelStatus, PickAsyncMethods } from \"@itwin/core-bentley\";\nimport {\n BackendError, createIpcDispatcher, createIpcProxy, IModelError, ipcAppChannels, IpcAppFunctions, IpcAppNotifications, IpcInvokeReturn, IpcListener, IpcSocketFrontend, iTwinChannel,\n RemoveFunction, serializeIpcError, unwrapIpcInvokeReturn,\n} from \"@itwin/core-common\";\nimport { _callIpcChannel } from \"./common/internal/Symbols\";\nimport { IModelApp, IModelAppOptions } from \"./IModelApp\";\n\n/**\n * Options for [[IpcApp.startup]]\n * @public\n */\nexport interface IpcAppOptions {\n iModelApp?: IModelAppOptions;\n}\n\n/**\n * The frontend of apps with a dedicated backend that can use [Ipc]($docs/learning/IpcInterface.md).\n * @public\n */\nexport class IpcApp {\n private static _ipc: IpcSocketFrontend | undefined;\n private static _removeAppNotify: RemoveFunction | undefined;\n /** Get the implementation of the [[IpcSocketFrontend]] interface. */\n\n private static get ipc(): IpcSocketFrontend { return expectDefined(this._ipc); }\n\n /** Determine whether Ipc is available for this frontend. This will only be true if [[startup]] has been called on this class. */\n public static get isValid(): boolean { return undefined !== this._ipc; }\n\n /**\n * Establish a message handler function for the supplied channel over Ipc. The handler will be called when messages are sent for\n * the channel via [[BackendIpc.send]].\n * @param channel the name of the channel\n * @param handler the message handler\n * @returns A function to remove the handler\n * @note Ipc is only supported if [[isValid]] is true.\n */\n public static addListener(channel: string, handler: IpcListener): RemoveFunction {\n return this.ipc.addListener(iTwinChannel(channel), handler);\n }\n\n /**\n * Remove a previously registered listener\n * @param channel The name of the channel for the listener previously registered with [[addListener]]\n * @param listener The function passed to [[addListener]]\n */\n public static removeListener(channel: string, listener: IpcListener) {\n this.ipc.removeListener(iTwinChannel(channel), listener);\n }\n\n /**\n * Send a message to the backend via `channel` and expect a result asynchronously. The handler must be established on the backend via [[BackendIpc.handle]]\n * @param channel The name of the channel for the method.\n * @see Electron [ipcRenderer.invoke](https://www.electronjs.org/docs/api/ipc-renderer) documentation for details.\n * Note that this interface may be implemented via Electron for desktop apps, or via\n * [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) for mobile or web-based\n * Ipc connections. In either case, the Electron documentation provides the specifications for how it works.\n * @note `args` are serialized with the [Structured Clone Algorithm](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm), so only\n * primitive types and `ArrayBuffers` are allowed.\n */\n public static async invoke(channel: string, ...args: any[]): Promise<any> {\n return this.ipc.invoke(iTwinChannel(channel), ...args);\n }\n\n /**\n * Send a message over the socket.\n * @param channel The name of the channel for the message.\n * @param data The optional data of the message.\n * @note `data` is serialized with the [Structured Clone Algorithm](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm), so only\n * primitive types and `ArrayBuffers` are allowed.\n */\n public static send(channel: string, ...data: any[]) {\n return this.ipc.send(iTwinChannel(channel), ...data);\n }\n\n /**\n * Establish a handler for an Ipc channel to receive [[IpcHost.invoke]] calls\n * @param channel The name of the channel for this handler.\n * @param handler A function that supplies the implementation for `channel`\n * @returns A function to call to remove the handler.\n * @note If `handler` throws, or its returned Promise rejects, the thrown value is serialized (see\n * [[serializeIpcError]]) and sent as the response instead of being rethrown here. Without this, the\n * corresponding [[IpcHost.invoke]] call on the backend would never receive a reply and would hang (leaking\n * its listener and `_pendingInvokes` entry) until [[IpcHost.shutdown]] is called.\n * @beta\n */\n public static handle(channel: string, handler: (...args: any[]) => Promise<any>): RemoveFunction {\n const listener = async (_evt: Event, responseChannel: string, ...args: any[]) => {\n try {\n const response = await handler(...args);\n this.ipc.send(responseChannel, response);\n } catch (err) {\n this.ipc.send(responseChannel, serializeIpcError(err, true));\n }\n };\n\n return this.addListener(channel, listener);\n }\n\n /**\n * Call a method on the backend through an Ipc channel.\n * @param channelName the channel registered by the backend handler.\n * @param methodName the name of a method implemented by the backend handler.\n * @param args arguments to `methodName`\n * @return a Promise with the return value from `methodName`\n * @note If the backend implementation throws an exception, this method will throw an exception with its contents\n * @internal Use [[makeIpcProxy]] for a type-safe interface.\n */\n public static async [_callIpcChannel](channelName: string, methodName: string, ...args: any[]): Promise<any> {\n const retVal = (await this.invoke(channelName, methodName, ...args)) as IpcInvokeReturn;\n // for backwards compatibility, if the exception was from a BentleyError on the backend, throw an exception of type `BackendError`.\n return unwrapIpcInvokeReturn(retVal, BackendError);\n }\n\n /** @internal\n * @deprecated in 4.8 - might be removed in next major version. Use [[makeIpcProxy]] for a type-safe interface.\n */\n public static async callIpcChannel(channelName: string, methodName: string, ...args: any[]): Promise<any> {\n return this[_callIpcChannel](channelName, methodName, ...args);\n }\n\n /** Create a type safe Proxy object to make IPC calls to a registered backend interface.\n * @param channelName the channel registered by the backend handler.\n */\n public static makeIpcProxy<K, C extends string = string>(channelName: C): PickAsyncMethods<K> {\n return createIpcProxy<K>(async (methodName: string, ...args: any[]) => IpcApp[_callIpcChannel](channelName, methodName, ...args));\n }\n\n /** Create a type safe Proxy object to call an IPC function on a of registered backend handler that accepts a \"methodName\" argument followed by optional arguments\n * @param channelName the channel registered by the backend handler.\n * @param functionName the function to call on the handler.\n */\n public static makeIpcFunctionProxy<K>(channelName: string, functionName: string): PickAsyncMethods<K> {\n return createIpcProxy<K>(async (methodName: string, ...args: any[]) => IpcApp[_callIpcChannel](channelName, functionName, methodName, ...args));\n }\n\n /** A Proxy to call one of the [IpcAppFunctions]($common) functions via IPC. */\n public static appFunctionIpc = IpcApp.makeIpcProxy<IpcAppFunctions>(ipcAppChannels.functions);\n\n /** start an IpcApp.\n * @note this should not be called directly. It is called by NativeApp.startup */\n public static async startup(ipc: IpcSocketFrontend, opts?: IpcAppOptions) {\n this._ipc = ipc;\n this._removeAppNotify = IpcAppNotifyHandler.register(); // receives notifications from backend\n await IModelApp.startup(opts?.iModelApp);\n }\n\n /** @internal */\n public static async shutdown() {\n this._removeAppNotify?.();\n this._ipc = undefined;\n await IModelApp.shutdown();\n }\n}\n\n/**\n * Base class for all implementations of an Ipc notification response interface. This class is implemented on your frontend to supply\n * methods to receive notifications from your backend.\n *\n * Create a subclass to implement your Ipc response interface. Your class should be declared like this:\n * ```ts\n * class MyNotificationHandler extends NotificationHandler implements MyNotifications\n * ```\n * to ensure all method names and signatures are correct. Your methods cannot have a return value.\n *\n * Then, call `MyNotificationHandler.register` at startup to connect your class to your channel.\n * @public\n * @extensions\n */\nexport abstract class NotificationHandler {\n /** All subclasses must implement this method to specify their response channel name. */\n public abstract get channelName(): string;\n\n public registerImpl(): RemoveFunction {\n return IpcApp.addListener(this.channelName, (_evt: Event, funcName: string, ...args: any[]) => {\n const func = (this as any)[funcName];\n if (typeof func !== \"function\")\n throw new IModelError(IModelStatus.FunctionNotFound, `Method \"${this.constructor.name}.${funcName}\" not found on NotificationHandler registered for channel: ${this.channelName}`);\n\n func.call(this, ...args);\n });\n }\n\n /**\n * Register this class as the handler for notifications on its channel. This static method creates a new instance\n * that becomes the notification handler and is `this` when its methods are called.\n * @returns A function that can be called to remove the handler.\n * @note this method should only be called once per channel. If it is called multiple times, multiple handlers are established.\n */\n public static register(): RemoveFunction {\n return (new (this as any)() as NotificationHandler).registerImpl(); // create an instance of subclass. \"as any\" is necessary because base class is abstract\n }\n}\n\n/** IpcApp notifications from backend */\nclass IpcAppNotifyHandler extends NotificationHandler implements IpcAppNotifications {\n public get channelName() { return ipcAppChannels.appNotify; }\n public notifyApp() { }\n}\n\n/**\n * Base class for all implementations of an Ipc interface.\n *\n * Create a subclass to implement your Ipc interface. Your class should be declared like this:\n * ```ts\n * class MyHandler extends IpcHandler implements MyInterface\n * ```\n * to ensure all methods and signatures are correct.\n *\n * Then, call `MyClass.register` at startup to connect your class to your channel.\n * @beta\n */\nexport abstract class IpcHandler {\n /* All subclasses must implement this method to specify their channel name. */\n public abstract get channelName(): string;\n\n /**\n * Register this class as the handler for methods on its channel. This static method creates a new instance\n * that becomes the handler and is `this` when its methods are called.\n * @returns A function that can be called to remove the handler.\n * @note Call this only once per channel. Each call registers an *additional* handler rather than\n * replacing a previous one, so registering the same channel more than once causes every registered\n * handler to run and reply to an invocation. To replace a handler, first call the [[RemoveFunction]]\n * returned by the previous `register`.\n */\n public static register(): RemoveFunction {\n const impl = new (this as any)() as IpcHandler; // create an instance of subclass. \"as any\" is necessary because base class is abstract\n return IpcApp.handle(impl.channelName, createIpcDispatcher(impl, impl.channelName, true));\n }\n}\n"]}