@itwin/core-frontend 5.3.0 → 5.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/lib/cjs/BriefcaseConnection.d.ts.map +1 -1
  3. package/lib/cjs/BriefcaseConnection.js +1 -0
  4. package/lib/cjs/BriefcaseConnection.js.map +1 -1
  5. package/lib/cjs/SheetViewState.d.ts +7 -5
  6. package/lib/cjs/SheetViewState.d.ts.map +1 -1
  7. package/lib/cjs/SheetViewState.js +52 -683
  8. package/lib/cjs/SheetViewState.js.map +1 -1
  9. package/lib/cjs/SubCategoriesCache.d.ts +1 -0
  10. package/lib/cjs/SubCategoriesCache.d.ts.map +1 -1
  11. package/lib/cjs/SubCategoriesCache.js +40 -1
  12. package/lib/cjs/SubCategoriesCache.js.map +1 -1
  13. package/lib/cjs/internal/SheetViewAttachments.d.ts +57 -0
  14. package/lib/cjs/internal/SheetViewAttachments.d.ts.map +1 -0
  15. package/lib/cjs/internal/SheetViewAttachments.js +336 -0
  16. package/lib/cjs/internal/SheetViewAttachments.js.map +1 -0
  17. package/lib/cjs/internal/ViewAttachmentRenderer.d.ts +32 -0
  18. package/lib/cjs/internal/ViewAttachmentRenderer.d.ts.map +1 -0
  19. package/lib/cjs/internal/ViewAttachmentRenderer.js +462 -0
  20. package/lib/cjs/internal/ViewAttachmentRenderer.js.map +1 -0
  21. package/lib/cjs/internal/render/webgl/ShaderBuilder.d.ts.map +1 -1
  22. package/lib/cjs/internal/render/webgl/ShaderBuilder.js +8 -1
  23. package/lib/cjs/internal/render/webgl/ShaderBuilder.js.map +1 -1
  24. package/lib/esm/BriefcaseConnection.d.ts.map +1 -1
  25. package/lib/esm/BriefcaseConnection.js +1 -0
  26. package/lib/esm/BriefcaseConnection.js.map +1 -1
  27. package/lib/esm/SheetViewState.d.ts +7 -5
  28. package/lib/esm/SheetViewState.d.ts.map +1 -1
  29. package/lib/esm/SheetViewState.js +55 -686
  30. package/lib/esm/SheetViewState.js.map +1 -1
  31. package/lib/esm/SubCategoriesCache.d.ts +1 -0
  32. package/lib/esm/SubCategoriesCache.d.ts.map +1 -1
  33. package/lib/esm/SubCategoriesCache.js +40 -1
  34. package/lib/esm/SubCategoriesCache.js.map +1 -1
  35. package/lib/esm/internal/SheetViewAttachments.d.ts +57 -0
  36. package/lib/esm/internal/SheetViewAttachments.d.ts.map +1 -0
  37. package/lib/esm/internal/SheetViewAttachments.js +332 -0
  38. package/lib/esm/internal/SheetViewAttachments.js.map +1 -0
  39. package/lib/esm/internal/ViewAttachmentRenderer.d.ts +32 -0
  40. package/lib/esm/internal/ViewAttachmentRenderer.d.ts.map +1 -0
  41. package/lib/esm/internal/ViewAttachmentRenderer.js +459 -0
  42. package/lib/esm/internal/ViewAttachmentRenderer.js.map +1 -0
  43. package/lib/esm/internal/render/webgl/ShaderBuilder.d.ts.map +1 -1
  44. package/lib/esm/internal/render/webgl/ShaderBuilder.js +8 -1
  45. package/lib/esm/internal/render/webgl/ShaderBuilder.js.map +1 -1
  46. package/package.json +20 -20
@@ -0,0 +1,336 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ /** @packageDocumentation
7
+ * @module Views
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.SheetViewAttachments = void 0;
11
+ const core_common_1 = require("@itwin/core-common");
12
+ const core_bentley_1 = require("@itwin/core-bentley");
13
+ const IModelApp_1 = require("../IModelApp");
14
+ const ViewAttachmentRenderer_1 = require("./ViewAttachmentRenderer");
15
+ const Frustum2d_1 = require("../Frustum2d");
16
+ /** Stateless state for a sheet that has no view attachments. */
17
+ class EmptyAttachments {
18
+ // We only need one instance of this stateless class.
19
+ static _instance;
20
+ static get() {
21
+ return this._instance ?? (this._instance = new EmptyAttachments());
22
+ }
23
+ constructor() { }
24
+ clone() {
25
+ return this;
26
+ }
27
+ preload() { }
28
+ async postload() {
29
+ return this;
30
+ }
31
+ get attachmentIds() {
32
+ return [];
33
+ }
34
+ }
35
+ /** Holds the element Ids of the view attachments to be loaded for display. */
36
+ class AttachmentIds {
37
+ _ids;
38
+ constructor(ids) {
39
+ this._ids = ids;
40
+ }
41
+ get attachmentIds() {
42
+ return this._ids;
43
+ }
44
+ clone() {
45
+ return new AttachmentIds([...this._ids]);
46
+ }
47
+ preload(request) {
48
+ request.sheetViewAttachmentIds = core_bentley_1.CompressedId64Set.sortAndCompress(this._ids);
49
+ request.viewStateLoadProps = {
50
+ displayStyle: {
51
+ omitScheduleScriptElementIds: !IModelApp_1.IModelApp.tileAdmin.enableFrontendScheduleScripts,
52
+ compressExcludedElementIds: true,
53
+ },
54
+ };
55
+ }
56
+ async postload(response, iModel) {
57
+ if (undefined === response.sheetViewViews || undefined === response.sheetViewAttachmentProps) {
58
+ return this;
59
+ }
60
+ const viewStateProps = response.sheetViewViews;
61
+ const promises = [];
62
+ for (const viewProps of viewStateProps) {
63
+ const loadView = async () => {
64
+ try {
65
+ if (viewProps === undefined)
66
+ return undefined;
67
+ const view = await iModel.views.convertViewStatePropsToViewState(viewProps);
68
+ return view;
69
+ }
70
+ catch {
71
+ return undefined;
72
+ }
73
+ };
74
+ promises.push(loadView());
75
+ }
76
+ const views = await Promise.all(promises);
77
+ const attachmentProps = response.sheetViewAttachmentProps;
78
+ (0, core_bentley_1.assert)(views.length === attachmentProps.length);
79
+ const infos = [];
80
+ for (let i = 0; i < views.length; i++) {
81
+ const view = views[i];
82
+ if (view && !(view.isSheetView())) {
83
+ const props = attachmentProps[i];
84
+ props.attachedView = view;
85
+ infos.push(props);
86
+ }
87
+ }
88
+ return new AttachmentInfos(infos);
89
+ }
90
+ }
91
+ /** Fully loaded view attachments. */
92
+ class AttachmentInfos {
93
+ infos;
94
+ constructor(infos) {
95
+ this.infos = infos;
96
+ }
97
+ get attachmentIds() {
98
+ return this.infos.map((x) => (0, core_bentley_1.expectDefined)(x.id));
99
+ }
100
+ clone(iModel) {
101
+ const infos = this.infos.map((info) => {
102
+ return {
103
+ ...info,
104
+ attachedView: info.attachedView.clone(iModel),
105
+ };
106
+ });
107
+ return new AttachmentInfos(infos);
108
+ }
109
+ preload() {
110
+ // already loaded.
111
+ }
112
+ async postload() {
113
+ // already loaded.
114
+ return this;
115
+ }
116
+ }
117
+ /** Reloads the attachments after a change to the database. */
118
+ async function reloadAttachments(sheetModelId, iModel) {
119
+ const ecsql = `SELECT ECInstanceId as attachmentId FROM bis.ViewAttachment WHERE model.Id=${sheetModelId}`;
120
+ const ids = [];
121
+ for await (const row of iModel.createQueryReader(ecsql)) {
122
+ ids.push(row[0]);
123
+ }
124
+ const attachmentProps = await iModel.elements.getProps(ids);
125
+ const promises = [];
126
+ for (const attachment of attachmentProps) {
127
+ const loadView = async () => {
128
+ try {
129
+ const view = await iModel.views.load(attachment.view.id);
130
+ return view;
131
+ }
132
+ catch {
133
+ return undefined;
134
+ }
135
+ };
136
+ promises.push(loadView());
137
+ }
138
+ const views = await Promise.all(promises);
139
+ (0, core_bentley_1.assert)(views.length === attachmentProps.length);
140
+ const infos = [];
141
+ for (let i = 0; i < views.length; i++) {
142
+ const view = views[i];
143
+ if (view && !view.isSheetView()) {
144
+ const props = attachmentProps[i];
145
+ props.attachedView = view;
146
+ infos.push(props);
147
+ }
148
+ }
149
+ return new AttachmentInfos(infos);
150
+ }
151
+ function disposeRenderers(renderers) {
152
+ if (renderers) {
153
+ for (const renderer of renderers) {
154
+ renderer[Symbol.dispose]();
155
+ }
156
+ }
157
+ }
158
+ /** Manages the set of ViewAttachment elements to be rendered by a SheetViewState.
159
+ * Takes care of reloading them after ViewAttachment elements are modified, deleted, or inserted.
160
+ */
161
+ class SheetViewAttachments {
162
+ _impl;
163
+ _reload;
164
+ _maxDepth = Frustum2d_1.Frustum2d.minimumZDistance;
165
+ _rendererArgs;
166
+ _renderers;
167
+ get maxDepth() {
168
+ return this._maxDepth;
169
+ }
170
+ *getSecondaryViewports() {
171
+ if (this._renderers) {
172
+ for (const renderer of this._renderers) {
173
+ if (renderer.viewport) {
174
+ yield renderer.viewport;
175
+ }
176
+ }
177
+ }
178
+ }
179
+ constructor(impl) {
180
+ this._impl = impl;
181
+ }
182
+ [Symbol.dispose]() {
183
+ disposeRenderers(this._renderers);
184
+ this._renderers = this._rendererArgs = undefined;
185
+ this._reload = undefined;
186
+ }
187
+ static create(attachmentIds) {
188
+ const impl = attachmentIds.length === 0 ? EmptyAttachments.get() : new AttachmentIds([...attachmentIds]);
189
+ return new this(impl);
190
+ }
191
+ get attachmentIds() {
192
+ return this._impl.attachmentIds;
193
+ }
194
+ clone(iModel) {
195
+ return new SheetViewAttachments(this._impl.clone(iModel));
196
+ }
197
+ preload(request) {
198
+ this._impl.preload(request);
199
+ }
200
+ async postload(response, iModel) {
201
+ this._impl = await this._impl.postload(response, iModel);
202
+ }
203
+ async reload(sheetModelId, iModel) {
204
+ const renderers = this._renderers;
205
+ const reload = this._reload = reloadAttachments(sheetModelId, iModel);
206
+ const impl = await this._reload;
207
+ // We keep the previous renderers until reloading completes, to avoid drawing a blank view while waiting.
208
+ // Afterward, always destroy the previous renderers.
209
+ disposeRenderers(renderers);
210
+ // If reload was not called again while we waited...
211
+ if (this._reload === reload) {
212
+ this._impl = impl;
213
+ this._reload = this._renderers = undefined;
214
+ if (this._rendererArgs) {
215
+ // We are attached to a Viewport - reload the renderers.
216
+ this.loadRenderers();
217
+ }
218
+ }
219
+ }
220
+ attachToViewport(args) {
221
+ (0, core_bentley_1.assert)(undefined === this._renderers);
222
+ (0, core_bentley_1.assert)(undefined === this._rendererArgs);
223
+ this._rendererArgs = args;
224
+ this.loadRenderers();
225
+ }
226
+ detachFromViewport() {
227
+ (0, core_bentley_1.assert)(undefined !== this._rendererArgs);
228
+ this._rendererArgs = undefined;
229
+ disposeRenderers(this._renderers);
230
+ this._renderers = undefined;
231
+ }
232
+ areAllTileTreesLoaded(displayedExtents) {
233
+ if (this._reload) {
234
+ return false;
235
+ }
236
+ else if (!this._renderers) {
237
+ return true;
238
+ }
239
+ return this._renderers.every((renderer) => {
240
+ const attachmentRange = core_common_1.Placement2d.fromJSON(renderer.viewAttachmentProps.placement).calculateRange();
241
+ return !attachmentRange.intersectsRangeXY(displayedExtents) || renderer.areAllTileTreesLoaded;
242
+ });
243
+ }
244
+ discloseTileTrees(trees) {
245
+ for (const renderer of this.renderers()) {
246
+ trees.disclose(renderer);
247
+ }
248
+ }
249
+ collectStatistics(stats) {
250
+ for (const renderer of this.renderers()) {
251
+ renderer.collectStatistics(stats);
252
+ }
253
+ }
254
+ addToScene(context) {
255
+ for (const renderer of this.renderers()) {
256
+ renderer.addToScene(context);
257
+ }
258
+ }
259
+ getAttachmentViewport(args) {
260
+ const renderer = args.viewAttachmentId ? this.findRendererById(args.viewAttachmentId) : undefined;
261
+ if (!renderer) {
262
+ return undefined;
263
+ }
264
+ return args.inSectionDrawingAttachment ? renderer.viewport?.view.getAttachmentViewport({ inSectionDrawingAttachment: true }) : renderer.viewport;
265
+ }
266
+ computeDisplayTransform(args) {
267
+ const renderer = undefined !== args.viewAttachmentId ? this.findRendererById(args.viewAttachmentId) : undefined;
268
+ const ortho = renderer?.ortho;
269
+ const sheetTransform = ortho?.toSheet;
270
+ if (!sheetTransform) {
271
+ return undefined;
272
+ }
273
+ const sectionTransform = args.inSectionDrawingAttachment ? ortho.view.computeDisplayTransform(args) : undefined;
274
+ if (!sectionTransform) {
275
+ return sheetTransform.clone(args.output);
276
+ }
277
+ return sheetTransform.multiplyTransformTransform(sectionTransform, args.output);
278
+ }
279
+ /** Strictly for tests. */
280
+ areAllAttachmentsLoaded() {
281
+ return !this._reload && (!this._renderers || this._renderers.every((x) => x.areAllTileTreesLoaded));
282
+ }
283
+ /** Strictly for tests. */
284
+ get attachments() {
285
+ return this._renderers;
286
+ }
287
+ /** Strictly for tests. */
288
+ get attachmentProps() {
289
+ const infos = this._impl.infos;
290
+ if (!infos) {
291
+ return [];
292
+ }
293
+ return infos.map((x) => {
294
+ return {
295
+ ...x,
296
+ attachedView: undefined,
297
+ };
298
+ });
299
+ }
300
+ /** Strictly for tests. */
301
+ get attachmentInfos() {
302
+ const infos = this._impl.infos;
303
+ return infos ?? this._impl.attachmentIds;
304
+ }
305
+ loadRenderers() {
306
+ const args = this._rendererArgs;
307
+ (0, core_bentley_1.assert)(undefined !== args);
308
+ (0, core_bentley_1.assert)(undefined === this._renderers);
309
+ this._maxDepth = Frustum2d_1.Frustum2d.minimumZDistance;
310
+ const infos = this._impl.infos;
311
+ if (!infos) {
312
+ return;
313
+ }
314
+ this._renderers = infos.map((info) => {
315
+ const renderer = (0, ViewAttachmentRenderer_1.createViewAttachmentRenderer)({
316
+ ...args,
317
+ props: info,
318
+ view: info.attachedView,
319
+ });
320
+ this._maxDepth = Math.max(this._maxDepth, renderer.zDepth);
321
+ return renderer;
322
+ });
323
+ }
324
+ *renderers() {
325
+ if (this._renderers) {
326
+ for (const renderer of this._renderers) {
327
+ yield renderer;
328
+ }
329
+ }
330
+ }
331
+ findRendererById(id) {
332
+ return this._renderers?.find((x) => x.viewAttachmentProps.id === id);
333
+ }
334
+ }
335
+ exports.SheetViewAttachments = SheetViewAttachments;
336
+ //# sourceMappingURL=SheetViewAttachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SheetViewAttachments.js","sourceRoot":"","sources":["../../../src/internal/SheetViewAttachments.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,oDAA6I;AAE7I,sDAA2F;AAE3F,4CAAyC;AACzC,qEAAgG;AAChG,4CAAyC;AAqBzC,gEAAgE;AAChE,MAAM,gBAAgB;IACpB,qDAAqD;IAC7C,MAAM,CAAC,SAAS,CAAe;IAEhC,MAAM,CAAC,GAAG;QACf,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,gBAAwB,CAAC;IAElB,KAAK;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,OAAO,KAAW,CAAC;IAEnB,KAAK,CAAC,QAAQ;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,8EAA8E;AAC9E,MAAM,aAAa;IACA,IAAI,CAAe;IAEpC,YAAmB,GAAiB;QAClC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAEM,KAAK;QACV,OAAO,IAAI,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IAEM,OAAO,CAAC,OAAqC;QAClD,OAAO,CAAC,sBAAsB,GAAG,gCAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,OAAO,CAAC,kBAAkB,GAAG;YAC3B,YAAY,EAAE;gBACZ,4BAA4B,EAAE,CAAC,qBAAS,CAAC,SAAS,CAAC,6BAA6B;gBAChF,0BAA0B,EAAE,IAAI;aACjC;SACF,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,QAAuC,EAAE,MAAwB;QACrF,IAAI,SAAS,KAAK,QAAQ,CAAC,cAAc,IAAI,SAAS,KAAK,QAAQ,CAAC,wBAAwB,EAAE,CAAC;YAC7F,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;QAC/C,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;gBAC1B,IAAI,CAAC;oBACH,IAAI,SAAS,KAAK,SAAS;wBACzB,OAAO,SAAS,CAAC;oBACnB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC;oBAC5E,OAAO,IAAI,CAAC;gBACd,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC;YACF,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE1C,MAAM,eAAe,GAAG,QAAQ,CAAC,wBAAgD,CAAC;QAClF,IAAA,qBAAM,EAAC,KAAK,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;gBACjC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;CACF;AAED,qCAAqC;AACrC,MAAM,eAAe;IACH,KAAK,CAAuB;IAE5C,YAAmB,KAA2B;QAC5C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,4BAAa,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,MAAwB;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACpC,OAAO;gBACL,GAAG,IAAI;gBACP,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;aAC9C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAEM,OAAO;QACZ,kBAAkB;IACpB,CAAC;IAEM,KAAK,CAAC,QAAQ;QACnB,kBAAkB;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,8DAA8D;AAC9D,KAAK,UAAU,iBAAiB,CAAC,YAAwB,EAAE,MAAwB;IACjF,MAAM,KAAK,GAAG,8EAA8E,YAAY,EAAE,CAAC;IAC3G,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAyB,CAAC;IACpF,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,UAAU,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAA,qBAAM,EAAC,KAAK,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,CAAC,CAAC;IAEhD,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YACjC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB,CAAC,SAA+C;IACvE,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAa,oBAAoB;IACvB,KAAK,CAAc;IACnB,OAAO,CAAwB;IAC/B,SAAS,GAAG,qBAAS,CAAC,gBAAgB,CAAC;IACvC,aAAa,CAA2D;IACxE,UAAU,CAA4B;IAE9C,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,CAAC,qBAAqB;QAC3B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACvC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACtB,MAAM,QAAQ,CAAC,QAAQ,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,YAAoB,IAAiB;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAEM,CAAC,MAAM,CAAC,OAAO,CAAC;QACrB,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,aAA2B;QAC9C,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;QACzG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,MAAwB;QACnC,OAAO,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,CAAC;IAEM,OAAO,CAAC,OAAqC;QAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,QAAuC,EAAE,MAAwB;QACrF,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,YAAwB,EAAE,MAAwB;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;QAEhC,yGAAyG;QACzG,oDAAoD;QACpD,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAE5B,oDAAoD;QACpD,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAE3C,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,wDAAwD;gBACxD,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAEM,gBAAgB,CAAC,IAGvB;QACC,IAAA,qBAAM,EAAC,SAAS,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;QACtC,IAAA,qBAAM,EAAC,SAAS,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC;QAEzC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEM,kBAAkB;QACvB,IAAA,qBAAM,EAAC,SAAS,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAE/B,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAEM,qBAAqB,CAAC,gBAAyB;QACpD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE;YACxC,MAAM,eAAe,GAAG,yBAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC;YACtG,OAAO,CAAC,eAAe,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,QAAQ,CAAC,qBAAqB,CAAC;QAChG,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,iBAAiB,CAAC,KAA2B;QAClD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACxC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAEM,iBAAiB,CAAC,KAA8B;QACrD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACxC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAEM,UAAU,CAAC,OAAqB;QACrC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACxC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEM,qBAAqB,CAAC,IAA+B;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,qBAAqB,CAAC,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACnJ,CAAC;IAEM,uBAAuB,CAAC,IAAiC;QAC9D,MAAM,QAAQ,GAAG,SAAS,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChH,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,CAAC;QAC9B,MAAM,cAAc,GAAG,KAAK,EAAE,OAAO,CAAC;QACtC,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChH,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,cAAc,CAAC,0BAA0B,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IAED,0BAA0B;IACnB,uBAAuB;QAC5B,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACtG,CAAC;IAED,0BAA0B;IAC1B,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,0BAA0B;IAC1B,IAAW,eAAe;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACrB,OAAO;gBACL,GAAG,CAAC;gBACJ,YAAY,EAAE,SAAS;aACxB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,0BAA0B;IAC1B,IAAW,eAAe;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC/B,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;IAC3C,CAAC;IAEO,aAAa;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;QAChC,IAAA,qBAAM,EAAC,SAAS,KAAK,IAAI,CAAC,CAAC;QAC3B,IAAA,qBAAM,EAAC,SAAS,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;QAEtC,IAAI,CAAC,SAAS,GAAG,qBAAS,CAAC,gBAAgB,CAAC;QAE5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACnC,MAAM,QAAQ,GAAG,IAAA,qDAA4B,EAAC;gBAC5C,GAAG,IAAI;gBACP,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,IAAI,CAAC,YAAY;aACxB,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3D,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,CAAC,SAAS;QAChB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACvC,MAAM,QAAQ,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,EAAc;QACrC,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;CACF;AArND,oDAqNC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Views\n */\n\nimport { ColorDef, HydrateViewStateRequestProps, HydrateViewStateResponseProps, Placement2d, ViewAttachmentProps } from \"@itwin/core-common\";\nimport { ComputeDisplayTransformArgs, GetAttachmentViewportArgs, ViewState } from \"../ViewState\";\nimport { assert, CompressedId64Set, expectDefined, Id64String } from \"@itwin/core-bentley\";\nimport { IModelConnection } from \"../IModelConnection\";\nimport { IModelApp } from \"../IModelApp\";\nimport { createViewAttachmentRenderer, ViewAttachmentRenderer } from \"./ViewAttachmentRenderer\";\nimport { Frustum2d } from \"../Frustum2d\";\nimport { Range3d, Transform } from \"@itwin/core-geometry\";\nimport { SceneContext } from \"../ViewContext\";\nimport { Viewport } from \"../Viewport\";\nimport { RenderMemory } from \"../render/RenderMemory\";\nimport { DisclosedTileTreeSet } from \"../tile/internal\";\n\n/** Represents the current state of the view attachments to be displayed by a SheetViewAttachments. */\ninterface Attachments {\n clone(iModel: IModelConnection): Attachments;\n preload(request: HydrateViewStateRequestProps): void;\n postload(response: HydrateViewStateResponseProps, iModel: IModelConnection): Promise<Attachments>;\n readonly infos?: ViewAttachmentInfo[];\n readonly attachmentIds: readonly string[];\n}\n\n/** The properties describing a view attachment, plus the ViewState created from them. */\ninterface ViewAttachmentInfo extends ViewAttachmentProps {\n attachedView: ViewState;\n}\n\n/** Stateless state for a sheet that has no view attachments. */\nclass EmptyAttachments implements Attachments {\n // We only need one instance of this stateless class.\n private static _instance?: Attachments;\n\n public static get(): Attachments {\n return this._instance ?? (this._instance = new EmptyAttachments());\n }\n\n private constructor() { }\n\n public clone(): Attachments {\n return this;\n }\n\n public preload(): void { }\n\n public async postload(): Promise<Attachments> {\n return this;\n }\n\n public get attachmentIds() {\n return [];\n }\n}\n\n/** Holds the element Ids of the view attachments to be loaded for display. */\nclass AttachmentIds implements Attachments {\n private readonly _ids: Id64String[];\n\n public constructor(ids: Id64String[]) {\n this._ids = ids;\n }\n\n public get attachmentIds() {\n return this._ids;\n }\n\n public clone(): Attachments {\n return new AttachmentIds([...this._ids]);\n }\n\n public preload(request: HydrateViewStateRequestProps): void {\n request.sheetViewAttachmentIds = CompressedId64Set.sortAndCompress(this._ids);\n request.viewStateLoadProps = {\n displayStyle: {\n omitScheduleScriptElementIds: !IModelApp.tileAdmin.enableFrontendScheduleScripts,\n compressExcludedElementIds: true,\n },\n };\n }\n\n public async postload(response: HydrateViewStateResponseProps, iModel: IModelConnection): Promise<Attachments> {\n if (undefined === response.sheetViewViews || undefined === response.sheetViewAttachmentProps) {\n return this;\n }\n\n const viewStateProps = response.sheetViewViews;\n const promises = [];\n for (const viewProps of viewStateProps) {\n const loadView = async () => {\n try {\n if (viewProps === undefined)\n return undefined;\n const view = await iModel.views.convertViewStatePropsToViewState(viewProps);\n return view;\n } catch {\n return undefined;\n }\n };\n promises.push(loadView());\n }\n\n const views = await Promise.all(promises);\n\n const attachmentProps = response.sheetViewAttachmentProps as ViewAttachmentInfo[];\n assert(views.length === attachmentProps.length);\n const infos = [];\n for (let i = 0; i < views.length; i++) {\n const view = views[i];\n if (view && !(view.isSheetView())) {\n const props = attachmentProps[i];\n props.attachedView = view;\n infos.push(props);\n }\n }\n\n return new AttachmentInfos(infos);\n }\n}\n\n/** Fully loaded view attachments. */\nclass AttachmentInfos implements Attachments {\n public readonly infos: ViewAttachmentInfo[];\n\n public constructor(infos: ViewAttachmentInfo[]) {\n this.infos = infos;\n }\n\n public get attachmentIds() {\n return this.infos.map((x) => expectDefined(x.id));\n }\n\n public clone(iModel: IModelConnection): Attachments {\n const infos = this.infos.map((info) => {\n return {\n ...info,\n attachedView: info.attachedView.clone(iModel),\n };\n });\n\n return new AttachmentInfos(infos);\n }\n\n public preload(): void {\n // already loaded.\n }\n\n public async postload(): Promise<Attachments> {\n // already loaded.\n return this;\n }\n}\n\n/** Reloads the attachments after a change to the database. */\nasync function reloadAttachments(sheetModelId: Id64String, iModel: IModelConnection): Promise<Attachments> {\n const ecsql = `SELECT ECInstanceId as attachmentId FROM bis.ViewAttachment WHERE model.Id=${sheetModelId}`;\n const ids: string[] = [];\n for await (const row of iModel.createQueryReader(ecsql)) {\n ids.push(row[0]);\n }\n\n const attachmentProps = await iModel.elements.getProps(ids) as ViewAttachmentInfo[];\n const promises = [];\n for (const attachment of attachmentProps) {\n const loadView = async () => {\n try {\n const view = await iModel.views.load(attachment.view.id);\n return view;\n } catch {\n return undefined;\n }\n };\n\n promises.push(loadView());\n }\n\n const views = await Promise.all(promises);\n assert(views.length === attachmentProps.length);\n\n const infos = [];\n for (let i = 0; i < views.length; i++) {\n const view = views[i];\n if (view && !view.isSheetView()) {\n const props = attachmentProps[i];\n props.attachedView = view;\n infos.push(props);\n }\n }\n\n return new AttachmentInfos(infos);\n}\n\nfunction disposeRenderers(renderers: ViewAttachmentRenderer[] | undefined) {\n if (renderers) {\n for (const renderer of renderers) {\n renderer[Symbol.dispose]();\n }\n }\n}\n\n/** Manages the set of ViewAttachment elements to be rendered by a SheetViewState.\n * Takes care of reloading them after ViewAttachment elements are modified, deleted, or inserted.\n */\nexport class SheetViewAttachments implements Disposable {\n private _impl: Attachments;\n private _reload?: Promise<Attachments>;\n private _maxDepth = Frustum2d.minimumZDistance;\n private _rendererArgs?: { sheetModelId: Id64String, backgroundColor: ColorDef };\n private _renderers?: ViewAttachmentRenderer[];\n\n public get maxDepth(): number {\n return this._maxDepth;\n }\n\n public *getSecondaryViewports(): Iterable<Viewport> {\n if (this._renderers) {\n for (const renderer of this._renderers) {\n if (renderer.viewport) {\n yield renderer.viewport;\n }\n }\n }\n }\n\n private constructor(impl: Attachments) {\n this._impl = impl;\n }\n\n public [Symbol.dispose](): void {\n disposeRenderers(this._renderers);\n this._renderers = this._rendererArgs = undefined;\n this._reload = undefined;\n }\n\n public static create(attachmentIds: Id64String[]): SheetViewAttachments {\n const impl = attachmentIds.length === 0 ? EmptyAttachments.get() : new AttachmentIds([...attachmentIds]);\n return new this(impl);\n }\n\n public get attachmentIds(): readonly string[] {\n return this._impl.attachmentIds;\n }\n\n public clone(iModel: IModelConnection): SheetViewAttachments {\n return new SheetViewAttachments(this._impl.clone(iModel));\n }\n\n public preload(request: HydrateViewStateRequestProps): void {\n this._impl.preload(request);\n }\n\n public async postload(response: HydrateViewStateResponseProps, iModel: IModelConnection): Promise<void> {\n this._impl = await this._impl.postload(response, iModel);\n }\n\n public async reload(sheetModelId: Id64String, iModel: IModelConnection): Promise<void> {\n const renderers = this._renderers;\n const reload = this._reload = reloadAttachments(sheetModelId, iModel);\n const impl = await this._reload;\n\n // We keep the previous renderers until reloading completes, to avoid drawing a blank view while waiting.\n // Afterward, always destroy the previous renderers.\n disposeRenderers(renderers);\n\n // If reload was not called again while we waited...\n if (this._reload === reload) {\n this._impl = impl;\n this._reload = this._renderers = undefined;\n\n if (this._rendererArgs) {\n // We are attached to a Viewport - reload the renderers.\n this.loadRenderers();\n }\n }\n }\n\n public attachToViewport(args: {\n backgroundColor: ColorDef,\n sheetModelId: Id64String,\n }): void {\n assert(undefined === this._renderers);\n assert(undefined === this._rendererArgs);\n\n this._rendererArgs = args;\n this.loadRenderers();\n }\n\n public detachFromViewport(): void {\n assert(undefined !== this._rendererArgs);\n this._rendererArgs = undefined;\n\n disposeRenderers(this._renderers);\n this._renderers = undefined;\n }\n\n public areAllTileTreesLoaded(displayedExtents: Range3d): boolean {\n if (this._reload) {\n return false;\n } else if (!this._renderers) {\n return true;\n }\n\n return this._renderers.every((renderer) => {\n const attachmentRange = Placement2d.fromJSON(renderer.viewAttachmentProps.placement).calculateRange();\n return !attachmentRange.intersectsRangeXY(displayedExtents) || renderer.areAllTileTreesLoaded;\n });\n }\n\n public discloseTileTrees(trees: DisclosedTileTreeSet): void {\n for (const renderer of this.renderers()) {\n trees.disclose(renderer);\n }\n }\n\n public collectStatistics(stats: RenderMemory.Statistics): void {\n for (const renderer of this.renderers()) {\n renderer.collectStatistics(stats);\n }\n }\n\n public addToScene(context: SceneContext): void {\n for (const renderer of this.renderers()) {\n renderer.addToScene(context);\n }\n }\n\n public getAttachmentViewport(args: GetAttachmentViewportArgs): Viewport | undefined {\n const renderer = args.viewAttachmentId ? this.findRendererById(args.viewAttachmentId) : undefined;\n if (!renderer) {\n return undefined;\n }\n\n return args.inSectionDrawingAttachment ? renderer.viewport?.view.getAttachmentViewport({ inSectionDrawingAttachment: true }) : renderer.viewport;\n }\n\n public computeDisplayTransform(args: ComputeDisplayTransformArgs): Transform | undefined {\n const renderer = undefined !== args.viewAttachmentId ? this.findRendererById(args.viewAttachmentId) : undefined;\n const ortho = renderer?.ortho;\n const sheetTransform = ortho?.toSheet;\n if (!sheetTransform) {\n return undefined;\n }\n\n const sectionTransform = args.inSectionDrawingAttachment ? ortho.view.computeDisplayTransform(args) : undefined;\n if (!sectionTransform) {\n return sheetTransform.clone(args.output);\n }\n\n return sheetTransform.multiplyTransformTransform(sectionTransform, args.output);\n }\n\n /** Strictly for tests. */\n public areAllAttachmentsLoaded(): boolean {\n return !this._reload && (!this._renderers || this._renderers.every((x) => x.areAllTileTreesLoaded));\n }\n\n /** Strictly for tests. */\n public get attachments(): object[] | undefined {\n return this._renderers;\n }\n\n /** Strictly for tests. */\n public get attachmentProps(): Array<Readonly<ViewAttachmentProps>> {\n const infos = this._impl.infos;\n if (!infos) {\n return [];\n }\n\n return infos.map((x) => {\n return {\n ...x,\n attachedView: undefined,\n };\n });\n }\n\n /** Strictly for tests. */\n public get attachmentInfos(): readonly Id64String[] | Array<{ attachedView: ViewState }> {\n const infos = this._impl.infos;\n return infos ?? this._impl.attachmentIds;\n }\n\n private loadRenderers(): void {\n const args = this._rendererArgs;\n assert(undefined !== args);\n assert(undefined === this._renderers);\n\n this._maxDepth = Frustum2d.minimumZDistance;\n\n const infos = this._impl.infos;\n if (!infos) {\n return;\n }\n\n this._renderers = infos.map((info) => {\n const renderer = createViewAttachmentRenderer({\n ...args,\n props: info,\n view: info.attachedView,\n });\n this._maxDepth = Math.max(this._maxDepth, renderer.zDepth);\n return renderer;\n });\n }\n\n private *renderers(): Iterable<ViewAttachmentRenderer> {\n if (this._renderers) {\n for (const renderer of this._renderers) {\n yield renderer;\n }\n }\n }\n\n private findRendererById(id: Id64String): ViewAttachmentRenderer | undefined {\n return this._renderers?.find((x) => x.viewAttachmentProps.id === id);\n }\n}\n"]}
@@ -0,0 +1,32 @@
1
+ /** @packageDocumentation
2
+ * @module Views
3
+ */
4
+ import { ColorDef, ViewAttachmentProps } from "@itwin/core-common";
5
+ import { ViewState } from "../ViewState";
6
+ import { Viewport } from "../Viewport";
7
+ import { RenderMemory } from "../render/RenderMemory";
8
+ import { DisclosedTileTreeSet } from "../tile/internal";
9
+ import { SceneContext } from "../ViewContext";
10
+ import { Id64String } from "@itwin/core-bentley";
11
+ import { Transform } from "@itwin/core-geometry";
12
+ /** Draws the contents of a view attachment into a sheet view. */
13
+ export interface ViewAttachmentRenderer extends Disposable {
14
+ readonly areAllTileTreesLoaded: boolean;
15
+ addToScene: (context: SceneContext) => void;
16
+ discloseTileTrees: (trees: DisclosedTileTreeSet) => void;
17
+ readonly zDepth: number;
18
+ collectStatistics: (stats: RenderMemory.Statistics) => void;
19
+ viewAttachmentProps: ViewAttachmentProps;
20
+ readonly viewport?: Viewport;
21
+ readonly ortho?: {
22
+ readonly toSheet: Transform;
23
+ readonly view: ViewState;
24
+ };
25
+ }
26
+ export declare function createViewAttachmentRenderer(args: {
27
+ view: ViewState;
28
+ backgroundColor: ColorDef;
29
+ sheetModelId: Id64String;
30
+ props: ViewAttachmentProps;
31
+ }): ViewAttachmentRenderer;
32
+ //# sourceMappingURL=ViewAttachmentRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewAttachmentRenderer.d.ts","sourceRoot":"","sources":["../../../src/internal/ViewAttachmentRenderer.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAmH,mBAAmB,EAAqB,MAAM,oBAAoB,CAAC;AAIvM,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAqB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQ1D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,oBAAoB,EAAmB,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAkC,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAA8F,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAG7I,iEAAiE;AACjE,MAAM,WAAW,sBAAuB,SAAQ,UAAU;IACxD,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C,iBAAiB,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,UAAU,KAAK,IAAI,CAAC;IAC5D,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;QAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;KAC1B,CAAC;CACH;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,IAAI,EAAE,SAAS,CAAC;IAChB,eAAe,EAAE,QAAQ,CAAC;IAC1B,YAAY,EAAE,UAAU,CAAC;IACzB,KAAK,EAAE,mBAAmB,CAAC;CAC5B,GAAG,sBAAsB,CAOzB"}