@itwin/core-frontend 5.7.0-dev.9 → 5.8.0-dev.2

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 (84) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/lib/cjs/CategorySelectorState.d.ts +8 -0
  3. package/lib/cjs/CategorySelectorState.d.ts.map +1 -1
  4. package/lib/cjs/CategorySelectorState.js +12 -0
  5. package/lib/cjs/CategorySelectorState.js.map +1 -1
  6. package/lib/cjs/GeoServices.js +1 -1
  7. package/lib/cjs/GeoServices.js.map +1 -1
  8. package/lib/cjs/IModelConnection.d.ts +0 -2
  9. package/lib/cjs/IModelConnection.d.ts.map +1 -1
  10. package/lib/cjs/IModelConnection.js +110 -105
  11. package/lib/cjs/IModelConnection.js.map +1 -1
  12. package/lib/cjs/ViewState.d.ts.map +1 -1
  13. package/lib/cjs/ViewState.js +2 -0
  14. package/lib/cjs/ViewState.js.map +1 -1
  15. package/lib/cjs/Viewport.d.ts +2 -1
  16. package/lib/cjs/Viewport.d.ts.map +1 -1
  17. package/lib/cjs/Viewport.js +10 -3
  18. package/lib/cjs/Viewport.js.map +1 -1
  19. package/lib/cjs/common/gltf/GltfParser.js +1 -1
  20. package/lib/cjs/common/gltf/GltfParser.js.map +1 -1
  21. package/lib/cjs/internal/tile/MeshoptCompression.js +1 -1
  22. package/lib/cjs/internal/tile/MeshoptCompression.js.map +1 -1
  23. package/lib/cjs/internal/tile/PntsReader.js +1 -1
  24. package/lib/cjs/internal/tile/PntsReader.js.map +1 -1
  25. package/lib/cjs/internal/tile/RealityTileLoader.d.ts.map +1 -1
  26. package/lib/cjs/internal/tile/RealityTileLoader.js +26 -5
  27. package/lib/cjs/internal/tile/RealityTileLoader.js.map +1 -1
  28. package/lib/cjs/tile/GltfReader.d.ts +4 -2
  29. package/lib/cjs/tile/GltfReader.d.ts.map +1 -1
  30. package/lib/cjs/tile/GltfReader.js +55 -5
  31. package/lib/cjs/tile/GltfReader.js.map +1 -1
  32. package/lib/cjs/tools/MeasureTool.d.ts.map +1 -1
  33. package/lib/cjs/tools/MeasureTool.js +18 -1
  34. package/lib/cjs/tools/MeasureTool.js.map +1 -1
  35. package/lib/cjs/tools/PrimitiveTool.d.ts.map +1 -1
  36. package/lib/cjs/tools/PrimitiveTool.js +7 -1
  37. package/lib/cjs/tools/PrimitiveTool.js.map +1 -1
  38. package/lib/cjs/tools/ToolAdmin.d.ts +1 -0
  39. package/lib/cjs/tools/ToolAdmin.d.ts.map +1 -1
  40. package/lib/cjs/tools/ToolAdmin.js +32 -18
  41. package/lib/cjs/tools/ToolAdmin.js.map +1 -1
  42. package/lib/esm/CategorySelectorState.d.ts +8 -0
  43. package/lib/esm/CategorySelectorState.d.ts.map +1 -1
  44. package/lib/esm/CategorySelectorState.js +12 -0
  45. package/lib/esm/CategorySelectorState.js.map +1 -1
  46. package/lib/esm/GeoServices.js +1 -1
  47. package/lib/esm/GeoServices.js.map +1 -1
  48. package/lib/esm/IModelConnection.d.ts +0 -2
  49. package/lib/esm/IModelConnection.d.ts.map +1 -1
  50. package/lib/esm/IModelConnection.js +110 -105
  51. package/lib/esm/IModelConnection.js.map +1 -1
  52. package/lib/esm/ViewState.d.ts.map +1 -1
  53. package/lib/esm/ViewState.js +2 -0
  54. package/lib/esm/ViewState.js.map +1 -1
  55. package/lib/esm/Viewport.d.ts +2 -1
  56. package/lib/esm/Viewport.d.ts.map +1 -1
  57. package/lib/esm/Viewport.js +10 -3
  58. package/lib/esm/Viewport.js.map +1 -1
  59. package/lib/esm/common/gltf/GltfParser.js +1 -1
  60. package/lib/esm/common/gltf/GltfParser.js.map +1 -1
  61. package/lib/esm/internal/tile/MeshoptCompression.js +1 -1
  62. package/lib/esm/internal/tile/MeshoptCompression.js.map +1 -1
  63. package/lib/esm/internal/tile/PntsReader.js +1 -1
  64. package/lib/esm/internal/tile/PntsReader.js.map +1 -1
  65. package/lib/esm/internal/tile/RealityTileLoader.d.ts.map +1 -1
  66. package/lib/esm/internal/tile/RealityTileLoader.js +26 -5
  67. package/lib/esm/internal/tile/RealityTileLoader.js.map +1 -1
  68. package/lib/esm/tile/GltfReader.d.ts +4 -2
  69. package/lib/esm/tile/GltfReader.d.ts.map +1 -1
  70. package/lib/esm/tile/GltfReader.js +55 -5
  71. package/lib/esm/tile/GltfReader.js.map +1 -1
  72. package/lib/esm/tools/MeasureTool.d.ts.map +1 -1
  73. package/lib/esm/tools/MeasureTool.js +18 -1
  74. package/lib/esm/tools/MeasureTool.js.map +1 -1
  75. package/lib/esm/tools/PrimitiveTool.d.ts.map +1 -1
  76. package/lib/esm/tools/PrimitiveTool.js +7 -1
  77. package/lib/esm/tools/PrimitiveTool.js.map +1 -1
  78. package/lib/esm/tools/ToolAdmin.d.ts +1 -0
  79. package/lib/esm/tools/ToolAdmin.d.ts.map +1 -1
  80. package/lib/esm/tools/ToolAdmin.js +32 -18
  81. package/lib/esm/tools/ToolAdmin.js.map +1 -1
  82. package/lib/public/scripts/parse-imdl-worker.js +1 -1
  83. package/lib/workers/webpack/parse-imdl-worker.js +1 -1
  84. package/package.json +20 -20
@@ -38,6 +38,14 @@ export declare class CategorySelectorState extends ElementState {
38
38
  addCategories(arg: Id64Arg): void;
39
39
  /** Remove one or more categories from this CategorySelector */
40
40
  dropCategories(arg: Id64Arg): void;
41
+ /** Add one or more categories to this CategorySelector, raising a single batch event instead of one event per category.
42
+ * This is more efficient than [[addCategories]] when adding many categories at once.
43
+ */
44
+ addCategoriesBatched(arg: Id64Arg): void;
45
+ /** Remove one or more categories from this CategorySelector, raising a single batch event instead of one event per category.
46
+ * This is more efficient than [[dropCategories]] when dropping many categories at once.
47
+ */
48
+ dropCategoriesBatched(arg: Id64Arg): void;
41
49
  /** Add or remove categories from this CategorySelector.
42
50
  * @param arg The categories to add or remove
43
51
  * @param add If true, categories will be added; otherwise they will be removed.
@@ -1 +1 @@
1
- {"version":3,"file":"CategorySelectorState.d.ts","sourceRoot":"","sources":["../../src/CategorySelectorState.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,OAAO,EAAQ,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;;;;;GASG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,WAA2B,SAAS,WAAiC;IAErE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;gBAE/C,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,gBAAgB;IAMlE,IAAW,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,CAEnC;IAED,IAAW,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAI5C;IAED,gBAAgB;IAChB,IAAW,oBAAoB,IAAI,aAAa,CAAC,MAAM,CAAC,CAEvD;IAEe,MAAM,IAAI,qBAAqB;IAO/C;;OAEG;IACI,UAAU,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO;IAWxD,wCAAwC;IACxC,IAAW,IAAI,IAAI,MAAM,CAA4B;IAErD,uFAAuF;IAChF,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO;IAEnC,8EAA8E;IACvE,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;IAExD,0DAA0D;IACnD,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAKxC,+DAA+D;IACxD,cAAc,CAAC,GAAG,EAAE,OAAO;IAKlC;;;OAGG;IACI,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI;CAM/D"}
1
+ {"version":3,"file":"CategorySelectorState.d.ts","sourceRoot":"","sources":["../../src/CategorySelectorState.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,OAAO,EAAQ,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;;;;;GASG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,WAA2B,SAAS,WAAiC;IAErE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;gBAE/C,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,gBAAgB;IAMlE,IAAW,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,CAEnC;IAED,IAAW,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAI5C;IAED,gBAAgB;IAChB,IAAW,oBAAoB,IAAI,aAAa,CAAC,MAAM,CAAC,CAEvD;IAEe,MAAM,IAAI,qBAAqB;IAO/C;;OAEG;IACI,UAAU,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO;IAWxD,wCAAwC;IACxC,IAAW,IAAI,IAAI,MAAM,CAA4B;IAErD,uFAAuF;IAChF,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO;IAEnC,8EAA8E;IACvE,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;IAExD,0DAA0D;IACnD,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAKxC,+DAA+D;IACxD,cAAc,CAAC,GAAG,EAAE,OAAO;IAKlC;;OAEG;IACI,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAI/C;;OAEG;IACI,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAIhD;;;OAGG;IACI,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI;CAM/D"}
@@ -70,6 +70,18 @@ export class CategorySelectorState extends ElementState {
70
70
  for (const id of Id64.iterable(arg))
71
71
  this.categories.delete(id);
72
72
  }
73
+ /** Add one or more categories to this CategorySelector, raising a single batch event instead of one event per category.
74
+ * This is more efficient than [[addCategories]] when adding many categories at once.
75
+ */
76
+ addCategoriesBatched(arg) {
77
+ this._categories.addAll(Id64.iterable(arg));
78
+ }
79
+ /** Remove one or more categories from this CategorySelector, raising a single batch event instead of one event per category.
80
+ * This is more efficient than [[dropCategories]] when dropping many categories at once.
81
+ */
82
+ dropCategoriesBatched(arg) {
83
+ this._categories.deleteAll(Id64.iterable(arg));
84
+ }
73
85
  /** Add or remove categories from this CategorySelector.
74
86
  * @param arg The categories to add or remove
75
87
  * @param add If true, categories will be added; otherwise they will be removed.
@@ -1 +1 @@
1
- {"version":3,"file":"CategorySelectorState.js","sourceRoot":"","sources":["../../src/CategorySelectorState.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\nimport { Id64, Id64Arg, Id64String, ObservableSet } from \"@itwin/core-bentley\";\r\nimport { CategorySelectorProps } from \"@itwin/core-common\";\r\nimport { ElementState } from \"./EntityState\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\n\r\n/** A set of Categories to be displayed in a [[ViewState]].\r\n * Elements belonging to categories not specified in the category selector will not be drawn in the view.\r\n * By default, geometry belonging to any [[SubCategory]] of a visible Category is also visible in the view,\r\n * unless the [[SubCategoryAppearance]] or [[SubCategoryOverride]] specifies that it should be invisible.\r\n * @note To change the set of categories visible in a [[ViewState]] currently associated with a [[Viewport]],\r\n * use [[ViewState.changeCategoryDisplay]] to ensure the view updates appropriately on screen.\r\n * @see [[Category]]\r\n * @public\r\n * @extensions\r\n */\r\nexport class CategorySelectorState extends ElementState {\r\n public static override get className() { return \"CategorySelector\"; }\r\n\r\n private readonly _categories = new ObservableSet<string>();\r\n\r\n constructor(props: CategorySelectorProps, iModel: IModelConnection) {\r\n super(props, iModel);\r\n if (props.categories)\r\n props.categories.forEach((cat) => this.categories.add(cat));\r\n }\r\n\r\n public get categories(): Set<string> {\r\n return this._categories;\r\n }\r\n\r\n public set categories(categories: Set<string>) {\r\n this._categories.clear();\r\n for (const category of categories)\r\n this._categories.add(category);\r\n }\r\n\r\n /** @internal */\r\n public get observableCategories(): ObservableSet<string> {\r\n return this._categories;\r\n }\r\n\r\n public override toJSON(): CategorySelectorProps {\r\n const val = super.toJSON() as CategorySelectorProps;\r\n val.categories = [];\r\n this.categories.forEach((cat) => val.categories.push(cat));\r\n return val;\r\n }\r\n\r\n /** Returns true if this category selector is logically equivalent to the specified category selector.\r\n * Two category selectors are logically equivalent if they have the same name and Id and contain the same set of category Ids.\r\n */\r\n public equalState(other: CategorySelectorState): boolean {\r\n if (this.categories.size !== other.categories.size || this.name !== other.name || this.id !== other.id)\r\n return false;\r\n\r\n for (const cat of this.categories)\r\n if (!other.categories.has(cat))\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n /** The name of this CategorySelector */\r\n public get name(): string { return this.code.value; }\r\n\r\n /** Determine whether this CategorySelector includes the specified categoryId string */\r\n public has(id: Id64String): boolean { return this.categories.has(id); }\r\n\r\n /** Determine whether this CategorySelector includes the specified category */\r\n public isCategoryViewed(categoryId: Id64String): boolean { return this.has(categoryId); }\r\n\r\n /** Add one or more categories to this CategorySelector */\r\n public addCategories(arg: Id64Arg): void {\r\n for (const id of Id64.iterable(arg))\r\n this.categories.add(id);\r\n }\r\n\r\n /** Remove one or more categories from this CategorySelector */\r\n public dropCategories(arg: Id64Arg) {\r\n for (const id of Id64.iterable(arg))\r\n this.categories.delete(id);\r\n }\r\n\r\n /** Add or remove categories from this CategorySelector.\r\n * @param arg The categories to add or remove\r\n * @param add If true, categories will be added; otherwise they will be removed.\r\n */\r\n public changeCategoryDisplay(arg: Id64Arg, add: boolean): void {\r\n if (add)\r\n this.addCategories(arg);\r\n else\r\n this.dropCategories(arg);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"CategorySelectorState.js","sourceRoot":"","sources":["../../src/CategorySelectorState.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\nimport { Id64, Id64Arg, Id64String, ObservableSet } from \"@itwin/core-bentley\";\r\nimport { CategorySelectorProps } from \"@itwin/core-common\";\r\nimport { ElementState } from \"./EntityState\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\n\r\n/** A set of Categories to be displayed in a [[ViewState]].\r\n * Elements belonging to categories not specified in the category selector will not be drawn in the view.\r\n * By default, geometry belonging to any [[SubCategory]] of a visible Category is also visible in the view,\r\n * unless the [[SubCategoryAppearance]] or [[SubCategoryOverride]] specifies that it should be invisible.\r\n * @note To change the set of categories visible in a [[ViewState]] currently associated with a [[Viewport]],\r\n * use [[ViewState.changeCategoryDisplay]] to ensure the view updates appropriately on screen.\r\n * @see [[Category]]\r\n * @public\r\n * @extensions\r\n */\r\nexport class CategorySelectorState extends ElementState {\r\n public static override get className() { return \"CategorySelector\"; }\r\n\r\n private readonly _categories = new ObservableSet<string>();\r\n\r\n constructor(props: CategorySelectorProps, iModel: IModelConnection) {\r\n super(props, iModel);\r\n if (props.categories)\r\n props.categories.forEach((cat) => this.categories.add(cat));\r\n }\r\n\r\n public get categories(): Set<string> {\r\n return this._categories;\r\n }\r\n\r\n public set categories(categories: Set<string>) {\r\n this._categories.clear();\r\n for (const category of categories)\r\n this._categories.add(category);\r\n }\r\n\r\n /** @internal */\r\n public get observableCategories(): ObservableSet<string> {\r\n return this._categories;\r\n }\r\n\r\n public override toJSON(): CategorySelectorProps {\r\n const val = super.toJSON() as CategorySelectorProps;\r\n val.categories = [];\r\n this.categories.forEach((cat) => val.categories.push(cat));\r\n return val;\r\n }\r\n\r\n /** Returns true if this category selector is logically equivalent to the specified category selector.\r\n * Two category selectors are logically equivalent if they have the same name and Id and contain the same set of category Ids.\r\n */\r\n public equalState(other: CategorySelectorState): boolean {\r\n if (this.categories.size !== other.categories.size || this.name !== other.name || this.id !== other.id)\r\n return false;\r\n\r\n for (const cat of this.categories)\r\n if (!other.categories.has(cat))\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n /** The name of this CategorySelector */\r\n public get name(): string { return this.code.value; }\r\n\r\n /** Determine whether this CategorySelector includes the specified categoryId string */\r\n public has(id: Id64String): boolean { return this.categories.has(id); }\r\n\r\n /** Determine whether this CategorySelector includes the specified category */\r\n public isCategoryViewed(categoryId: Id64String): boolean { return this.has(categoryId); }\r\n\r\n /** Add one or more categories to this CategorySelector */\r\n public addCategories(arg: Id64Arg): void {\r\n for (const id of Id64.iterable(arg))\r\n this.categories.add(id);\r\n }\r\n\r\n /** Remove one or more categories from this CategorySelector */\r\n public dropCategories(arg: Id64Arg) {\r\n for (const id of Id64.iterable(arg))\r\n this.categories.delete(id);\r\n }\r\n\r\n /** Add one or more categories to this CategorySelector, raising a single batch event instead of one event per category.\r\n * This is more efficient than [[addCategories]] when adding many categories at once.\r\n */\r\n public addCategoriesBatched(arg: Id64Arg): void {\r\n this._categories.addAll(Id64.iterable(arg));\r\n }\r\n\r\n /** Remove one or more categories from this CategorySelector, raising a single batch event instead of one event per category.\r\n * This is more efficient than [[dropCategories]] when dropping many categories at once.\r\n */\r\n public dropCategoriesBatched(arg: Id64Arg): void {\r\n this._categories.deleteAll(Id64.iterable(arg));\r\n }\r\n\r\n /** Add or remove categories from this CategorySelector.\r\n * @param arg The categories to add or remove\r\n * @param add If true, categories will be added; otherwise they will be removed.\r\n */\r\n public changeCategoryDisplay(arg: Id64Arg, add: boolean): void {\r\n if (add)\r\n this.addCategories(arg);\r\n else\r\n this.dropCategories(arg);\r\n }\r\n}\r\n"]}
@@ -100,7 +100,7 @@ export class CoordinateConverter {
100
100
  this._cache.set(requests[j], results[j]);
101
101
  }
102
102
  }).catch((err) => {
103
- Logger.logException(`${FrontendLoggerCategory.Package}.geoservices`, err);
103
+ Logger.logError(`${FrontendLoggerCategory.Package}.geoservices`, err);
104
104
  });
105
105
  promises.push(promise);
106
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GeoServices.js","sourceRoot":"","sources":["../../src/GeoServices.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,qBAAqB;AACrB,OAAO,EACL,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GACjD,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACoD,cAAc,EACvE,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAazE,SAAS,aAAa,CAAC,GAAW,EAAE,GAAW;IAC7C,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;AAC1C,CAAC;AAUD;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,mBAAmB;IACX,MAAM,CAAsC;IACrD,MAAM,GAA6B,MAAM,CAAC;IACpD,qEAAqE;IAC3D,QAAQ,CAAsB;IACxC,iFAAiF;IACvE,SAAS,CAAsB;IACzC,kDAAkD;IACxC,YAAY,GAAG,IAAI,OAAO,EAAc,CAAC;IACnD,oGAAoG;IACjF,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnC,oBAAoB,CAAS;IAC7B,eAAe,CAAgB;IAC/B,cAAc,CAAmD;IACpF,qFAAqF;IACrF,iIAAiI;IACjI,gGAAgG;IACtF,uBAAuB,GAAG,KAAK,CAAC;IAE1C,IAAW,MAAM;QACf,OAAO,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;IAChC,CAAC;IAES,QAAQ,CAAC,KAAe,EAAE,MAAsB;QACxD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,YAAmB,IAAgC;QACjD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,IAAI,GAAG,CAAC,CAAC;QACzE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC;QAC3C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;QAEzC,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,CAA0B,aAAa,EAAE,WAAW,CAAC,CAAC;QAClF,IAAI,CAAC,QAAQ,GAAG,IAAI,WAAW,CAAS,aAAa,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC3E,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAS,aAAa,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC9E,CAAC;IAES,KAAK,CAAC,QAAQ;QACtB,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;QAE1B,uFAAuF;QACvF,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,IAAI,OAAO,EAAc,CAAC;QAE9C,+HAA+H;QAC/H,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAE1B,kGAAkG;QAClG,MAAM,QAAQ,GAAyB,EAAE,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,YAAY,EAAE,CAAC;YACjF,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7D,IAAI,IAAI,CAAC,eAAe,EAAE;oBACxB,OAAO;gBAET,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;oBACpC,MAAM,CAAC,QAAQ,CAAC,GAAG,sBAAsB,CAAC,OAAO,cAAc,EAAE,2BAA2B,QAAQ,CAAC,MAAM,yBAAyB,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC;gBAE/J,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACxC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM;wBACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACf,MAAM,CAAC,YAAY,CAAC,GAAG,sBAAsB,CAAC,OAAO,cAAc,EAAE,GAAG,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE5B,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAEvB,iGAAiG;QACjG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC3D,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;YACrC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,8DAA8D;QACzF,CAAC;QAED,kEAAkE;QAClE,WAAW,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;IAED,+DAA+D;IAC/D,gDAAgD;IACtC,OAAO,CAAC,MAAkB;QAClC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACnD,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;gBACtB,EAAE,UAAU,CAAC;iBACV,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACnC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;;gBAEpC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,0HAA0H;IAC1H,2EAA2E;IACjE,YAAY,CAAC,MAAkB;QACvC,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACnD,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM;gBACT,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,cAAc,CAAC,UAAU,EAAE,CAAC;YAE3D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAES,KAAK,CAAC,gBAAgB;QAC9B,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;YAC1B,qBAAqB,CAAC,GAAG,EAAE;gBACzB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,8DAA8D;YACjF,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,MAAkB;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;QAEnC,IAAI,SAAS,KAAK,MAAM,CAAC,MAAM;YAC7B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;QAE1D,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IAC1D,CAAC;IAEM,UAAU,CAAC,MAAkB;QAClC,MAAM,MAAM,GAAuC,EAAE,CAAC;QACtD,IAAI,OAA+B,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC,OAAO;oBACV,OAAO,GAAG,EAAE,CAAC;gBAEf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC7B,CAAC;CACF;AAsBD;;;;GAIG;AACH,MAAM,OAAO,YAAY;IACN,YAAY,CAAsB;IAClC,YAAY,CAAsB;IACnD;;OAEG;IACa,sBAAsB,GAAG,IAAI,OAAO,EAAc,CAAC;IAEnE,gBAAgB;IAChB,YAAY,IAAyB;QACnC,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,mBAAmB,CAAC;YAC1C,cAAc;YACd,aAAa,EAAE,KAAK,EAAE,SAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;SACrG,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,GAAG,IAAI,mBAAmB,CAAC;YAC1C,cAAc;YACd,aAAa,EAAE,KAAK,EAAE,YAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;SAC7G,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IACrE,KAAK,CAAC,qBAAqB,CAAC,SAAqB;QACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sCAAsC,CAAC,SAAS,CAAC,CAAC;QAC5E,OAAO,MAAM,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,4EAA4E;IACrE,KAAK,CAAC,uBAAuB,CAAC,YAAwB;QAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sCAAsC,CAAC,YAAY,CAAC,CAAC;QAC/E,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,sCAAsC,CAAC,SAAqB;QACvE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,MAAM;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;IACJ,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,sCAAsC,CAAC,YAAwB;QAC1E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,MAAM;YACxB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM;YACtD,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,CAAC;IAC7C,CAAC;IAED,gBAAgB;IACT,4CAA4C,CAAC,SAAqB;QACvE,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;CACF;AAKD;;;GAGG;AACH,MAAM,OAAO,WAAW;IACL,QAAQ,CAAqB;IAC9C;;;;;;;;;OASG;IACc,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAE1D,gBAAgB;IAChB,YAAmB,OAA2B;QAC5C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,gBAAgB;IACT,MAAM,CAAC,eAAe,CAAC,MAAwB;QACpD,OAAO,IAAI,WAAW,CAAC;YACrB,cAAc,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ;YACrC,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBAChC,MAAM,GAAG,GAAG,sBAAsB,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBACpF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,sCAAsC,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;gBACjG,OAAO,QAAQ,CAAC,YAAY,CAAC;YAC/B,CAAC;YACD,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBAClC,MAAM,GAAG,GAAG,sBAAsB,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBACpF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,sCAAsC,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;gBACjG,OAAO,QAAQ,CAAC,SAAS,CAAC;YAC5B,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,YAAY,CAAC,WAAyC;QAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;YAChC,OAAO,SAAS,CAAC;QAEnB,MAAM,KAAK,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAElG,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,IAAI,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAElC,SAAS,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC5C,IAAI,SAAS,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;oBACtC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module IModelConnection\r\n */\r\n\r\n// cspell:ignore GCRS\r\nimport {\r\n assert, BeEvent, Dictionary, Logger, SortedArray,\r\n} from \"@itwin/core-bentley\";\r\nimport { WritableXYAndZ, XYAndZ, XYZProps } from \"@itwin/core-geometry\";\r\nimport {\r\n GeoCoordinatesRequestProps, GeoCoordinatesResponseProps, GeoCoordStatus, GeographicCRSProps, IModelCoordinatesRequestProps, IModelCoordinatesResponseProps,\r\n IModelReadRpcInterface, PointWithStatus,\r\n} from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\nimport { FrontendLoggerCategory } from \"./common/FrontendLoggerCategory\";\r\n\r\n/** Options used to create a [[CoordinateConverter]].\r\n * @internal exported strictly for tests.\r\n */\r\nexport interface CoordinateConverterOptions {\r\n isIModelClosed: () => boolean;\r\n /** Asynchronously convert each point. The resultant array should have the same number and order of points as the input. */\r\n requestPoints: (points: XYAndZ[]) => Promise<PointWithStatus[]>;\r\n /** Maximum number of points to include in each request. Default: 300. */\r\n maxPointsPerRequest?: number;\r\n}\r\n\r\nfunction compareXYAndZ(lhs: XYAndZ, rhs: XYAndZ): number {\r\n return lhs.x - rhs.x || lhs.y - rhs.y || lhs.z - rhs.z;\r\n}\r\n\r\nfunction cloneXYAndZ(xyz: XYAndZ): XYAndZ {\r\n return { x: xyz.x, y: xyz.y, z: xyz.z };\r\n}\r\n\r\ntype CoordinateConverterState =\r\n // No pending requests.\r\n \"idle\" |\r\n // We have scheduled a requestAnimationFrame to dispatch all pending requests.\r\n \"scheduled\" |\r\n // We have dispatched all requests that were pending at the most recent requestAnimationFrame callback.\r\n \"in-flight\";\r\n\r\n/** Performs conversion of coordinates from one coordinate system to another.\r\n * A [[GeoConverter]] has a pair of these for converting between iModel coordinates and geographic coordinates.\r\n * Uses a cache to avoid repeatedly requesting the same points, and a batching strategy to avoid making frequent small requests.\r\n * The cache stores every point that was ever converted by [[convert]]. It is currently permitted to grow to unbounded size.\r\n * The batching works as follows:\r\n * When a conversion is requested via [[convert]], if all the requested points are in the cache, they are returned immediately.\r\n * Otherwise, any points not in the cache and not in the current in-flight request (if any) are placed onto the queue of pending requests.\r\n * A pending request is scheduled if one hasn't already been scheduled, via requestAnimationFrame.\r\n * In the animation frame callback, the pending requests are split into batches of no more than options.maxPointsPerRequest and dispatched to the backend.\r\n * Once the response is received, the results are loaded into and returned from the cache.\r\n * If more calls to convert occurred while the request was in flight, another request is dispatched.\r\n * @internal exported strictly for tests.\r\n */\r\nexport class CoordinateConverter {\r\n protected readonly _cache: Dictionary<XYAndZ, PointWithStatus>;\r\n protected _state: CoordinateConverterState = \"idle\";\r\n // The accumulated set of points to be converted by the next request.\r\n protected _pending: SortedArray<XYAndZ>;\r\n // The set of points that were included in the current in-flight request, if any.\r\n protected _inflight: SortedArray<XYAndZ>;\r\n // An event fired when the next request completes.\r\n protected _onCompleted = new BeEvent<() => void>();\r\n // Used for creating cache keys (XYAndZ) from XYZProps without having to allocate temporary objects.\r\n protected readonly _scratchXYZ = { x: 0, y: 0, z: 0 };\r\n protected readonly _maxPointsPerRequest: number;\r\n protected readonly _isIModelClosed: () => boolean;\r\n protected readonly _requestPoints: (points: XYAndZ[]) => Promise<PointWithStatus[]>;\r\n // If true, [[dispatch]] will schedule another dispatch after it receives a response.\r\n // This is needed when all the points requested after the most recent dispatch were included in the currently-in-flight request -\r\n // _pending will be empty but new callers will be awaiting the results of the in-flight request.\r\n protected _redispatchOnCompletion = false;\r\n\r\n public get isIdle(): boolean {\r\n return \"idle\" === this._state;\r\n }\r\n\r\n protected toXYAndZ(input: XYZProps, output: WritableXYAndZ): XYAndZ {\r\n if (Array.isArray(input)) {\r\n output.x = input[0] ?? 0;\r\n output.y = input[1] ?? 0;\r\n output.z = input[2] ?? 0;\r\n } else {\r\n output.x = input.x ?? 0;\r\n output.y = input.y ?? 0;\r\n output.z = input.z ?? 0;\r\n }\r\n\r\n return output;\r\n }\r\n\r\n public constructor(opts: CoordinateConverterOptions) {\r\n this._maxPointsPerRequest = Math.max(1, opts.maxPointsPerRequest ?? 300);\r\n this._isIModelClosed = opts.isIModelClosed;\r\n this._requestPoints = opts.requestPoints;\r\n\r\n this._cache = new Dictionary<XYAndZ, PointWithStatus>(compareXYAndZ, cloneXYAndZ);\r\n this._pending = new SortedArray<XYAndZ>(compareXYAndZ, false, cloneXYAndZ);\r\n this._inflight = new SortedArray<XYAndZ>(compareXYAndZ, false, cloneXYAndZ);\r\n }\r\n\r\n protected async dispatch(): Promise<void> {\r\n assert(this._state === \"scheduled\");\r\n if (this._isIModelClosed() || this._pending.isEmpty) {\r\n this._state = \"idle\";\r\n this._onCompleted.raiseEvent();\r\n return;\r\n }\r\n\r\n this._state = \"in-flight\";\r\n\r\n // Ensure subsequently-enqueued requests listen for the *next* response to be received.\r\n const onCompleted = this._onCompleted;\r\n this._onCompleted = new BeEvent<() => void>();\r\n\r\n // Pending requests are now in flight. Start a new list of pending requests. It's cheaper to swap than to allocate new objects.\r\n const inflight = this._pending;\r\n this._pending = this._inflight;\r\n assert(this._pending.isEmpty);\r\n this._inflight = inflight;\r\n\r\n // Split requests if necessary to avoid requesting more than the maximum allowed number of points.\r\n const promises: Array<Promise<void>> = [];\r\n for (let i = 0; i < inflight.length; i += this._maxPointsPerRequest) {\r\n const requests = inflight.slice(i, i + this._maxPointsPerRequest).extractArray();\r\n const promise = this._requestPoints(requests).then((results) => {\r\n if (this._isIModelClosed())\r\n return;\r\n\r\n if (results.length !== requests.length)\r\n Logger.logError(`${FrontendLoggerCategory.Package}.geoservices`, `requested conversion of ${requests.length} points, but received ${results.length} points`);\r\n\r\n for (let j = 0; j < results.length; j++) {\r\n if (j < requests.length)\r\n this._cache.set(requests[j], results[j]);\r\n }\r\n }).catch((err) => {\r\n Logger.logException(`${FrontendLoggerCategory.Package}.geoservices`, err);\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n await Promise.all(promises);\r\n\r\n assert(this._state === \"in-flight\");\r\n this._state = \"idle\";\r\n this._inflight.clear();\r\n\r\n // If any more pending conversions arrived while awaiting this request, schedule another request.\r\n if (!this._pending.isEmpty || this._redispatchOnCompletion) {\r\n this._redispatchOnCompletion = false;\r\n this.scheduleDispatch(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n\r\n // Resolve promises of all callers who were awaiting this request.\r\n onCompleted.raiseEvent();\r\n }\r\n\r\n // Add any points not present in cache to pending request list.\r\n // Return the number of points present in cache.\r\n protected enqueue(points: XYZProps[]): number {\r\n let numInCache = 0;\r\n for (const point of points) {\r\n const xyz = this.toXYAndZ(point, this._scratchXYZ);\r\n if (this._cache.get(xyz))\r\n ++numInCache;\r\n else if (this._inflight.contains(xyz))\r\n this._redispatchOnCompletion = true;\r\n else\r\n this._pending.insert(xyz);\r\n }\r\n\r\n return numInCache;\r\n }\r\n\r\n // Obtain converted points from the cache. The assumption is that every point in `inputs` is already present in the cache.\r\n // Any point not present will be returned unconverted with an error status.\r\n protected getFromCache(inputs: XYZProps[]): PointWithStatus[] {\r\n const outputs: PointWithStatus[] = [];\r\n for (const input of inputs) {\r\n const xyz = this.toXYAndZ(input, this._scratchXYZ);\r\n let output = this._cache.get(xyz);\r\n if (!output)\r\n output = { p: { ...xyz }, s: GeoCoordStatus.CSMapError };\r\n\r\n outputs.push(output);\r\n }\r\n\r\n return outputs;\r\n }\r\n\r\n protected async scheduleDispatch(): Promise<void> {\r\n if (\"idle\" === this._state) {\r\n this._state = \"scheduled\";\r\n requestAnimationFrame(() => {\r\n this.dispatch(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n });\r\n }\r\n\r\n return new Promise((resolve) => {\r\n this._onCompleted.addOnce(() => resolve());\r\n });\r\n }\r\n\r\n public async convert(inputs: XYZProps[]): Promise<{ points: PointWithStatus[], fromCache: number }> {\r\n const fromCache = this.enqueue(inputs);\r\n assert(fromCache >= 0);\r\n assert(fromCache <= inputs.length);\r\n\r\n if (fromCache === inputs.length)\r\n return { points: this.getFromCache(inputs), fromCache };\r\n\r\n await this.scheduleDispatch();\r\n\r\n return { points: this.getFromCache(inputs), fromCache };\r\n }\r\n\r\n public findCached(inputs: XYZProps[]): CachedIModelCoordinatesResponseProps {\r\n const result: Array<PointWithStatus | undefined> = [];\r\n let missing: XYZProps[] | undefined;\r\n for (const input of inputs) {\r\n const key = this.toXYAndZ(input, this._scratchXYZ);\r\n const output = this._cache.get(key);\r\n result.push(output);\r\n if (!output) {\r\n if (!missing)\r\n missing = [];\r\n\r\n missing.push(input);\r\n }\r\n }\r\n\r\n return { result, missing };\r\n }\r\n}\r\n\r\n/** Response to a request to obtain imodel coordinates from cache.\r\n * @internal\r\n */\r\nexport interface CachedIModelCoordinatesResponseProps {\r\n /** An array of the same length as the input array, with undefined entries at indices corresponding to points not found in cache. */\r\n result: Array<PointWithStatus | undefined>;\r\n /** An array of points in the input array which were not found in the cache, or undefined if all points were found in the cache. */\r\n missing?: XYZProps[];\r\n}\r\n\r\n/** Options used to create a [[GeoConverter]].\r\n * @internal exported strictly for tests.\r\n */\r\nexport interface GeoConverterOptions {\r\n readonly datum: string;\r\n isIModelClosed: () => boolean;\r\n toIModelCoords: (request: IModelCoordinatesRequestProps) => Promise<PointWithStatus[]>;\r\n fromIModelCoords: (request: GeoCoordinatesRequestProps) => Promise<PointWithStatus[]>;\r\n}\r\n\r\n/** An object capable of communicating with the backend to convert between coordinates in a geographic coordinate system and coordinates in an [[IModelConnection]]'s own coordinate system.\r\n * @see [[GeoServices.getConverter]] to obtain a converter.\r\n * @see [GeographicCRS]($common) for more information about geographic coordinate reference systems.\r\n * @public\r\n */\r\nexport class GeoConverter {\r\n private readonly _geoToIModel: CoordinateConverter;\r\n private readonly _iModelToGeo: CoordinateConverter;\r\n /** Used for removing this converter from GeoServices' cache after all requests are completed.\r\n * @internal\r\n */\r\n public readonly onAllRequestsCompleted = new BeEvent<() => void>();\r\n\r\n /** @internal */\r\n constructor(opts: GeoConverterOptions) {\r\n const isIModelClosed = opts.isIModelClosed;\r\n this._geoToIModel = new CoordinateConverter({\r\n isIModelClosed,\r\n requestPoints: async (geoCoords: XYAndZ[]) => opts.toIModelCoords({ source: opts.datum, geoCoords }),\r\n });\r\n\r\n this._iModelToGeo = new CoordinateConverter({\r\n isIModelClosed,\r\n requestPoints: async (iModelCoords: XYAndZ[]) => opts.fromIModelCoords({ target: opts.datum, iModelCoords }),\r\n });\r\n }\r\n\r\n /** Convert the specified geographic coordinates into iModel coordinates. */\r\n public async convertToIModelCoords(geoPoints: XYZProps[]): Promise<PointWithStatus[]> {\r\n const result = await this.getIModelCoordinatesFromGeoCoordinates(geoPoints);\r\n return result.iModelCoords;\r\n }\r\n\r\n /** Convert the specified iModel coordinates into geographic coordinates. */\r\n public async convertFromIModelCoords(iModelCoords: XYZProps[]): Promise<PointWithStatus[]> {\r\n const result = await this.getGeoCoordinatesFromIModelCoordinates(iModelCoords);\r\n return result.geoCoords;\r\n }\r\n\r\n /** @internal */\r\n public async getIModelCoordinatesFromGeoCoordinates(geoPoints: XYZProps[]): Promise<IModelCoordinatesResponseProps> {\r\n const result = await this._geoToIModel.convert(geoPoints);\r\n this.checkCompletion();\r\n return {\r\n iModelCoords: result.points,\r\n fromCache: result.fromCache,\r\n };\r\n }\r\n\r\n /** @internal */\r\n public async getGeoCoordinatesFromIModelCoordinates(iModelPoints: XYZProps[]): Promise<GeoCoordinatesResponseProps> {\r\n const result = await this._iModelToGeo.convert(iModelPoints);\r\n this.checkCompletion();\r\n return {\r\n geoCoords: result.points,\r\n fromCache: result.fromCache,\r\n };\r\n }\r\n\r\n private checkCompletion(): void {\r\n if (this._geoToIModel.isIdle && this._iModelToGeo.isIdle)\r\n this.onAllRequestsCompleted.raiseEvent();\r\n }\r\n\r\n /** @internal */\r\n public getCachedIModelCoordinatesFromGeoCoordinates(geoPoints: XYZProps[]): CachedIModelCoordinatesResponseProps {\r\n return this._geoToIModel.findCached(geoPoints);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport type GeoServicesOptions = Omit<GeoConverterOptions, \"datum\">;\r\n\r\n/** The Geographic Services available for an [[IModelConnection]].\r\n * @see [[IModelConnection.geoServices]] to obtain the GeoServices for a specific iModel.\r\n * @public\r\n */\r\nexport class GeoServices {\r\n private readonly _options: GeoServicesOptions;\r\n /** Each GeoConverter has its own independent request queue and cache of previously-converted points.\r\n * Some callers like RealityTileTree obtain a single GeoConverter and reuse it throughout their own lifetime. Therefore they benefit from both batching and caching, and\r\n * the cache gets deleted once the RealityTileTree becomes disused.\r\n *\r\n * Other callers like IModelConnection.spatialToCartographic obtain a new GeoConverter every time they need one, use it to convert a single point(!), and then discard the converter.\r\n * This entirely prevents batching - e.g., calling spatialToCartographic 20 times in one frame results in 20 http requests.\r\n * To address that, we cache each GeoConverter returned by getConverter until it has converted at least one point and has no further outstanding conversion requests.\r\n * In this way, the converter lives for as long as (and no longer than) any caller is awaiting conversion to/from its datum - it and its cache are deleted once it becomes disused.\r\n * This makes the coordinate caching generally less useful, but at least bounded - and maximizes batching of requests.\r\n */\r\n private readonly _cache = new Map<string, GeoConverter>();\r\n\r\n /** @internal */\r\n public constructor(options: GeoServicesOptions) {\r\n this._options = options;\r\n }\r\n\r\n /** @internal */\r\n public static createForIModel(iModel: IModelConnection): GeoServices {\r\n return new GeoServices({\r\n isIModelClosed: () => iModel.isClosed,\r\n toIModelCoords: async (request) => {\r\n const rpc = IModelReadRpcInterface.getClientForRouting(iModel.routingContext.token);\r\n const response = await rpc.getIModelCoordinatesFromGeoCoordinates(iModel.getRpcProps(), request);\r\n return response.iModelCoords;\r\n },\r\n fromIModelCoords: async (request) => {\r\n const rpc = IModelReadRpcInterface.getClientForRouting(iModel.routingContext.token);\r\n const response = await rpc.getGeoCoordinatesFromIModelCoordinates(iModel.getRpcProps(), request);\r\n return response.geoCoords;\r\n },\r\n });\r\n }\r\n\r\n /** Obtain a converter that can convert between a geographic coordinate system and the iModel's own coordinate system.\r\n * @param datumOrGCRS The name or JSON representation of the geographic coordinate system datum - for example, \"WGS84\".\r\n * @returns a converter, or `undefined` if the iModel is not open.\r\n * @note A [[BlankConnection]] has no connection to a backend, so it is never \"open\"; therefore it always returns `undefined`.\r\n */\r\n public getConverter(datumOrGCRS?: string | GeographicCRSProps): GeoConverter | undefined {\r\n if (this._options.isIModelClosed())\r\n return undefined;\r\n\r\n const datum = (typeof datumOrGCRS === \"object\" ? JSON.stringify(datumOrGCRS) : datumOrGCRS) ?? \"\";\r\n\r\n let converter = this._cache.get(datum);\r\n if (!converter) {\r\n converter = new GeoConverter({ ...this._options, datum });\r\n this._cache.set(datum, converter);\r\n\r\n converter.onAllRequestsCompleted.addOnce(() => {\r\n if (converter === this._cache.get(datum))\r\n this._cache.delete(datum);\r\n });\r\n }\r\n\r\n return converter;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"GeoServices.js","sourceRoot":"","sources":["../../src/GeoServices.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module IModelConnection\r\n */\r\n\r\n// cspell:ignore GCRS\r\nimport {\r\n assert, BeEvent, Dictionary, Logger, SortedArray,\r\n} from \"@itwin/core-bentley\";\r\nimport { WritableXYAndZ, XYAndZ, XYZProps } from \"@itwin/core-geometry\";\r\nimport {\r\n GeoCoordinatesRequestProps, GeoCoordinatesResponseProps, GeoCoordStatus, GeographicCRSProps, IModelCoordinatesRequestProps, IModelCoordinatesResponseProps,\r\n IModelReadRpcInterface, PointWithStatus,\r\n} from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\nimport { FrontendLoggerCategory } from \"./common/FrontendLoggerCategory\";\r\n\r\n/** Options used to create a [[CoordinateConverter]].\r\n * @internal exported strictly for tests.\r\n */\r\nexport interface CoordinateConverterOptions {\r\n isIModelClosed: () => boolean;\r\n /** Asynchronously convert each point. The resultant array should have the same number and order of points as the input. */\r\n requestPoints: (points: XYAndZ[]) => Promise<PointWithStatus[]>;\r\n /** Maximum number of points to include in each request. Default: 300. */\r\n maxPointsPerRequest?: number;\r\n}\r\n\r\nfunction compareXYAndZ(lhs: XYAndZ, rhs: XYAndZ): number {\r\n return lhs.x - rhs.x || lhs.y - rhs.y || lhs.z - rhs.z;\r\n}\r\n\r\nfunction cloneXYAndZ(xyz: XYAndZ): XYAndZ {\r\n return { x: xyz.x, y: xyz.y, z: xyz.z };\r\n}\r\n\r\ntype CoordinateConverterState =\r\n // No pending requests.\r\n \"idle\" |\r\n // We have scheduled a requestAnimationFrame to dispatch all pending requests.\r\n \"scheduled\" |\r\n // We have dispatched all requests that were pending at the most recent requestAnimationFrame callback.\r\n \"in-flight\";\r\n\r\n/** Performs conversion of coordinates from one coordinate system to another.\r\n * A [[GeoConverter]] has a pair of these for converting between iModel coordinates and geographic coordinates.\r\n * Uses a cache to avoid repeatedly requesting the same points, and a batching strategy to avoid making frequent small requests.\r\n * The cache stores every point that was ever converted by [[convert]]. It is currently permitted to grow to unbounded size.\r\n * The batching works as follows:\r\n * When a conversion is requested via [[convert]], if all the requested points are in the cache, they are returned immediately.\r\n * Otherwise, any points not in the cache and not in the current in-flight request (if any) are placed onto the queue of pending requests.\r\n * A pending request is scheduled if one hasn't already been scheduled, via requestAnimationFrame.\r\n * In the animation frame callback, the pending requests are split into batches of no more than options.maxPointsPerRequest and dispatched to the backend.\r\n * Once the response is received, the results are loaded into and returned from the cache.\r\n * If more calls to convert occurred while the request was in flight, another request is dispatched.\r\n * @internal exported strictly for tests.\r\n */\r\nexport class CoordinateConverter {\r\n protected readonly _cache: Dictionary<XYAndZ, PointWithStatus>;\r\n protected _state: CoordinateConverterState = \"idle\";\r\n // The accumulated set of points to be converted by the next request.\r\n protected _pending: SortedArray<XYAndZ>;\r\n // The set of points that were included in the current in-flight request, if any.\r\n protected _inflight: SortedArray<XYAndZ>;\r\n // An event fired when the next request completes.\r\n protected _onCompleted = new BeEvent<() => void>();\r\n // Used for creating cache keys (XYAndZ) from XYZProps without having to allocate temporary objects.\r\n protected readonly _scratchXYZ = { x: 0, y: 0, z: 0 };\r\n protected readonly _maxPointsPerRequest: number;\r\n protected readonly _isIModelClosed: () => boolean;\r\n protected readonly _requestPoints: (points: XYAndZ[]) => Promise<PointWithStatus[]>;\r\n // If true, [[dispatch]] will schedule another dispatch after it receives a response.\r\n // This is needed when all the points requested after the most recent dispatch were included in the currently-in-flight request -\r\n // _pending will be empty but new callers will be awaiting the results of the in-flight request.\r\n protected _redispatchOnCompletion = false;\r\n\r\n public get isIdle(): boolean {\r\n return \"idle\" === this._state;\r\n }\r\n\r\n protected toXYAndZ(input: XYZProps, output: WritableXYAndZ): XYAndZ {\r\n if (Array.isArray(input)) {\r\n output.x = input[0] ?? 0;\r\n output.y = input[1] ?? 0;\r\n output.z = input[2] ?? 0;\r\n } else {\r\n output.x = input.x ?? 0;\r\n output.y = input.y ?? 0;\r\n output.z = input.z ?? 0;\r\n }\r\n\r\n return output;\r\n }\r\n\r\n public constructor(opts: CoordinateConverterOptions) {\r\n this._maxPointsPerRequest = Math.max(1, opts.maxPointsPerRequest ?? 300);\r\n this._isIModelClosed = opts.isIModelClosed;\r\n this._requestPoints = opts.requestPoints;\r\n\r\n this._cache = new Dictionary<XYAndZ, PointWithStatus>(compareXYAndZ, cloneXYAndZ);\r\n this._pending = new SortedArray<XYAndZ>(compareXYAndZ, false, cloneXYAndZ);\r\n this._inflight = new SortedArray<XYAndZ>(compareXYAndZ, false, cloneXYAndZ);\r\n }\r\n\r\n protected async dispatch(): Promise<void> {\r\n assert(this._state === \"scheduled\");\r\n if (this._isIModelClosed() || this._pending.isEmpty) {\r\n this._state = \"idle\";\r\n this._onCompleted.raiseEvent();\r\n return;\r\n }\r\n\r\n this._state = \"in-flight\";\r\n\r\n // Ensure subsequently-enqueued requests listen for the *next* response to be received.\r\n const onCompleted = this._onCompleted;\r\n this._onCompleted = new BeEvent<() => void>();\r\n\r\n // Pending requests are now in flight. Start a new list of pending requests. It's cheaper to swap than to allocate new objects.\r\n const inflight = this._pending;\r\n this._pending = this._inflight;\r\n assert(this._pending.isEmpty);\r\n this._inflight = inflight;\r\n\r\n // Split requests if necessary to avoid requesting more than the maximum allowed number of points.\r\n const promises: Array<Promise<void>> = [];\r\n for (let i = 0; i < inflight.length; i += this._maxPointsPerRequest) {\r\n const requests = inflight.slice(i, i + this._maxPointsPerRequest).extractArray();\r\n const promise = this._requestPoints(requests).then((results) => {\r\n if (this._isIModelClosed())\r\n return;\r\n\r\n if (results.length !== requests.length)\r\n Logger.logError(`${FrontendLoggerCategory.Package}.geoservices`, `requested conversion of ${requests.length} points, but received ${results.length} points`);\r\n\r\n for (let j = 0; j < results.length; j++) {\r\n if (j < requests.length)\r\n this._cache.set(requests[j], results[j]);\r\n }\r\n }).catch((err) => {\r\n Logger.logError(`${FrontendLoggerCategory.Package}.geoservices`, err);\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n await Promise.all(promises);\r\n\r\n assert(this._state === \"in-flight\");\r\n this._state = \"idle\";\r\n this._inflight.clear();\r\n\r\n // If any more pending conversions arrived while awaiting this request, schedule another request.\r\n if (!this._pending.isEmpty || this._redispatchOnCompletion) {\r\n this._redispatchOnCompletion = false;\r\n this.scheduleDispatch(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n\r\n // Resolve promises of all callers who were awaiting this request.\r\n onCompleted.raiseEvent();\r\n }\r\n\r\n // Add any points not present in cache to pending request list.\r\n // Return the number of points present in cache.\r\n protected enqueue(points: XYZProps[]): number {\r\n let numInCache = 0;\r\n for (const point of points) {\r\n const xyz = this.toXYAndZ(point, this._scratchXYZ);\r\n if (this._cache.get(xyz))\r\n ++numInCache;\r\n else if (this._inflight.contains(xyz))\r\n this._redispatchOnCompletion = true;\r\n else\r\n this._pending.insert(xyz);\r\n }\r\n\r\n return numInCache;\r\n }\r\n\r\n // Obtain converted points from the cache. The assumption is that every point in `inputs` is already present in the cache.\r\n // Any point not present will be returned unconverted with an error status.\r\n protected getFromCache(inputs: XYZProps[]): PointWithStatus[] {\r\n const outputs: PointWithStatus[] = [];\r\n for (const input of inputs) {\r\n const xyz = this.toXYAndZ(input, this._scratchXYZ);\r\n let output = this._cache.get(xyz);\r\n if (!output)\r\n output = { p: { ...xyz }, s: GeoCoordStatus.CSMapError };\r\n\r\n outputs.push(output);\r\n }\r\n\r\n return outputs;\r\n }\r\n\r\n protected async scheduleDispatch(): Promise<void> {\r\n if (\"idle\" === this._state) {\r\n this._state = \"scheduled\";\r\n requestAnimationFrame(() => {\r\n this.dispatch(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n });\r\n }\r\n\r\n return new Promise((resolve) => {\r\n this._onCompleted.addOnce(() => resolve());\r\n });\r\n }\r\n\r\n public async convert(inputs: XYZProps[]): Promise<{ points: PointWithStatus[], fromCache: number }> {\r\n const fromCache = this.enqueue(inputs);\r\n assert(fromCache >= 0);\r\n assert(fromCache <= inputs.length);\r\n\r\n if (fromCache === inputs.length)\r\n return { points: this.getFromCache(inputs), fromCache };\r\n\r\n await this.scheduleDispatch();\r\n\r\n return { points: this.getFromCache(inputs), fromCache };\r\n }\r\n\r\n public findCached(inputs: XYZProps[]): CachedIModelCoordinatesResponseProps {\r\n const result: Array<PointWithStatus | undefined> = [];\r\n let missing: XYZProps[] | undefined;\r\n for (const input of inputs) {\r\n const key = this.toXYAndZ(input, this._scratchXYZ);\r\n const output = this._cache.get(key);\r\n result.push(output);\r\n if (!output) {\r\n if (!missing)\r\n missing = [];\r\n\r\n missing.push(input);\r\n }\r\n }\r\n\r\n return { result, missing };\r\n }\r\n}\r\n\r\n/** Response to a request to obtain imodel coordinates from cache.\r\n * @internal\r\n */\r\nexport interface CachedIModelCoordinatesResponseProps {\r\n /** An array of the same length as the input array, with undefined entries at indices corresponding to points not found in cache. */\r\n result: Array<PointWithStatus | undefined>;\r\n /** An array of points in the input array which were not found in the cache, or undefined if all points were found in the cache. */\r\n missing?: XYZProps[];\r\n}\r\n\r\n/** Options used to create a [[GeoConverter]].\r\n * @internal exported strictly for tests.\r\n */\r\nexport interface GeoConverterOptions {\r\n readonly datum: string;\r\n isIModelClosed: () => boolean;\r\n toIModelCoords: (request: IModelCoordinatesRequestProps) => Promise<PointWithStatus[]>;\r\n fromIModelCoords: (request: GeoCoordinatesRequestProps) => Promise<PointWithStatus[]>;\r\n}\r\n\r\n/** An object capable of communicating with the backend to convert between coordinates in a geographic coordinate system and coordinates in an [[IModelConnection]]'s own coordinate system.\r\n * @see [[GeoServices.getConverter]] to obtain a converter.\r\n * @see [GeographicCRS]($common) for more information about geographic coordinate reference systems.\r\n * @public\r\n */\r\nexport class GeoConverter {\r\n private readonly _geoToIModel: CoordinateConverter;\r\n private readonly _iModelToGeo: CoordinateConverter;\r\n /** Used for removing this converter from GeoServices' cache after all requests are completed.\r\n * @internal\r\n */\r\n public readonly onAllRequestsCompleted = new BeEvent<() => void>();\r\n\r\n /** @internal */\r\n constructor(opts: GeoConverterOptions) {\r\n const isIModelClosed = opts.isIModelClosed;\r\n this._geoToIModel = new CoordinateConverter({\r\n isIModelClosed,\r\n requestPoints: async (geoCoords: XYAndZ[]) => opts.toIModelCoords({ source: opts.datum, geoCoords }),\r\n });\r\n\r\n this._iModelToGeo = new CoordinateConverter({\r\n isIModelClosed,\r\n requestPoints: async (iModelCoords: XYAndZ[]) => opts.fromIModelCoords({ target: opts.datum, iModelCoords }),\r\n });\r\n }\r\n\r\n /** Convert the specified geographic coordinates into iModel coordinates. */\r\n public async convertToIModelCoords(geoPoints: XYZProps[]): Promise<PointWithStatus[]> {\r\n const result = await this.getIModelCoordinatesFromGeoCoordinates(geoPoints);\r\n return result.iModelCoords;\r\n }\r\n\r\n /** Convert the specified iModel coordinates into geographic coordinates. */\r\n public async convertFromIModelCoords(iModelCoords: XYZProps[]): Promise<PointWithStatus[]> {\r\n const result = await this.getGeoCoordinatesFromIModelCoordinates(iModelCoords);\r\n return result.geoCoords;\r\n }\r\n\r\n /** @internal */\r\n public async getIModelCoordinatesFromGeoCoordinates(geoPoints: XYZProps[]): Promise<IModelCoordinatesResponseProps> {\r\n const result = await this._geoToIModel.convert(geoPoints);\r\n this.checkCompletion();\r\n return {\r\n iModelCoords: result.points,\r\n fromCache: result.fromCache,\r\n };\r\n }\r\n\r\n /** @internal */\r\n public async getGeoCoordinatesFromIModelCoordinates(iModelPoints: XYZProps[]): Promise<GeoCoordinatesResponseProps> {\r\n const result = await this._iModelToGeo.convert(iModelPoints);\r\n this.checkCompletion();\r\n return {\r\n geoCoords: result.points,\r\n fromCache: result.fromCache,\r\n };\r\n }\r\n\r\n private checkCompletion(): void {\r\n if (this._geoToIModel.isIdle && this._iModelToGeo.isIdle)\r\n this.onAllRequestsCompleted.raiseEvent();\r\n }\r\n\r\n /** @internal */\r\n public getCachedIModelCoordinatesFromGeoCoordinates(geoPoints: XYZProps[]): CachedIModelCoordinatesResponseProps {\r\n return this._geoToIModel.findCached(geoPoints);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport type GeoServicesOptions = Omit<GeoConverterOptions, \"datum\">;\r\n\r\n/** The Geographic Services available for an [[IModelConnection]].\r\n * @see [[IModelConnection.geoServices]] to obtain the GeoServices for a specific iModel.\r\n * @public\r\n */\r\nexport class GeoServices {\r\n private readonly _options: GeoServicesOptions;\r\n /** Each GeoConverter has its own independent request queue and cache of previously-converted points.\r\n * Some callers like RealityTileTree obtain a single GeoConverter and reuse it throughout their own lifetime. Therefore they benefit from both batching and caching, and\r\n * the cache gets deleted once the RealityTileTree becomes disused.\r\n *\r\n * Other callers like IModelConnection.spatialToCartographic obtain a new GeoConverter every time they need one, use it to convert a single point(!), and then discard the converter.\r\n * This entirely prevents batching - e.g., calling spatialToCartographic 20 times in one frame results in 20 http requests.\r\n * To address that, we cache each GeoConverter returned by getConverter until it has converted at least one point and has no further outstanding conversion requests.\r\n * In this way, the converter lives for as long as (and no longer than) any caller is awaiting conversion to/from its datum - it and its cache are deleted once it becomes disused.\r\n * This makes the coordinate caching generally less useful, but at least bounded - and maximizes batching of requests.\r\n */\r\n private readonly _cache = new Map<string, GeoConverter>();\r\n\r\n /** @internal */\r\n public constructor(options: GeoServicesOptions) {\r\n this._options = options;\r\n }\r\n\r\n /** @internal */\r\n public static createForIModel(iModel: IModelConnection): GeoServices {\r\n return new GeoServices({\r\n isIModelClosed: () => iModel.isClosed,\r\n toIModelCoords: async (request) => {\r\n const rpc = IModelReadRpcInterface.getClientForRouting(iModel.routingContext.token);\r\n const response = await rpc.getIModelCoordinatesFromGeoCoordinates(iModel.getRpcProps(), request);\r\n return response.iModelCoords;\r\n },\r\n fromIModelCoords: async (request) => {\r\n const rpc = IModelReadRpcInterface.getClientForRouting(iModel.routingContext.token);\r\n const response = await rpc.getGeoCoordinatesFromIModelCoordinates(iModel.getRpcProps(), request);\r\n return response.geoCoords;\r\n },\r\n });\r\n }\r\n\r\n /** Obtain a converter that can convert between a geographic coordinate system and the iModel's own coordinate system.\r\n * @param datumOrGCRS The name or JSON representation of the geographic coordinate system datum - for example, \"WGS84\".\r\n * @returns a converter, or `undefined` if the iModel is not open.\r\n * @note A [[BlankConnection]] has no connection to a backend, so it is never \"open\"; therefore it always returns `undefined`.\r\n */\r\n public getConverter(datumOrGCRS?: string | GeographicCRSProps): GeoConverter | undefined {\r\n if (this._options.isIModelClosed())\r\n return undefined;\r\n\r\n const datum = (typeof datumOrGCRS === \"object\" ? JSON.stringify(datumOrGCRS) : datumOrGCRS) ?? \"\";\r\n\r\n let converter = this._cache.get(datum);\r\n if (!converter) {\r\n converter = new GeoConverter({ ...this._options, datum });\r\n this._cache.set(datum, converter);\r\n\r\n converter.onAllRequestsCompleted.addOnce(() => {\r\n if (converter === this._cache.get(datum))\r\n this._cache.delete(datum);\r\n });\r\n }\r\n\r\n return converter;\r\n }\r\n}\r\n"]}
@@ -390,8 +390,6 @@ export declare namespace IModelConnection {
390
390
  /** The collection of loaded ModelState objects for an [[IModelConnection]]. */
391
391
  class Models implements Iterable<ModelState> {
392
392
  private _iModel;
393
- private readonly _modelExtentsQuery;
394
- private readonly _modelExistenceQuery;
395
393
  private _loadedExtents;
396
394
  private _geometryChangedListener?;
397
395
  private _loaded;
@@ -1 +1 @@
1
- {"version":3,"file":"IModelConnection.d.ts","sourceRoot":"","sources":["../../src/IModelConnection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IModelConnection.d.ts","sourceRoot":"","sources":["../../src/IModelConnection.ts"],"names":[],"mappings":"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"}
@@ -628,72 +628,7 @@ export class SnapshotConnection extends IModelConnection {
628
628
  /** The collection of loaded ModelState objects for an [[IModelConnection]]. */
629
629
  class Models {
630
630
  _iModel;
631
- _modelExtentsQuery = `
632
- SELECT
633
- Model.Id AS ECInstanceId,
634
- iModel_bbox_union(
635
- iModel_placement_aabb(
636
- iModel_placement(
637
- iModel_point(Origin.X, Origin.Y, 0),
638
- iModel_angles(Rotation, 0, 0),
639
- iModel_bbox(
640
- BBoxLow.X, BBoxLow.Y, -1,
641
- BBoxHigh.X, BBoxHigh.Y, 1
642
- )
643
- )
644
- )
645
- ) AS bbox
646
- FROM bis.GeometricElement2d
647
- WHERE InVirtualSet(:ids64, Model.Id) AND Origin.X IS NOT NULL
648
- GROUP BY Model.Id
649
- UNION
650
- SELECT
651
- ge.Model.Id AS ECInstanceId,
652
- iModel_bbox(
653
- min(i.MinX), min(i.MinY), min(i.MinZ),
654
- max(i.MaxX), max(i.MaxY), max(i.MaxZ)
655
- ) AS bbox
656
- FROM bis.SpatialIndex AS i, bis.GeometricElement3d AS ge, bis.GeometricModel3d AS gm
657
- WHERE InVirtualSet(:ids64, ge.Model.Id) AND ge.ECInstanceId=i.ECInstanceId AND InVirtualSet(:ids64, gm.ECInstanceId) AND (gm.$->isNotSpatiallyLocated?=false OR gm.$->isNotSpatiallyLocated? IS NULL)
658
- GROUP BY ge.Model.Id
659
- UNION
660
- SELECT
661
- ge.Model.Id AS ECInstanceId,
662
- iModel_bbox_union(
663
- iModel_placement_aabb(
664
- iModel_placement(
665
- iModel_point(ge.Origin.X, ge.Origin.Y, ge.Origin.Z),
666
- iModel_angles(ge.Yaw, ge.Pitch, ge.Roll),
667
- iModel_bbox(
668
- ge.BBoxLow.X, ge.BBoxLow.Y, ge.BBoxLow.Z,
669
- ge.BBoxHigh.X, ge.BBoxHigh.Y, ge.BBoxHigh.Z
670
- )
671
- )
672
- )
673
- ) AS bbox
674
- FROM bis.GeometricElement3d AS ge, bis.GeometricModel3d as gm
675
- WHERE InVirtualSet(:ids64, ge.Model.Id) AND ge.Origin.X IS NOT NULL AND InVirtualSet(:ids64, gm.ECInstanceId) AND gm.$->isNotSpatiallyLocated?=true
676
- GROUP BY ge.Model.Id`;
677
- _modelExistenceQuery = `
678
- WITH
679
- GeometricModels AS(
680
- SELECT
681
- ECInstanceId
682
- FROM bis.GeometricModel
683
- WHERE InVirtualSet(: ids64, ECInstanceId)
684
- )
685
- SELECT
686
- ECInstanceId,
687
- true AS isGeometricModel
688
- FROM GeometricModels
689
- UNION ALL
690
- SELECT
691
- ECInstanceId,
692
- false AS isGeometricModel
693
- FROM bis.Model
694
- WHERE InVirtualSet(: ids64, ECInstanceId)
695
- AND ECInstanceId NOT IN(SELECT ECInstanceId FROM GeometricModels)`;
696
- _loadedExtents = [];
631
+ _loadedExtents = new Map();
697
632
  _geometryChangedListener;
698
633
  _loaded = new Map();
699
634
  /** @internal */
@@ -708,7 +643,9 @@ export class SnapshotConnection extends IModelConnection {
708
643
  IModelConnection.onOpen.addListener(() => {
709
644
  if (this._iModel.isBriefcaseConnection()) {
710
645
  this._geometryChangedListener = (changes) => {
711
- this._loadedExtents = this._loadedExtents.filter((extent) => !changes.some((change) => change.id === extent.id));
646
+ changes.forEach((change) => {
647
+ this._loadedExtents.delete(change.id);
648
+ });
712
649
  };
713
650
  this._iModel.txns.onModelGeometryChanged.addListener(this._geometryChangedListener);
714
651
  }
@@ -812,64 +749,132 @@ export class SnapshotConnection extends IModelConnection {
812
749
  return [];
813
750
  if (typeof modelIds === "string")
814
751
  modelIds = [modelIds];
815
- const modelExtents = [];
752
+ const resolvedExtents = new Map();
753
+ const uncachedModelIds = [];
754
+ // Add the cached model ids and the invalid ids
816
755
  for (const modelId of modelIds) {
817
- if (!Id64.isValidId64(modelId)) {
818
- modelExtents.push({ id: modelId, extents: Range3d.createNull(), status: IModelStatus.InvalidId });
756
+ if (this._loadedExtents.has(modelId)) {
757
+ resolvedExtents.set(modelId, this._loadedExtents.get(modelId));
819
758
  }
820
- }
821
- const getUnloadedModelIds = () => modelIds.filter((modelId) => !modelExtents.some((loadedExtent) => loadedExtent.id === modelId));
822
- let remainingModelIds = getUnloadedModelIds();
823
- for (const modelId of remainingModelIds) {
824
- const modelExtent = this._loadedExtents.find((extent) => modelId === extent.id);
825
- if (modelExtent) {
826
- modelExtents.push(modelExtent);
759
+ else if (!Id64.isValidId64(modelId)) {
760
+ resolvedExtents.set(modelId, { id: modelId, extents: Range3d.createNull(), status: IModelStatus.InvalidId });
761
+ }
762
+ else {
763
+ uncachedModelIds.push(modelId);
827
764
  }
828
765
  }
829
- remainingModelIds = getUnloadedModelIds();
830
- if (remainingModelIds.length > 0) {
831
- const params = new QueryBinder();
832
- params.bindIdSet("ids64", remainingModelIds);
833
- const extentsQueryReader = this._iModel.createQueryReader(this._modelExtentsQuery, params, {
766
+ // Run the ECSql to get uncached model extents
767
+ if (uncachedModelIds.length > 0) {
768
+ const modelList = uncachedModelIds.join(",");
769
+ const useSingleModelQuery = uncachedModelIds.length === 1;
770
+ const modelExtentsQuery = `
771
+ SELECT
772
+ Model.Id AS ECInstanceId,
773
+ iModel_bbox_union(
774
+ iModel_placement_aabb(
775
+ iModel_placement(
776
+ iModel_point(Origin.X, Origin.Y, 0),
777
+ iModel_angles(Rotation, 0, 0),
778
+ iModel_bbox(
779
+ BBoxLow.X, BBoxLow.Y, -1,
780
+ BBoxHigh.X, BBoxHigh.Y, 1
781
+ )
782
+ )
783
+ )
784
+ ) AS bbox
785
+ FROM bis.GeometricElement2d
786
+ WHERE Model.Id ${useSingleModelQuery ? `= ${uncachedModelIds[0]}` : `IN (${modelList})`}
787
+ AND Origin.X IS NOT NULL
788
+ GROUP BY Model.Id
789
+
790
+ UNION
791
+
792
+ SELECT
793
+ ge.Model.Id AS ECInstanceId,
794
+ iModel_bbox(
795
+ min(i.MinX), min(i.MinY), min(i.MinZ),
796
+ max(i.MaxX), max(i.MaxY), max(i.MaxZ)
797
+ ) AS bbox
798
+ FROM bis.SpatialIndex AS i
799
+ INNER JOIN bis.GeometricElement3d AS ge
800
+ ON ge.ECInstanceId = i.ECInstanceId
801
+ INNER JOIN bis.GeometricModel3d AS gm
802
+ ON ge.Model.Id = gm.ECInstanceId
803
+ WHERE ge.Model.Id ${useSingleModelQuery ? `= ${uncachedModelIds[0]}` : `IN (${modelList})`}
804
+ AND (gm.$->IsNotSpatiallyLocated? IS NULL OR gm.$->IsNotSpatiallyLocated? IS FALSE)
805
+ GROUP BY ge.Model.Id
806
+
807
+ UNION
808
+
809
+ SELECT
810
+ ge.Model.Id AS ECInstanceId,
811
+ iModel_bbox_union(
812
+ iModel_placement_aabb(
813
+ iModel_placement(
814
+ iModel_point(ge.Origin.X, ge.Origin.Y, ge.Origin.Z),
815
+ iModel_angles(ge.Yaw, ge.Pitch, ge.Roll),
816
+ iModel_bbox(
817
+ ge.BBoxLow.X, ge.BBoxLow.Y, ge.BBoxLow.Z,
818
+ ge.BBoxHigh.X, ge.BBoxHigh.Y, ge.BBoxHigh.Z
819
+ )
820
+ )
821
+ )
822
+ ) AS bbox
823
+ FROM bis.GeometricElement3d ge
824
+ INNER JOIN bis.GeometricModel3d gm
825
+ ON ge.Model.Id = gm.ECInstanceId
826
+ WHERE ge.Model.Id ${useSingleModelQuery ? `= ${uncachedModelIds[0]}` : `IN (${modelList})`}
827
+ AND gm.$->IsNotSpatiallyLocated? IS TRUE
828
+ AND ge.Origin.X IS NOT NULL
829
+ GROUP BY ge.Model.Id
830
+ `;
831
+ const extentsQueryReader = this._iModel.createQueryReader(modelExtentsQuery, undefined, {
834
832
  rowFormat: QueryRowFormat.UseECSqlPropertyNames,
835
833
  });
836
834
  for await (const row of extentsQueryReader) {
837
835
  const byteArray = new Uint8Array(Object.values(row.bbox));
838
836
  const extents = Range3d.fromArrayBuffer(byteArray.buffer);
839
837
  const extent = { id: row.ECInstanceId, extents, status: IModelStatus.Success };
840
- modelExtents.push(extent);
841
- this._loadedExtents.push(extent);
838
+ resolvedExtents.set(extent.id, extent);
839
+ this._loadedExtents.set(extent.id, extent);
842
840
  }
843
841
  }
844
- remainingModelIds = getUnloadedModelIds();
845
- if (remainingModelIds.length > 0) {
846
- const params = new QueryBinder();
847
- params.bindIdSet("ids64", remainingModelIds);
848
- const modelExistenceQueryReader = this._iModel.createQueryReader(this._modelExistenceQuery, params, {
842
+ // Check if there still are any unresolved model IDs
843
+ const unresolvedModelIds = uncachedModelIds.filter((id) => !resolvedExtents.has(id));
844
+ if (unresolvedModelIds.length > 0) {
845
+ const modelList = unresolvedModelIds.join(",");
846
+ const modelExistenceQuery = `
847
+ SELECT
848
+ m.ECInstanceId,
849
+ CASE WHEN g.ECInstanceId IS NOT NULL THEN 1 ELSE 0 END AS isGeometricModel
850
+ FROM bis.Model m
851
+ LEFT JOIN bis.GeometricModel g
852
+ ON m.ECInstanceId = g.ECInstanceId
853
+ WHERE m.ECInstanceId ${unresolvedModelIds.length === 1 ? `= ${unresolvedModelIds[0]}` : `IN (${modelList})`}
854
+ `;
855
+ const modelExistenceQueryReader = this._iModel.createQueryReader(modelExistenceQuery, undefined, {
849
856
  rowFormat: QueryRowFormat.UseECSqlPropertyNames,
850
857
  });
851
858
  for await (const row of modelExistenceQueryReader) {
852
- let extent;
853
- if (row.isGeometricModel) {
854
- extent = { id: row.ECInstanceId, extents: Range3d.createNull(), status: IModelStatus.Success };
855
- }
856
- else {
857
- extent = { id: row.ECInstanceId, extents: Range3d.createNull(), status: IModelStatus.WrongModel };
858
- }
859
- modelExtents.push(extent);
860
- this._loadedExtents.push(extent);
859
+ const extent = {
860
+ id: row.ECInstanceId,
861
+ extents: Range3d.createNull(),
862
+ status: row.isGeometricModel ? IModelStatus.Success : IModelStatus.WrongModel,
863
+ };
864
+ resolvedExtents.set(extent.id, extent);
865
+ this._loadedExtents.set(extent.id, extent);
861
866
  }
862
867
  }
868
+ // Return the results while maintaining the same order
863
869
  return modelIds.map((modelId) => {
864
- let extent = modelExtents.find((loadedExtent) => loadedExtent.id === modelId);
870
+ const extent = resolvedExtents.get(modelId);
865
871
  if (extent === undefined) {
866
- extent = { id: modelId, extents: Range3d.createNull(), status: IModelStatus.NotFound };
867
- this._loadedExtents.push(extent);
868
- return extent;
872
+ const notFound = { id: modelId, extents: Range3d.createNull(), status: IModelStatus.NotFound };
873
+ this._loadedExtents.set(notFound.id, notFound);
874
+ return notFound;
869
875
  }
870
- else if (extent.status === IModelStatus.InvalidId) {
871
- extent.id = "0";
872
- return extent;
876
+ if (extent.status === IModelStatus.InvalidId) {
877
+ return { ...extent, id: "0" };
873
878
  }
874
879
  return extent;
875
880
  });