@itwin/map-layers-formats 5.0.0-dev.40 → 5.0.0-dev.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,16 @@
1
1
  # Change Log - @itwin/map-layers-formats
2
2
 
3
- This log was last generated on Mon, 13 Jan 2025 14:09:29 GMT and should not be manually modified.
3
+ This log was last generated on Fri, 24 Jan 2025 08:05:17 GMT and should not be manually modified.
4
+
5
+ ## 4.10.6
6
+ Fri, 24 Jan 2025 08:02:40 GMT
7
+
8
+ _Version update only_
9
+
10
+ ## 4.10.5
11
+ Tue, 21 Jan 2025 21:56:45 GMT
12
+
13
+ _Version update only_
4
14
 
5
15
  ## 4.10.4
6
16
  Mon, 13 Jan 2025 14:06:43 GMT
@@ -8,7 +8,7 @@ export declare class GeometryTerrainDraper implements TileUser {
8
8
  readonly maxDistanceZ = 100000;
9
9
  readonly tileUserId: number;
10
10
  constructor(viewport: Viewport, treeRef: GeometryTileTreeReference);
11
- dispose(): void;
11
+ [Symbol.dispose](): void;
12
12
  get iModel(): import("@itwin/core-frontend").IModelConnection;
13
13
  onRequestStateChanged(): void;
14
14
  discloseTileTrees(trees: DisclosedTileTreeSet): void;
@@ -1 +1 @@
1
- {"version":3,"file":"GeometryTerrainDraper.d.ts","sourceRoot":"","sources":["../../../src/Tools/GeometryTerrainDraper.ts"],"names":[],"mappings":"AAIA,OAAO,EACc,oBAAoB,EACvC,yBAAyB,EACI,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,KAAK,EAAsB,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,4BAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAA2C,OAAO,EAA8D,MAAM,sBAAsB,CAAC;AA6CzR,gBAAgB;AAChB,qBAAa,qBAAsB,YAAW,QAAQ;aASjB,QAAQ,EAAE,QAAQ;aAAkB,OAAO,EAAE,yBAAyB;IALzG,SAAgB,SAAS,QAA6B;IAEtD,SAAgB,YAAY,UAAS;IACrC,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEA,QAAQ,EAAE,QAAQ,EAAkB,OAAO,EAAE,yBAAyB;IAKlG,OAAO,IAAI,IAAI;IAItB,IAAW,MAAM,oDAAmC;IAE7C,qBAAqB;IAIrB,iBAAiB,CAAC,KAAK,EAAE,oBAAoB;IAM7C,gBAAgB,CAAC,IAAI,EAAE,eAAe;IAqBtC,eAAe,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU;IA8BpI,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU;IA4BvG,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU;CAyBrH"}
1
+ {"version":3,"file":"GeometryTerrainDraper.d.ts","sourceRoot":"","sources":["../../../src/Tools/GeometryTerrainDraper.ts"],"names":[],"mappings":"AAIA,OAAO,EACc,oBAAoB,EACvC,yBAAyB,EACI,QAAQ,EAAE,QAAQ,EAChD,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAsB,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,4BAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAA2C,OAAO,EAA8D,MAAM,sBAAsB,CAAC;AA6CzR,gBAAgB;AAChB,qBAAa,qBAAsB,YAAW,QAAQ;aASjB,QAAQ,EAAE,QAAQ;aAAkB,OAAO,EAAE,yBAAyB;IALzG,SAAgB,SAAS,QAA6B;IAEtD,SAAgB,YAAY,UAAS;IACrC,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEA,QAAQ,EAAE,QAAQ,EAAkB,OAAO,EAAE,yBAAyB;IAKlG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAI/B,IAAW,MAAM,oDAAmC;IAE7C,qBAAqB;IAIrB,iBAAiB,CAAC,KAAK,EAAE,oBAAoB;IAM7C,gBAAgB,CAAC,IAAI,EAAE,eAAe;IAqBtC,eAAe,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU;IA8BpI,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU;IA4BvG,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU;CAyBrH"}
@@ -52,7 +52,7 @@ class GeometryTerrainDraper {
52
52
  this.tileUserId = core_frontend_1.TileUser.generateId();
53
53
  core_frontend_1.IModelApp.tileAdmin.registerUser(this);
54
54
  }
55
- dispose() {
55
+ [Symbol.dispose]() {
56
56
  core_frontend_1.IModelApp.tileAdmin.forgetUser(this);
57
57
  }
58
58
  get iModel() { return this.viewport.iModel; }
@@ -1 +1 @@
1
- {"version":3,"file":"GeometryTerrainDraper.js","sourceRoot":"","sources":["../../../src/Tools/GeometryTerrainDraper.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*--------------------------------------------------------------------------------------------*/\nimport {\n CollectTileStatus, DisclosedTileTreeSet,\n GeometryTileTreeReference, IModelApp,\n Tile, TileGeometryCollector, TileUser, Viewport } from \"@itwin/core-frontend\";\nimport { Angle, ConvexClipPlaneSet, CurvePrimitive, GrowableXYZArray, IndexedPolyface, IndexedPolyfaceSubsetVisitor, Loop, Point3d, Polyface, PolyfaceClip, PolyfaceQuery, PolygonOps, Range3d, Ray3d, SweepLineStringToFacetsOptions, Transform, Vector3d } from \"@itwin/core-geometry\";\nimport { Logger } from \"@itwin/core-bentley\";\n\nconst loggerCategory = \"MapLayersFormats.GeometryTerrainDraper\";\n\n/** A TileGeometryCollector that restricts collection to tiles that overlap a line string.\n/* @internal\n*/\nclass LineSegmentCollector extends TileGeometryCollector {\n private _points: GrowableXYZArray;\n\n constructor(user: TileUser, chordTolerance: number, range: Range3d, transform: Transform, points: GrowableXYZArray) {\n super({ user, chordTolerance, range, transform });\n this._points = points;\n }\n\n public override addMissingTile(tile: Tile): void {\n Logger.logTrace(loggerCategory, `CollectorAdd missing tile: ${tile.contentId}`);\n super.addMissingTile(tile);\n }\n\n public override collectTile(tile: Tile): CollectTileStatus {\n let status = super.collectTile(tile);\n\n if (\"reject\" !== status && !this.rangeOverlapsLineString(tile.range)) {\n status = \"reject\";\n }\n\n Logger.logTrace(loggerCategory, `collectTile - tile: ${tile.contentId} status: ${status } isReady: ${tile.isReady} status:${tile.loadStatus}`);\n return status;\n }\n\n private rangeOverlapsLineString(range: Range3d) {\n let inside = false;\n const clipper = ConvexClipPlaneSet.createRange3dPlanes(range, true, true, true, true, false, false);\n if (this._options.transform)\n clipper.transformInPlace(this._options.transform);\n\n for (let i = 0; i < this._points.length - 1 && !inside; i++)\n inside = clipper.announceClippedSegmentIntervals(0, 1, this._points.getPoint3dAtUncheckedPointIndex(i), this._points.getPoint3dAtUncheckedPointIndex(i + 1));\n\n return inside;\n }\n}\n\n/** @internal */\nexport class GeometryTerrainDraper implements TileUser {\n // The side angle measures how close the sweep vector is from being parallel to a side face.\n // The larger the angle, the more nearly vertical facets are ignored.\n // This is an \"empirical\" value that was determined by looking at \"problematic\" polyfaces\n public readonly sideAngle = Angle.createDegrees(0.06);\n\n public readonly maxDistanceZ = 1.0E5; // Expand the Z Range, but not so much that we get opposite side of globe.\n public readonly tileUserId: number;\n\n public constructor(public readonly viewport: Viewport, public readonly treeRef: GeometryTileTreeReference) {\n this.tileUserId = TileUser.generateId();\n IModelApp.tileAdmin.registerUser(this);\n }\n\n public dispose(): void {\n IModelApp.tileAdmin.forgetUser(this);\n }\n\n public get iModel() { return this.viewport.iModel; }\n\n public onRequestStateChanged() {\n this.viewport.invalidateDecorations();\n }\n\n public discloseTileTrees(trees: DisclosedTileTreeSet) {\n trees.disclose(this.treeRef);\n }\n\n // Filter out non-top facets:\n // For unknown reasons, there are \"perpendicular\" facets appearing in the terrain meshes.\n public getMeshTopFacets(mesh: IndexedPolyface) {\n // constant inputs\n const sweepVector = Vector3d.unitZ();\n // i.e., region is horizontal\n // create subset visitor from the top facets\n const topFacets: number[] = [];\n const facetNormal = Vector3d.createZero();\n\n for (const visitor = mesh.createVisitor(0); visitor.moveToNextFacet(); ) {\n if (PolygonOps.unitNormal(visitor.point, facetNormal)) {\n const theta = facetNormal.angleFromPerpendicular(sweepVector);\n if (!theta.isMagnitudeLessThanOrEqual(this.sideAngle)) { // skip side facet\n if (facetNormal.dotProduct(sweepVector) > 0) // this is a top facet\n topFacets.push(visitor.currentReadIndex());\n }\n }\n }\n\n return IndexedPolyfaceSubsetVisitor.createSubsetVisitor(mesh, topFacets, 0);\n }\n\n public drapeLineString(outStrings: CurvePrimitive[], inPoints: GrowableXYZArray, tolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const collector = new LineSegmentCollector(this, tolerance, expandedRange, tree.iModelTransform, inPoints);\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n\n for (const polyface of collector.polyfaces) {\n // Use this to serialize (problematic) polyface\n // console.log (`const polyface = ${JSON.stringify(IModelJson.Writer.toIModelJson(polyface))}`);\n outStrings.push(...PolyfaceQuery.sweepLineStringToFacets(\n inPoints,\n polyface,\n SweepLineStringToFacetsOptions.create(Vector3d.unitZ(), this.sideAngle, true, true, false, false)));\n }\n\n return \"complete\";\n }\n\n return \"loading\";\n }\n\n public drapeLoop(outMeshes: Polyface[], loop: Loop, tolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const strokes = loop.getPackedStrokes();\n if (!strokes)\n return \"complete\";\n\n const collector = new LineSegmentCollector(this, tolerance, expandedRange, tree.iModelTransform, strokes);\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n for (const polyface of collector.polyfaces) {\n const topFacets = this.getMeshTopFacets(polyface);\n const mesh = PolyfaceClip.drapeRegion(topFacets, loop);\n if (mesh)\n outMeshes.push(mesh);\n }\n return \"complete\";\n }\n return \"loading\";\n }\n public drapePoint(outPoint: Point3d, point: Point3d, chordTolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const collector = new TileGeometryCollector({chordTolerance, range: expandedRange, user: this });\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n for (const polyface of collector.polyfaces) {\n // Im assuming a single polyface here since we are draping a single point\n const facetLocation = PolyfaceQuery.intersectRay3d(polyface, Ray3d.create(point, Vector3d.unitZ() ));\n if (!facetLocation)\n continue;\n outPoint.setFromPoint3d(facetLocation.point);\n }\n return \"complete\";\n }\n return \"loading\";\n }\n}\n"]}
1
+ {"version":3,"file":"GeometryTerrainDraper.js","sourceRoot":"","sources":["../../../src/Tools/GeometryTerrainDraper.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*--------------------------------------------------------------------------------------------*/\nimport {\n CollectTileStatus, DisclosedTileTreeSet,\n GeometryTileTreeReference, IModelApp,\n Tile, TileGeometryCollector, TileUser, Viewport\n} from \"@itwin/core-frontend\";\nimport { Angle, ConvexClipPlaneSet, CurvePrimitive, GrowableXYZArray, IndexedPolyface, IndexedPolyfaceSubsetVisitor, Loop, Point3d, Polyface, PolyfaceClip, PolyfaceQuery, PolygonOps, Range3d, Ray3d, SweepLineStringToFacetsOptions, Transform, Vector3d } from \"@itwin/core-geometry\";\nimport { Logger } from \"@itwin/core-bentley\";\n\nconst loggerCategory = \"MapLayersFormats.GeometryTerrainDraper\";\n\n/** A TileGeometryCollector that restricts collection to tiles that overlap a line string.\n/* @internal\n*/\nclass LineSegmentCollector extends TileGeometryCollector {\n private _points: GrowableXYZArray;\n\n constructor(user: TileUser, chordTolerance: number, range: Range3d, transform: Transform, points: GrowableXYZArray) {\n super({ user, chordTolerance, range, transform });\n this._points = points;\n }\n\n public override addMissingTile(tile: Tile): void {\n Logger.logTrace(loggerCategory, `CollectorAdd missing tile: ${tile.contentId}`);\n super.addMissingTile(tile);\n }\n\n public override collectTile(tile: Tile): CollectTileStatus {\n let status = super.collectTile(tile);\n\n if (\"reject\" !== status && !this.rangeOverlapsLineString(tile.range)) {\n status = \"reject\";\n }\n\n Logger.logTrace(loggerCategory, `collectTile - tile: ${tile.contentId} status: ${status} isReady: ${tile.isReady} status:${tile.loadStatus}`);\n return status;\n }\n\n private rangeOverlapsLineString(range: Range3d) {\n let inside = false;\n const clipper = ConvexClipPlaneSet.createRange3dPlanes(range, true, true, true, true, false, false);\n if (this._options.transform)\n clipper.transformInPlace(this._options.transform);\n\n for (let i = 0; i < this._points.length - 1 && !inside; i++)\n inside = clipper.announceClippedSegmentIntervals(0, 1, this._points.getPoint3dAtUncheckedPointIndex(i), this._points.getPoint3dAtUncheckedPointIndex(i + 1));\n\n return inside;\n }\n}\n\n/** @internal */\nexport class GeometryTerrainDraper implements TileUser {\n // The side angle measures how close the sweep vector is from being parallel to a side face.\n // The larger the angle, the more nearly vertical facets are ignored.\n // This is an \"empirical\" value that was determined by looking at \"problematic\" polyfaces\n public readonly sideAngle = Angle.createDegrees(0.06);\n\n public readonly maxDistanceZ = 1.0E5; // Expand the Z Range, but not so much that we get opposite side of globe.\n public readonly tileUserId: number;\n\n public constructor(public readonly viewport: Viewport, public readonly treeRef: GeometryTileTreeReference) {\n this.tileUserId = TileUser.generateId();\n IModelApp.tileAdmin.registerUser(this);\n }\n\n public [Symbol.dispose](): void {\n IModelApp.tileAdmin.forgetUser(this);\n }\n\n public get iModel() { return this.viewport.iModel; }\n\n public onRequestStateChanged() {\n this.viewport.invalidateDecorations();\n }\n\n public discloseTileTrees(trees: DisclosedTileTreeSet) {\n trees.disclose(this.treeRef);\n }\n\n // Filter out non-top facets:\n // For unknown reasons, there are \"perpendicular\" facets appearing in the terrain meshes.\n public getMeshTopFacets(mesh: IndexedPolyface) {\n // constant inputs\n const sweepVector = Vector3d.unitZ();\n // i.e., region is horizontal\n // create subset visitor from the top facets\n const topFacets: number[] = [];\n const facetNormal = Vector3d.createZero();\n\n for (const visitor = mesh.createVisitor(0); visitor.moveToNextFacet();) {\n if (PolygonOps.unitNormal(visitor.point, facetNormal)) {\n const theta = facetNormal.angleFromPerpendicular(sweepVector);\n if (!theta.isMagnitudeLessThanOrEqual(this.sideAngle)) { // skip side facet\n if (facetNormal.dotProduct(sweepVector) > 0) // this is a top facet\n topFacets.push(visitor.currentReadIndex());\n }\n }\n }\n\n return IndexedPolyfaceSubsetVisitor.createSubsetVisitor(mesh, topFacets, 0);\n }\n\n public drapeLineString(outStrings: CurvePrimitive[], inPoints: GrowableXYZArray, tolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const collector = new LineSegmentCollector(this, tolerance, expandedRange, tree.iModelTransform, inPoints);\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n\n for (const polyface of collector.polyfaces) {\n // Use this to serialize (problematic) polyface\n // console.log (`const polyface = ${JSON.stringify(IModelJson.Writer.toIModelJson(polyface))}`);\n outStrings.push(...PolyfaceQuery.sweepLineStringToFacets(\n inPoints,\n polyface,\n SweepLineStringToFacetsOptions.create(Vector3d.unitZ(), this.sideAngle, true, true, false, false)));\n }\n\n return \"complete\";\n }\n\n return \"loading\";\n }\n\n public drapeLoop(outMeshes: Polyface[], loop: Loop, tolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const strokes = loop.getPackedStrokes();\n if (!strokes)\n return \"complete\";\n\n const collector = new LineSegmentCollector(this, tolerance, expandedRange, tree.iModelTransform, strokes);\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n for (const polyface of collector.polyfaces) {\n const topFacets = this.getMeshTopFacets(polyface);\n const mesh = PolyfaceClip.drapeRegion(topFacets, loop);\n if (mesh)\n outMeshes.push(mesh);\n }\n return \"complete\";\n }\n return \"loading\";\n }\n public drapePoint(outPoint: Point3d, point: Point3d, chordTolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const collector = new TileGeometryCollector({ chordTolerance, range: expandedRange, user: this });\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n for (const polyface of collector.polyfaces) {\n // Im assuming a single polyface here since we are draping a single point\n const facetLocation = PolyfaceQuery.intersectRay3d(polyface, Ray3d.create(point, Vector3d.unitZ()));\n if (!facetLocation)\n continue;\n outPoint.setFromPoint3d(facetLocation.point);\n }\n return \"complete\";\n }\n return \"loading\";\n }\n}\n"]}
@@ -130,7 +130,7 @@ class MapFeatureInfoDecorator {
130
130
  }
131
131
  if (this._draper) {
132
132
  // Dispose draper every time?
133
- this._draper.dispose();
133
+ this._draper[Symbol.dispose]();
134
134
  this._draper = undefined;
135
135
  }
136
136
  };
@@ -1 +1 @@
1
- {"version":3,"file":"MapFeatureInfoDecorator.js","sourceRoot":"","sources":["../../../src/Tools/MapFeatureInfoDecorator.ts"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAC/F,oDAAmE;AACnE,wDAI4D;AAC5D,wDAAqI;AAErI,mEAAgE;AAChE,sDAA6C;AAC7C,MAAM,cAAc,GAAG,0CAA0C,CAAC;AAElE,gBAAgB;AAChB,MAAM,SAAU,SAAQ,sBAAM;IAC5B,YAAmB,aAAqB,EAAE,IAAW,EAAE,KAAkB;QACvE,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,uBAAO,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,gBAAgB;AAChB,MAAM,gBAAiB,SAAQ,sBAAM;IACnC,kCAAkC;IAClC,YAAY,QAAgB,EAAE,IAAW,EAAE,OAA2B,EAAE,KAAqD;QAC3H,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEtB,IAAI,CAAC,KAAK,GAAG,yBAAS,CAAC,YAAY,CAAC,kBAAkB,CAAC,iEAAiE,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAC,CAAC,CAAC;QAElK,IAAI,CAAC,WAAW,GAAG,IAAI,uBAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,sBAAsB,CAAC;QAExC,IAAI,KAAK;YACP,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,yDAAyD;IACzC,QAAQ,CAAC,GAA6B;QACpD,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC;QAC5B,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC;QACxB,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACjD,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;IAEe,aAAa,CAAC,GAAkB,IAAa,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,kDAAkD;CAC/H;AAED,gBAAgB;AAChB,MAAM,YAAa,SAAQ,yBAAoB;IACnC,gBAAgB,CAAC,OAA2B;QACpD,oEAAoE;QACpE,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACzG,CAAC;CACF;AASD,MAAM,gBAAgB;IAAtB;QAGU,YAAO,GAAG,IAAI,gCAAgB,EAAE,CAAC;IAiC3C,CAAC;IA/BC,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAEM,UAAU,CAAC,aAA6B;QAC7C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACrB,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,aAAa;YAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAEM,SAAS,CAAC,YAAwB;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO;YACf,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACpB,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;CACF;AAED,gBAAgB;AAChB,MAAa,uBAAuB;IAgBlC,IAAW,cAAc,KAAK,OAAO,IAAI,CAAC,eAAe,CAAC,CAAA,CAAC;IAC3D,IAAW,cAAc,CAAC,KAAe;QACvC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,IAAW,uBAAuB,KAAK,OAAO,6pBAA6pB,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IAkB1vB;QAvCO,WAAM,GAAG,KAAK,CAAC;QACN,yBAAoB,GAAG,IAAI,CAAC;QAC5B,yBAAoB,GAAG,KAAK,CAAC;QACtC,eAAU,GAAG,IAAI,uBAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,cAAS,GAAI,CAAC,CAAC;QAEtB,2EAA2E;QAC3E,+GAA+G;QACxG,uBAAkB,GAAG,KAAK,CAAC;QAElC,wEAAwE;QACxE,8EAA8E;QACvE,yBAAoB,GAAG,EAAE,CAAC;QAEzB,oBAAe,GAAG,sBAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QASlD,mBAAc,GAAG,IAAI,gCAAgB,EAAE,CAAC;QAExC,yBAAoB,GAAwB,EAAE,CAAC;QAC/C,sBAAiB,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC3C,mBAAc,GAAG,KAAK,CAAC;QAGvB,eAAU,GAAG,IAAI,YAAY,EAAE,CAAC;QAOvB,iBAAY,GAAG,2BAAW,CAAC,YAAY,CAAC;QAoClD,cAAS,GAAG,GAAG,EAAE;YACtB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACzB,CAAC,CAAC;QAEK,YAAO,GAAG,CAAC,IAA4B,EAAE,EAAE;YAEhD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAEpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,yBAAS,CAAC,WAAW,CAAC,mCAAmC,CAAC,IAAI,CAAC,CAAC;YAEhE,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;YAE/B,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;gBAElH,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;oBACtB,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAChE,IAAI,YAAY,EAAE,CAAC;wBACjB,IAAI,CAAC,OAAO,GAAG,IAAI,6CAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;wBAC1E,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,6BAA6B;gBAC7B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;QAhEA,IAAI,CAAC,YAAY,GAAG,IAAI,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEO,iBAAiB;QACvB,MAAM,MAAM,GAAG,iCAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,6BAA6B,MAAM,EAAE,CAAC;IAChE,CAAC;IAEO,gBAAgB,CAAC,QAAkB,EAAE,oBAA6B,EAAE,UAAmB;QAC7F,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,uGAAuG;QACvG,SAAS,GAAG,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACrD,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAE7D,kIAAkI;QAClI,MAAM,IAAI,GAAG,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,IAAI,GAAG,CAAC;YACV,SAAS,IAAI,IAAI,CAAC;QACpB,OAAO,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAEO,qBAAqB,CAAC,QAAkB,EAAE,UAAmB;QACnE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,EAAG,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3E,MAAM,sBAAsB,GAAG,IAAI,CAAC,kBAAkB,GAAI,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;QACvF,IAAI,sBAAsB,GAAG,CAAC,EAAE,CAAC;YAC/B,qBAAM,CAAC,UAAU,CAAC,cAAc,EAAE,iDAAiD,CAAC,CAAC;YACrF,OAAO,CAAC,SAAS,GAAG,sBAAsB,CAAC,GAAC,IAAI,CAAC,oBAAoB,CAAC;QACxE,CAAC;QACD,OAAO,SAAS,GAAC,IAAI,CAAC,oBAAoB,CAAC;IAC7C,CAAC;IAAA,CAAC;IAmCM,kBAAkB,CAAC,EAAY;QACrC,IAAI,OAA8C,CAAC;QACnD,IAAI,EAAE,CAAC,qBAAqB,CAAC,YAAY,EAAE,CAAC;YAC1C,EAAE,CAAC,iBAAiB,CAAC,CAAC,GAAsB,EAAE,EAAE;gBAC9C,IAAI,CAAC,OAAO,IAAI,GAAG,YAAY,oCAAoB,EAAE,CAAC;oBACpD,OAAO,GAAG,GAAG,CAAC,2BAA2B,EAAE,CAAC;gBAC9C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAES,cAAc,CAAC,OAAwB;QAC/C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhC,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,SAA8B,CAAC;QACnC,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,qBAAqB,CAAC,UAAU,CAAC;QAClF,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,SAAS,GAAG,yBAAS,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAG,UAAU,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAE3E,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAE5C,gFAAgF;YAChF,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACzC,OAAO,SAAS,CAAC;YACrB,CAAC;YAED,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,2DAA2D;YAC3D,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAED,qCAAqC;QACrC,IAAK,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAC,EAAE;gBACvC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/E,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAC9F,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,6EAA6E;IACrE,oBAAoB,CAAC,QAAwB;QACnD,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,eAAe,GAAG,CAAC,OAAyB,EAAE,EAAE;gBACpD,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY;oBAC/B,OAAO,uBAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;qBACxC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;oBAC9B,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;qBACzB,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa;oBACrC,OAAO,uBAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;;oBAE3C,OAAO,uBAAO,CAAC,UAAU,EAAE,CAAC;YAChC,CAAC,CAAC;YAEF,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,IAAE,EAAE,EAAE,CAAC;gBAC5D,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE,aAAa,IAAE,EAAE,EAAE,CAAC;oBACxD,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;wBAE5C,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAC,EAAE;4BACnC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;4BAC5C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;gCAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;gCACrB,cAAc,EAAE,SAAS;gCACzB,cAAc,EAAE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC;gCAC3D,KAAK;6BACN,CAAC,CAAC;wBACL,CAAC,CAAE,CAAC,CAAC;oBACP,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,qEAAqE;IAC7D,eAAe,CAAC,SAAyB;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO;YACf,OAAO,KAAK,CAAC;QAEf,IAAI,oBAAoB,GAAG,KAAK,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9C,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;gBACvC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;gBAE5B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACxC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAClD,MAAM,aAAa,GAAmB,EAAE,CAAC;oBACzC,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;wBACtH,oBAAoB,GAAG,IAAI,CAAC;wBAC5B,MAAM;oBACR,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;wBACjD,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC;oBACpC,CAAC;gBACH,CAAC;qBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACzC,MAAM,IAAI,GAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBACjC,MAAM,SAAS,GAAe,EAAE,CAAC;oBACjC,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC7F,oBAAoB,GAAG,IAAI,CAAC;wBAC5B,MAAM,CAAC,0EAA0E;oBACnF,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;wBAC5C,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC;oBACpC,CAAC;gBACH,CAAC;qBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBAChD,MAAM,QAAQ,GAAG,uBAAO,CAAC,UAAU,EAAE,CAAC;oBACtC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;wBACzC,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC9F,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;4BAC5B,OAAO,KAAK,CAAC;wBACf,CAAC;6BAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;4BAC5B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC/C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,CAAC,oBAAoB,CAAC;QAC5C,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEO,sBAAsB,CAAC,OAAuB;QACpD,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/E,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACvF,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/E,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YACnJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,OAAuB;QAC9C,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU;YAClC,OAAO;QAET,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/E,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACtD,IAAI,SAAS,CAAC,aAAa,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,YAAY,WAAW,CAAC,EAAE,CAAC;gBACjF,KAAK,MAAM,YAAY,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;oBACnD,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;wBAC5C,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;4BACvB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gCACtC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oCACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;wCACrC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;gCAC1F,CAAC;qCAAM,CAAC;oCACN,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gCACrC,CAAC;4BAEH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YAEH,CAAC;QAEH,CAAC;IACH,CAAC;IAEM,QAAQ,CAAC,OAAwB;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YACnD,yBAAS,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;CACF;AAzSD,0DAySC","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*--------------------------------------------------------------------------------------------*/\nimport { Base64EncodedString, ColorDef } from \"@itwin/core-common\";\nimport {\n BeButtonEvent, Cluster, DecorateContext, Decorator,\n GeometryTileTreeReference, GraphicBuilder, GraphicPrimitive, GraphicType, IModelApp, MapTileTreeReference, Marker, MarkerImage, MarkerSet,\n ScreenViewport,\n TileTreeReference, Viewport } from \"@itwin/core-frontend\";\nimport { GrowableXYZArray, LineString3d, Point2d, Point3d, Polyface, Range3d, Transform, XAndY, XYAndZ } from \"@itwin/core-geometry\";\nimport { MapFeatureInfoToolData } from \"./MapFeatureInfoTool\";\nimport { GeometryTerrainDraper } from \"./GeometryTerrainDraper\";\nimport { Logger } from \"@itwin/core-bentley\";\nconst loggerCategory = \"MapLayersFormats.MapFeatureInfoDecorator\";\n\n/** @internal */\nclass PinMarker extends Marker {\n public constructor(worldLocation: XYAndZ, size: XAndY, image: MarkerImage) {\n super(worldLocation, size);\n this.image = image;\n this.imageOffset = new Point3d(0, Math.floor(size.y * .5));\n }\n}\n\n/** @internal */\nclass PinMarkerCluster extends Marker {\n /** Create a new cluster marker */\n constructor(location: XYAndZ, size: XAndY, cluster: Cluster<PinMarker>, image: MarkerImage | Promise<MarkerImage> | undefined) {\n super(location, size);\n\n this.title = IModelApp.localization.getLocalizedString(\"mapLayersFormats:Messages.MapFeatureInfoDecorator.clusterZoomIn\", { nbInstances: cluster.markers.length});\n\n this.imageOffset = new Point3d(0, size.y * 0.5);\n this.label = cluster.markers.length.toLocaleString();\n this.labelColor = \"black\";\n this.labelFont = \"bold 14px sans-serif\";\n\n if (image)\n this.setImage(image);\n }\n\n /** Show the cluster as a white circle with an outline */\n public override drawFunc(ctx: CanvasRenderingContext2D): void {\n ctx.beginPath();\n ctx.strokeStyle = \"#372528\";\n ctx.fillStyle = \"white\";\n ctx.lineWidth = 5;\n ctx.arc(0, 0, this.size.x * 0.5, 0, Math.PI * 2);\n ctx.fill();\n ctx.stroke();\n }\n\n public override onMouseButton(_ev: BeButtonEvent): boolean { return true; } // Don't allow clicks to be sent to active tool...\n}\n\n/** @internal */\nclass PinMarkerSet extends MarkerSet<PinMarker> {\n protected getClusterMarker(cluster: Cluster<PinMarker>): Marker {\n // No image passed to the cluster, we prefer to have the circle only\n return new PinMarkerCluster(cluster.getClusterLocation(), cluster.markers[0].size, cluster, undefined);\n }\n}\n\ninterface DrapeGraphicState {\n graphic: GraphicPrimitive;\n collectorState: string;\n chordTolerance: number;\n range: Range3d;\n}\n\nclass DrapedPrimitives {\n private _strings?: LineString3d[];\n private _meshes?: Polyface[];\n private _points = new GrowableXYZArray();\n\n public get strings() {\n return this._strings;\n }\n\n public get meshes() {\n return this._meshes;\n }\n\n public get points() {\n return this._points;\n }\n\n public clear() {\n this._strings = undefined;\n this._meshes = undefined;\n this._points.clear();\n }\n\n public addStrings(drapedStrings: LineString3d[]) {\n if (!this._strings) {\n this._strings = [];\n }\n for (const ds of drapedStrings)\n this._strings.push(ds);\n }\n\n public addMeshes(drapedMeshes: Polyface[]) {\n if (!this._meshes)\n this._meshes = [];\n drapedMeshes.forEach((ds) => this._meshes!.push(ds));\n }\n}\n\n/** @internal */\nexport class MapFeatureInfoDecorator implements Decorator {\n public hidden = false;\n public readonly useCachedDecorations = true;\n public readonly disableTerrainDraper = false;\n public markerSize = new Point2d(32, 32);\n public lineWidth = 3;\n\n // This is the maximum allowed size of a geometry, in pixels, to be draped.\n // If the value is too large, we will end up downloading tons of terrain tiles, and possibly hang for too long.\n public maxDrapeSizePixels = 50000;\n\n // This value controls the chord tolerance used to collect terrain tiles\n // at the \"right\" resolution. Higher values, will give coarser terrain tiles.\n public chordTolerancePixels = 20;\n\n private _highlightColor = ColorDef.from(0, 255, 255, 127);\n public get highlightColor() { return this._highlightColor;}\n public set highlightColor(color: ColorDef) {\n this.updateMarkerImage();\n this._highlightColor = color;\n }\n\n public get defaultMarkerIconSvgXml() { return `<svg class=\"indicator\" viewBox=\"0 0 22 22\" width=\"22\" height=\"22\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m11 0a7.44506 7.44506 0 0 0 -7.5 7.2875c0 1.65 1.132 4.2625 3.25477 8.1125 1.55652 2.75 4.24523 6.6 4.24523 6.6s2.68865-3.9875 4.24528-6.7375c2.12272-3.85 3.25472-6.4625 3.25472-8.1125a7.4215 7.4215 0 0 0 -7.5-7.15z\" fill=\"black\"/><path d=\"m11 1.01715a6.46476 6.46476 0 0 0 -6.48285 6.27033c0 1.72619 1.67181 4.97973 3.12836 7.62139.97564 1.7237 2.42828 3.92176 3.34118 5.27161.91413-1.39148 2.385-3.673 3.37336-5.41907 1.451-2.63171 3.1228-5.88525 3.1228-7.61139a6.39982 6.39982 0 0 0 -6.48285-6.13287zm.00183 8.98285a3 3 0 1 1 3-3 3 3 0 0 1 -3 3z\" fill=\"${this.highlightColor.toRgbString()}\"/></svg>`; }\n\n private _scratchPoints = new GrowableXYZArray();\n\n private _drapeGraphicsStates: DrapeGraphicState[] = [];\n private _drapedPrimitives = new DrapedPrimitives();\n private _allGeomDraped = false;\n private _draper?: GeometryTerrainDraper;\n private _markerImage: HTMLImageElement;\n private _markerSet = new PinMarkerSet();\n\n // Extra markers can be added outside the normal state\n public extraMarkers: Point3d[]|undefined;\n\n private _data: MapFeatureInfoToolData | undefined;\n\n private readonly _graphicType = GraphicType.WorldOverlay;\n\n public constructor() {\n this._markerImage = new Image();\n this.updateMarkerImage();\n }\n\n private updateMarkerImage() {\n const base64 = Base64EncodedString.encode(this.defaultMarkerIconSvgXml);\n this._markerImage.src = `data:image/svg+xml;base64,${base64}`;\n }\n\n private computePixelSize(viewport: Viewport, applyAspectRatioSkew: boolean, pointWorld: Point3d) {\n let pixelSize = 1;\n // Compute the horizontal distance in meters between two adjacent pixels at the center of the geometry.\n pixelSize = viewport.getPixelSizeAtPoint(pointWorld);\n pixelSize = viewport.target.adjustPixelSizeForLOD(pixelSize);\n\n // Aspect ratio skew > 1.0 stretches the view in Y. In that case use the smaller vertical pixel distance for our stroke tolerance.\n const skew = applyAspectRatioSkew ? viewport.view.getAspectRatioSkew() : 0;\n if (skew > 1)\n pixelSize /= skew;\n return pixelSize * 0.25;\n }\n\n private computeChordTolerance(viewport: Viewport, drapeRange: Range3d) {\n const drapeSizeWorld = Math.max(drapeRange.xLength(), drapeRange.yLength());\n const pixelSize = this.computePixelSize(viewport, true, drapeRange.center);\n const maxDrapeRangeSizeRatio = this.maxDrapeSizePixels / (drapeSizeWorld / pixelSize);\n if (maxDrapeRangeSizeRatio < 1) {\n Logger.logWarning(loggerCategory, \"Element too large; chord tolerance was adjusted\");\n return (pixelSize / maxDrapeRangeSizeRatio)*this.chordTolerancePixels;\n }\n return pixelSize*this.chordTolerancePixels;\n };\n\n public clearData = () => {\n this._data = undefined;\n };\n\n public setData = (data: MapFeatureInfoToolData) => {\n\n this._drapedPrimitives.clear();\n this._allGeomDraped = false;\n this.hidden = false;\n\n this._data = data;\n IModelApp.viewManager.invalidateCachedDecorationsAllViews(this);\n\n this._drapeGraphicsStates = [];\n\n if (!this.disableTerrainDraper && this._data.mapInfo?.layerInfos && data.hit.viewport.displayStyle.displayTerrain) {\n\n if (data.hit?.modelId) {\n const drapeTreeRef = this.getGeometryTreeRef(data.hit.viewport);\n if (drapeTreeRef) {\n this._draper = new GeometryTerrainDraper(data.hit.viewport, drapeTreeRef);\n return;\n }\n }\n }\n\n if (this._draper) {\n // Dispose draper every time?\n this._draper.dispose();\n this._draper = undefined;\n }\n };\n\n private getGeometryTreeRef(vp: Viewport): GeometryTileTreeReference | undefined {\n let treeRef: GeometryTileTreeReference | undefined;\n if (vp.backgroundMapSettings.applyTerrain) {\n vp.forEachMapTreeRef((ref: TileTreeReference) => {\n if (!treeRef && ref instanceof MapTileTreeReference) {\n treeRef = ref.createGeometryTreeReference();\n }\n });\n }\n\n return treeRef;\n }\n\n protected renderGraphics(context: DecorateContext) {\n this._markerSet.markers.clear();\n\n if (this._data?.mapInfo?.layerInfos === undefined || this.hidden) {\n return undefined;\n }\n\n let transform: Transform|undefined;\n const groundBias = context.viewport.displayStyle.backgroundMapSettings.groundBias;\n if (groundBias !== 0) {\n transform = Transform.createTranslationXYZ(0, 0 , groundBias);\n }\n const builder = context.createGraphicBuilder(this._graphicType, transform);\n\n if (this._draper) {\n this.initializeDrapeState(context.viewport);\n\n // We need to call drapeGeometries() until it returns true (i.e. fully complete)\n if (!this._allGeomDraped) {\n if (!this.drapeGeometries(context.viewport))\n return undefined;\n }\n\n this.appendDrapedGeometries(builder);\n } else {\n // Append geometries straight from the state to the builder\n this.appendGeometries(builder);\n }\n\n // Add extra markers if any specified\n if ( this.extraMarkers !== undefined) {\n this.extraMarkers.forEach((markerPoint)=> {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._markerSet.markers.add(new PinMarker(markerPoint, this.markerSize, this._markerImage));\n });\n }\n\n return builder.finish();\n }\n\n // Iterates the mapfeatureinfo data and create a draping state for each entry\n private initializeDrapeState(viewport: ScreenViewport) {\n if (this._drapeGraphicsStates.length === 0) {\n const getGraphicRange = (graphic: GraphicPrimitive) => {\n if (graphic.type === \"linestring\")\n return Range3d.createArray(graphic.points);\n else if (graphic.type === \"loop\")\n return graphic.loop.range();\n else if (graphic.type === \"pointstring\")\n return Range3d.createArray(graphic.points);\n else\n return Range3d.createNull();\n };\n\n for (const layerInfo of this._data?.mapInfo?.layerInfos??[]) {\n for (const subLayerInfo of layerInfo?.subLayerInfos??[]) {\n for (const feature of subLayerInfo.features) {\n\n feature.geometries?.forEach(((geom)=> {\n const range = getGraphicRange(geom.graphic);\n this._drapeGraphicsStates.push({\n graphic: geom.graphic,\n collectorState: \"loading\",\n chordTolerance: this.computeChordTolerance(viewport, range),\n range,\n });\n } ));\n }\n }\n }\n }\n }\n\n // returns true when all geometries are fully draped; otherwise false\n private drapeGeometries(_viewport: ScreenViewport): boolean {\n if (!this._draper)\n return false;\n\n let hasMissingDrapeGeoms = false;\n for (const state of this._drapeGraphicsStates) {\n if (state.collectorState === \"loading\") {\n this._scratchPoints.clear();\n\n if (state.graphic.type === \"linestring\") {\n this._scratchPoints.pushAll(state.graphic.points);\n const drapedStrings: LineString3d[] = [];\n if (\"loading\" === this._draper.drapeLineString(drapedStrings, this._scratchPoints, state.chordTolerance, state.range)) {\n hasMissingDrapeGeoms = true;\n break;\n } else {\n this._drapedPrimitives.addStrings(drapedStrings);\n state.collectorState = \"complete\";\n }\n } else if (state.graphic.type === \"loop\") {\n const loop = state.graphic.loop;\n const outMeshes: Polyface[] = [];\n if (\"loading\" === this._draper.drapeLoop(outMeshes, loop, state.chordTolerance, state.range)) {\n hasMissingDrapeGeoms = true;\n break; // We drape each graphic sequentially, otherwise collector get messed up.\n } else {\n this._drapedPrimitives.addMeshes(outMeshes);\n state.collectorState = \"complete\";\n }\n } else if (state.graphic.type === \"pointstring\") {\n const outPoint = Point3d.createZero();\n for (const point of state.graphic.points) {\n if (\"loading\" === this._draper.drapePoint(outPoint, point, state.chordTolerance, state.range)) {\n this._allGeomDraped = false;\n return false;\n } else if (!outPoint.isZero) {\n this._drapedPrimitives.points.push(outPoint);\n }\n }\n }\n }\n }\n\n this._allGeomDraped = !hasMissingDrapeGeoms;\n return this._allGeomDraped;\n }\n\n private appendDrapedGeometries(builder: GraphicBuilder) {\n if (this._drapedPrimitives.strings) {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._drapedPrimitives.strings.forEach((line) => builder.addLineString(line.points));\n }\n\n if (this._drapedPrimitives.meshes) {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._drapedPrimitives.meshes.forEach((polyface) => builder.addPolyface(polyface, true));\n }\n\n if (this._drapedPrimitives.points.length > 0) {\n for (let i = 0; i < this._drapedPrimitives.points.length; i++) {\n this._markerSet.markers.add(new PinMarker(this._drapedPrimitives.points.getPoint3dAtUncheckedPointIndex(i), this.markerSize, this._markerImage));\n }\n }\n }\n\n private appendGeometries(builder: GraphicBuilder) {\n if (!this._data?.mapInfo?.layerInfos)\n return;\n\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n for (const layerInfo of this._data.mapInfo.layerInfos) {\n if (layerInfo.subLayerInfos && !(layerInfo.subLayerInfos instanceof HTMLElement)) {\n for (const subLayerInfo of layerInfo.subLayerInfos) {\n for (const feature of subLayerInfo.features) {\n if (feature.geometries) {\n for (const geom of feature.geometries) {\n if (geom.graphic.type === \"pointstring\") {\n for (const point of geom.graphic.points)\n this._markerSet.markers.add(new PinMarker(point, this.markerSize, this._markerImage));\n } else {\n builder.addPrimitive(geom.graphic);\n }\n\n }\n }\n }\n }\n\n }\n\n }\n }\n\n public decorate(context: DecorateContext): void {\n const graphics = this.renderGraphics(context);\n if (graphics) {\n context.addDecoration(this._graphicType, graphics);\n IModelApp.toolAdmin.setCursor(undefined);\n }\n\n this._markerSet.addDecoration(context);\n return;\n }\n}\n"]}
1
+ {"version":3,"file":"MapFeatureInfoDecorator.js","sourceRoot":"","sources":["../../../src/Tools/MapFeatureInfoDecorator.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*--------------------------------------------------------------------------------------------*/\nimport { Base64EncodedString, ColorDef } from \"@itwin/core-common\";\nimport {\n BeButtonEvent, Cluster, DecorateContext, Decorator,\n GeometryTileTreeReference, GraphicBuilder, GraphicPrimitive, GraphicType, IModelApp, MapTileTreeReference, Marker, MarkerImage, MarkerSet,\n ScreenViewport,\n TileTreeReference, Viewport } from \"@itwin/core-frontend\";\nimport { GrowableXYZArray, LineString3d, Point2d, Point3d, Polyface, Range3d, Transform, XAndY, XYAndZ } from \"@itwin/core-geometry\";\nimport { MapFeatureInfoToolData } from \"./MapFeatureInfoTool\";\nimport { GeometryTerrainDraper } from \"./GeometryTerrainDraper\";\nimport { Logger } from \"@itwin/core-bentley\";\nconst loggerCategory = \"MapLayersFormats.MapFeatureInfoDecorator\";\n\n/** @internal */\nclass PinMarker extends Marker {\n public constructor(worldLocation: XYAndZ, size: XAndY, image: MarkerImage) {\n super(worldLocation, size);\n this.image = image;\n this.imageOffset = new Point3d(0, Math.floor(size.y * .5));\n }\n}\n\n/** @internal */\nclass PinMarkerCluster extends Marker {\n /** Create a new cluster marker */\n constructor(location: XYAndZ, size: XAndY, cluster: Cluster<PinMarker>, image: MarkerImage | Promise<MarkerImage> | undefined) {\n super(location, size);\n\n this.title = IModelApp.localization.getLocalizedString(\"mapLayersFormats:Messages.MapFeatureInfoDecorator.clusterZoomIn\", { nbInstances: cluster.markers.length});\n\n this.imageOffset = new Point3d(0, size.y * 0.5);\n this.label = cluster.markers.length.toLocaleString();\n this.labelColor = \"black\";\n this.labelFont = \"bold 14px sans-serif\";\n\n if (image)\n this.setImage(image);\n }\n\n /** Show the cluster as a white circle with an outline */\n public override drawFunc(ctx: CanvasRenderingContext2D): void {\n ctx.beginPath();\n ctx.strokeStyle = \"#372528\";\n ctx.fillStyle = \"white\";\n ctx.lineWidth = 5;\n ctx.arc(0, 0, this.size.x * 0.5, 0, Math.PI * 2);\n ctx.fill();\n ctx.stroke();\n }\n\n public override onMouseButton(_ev: BeButtonEvent): boolean { return true; } // Don't allow clicks to be sent to active tool...\n}\n\n/** @internal */\nclass PinMarkerSet extends MarkerSet<PinMarker> {\n protected getClusterMarker(cluster: Cluster<PinMarker>): Marker {\n // No image passed to the cluster, we prefer to have the circle only\n return new PinMarkerCluster(cluster.getClusterLocation(), cluster.markers[0].size, cluster, undefined);\n }\n}\n\ninterface DrapeGraphicState {\n graphic: GraphicPrimitive;\n collectorState: string;\n chordTolerance: number;\n range: Range3d;\n}\n\nclass DrapedPrimitives {\n private _strings?: LineString3d[];\n private _meshes?: Polyface[];\n private _points = new GrowableXYZArray();\n\n public get strings() {\n return this._strings;\n }\n\n public get meshes() {\n return this._meshes;\n }\n\n public get points() {\n return this._points;\n }\n\n public clear() {\n this._strings = undefined;\n this._meshes = undefined;\n this._points.clear();\n }\n\n public addStrings(drapedStrings: LineString3d[]) {\n if (!this._strings) {\n this._strings = [];\n }\n for (const ds of drapedStrings)\n this._strings.push(ds);\n }\n\n public addMeshes(drapedMeshes: Polyface[]) {\n if (!this._meshes)\n this._meshes = [];\n drapedMeshes.forEach((ds) => this._meshes!.push(ds));\n }\n}\n\n/** @internal */\nexport class MapFeatureInfoDecorator implements Decorator {\n public hidden = false;\n public readonly useCachedDecorations = true;\n public readonly disableTerrainDraper = false;\n public markerSize = new Point2d(32, 32);\n public lineWidth = 3;\n\n // This is the maximum allowed size of a geometry, in pixels, to be draped.\n // If the value is too large, we will end up downloading tons of terrain tiles, and possibly hang for too long.\n public maxDrapeSizePixels = 50000;\n\n // This value controls the chord tolerance used to collect terrain tiles\n // at the \"right\" resolution. Higher values, will give coarser terrain tiles.\n public chordTolerancePixels = 20;\n\n private _highlightColor = ColorDef.from(0, 255, 255, 127);\n public get highlightColor() { return this._highlightColor;}\n public set highlightColor(color: ColorDef) {\n this.updateMarkerImage();\n this._highlightColor = color;\n }\n\n public get defaultMarkerIconSvgXml() { return `<svg class=\"indicator\" viewBox=\"0 0 22 22\" width=\"22\" height=\"22\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m11 0a7.44506 7.44506 0 0 0 -7.5 7.2875c0 1.65 1.132 4.2625 3.25477 8.1125 1.55652 2.75 4.24523 6.6 4.24523 6.6s2.68865-3.9875 4.24528-6.7375c2.12272-3.85 3.25472-6.4625 3.25472-8.1125a7.4215 7.4215 0 0 0 -7.5-7.15z\" fill=\"black\"/><path d=\"m11 1.01715a6.46476 6.46476 0 0 0 -6.48285 6.27033c0 1.72619 1.67181 4.97973 3.12836 7.62139.97564 1.7237 2.42828 3.92176 3.34118 5.27161.91413-1.39148 2.385-3.673 3.37336-5.41907 1.451-2.63171 3.1228-5.88525 3.1228-7.61139a6.39982 6.39982 0 0 0 -6.48285-6.13287zm.00183 8.98285a3 3 0 1 1 3-3 3 3 0 0 1 -3 3z\" fill=\"${this.highlightColor.toRgbString()}\"/></svg>`; }\n\n private _scratchPoints = new GrowableXYZArray();\n\n private _drapeGraphicsStates: DrapeGraphicState[] = [];\n private _drapedPrimitives = new DrapedPrimitives();\n private _allGeomDraped = false;\n private _draper?: GeometryTerrainDraper;\n private _markerImage: HTMLImageElement;\n private _markerSet = new PinMarkerSet();\n\n // Extra markers can be added outside the normal state\n public extraMarkers: Point3d[]|undefined;\n\n private _data: MapFeatureInfoToolData | undefined;\n\n private readonly _graphicType = GraphicType.WorldOverlay;\n\n public constructor() {\n this._markerImage = new Image();\n this.updateMarkerImage();\n }\n\n private updateMarkerImage() {\n const base64 = Base64EncodedString.encode(this.defaultMarkerIconSvgXml);\n this._markerImage.src = `data:image/svg+xml;base64,${base64}`;\n }\n\n private computePixelSize(viewport: Viewport, applyAspectRatioSkew: boolean, pointWorld: Point3d) {\n let pixelSize = 1;\n // Compute the horizontal distance in meters between two adjacent pixels at the center of the geometry.\n pixelSize = viewport.getPixelSizeAtPoint(pointWorld);\n pixelSize = viewport.target.adjustPixelSizeForLOD(pixelSize);\n\n // Aspect ratio skew > 1.0 stretches the view in Y. In that case use the smaller vertical pixel distance for our stroke tolerance.\n const skew = applyAspectRatioSkew ? viewport.view.getAspectRatioSkew() : 0;\n if (skew > 1)\n pixelSize /= skew;\n return pixelSize * 0.25;\n }\n\n private computeChordTolerance(viewport: Viewport, drapeRange: Range3d) {\n const drapeSizeWorld = Math.max(drapeRange.xLength(), drapeRange.yLength());\n const pixelSize = this.computePixelSize(viewport, true, drapeRange.center);\n const maxDrapeRangeSizeRatio = this.maxDrapeSizePixels / (drapeSizeWorld / pixelSize);\n if (maxDrapeRangeSizeRatio < 1) {\n Logger.logWarning(loggerCategory, \"Element too large; chord tolerance was adjusted\");\n return (pixelSize / maxDrapeRangeSizeRatio)*this.chordTolerancePixels;\n }\n return pixelSize*this.chordTolerancePixels;\n };\n\n public clearData = () => {\n this._data = undefined;\n };\n\n public setData = (data: MapFeatureInfoToolData) => {\n\n this._drapedPrimitives.clear();\n this._allGeomDraped = false;\n this.hidden = false;\n\n this._data = data;\n IModelApp.viewManager.invalidateCachedDecorationsAllViews(this);\n\n this._drapeGraphicsStates = [];\n\n if (!this.disableTerrainDraper && this._data.mapInfo?.layerInfos && data.hit.viewport.displayStyle.displayTerrain) {\n\n if (data.hit?.modelId) {\n const drapeTreeRef = this.getGeometryTreeRef(data.hit.viewport);\n if (drapeTreeRef) {\n this._draper = new GeometryTerrainDraper(data.hit.viewport, drapeTreeRef);\n return;\n }\n }\n }\n\n if (this._draper) {\n // Dispose draper every time?\n this._draper[Symbol.dispose]();\n this._draper = undefined;\n }\n };\n\n private getGeometryTreeRef(vp: Viewport): GeometryTileTreeReference | undefined {\n let treeRef: GeometryTileTreeReference | undefined;\n if (vp.backgroundMapSettings.applyTerrain) {\n vp.forEachMapTreeRef((ref: TileTreeReference) => {\n if (!treeRef && ref instanceof MapTileTreeReference) {\n treeRef = ref.createGeometryTreeReference();\n }\n });\n }\n\n return treeRef;\n }\n\n protected renderGraphics(context: DecorateContext) {\n this._markerSet.markers.clear();\n\n if (this._data?.mapInfo?.layerInfos === undefined || this.hidden) {\n return undefined;\n }\n\n let transform: Transform|undefined;\n const groundBias = context.viewport.displayStyle.backgroundMapSettings.groundBias;\n if (groundBias !== 0) {\n transform = Transform.createTranslationXYZ(0, 0 , groundBias);\n }\n const builder = context.createGraphicBuilder(this._graphicType, transform);\n\n if (this._draper) {\n this.initializeDrapeState(context.viewport);\n\n // We need to call drapeGeometries() until it returns true (i.e. fully complete)\n if (!this._allGeomDraped) {\n if (!this.drapeGeometries(context.viewport))\n return undefined;\n }\n\n this.appendDrapedGeometries(builder);\n } else {\n // Append geometries straight from the state to the builder\n this.appendGeometries(builder);\n }\n\n // Add extra markers if any specified\n if ( this.extraMarkers !== undefined) {\n this.extraMarkers.forEach((markerPoint)=> {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._markerSet.markers.add(new PinMarker(markerPoint, this.markerSize, this._markerImage));\n });\n }\n\n return builder.finish();\n }\n\n // Iterates the mapfeatureinfo data and create a draping state for each entry\n private initializeDrapeState(viewport: ScreenViewport) {\n if (this._drapeGraphicsStates.length === 0) {\n const getGraphicRange = (graphic: GraphicPrimitive) => {\n if (graphic.type === \"linestring\")\n return Range3d.createArray(graphic.points);\n else if (graphic.type === \"loop\")\n return graphic.loop.range();\n else if (graphic.type === \"pointstring\")\n return Range3d.createArray(graphic.points);\n else\n return Range3d.createNull();\n };\n\n for (const layerInfo of this._data?.mapInfo?.layerInfos??[]) {\n for (const subLayerInfo of layerInfo?.subLayerInfos??[]) {\n for (const feature of subLayerInfo.features) {\n\n feature.geometries?.forEach(((geom)=> {\n const range = getGraphicRange(geom.graphic);\n this._drapeGraphicsStates.push({\n graphic: geom.graphic,\n collectorState: \"loading\",\n chordTolerance: this.computeChordTolerance(viewport, range),\n range,\n });\n } ));\n }\n }\n }\n }\n }\n\n // returns true when all geometries are fully draped; otherwise false\n private drapeGeometries(_viewport: ScreenViewport): boolean {\n if (!this._draper)\n return false;\n\n let hasMissingDrapeGeoms = false;\n for (const state of this._drapeGraphicsStates) {\n if (state.collectorState === \"loading\") {\n this._scratchPoints.clear();\n\n if (state.graphic.type === \"linestring\") {\n this._scratchPoints.pushAll(state.graphic.points);\n const drapedStrings: LineString3d[] = [];\n if (\"loading\" === this._draper.drapeLineString(drapedStrings, this._scratchPoints, state.chordTolerance, state.range)) {\n hasMissingDrapeGeoms = true;\n break;\n } else {\n this._drapedPrimitives.addStrings(drapedStrings);\n state.collectorState = \"complete\";\n }\n } else if (state.graphic.type === \"loop\") {\n const loop = state.graphic.loop;\n const outMeshes: Polyface[] = [];\n if (\"loading\" === this._draper.drapeLoop(outMeshes, loop, state.chordTolerance, state.range)) {\n hasMissingDrapeGeoms = true;\n break; // We drape each graphic sequentially, otherwise collector get messed up.\n } else {\n this._drapedPrimitives.addMeshes(outMeshes);\n state.collectorState = \"complete\";\n }\n } else if (state.graphic.type === \"pointstring\") {\n const outPoint = Point3d.createZero();\n for (const point of state.graphic.points) {\n if (\"loading\" === this._draper.drapePoint(outPoint, point, state.chordTolerance, state.range)) {\n this._allGeomDraped = false;\n return false;\n } else if (!outPoint.isZero) {\n this._drapedPrimitives.points.push(outPoint);\n }\n }\n }\n }\n }\n\n this._allGeomDraped = !hasMissingDrapeGeoms;\n return this._allGeomDraped;\n }\n\n private appendDrapedGeometries(builder: GraphicBuilder) {\n if (this._drapedPrimitives.strings) {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._drapedPrimitives.strings.forEach((line) => builder.addLineString(line.points));\n }\n\n if (this._drapedPrimitives.meshes) {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._drapedPrimitives.meshes.forEach((polyface) => builder.addPolyface(polyface, true));\n }\n\n if (this._drapedPrimitives.points.length > 0) {\n for (let i = 0; i < this._drapedPrimitives.points.length; i++) {\n this._markerSet.markers.add(new PinMarker(this._drapedPrimitives.points.getPoint3dAtUncheckedPointIndex(i), this.markerSize, this._markerImage));\n }\n }\n }\n\n private appendGeometries(builder: GraphicBuilder) {\n if (!this._data?.mapInfo?.layerInfos)\n return;\n\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n for (const layerInfo of this._data.mapInfo.layerInfos) {\n if (layerInfo.subLayerInfos && !(layerInfo.subLayerInfos instanceof HTMLElement)) {\n for (const subLayerInfo of layerInfo.subLayerInfos) {\n for (const feature of subLayerInfo.features) {\n if (feature.geometries) {\n for (const geom of feature.geometries) {\n if (geom.graphic.type === \"pointstring\") {\n for (const point of geom.graphic.points)\n this._markerSet.markers.add(new PinMarker(point, this.markerSize, this._markerImage));\n } else {\n builder.addPrimitive(geom.graphic);\n }\n\n }\n }\n }\n }\n\n }\n\n }\n }\n\n public decorate(context: DecorateContext): void {\n const graphics = this.renderGraphics(context);\n if (graphics) {\n context.addDecoration(this._graphicType, graphics);\n IModelApp.toolAdmin.setCursor(undefined);\n }\n\n this._markerSet.addDecoration(context);\n return;\n }\n}\n"]}
@@ -8,7 +8,7 @@ export declare class GeometryTerrainDraper implements TileUser {
8
8
  readonly maxDistanceZ = 100000;
9
9
  readonly tileUserId: number;
10
10
  constructor(viewport: Viewport, treeRef: GeometryTileTreeReference);
11
- dispose(): void;
11
+ [Symbol.dispose](): void;
12
12
  get iModel(): import("@itwin/core-frontend").IModelConnection;
13
13
  onRequestStateChanged(): void;
14
14
  discloseTileTrees(trees: DisclosedTileTreeSet): void;
@@ -1 +1 @@
1
- {"version":3,"file":"GeometryTerrainDraper.d.ts","sourceRoot":"","sources":["../../../src/Tools/GeometryTerrainDraper.ts"],"names":[],"mappings":"AAIA,OAAO,EACc,oBAAoB,EACvC,yBAAyB,EACI,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,KAAK,EAAsB,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,4BAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAA2C,OAAO,EAA8D,MAAM,sBAAsB,CAAC;AA6CzR,gBAAgB;AAChB,qBAAa,qBAAsB,YAAW,QAAQ;aASjB,QAAQ,EAAE,QAAQ;aAAkB,OAAO,EAAE,yBAAyB;IALzG,SAAgB,SAAS,QAA6B;IAEtD,SAAgB,YAAY,UAAS;IACrC,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEA,QAAQ,EAAE,QAAQ,EAAkB,OAAO,EAAE,yBAAyB;IAKlG,OAAO,IAAI,IAAI;IAItB,IAAW,MAAM,oDAAmC;IAE7C,qBAAqB;IAIrB,iBAAiB,CAAC,KAAK,EAAE,oBAAoB;IAM7C,gBAAgB,CAAC,IAAI,EAAE,eAAe;IAqBtC,eAAe,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU;IA8BpI,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU;IA4BvG,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU;CAyBrH"}
1
+ {"version":3,"file":"GeometryTerrainDraper.d.ts","sourceRoot":"","sources":["../../../src/Tools/GeometryTerrainDraper.ts"],"names":[],"mappings":"AAIA,OAAO,EACc,oBAAoB,EACvC,yBAAyB,EACI,QAAQ,EAAE,QAAQ,EAChD,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAsB,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,4BAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAA2C,OAAO,EAA8D,MAAM,sBAAsB,CAAC;AA6CzR,gBAAgB;AAChB,qBAAa,qBAAsB,YAAW,QAAQ;aASjB,QAAQ,EAAE,QAAQ;aAAkB,OAAO,EAAE,yBAAyB;IALzG,SAAgB,SAAS,QAA6B;IAEtD,SAAgB,YAAY,UAAS;IACrC,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEA,QAAQ,EAAE,QAAQ,EAAkB,OAAO,EAAE,yBAAyB;IAKlG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAI/B,IAAW,MAAM,oDAAmC;IAE7C,qBAAqB;IAIrB,iBAAiB,CAAC,KAAK,EAAE,oBAAoB;IAM7C,gBAAgB,CAAC,IAAI,EAAE,eAAe;IAqBtC,eAAe,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU;IA8BpI,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU;IA4BvG,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU;CAyBrH"}
@@ -49,7 +49,7 @@ export class GeometryTerrainDraper {
49
49
  this.tileUserId = TileUser.generateId();
50
50
  IModelApp.tileAdmin.registerUser(this);
51
51
  }
52
- dispose() {
52
+ [Symbol.dispose]() {
53
53
  IModelApp.tileAdmin.forgetUser(this);
54
54
  }
55
55
  get iModel() { return this.viewport.iModel; }
@@ -1 +1 @@
1
- {"version":3,"file":"GeometryTerrainDraper.js","sourceRoot":"","sources":["../../../src/Tools/GeometryTerrainDraper.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAEsB,SAAS,EAC9B,qBAAqB,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAqD,4BAA4B,EAA2B,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAa,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACzR,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,MAAM,cAAc,GAAG,wCAAwC,CAAC;AAEhE;;EAEE;AACF,MAAM,oBAAqB,SAAQ,qBAAqB;IAGtD,YAAY,IAAc,EAAE,cAAsB,EAAE,KAAc,EAAE,SAAoB,EAAE,MAAwB;QAChH,KAAK,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAEe,cAAc,CAAC,IAAU;QACvC,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,8BAA8B,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAChF,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAEe,WAAW,CAAC,IAAU;QACpC,IAAI,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,QAAQ,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrE,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,uBAAuB,IAAI,CAAC,SAAS,YAAY,MAAO,aAAa,IAAI,CAAC,OAAO,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/I,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,uBAAuB,CAAC,KAAc;QAC5C,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,OAAO,GAAG,kBAAkB,CAAC,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACpG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS;YACzB,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;YACzD,MAAM,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAE/J,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,gBAAgB;AAChB,MAAM,OAAO,qBAAqB;IAShC,YAAmC,QAAkB,EAAkB,OAAkC;QAAtE,aAAQ,GAAR,QAAQ,CAAU;QAAkB,YAAO,GAAP,OAAO,CAA2B;QARzG,4FAA4F;QAC5F,qEAAqE;QACrE,yFAAyF;QACzE,cAAS,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAEtC,iBAAY,GAAG,KAAK,CAAC,CAAC,0EAA0E;QAI9G,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxC,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEM,OAAO;QACZ,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,IAAW,MAAM,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7C,qBAAqB;QAC1B,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;IACxC,CAAC;IAEM,iBAAiB,CAAC,KAA2B;QAClD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,6BAA6B;IAC7B,yFAAyF;IAClF,gBAAgB,CAAC,IAAqB;QAC3C,kBAAkB;QAClB,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QACrC,6BAA6B;QAC7B,4CAA4C;QAC5C,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;QAE1C,KAAK,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,EAAE,GAAI,CAAC;YACxE,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;gBACtD,MAAM,KAAK,GAAG,WAAW,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;gBAC9D,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,kBAAkB;oBACzE,IAAI,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAAG,sBAAsB;wBAClE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,4BAA4B,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IAEM,eAAe,CAAC,UAA4B,EAAE,QAA0B,EAAE,SAAiB,EAAE,KAAc;QAChH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI;YACP,OAAO,SAAS,CAAC;QAEnB,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChD,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9C,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE7C,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAC3G,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC5C,SAAS,CAAC,mBAAmB,EAAE,CAAC;QAEhC,IAAI,SAAS,CAAC,mBAAmB,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAEpE,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBAC3C,+CAA+C;gBAC/C,gGAAgG;gBAChG,UAAU,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,uBAAuB,CACtD,QAAQ,EACR,QAAQ,EACR,8BAA8B,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YACxG,CAAC;YAED,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,SAAS,CAAC,SAAqB,EAAE,IAAU,EAAE,SAAiB,EAAE,KAAc;QACnF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI;YACP,OAAO,SAAS,CAAC;QAEnB,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChD,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9C,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO;YACV,OAAO,UAAU,CAAC;QAEpB,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAC1G,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC5C,SAAS,CAAC,mBAAmB,EAAE,CAAC;QAEhC,IAAI,SAAS,CAAC,mBAAmB,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpE,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBAClD,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBACvD,IAAI,IAAI;oBACN,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACM,UAAU,CAAC,QAAiB,EAAE,KAAc,EAAE,cAAsB,EAAE,KAAc;QACzF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI;YACP,OAAO,SAAS,CAAC;QAEnB,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChD,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9C,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE7C,MAAM,SAAS,GAAG,IAAI,qBAAqB,CAAC,EAAC,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC5C,SAAS,CAAC,mBAAmB,EAAE,CAAC;QAEhC,IAAI,SAAS,CAAC,mBAAmB,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpE,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBAC3C,yEAAyE;gBACzE,MAAM,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAE,CAAC,CAAC;gBACrG,IAAI,CAAC,aAAa;oBAChB,SAAS;gBACX,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF","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*--------------------------------------------------------------------------------------------*/\nimport {\n CollectTileStatus, DisclosedTileTreeSet,\n GeometryTileTreeReference, IModelApp,\n Tile, TileGeometryCollector, TileUser, Viewport } from \"@itwin/core-frontend\";\nimport { Angle, ConvexClipPlaneSet, CurvePrimitive, GrowableXYZArray, IndexedPolyface, IndexedPolyfaceSubsetVisitor, Loop, Point3d, Polyface, PolyfaceClip, PolyfaceQuery, PolygonOps, Range3d, Ray3d, SweepLineStringToFacetsOptions, Transform, Vector3d } from \"@itwin/core-geometry\";\nimport { Logger } from \"@itwin/core-bentley\";\n\nconst loggerCategory = \"MapLayersFormats.GeometryTerrainDraper\";\n\n/** A TileGeometryCollector that restricts collection to tiles that overlap a line string.\n/* @internal\n*/\nclass LineSegmentCollector extends TileGeometryCollector {\n private _points: GrowableXYZArray;\n\n constructor(user: TileUser, chordTolerance: number, range: Range3d, transform: Transform, points: GrowableXYZArray) {\n super({ user, chordTolerance, range, transform });\n this._points = points;\n }\n\n public override addMissingTile(tile: Tile): void {\n Logger.logTrace(loggerCategory, `CollectorAdd missing tile: ${tile.contentId}`);\n super.addMissingTile(tile);\n }\n\n public override collectTile(tile: Tile): CollectTileStatus {\n let status = super.collectTile(tile);\n\n if (\"reject\" !== status && !this.rangeOverlapsLineString(tile.range)) {\n status = \"reject\";\n }\n\n Logger.logTrace(loggerCategory, `collectTile - tile: ${tile.contentId} status: ${status } isReady: ${tile.isReady} status:${tile.loadStatus}`);\n return status;\n }\n\n private rangeOverlapsLineString(range: Range3d) {\n let inside = false;\n const clipper = ConvexClipPlaneSet.createRange3dPlanes(range, true, true, true, true, false, false);\n if (this._options.transform)\n clipper.transformInPlace(this._options.transform);\n\n for (let i = 0; i < this._points.length - 1 && !inside; i++)\n inside = clipper.announceClippedSegmentIntervals(0, 1, this._points.getPoint3dAtUncheckedPointIndex(i), this._points.getPoint3dAtUncheckedPointIndex(i + 1));\n\n return inside;\n }\n}\n\n/** @internal */\nexport class GeometryTerrainDraper implements TileUser {\n // The side angle measures how close the sweep vector is from being parallel to a side face.\n // The larger the angle, the more nearly vertical facets are ignored.\n // This is an \"empirical\" value that was determined by looking at \"problematic\" polyfaces\n public readonly sideAngle = Angle.createDegrees(0.06);\n\n public readonly maxDistanceZ = 1.0E5; // Expand the Z Range, but not so much that we get opposite side of globe.\n public readonly tileUserId: number;\n\n public constructor(public readonly viewport: Viewport, public readonly treeRef: GeometryTileTreeReference) {\n this.tileUserId = TileUser.generateId();\n IModelApp.tileAdmin.registerUser(this);\n }\n\n public dispose(): void {\n IModelApp.tileAdmin.forgetUser(this);\n }\n\n public get iModel() { return this.viewport.iModel; }\n\n public onRequestStateChanged() {\n this.viewport.invalidateDecorations();\n }\n\n public discloseTileTrees(trees: DisclosedTileTreeSet) {\n trees.disclose(this.treeRef);\n }\n\n // Filter out non-top facets:\n // For unknown reasons, there are \"perpendicular\" facets appearing in the terrain meshes.\n public getMeshTopFacets(mesh: IndexedPolyface) {\n // constant inputs\n const sweepVector = Vector3d.unitZ();\n // i.e., region is horizontal\n // create subset visitor from the top facets\n const topFacets: number[] = [];\n const facetNormal = Vector3d.createZero();\n\n for (const visitor = mesh.createVisitor(0); visitor.moveToNextFacet(); ) {\n if (PolygonOps.unitNormal(visitor.point, facetNormal)) {\n const theta = facetNormal.angleFromPerpendicular(sweepVector);\n if (!theta.isMagnitudeLessThanOrEqual(this.sideAngle)) { // skip side facet\n if (facetNormal.dotProduct(sweepVector) > 0) // this is a top facet\n topFacets.push(visitor.currentReadIndex());\n }\n }\n }\n\n return IndexedPolyfaceSubsetVisitor.createSubsetVisitor(mesh, topFacets, 0);\n }\n\n public drapeLineString(outStrings: CurvePrimitive[], inPoints: GrowableXYZArray, tolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const collector = new LineSegmentCollector(this, tolerance, expandedRange, tree.iModelTransform, inPoints);\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n\n for (const polyface of collector.polyfaces) {\n // Use this to serialize (problematic) polyface\n // console.log (`const polyface = ${JSON.stringify(IModelJson.Writer.toIModelJson(polyface))}`);\n outStrings.push(...PolyfaceQuery.sweepLineStringToFacets(\n inPoints,\n polyface,\n SweepLineStringToFacetsOptions.create(Vector3d.unitZ(), this.sideAngle, true, true, false, false)));\n }\n\n return \"complete\";\n }\n\n return \"loading\";\n }\n\n public drapeLoop(outMeshes: Polyface[], loop: Loop, tolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const strokes = loop.getPackedStrokes();\n if (!strokes)\n return \"complete\";\n\n const collector = new LineSegmentCollector(this, tolerance, expandedRange, tree.iModelTransform, strokes);\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n for (const polyface of collector.polyfaces) {\n const topFacets = this.getMeshTopFacets(polyface);\n const mesh = PolyfaceClip.drapeRegion(topFacets, loop);\n if (mesh)\n outMeshes.push(mesh);\n }\n return \"complete\";\n }\n return \"loading\";\n }\n public drapePoint(outPoint: Point3d, point: Point3d, chordTolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const collector = new TileGeometryCollector({chordTolerance, range: expandedRange, user: this });\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n for (const polyface of collector.polyfaces) {\n // Im assuming a single polyface here since we are draping a single point\n const facetLocation = PolyfaceQuery.intersectRay3d(polyface, Ray3d.create(point, Vector3d.unitZ() ));\n if (!facetLocation)\n continue;\n outPoint.setFromPoint3d(facetLocation.point);\n }\n return \"complete\";\n }\n return \"loading\";\n }\n}\n"]}
1
+ {"version":3,"file":"GeometryTerrainDraper.js","sourceRoot":"","sources":["../../../src/Tools/GeometryTerrainDraper.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*--------------------------------------------------------------------------------------------*/\nimport {\n CollectTileStatus, DisclosedTileTreeSet,\n GeometryTileTreeReference, IModelApp,\n Tile, TileGeometryCollector, TileUser, Viewport\n} from \"@itwin/core-frontend\";\nimport { Angle, ConvexClipPlaneSet, CurvePrimitive, GrowableXYZArray, IndexedPolyface, IndexedPolyfaceSubsetVisitor, Loop, Point3d, Polyface, PolyfaceClip, PolyfaceQuery, PolygonOps, Range3d, Ray3d, SweepLineStringToFacetsOptions, Transform, Vector3d } from \"@itwin/core-geometry\";\nimport { Logger } from \"@itwin/core-bentley\";\n\nconst loggerCategory = \"MapLayersFormats.GeometryTerrainDraper\";\n\n/** A TileGeometryCollector that restricts collection to tiles that overlap a line string.\n/* @internal\n*/\nclass LineSegmentCollector extends TileGeometryCollector {\n private _points: GrowableXYZArray;\n\n constructor(user: TileUser, chordTolerance: number, range: Range3d, transform: Transform, points: GrowableXYZArray) {\n super({ user, chordTolerance, range, transform });\n this._points = points;\n }\n\n public override addMissingTile(tile: Tile): void {\n Logger.logTrace(loggerCategory, `CollectorAdd missing tile: ${tile.contentId}`);\n super.addMissingTile(tile);\n }\n\n public override collectTile(tile: Tile): CollectTileStatus {\n let status = super.collectTile(tile);\n\n if (\"reject\" !== status && !this.rangeOverlapsLineString(tile.range)) {\n status = \"reject\";\n }\n\n Logger.logTrace(loggerCategory, `collectTile - tile: ${tile.contentId} status: ${status} isReady: ${tile.isReady} status:${tile.loadStatus}`);\n return status;\n }\n\n private rangeOverlapsLineString(range: Range3d) {\n let inside = false;\n const clipper = ConvexClipPlaneSet.createRange3dPlanes(range, true, true, true, true, false, false);\n if (this._options.transform)\n clipper.transformInPlace(this._options.transform);\n\n for (let i = 0; i < this._points.length - 1 && !inside; i++)\n inside = clipper.announceClippedSegmentIntervals(0, 1, this._points.getPoint3dAtUncheckedPointIndex(i), this._points.getPoint3dAtUncheckedPointIndex(i + 1));\n\n return inside;\n }\n}\n\n/** @internal */\nexport class GeometryTerrainDraper implements TileUser {\n // The side angle measures how close the sweep vector is from being parallel to a side face.\n // The larger the angle, the more nearly vertical facets are ignored.\n // This is an \"empirical\" value that was determined by looking at \"problematic\" polyfaces\n public readonly sideAngle = Angle.createDegrees(0.06);\n\n public readonly maxDistanceZ = 1.0E5; // Expand the Z Range, but not so much that we get opposite side of globe.\n public readonly tileUserId: number;\n\n public constructor(public readonly viewport: Viewport, public readonly treeRef: GeometryTileTreeReference) {\n this.tileUserId = TileUser.generateId();\n IModelApp.tileAdmin.registerUser(this);\n }\n\n public [Symbol.dispose](): void {\n IModelApp.tileAdmin.forgetUser(this);\n }\n\n public get iModel() { return this.viewport.iModel; }\n\n public onRequestStateChanged() {\n this.viewport.invalidateDecorations();\n }\n\n public discloseTileTrees(trees: DisclosedTileTreeSet) {\n trees.disclose(this.treeRef);\n }\n\n // Filter out non-top facets:\n // For unknown reasons, there are \"perpendicular\" facets appearing in the terrain meshes.\n public getMeshTopFacets(mesh: IndexedPolyface) {\n // constant inputs\n const sweepVector = Vector3d.unitZ();\n // i.e., region is horizontal\n // create subset visitor from the top facets\n const topFacets: number[] = [];\n const facetNormal = Vector3d.createZero();\n\n for (const visitor = mesh.createVisitor(0); visitor.moveToNextFacet();) {\n if (PolygonOps.unitNormal(visitor.point, facetNormal)) {\n const theta = facetNormal.angleFromPerpendicular(sweepVector);\n if (!theta.isMagnitudeLessThanOrEqual(this.sideAngle)) { // skip side facet\n if (facetNormal.dotProduct(sweepVector) > 0) // this is a top facet\n topFacets.push(visitor.currentReadIndex());\n }\n }\n }\n\n return IndexedPolyfaceSubsetVisitor.createSubsetVisitor(mesh, topFacets, 0);\n }\n\n public drapeLineString(outStrings: CurvePrimitive[], inPoints: GrowableXYZArray, tolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const collector = new LineSegmentCollector(this, tolerance, expandedRange, tree.iModelTransform, inPoints);\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n\n for (const polyface of collector.polyfaces) {\n // Use this to serialize (problematic) polyface\n // console.log (`const polyface = ${JSON.stringify(IModelJson.Writer.toIModelJson(polyface))}`);\n outStrings.push(...PolyfaceQuery.sweepLineStringToFacets(\n inPoints,\n polyface,\n SweepLineStringToFacetsOptions.create(Vector3d.unitZ(), this.sideAngle, true, true, false, false)));\n }\n\n return \"complete\";\n }\n\n return \"loading\";\n }\n\n public drapeLoop(outMeshes: Polyface[], loop: Loop, tolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const strokes = loop.getPackedStrokes();\n if (!strokes)\n return \"complete\";\n\n const collector = new LineSegmentCollector(this, tolerance, expandedRange, tree.iModelTransform, strokes);\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n for (const polyface of collector.polyfaces) {\n const topFacets = this.getMeshTopFacets(polyface);\n const mesh = PolyfaceClip.drapeRegion(topFacets, loop);\n if (mesh)\n outMeshes.push(mesh);\n }\n return \"complete\";\n }\n return \"loading\";\n }\n public drapePoint(outPoint: Point3d, point: Point3d, chordTolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const collector = new TileGeometryCollector({ chordTolerance, range: expandedRange, user: this });\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n for (const polyface of collector.polyfaces) {\n // Im assuming a single polyface here since we are draping a single point\n const facetLocation = PolyfaceQuery.intersectRay3d(polyface, Ray3d.create(point, Vector3d.unitZ()));\n if (!facetLocation)\n continue;\n outPoint.setFromPoint3d(facetLocation.point);\n }\n return \"complete\";\n }\n return \"loading\";\n }\n}\n"]}
@@ -127,7 +127,7 @@ export class MapFeatureInfoDecorator {
127
127
  }
128
128
  if (this._draper) {
129
129
  // Dispose draper every time?
130
- this._draper.dispose();
130
+ this._draper[Symbol.dispose]();
131
131
  this._draper = undefined;
132
132
  }
133
133
  };
@@ -1 +1 @@
1
- {"version":3,"file":"MapFeatureInfoDecorator.js","sourceRoot":"","sources":["../../../src/Tools/MapFeatureInfoDecorator.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*--------------------------------------------------------------------------------------------*/\nimport { Base64EncodedString, ColorDef } from \"@itwin/core-common\";\nimport {\n BeButtonEvent, Cluster, DecorateContext, Decorator,\n GeometryTileTreeReference, GraphicBuilder, GraphicPrimitive, GraphicType, IModelApp, MapTileTreeReference, Marker, MarkerImage, MarkerSet,\n ScreenViewport,\n TileTreeReference, Viewport } from \"@itwin/core-frontend\";\nimport { GrowableXYZArray, LineString3d, Point2d, Point3d, Polyface, Range3d, Transform, XAndY, XYAndZ } from \"@itwin/core-geometry\";\nimport { MapFeatureInfoToolData } from \"./MapFeatureInfoTool\";\nimport { GeometryTerrainDraper } from \"./GeometryTerrainDraper\";\nimport { Logger } from \"@itwin/core-bentley\";\nconst loggerCategory = \"MapLayersFormats.MapFeatureInfoDecorator\";\n\n/** @internal */\nclass PinMarker extends Marker {\n public constructor(worldLocation: XYAndZ, size: XAndY, image: MarkerImage) {\n super(worldLocation, size);\n this.image = image;\n this.imageOffset = new Point3d(0, Math.floor(size.y * .5));\n }\n}\n\n/** @internal */\nclass PinMarkerCluster extends Marker {\n /** Create a new cluster marker */\n constructor(location: XYAndZ, size: XAndY, cluster: Cluster<PinMarker>, image: MarkerImage | Promise<MarkerImage> | undefined) {\n super(location, size);\n\n this.title = IModelApp.localization.getLocalizedString(\"mapLayersFormats:Messages.MapFeatureInfoDecorator.clusterZoomIn\", { nbInstances: cluster.markers.length});\n\n this.imageOffset = new Point3d(0, size.y * 0.5);\n this.label = cluster.markers.length.toLocaleString();\n this.labelColor = \"black\";\n this.labelFont = \"bold 14px sans-serif\";\n\n if (image)\n this.setImage(image);\n }\n\n /** Show the cluster as a white circle with an outline */\n public override drawFunc(ctx: CanvasRenderingContext2D): void {\n ctx.beginPath();\n ctx.strokeStyle = \"#372528\";\n ctx.fillStyle = \"white\";\n ctx.lineWidth = 5;\n ctx.arc(0, 0, this.size.x * 0.5, 0, Math.PI * 2);\n ctx.fill();\n ctx.stroke();\n }\n\n public override onMouseButton(_ev: BeButtonEvent): boolean { return true; } // Don't allow clicks to be sent to active tool...\n}\n\n/** @internal */\nclass PinMarkerSet extends MarkerSet<PinMarker> {\n protected getClusterMarker(cluster: Cluster<PinMarker>): Marker {\n // No image passed to the cluster, we prefer to have the circle only\n return new PinMarkerCluster(cluster.getClusterLocation(), cluster.markers[0].size, cluster, undefined);\n }\n}\n\ninterface DrapeGraphicState {\n graphic: GraphicPrimitive;\n collectorState: string;\n chordTolerance: number;\n range: Range3d;\n}\n\nclass DrapedPrimitives {\n private _strings?: LineString3d[];\n private _meshes?: Polyface[];\n private _points = new GrowableXYZArray();\n\n public get strings() {\n return this._strings;\n }\n\n public get meshes() {\n return this._meshes;\n }\n\n public get points() {\n return this._points;\n }\n\n public clear() {\n this._strings = undefined;\n this._meshes = undefined;\n this._points.clear();\n }\n\n public addStrings(drapedStrings: LineString3d[]) {\n if (!this._strings) {\n this._strings = [];\n }\n for (const ds of drapedStrings)\n this._strings.push(ds);\n }\n\n public addMeshes(drapedMeshes: Polyface[]) {\n if (!this._meshes)\n this._meshes = [];\n drapedMeshes.forEach((ds) => this._meshes!.push(ds));\n }\n}\n\n/** @internal */\nexport class MapFeatureInfoDecorator implements Decorator {\n public hidden = false;\n public readonly useCachedDecorations = true;\n public readonly disableTerrainDraper = false;\n public markerSize = new Point2d(32, 32);\n public lineWidth = 3;\n\n // This is the maximum allowed size of a geometry, in pixels, to be draped.\n // If the value is too large, we will end up downloading tons of terrain tiles, and possibly hang for too long.\n public maxDrapeSizePixels = 50000;\n\n // This value controls the chord tolerance used to collect terrain tiles\n // at the \"right\" resolution. Higher values, will give coarser terrain tiles.\n public chordTolerancePixels = 20;\n\n private _highlightColor = ColorDef.from(0, 255, 255, 127);\n public get highlightColor() { return this._highlightColor;}\n public set highlightColor(color: ColorDef) {\n this.updateMarkerImage();\n this._highlightColor = color;\n }\n\n public get defaultMarkerIconSvgXml() { return `<svg class=\"indicator\" viewBox=\"0 0 22 22\" width=\"22\" height=\"22\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m11 0a7.44506 7.44506 0 0 0 -7.5 7.2875c0 1.65 1.132 4.2625 3.25477 8.1125 1.55652 2.75 4.24523 6.6 4.24523 6.6s2.68865-3.9875 4.24528-6.7375c2.12272-3.85 3.25472-6.4625 3.25472-8.1125a7.4215 7.4215 0 0 0 -7.5-7.15z\" fill=\"black\"/><path d=\"m11 1.01715a6.46476 6.46476 0 0 0 -6.48285 6.27033c0 1.72619 1.67181 4.97973 3.12836 7.62139.97564 1.7237 2.42828 3.92176 3.34118 5.27161.91413-1.39148 2.385-3.673 3.37336-5.41907 1.451-2.63171 3.1228-5.88525 3.1228-7.61139a6.39982 6.39982 0 0 0 -6.48285-6.13287zm.00183 8.98285a3 3 0 1 1 3-3 3 3 0 0 1 -3 3z\" fill=\"${this.highlightColor.toRgbString()}\"/></svg>`; }\n\n private _scratchPoints = new GrowableXYZArray();\n\n private _drapeGraphicsStates: DrapeGraphicState[] = [];\n private _drapedPrimitives = new DrapedPrimitives();\n private _allGeomDraped = false;\n private _draper?: GeometryTerrainDraper;\n private _markerImage: HTMLImageElement;\n private _markerSet = new PinMarkerSet();\n\n // Extra markers can be added outside the normal state\n public extraMarkers: Point3d[]|undefined;\n\n private _data: MapFeatureInfoToolData | undefined;\n\n private readonly _graphicType = GraphicType.WorldOverlay;\n\n public constructor() {\n this._markerImage = new Image();\n this.updateMarkerImage();\n }\n\n private updateMarkerImage() {\n const base64 = Base64EncodedString.encode(this.defaultMarkerIconSvgXml);\n this._markerImage.src = `data:image/svg+xml;base64,${base64}`;\n }\n\n private computePixelSize(viewport: Viewport, applyAspectRatioSkew: boolean, pointWorld: Point3d) {\n let pixelSize = 1;\n // Compute the horizontal distance in meters between two adjacent pixels at the center of the geometry.\n pixelSize = viewport.getPixelSizeAtPoint(pointWorld);\n pixelSize = viewport.target.adjustPixelSizeForLOD(pixelSize);\n\n // Aspect ratio skew > 1.0 stretches the view in Y. In that case use the smaller vertical pixel distance for our stroke tolerance.\n const skew = applyAspectRatioSkew ? viewport.view.getAspectRatioSkew() : 0;\n if (skew > 1)\n pixelSize /= skew;\n return pixelSize * 0.25;\n }\n\n private computeChordTolerance(viewport: Viewport, drapeRange: Range3d) {\n const drapeSizeWorld = Math.max(drapeRange.xLength(), drapeRange.yLength());\n const pixelSize = this.computePixelSize(viewport, true, drapeRange.center);\n const maxDrapeRangeSizeRatio = this.maxDrapeSizePixels / (drapeSizeWorld / pixelSize);\n if (maxDrapeRangeSizeRatio < 1) {\n Logger.logWarning(loggerCategory, \"Element too large; chord tolerance was adjusted\");\n return (pixelSize / maxDrapeRangeSizeRatio)*this.chordTolerancePixels;\n }\n return pixelSize*this.chordTolerancePixels;\n };\n\n public clearData = () => {\n this._data = undefined;\n };\n\n public setData = (data: MapFeatureInfoToolData) => {\n\n this._drapedPrimitives.clear();\n this._allGeomDraped = false;\n this.hidden = false;\n\n this._data = data;\n IModelApp.viewManager.invalidateCachedDecorationsAllViews(this);\n\n this._drapeGraphicsStates = [];\n\n if (!this.disableTerrainDraper && this._data.mapInfo?.layerInfos && data.hit.viewport.displayStyle.displayTerrain) {\n\n if (data.hit?.modelId) {\n const drapeTreeRef = this.getGeometryTreeRef(data.hit.viewport);\n if (drapeTreeRef) {\n this._draper = new GeometryTerrainDraper(data.hit.viewport, drapeTreeRef);\n return;\n }\n }\n }\n\n if (this._draper) {\n // Dispose draper every time?\n this._draper.dispose();\n this._draper = undefined;\n }\n };\n\n private getGeometryTreeRef(vp: Viewport): GeometryTileTreeReference | undefined {\n let treeRef: GeometryTileTreeReference | undefined;\n if (vp.backgroundMapSettings.applyTerrain) {\n vp.forEachMapTreeRef((ref: TileTreeReference) => {\n if (!treeRef && ref instanceof MapTileTreeReference) {\n treeRef = ref.createGeometryTreeReference();\n }\n });\n }\n\n return treeRef;\n }\n\n protected renderGraphics(context: DecorateContext) {\n this._markerSet.markers.clear();\n\n if (this._data?.mapInfo?.layerInfos === undefined || this.hidden) {\n return undefined;\n }\n\n let transform: Transform|undefined;\n const groundBias = context.viewport.displayStyle.backgroundMapSettings.groundBias;\n if (groundBias !== 0) {\n transform = Transform.createTranslationXYZ(0, 0 , groundBias);\n }\n const builder = context.createGraphicBuilder(this._graphicType, transform);\n\n if (this._draper) {\n this.initializeDrapeState(context.viewport);\n\n // We need to call drapeGeometries() until it returns true (i.e. fully complete)\n if (!this._allGeomDraped) {\n if (!this.drapeGeometries(context.viewport))\n return undefined;\n }\n\n this.appendDrapedGeometries(builder);\n } else {\n // Append geometries straight from the state to the builder\n this.appendGeometries(builder);\n }\n\n // Add extra markers if any specified\n if ( this.extraMarkers !== undefined) {\n this.extraMarkers.forEach((markerPoint)=> {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._markerSet.markers.add(new PinMarker(markerPoint, this.markerSize, this._markerImage));\n });\n }\n\n return builder.finish();\n }\n\n // Iterates the mapfeatureinfo data and create a draping state for each entry\n private initializeDrapeState(viewport: ScreenViewport) {\n if (this._drapeGraphicsStates.length === 0) {\n const getGraphicRange = (graphic: GraphicPrimitive) => {\n if (graphic.type === \"linestring\")\n return Range3d.createArray(graphic.points);\n else if (graphic.type === \"loop\")\n return graphic.loop.range();\n else if (graphic.type === \"pointstring\")\n return Range3d.createArray(graphic.points);\n else\n return Range3d.createNull();\n };\n\n for (const layerInfo of this._data?.mapInfo?.layerInfos??[]) {\n for (const subLayerInfo of layerInfo?.subLayerInfos??[]) {\n for (const feature of subLayerInfo.features) {\n\n feature.geometries?.forEach(((geom)=> {\n const range = getGraphicRange(geom.graphic);\n this._drapeGraphicsStates.push({\n graphic: geom.graphic,\n collectorState: \"loading\",\n chordTolerance: this.computeChordTolerance(viewport, range),\n range,\n });\n } ));\n }\n }\n }\n }\n }\n\n // returns true when all geometries are fully draped; otherwise false\n private drapeGeometries(_viewport: ScreenViewport): boolean {\n if (!this._draper)\n return false;\n\n let hasMissingDrapeGeoms = false;\n for (const state of this._drapeGraphicsStates) {\n if (state.collectorState === \"loading\") {\n this._scratchPoints.clear();\n\n if (state.graphic.type === \"linestring\") {\n this._scratchPoints.pushAll(state.graphic.points);\n const drapedStrings: LineString3d[] = [];\n if (\"loading\" === this._draper.drapeLineString(drapedStrings, this._scratchPoints, state.chordTolerance, state.range)) {\n hasMissingDrapeGeoms = true;\n break;\n } else {\n this._drapedPrimitives.addStrings(drapedStrings);\n state.collectorState = \"complete\";\n }\n } else if (state.graphic.type === \"loop\") {\n const loop = state.graphic.loop;\n const outMeshes: Polyface[] = [];\n if (\"loading\" === this._draper.drapeLoop(outMeshes, loop, state.chordTolerance, state.range)) {\n hasMissingDrapeGeoms = true;\n break; // We drape each graphic sequentially, otherwise collector get messed up.\n } else {\n this._drapedPrimitives.addMeshes(outMeshes);\n state.collectorState = \"complete\";\n }\n } else if (state.graphic.type === \"pointstring\") {\n const outPoint = Point3d.createZero();\n for (const point of state.graphic.points) {\n if (\"loading\" === this._draper.drapePoint(outPoint, point, state.chordTolerance, state.range)) {\n this._allGeomDraped = false;\n return false;\n } else if (!outPoint.isZero) {\n this._drapedPrimitives.points.push(outPoint);\n }\n }\n }\n }\n }\n\n this._allGeomDraped = !hasMissingDrapeGeoms;\n return this._allGeomDraped;\n }\n\n private appendDrapedGeometries(builder: GraphicBuilder) {\n if (this._drapedPrimitives.strings) {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._drapedPrimitives.strings.forEach((line) => builder.addLineString(line.points));\n }\n\n if (this._drapedPrimitives.meshes) {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._drapedPrimitives.meshes.forEach((polyface) => builder.addPolyface(polyface, true));\n }\n\n if (this._drapedPrimitives.points.length > 0) {\n for (let i = 0; i < this._drapedPrimitives.points.length; i++) {\n this._markerSet.markers.add(new PinMarker(this._drapedPrimitives.points.getPoint3dAtUncheckedPointIndex(i), this.markerSize, this._markerImage));\n }\n }\n }\n\n private appendGeometries(builder: GraphicBuilder) {\n if (!this._data?.mapInfo?.layerInfos)\n return;\n\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n for (const layerInfo of this._data.mapInfo.layerInfos) {\n if (layerInfo.subLayerInfos && !(layerInfo.subLayerInfos instanceof HTMLElement)) {\n for (const subLayerInfo of layerInfo.subLayerInfos) {\n for (const feature of subLayerInfo.features) {\n if (feature.geometries) {\n for (const geom of feature.geometries) {\n if (geom.graphic.type === \"pointstring\") {\n for (const point of geom.graphic.points)\n this._markerSet.markers.add(new PinMarker(point, this.markerSize, this._markerImage));\n } else {\n builder.addPrimitive(geom.graphic);\n }\n\n }\n }\n }\n }\n\n }\n\n }\n }\n\n public decorate(context: DecorateContext): void {\n const graphics = this.renderGraphics(context);\n if (graphics) {\n context.addDecoration(this._graphicType, graphics);\n IModelApp.toolAdmin.setCursor(undefined);\n }\n\n this._markerSet.addDecoration(context);\n return;\n }\n}\n"]}
1
+ {"version":3,"file":"MapFeatureInfoDecorator.js","sourceRoot":"","sources":["../../../src/Tools/MapFeatureInfoDecorator.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*--------------------------------------------------------------------------------------------*/\nimport { Base64EncodedString, ColorDef } from \"@itwin/core-common\";\nimport {\n BeButtonEvent, Cluster, DecorateContext, Decorator,\n GeometryTileTreeReference, GraphicBuilder, GraphicPrimitive, GraphicType, IModelApp, MapTileTreeReference, Marker, MarkerImage, MarkerSet,\n ScreenViewport,\n TileTreeReference, Viewport } from \"@itwin/core-frontend\";\nimport { GrowableXYZArray, LineString3d, Point2d, Point3d, Polyface, Range3d, Transform, XAndY, XYAndZ } from \"@itwin/core-geometry\";\nimport { MapFeatureInfoToolData } from \"./MapFeatureInfoTool\";\nimport { GeometryTerrainDraper } from \"./GeometryTerrainDraper\";\nimport { Logger } from \"@itwin/core-bentley\";\nconst loggerCategory = \"MapLayersFormats.MapFeatureInfoDecorator\";\n\n/** @internal */\nclass PinMarker extends Marker {\n public constructor(worldLocation: XYAndZ, size: XAndY, image: MarkerImage) {\n super(worldLocation, size);\n this.image = image;\n this.imageOffset = new Point3d(0, Math.floor(size.y * .5));\n }\n}\n\n/** @internal */\nclass PinMarkerCluster extends Marker {\n /** Create a new cluster marker */\n constructor(location: XYAndZ, size: XAndY, cluster: Cluster<PinMarker>, image: MarkerImage | Promise<MarkerImage> | undefined) {\n super(location, size);\n\n this.title = IModelApp.localization.getLocalizedString(\"mapLayersFormats:Messages.MapFeatureInfoDecorator.clusterZoomIn\", { nbInstances: cluster.markers.length});\n\n this.imageOffset = new Point3d(0, size.y * 0.5);\n this.label = cluster.markers.length.toLocaleString();\n this.labelColor = \"black\";\n this.labelFont = \"bold 14px sans-serif\";\n\n if (image)\n this.setImage(image);\n }\n\n /** Show the cluster as a white circle with an outline */\n public override drawFunc(ctx: CanvasRenderingContext2D): void {\n ctx.beginPath();\n ctx.strokeStyle = \"#372528\";\n ctx.fillStyle = \"white\";\n ctx.lineWidth = 5;\n ctx.arc(0, 0, this.size.x * 0.5, 0, Math.PI * 2);\n ctx.fill();\n ctx.stroke();\n }\n\n public override onMouseButton(_ev: BeButtonEvent): boolean { return true; } // Don't allow clicks to be sent to active tool...\n}\n\n/** @internal */\nclass PinMarkerSet extends MarkerSet<PinMarker> {\n protected getClusterMarker(cluster: Cluster<PinMarker>): Marker {\n // No image passed to the cluster, we prefer to have the circle only\n return new PinMarkerCluster(cluster.getClusterLocation(), cluster.markers[0].size, cluster, undefined);\n }\n}\n\ninterface DrapeGraphicState {\n graphic: GraphicPrimitive;\n collectorState: string;\n chordTolerance: number;\n range: Range3d;\n}\n\nclass DrapedPrimitives {\n private _strings?: LineString3d[];\n private _meshes?: Polyface[];\n private _points = new GrowableXYZArray();\n\n public get strings() {\n return this._strings;\n }\n\n public get meshes() {\n return this._meshes;\n }\n\n public get points() {\n return this._points;\n }\n\n public clear() {\n this._strings = undefined;\n this._meshes = undefined;\n this._points.clear();\n }\n\n public addStrings(drapedStrings: LineString3d[]) {\n if (!this._strings) {\n this._strings = [];\n }\n for (const ds of drapedStrings)\n this._strings.push(ds);\n }\n\n public addMeshes(drapedMeshes: Polyface[]) {\n if (!this._meshes)\n this._meshes = [];\n drapedMeshes.forEach((ds) => this._meshes!.push(ds));\n }\n}\n\n/** @internal */\nexport class MapFeatureInfoDecorator implements Decorator {\n public hidden = false;\n public readonly useCachedDecorations = true;\n public readonly disableTerrainDraper = false;\n public markerSize = new Point2d(32, 32);\n public lineWidth = 3;\n\n // This is the maximum allowed size of a geometry, in pixels, to be draped.\n // If the value is too large, we will end up downloading tons of terrain tiles, and possibly hang for too long.\n public maxDrapeSizePixels = 50000;\n\n // This value controls the chord tolerance used to collect terrain tiles\n // at the \"right\" resolution. Higher values, will give coarser terrain tiles.\n public chordTolerancePixels = 20;\n\n private _highlightColor = ColorDef.from(0, 255, 255, 127);\n public get highlightColor() { return this._highlightColor;}\n public set highlightColor(color: ColorDef) {\n this.updateMarkerImage();\n this._highlightColor = color;\n }\n\n public get defaultMarkerIconSvgXml() { return `<svg class=\"indicator\" viewBox=\"0 0 22 22\" width=\"22\" height=\"22\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m11 0a7.44506 7.44506 0 0 0 -7.5 7.2875c0 1.65 1.132 4.2625 3.25477 8.1125 1.55652 2.75 4.24523 6.6 4.24523 6.6s2.68865-3.9875 4.24528-6.7375c2.12272-3.85 3.25472-6.4625 3.25472-8.1125a7.4215 7.4215 0 0 0 -7.5-7.15z\" fill=\"black\"/><path d=\"m11 1.01715a6.46476 6.46476 0 0 0 -6.48285 6.27033c0 1.72619 1.67181 4.97973 3.12836 7.62139.97564 1.7237 2.42828 3.92176 3.34118 5.27161.91413-1.39148 2.385-3.673 3.37336-5.41907 1.451-2.63171 3.1228-5.88525 3.1228-7.61139a6.39982 6.39982 0 0 0 -6.48285-6.13287zm.00183 8.98285a3 3 0 1 1 3-3 3 3 0 0 1 -3 3z\" fill=\"${this.highlightColor.toRgbString()}\"/></svg>`; }\n\n private _scratchPoints = new GrowableXYZArray();\n\n private _drapeGraphicsStates: DrapeGraphicState[] = [];\n private _drapedPrimitives = new DrapedPrimitives();\n private _allGeomDraped = false;\n private _draper?: GeometryTerrainDraper;\n private _markerImage: HTMLImageElement;\n private _markerSet = new PinMarkerSet();\n\n // Extra markers can be added outside the normal state\n public extraMarkers: Point3d[]|undefined;\n\n private _data: MapFeatureInfoToolData | undefined;\n\n private readonly _graphicType = GraphicType.WorldOverlay;\n\n public constructor() {\n this._markerImage = new Image();\n this.updateMarkerImage();\n }\n\n private updateMarkerImage() {\n const base64 = Base64EncodedString.encode(this.defaultMarkerIconSvgXml);\n this._markerImage.src = `data:image/svg+xml;base64,${base64}`;\n }\n\n private computePixelSize(viewport: Viewport, applyAspectRatioSkew: boolean, pointWorld: Point3d) {\n let pixelSize = 1;\n // Compute the horizontal distance in meters between two adjacent pixels at the center of the geometry.\n pixelSize = viewport.getPixelSizeAtPoint(pointWorld);\n pixelSize = viewport.target.adjustPixelSizeForLOD(pixelSize);\n\n // Aspect ratio skew > 1.0 stretches the view in Y. In that case use the smaller vertical pixel distance for our stroke tolerance.\n const skew = applyAspectRatioSkew ? viewport.view.getAspectRatioSkew() : 0;\n if (skew > 1)\n pixelSize /= skew;\n return pixelSize * 0.25;\n }\n\n private computeChordTolerance(viewport: Viewport, drapeRange: Range3d) {\n const drapeSizeWorld = Math.max(drapeRange.xLength(), drapeRange.yLength());\n const pixelSize = this.computePixelSize(viewport, true, drapeRange.center);\n const maxDrapeRangeSizeRatio = this.maxDrapeSizePixels / (drapeSizeWorld / pixelSize);\n if (maxDrapeRangeSizeRatio < 1) {\n Logger.logWarning(loggerCategory, \"Element too large; chord tolerance was adjusted\");\n return (pixelSize / maxDrapeRangeSizeRatio)*this.chordTolerancePixels;\n }\n return pixelSize*this.chordTolerancePixels;\n };\n\n public clearData = () => {\n this._data = undefined;\n };\n\n public setData = (data: MapFeatureInfoToolData) => {\n\n this._drapedPrimitives.clear();\n this._allGeomDraped = false;\n this.hidden = false;\n\n this._data = data;\n IModelApp.viewManager.invalidateCachedDecorationsAllViews(this);\n\n this._drapeGraphicsStates = [];\n\n if (!this.disableTerrainDraper && this._data.mapInfo?.layerInfos && data.hit.viewport.displayStyle.displayTerrain) {\n\n if (data.hit?.modelId) {\n const drapeTreeRef = this.getGeometryTreeRef(data.hit.viewport);\n if (drapeTreeRef) {\n this._draper = new GeometryTerrainDraper(data.hit.viewport, drapeTreeRef);\n return;\n }\n }\n }\n\n if (this._draper) {\n // Dispose draper every time?\n this._draper[Symbol.dispose]();\n this._draper = undefined;\n }\n };\n\n private getGeometryTreeRef(vp: Viewport): GeometryTileTreeReference | undefined {\n let treeRef: GeometryTileTreeReference | undefined;\n if (vp.backgroundMapSettings.applyTerrain) {\n vp.forEachMapTreeRef((ref: TileTreeReference) => {\n if (!treeRef && ref instanceof MapTileTreeReference) {\n treeRef = ref.createGeometryTreeReference();\n }\n });\n }\n\n return treeRef;\n }\n\n protected renderGraphics(context: DecorateContext) {\n this._markerSet.markers.clear();\n\n if (this._data?.mapInfo?.layerInfos === undefined || this.hidden) {\n return undefined;\n }\n\n let transform: Transform|undefined;\n const groundBias = context.viewport.displayStyle.backgroundMapSettings.groundBias;\n if (groundBias !== 0) {\n transform = Transform.createTranslationXYZ(0, 0 , groundBias);\n }\n const builder = context.createGraphicBuilder(this._graphicType, transform);\n\n if (this._draper) {\n this.initializeDrapeState(context.viewport);\n\n // We need to call drapeGeometries() until it returns true (i.e. fully complete)\n if (!this._allGeomDraped) {\n if (!this.drapeGeometries(context.viewport))\n return undefined;\n }\n\n this.appendDrapedGeometries(builder);\n } else {\n // Append geometries straight from the state to the builder\n this.appendGeometries(builder);\n }\n\n // Add extra markers if any specified\n if ( this.extraMarkers !== undefined) {\n this.extraMarkers.forEach((markerPoint)=> {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._markerSet.markers.add(new PinMarker(markerPoint, this.markerSize, this._markerImage));\n });\n }\n\n return builder.finish();\n }\n\n // Iterates the mapfeatureinfo data and create a draping state for each entry\n private initializeDrapeState(viewport: ScreenViewport) {\n if (this._drapeGraphicsStates.length === 0) {\n const getGraphicRange = (graphic: GraphicPrimitive) => {\n if (graphic.type === \"linestring\")\n return Range3d.createArray(graphic.points);\n else if (graphic.type === \"loop\")\n return graphic.loop.range();\n else if (graphic.type === \"pointstring\")\n return Range3d.createArray(graphic.points);\n else\n return Range3d.createNull();\n };\n\n for (const layerInfo of this._data?.mapInfo?.layerInfos??[]) {\n for (const subLayerInfo of layerInfo?.subLayerInfos??[]) {\n for (const feature of subLayerInfo.features) {\n\n feature.geometries?.forEach(((geom)=> {\n const range = getGraphicRange(geom.graphic);\n this._drapeGraphicsStates.push({\n graphic: geom.graphic,\n collectorState: \"loading\",\n chordTolerance: this.computeChordTolerance(viewport, range),\n range,\n });\n } ));\n }\n }\n }\n }\n }\n\n // returns true when all geometries are fully draped; otherwise false\n private drapeGeometries(_viewport: ScreenViewport): boolean {\n if (!this._draper)\n return false;\n\n let hasMissingDrapeGeoms = false;\n for (const state of this._drapeGraphicsStates) {\n if (state.collectorState === \"loading\") {\n this._scratchPoints.clear();\n\n if (state.graphic.type === \"linestring\") {\n this._scratchPoints.pushAll(state.graphic.points);\n const drapedStrings: LineString3d[] = [];\n if (\"loading\" === this._draper.drapeLineString(drapedStrings, this._scratchPoints, state.chordTolerance, state.range)) {\n hasMissingDrapeGeoms = true;\n break;\n } else {\n this._drapedPrimitives.addStrings(drapedStrings);\n state.collectorState = \"complete\";\n }\n } else if (state.graphic.type === \"loop\") {\n const loop = state.graphic.loop;\n const outMeshes: Polyface[] = [];\n if (\"loading\" === this._draper.drapeLoop(outMeshes, loop, state.chordTolerance, state.range)) {\n hasMissingDrapeGeoms = true;\n break; // We drape each graphic sequentially, otherwise collector get messed up.\n } else {\n this._drapedPrimitives.addMeshes(outMeshes);\n state.collectorState = \"complete\";\n }\n } else if (state.graphic.type === \"pointstring\") {\n const outPoint = Point3d.createZero();\n for (const point of state.graphic.points) {\n if (\"loading\" === this._draper.drapePoint(outPoint, point, state.chordTolerance, state.range)) {\n this._allGeomDraped = false;\n return false;\n } else if (!outPoint.isZero) {\n this._drapedPrimitives.points.push(outPoint);\n }\n }\n }\n }\n }\n\n this._allGeomDraped = !hasMissingDrapeGeoms;\n return this._allGeomDraped;\n }\n\n private appendDrapedGeometries(builder: GraphicBuilder) {\n if (this._drapedPrimitives.strings) {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._drapedPrimitives.strings.forEach((line) => builder.addLineString(line.points));\n }\n\n if (this._drapedPrimitives.meshes) {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._drapedPrimitives.meshes.forEach((polyface) => builder.addPolyface(polyface, true));\n }\n\n if (this._drapedPrimitives.points.length > 0) {\n for (let i = 0; i < this._drapedPrimitives.points.length; i++) {\n this._markerSet.markers.add(new PinMarker(this._drapedPrimitives.points.getPoint3dAtUncheckedPointIndex(i), this.markerSize, this._markerImage));\n }\n }\n }\n\n private appendGeometries(builder: GraphicBuilder) {\n if (!this._data?.mapInfo?.layerInfos)\n return;\n\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n for (const layerInfo of this._data.mapInfo.layerInfos) {\n if (layerInfo.subLayerInfos && !(layerInfo.subLayerInfos instanceof HTMLElement)) {\n for (const subLayerInfo of layerInfo.subLayerInfos) {\n for (const feature of subLayerInfo.features) {\n if (feature.geometries) {\n for (const geom of feature.geometries) {\n if (geom.graphic.type === \"pointstring\") {\n for (const point of geom.graphic.points)\n this._markerSet.markers.add(new PinMarker(point, this.markerSize, this._markerImage));\n } else {\n builder.addPrimitive(geom.graphic);\n }\n\n }\n }\n }\n }\n\n }\n\n }\n }\n\n public decorate(context: DecorateContext): void {\n const graphics = this.renderGraphics(context);\n if (graphics) {\n context.addDecoration(this._graphicType, graphics);\n IModelApp.toolAdmin.setCursor(undefined);\n }\n\n this._markerSet.addDecoration(context);\n return;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/map-layers-formats",
3
- "version": "5.0.0-dev.40",
3
+ "version": "5.0.0-dev.49",
4
4
  "description": "Enables additional map-layers formats in iTwin.js",
5
5
  "main": "lib/cjs/map-layers-formats.js",
6
6
  "module": "lib/esm/map-layers-formats.js",
@@ -46,19 +46,19 @@
46
46
  "typemoq": "^2.1.0",
47
47
  "typescript": "~5.6.2",
48
48
  "fetch-mock": "~11.1.3",
49
- "@itwin/appui-abstract": "5.0.0-dev.40",
50
- "@itwin/build-tools": "5.0.0-dev.40",
51
- "@itwin/core-bentley": "5.0.0-dev.40",
52
- "@itwin/core-common": "5.0.0-dev.40",
53
- "@itwin/core-geometry": "5.0.0-dev.40",
54
- "@itwin/core-frontend": "5.0.0-dev.40"
49
+ "@itwin/appui-abstract": "5.0.0-dev.49",
50
+ "@itwin/core-common": "5.0.0-dev.49",
51
+ "@itwin/core-bentley": "5.0.0-dev.49",
52
+ "@itwin/build-tools": "5.0.0-dev.49",
53
+ "@itwin/core-geometry": "5.0.0-dev.49",
54
+ "@itwin/core-frontend": "5.0.0-dev.49"
55
55
  },
56
56
  "peerDependencies": {
57
- "@itwin/core-common": "5.0.0-dev.40",
58
- "@itwin/appui-abstract": "5.0.0-dev.40",
59
- "@itwin/core-frontend": "5.0.0-dev.40",
60
- "@itwin/core-bentley": "5.0.0-dev.40",
61
- "@itwin/core-geometry": "5.0.0-dev.40"
57
+ "@itwin/core-bentley": "5.0.0-dev.49",
58
+ "@itwin/core-geometry": "5.0.0-dev.49",
59
+ "@itwin/appui-abstract": "5.0.0-dev.49",
60
+ "@itwin/core-common": "5.0.0-dev.49",
61
+ "@itwin/core-frontend": "5.0.0-dev.49"
62
62
  },
63
63
  "dependencies": {
64
64
  "google-protobuf": "~3.20.1",