@itwin/rpcinterface-full-stack-tests 5.1.0-dev.20 → 5.1.0-dev.25
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/lib/dist/bundled-tests.js +584 -352
- package/lib/dist/bundled-tests.js.map +1 -1
- package/package.json +13 -13
|
@@ -200457,6 +200457,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
200457
200457
|
/* harmony import */ var _SelectTool__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./SelectTool */ "../../core/frontend/lib/esm/tools/SelectTool.js");
|
|
200458
200458
|
/* harmony import */ var _Tool__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Tool */ "../../core/frontend/lib/esm/tools/Tool.js");
|
|
200459
200459
|
/* harmony import */ var _ToolAssistance__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ToolAssistance */ "../../core/frontend/lib/esm/tools/ToolAssistance.js");
|
|
200460
|
+
/* harmony import */ var _ToolSettings__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ToolSettings */ "../../core/frontend/lib/esm/tools/ToolSettings.js");
|
|
200460
200461
|
/*---------------------------------------------------------------------------------------------
|
|
200461
200462
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
200462
200463
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
@@ -200477,6 +200478,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
200477
200478
|
|
|
200478
200479
|
|
|
200479
200480
|
|
|
200481
|
+
|
|
200480
200482
|
/** Identifies the source of the elements in the agenda.
|
|
200481
200483
|
* @public
|
|
200482
200484
|
*/
|
|
@@ -200874,12 +200876,105 @@ class ElementSetTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_9__.Primiti
|
|
|
200874
200876
|
await this.onAgendaModified();
|
|
200875
200877
|
return true;
|
|
200876
200878
|
}
|
|
200877
|
-
/** Get
|
|
200878
|
-
|
|
200879
|
-
|
|
200880
|
-
|
|
200879
|
+
/** Get ids of spatial elements to process from a clip volume created by drag box selection. */
|
|
200880
|
+
static async getVolumeSelectionCandidates(vp, origin, corner, allowOverlaps, filter) {
|
|
200881
|
+
const contents = new Set();
|
|
200882
|
+
if (!vp.view.isSpatialView())
|
|
200883
|
+
return contents;
|
|
200884
|
+
const boxRange = _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_2__.Range2d.createXYXY(origin.x, origin.y, corner.x, corner.y);
|
|
200885
|
+
if (boxRange.isNull || boxRange.isAlmostZeroX || boxRange.isAlmostZeroY)
|
|
200886
|
+
return contents;
|
|
200887
|
+
const getClipPlane = (viewPt, viewDir, negate) => {
|
|
200888
|
+
const point = vp.viewToWorld(_itwin_core_geometry__WEBPACK_IMPORTED_MODULE_2__.Point3d.createFrom(viewPt));
|
|
200889
|
+
const boresite = _AccuDraw__WEBPACK_IMPORTED_MODULE_3__.AccuDrawHintBuilder.getBoresite(point, vp);
|
|
200890
|
+
const normal = viewDir.crossProduct(boresite.direction);
|
|
200891
|
+
if (negate)
|
|
200892
|
+
normal.negate(normal);
|
|
200893
|
+
return _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_2__.ClipPlane.createNormalAndPoint(normal, point);
|
|
200894
|
+
};
|
|
200895
|
+
const planeSet = _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_2__.ConvexClipPlaneSet.createEmpty();
|
|
200896
|
+
planeSet.addPlaneToConvexSet(getClipPlane(boxRange.low, vp.rotation.rowX(), true));
|
|
200897
|
+
planeSet.addPlaneToConvexSet(getClipPlane(boxRange.low, vp.rotation.rowY(), true));
|
|
200898
|
+
planeSet.addPlaneToConvexSet(getClipPlane(boxRange.high, vp.rotation.rowX(), false));
|
|
200899
|
+
planeSet.addPlaneToConvexSet(getClipPlane(boxRange.high, vp.rotation.rowY(), false));
|
|
200900
|
+
if (0 === planeSet.planes.length)
|
|
200901
|
+
return contents;
|
|
200902
|
+
const clip = _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_2__.ClipVector.createCapture([_itwin_core_geometry__WEBPACK_IMPORTED_MODULE_2__.ClipPrimitive.createCapture(planeSet)]);
|
|
200903
|
+
const viewRange = vp.computeViewRange();
|
|
200904
|
+
const range = _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_2__.ClipUtilities.rangeOfClipperIntersectionWithRange(clip, viewRange);
|
|
200905
|
+
if (range.isNull)
|
|
200906
|
+
return contents;
|
|
200907
|
+
// TODO: Possible to make UnionOfComplexClipPlaneSets from view clip and planes work and remove 2nd containment check?
|
|
200908
|
+
const viewClip = (vp.viewFlags.clipVolume ? vp.view.getViewClip()?.clone() : undefined);
|
|
200909
|
+
if (viewClip) {
|
|
200910
|
+
const viewClipRange = _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_2__.ClipUtilities.rangeOfClipperIntersectionWithRange(viewClip, viewRange);
|
|
200911
|
+
if (viewClipRange.isNull || !viewClipRange.intersectsRange(range))
|
|
200912
|
+
return contents;
|
|
200913
|
+
}
|
|
200914
|
+
const candidates = [];
|
|
200915
|
+
const categories = new Set();
|
|
200916
|
+
try {
|
|
200917
|
+
const viewedModels = [...vp.view.modelSelector.models].join(",");
|
|
200918
|
+
const viewedCategories = [...vp.view.categorySelector.categories].join(",");
|
|
200919
|
+
const ecsql = `SELECT e.ECInstanceId, Category.Id as category FROM bis.SpatialElement e JOIN bis.SpatialIndex i ON e.ECInstanceId=i.ECInstanceId WHERE Model.Id IN (${viewedModels}) AND Category.Id IN (${viewedCategories}) AND i.MinX <= ${range.xHigh} AND i.MinY <= ${range.yHigh} AND i.MinZ <= ${range.zHigh} AND i.MaxX >= ${range.xLow} AND i.MaxY >= ${range.yLow} AND i.MaxZ >= ${range.zLow}`;
|
|
200920
|
+
const reader = vp.iModel.createQueryReader(ecsql, undefined, { rowFormat: _itwin_core_common__WEBPACK_IMPORTED_MODULE_1__.QueryRowFormat.UseECSqlPropertyNames });
|
|
200921
|
+
for await (const row of reader) {
|
|
200922
|
+
candidates.push(row.ECInstanceId);
|
|
200923
|
+
categories.add(row.category);
|
|
200924
|
+
}
|
|
200925
|
+
}
|
|
200926
|
+
catch { }
|
|
200927
|
+
if (0 === candidates.length)
|
|
200928
|
+
return contents;
|
|
200929
|
+
let offSubCategories;
|
|
200930
|
+
if (0 !== categories.size) {
|
|
200931
|
+
for (const categoryId of categories) {
|
|
200932
|
+
const subcategories = vp.iModel.subcategories.getSubCategories(categoryId);
|
|
200933
|
+
if (undefined === subcategories)
|
|
200934
|
+
continue;
|
|
200935
|
+
for (const subCategoryId of subcategories) {
|
|
200936
|
+
const appearance = vp.iModel.subcategories.getSubCategoryAppearance(subCategoryId);
|
|
200937
|
+
if (undefined === appearance || (!appearance.invisible && !appearance.dontLocate))
|
|
200938
|
+
continue;
|
|
200939
|
+
if (undefined === offSubCategories)
|
|
200940
|
+
offSubCategories = new Array;
|
|
200941
|
+
offSubCategories.push(subCategoryId);
|
|
200942
|
+
}
|
|
200943
|
+
}
|
|
200944
|
+
}
|
|
200945
|
+
const requestProps = {
|
|
200946
|
+
candidates,
|
|
200947
|
+
clip: clip.toJSON(),
|
|
200948
|
+
allowOverlaps,
|
|
200949
|
+
viewFlags: vp.viewFlags.toJSON(),
|
|
200950
|
+
offSubCategories,
|
|
200951
|
+
};
|
|
200952
|
+
const result = await vp.iModel.getGeometryContainment(requestProps);
|
|
200953
|
+
if (_itwin_core_bentley__WEBPACK_IMPORTED_MODULE_0__.BentleyStatus.SUCCESS !== result.status || undefined === result.candidatesContainment)
|
|
200954
|
+
return contents;
|
|
200955
|
+
result.candidatesContainment.forEach((status, index) => {
|
|
200956
|
+
if (_itwin_core_geometry__WEBPACK_IMPORTED_MODULE_2__.ClipPlaneContainment.StronglyOutside !== status && (undefined === filter || filter(candidates[index])))
|
|
200957
|
+
contents.add(candidates[index]);
|
|
200958
|
+
});
|
|
200959
|
+
if (0 !== contents.size && viewClip) {
|
|
200960
|
+
requestProps.clip = viewClip.toJSON();
|
|
200961
|
+
requestProps.candidates.length = 0;
|
|
200962
|
+
for (const id of contents)
|
|
200963
|
+
requestProps.candidates.push(id);
|
|
200964
|
+
contents.clear();
|
|
200965
|
+
const resultViewClip = await vp.iModel.getGeometryContainment(requestProps);
|
|
200966
|
+
if (_itwin_core_bentley__WEBPACK_IMPORTED_MODULE_0__.BentleyStatus.SUCCESS !== resultViewClip.status || undefined === resultViewClip.candidatesContainment)
|
|
200967
|
+
return contents;
|
|
200968
|
+
resultViewClip.candidatesContainment.forEach((status, index) => {
|
|
200969
|
+
if (_itwin_core_geometry__WEBPACK_IMPORTED_MODULE_2__.ClipPlaneContainment.StronglyOutside !== status)
|
|
200970
|
+
contents.add(candidates[index]);
|
|
200971
|
+
});
|
|
200972
|
+
}
|
|
200973
|
+
return contents;
|
|
200974
|
+
}
|
|
200975
|
+
/** Get ids of visible elements to process from drag box or crossing line selection. */
|
|
200976
|
+
static getAreaSelectionCandidates(vp, origin, corner, method, allowOverlaps, filter) {
|
|
200881
200977
|
let contents = new Set();
|
|
200882
|
-
// TODO: Include option to use IModelConnection.getGeometryContainment instead of readPixels. No/Yes/2dOnly...
|
|
200883
200978
|
const pts = [];
|
|
200884
200979
|
pts[0] = new _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_2__.Point2d(Math.floor(origin.x + 0.5), Math.floor(origin.y + 0.5));
|
|
200885
200980
|
pts[1] = new _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_2__.Point2d(Math.floor(corner.x + 0.5), Math.floor(corner.y + 0.5));
|
|
@@ -200902,12 +200997,12 @@ class ElementSetTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_9__.Primiti
|
|
|
200902
200997
|
return undefined; // no geometry at this location...
|
|
200903
200998
|
if (!vp.isPixelSelectable(pixel))
|
|
200904
200999
|
return undefined; // reality model, terrain, etc - not selectable
|
|
200905
|
-
if (!
|
|
201000
|
+
if (undefined !== filter && !filter(pixel.elementId))
|
|
200906
201001
|
return undefined;
|
|
200907
201002
|
return pixel.elementId;
|
|
200908
201003
|
};
|
|
200909
201004
|
if (_SelectTool__WEBPACK_IMPORTED_MODULE_10__.SelectionMethod.Box === method) {
|
|
200910
|
-
const outline =
|
|
201005
|
+
const outline = allowOverlaps ? undefined : new Set();
|
|
200911
201006
|
const offset = sRange.clone();
|
|
200912
201007
|
offset.expandInPlace(-2);
|
|
200913
201008
|
for (testPoint.x = sRange.low.x; testPoint.x <= sRange.high.x; ++testPoint.x) {
|
|
@@ -200949,6 +201044,33 @@ class ElementSetTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_9__.Primiti
|
|
|
200949
201044
|
}, true);
|
|
200950
201045
|
return contents;
|
|
200951
201046
|
}
|
|
201047
|
+
/** Get ids of elements to process from drag box or crossing line selection using either the depth buffer or clip vector...
|
|
201048
|
+
* @internal
|
|
201049
|
+
*/
|
|
201050
|
+
static async getAreaOrVolumeSelectionCandidates(vp, origin, corner, method, allowOverlaps, filter, includeDecorationsForVolume) {
|
|
201051
|
+
let contents;
|
|
201052
|
+
if (_ToolSettings__WEBPACK_IMPORTED_MODULE_13__.ToolSettings.enableVolumeSelection && _SelectTool__WEBPACK_IMPORTED_MODULE_10__.SelectionMethod.Box === method && vp.view.isSpatialView()) {
|
|
201053
|
+
contents = await ElementSetTool.getVolumeSelectionCandidates(vp, origin, corner, allowOverlaps, filter);
|
|
201054
|
+
// Use area select to identify pickable transients...
|
|
201055
|
+
if (includeDecorationsForVolume) {
|
|
201056
|
+
const acceptTransientsFilter = (id) => { return _itwin_core_bentley__WEBPACK_IMPORTED_MODULE_0__.Id64.isTransient(id) && (undefined === filter || filter(id)); };
|
|
201057
|
+
const transients = ElementSetTool.getAreaSelectionCandidates(vp, origin, corner, method, allowOverlaps, acceptTransientsFilter);
|
|
201058
|
+
for (const id of transients)
|
|
201059
|
+
contents.add(id);
|
|
201060
|
+
}
|
|
201061
|
+
}
|
|
201062
|
+
else {
|
|
201063
|
+
contents = ElementSetTool.getAreaSelectionCandidates(vp, origin, corner, method, allowOverlaps, filter);
|
|
201064
|
+
}
|
|
201065
|
+
return contents;
|
|
201066
|
+
}
|
|
201067
|
+
/** Get element ids to process from drag box or crossing line selection.
|
|
201068
|
+
* Sub-classes may override to support selection scopes or apply tool specific filtering.
|
|
201069
|
+
*/
|
|
201070
|
+
async getDragSelectCandidates(vp, origin, corner, method, overlap) {
|
|
201071
|
+
const filter = (id) => { return this.isElementIdValid(id, ModifyElementSource.DragSelect); };
|
|
201072
|
+
return ElementSetTool.getAreaOrVolumeSelectionCandidates(vp, origin, corner, method, overlap, filter, _IModelApp__WEBPACK_IMPORTED_MODULE_5__.IModelApp.locateManager.options.allowDecorations);
|
|
201073
|
+
}
|
|
200952
201074
|
/** Populate [[ElementSetTool.agenda]] by drag box or crossing line information.
|
|
200953
201075
|
* @see [[ElementSetTool.getDragSelectCandidates]] to filter or augment the set of elements.
|
|
200954
201076
|
*/
|
|
@@ -203272,17 +203394,15 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
203272
203394
|
/* harmony export */ SelectionTool: () => (/* binding */ SelectionTool)
|
|
203273
203395
|
/* harmony export */ });
|
|
203274
203396
|
/* harmony import */ var _itwin_core_bentley__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @itwin/core-bentley */ "../../core/bentley/lib/esm/core-bentley.js");
|
|
203275
|
-
/* harmony import */ var
|
|
203276
|
-
/* harmony import */ var
|
|
203277
|
-
/* harmony import */ var
|
|
203278
|
-
/* harmony import */ var
|
|
203279
|
-
/* harmony import */ var
|
|
203280
|
-
/* harmony import */ var
|
|
203281
|
-
/* harmony import */ var
|
|
203282
|
-
/* harmony import */ var
|
|
203283
|
-
/* harmony import */ var
|
|
203284
|
-
/* harmony import */ var _ToolAdmin__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ToolAdmin */ "../../core/frontend/lib/esm/tools/ToolAdmin.js");
|
|
203285
|
-
/* harmony import */ var _ToolAssistance__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ToolAssistance */ "../../core/frontend/lib/esm/tools/ToolAssistance.js");
|
|
203397
|
+
/* harmony import */ var _itwin_core_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @itwin/core-common */ "../../core/common/lib/esm/core-common.js");
|
|
203398
|
+
/* harmony import */ var _itwin_appui_abstract__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @itwin/appui-abstract */ "../../ui/appui-abstract/lib/esm/appui-abstract.js");
|
|
203399
|
+
/* harmony import */ var _ElementLocateManager__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ElementLocateManager */ "../../core/frontend/lib/esm/ElementLocateManager.js");
|
|
203400
|
+
/* harmony import */ var _IModelApp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../IModelApp */ "../../core/frontend/lib/esm/IModelApp.js");
|
|
203401
|
+
/* harmony import */ var _PrimitiveTool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PrimitiveTool */ "../../core/frontend/lib/esm/tools/PrimitiveTool.js");
|
|
203402
|
+
/* harmony import */ var _Tool__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Tool */ "../../core/frontend/lib/esm/tools/Tool.js");
|
|
203403
|
+
/* harmony import */ var _ToolAdmin__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ToolAdmin */ "../../core/frontend/lib/esm/tools/ToolAdmin.js");
|
|
203404
|
+
/* harmony import */ var _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ToolAssistance */ "../../core/frontend/lib/esm/tools/ToolAssistance.js");
|
|
203405
|
+
/* harmony import */ var _ElementSetTool__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ElementSetTool */ "../../core/frontend/lib/esm/tools/ElementSetTool.js");
|
|
203286
203406
|
/*---------------------------------------------------------------------------------------------
|
|
203287
203407
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
203288
203408
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
@@ -203300,8 +203420,6 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
203300
203420
|
|
|
203301
203421
|
|
|
203302
203422
|
|
|
203303
|
-
|
|
203304
|
-
|
|
203305
203423
|
// cSpell:ignore buttongroup
|
|
203306
203424
|
/** The method for choosing elements with the [[SelectionTool]]
|
|
203307
203425
|
* @public
|
|
@@ -203347,7 +203465,7 @@ var SelectionProcessing;
|
|
|
203347
203465
|
/** Tool for picking a set of elements of interest, selected by the user.
|
|
203348
203466
|
* @public
|
|
203349
203467
|
*/
|
|
203350
|
-
class SelectionTool extends
|
|
203468
|
+
class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_5__.PrimitiveTool {
|
|
203351
203469
|
static hidden = false;
|
|
203352
203470
|
static toolId = "Select";
|
|
203353
203471
|
static iconSpec = "icon-cursor";
|
|
@@ -203366,7 +203484,7 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203366
203484
|
set selectionMethod(method) { this._selectionMethodValue.value = method; }
|
|
203367
203485
|
get selectionMode() { return this._selectionModeValue.value; }
|
|
203368
203486
|
set selectionMode(mode) { this._selectionModeValue.value = mode; }
|
|
203369
|
-
static methodsMessage(str) { return
|
|
203487
|
+
static methodsMessage(str) { return _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate(`ElementSet.SelectionMethods.${str}`); }
|
|
203370
203488
|
static _methodsName = "selectionMethods";
|
|
203371
203489
|
/* The property descriptions used to generate ToolSettings UI. */
|
|
203372
203490
|
static _getMethodsDescription() {
|
|
@@ -203377,14 +203495,14 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203377
203495
|
editor: {
|
|
203378
203496
|
name: "enum-buttongroup",
|
|
203379
203497
|
params: [{
|
|
203380
|
-
type:
|
|
203498
|
+
type: _itwin_appui_abstract__WEBPACK_IMPORTED_MODULE_2__.PropertyEditorParamTypes.ButtonGroupData,
|
|
203381
203499
|
buttons: [
|
|
203382
203500
|
{ iconSpec: "icon-select-single" },
|
|
203383
203501
|
{ iconSpec: "icon-select-line" },
|
|
203384
203502
|
{ iconSpec: "icon-select-box" },
|
|
203385
203503
|
],
|
|
203386
203504
|
}, {
|
|
203387
|
-
type:
|
|
203505
|
+
type: _itwin_appui_abstract__WEBPACK_IMPORTED_MODULE_2__.PropertyEditorParamTypes.SuppressEditorLabel,
|
|
203388
203506
|
suppressLabelPlaceholder: true,
|
|
203389
203507
|
},
|
|
203390
203508
|
],
|
|
@@ -203398,7 +203516,7 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203398
203516
|
},
|
|
203399
203517
|
};
|
|
203400
203518
|
}
|
|
203401
|
-
static modesMessage(str) { return
|
|
203519
|
+
static modesMessage(str) { return _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate(`ElementSet.SelectionModes.${str}`); }
|
|
203402
203520
|
static _modesName = "selectionModes";
|
|
203403
203521
|
/* The property descriptions used to generate ToolSettings UI. */
|
|
203404
203522
|
static _getModesDescription() {
|
|
@@ -203409,20 +203527,20 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203409
203527
|
editor: {
|
|
203410
203528
|
name: "enum-buttongroup",
|
|
203411
203529
|
params: [{
|
|
203412
|
-
type:
|
|
203530
|
+
type: _itwin_appui_abstract__WEBPACK_IMPORTED_MODULE_2__.PropertyEditorParamTypes.ButtonGroupData,
|
|
203413
203531
|
buttons: [
|
|
203414
203532
|
{ iconSpec: "icon-replace" },
|
|
203415
203533
|
{ iconSpec: "icon-select-plus" },
|
|
203416
203534
|
{
|
|
203417
203535
|
iconSpec: "icon-select-minus",
|
|
203418
203536
|
isEnabledFunction: () => {
|
|
203419
|
-
const tool =
|
|
203420
|
-
return tool instanceof
|
|
203537
|
+
const tool = _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.activeTool;
|
|
203538
|
+
return tool instanceof _PrimitiveTool__WEBPACK_IMPORTED_MODULE_5__.PrimitiveTool ? tool.iModel.selectionSet.isActive : false;
|
|
203421
203539
|
},
|
|
203422
203540
|
},
|
|
203423
203541
|
],
|
|
203424
203542
|
}, {
|
|
203425
|
-
type:
|
|
203543
|
+
type: _itwin_appui_abstract__WEBPACK_IMPORTED_MODULE_2__.PropertyEditorParamTypes.SuppressEditorLabel,
|
|
203426
203544
|
suppressLabelPlaceholder: true,
|
|
203427
203545
|
},
|
|
203428
203546
|
],
|
|
@@ -203449,49 +203567,49 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203449
203567
|
mainMsg += (0 === this._points.length ? "StartCorner" : "OppositeCorner");
|
|
203450
203568
|
break;
|
|
203451
203569
|
}
|
|
203452
|
-
const mainInstruction =
|
|
203570
|
+
const mainInstruction = _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createInstruction(this.iconSpec, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate(mainMsg));
|
|
203453
203571
|
const sections = [];
|
|
203454
203572
|
switch (method) {
|
|
203455
203573
|
case SelectionMethod.Pick:
|
|
203456
203574
|
const mousePickInstructions = [];
|
|
203457
|
-
mousePickInstructions.push(
|
|
203458
|
-
mousePickInstructions.push(
|
|
203459
|
-
mousePickInstructions.push(
|
|
203460
|
-
mousePickInstructions.push(
|
|
203575
|
+
mousePickInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.LeftClick, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.AcceptElement"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Mouse));
|
|
203576
|
+
mousePickInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.LeftClickDrag, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.BoxCorners"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Mouse));
|
|
203577
|
+
mousePickInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.RightClickDrag, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.CrossingLine"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Mouse));
|
|
203578
|
+
mousePickInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createModifierKeyInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.shiftKey, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.LeftClickDrag, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.OverlapSelection"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Mouse));
|
|
203461
203579
|
if (SelectionMode.Replace === mode) {
|
|
203462
|
-
mousePickInstructions.push(
|
|
203463
|
-
mousePickInstructions.push(
|
|
203580
|
+
mousePickInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createKeyboardInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.ctrlKeyboardInfo, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.InvertSelection"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Mouse));
|
|
203581
|
+
mousePickInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.CursorClick, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.ClearSelection"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Mouse));
|
|
203464
203582
|
}
|
|
203465
|
-
sections.push(
|
|
203583
|
+
sections.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createSection(mousePickInstructions, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.inputsLabel));
|
|
203466
203584
|
const touchPickInstructions = [];
|
|
203467
|
-
if (!
|
|
203468
|
-
touchPickInstructions.push(
|
|
203469
|
-
sections.push(
|
|
203585
|
+
if (!_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createTouchCursorInstructions(touchPickInstructions))
|
|
203586
|
+
touchPickInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.OneTouchTap, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.AcceptElement"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Touch));
|
|
203587
|
+
sections.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createSection(touchPickInstructions, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.inputsLabel));
|
|
203470
203588
|
break;
|
|
203471
203589
|
case SelectionMethod.Line:
|
|
203472
203590
|
const mouseLineInstructions = [];
|
|
203473
|
-
mouseLineInstructions.push(
|
|
203591
|
+
mouseLineInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.LeftClick, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.AcceptPoint"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Mouse));
|
|
203474
203592
|
if (SelectionMode.Replace === mode)
|
|
203475
|
-
mouseLineInstructions.push(
|
|
203476
|
-
sections.push(
|
|
203593
|
+
mouseLineInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createModifierKeyInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.ctrlKey, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.LeftClick, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.InvertSelection"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Mouse));
|
|
203594
|
+
sections.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createSection(mouseLineInstructions, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.inputsLabel));
|
|
203477
203595
|
const touchLineInstructions = [];
|
|
203478
|
-
touchLineInstructions.push(
|
|
203479
|
-
sections.push(
|
|
203596
|
+
touchLineInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.OneTouchDrag, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.AcceptPoint"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Touch));
|
|
203597
|
+
sections.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createSection(touchLineInstructions, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.inputsLabel));
|
|
203480
203598
|
break;
|
|
203481
203599
|
case SelectionMethod.Box:
|
|
203482
203600
|
const mouseBoxInstructions = [];
|
|
203483
|
-
mouseBoxInstructions.push(
|
|
203484
|
-
mouseBoxInstructions.push(
|
|
203601
|
+
mouseBoxInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.LeftClick, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.AcceptPoint"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Mouse));
|
|
203602
|
+
mouseBoxInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createModifierKeyInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.shiftKey, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.LeftClick, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.OverlapSelection"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Mouse));
|
|
203485
203603
|
if (SelectionMode.Replace === mode)
|
|
203486
|
-
mouseBoxInstructions.push(
|
|
203487
|
-
sections.push(
|
|
203604
|
+
mouseBoxInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createModifierKeyInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.ctrlKey, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.LeftClick, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.InvertSelection"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Mouse));
|
|
203605
|
+
sections.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createSection(mouseBoxInstructions, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.inputsLabel));
|
|
203488
203606
|
const touchBoxInstructions = [];
|
|
203489
|
-
touchBoxInstructions.push(
|
|
203490
|
-
sections.push(
|
|
203607
|
+
touchBoxInstructions.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createInstruction(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceImage.OneTouchDrag, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate("ElementSet.Inputs.AcceptPoint"), false, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistanceInputMethod.Touch));
|
|
203608
|
+
sections.push(_ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createSection(touchBoxInstructions, _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.inputsLabel));
|
|
203491
203609
|
break;
|
|
203492
203610
|
}
|
|
203493
|
-
const instructions =
|
|
203494
|
-
|
|
203611
|
+
const instructions = _ToolAssistance__WEBPACK_IMPORTED_MODULE_8__.ToolAssistance.createInstructions(mainInstruction, sections);
|
|
203612
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.notifications.setToolAssistance(instructions);
|
|
203495
203613
|
}
|
|
203496
203614
|
initSelectTool() {
|
|
203497
203615
|
const method = this.selectionMethod;
|
|
@@ -203499,8 +203617,8 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203499
203617
|
const enableLocate = SelectionMethod.Pick === method;
|
|
203500
203618
|
this._isSelectByPoints = false;
|
|
203501
203619
|
this._points.length = 0;
|
|
203502
|
-
this.initLocateElements(enableLocate, false, enableLocate ? "default" :
|
|
203503
|
-
|
|
203620
|
+
this.initLocateElements(enableLocate, false, enableLocate ? "default" : _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.viewManager.crossHairCursor, _Tool__WEBPACK_IMPORTED_MODULE_6__.CoordinateLockOverrides.All);
|
|
203621
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.locateManager.options.allowDecorations = true; // Always locate to display tool tip even if we reject for adding to selection set...
|
|
203504
203622
|
this.showPrompt(mode, method);
|
|
203505
203623
|
}
|
|
203506
203624
|
processMiss(_ev) {
|
|
@@ -203545,13 +203663,13 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203545
203663
|
selectByPointsDecorate(context) {
|
|
203546
203664
|
if (!this._isSelectByPoints)
|
|
203547
203665
|
return;
|
|
203548
|
-
const ev = new
|
|
203549
|
-
|
|
203666
|
+
const ev = new _Tool__WEBPACK_IMPORTED_MODULE_6__.BeButtonEvent();
|
|
203667
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.fillEventFromCursorLocation(ev);
|
|
203550
203668
|
if (undefined === ev.viewport)
|
|
203551
203669
|
return;
|
|
203552
203670
|
const vp = context.viewport;
|
|
203553
|
-
const bestContrastIsBlack = (
|
|
203554
|
-
const crossingLine = (SelectionMethod.Line === this.selectionMethod || (SelectionMethod.Pick === this.selectionMethod &&
|
|
203671
|
+
const bestContrastIsBlack = (_itwin_core_common__WEBPACK_IMPORTED_MODULE_1__.ColorDef.black === vp.getContrastToBackgroundColor());
|
|
203672
|
+
const crossingLine = (SelectionMethod.Line === this.selectionMethod || (SelectionMethod.Pick === this.selectionMethod && _Tool__WEBPACK_IMPORTED_MODULE_6__.BeButton.Reset === ev.button));
|
|
203555
203673
|
const overlapSelection = (crossingLine || this.useOverlapSelection(ev));
|
|
203556
203674
|
const position = vp.worldToView(this._points[0]);
|
|
203557
203675
|
position.x = Math.floor(position.x) + 0.5;
|
|
@@ -203579,111 +203697,42 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203579
203697
|
};
|
|
203580
203698
|
context.addCanvasDecoration({ position, drawDecoration });
|
|
203581
203699
|
}
|
|
203582
|
-
selectByPointsProcess(origin, corner, ev, method, overlap) {
|
|
203700
|
+
async selectByPointsProcess(origin, corner, ev, method, overlap) {
|
|
203583
203701
|
const vp = ev.viewport;
|
|
203584
203702
|
if (!vp)
|
|
203585
|
-
return;
|
|
203586
|
-
const
|
|
203587
|
-
|
|
203588
|
-
|
|
203589
|
-
|
|
203590
|
-
|
|
203591
|
-
|
|
203592
|
-
const allowTransients = this.wantPickableDecorations();
|
|
203593
|
-
vp.readPixels(rect, _render_Pixel__WEBPACK_IMPORTED_MODULE_6__.Pixel.Selector.Feature, (pixels) => {
|
|
203594
|
-
if (undefined === pixels)
|
|
203595
|
-
return;
|
|
203596
|
-
const sRange = _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_1__.Range2d.createNull();
|
|
203597
|
-
sRange.extendPoint(_itwin_core_geometry__WEBPACK_IMPORTED_MODULE_1__.Point2d.create(vp.cssPixelsToDevicePixels(range.low.x), vp.cssPixelsToDevicePixels(range.low.y)));
|
|
203598
|
-
sRange.extendPoint(_itwin_core_geometry__WEBPACK_IMPORTED_MODULE_1__.Point2d.create(vp.cssPixelsToDevicePixels(range.high.x), vp.cssPixelsToDevicePixels(range.high.y)));
|
|
203599
|
-
pts[0].x = vp.cssPixelsToDevicePixels(pts[0].x);
|
|
203600
|
-
pts[0].y = vp.cssPixelsToDevicePixels(pts[0].y);
|
|
203601
|
-
pts[1].x = vp.cssPixelsToDevicePixels(pts[1].x);
|
|
203602
|
-
pts[1].y = vp.cssPixelsToDevicePixels(pts[1].y);
|
|
203603
|
-
let contents = new Set();
|
|
203604
|
-
const testPoint = _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_1__.Point2d.createZero();
|
|
203605
|
-
const getPixelElementId = (pixel) => {
|
|
203606
|
-
if (undefined === pixel.elementId || _itwin_core_bentley__WEBPACK_IMPORTED_MODULE_0__.Id64.isInvalid(pixel.elementId))
|
|
203607
|
-
return undefined; // no geometry at this location...
|
|
203608
|
-
if (!allowTransients && _itwin_core_bentley__WEBPACK_IMPORTED_MODULE_0__.Id64.isTransient(pixel.elementId))
|
|
203609
|
-
return undefined; // tool didn't request pickable decorations...
|
|
203610
|
-
if (!vp.isPixelSelectable(pixel))
|
|
203611
|
-
return undefined; // reality model, terrain, etc - not selectable
|
|
203612
|
-
return pixel.elementId;
|
|
203613
|
-
};
|
|
203614
|
-
if (SelectionMethod.Box === method) {
|
|
203615
|
-
const outline = overlap ? undefined : new Set();
|
|
203616
|
-
const offset = sRange.clone();
|
|
203617
|
-
offset.expandInPlace(-2);
|
|
203618
|
-
for (testPoint.x = sRange.low.x; testPoint.x <= sRange.high.x; ++testPoint.x) {
|
|
203619
|
-
for (testPoint.y = sRange.low.y; testPoint.y <= sRange.high.y; ++testPoint.y) {
|
|
203620
|
-
const pixel = pixels.getPixel(testPoint.x, testPoint.y);
|
|
203621
|
-
const elementId = getPixelElementId(pixel);
|
|
203622
|
-
if (undefined === elementId)
|
|
203623
|
-
continue;
|
|
203624
|
-
if (undefined !== outline && !offset.containsPoint(testPoint))
|
|
203625
|
-
outline.add(elementId.toString());
|
|
203626
|
-
else
|
|
203627
|
-
contents.add(elementId.toString());
|
|
203628
|
-
}
|
|
203629
|
-
}
|
|
203630
|
-
if (undefined !== outline && 0 !== outline.size) {
|
|
203631
|
-
const inside = new Set();
|
|
203632
|
-
contents.forEach((id) => {
|
|
203633
|
-
if (!outline.has(id))
|
|
203634
|
-
inside.add(id);
|
|
203635
|
-
});
|
|
203636
|
-
contents = inside;
|
|
203637
|
-
}
|
|
203638
|
-
}
|
|
203639
|
-
else {
|
|
203640
|
-
const closePoint = _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_1__.Point2d.createZero();
|
|
203641
|
-
for (testPoint.x = sRange.low.x; testPoint.x <= sRange.high.x; ++testPoint.x) {
|
|
203642
|
-
for (testPoint.y = sRange.low.y; testPoint.y <= sRange.high.y; ++testPoint.y) {
|
|
203643
|
-
const pixel = pixels.getPixel(testPoint.x, testPoint.y);
|
|
203644
|
-
const elementId = getPixelElementId(pixel);
|
|
203645
|
-
if (undefined === elementId)
|
|
203646
|
-
continue;
|
|
203647
|
-
const fraction = testPoint.fractionOfProjectionToLine(pts[0], pts[1], 0.0);
|
|
203648
|
-
pts[0].interpolate(fraction, pts[1], closePoint);
|
|
203649
|
-
if (closePoint.distance(testPoint) < 1.5)
|
|
203650
|
-
contents.add(elementId.toString());
|
|
203651
|
-
}
|
|
203652
|
-
}
|
|
203653
|
-
}
|
|
203654
|
-
if (0 === contents.size) {
|
|
203655
|
-
if (!ev.isControlKey && this.wantSelectionClearOnMiss(ev) && this.processMiss(ev))
|
|
203656
|
-
this.syncSelectionMode();
|
|
203657
|
-
return;
|
|
203658
|
-
}
|
|
203659
|
-
switch (this.selectionMode) {
|
|
203660
|
-
case SelectionMode.Replace:
|
|
203661
|
-
if (!ev.isControlKey)
|
|
203662
|
-
this.processSelection(contents, SelectionProcessing.ReplaceSelectionWithElement); // eslint-disable-line @typescript-eslint/no-floating-promises
|
|
203663
|
-
else
|
|
203664
|
-
this.processSelection(contents, SelectionProcessing.InvertElementInSelection); // eslint-disable-line @typescript-eslint/no-floating-promises
|
|
203665
|
-
break;
|
|
203666
|
-
case SelectionMode.Add:
|
|
203667
|
-
this.processSelection(contents, SelectionProcessing.AddElementToSelection); // eslint-disable-line @typescript-eslint/no-floating-promises
|
|
203668
|
-
break;
|
|
203669
|
-
case SelectionMode.Remove:
|
|
203670
|
-
this.processSelection(contents, SelectionProcessing.RemoveElementFromSelection); // eslint-disable-line @typescript-eslint/no-floating-promises
|
|
203671
|
-
break;
|
|
203703
|
+
return false;
|
|
203704
|
+
const filter = (id) => { return !_itwin_core_bentley__WEBPACK_IMPORTED_MODULE_0__.Id64.isTransient(id); };
|
|
203705
|
+
const contents = await _ElementSetTool__WEBPACK_IMPORTED_MODULE_9__.ElementSetTool.getAreaOrVolumeSelectionCandidates(vp, origin, corner, method, overlap, this.wantPickableDecorations() ? undefined : filter, this.wantPickableDecorations());
|
|
203706
|
+
if (0 === contents.size) {
|
|
203707
|
+
if (!ev.isControlKey && this.wantSelectionClearOnMiss(ev) && this.processMiss(ev)) {
|
|
203708
|
+
this.syncSelectionMode();
|
|
203709
|
+
return true;
|
|
203672
203710
|
}
|
|
203673
|
-
|
|
203711
|
+
return false;
|
|
203712
|
+
}
|
|
203713
|
+
switch (this.selectionMode) {
|
|
203714
|
+
case SelectionMode.Replace:
|
|
203715
|
+
if (!ev.isControlKey)
|
|
203716
|
+
return this.processSelection(contents, SelectionProcessing.ReplaceSelectionWithElement);
|
|
203717
|
+
return this.processSelection(contents, SelectionProcessing.InvertElementInSelection);
|
|
203718
|
+
case SelectionMode.Add:
|
|
203719
|
+
return this.processSelection(contents, SelectionProcessing.AddElementToSelection);
|
|
203720
|
+
case SelectionMode.Remove:
|
|
203721
|
+
return this.processSelection(contents, SelectionProcessing.RemoveElementFromSelection);
|
|
203722
|
+
}
|
|
203674
203723
|
}
|
|
203675
203724
|
selectByPointsStart(ev) {
|
|
203676
|
-
if (
|
|
203725
|
+
if (_Tool__WEBPACK_IMPORTED_MODULE_6__.BeButton.Data !== ev.button && _Tool__WEBPACK_IMPORTED_MODULE_6__.BeButton.Reset !== ev.button)
|
|
203677
203726
|
return false;
|
|
203678
203727
|
this._points.length = 0;
|
|
203679
203728
|
this._points.push(ev.point.clone());
|
|
203680
203729
|
this._isSelectByPoints = true;
|
|
203681
|
-
|
|
203682
|
-
|
|
203730
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.accuSnap.enableLocate(false);
|
|
203731
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.setLocateCircleOn(false);
|
|
203683
203732
|
this.showPrompt(this.selectionMode, this.selectionMethod);
|
|
203684
203733
|
return true;
|
|
203685
203734
|
}
|
|
203686
|
-
selectByPointsEnd(ev) {
|
|
203735
|
+
async selectByPointsEnd(ev) {
|
|
203687
203736
|
if (!this._isSelectByPoints)
|
|
203688
203737
|
return false;
|
|
203689
203738
|
const vp = ev.viewport;
|
|
@@ -203693,10 +203742,10 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203693
203742
|
}
|
|
203694
203743
|
const origin = vp.worldToView(this._points[0]);
|
|
203695
203744
|
const corner = vp.worldToView(ev.point);
|
|
203696
|
-
if (SelectionMethod.Line === this.selectionMethod || (SelectionMethod.Pick === this.selectionMethod &&
|
|
203697
|
-
this.selectByPointsProcess(origin, corner, ev, SelectionMethod.Line, true);
|
|
203745
|
+
if (SelectionMethod.Line === this.selectionMethod || (SelectionMethod.Pick === this.selectionMethod && _Tool__WEBPACK_IMPORTED_MODULE_6__.BeButton.Reset === ev.button))
|
|
203746
|
+
await this.selectByPointsProcess(origin, corner, ev, SelectionMethod.Line, true);
|
|
203698
203747
|
else
|
|
203699
|
-
this.selectByPointsProcess(origin, corner, ev, SelectionMethod.Box, this.useOverlapSelection(ev));
|
|
203748
|
+
await this.selectByPointsProcess(origin, corner, ev, SelectionMethod.Box, this.useOverlapSelection(ev));
|
|
203700
203749
|
this.initSelectTool();
|
|
203701
203750
|
vp.invalidateDecorations();
|
|
203702
203751
|
return true;
|
|
@@ -203707,14 +203756,14 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203707
203756
|
}
|
|
203708
203757
|
async selectDecoration(ev, currHit) {
|
|
203709
203758
|
if (undefined === currHit)
|
|
203710
|
-
currHit = await
|
|
203759
|
+
currHit = await _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.locateManager.doLocate(new _ElementLocateManager__WEBPACK_IMPORTED_MODULE_3__.LocateResponse(), true, ev.point, ev.viewport, ev.inputSource);
|
|
203711
203760
|
if (undefined !== currHit)
|
|
203712
|
-
return (currHit.isElementHit ?
|
|
203713
|
-
return
|
|
203761
|
+
return (currHit.isElementHit ? _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.viewManager.overrideElementButtonEvent(currHit, ev) : _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.viewManager.onDecorationButtonEvent(currHit, ev));
|
|
203762
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.No;
|
|
203714
203763
|
}
|
|
203715
203764
|
async processHit(ev, hit) {
|
|
203716
203765
|
if (hit.isModelHit || hit.isMapHit)
|
|
203717
|
-
return
|
|
203766
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.No; // model hit = terrain, reality models, background maps, etc - not selectable
|
|
203718
203767
|
switch (this.selectionMode) {
|
|
203719
203768
|
case SelectionMode.Replace:
|
|
203720
203769
|
await this.processSelection(hit.sourceId, ev.isControlKey ? SelectionProcessing.InvertElementInSelection : SelectionProcessing.ReplaceSelectionWithElement);
|
|
@@ -203726,59 +203775,59 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203726
203775
|
await this.processSelection(hit.sourceId, SelectionProcessing.RemoveElementFromSelection);
|
|
203727
203776
|
break;
|
|
203728
203777
|
}
|
|
203729
|
-
return
|
|
203778
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes;
|
|
203730
203779
|
}
|
|
203731
203780
|
async onMouseStartDrag(ev) {
|
|
203732
|
-
|
|
203733
|
-
if (
|
|
203734
|
-
return
|
|
203735
|
-
if (
|
|
203736
|
-
return
|
|
203737
|
-
return this.selectByPointsStart(ev) ?
|
|
203781
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.accuSnap.clear(); // Need to test hit at start drag location, not current AccuSnap...
|
|
203782
|
+
if (_Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes === await this.selectDecoration(ev))
|
|
203783
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes;
|
|
203784
|
+
if (_Tool__WEBPACK_IMPORTED_MODULE_6__.InputSource.Touch === ev.inputSource && SelectionMethod.Pick === this.selectionMethod)
|
|
203785
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.No; // Require method change for line/box selection...allow IdleTool to handle touch move...
|
|
203786
|
+
return this.selectByPointsStart(ev) ? _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes : _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.No;
|
|
203738
203787
|
}
|
|
203739
203788
|
async onMouseEndDrag(ev) {
|
|
203740
|
-
return this.selectByPointsEnd(ev) ?
|
|
203789
|
+
return await this.selectByPointsEnd(ev) ? _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes : _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.No;
|
|
203741
203790
|
}
|
|
203742
203791
|
async onDataButtonUp(ev) {
|
|
203743
203792
|
if (undefined === ev.viewport)
|
|
203744
|
-
return
|
|
203745
|
-
if (this.selectByPointsEnd(ev))
|
|
203746
|
-
return
|
|
203793
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.No;
|
|
203794
|
+
if (await this.selectByPointsEnd(ev))
|
|
203795
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes;
|
|
203747
203796
|
if (SelectionMethod.Pick !== this.selectionMethod) {
|
|
203748
203797
|
if (!ev.isControlKey && this.wantSelectionClearOnMiss(ev) && this.processMiss(ev))
|
|
203749
203798
|
this.syncSelectionMode();
|
|
203750
|
-
if (
|
|
203799
|
+
if (_Tool__WEBPACK_IMPORTED_MODULE_6__.InputSource.Touch !== ev.inputSource)
|
|
203751
203800
|
this.selectByPointsStart(ev); // Require touch move and not tap to start crossing line/box selection...
|
|
203752
|
-
return
|
|
203801
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes;
|
|
203753
203802
|
}
|
|
203754
|
-
const hit = await
|
|
203803
|
+
const hit = await _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.locateManager.doLocate(new _ElementLocateManager__WEBPACK_IMPORTED_MODULE_3__.LocateResponse(), true, ev.point, ev.viewport, ev.inputSource);
|
|
203755
203804
|
if (hit !== undefined) {
|
|
203756
|
-
if (
|
|
203757
|
-
return
|
|
203758
|
-
if (
|
|
203759
|
-
return
|
|
203805
|
+
if (_Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes === await this.selectDecoration(ev, hit))
|
|
203806
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes;
|
|
203807
|
+
if (_Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes === await this.processHit(ev, hit))
|
|
203808
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes;
|
|
203760
203809
|
}
|
|
203761
203810
|
if (!ev.isControlKey && this.wantSelectionClearOnMiss(ev) && this.processMiss(ev))
|
|
203762
203811
|
this.syncSelectionMode();
|
|
203763
|
-
return
|
|
203812
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes;
|
|
203764
203813
|
}
|
|
203765
203814
|
async onResetButtonUp(ev) {
|
|
203766
203815
|
if (this._isSelectByPoints) {
|
|
203767
203816
|
if (undefined !== ev.viewport)
|
|
203768
203817
|
ev.viewport.invalidateDecorations();
|
|
203769
203818
|
this.initSelectTool();
|
|
203770
|
-
return
|
|
203819
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes;
|
|
203771
203820
|
}
|
|
203772
203821
|
// Check for overlapping hits...
|
|
203773
|
-
const lastHit = SelectionMode.Remove === this.selectionMode ? undefined :
|
|
203822
|
+
const lastHit = SelectionMode.Remove === this.selectionMode ? undefined : _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.locateManager.currHit;
|
|
203774
203823
|
if (lastHit && this.iModel.selectionSet.elements.has(lastHit.sourceId)) {
|
|
203775
|
-
const autoHit =
|
|
203824
|
+
const autoHit = _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.accuSnap.currHit;
|
|
203776
203825
|
// Play nice w/auto-locate, only remove previous hit if not currently auto-locating or over previous hit
|
|
203777
203826
|
if (undefined === autoHit || autoHit.isSameHit(lastHit)) {
|
|
203778
|
-
const response = new
|
|
203827
|
+
const response = new _ElementLocateManager__WEBPACK_IMPORTED_MODULE_3__.LocateResponse();
|
|
203779
203828
|
let nextHit;
|
|
203780
203829
|
do {
|
|
203781
|
-
nextHit = await
|
|
203830
|
+
nextHit = await _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.locateManager.doLocate(response, false, ev.point, ev.viewport, ev.inputSource);
|
|
203782
203831
|
} while (undefined !== nextHit && (nextHit.isModelHit || nextHit.isMapHit)); // Ignore reality models, terrain, maps, etc.
|
|
203783
203832
|
// remove element(s) previously selected if in replace mode, or if we have a next element in add mode
|
|
203784
203833
|
if (SelectionMode.Replace === this.selectionMode || undefined !== nextHit)
|
|
@@ -203786,69 +203835,69 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203786
203835
|
// add element(s) located via reset button
|
|
203787
203836
|
if (undefined !== nextHit)
|
|
203788
203837
|
await this.processSelection(nextHit.sourceId, SelectionProcessing.AddElementToSelection);
|
|
203789
|
-
return
|
|
203838
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes;
|
|
203790
203839
|
}
|
|
203791
203840
|
}
|
|
203792
|
-
if (
|
|
203793
|
-
return
|
|
203794
|
-
await
|
|
203795
|
-
return
|
|
203841
|
+
if (_Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes === await this.selectDecoration(ev, _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.accuSnap.currHit))
|
|
203842
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes;
|
|
203843
|
+
await _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.accuSnap.resetButton();
|
|
203844
|
+
return _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes;
|
|
203796
203845
|
}
|
|
203797
203846
|
async onSuspend() {
|
|
203798
203847
|
this._isSuspended = true;
|
|
203799
203848
|
if (this.wantEditManipulators())
|
|
203800
|
-
|
|
203849
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.manipulatorToolEvent.raiseEvent(this, _ToolAdmin__WEBPACK_IMPORTED_MODULE_7__.ManipulatorToolEvent.Suspend);
|
|
203801
203850
|
}
|
|
203802
203851
|
async onUnsuspend() {
|
|
203803
203852
|
this._isSuspended = false;
|
|
203804
203853
|
if (this.wantEditManipulators())
|
|
203805
|
-
|
|
203854
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.manipulatorToolEvent.raiseEvent(this, _ToolAdmin__WEBPACK_IMPORTED_MODULE_7__.ManipulatorToolEvent.Unsuspend);
|
|
203806
203855
|
this.showPrompt(this.selectionMode, this.selectionMethod);
|
|
203807
203856
|
}
|
|
203808
203857
|
async onTouchMoveStart(ev, startEv) {
|
|
203809
203858
|
if (startEv.isSingleTouch && !this._isSelectByPoints)
|
|
203810
|
-
await
|
|
203811
|
-
return (this._isSuspended || this._isSelectByPoints) ?
|
|
203859
|
+
await _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.convertTouchMoveStartToButtonDownAndMotion(startEv, ev);
|
|
203860
|
+
return (this._isSuspended || this._isSelectByPoints) ? _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes : _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.No;
|
|
203812
203861
|
}
|
|
203813
203862
|
async onTouchMove(ev) {
|
|
203814
203863
|
if (this._isSelectByPoints)
|
|
203815
|
-
return
|
|
203864
|
+
return _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.convertTouchMoveToMotion(ev);
|
|
203816
203865
|
}
|
|
203817
203866
|
async onTouchComplete(ev) {
|
|
203818
203867
|
if (this._isSelectByPoints)
|
|
203819
|
-
return
|
|
203868
|
+
return _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.convertTouchEndToButtonUp(ev);
|
|
203820
203869
|
}
|
|
203821
203870
|
async onTouchCancel(ev) {
|
|
203822
203871
|
if (this._isSelectByPoints)
|
|
203823
|
-
return
|
|
203872
|
+
return _IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.convertTouchEndToButtonUp(ev, _Tool__WEBPACK_IMPORTED_MODULE_6__.BeButton.Reset);
|
|
203824
203873
|
}
|
|
203825
203874
|
decorate(context) { this.selectByPointsDecorate(context); }
|
|
203826
203875
|
async onModifierKeyTransition(_wentDown, modifier, _event) {
|
|
203827
|
-
return (modifier ===
|
|
203876
|
+
return (modifier === _Tool__WEBPACK_IMPORTED_MODULE_6__.BeModifierKeys.Shift && this._isSelectByPoints) ? _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.Yes : _Tool__WEBPACK_IMPORTED_MODULE_6__.EventHandled.No;
|
|
203828
203877
|
}
|
|
203829
203878
|
async filterHit(hit, out) {
|
|
203830
203879
|
if (!this.wantPickableDecorations() && !hit.isElementHit)
|
|
203831
|
-
return
|
|
203880
|
+
return _ElementLocateManager__WEBPACK_IMPORTED_MODULE_3__.LocateFilterStatus.Reject;
|
|
203832
203881
|
const mode = this.selectionMode;
|
|
203833
203882
|
if (SelectionMode.Replace === mode)
|
|
203834
|
-
return
|
|
203883
|
+
return _ElementLocateManager__WEBPACK_IMPORTED_MODULE_3__.LocateFilterStatus.Accept;
|
|
203835
203884
|
const isSelected = this.iModel.selectionSet.elements.has(hit.sourceId);
|
|
203836
|
-
const status = ((SelectionMode.Add === mode ? !isSelected : isSelected) ?
|
|
203837
|
-
if (out &&
|
|
203838
|
-
out.explanation =
|
|
203885
|
+
const status = ((SelectionMode.Add === mode ? !isSelected : isSelected) ? _ElementLocateManager__WEBPACK_IMPORTED_MODULE_3__.LocateFilterStatus.Accept : _ElementLocateManager__WEBPACK_IMPORTED_MODULE_3__.LocateFilterStatus.Reject);
|
|
203886
|
+
if (out && _ElementLocateManager__WEBPACK_IMPORTED_MODULE_3__.LocateFilterStatus.Reject === status)
|
|
203887
|
+
out.explanation = _Tool__WEBPACK_IMPORTED_MODULE_6__.CoreTools.translate(`ElementSet.Error.${isSelected ? "AlreadySelected" : "NotSelected"}`);
|
|
203839
203888
|
return status;
|
|
203840
203889
|
}
|
|
203841
203890
|
async onRestartTool() { return this.exitTool(); }
|
|
203842
203891
|
async onCleanup() {
|
|
203843
203892
|
if (this.wantEditManipulators())
|
|
203844
|
-
|
|
203893
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.manipulatorToolEvent.raiseEvent(this, _ToolAdmin__WEBPACK_IMPORTED_MODULE_7__.ManipulatorToolEvent.Stop);
|
|
203845
203894
|
}
|
|
203846
203895
|
async onPostInstall() {
|
|
203847
203896
|
await super.onPostInstall();
|
|
203848
203897
|
if (!this.targetView)
|
|
203849
203898
|
return;
|
|
203850
203899
|
if (this.wantEditManipulators())
|
|
203851
|
-
|
|
203900
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.manipulatorToolEvent.raiseEvent(this, _ToolAdmin__WEBPACK_IMPORTED_MODULE_7__.ManipulatorToolEvent.Start);
|
|
203852
203901
|
this.initSelectTool();
|
|
203853
203902
|
}
|
|
203854
203903
|
static async startTool() { return new SelectionTool().run(); }
|
|
@@ -203860,7 +203909,7 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203860
203909
|
}
|
|
203861
203910
|
if (this.wantToolSettings()) {
|
|
203862
203911
|
const syncMode = { value: this._selectionModeValue, propertyName: SelectionTool._modesName };
|
|
203863
|
-
|
|
203912
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.toolSettingsState.saveToolSettingProperty(this.toolId, syncMode);
|
|
203864
203913
|
this.syncToolSettingsProperties([syncMode]);
|
|
203865
203914
|
}
|
|
203866
203915
|
}
|
|
@@ -203871,14 +203920,14 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203871
203920
|
if (!this.wantToolSettings())
|
|
203872
203921
|
return undefined;
|
|
203873
203922
|
// load latest values from session
|
|
203874
|
-
|
|
203923
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.toolSettingsState.getInitialToolSettingValues(this.toolId, [SelectionTool._modesName])?.forEach((value) => {
|
|
203875
203924
|
if (value.propertyName === SelectionTool._modesName)
|
|
203876
203925
|
this._selectionModeValue = value.value;
|
|
203877
203926
|
});
|
|
203878
203927
|
// Make sure a mode of SelectionMode.Remove is valid
|
|
203879
203928
|
if (SelectionMode.Remove === this.selectionMode && !this.iModel.selectionSet.isActive) {
|
|
203880
203929
|
this.selectionMode = SelectionMode.Replace;
|
|
203881
|
-
|
|
203930
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.toolSettingsState.saveToolSettingProperty(this.toolId, { propertyName: SelectionTool._modesName, value: this._selectionModeValue });
|
|
203882
203931
|
}
|
|
203883
203932
|
const toolSettings = new Array();
|
|
203884
203933
|
// generate 3 columns - label will be placed in column 0 and button group editors in columns 1 and 2.
|
|
@@ -203897,7 +203946,7 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203897
203946
|
if (this._selectionMethodValue) {
|
|
203898
203947
|
const currWantManipulators = this.wantEditManipulators();
|
|
203899
203948
|
if (saveWantManipulators !== currWantManipulators)
|
|
203900
|
-
|
|
203949
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.manipulatorToolEvent.raiseEvent(this, currWantManipulators ? _ToolAdmin__WEBPACK_IMPORTED_MODULE_7__.ManipulatorToolEvent.Start : _ToolAdmin__WEBPACK_IMPORTED_MODULE_7__.ManipulatorToolEvent.Stop);
|
|
203901
203950
|
changed = true;
|
|
203902
203951
|
}
|
|
203903
203952
|
}
|
|
@@ -203905,7 +203954,7 @@ class SelectionTool extends _PrimitiveTool__WEBPACK_IMPORTED_MODULE_8__.Primitiv
|
|
|
203905
203954
|
this._selectionModeValue = updatedValue.value;
|
|
203906
203955
|
if (this._selectionModeValue) {
|
|
203907
203956
|
if (this.wantToolSettings())
|
|
203908
|
-
|
|
203957
|
+
_IModelApp__WEBPACK_IMPORTED_MODULE_4__.IModelApp.toolAdmin.toolSettingsState.saveToolSettingProperty(this.toolId, { propertyName: SelectionTool._modesName, value: this._selectionModeValue });
|
|
203909
203958
|
changed = true;
|
|
203910
203959
|
}
|
|
203911
203960
|
}
|
|
@@ -207048,6 +207097,11 @@ class ToolSettings {
|
|
|
207048
207097
|
};
|
|
207049
207098
|
/** Maximum number of times in a second the accuSnap tool's onMotion function is called. */
|
|
207050
207099
|
static maxOnMotionSnapCallPerSecond = 15;
|
|
207100
|
+
/** If true, drag box selection will accept spatial elements that are inside or overlap a clip volume instead of only what is visible in the view.
|
|
207101
|
+
* @note Enabling is not recommended for web applications.
|
|
207102
|
+
* @beta
|
|
207103
|
+
*/
|
|
207104
|
+
static enableVolumeSelection = false;
|
|
207051
207105
|
}
|
|
207052
207106
|
|
|
207053
207107
|
|
|
@@ -212963,7 +213017,13 @@ class BSplineCurve3dBase extends _curve_CurvePrimitive__WEBPACK_IMPORTED_MODULE_
|
|
|
212963
213017
|
* @param fractionB end fraction.
|
|
212964
213018
|
*/
|
|
212965
213019
|
clonePartialCurve(fractionA, fractionB) {
|
|
212966
|
-
|
|
213020
|
+
let clone;
|
|
213021
|
+
if (fractionA > fractionB) {
|
|
213022
|
+
clone = this.clonePartialCurve(fractionB, fractionA);
|
|
213023
|
+
clone.reverseInPlace();
|
|
213024
|
+
return clone;
|
|
213025
|
+
}
|
|
213026
|
+
clone = this.clone();
|
|
212967
213027
|
const origNumKnots = clone._bcurve.knots.knots.length;
|
|
212968
213028
|
let knotA = clone._bcurve.knots.fractionToKnot(fractionA);
|
|
212969
213029
|
let knotB = clone._bcurve.knots.fractionToKnot(fractionB);
|
|
@@ -220690,11 +220750,13 @@ class ClipUtilities {
|
|
|
220690
220750
|
clippedLocalRegion.tryTransformInPlace(localToWorld);
|
|
220691
220751
|
if (!result)
|
|
220692
220752
|
result = (clippedLocalRegion instanceof _curve_UnionRegion__WEBPACK_IMPORTED_MODULE_8__.UnionRegion) ? clippedLocalRegion : _curve_UnionRegion__WEBPACK_IMPORTED_MODULE_8__.UnionRegion.create(clippedLocalRegion);
|
|
220693
|
-
|
|
220694
|
-
result.children.push(...clippedLocalRegion.children);
|
|
220753
|
+
if (clippedLocalRegion instanceof _curve_UnionRegion__WEBPACK_IMPORTED_MODULE_8__.UnionRegion)
|
|
220754
|
+
result.children.push(...clippedLocalRegion.children); // avoid nested UnionRegions
|
|
220755
|
+
else
|
|
220756
|
+
result.tryAddChild(clippedLocalRegion);
|
|
220695
220757
|
}
|
|
220696
220758
|
}
|
|
220697
|
-
return result;
|
|
220759
|
+
return result ? _curve_RegionOps__WEBPACK_IMPORTED_MODULE_7__.RegionOps.simplifyRegionType(result) : undefined;
|
|
220698
220760
|
}
|
|
220699
220761
|
/**
|
|
220700
220762
|
* Compute and return portions of the input curve or region that are within the clipper.
|
|
@@ -225243,7 +225305,7 @@ class Arc3d extends _CurvePrimitive__WEBPACK_IMPORTED_MODULE_1__.CurvePrimitive
|
|
|
225243
225305
|
scaleAboutCenterInPlace(scaleFactor) {
|
|
225244
225306
|
this._matrix.scaleColumnsInPlace(scaleFactor, scaleFactor, 1.0);
|
|
225245
225307
|
}
|
|
225246
|
-
/** Return the (signed
|
|
225308
|
+
/** Return the (signed) area between (a fractional portion of) the arc and the chord between those points. */
|
|
225247
225309
|
areaToChordXY(fraction0, fraction1) {
|
|
225248
225310
|
let detJ = _Geometry__WEBPACK_IMPORTED_MODULE_5__.Geometry.crossProductXYXY(this._matrix.coffs[0], this._matrix.coffs[3], this._matrix.coffs[1], this._matrix.coffs[4]);
|
|
225249
225311
|
// areas in arc of unit circle with radians limits
|
|
@@ -226406,19 +226468,21 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
226406
226468
|
/* harmony export */ CurveChain: () => (/* binding */ CurveChain),
|
|
226407
226469
|
/* harmony export */ CurveCollection: () => (/* binding */ CurveCollection)
|
|
226408
226470
|
/* harmony export */ });
|
|
226409
|
-
/* harmony import */ var
|
|
226471
|
+
/* harmony import */ var _Geometry__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Geometry */ "../../core/geometry/lib/esm/Geometry.js");
|
|
226410
226472
|
/* harmony import */ var _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CurveLocationDetail */ "../../core/geometry/lib/esm/curve/CurveLocationDetail.js");
|
|
226411
|
-
/* harmony import */ var
|
|
226473
|
+
/* harmony import */ var _CurvePrimitive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CurvePrimitive */ "../../core/geometry/lib/esm/curve/CurvePrimitive.js");
|
|
226412
226474
|
/* harmony import */ var _GeometryQuery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GeometryQuery */ "../../core/geometry/lib/esm/curve/GeometryQuery.js");
|
|
226413
|
-
/* harmony import */ var
|
|
226414
|
-
/* harmony import */ var
|
|
226415
|
-
/* harmony import */ var
|
|
226416
|
-
/* harmony import */ var
|
|
226417
|
-
/* harmony import */ var
|
|
226475
|
+
/* harmony import */ var _internalContexts_CloneCurvesContext__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./internalContexts/CloneCurvesContext */ "../../core/geometry/lib/esm/curve/internalContexts/CloneCurvesContext.js");
|
|
226476
|
+
/* harmony import */ var _internalContexts_CloneWithExpandedLineStrings__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./internalContexts/CloneWithExpandedLineStrings */ "../../core/geometry/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js");
|
|
226477
|
+
/* harmony import */ var _internalContexts_CountLinearPartsSearchContext__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./internalContexts/CountLinearPartsSearchContext */ "../../core/geometry/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js");
|
|
226478
|
+
/* harmony import */ var _internalContexts_GapSearchContext__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./internalContexts/GapSearchContext */ "../../core/geometry/lib/esm/curve/internalContexts/GapSearchContext.js");
|
|
226479
|
+
/* harmony import */ var _internalContexts_PlaneAltitudeRangeContext__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./internalContexts/PlaneAltitudeRangeContext */ "../../core/geometry/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js");
|
|
226418
226480
|
/* harmony import */ var _internalContexts_SumLengthsContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internalContexts/SumLengthsContext */ "../../core/geometry/lib/esm/curve/internalContexts/SumLengthsContext.js");
|
|
226419
|
-
/* harmony import */ var
|
|
226420
|
-
/* harmony import */ var
|
|
226421
|
-
/* harmony import */ var
|
|
226481
|
+
/* harmony import */ var _internalContexts_TransformInPlaceContext__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./internalContexts/TransformInPlaceContext */ "../../core/geometry/lib/esm/curve/internalContexts/TransformInPlaceContext.js");
|
|
226482
|
+
/* harmony import */ var _LineString3d__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./LineString3d */ "../../core/geometry/lib/esm/curve/LineString3d.js");
|
|
226483
|
+
/* harmony import */ var _ProxyCurve__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./ProxyCurve */ "../../core/geometry/lib/esm/curve/ProxyCurve.js");
|
|
226484
|
+
/* harmony import */ var _internalContexts_AnnounceTangentStrokeHandler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internalContexts/AnnounceTangentStrokeHandler */ "../../core/geometry/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js");
|
|
226485
|
+
/* harmony import */ var _geometry3d_Matrix3d__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../geometry3d/Matrix3d */ "../../core/geometry/lib/esm/geometry3d/Matrix3d.js");
|
|
226422
226486
|
/*---------------------------------------------------------------------------------------------
|
|
226423
226487
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
226424
226488
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
@@ -226439,6 +226503,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
226439
226503
|
|
|
226440
226504
|
|
|
226441
226505
|
|
|
226506
|
+
|
|
226507
|
+
|
|
226442
226508
|
/**
|
|
226443
226509
|
* A `CurveCollection` is an abstract (non-instantiable) class for various sets of curves with particular structures:
|
|
226444
226510
|
* - [[CurveChain]] - a non-instantiable intermediate class for a sequence of [[CurvePrimitive]] joining head-to-tail.
|
|
@@ -226479,6 +226545,69 @@ class CurveCollection extends _GeometryQuery__WEBPACK_IMPORTED_MODULE_0__.Geomet
|
|
|
226479
226545
|
}
|
|
226480
226546
|
return detailA;
|
|
226481
226547
|
}
|
|
226548
|
+
/**
|
|
226549
|
+
* Announce all points `P` on the contained curves such that the line containing `spacePoint` and `P` is tangent to
|
|
226550
|
+
* the contained curves in the view defined by `options.vectorToEye`.
|
|
226551
|
+
* * Strictly speaking, each tangent line lies in the plane through `P` whose normal is the cross product of the curve
|
|
226552
|
+
* tangent at `P` and `options.vectorToEye`. This is equivalent to tangency as seen in a view plane perpendicular to
|
|
226553
|
+
* `options.vectorToEye`.
|
|
226554
|
+
* @param spacePoint point in space.
|
|
226555
|
+
* @param announceTangent callback to announce each computed tangent. The received [[CurveLocationDetail]] is reused
|
|
226556
|
+
* internally, so it should be cloned in the callback if it needs to be saved.
|
|
226557
|
+
* @param options (optional) options for computing tangents. See [[TangentOptions]] for defaults.
|
|
226558
|
+
*/
|
|
226559
|
+
emitTangents(spacePoint, announceTangent, options) {
|
|
226560
|
+
const strokeHandler = new _internalContexts_AnnounceTangentStrokeHandler__WEBPACK_IMPORTED_MODULE_3__.AnnounceTangentStrokeHandler(spacePoint, announceTangent, options);
|
|
226561
|
+
if (this.children !== undefined) {
|
|
226562
|
+
for (const child of this.children) {
|
|
226563
|
+
if (child instanceof _CurvePrimitive__WEBPACK_IMPORTED_MODULE_4__.CurvePrimitive)
|
|
226564
|
+
child.emitStrokableParts(strokeHandler, options?.strokeOptions);
|
|
226565
|
+
else if (child instanceof CurveCollection)
|
|
226566
|
+
child.emitTangents(spacePoint, announceTangent, options);
|
|
226567
|
+
}
|
|
226568
|
+
}
|
|
226569
|
+
}
|
|
226570
|
+
/**
|
|
226571
|
+
* Return all points `P` on the contained curves such that the line containing `spacePoint` and `P` is tangent to the
|
|
226572
|
+
* contained curves in the view defined by `options.vectorToEye`.
|
|
226573
|
+
* * See [[emitTangents]] for the definition of tangency employed.
|
|
226574
|
+
* @param spacePoint point in space.
|
|
226575
|
+
* @param options (optional) options for computing tangents. See [[TangentOptions]] for defaults.
|
|
226576
|
+
* @returns an array of details of all tangent points or undefined if no tangent was found.
|
|
226577
|
+
*/
|
|
226578
|
+
allTangents(spacePoint, options) {
|
|
226579
|
+
const tangents = [];
|
|
226580
|
+
this.emitTangents(spacePoint, (t) => tangents.push(t.clone()), options);
|
|
226581
|
+
return (tangents.length === 0) ? undefined : tangents;
|
|
226582
|
+
}
|
|
226583
|
+
/**
|
|
226584
|
+
* Return the point `P` on the contained curves such that the line containing `spacePoint` and `P` is tangent to the
|
|
226585
|
+
* contained curves in the view defined by `options.vectorToEye`, and `P` is closest to `options.hintPoint` in this view.
|
|
226586
|
+
* * See [[emitTangents]] for the definition of tangency employed.
|
|
226587
|
+
* @param spacePoint point in space.
|
|
226588
|
+
* @param options (optional) options for computing tangents. See [[TangentOptions]] for defaults.
|
|
226589
|
+
* @returns the detail of the closest tangent point or undefined if no tangent was found.
|
|
226590
|
+
*/
|
|
226591
|
+
closestTangent(spacePoint, options) {
|
|
226592
|
+
const hint = options?.hintPoint ?? spacePoint;
|
|
226593
|
+
let toLocal;
|
|
226594
|
+
if (options?.vectorToEye && !options.vectorToEye.isExactEqual({ x: 0, y: 0, z: 1 }))
|
|
226595
|
+
toLocal = _geometry3d_Matrix3d__WEBPACK_IMPORTED_MODULE_5__.Matrix3d.createRigidViewAxesZTowardsEye(options.vectorToEye.x, options.vectorToEye.y, options.vectorToEye.z);
|
|
226596
|
+
const measureHintDist2 = (pt) => {
|
|
226597
|
+
return toLocal?.multiplyTransposeXYZ(hint.x - pt.x, hint.y - pt.y, hint.z - pt.z).magnitudeSquaredXY() ?? pt.distanceSquaredXY(hint);
|
|
226598
|
+
};
|
|
226599
|
+
let closestTangent;
|
|
226600
|
+
let closestDist2 = _Geometry__WEBPACK_IMPORTED_MODULE_6__.Geometry.largeCoordinateResult;
|
|
226601
|
+
const collectClosestTangent = (tangent) => {
|
|
226602
|
+
const dist2 = measureHintDist2(tangent.point);
|
|
226603
|
+
if (!closestTangent || dist2 < closestDist2) {
|
|
226604
|
+
closestTangent = tangent.clone(closestTangent);
|
|
226605
|
+
closestDist2 = dist2;
|
|
226606
|
+
}
|
|
226607
|
+
};
|
|
226608
|
+
this.emitTangents(spacePoint, collectClosestTangent, options);
|
|
226609
|
+
return closestTangent;
|
|
226610
|
+
}
|
|
226482
226611
|
/** Reverse the collection's data so that each child curve's fractional stroking moves in the opposite direction. */
|
|
226483
226612
|
reverseInPlace() {
|
|
226484
226613
|
for (const curve of this.children)
|
|
@@ -226492,27 +226621,27 @@ class CurveCollection extends _GeometryQuery__WEBPACK_IMPORTED_MODULE_0__.Geomet
|
|
|
226492
226621
|
* "unstructured" so gaps should not be semantically meaningful.
|
|
226493
226622
|
*/
|
|
226494
226623
|
maxGap() {
|
|
226495
|
-
return
|
|
226624
|
+
return _internalContexts_GapSearchContext__WEBPACK_IMPORTED_MODULE_7__.GapSearchContext.maxGap(this);
|
|
226496
226625
|
}
|
|
226497
226626
|
/** Return true if the curve collection has any primitives other than LineSegment3d and LineString3d */
|
|
226498
226627
|
checkForNonLinearPrimitives() {
|
|
226499
|
-
return
|
|
226628
|
+
return _internalContexts_CountLinearPartsSearchContext__WEBPACK_IMPORTED_MODULE_8__.CountLinearPartsSearchContext.hasNonLinearPrimitives(this);
|
|
226500
226629
|
}
|
|
226501
226630
|
/** Apply transform recursively to children */
|
|
226502
226631
|
tryTransformInPlace(transform) {
|
|
226503
|
-
return
|
|
226632
|
+
return _internalContexts_TransformInPlaceContext__WEBPACK_IMPORTED_MODULE_9__.TransformInPlaceContext.tryTransformInPlace(this, transform);
|
|
226504
226633
|
}
|
|
226505
226634
|
/** Return a deep copy. */
|
|
226506
226635
|
clone() {
|
|
226507
|
-
return
|
|
226636
|
+
return _internalContexts_CloneCurvesContext__WEBPACK_IMPORTED_MODULE_10__.CloneCurvesContext.clone(this);
|
|
226508
226637
|
}
|
|
226509
226638
|
/** Create a deep copy of transformed curves. */
|
|
226510
226639
|
cloneTransformed(transform) {
|
|
226511
|
-
return
|
|
226640
|
+
return _internalContexts_CloneCurvesContext__WEBPACK_IMPORTED_MODULE_10__.CloneCurvesContext.clone(this, transform);
|
|
226512
226641
|
}
|
|
226513
226642
|
/** Create a deep copy with all linestrings broken down into multiple LineSegment3d. */
|
|
226514
226643
|
cloneWithExpandedLineStrings() {
|
|
226515
|
-
return
|
|
226644
|
+
return _internalContexts_CloneWithExpandedLineStrings__WEBPACK_IMPORTED_MODULE_11__.CloneWithExpandedLineStrings.clone(this);
|
|
226516
226645
|
}
|
|
226517
226646
|
/**
|
|
226518
226647
|
* Push all CurvePrimitives contained in the instance onto the `results` array.
|
|
@@ -226522,7 +226651,7 @@ class CurveCollection extends _GeometryQuery__WEBPACK_IMPORTED_MODULE_0__.Geomet
|
|
|
226522
226651
|
collectCurvePrimitivesGo(results, smallestPossiblePrimitives, explodeLinestrings = false) {
|
|
226523
226652
|
if (this.children) {
|
|
226524
226653
|
for (const child of this.children) {
|
|
226525
|
-
if (child instanceof
|
|
226654
|
+
if (child instanceof _CurvePrimitive__WEBPACK_IMPORTED_MODULE_4__.CurvePrimitive)
|
|
226526
226655
|
child.collectCurvePrimitivesGo(results, smallestPossiblePrimitives, explodeLinestrings);
|
|
226527
226656
|
else if (child instanceof CurveCollection)
|
|
226528
226657
|
child.collectCurvePrimitivesGo(results, smallestPossiblePrimitives, explodeLinestrings);
|
|
@@ -226602,7 +226731,7 @@ class CurveCollection extends _GeometryQuery__WEBPACK_IMPORTED_MODULE_0__.Geomet
|
|
|
226602
226731
|
static createCurveLocationDetailOnAnyCurvePrimitive(source, fraction = 0.5) {
|
|
226603
226732
|
if (!source)
|
|
226604
226733
|
return undefined;
|
|
226605
|
-
if (source instanceof
|
|
226734
|
+
if (source instanceof _CurvePrimitive__WEBPACK_IMPORTED_MODULE_4__.CurvePrimitive) {
|
|
226606
226735
|
return _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_2__.CurveLocationDetail.createCurveEvaluatedFraction(source, fraction);
|
|
226607
226736
|
}
|
|
226608
226737
|
else if (source instanceof CurveCollection && source.children !== undefined)
|
|
@@ -226622,7 +226751,7 @@ class CurveCollection extends _GeometryQuery__WEBPACK_IMPORTED_MODULE_0__.Geomet
|
|
|
226622
226751
|
* end of the ray.
|
|
226623
226752
|
*/
|
|
226624
226753
|
projectedParameterRange(ray, lowHigh) {
|
|
226625
|
-
return
|
|
226754
|
+
return _internalContexts_PlaneAltitudeRangeContext__WEBPACK_IMPORTED_MODULE_12__.PlaneAltitudeRangeContext.findExtremeFractionsAlongDirection(this, ray, lowHigh);
|
|
226626
226755
|
}
|
|
226627
226756
|
/** Return the immediate parent of the input curve in the instance, or undefined if it is not a descendant. */
|
|
226628
226757
|
findParentOfDescendant(descendant) {
|
|
@@ -226711,7 +226840,7 @@ class CurveChain extends CurveCollection {
|
|
|
226711
226840
|
if (index >= 0 && index < n) // try simplest non-cyclic access first
|
|
226712
226841
|
return this.children[index];
|
|
226713
226842
|
if (cyclic) {
|
|
226714
|
-
const index2 =
|
|
226843
|
+
const index2 = _Geometry__WEBPACK_IMPORTED_MODULE_6__.Geometry.modulo(index, n);
|
|
226715
226844
|
return this.children[index2];
|
|
226716
226845
|
}
|
|
226717
226846
|
return undefined;
|
|
@@ -226731,7 +226860,7 @@ class CurveChain extends CurveCollection {
|
|
|
226731
226860
|
const children = tree.children;
|
|
226732
226861
|
if (children.length === 1) {
|
|
226733
226862
|
const ls = children[0];
|
|
226734
|
-
if (ls instanceof
|
|
226863
|
+
if (ls instanceof _LineString3d__WEBPACK_IMPORTED_MODULE_13__.LineString3d)
|
|
226735
226864
|
return ls.packedPoints;
|
|
226736
226865
|
}
|
|
226737
226866
|
}
|
|
@@ -226743,7 +226872,7 @@ class CurveChain extends CurveCollection {
|
|
|
226743
226872
|
* @return whether the child was added
|
|
226744
226873
|
*/
|
|
226745
226874
|
tryAddChild(child) {
|
|
226746
|
-
if (child && child instanceof
|
|
226875
|
+
if (child && child instanceof _CurvePrimitive__WEBPACK_IMPORTED_MODULE_4__.CurvePrimitive) {
|
|
226747
226876
|
this._curves.push(child);
|
|
226748
226877
|
return true;
|
|
226749
226878
|
}
|
|
@@ -226785,7 +226914,7 @@ class CurveChain extends CurveCollection {
|
|
|
226785
226914
|
if (alsoSearchProxies ?? false) {
|
|
226786
226915
|
for (let i = 0; i < this._curves.length; i++) {
|
|
226787
226916
|
const childCurve = this._curves[i];
|
|
226788
|
-
if (childCurve instanceof
|
|
226917
|
+
if (childCurve instanceof _ProxyCurve__WEBPACK_IMPORTED_MODULE_14__.ProxyCurve) {
|
|
226789
226918
|
if (childCurve.proxyCurve === target)
|
|
226790
226919
|
return i;
|
|
226791
226920
|
}
|
|
@@ -226849,8 +226978,8 @@ class BagOfCurves extends CurveCollection {
|
|
|
226849
226978
|
const clone = new BagOfCurves();
|
|
226850
226979
|
let child;
|
|
226851
226980
|
for (child of this.children) {
|
|
226852
|
-
if (child instanceof
|
|
226853
|
-
const ls =
|
|
226981
|
+
if (child instanceof _CurvePrimitive__WEBPACK_IMPORTED_MODULE_4__.CurvePrimitive) {
|
|
226982
|
+
const ls = _LineString3d__WEBPACK_IMPORTED_MODULE_13__.LineString3d.create();
|
|
226854
226983
|
child.emitStrokes(ls, options);
|
|
226855
226984
|
if (ls)
|
|
226856
226985
|
clone.children.push(ls);
|
|
@@ -227932,19 +228061,19 @@ function optionalUpdate(source, result) {
|
|
|
227932
228061
|
* @public
|
|
227933
228062
|
*/
|
|
227934
228063
|
class CurveLocationDetail {
|
|
227935
|
-
/** The curve being evaluated */
|
|
228064
|
+
/** The curve being evaluated. */
|
|
227936
228065
|
curve;
|
|
227937
|
-
/** Optional ray */
|
|
228066
|
+
/** Optional ray. */
|
|
227938
228067
|
ray;
|
|
227939
|
-
/** The fractional position along the curve */
|
|
228068
|
+
/** The fractional position along the curve. */
|
|
227940
228069
|
fraction;
|
|
227941
|
-
/** Detail condition of the role this point has in some context */
|
|
228070
|
+
/** Detail condition of the role this point has in some context. */
|
|
227942
228071
|
intervalRole;
|
|
227943
|
-
/** The point on the curve */
|
|
228072
|
+
/** The point on the curve. */
|
|
227944
228073
|
point;
|
|
227945
|
-
/** A vector (e.g. tangent vector) in context */
|
|
228074
|
+
/** A vector (e.g. tangent vector) in context. */
|
|
227946
228075
|
vectorInCurveLocationDetail;
|
|
227947
|
-
/** A context-specific numeric value
|
|
228076
|
+
/** A context-specific numeric value (e.g., a distance). */
|
|
227948
228077
|
a;
|
|
227949
228078
|
/**
|
|
227950
228079
|
* Optional CurveLocationDetail with more detail of location. For instance, a detail for fractional position
|
|
@@ -227954,12 +228083,12 @@ class CurveLocationDetail {
|
|
|
227954
228083
|
childDetail;
|
|
227955
228084
|
/**
|
|
227956
228085
|
* A status indicator for certain searches.
|
|
227957
|
-
* * e.g
|
|
228086
|
+
* * e.g., CurvePrimitive.moveSignedDistanceFromFraction.
|
|
227958
228087
|
*/
|
|
227959
228088
|
curveSearchStatus;
|
|
227960
|
-
/** (Optional) second fraction, e.g. end of interval of coincident curves */
|
|
228089
|
+
/** (Optional) second fraction, e.g. end of interval of coincident curves. */
|
|
227961
228090
|
fraction1;
|
|
227962
|
-
/** (Optional) second point, e.g. end of interval of coincident curves */
|
|
228091
|
+
/** (Optional) second point, e.g. end of interval of coincident curves. */
|
|
227963
228092
|
point1;
|
|
227964
228093
|
/** A context-specific temporary point, e.g. for intermediate calculations. */
|
|
227965
228094
|
pointQ;
|
|
@@ -227970,26 +228099,26 @@ class CurveLocationDetail {
|
|
|
227970
228099
|
this.point = _geometry3d_Point3dVector3d__WEBPACK_IMPORTED_MODULE_0__.Point3d.createZero();
|
|
227971
228100
|
this.a = 0.0;
|
|
227972
228101
|
}
|
|
227973
|
-
/** Set the (optional) intervalRole field */
|
|
228102
|
+
/** Set the (optional) intervalRole field. */
|
|
227974
228103
|
setIntervalRole(value) {
|
|
227975
228104
|
this.intervalRole = value;
|
|
227976
228105
|
}
|
|
227977
|
-
/** Set the (optional) fraction1 and point1, using direct assignment (capture!) to point1 */
|
|
228106
|
+
/** Set the (optional) fraction1 and point1, using direct assignment (capture!) to point1. */
|
|
227978
228107
|
captureFraction1Point1(fraction1, point1) {
|
|
227979
228108
|
this.fraction1 = fraction1;
|
|
227980
228109
|
this.point1 = point1;
|
|
227981
228110
|
}
|
|
227982
|
-
/** Test if this pair has fraction1 defined */
|
|
228111
|
+
/** Test if this pair has fraction1 defined. */
|
|
227983
228112
|
get hasFraction1() {
|
|
227984
228113
|
return this.fraction1 !== undefined;
|
|
227985
228114
|
}
|
|
227986
|
-
/** Test if this is an isolated point. This is true if intervalRole is any of (undefined, isolated, isolatedAtVertex) */
|
|
228115
|
+
/** Test if this is an isolated point. This is true if intervalRole is any of (undefined, isolated, isolatedAtVertex). */
|
|
227987
228116
|
get isIsolated() {
|
|
227988
228117
|
return this.intervalRole === undefined
|
|
227989
228118
|
|| this.intervalRole === CurveIntervalRole.isolated
|
|
227990
228119
|
|| this.intervalRole === CurveIntervalRole.isolatedAtVertex;
|
|
227991
228120
|
}
|
|
227992
|
-
/** Return the fraction delta. (0 if no fraction1) */
|
|
228121
|
+
/** Return the fraction delta. (0 if no fraction1). */
|
|
227993
228122
|
get fractionDelta() {
|
|
227994
228123
|
return this.fraction1 !== undefined ? this.fraction1 - this.fraction : 0.0;
|
|
227995
228124
|
}
|
|
@@ -228010,7 +228139,7 @@ class CurveLocationDetail {
|
|
|
228010
228139
|
this.point1 = undefined;
|
|
228011
228140
|
}
|
|
228012
228141
|
/**
|
|
228013
|
-
* Return a complete copy, WITH CAVEATS
|
|
228142
|
+
* Return a complete copy, WITH CAVEATS.
|
|
228014
228143
|
* * curve member is copied as a reference.
|
|
228015
228144
|
* * point and vector members are cloned.
|
|
228016
228145
|
*/
|
|
@@ -228032,9 +228161,9 @@ class CurveLocationDetail {
|
|
|
228032
228161
|
/**
|
|
228033
228162
|
* Updated in this instance.
|
|
228034
228163
|
* * Note that if caller omits `vector` and `a`, those fields are updated to the call-list defaults (NOT left as-is)
|
|
228035
|
-
* * point and vector updates are by data copy (not capture of pointers)
|
|
228036
|
-
* @param fraction (required) fraction to install
|
|
228037
|
-
* @param point
|
|
228164
|
+
* * point and vector updates are by data copy (not capture of pointers).
|
|
228165
|
+
* @param fraction (required) fraction to install.
|
|
228166
|
+
* @param point (required) point to install.
|
|
228038
228167
|
* @param vector (optional) vector to install.
|
|
228039
228168
|
* @param a (optional) numeric value to install.
|
|
228040
228169
|
*/
|
|
@@ -228047,9 +228176,9 @@ class CurveLocationDetail {
|
|
|
228047
228176
|
/**
|
|
228048
228177
|
* Updated in this instance.
|
|
228049
228178
|
* * Note that if caller omits a`, that field is updated to the call-list default (NOT left as-is)
|
|
228050
|
-
* * point and vector updates are by data copy (not capture of the ray members)
|
|
228051
|
-
* @param fraction (required) fraction to install
|
|
228052
|
-
* @param ray (required) point and vector to install
|
|
228179
|
+
* * point and vector updates are by data copy (not capture of the ray members).
|
|
228180
|
+
* @param fraction (required) fraction to install.
|
|
228181
|
+
* @param ray (required) point and vector to install.
|
|
228053
228182
|
* @param a (optional) numeric value to install.
|
|
228054
228183
|
*/
|
|
228055
228184
|
setFR(fraction, ray, a = 0) {
|
|
@@ -228089,7 +228218,7 @@ class CurveLocationDetail {
|
|
|
228089
228218
|
result.point.setFromPoint3d(point);
|
|
228090
228219
|
return result;
|
|
228091
228220
|
}
|
|
228092
|
-
/** Create with CurvePrimitive pointer, fraction, and point coordinates */
|
|
228221
|
+
/** Create with CurvePrimitive pointer, fraction, and point coordinates. */
|
|
228093
228222
|
static createCurveFractionPointDistanceCurveSearchStatus(curve, fraction, point, distance, status, result) {
|
|
228094
228223
|
result = result ? result : new CurveLocationDetail();
|
|
228095
228224
|
result.curve = curve;
|
|
@@ -228185,7 +228314,7 @@ class CurveLocationDetail {
|
|
|
228185
228314
|
* @param fraction candidate fraction
|
|
228186
228315
|
* @param point candidate point
|
|
228187
228316
|
* @param a candidate distance
|
|
228188
|
-
* @returns true if the given distance is smaller (and hence this detail was updated
|
|
228317
|
+
* @returns true if the given distance is smaller (and hence this detail was updated)
|
|
228189
228318
|
*/
|
|
228190
228319
|
updateIfCloserCurveFractionPointDistance(curve, fraction, point, a) {
|
|
228191
228320
|
if (this.a < a)
|
|
@@ -233247,13 +233376,19 @@ class MapCurvePrimitiveToCurveLocationDetailPairArray {
|
|
|
233247
233376
|
* @internal
|
|
233248
233377
|
*/
|
|
233249
233378
|
class PlanarSubdivision {
|
|
233250
|
-
/**
|
|
233379
|
+
/**
|
|
233380
|
+
* Create a graph from an array of curves, and an array of the curves' precomputed intersections.
|
|
233381
|
+
* Z-coordinates are ignored.
|
|
233382
|
+
*/
|
|
233251
233383
|
static assembleHalfEdgeGraph(primitives, allPairs, mergeTolerance = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.smallMetricDistance) {
|
|
233252
|
-
|
|
233384
|
+
// map from key CurvePrimitive to CurveLocationDetailPair
|
|
233385
|
+
const detailByPrimitive = new MapCurvePrimitiveToCurveLocationDetailPairArray();
|
|
233253
233386
|
for (const pair of allPairs)
|
|
233254
233387
|
detailByPrimitive.insertPair(pair);
|
|
233255
|
-
if (primitives.length > detailByPrimitive.primitiveToPair.size)
|
|
233256
|
-
|
|
233388
|
+
if (primitives.length > detailByPrimitive.primitiveToPair.size) {
|
|
233389
|
+
// otherwise, these single-primitive loops are missing from the graph
|
|
233390
|
+
detailByPrimitive.splitAndAppendMissingClosedPrimitives(primitives, mergeTolerance);
|
|
233391
|
+
}
|
|
233257
233392
|
const graph = new _topology_Graph__WEBPACK_IMPORTED_MODULE_5__.HalfEdgeGraph();
|
|
233258
233393
|
for (const entry of detailByPrimitive.primitiveToPair.entries()) {
|
|
233259
233394
|
const p = entry[0];
|
|
@@ -233264,7 +233399,11 @@ class PlanarSubdivision {
|
|
|
233264
233399
|
const detail = getDetailOnCurve(detailPair, p);
|
|
233265
233400
|
const detail0 = _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetail.createCurveFractionPoint(p, detail.fraction, detail.point);
|
|
233266
233401
|
const detail1 = _CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetail.createCurveFractionPoint(p, detail.fraction1, detail.point1);
|
|
233267
|
-
return [
|
|
233402
|
+
return [
|
|
233403
|
+
...accumulator,
|
|
233404
|
+
_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetailPair.createCapture(detail0, detail0),
|
|
233405
|
+
_CurveLocationDetail__WEBPACK_IMPORTED_MODULE_4__.CurveLocationDetailPair.createCapture(detail1, detail1),
|
|
233406
|
+
];
|
|
233268
233407
|
}, []);
|
|
233269
233408
|
// lexical sort on p intersection fraction
|
|
233270
233409
|
details.sort((pairA, pairB) => {
|
|
@@ -233284,9 +233423,9 @@ class PlanarSubdivision {
|
|
|
233284
233423
|
return graph;
|
|
233285
233424
|
}
|
|
233286
233425
|
/**
|
|
233287
|
-
* Create a pair of mated half edges referencing an interval of a primitive
|
|
233288
|
-
*
|
|
233289
|
-
* @param graph containing graph
|
|
233426
|
+
* Create a pair of mated half edges referencing an interval of a primitive.
|
|
233427
|
+
* * no action if start and end points are identical.
|
|
233428
|
+
* @param graph containing graph
|
|
233290
233429
|
* @param p the curve
|
|
233291
233430
|
* @param point0 start point
|
|
233292
233431
|
* @param fraction0 starting fraction
|
|
@@ -233309,7 +233448,8 @@ class PlanarSubdivision {
|
|
|
233309
233448
|
return { point: point1, fraction: fraction1 };
|
|
233310
233449
|
}
|
|
233311
233450
|
/**
|
|
233312
|
-
* Based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative,
|
|
233451
|
+
* Based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative,
|
|
233452
|
+
* or sliver loops.
|
|
233313
233453
|
* @param zeroAreaTolerance absolute area tolerance for sliver face detection
|
|
233314
233454
|
* @param isSliverFace whether the loop is known a priori (e.g., via topology) to have zero area
|
|
233315
233455
|
* @returns the area (forced to zero if within tolerance)
|
|
@@ -234082,9 +234222,10 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
234082
234222
|
/* harmony import */ var _geometry3d_GeometryHandler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../geometry3d/GeometryHandler */ "../../core/geometry/lib/esm/geometry3d/GeometryHandler.js");
|
|
234083
234223
|
/* harmony import */ var _geometry3d_Point3dVector3d__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../geometry3d/Point3dVector3d */ "../../core/geometry/lib/esm/geometry3d/Point3dVector3d.js");
|
|
234084
234224
|
/* harmony import */ var _geometry4d_MomentData__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../geometry4d/MomentData */ "../../core/geometry/lib/esm/geometry4d/MomentData.js");
|
|
234085
|
-
/* harmony import */ var
|
|
234225
|
+
/* harmony import */ var _LineString3d__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./LineString3d */ "../../core/geometry/lib/esm/curve/LineString3d.js");
|
|
234226
|
+
/* harmony import */ var _Loop__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Loop */ "../../core/geometry/lib/esm/curve/Loop.js");
|
|
234086
234227
|
/* harmony import */ var _RegionOps__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./RegionOps */ "../../core/geometry/lib/esm/curve/RegionOps.js");
|
|
234087
|
-
/* harmony import */ var
|
|
234228
|
+
/* harmony import */ var _StrokeOptions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./StrokeOptions */ "../../core/geometry/lib/esm/curve/StrokeOptions.js");
|
|
234088
234229
|
/*---------------------------------------------------------------------------------------------
|
|
234089
234230
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
234090
234231
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
@@ -234096,6 +234237,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
234096
234237
|
|
|
234097
234238
|
|
|
234098
234239
|
|
|
234240
|
+
|
|
234099
234241
|
/**
|
|
234100
234242
|
* Implementation class for computing XY area moments.
|
|
234101
234243
|
* @internal
|
|
@@ -234161,20 +234303,19 @@ class RegionMomentsXY extends _geometry3d_GeometryHandler__WEBPACK_IMPORTED_MODU
|
|
|
234161
234303
|
return momentData;
|
|
234162
234304
|
}
|
|
234163
234305
|
handleAnyRegion(region) {
|
|
234164
|
-
const summedMoments = _geometry4d_MomentData__WEBPACK_IMPORTED_MODULE_3__.MomentData.create();
|
|
234165
234306
|
// guarantee there is no overlapping children
|
|
234166
234307
|
const merged = _RegionOps__WEBPACK_IMPORTED_MODULE_4__.RegionOps.regionBooleanXY(region, undefined, _RegionOps__WEBPACK_IMPORTED_MODULE_4__.RegionBinaryOpType.Union);
|
|
234167
|
-
if (merged)
|
|
234168
|
-
for (const child of merged.children) {
|
|
234169
|
-
const childMoments = child.dispatchToGeometryHandler(this);
|
|
234170
|
-
if (childMoments) {
|
|
234171
|
-
const sign0 = childMoments.signFactor(1.0);
|
|
234172
|
-
summedMoments.accumulateProducts(childMoments, sign0);
|
|
234173
|
-
}
|
|
234174
|
-
}
|
|
234175
|
-
}
|
|
234176
|
-
else {
|
|
234308
|
+
if (!merged)
|
|
234177
234309
|
return undefined;
|
|
234310
|
+
if (merged instanceof _Loop__WEBPACK_IMPORTED_MODULE_5__.Loop)
|
|
234311
|
+
return this.handleLoop(merged);
|
|
234312
|
+
const summedMoments = _geometry4d_MomentData__WEBPACK_IMPORTED_MODULE_3__.MomentData.create();
|
|
234313
|
+
for (const child of merged.children) {
|
|
234314
|
+
const childMoments = child.dispatchToGeometryHandler(this);
|
|
234315
|
+
if (childMoments) {
|
|
234316
|
+
const sign0 = childMoments.signFactor(1.0);
|
|
234317
|
+
summedMoments.accumulateProducts(childMoments, sign0);
|
|
234318
|
+
}
|
|
234178
234319
|
}
|
|
234179
234320
|
return summedMoments;
|
|
234180
234321
|
}
|
|
@@ -234190,7 +234331,7 @@ class RegionMomentsXY extends _geometry3d_GeometryHandler__WEBPACK_IMPORTED_MODU
|
|
|
234190
234331
|
getStrokeOptions() {
|
|
234191
234332
|
if (this._strokeOptions)
|
|
234192
234333
|
return this._strokeOptions;
|
|
234193
|
-
const options =
|
|
234334
|
+
const options = _StrokeOptions__WEBPACK_IMPORTED_MODULE_6__.StrokeOptions.createForCurves();
|
|
234194
234335
|
// this is unusually fine for stroking, but appropriate for sum.
|
|
234195
234336
|
options.angleTol = _geometry3d_Angle__WEBPACK_IMPORTED_MODULE_2__.Angle.createDegrees(5.0);
|
|
234196
234337
|
this._strokeOptions = options;
|
|
@@ -234201,22 +234342,22 @@ class RegionMomentsXY extends _geometry3d_GeometryHandler__WEBPACK_IMPORTED_MODU
|
|
|
234201
234342
|
* * Stroke the curve and accumulate stroke array.
|
|
234202
234343
|
*/
|
|
234203
234344
|
handleCurvePrimitive(cp) {
|
|
234204
|
-
const strokes =
|
|
234345
|
+
const strokes = _LineString3d__WEBPACK_IMPORTED_MODULE_7__.LineString3d.create();
|
|
234205
234346
|
const options = this.getStrokeOptions();
|
|
234206
234347
|
cp.emitStrokes(strokes, options);
|
|
234207
234348
|
this.handleLineString3d(strokes);
|
|
234208
234349
|
}
|
|
234209
234350
|
/** Handle strongly typed BSplineCurve3d as generic curve primitive. */
|
|
234210
234351
|
handleBSplineCurve3d(g) {
|
|
234211
|
-
|
|
234352
|
+
this.handleCurvePrimitive(g);
|
|
234212
234353
|
}
|
|
234213
234354
|
/** Handle strongly typed BSplineCurve3dH as generic curve primitive. */
|
|
234214
234355
|
handleBSplineCurve3dH(g) {
|
|
234215
|
-
|
|
234356
|
+
this.handleCurvePrimitive(g);
|
|
234216
234357
|
}
|
|
234217
234358
|
/** Handle strongly typed TransitionSpiral as generic curve primitive. */
|
|
234218
234359
|
handleTransitionSpiral(g) {
|
|
234219
|
-
|
|
234360
|
+
this.handleCurvePrimitive(g);
|
|
234220
234361
|
}
|
|
234221
234362
|
}
|
|
234222
234363
|
|
|
@@ -234558,6 +234699,28 @@ class RegionOps {
|
|
|
234558
234699
|
const graph = _RegionOpsClassificationSweeps__WEBPACK_IMPORTED_MODULE_12__.RegionOpsFaceToFaceSearch.doPolygonBoolean(loopsA, loopsB, (inA, inB) => (inA && !inB), this._graphCheckPointFunction);
|
|
234559
234700
|
return this.finishGraphToPolyface(graph, triangulate);
|
|
234560
234701
|
}
|
|
234702
|
+
/**
|
|
234703
|
+
* Simplify the type of the region by stripping redundant parent(s).
|
|
234704
|
+
* * No Boolean operations are performed.
|
|
234705
|
+
* * Invalid inputs (such as childless regions) are not corrected.
|
|
234706
|
+
* @param region region to simplify
|
|
234707
|
+
* @returns
|
|
234708
|
+
* * For a [[UnionRegion]] with exactly one child, return it if it is a [[Loop]],
|
|
234709
|
+
* or if it is a [[ParityRegion]] with multiple children, otherwise return the `ParityRegion`'s `Loop`.
|
|
234710
|
+
* * For a `ParityRegion` with exactly one `Loop`, return it.
|
|
234711
|
+
* * All other inputs returned unchanged.
|
|
234712
|
+
*/
|
|
234713
|
+
static simplifyRegionType(region) {
|
|
234714
|
+
if (region instanceof _UnionRegion__WEBPACK_IMPORTED_MODULE_13__.UnionRegion) {
|
|
234715
|
+
if (region.children.length === 1)
|
|
234716
|
+
return this.simplifyRegionType(region.children[0]);
|
|
234717
|
+
}
|
|
234718
|
+
else if (region instanceof _ParityRegion__WEBPACK_IMPORTED_MODULE_8__.ParityRegion) {
|
|
234719
|
+
if (region.children.length === 1)
|
|
234720
|
+
return region.children[0];
|
|
234721
|
+
}
|
|
234722
|
+
return region;
|
|
234723
|
+
}
|
|
234561
234724
|
/**
|
|
234562
234725
|
* Return areas defined by a boolean operation.
|
|
234563
234726
|
* @note For best results, input regions should have correctly oriented loops. See [[sortOuterAndHoleLoopsXY]].
|
|
@@ -234571,8 +234734,6 @@ class RegionOps {
|
|
|
234571
234734
|
* to connect interior loops to exterior loops.
|
|
234572
234735
|
*/
|
|
234573
234736
|
static regionBooleanXY(loopsA, loopsB, operation, mergeTolerance = _Geometry__WEBPACK_IMPORTED_MODULE_2__.Geometry.smallMetricDistance) {
|
|
234574
|
-
// Always return UnionRegion for now, but keep return type as AnyRegion.
|
|
234575
|
-
// In the future, we might return the *simplest* region type.
|
|
234576
234737
|
const result = _UnionRegion__WEBPACK_IMPORTED_MODULE_13__.UnionRegion.create();
|
|
234577
234738
|
const context = _RegionOpsClassificationSweeps__WEBPACK_IMPORTED_MODULE_12__.RegionBooleanContext.create(_RegionOpsClassificationSweeps__WEBPACK_IMPORTED_MODULE_12__.RegionGroupOpType.Union, _RegionOpsClassificationSweeps__WEBPACK_IMPORTED_MODULE_12__.RegionGroupOpType.Union);
|
|
234578
234739
|
context.addMembers(loopsA, loopsB);
|
|
@@ -234591,7 +234752,7 @@ class RegionOps {
|
|
|
234591
234752
|
result.tryAddChild(loop);
|
|
234592
234753
|
}
|
|
234593
234754
|
});
|
|
234594
|
-
return result;
|
|
234755
|
+
return result ? this.simplifyRegionType(result) : undefined;
|
|
234595
234756
|
}
|
|
234596
234757
|
/**
|
|
234597
234758
|
* Return a polyface whose facets are a boolean operation between the input regions.
|
|
@@ -235245,14 +235406,22 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
235245
235406
|
* @internal
|
|
235246
235407
|
*/
|
|
235247
235408
|
class RegionOpsFaceToFaceSearchCallbacks {
|
|
235248
|
-
/** Announce a representative node on the outer face of a component */
|
|
235249
|
-
startComponent(_node) {
|
|
235250
|
-
|
|
235251
|
-
|
|
235252
|
-
/** Announce face
|
|
235253
|
-
|
|
235254
|
-
|
|
235255
|
-
|
|
235409
|
+
/** Announce a representative node on the outer face of a component. */
|
|
235410
|
+
startComponent(_node) {
|
|
235411
|
+
return true;
|
|
235412
|
+
}
|
|
235413
|
+
/** Announce return to outer face. */
|
|
235414
|
+
finishComponent(_node) {
|
|
235415
|
+
return true;
|
|
235416
|
+
}
|
|
235417
|
+
/** Announce face entry. */
|
|
235418
|
+
enterFace(_facePathStack, _newFaceNode) {
|
|
235419
|
+
return true;
|
|
235420
|
+
}
|
|
235421
|
+
/** Announce face exit. */
|
|
235422
|
+
leaveFace(_facePathStack, _newFaceNode) {
|
|
235423
|
+
return true;
|
|
235424
|
+
}
|
|
235256
235425
|
}
|
|
235257
235426
|
/**
|
|
235258
235427
|
* Implementation of `RegionOpsFaceToFaceSearchCallbacks` for binary boolean sweep with polygonal regions.
|
|
@@ -235315,14 +235484,14 @@ class RegionOpsBinaryBooleanSweepCallbacks extends RegionOpsFaceToFaceSearchCall
|
|
|
235315
235484
|
*/
|
|
235316
235485
|
class RegionOpsFaceToFaceSearch {
|
|
235317
235486
|
/**
|
|
235318
|
-
*
|
|
235487
|
+
* Run a DFS with face-to-face step announcements.
|
|
235319
235488
|
* * false return from any function terminates search immediately.
|
|
235320
235489
|
* * all reachable nodes assumed to have both visit masks clear.
|
|
235321
235490
|
* @param graph containing graph.
|
|
235322
235491
|
* @param seed first node to visit.
|
|
235323
235492
|
* @param faceHasBeenVisited mask marking faces that have been seen.
|
|
235324
235493
|
* @param nodeHasBeenVisited mask marking node-to-node step around face.
|
|
235325
|
-
*
|
|
235494
|
+
* @param callbacks callbacks.
|
|
235326
235495
|
*/
|
|
235327
235496
|
static faceToFaceSearchFromOuterLoop(_graph, seed, faceHasBeenVisited, nodeHasBeenVisited, callbacks) {
|
|
235328
235497
|
if (seed.isMaskSet(faceHasBeenVisited))
|
|
@@ -235336,10 +235505,10 @@ class RegionOpsFaceToFaceSearch {
|
|
|
235336
235505
|
let entryNode = faceWalker;
|
|
235337
235506
|
let mate = faceWalker.edgeMate;
|
|
235338
235507
|
if (!mate.isMaskSet(faceHasBeenVisited)) {
|
|
235339
|
-
//
|
|
235340
|
-
//
|
|
235341
|
-
//
|
|
235342
|
-
//
|
|
235508
|
+
// The faceWalker seed is always on the base of the stack.
|
|
235509
|
+
// The stack then contains even-odd pairs of (entryNode, faceNode).
|
|
235510
|
+
// entryNode is the node where a face was entered.
|
|
235511
|
+
// faceNode is another node around that face.
|
|
235343
235512
|
facePathStack.push(faceWalker);
|
|
235344
235513
|
facePathStack.push(mate);
|
|
235345
235514
|
let faceNode = mate.faceSuccessor;
|
|
@@ -235370,13 +235539,13 @@ class RegionOpsFaceToFaceSearch {
|
|
|
235370
235539
|
entryNode = facePathStack[facePathStack.length - 1];
|
|
235371
235540
|
}
|
|
235372
235541
|
if (faceNode.isMaskSet(nodeHasBeenVisited)) {
|
|
235373
|
-
// this is disaster
|
|
235542
|
+
// this is disaster
|
|
235374
235543
|
return;
|
|
235375
235544
|
}
|
|
235376
235545
|
}
|
|
235377
235546
|
}
|
|
235378
235547
|
}
|
|
235379
|
-
// continue at outermost level
|
|
235548
|
+
// continue at outermost level
|
|
235380
235549
|
faceWalker = faceWalker.faceSuccessor;
|
|
235381
235550
|
} while (faceWalker !== seed);
|
|
235382
235551
|
callbacks.finishComponent(seed);
|
|
@@ -235506,7 +235675,9 @@ class RegionGroupMember {
|
|
|
235506
235675
|
this.parentGroup = parentGroup;
|
|
235507
235676
|
this.sweepState = 0;
|
|
235508
235677
|
}
|
|
235509
|
-
clearState() {
|
|
235678
|
+
clearState() {
|
|
235679
|
+
this.sweepState = 0;
|
|
235680
|
+
}
|
|
235510
235681
|
}
|
|
235511
235682
|
/**
|
|
235512
235683
|
* A `RegionGroup` is
|
|
@@ -235733,9 +235904,8 @@ class RegionBooleanContext {
|
|
|
235733
235904
|
this._announceFaceFunction = announceFaceFunction;
|
|
235734
235905
|
this.binaryOp = binaryOp;
|
|
235735
235906
|
this.graph.clearMask(_topology_Graph__WEBPACK_IMPORTED_MODULE_0__.HalfEdgeMask.EXTERIOR);
|
|
235736
|
-
for (const group of [this.groupA, this.groupB])
|
|
235907
|
+
for (const group of [this.groupA, this.groupB])
|
|
235737
235908
|
group.clearState();
|
|
235738
|
-
}
|
|
235739
235909
|
const faceHasBeenVisitedMask = this.graph.grabMask();
|
|
235740
235910
|
const nodeHasBeenVisitedMask = this.graph.grabMask();
|
|
235741
235911
|
const componentArray = GraphComponentArray.create(this.graph);
|
|
@@ -235816,18 +235986,19 @@ class RegionBooleanContext {
|
|
|
235816
235986
|
return undefined;
|
|
235817
235987
|
}
|
|
235818
235988
|
// obligations to act as sweep callback ...
|
|
235819
|
-
/** Announce a representative node on the outer face of a component */
|
|
235989
|
+
/** Announce a representative node on the outer face of a component. */
|
|
235820
235990
|
startComponent(outerFaceNode) {
|
|
235821
235991
|
outerFaceNode.setMaskAroundFace(_topology_Graph__WEBPACK_IMPORTED_MODULE_0__.HalfEdgeMask.EXTERIOR);
|
|
235822
235992
|
if (this._announceFaceFunction)
|
|
235823
235993
|
this._announceFaceFunction(this.graph, outerFaceNode, -1, faceAreaFromCurvedEdgeData(outerFaceNode));
|
|
235824
235994
|
return true;
|
|
235825
235995
|
}
|
|
235826
|
-
/** Announce return to outer face */
|
|
235996
|
+
/** Announce return to outer face. */
|
|
235827
235997
|
finishComponent(_node) {
|
|
235828
235998
|
return true;
|
|
235829
235999
|
}
|
|
235830
|
-
/**
|
|
236000
|
+
/**
|
|
236001
|
+
* Announce entry to a graph face.
|
|
235831
236002
|
* * Both both sides of a graph edge are from the same RegionGroupMember.
|
|
235832
236003
|
* * Hence "crossing that edge" changes the parity count for the RegionGroupMember that owns that edge by 1.
|
|
235833
236004
|
* * The parity count for other RegionGroupMembers are never affected by this crossing.
|
|
@@ -235848,8 +236019,9 @@ class RegionBooleanContext {
|
|
|
235848
236019
|
return true;
|
|
235849
236020
|
}
|
|
235850
236021
|
}
|
|
235851
|
-
/**
|
|
235852
|
-
*
|
|
236022
|
+
/**
|
|
236023
|
+
* Return xy area between (part of) a curve and the x axis through a reference point.
|
|
236024
|
+
* If detail is undefined or does not have both start and end fractions, just do trapezoid area.
|
|
235853
236025
|
*/
|
|
235854
236026
|
function areaUnderPartialCurveXY(detail, xyStart, xyEnd, referencePoint) {
|
|
235855
236027
|
// area between trapezoid and axis
|
|
@@ -235863,15 +236035,21 @@ function areaUnderPartialCurveXY(detail, xyStart, xyEnd, referencePoint) {
|
|
|
235863
236035
|
let areaToChord = 0.0;
|
|
235864
236036
|
if (detail && detail.curve && detail.hasFraction1) {
|
|
235865
236037
|
if (detail.curve instanceof _LineSegment3d__WEBPACK_IMPORTED_MODULE_12__.LineSegment3d) {
|
|
235866
|
-
//
|
|
236038
|
+
// nothing to do for a line segment
|
|
235867
236039
|
}
|
|
235868
236040
|
else if (detail.curve instanceof _Arc3d__WEBPACK_IMPORTED_MODULE_19__.Arc3d) {
|
|
235869
236041
|
areaToChord = detail.curve.areaToChordXY(detail.fraction, detail.fraction1);
|
|
235870
236042
|
}
|
|
236043
|
+
else {
|
|
236044
|
+
const partial = detail.curve.clonePartialCurve(detail.fraction, detail.fraction1);
|
|
236045
|
+
areaToChord = partial ?
|
|
236046
|
+
_RegionOps__WEBPACK_IMPORTED_MODULE_1__.RegionOps.computeXYArea(_Loop__WEBPACK_IMPORTED_MODULE_8__.Loop.create(partial, _LineSegment3d__WEBPACK_IMPORTED_MODULE_12__.LineSegment3d.create(detail.point1, detail.point))) ?? 0
|
|
236047
|
+
: 0;
|
|
236048
|
+
}
|
|
235871
236049
|
}
|
|
235872
236050
|
return trapezoidArea + areaToChord;
|
|
235873
236051
|
}
|
|
235874
|
-
/** Compute face area for a face whose edges are decorated with CurveLocationDetail for their (partial) curves */
|
|
236052
|
+
/** Compute face area for a face whose edges are decorated with CurveLocationDetail for their (partial) curves. */
|
|
235875
236053
|
function faceAreaFromCurvedEdgeData(faceSeed) {
|
|
235876
236054
|
let area = 0.0;
|
|
235877
236055
|
let edge = faceSeed;
|
|
@@ -235894,8 +236072,7 @@ class GraphComponent {
|
|
|
235894
236072
|
this.faceAreas = [];
|
|
235895
236073
|
}
|
|
235896
236074
|
/**
|
|
235897
|
-
*
|
|
235898
|
-
*
|
|
236075
|
+
* Visit all vertices and edges in the component to build face area array and composite range.
|
|
235899
236076
|
* @param extendRangeForEdge optional function to compute edge range. If undefined, linear edge is assumed.
|
|
235900
236077
|
* @param faceAreaFunction optional function to compute face area. If undefined, linear edges are assumed.
|
|
235901
236078
|
*/
|
|
@@ -235919,7 +236096,8 @@ class GraphComponent {
|
|
|
235919
236096
|
}
|
|
235920
236097
|
}
|
|
235921
236098
|
}
|
|
235922
|
-
/**
|
|
236099
|
+
/**
|
|
236100
|
+
* Build and hold an array of component data for a HalfEdgeGraph.
|
|
235923
236101
|
* @internal
|
|
235924
236102
|
*/
|
|
235925
236103
|
class GraphComponentArray {
|
|
@@ -238407,6 +238585,8 @@ class CurveCurveIntersectXY extends _geometry3d_GeometryHandler__WEBPACK_IMPORTE
|
|
|
238407
238585
|
// The line segment in question might be (a) a full line segment or (b) a fragment within a linestring.
|
|
238408
238586
|
// The fraction and extend parameters allow all combinations to be passed in.
|
|
238409
238587
|
dispatchSegmentArc(cpA, extendA0, pointA0, fractionA0, pointA1, fractionA1, extendA1, arc, extendB0, extendB1, reversed) {
|
|
238588
|
+
const tol2 = this._coincidentGeometryContext.tolerance * this._coincidentGeometryContext.tolerance;
|
|
238589
|
+
let dist2;
|
|
238410
238590
|
// Arc: X = C + cU + sV
|
|
238411
238591
|
// Line: contains points A0,A1
|
|
238412
238592
|
// Arc point colinear with line if det (A0, A1, X) = 0
|
|
@@ -238417,6 +238597,10 @@ class CurveCurveIntersectXY extends _geometry3d_GeometryHandler__WEBPACK_IMPORTE
|
|
|
238417
238597
|
// project back to line.
|
|
238418
238598
|
if (this._worldToLocalPerspective) {
|
|
238419
238599
|
const data = arc.toTransformedPoint4d(this._worldToLocalPerspective);
|
|
238600
|
+
const radians0 = data.sweep.fractionToRadians(0);
|
|
238601
|
+
const pointB0H = data.center.plus2Scaled(data.vector0, Math.cos(radians0), data.vector90, Math.sin(radians0));
|
|
238602
|
+
const radians1 = data.sweep.fractionToRadians(1);
|
|
238603
|
+
const pointB1H = data.center.plus2Scaled(data.vector0, Math.cos(radians1), data.vector90, Math.sin(radians1));
|
|
238420
238604
|
const pointA0H = this._worldToLocalPerspective.multiplyPoint3d(pointA0, 1);
|
|
238421
238605
|
const pointA1H = this._worldToLocalPerspective.multiplyPoint3d(pointA1, 1);
|
|
238422
238606
|
const alpha = _Geometry__WEBPACK_IMPORTED_MODULE_5__.Geometry.tripleProductPoint4dXYW(pointA0H, pointA1H, data.center);
|
|
@@ -238426,19 +238610,31 @@ class CurveCurveIntersectXY extends _geometry3d_GeometryHandler__WEBPACK_IMPORTE
|
|
|
238426
238610
|
const sines = new _geometry3d_GrowableFloat64Array__WEBPACK_IMPORTED_MODULE_9__.GrowableFloat64Array(2);
|
|
238427
238611
|
const radians = new _geometry3d_GrowableFloat64Array__WEBPACK_IMPORTED_MODULE_9__.GrowableFloat64Array(2);
|
|
238428
238612
|
const numRoots = _numerics_Polynomials__WEBPACK_IMPORTED_MODULE_10__.AnalyticRoots.appendImplicitLineUnitCircleIntersections(alpha, beta, gamma, cosines, sines, radians);
|
|
238613
|
+
if (numRoots <= 0)
|
|
238614
|
+
return;
|
|
238429
238615
|
for (let i = 0; i < numRoots; i++) {
|
|
238430
238616
|
const arcPoint = data.center.plus2Scaled(data.vector0, cosines.atUncheckedIndex(i), data.vector90, sines.atUncheckedIndex(i));
|
|
238431
|
-
|
|
238617
|
+
let arcFraction = data.sweep.radiansToSignedFraction(radians.atUncheckedIndex(i), extendB0);
|
|
238432
238618
|
const lineFraction = _numerics_SmallSystem__WEBPACK_IMPORTED_MODULE_8__.SmallSystem.lineSegment3dHXYClosestPointUnbounded(pointA0H, pointA1H, arcPoint);
|
|
238433
|
-
if (lineFraction !== undefined
|
|
238434
|
-
this.acceptFraction(extendA0, lineFraction, extendA1) &&
|
|
238435
|
-
|
|
238436
|
-
|
|
238619
|
+
if (lineFraction !== undefined) {
|
|
238620
|
+
if (this.acceptFraction(extendA0, lineFraction, extendA1) && this.acceptFraction(extendB0, arcFraction, extendB1)) {
|
|
238621
|
+
this.recordPointWithLocalFractions(lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed);
|
|
238622
|
+
}
|
|
238623
|
+
else { // check for endpoint intersections beyond parametric tolerance but within point tolerance
|
|
238624
|
+
const pointAH = lineFraction < 0.5 ? pointA0H : pointA1H;
|
|
238625
|
+
const pointBH = (arcFraction = data.sweep.fractionToSignedPeriodicFraction(arcFraction)) < 0.5 ? pointB0H : pointB1H;
|
|
238626
|
+
if ((dist2 = pointAH.realDistanceSquaredXY(pointBH)) !== undefined && _Geometry__WEBPACK_IMPORTED_MODULE_5__.Geometry.isDistanceWithinTol(dist2, tol2))
|
|
238627
|
+
this.recordPointWithLocalFractions(lineFraction < 0.5 ? 0 : 1, cpA, fractionA0, fractionA1, arcFraction < 0.5 ? 0 : 1, arc, 0, 1, reversed);
|
|
238628
|
+
}
|
|
238437
238629
|
}
|
|
238438
238630
|
}
|
|
238439
238631
|
}
|
|
238440
238632
|
else {
|
|
238441
238633
|
const data = arc.toTransformedVectors(this._worldToLocalAffine);
|
|
238634
|
+
const radians0 = data.sweep.fractionToRadians(0);
|
|
238635
|
+
const pointB0Local = data.center.plus2Scaled(data.vector0, Math.cos(radians0), data.vector90, Math.sin(radians0));
|
|
238636
|
+
const radians1 = data.sweep.fractionToRadians(1);
|
|
238637
|
+
const pointB1Local = data.center.plus2Scaled(data.vector0, Math.cos(radians1), data.vector90, Math.sin(radians1));
|
|
238442
238638
|
let pointA0Local = pointA0;
|
|
238443
238639
|
let pointA1Local = pointA1;
|
|
238444
238640
|
if (this._worldToLocalAffine) {
|
|
@@ -238452,16 +238648,22 @@ class CurveCurveIntersectXY extends _geometry3d_GeometryHandler__WEBPACK_IMPORTE
|
|
|
238452
238648
|
const sines = new _geometry3d_GrowableFloat64Array__WEBPACK_IMPORTED_MODULE_9__.GrowableFloat64Array(2);
|
|
238453
238649
|
const radians = new _geometry3d_GrowableFloat64Array__WEBPACK_IMPORTED_MODULE_9__.GrowableFloat64Array(2);
|
|
238454
238650
|
const numRoots = _numerics_Polynomials__WEBPACK_IMPORTED_MODULE_10__.AnalyticRoots.appendImplicitLineUnitCircleIntersections(alpha, beta, gamma, cosines, sines, radians);
|
|
238455
|
-
|
|
238456
|
-
|
|
238651
|
+
if (numRoots <= 0)
|
|
238652
|
+
return;
|
|
238457
238653
|
for (let i = 0; i < numRoots; i++) {
|
|
238458
238654
|
const arcPoint = data.center.plus2Scaled(data.vector0, cosines.atUncheckedIndex(i), data.vector90, sines.atUncheckedIndex(i));
|
|
238459
|
-
|
|
238655
|
+
let arcFraction = data.sweep.radiansToSignedFraction(radians.atUncheckedIndex(i), extendB0);
|
|
238460
238656
|
const lineFraction = _numerics_SmallSystem__WEBPACK_IMPORTED_MODULE_8__.SmallSystem.lineSegment3dXYClosestPointUnbounded(pointA0Local, pointA1Local, arcPoint);
|
|
238461
|
-
if (lineFraction !== undefined
|
|
238462
|
-
this.acceptFraction(extendA0, lineFraction, extendA1,
|
|
238463
|
-
|
|
238464
|
-
|
|
238657
|
+
if (lineFraction !== undefined) {
|
|
238658
|
+
if (this.acceptFraction(extendA0, lineFraction, extendA1) && this.acceptFraction(extendB0, arcFraction, extendB1)) {
|
|
238659
|
+
this.recordPointWithLocalFractions(lineFraction, cpA, fractionA0, fractionA1, arcFraction, arc, 0, 1, reversed);
|
|
238660
|
+
}
|
|
238661
|
+
else { // check for endpoint intersections beyond parametric tolerance but within point tolerance
|
|
238662
|
+
const pointALocal = lineFraction < 0.5 ? pointA0Local : pointA1Local;
|
|
238663
|
+
const pointBLocal = (arcFraction = data.sweep.fractionToSignedPeriodicFraction(arcFraction)) < 0.5 ? pointB0Local : pointB1Local;
|
|
238664
|
+
if ((dist2 = pointALocal.distanceSquaredXY(pointBLocal)) !== undefined && _Geometry__WEBPACK_IMPORTED_MODULE_5__.Geometry.isDistanceWithinTol(dist2, tol2))
|
|
238665
|
+
this.recordPointWithLocalFractions(lineFraction < 0.5 ? 0 : 1, cpA, fractionA0, fractionA1, arcFraction < 0.5 ? 0 : 1, arc, 0, 1, reversed);
|
|
238666
|
+
}
|
|
238465
238667
|
}
|
|
238466
238668
|
}
|
|
238467
238669
|
}
|
|
@@ -238629,7 +238831,7 @@ class CurveCurveIntersectXY extends _geometry3d_GeometryHandler__WEBPACK_IMPORTE
|
|
|
238629
238831
|
}
|
|
238630
238832
|
return ranges;
|
|
238631
238833
|
}
|
|
238632
|
-
dispatchBezierBezierStrokeFirst(bezierA, bcurveA, strokeCountA, bezierB, bcurveB, _strokeCountB, univariateBezierB, // caller-allocated for univariate coefficients
|
|
238834
|
+
dispatchBezierBezierStrokeFirst(bezierA, bcurveA, strokeCountA, bezierB, bcurveB, _strokeCountB, univariateBezierB, // caller-allocated for univariate coefficients
|
|
238633
238835
|
reversed) {
|
|
238634
238836
|
if (!this._xyzwA0)
|
|
238635
238837
|
this._xyzwA0 = _geometry4d_Point4d__WEBPACK_IMPORTED_MODULE_3__.Point4d.create();
|
|
@@ -238673,7 +238875,7 @@ class CurveCurveIntersectXY extends _geometry3d_GeometryHandler__WEBPACK_IMPORTE
|
|
|
238673
238875
|
let bezierBFraction = r;
|
|
238674
238876
|
bezierB.fractionToPoint4d(bezierBFraction, this._xyzwB);
|
|
238675
238877
|
const segmentAFraction = _numerics_SmallSystem__WEBPACK_IMPORTED_MODULE_8__.SmallSystem.lineSegment3dHXYClosestPointUnbounded(this._xyzwA0, this._xyzwA1, this._xyzwB);
|
|
238676
|
-
if (segmentAFraction && _Geometry__WEBPACK_IMPORTED_MODULE_5__.Geometry.isIn01WithTolerance(segmentAFraction, intervalTolerance)) {
|
|
238878
|
+
if (segmentAFraction !== undefined && _Geometry__WEBPACK_IMPORTED_MODULE_5__.Geometry.isIn01WithTolerance(segmentAFraction, intervalTolerance)) {
|
|
238677
238879
|
let bezierAFraction = _Geometry__WEBPACK_IMPORTED_MODULE_5__.Geometry.interpolate(f0, segmentAFraction, f1);
|
|
238678
238880
|
// We have a near intersection at fractions on the two beziers
|
|
238679
238881
|
// Iterate on the curves for a true intersection
|
|
@@ -238695,7 +238897,7 @@ class CurveCurveIntersectXY extends _geometry3d_GeometryHandler__WEBPACK_IMPORTE
|
|
|
238695
238897
|
}
|
|
238696
238898
|
}
|
|
238697
238899
|
}
|
|
238698
|
-
dispatchBSplineCurve3dBSplineCurve3d(bcurveA, bcurveB,
|
|
238900
|
+
dispatchBSplineCurve3dBSplineCurve3d(bcurveA, bcurveB, reversed) {
|
|
238699
238901
|
const bezierSpanA = bcurveA.collectBezierSpans(true);
|
|
238700
238902
|
const bezierSpanB = bcurveB.collectBezierSpans(true);
|
|
238701
238903
|
const numA = bezierSpanA.length;
|
|
@@ -238714,9 +238916,9 @@ class CurveCurveIntersectXY extends _geometry3d_GeometryHandler__WEBPACK_IMPORTE
|
|
|
238714
238916
|
const strokeCountA = bezierSpanA[a].computeStrokeCountForOptions();
|
|
238715
238917
|
const strokeCountB = bezierSpanB[b].computeStrokeCountForOptions();
|
|
238716
238918
|
if (strokeCountA < strokeCountB)
|
|
238717
|
-
this.dispatchBezierBezierStrokeFirst(bezierSpanA[a], bcurveA, strokeCountA, bezierSpanB[b], bcurveB, strokeCountB, univariateCoffsB,
|
|
238919
|
+
this.dispatchBezierBezierStrokeFirst(bezierSpanA[a], bcurveA, strokeCountA, bezierSpanB[b], bcurveB, strokeCountB, univariateCoffsB, reversed);
|
|
238718
238920
|
else
|
|
238719
|
-
this.dispatchBezierBezierStrokeFirst(bezierSpanB[b], bcurveB, strokeCountB, bezierSpanA[a], bcurveA, strokeCountA, univariateCoffsA, !
|
|
238921
|
+
this.dispatchBezierBezierStrokeFirst(bezierSpanB[b], bcurveB, strokeCountB, bezierSpanA[a], bcurveA, strokeCountA, univariateCoffsA, !reversed);
|
|
238720
238922
|
}
|
|
238721
238923
|
}
|
|
238722
238924
|
}
|
|
@@ -246077,8 +246279,10 @@ class AngleSweep {
|
|
|
246077
246279
|
* @param fraction fraction of the sweep.
|
|
246078
246280
|
* @param radians0 start angle of sweep (in radians).
|
|
246079
246281
|
* @param radians1 end angle of sweep (in radians).
|
|
246080
|
-
* @param toNegativeFraction
|
|
246081
|
-
*
|
|
246282
|
+
* @param toNegativeFraction exterior fraction handling:
|
|
246283
|
+
* * if true, return `fraction` period-shifted to within one period of the start
|
|
246284
|
+
* * if false, return `fraction` period-shifted to within one period of the end
|
|
246285
|
+
* * if undefined, return the period-shift of `fraction` closest to [0,1].
|
|
246082
246286
|
* @returns period-shifted fraction. If `fraction` is already in [0,1], or the sweep is empty, then `fraction` is
|
|
246083
246287
|
* returned unchanged.
|
|
246084
246288
|
*/
|
|
@@ -246092,16 +246296,25 @@ class AngleSweep {
|
|
|
246092
246296
|
fraction = fraction % period; // period-shifted equivalent fraction closest to 0 with same sign as fraction
|
|
246093
246297
|
if (fraction + period < 1)
|
|
246094
246298
|
fraction += period; // it's really an interior fraction
|
|
246095
|
-
if (_Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.isIn01(fraction)
|
|
246299
|
+
if (_Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.isIn01(fraction))
|
|
246096
246300
|
return fraction;
|
|
246097
|
-
|
|
246301
|
+
if (toNegativeFraction === true)
|
|
246302
|
+
return fraction < 0 ? fraction : fraction - period;
|
|
246303
|
+
if (toNegativeFraction === false)
|
|
246304
|
+
return fraction > 1 ? fraction : fraction + period;
|
|
246305
|
+
const fractionDistFrom01 = fraction < 0 ? -fraction : fraction - 1;
|
|
246306
|
+
const fraction2 = fraction < 0 ? fraction + period : fraction - period; // period-shift with opposite sign
|
|
246307
|
+
const fraction2DistFrom01 = fraction2 < 0 ? -fraction2 : fraction2 - 1;
|
|
246308
|
+
return fractionDistFrom01 < fraction2DistFrom01 ? fraction : fraction2; // choose the period-shift closer to [0,1]
|
|
246098
246309
|
}
|
|
246099
246310
|
/**
|
|
246100
246311
|
* Convert a sweep fraction to the equivalent period-shifted fraction inside this sweep, or within one period of
|
|
246101
246312
|
* zero on the desired side.
|
|
246102
246313
|
* @param fraction fraction of the sweep.
|
|
246103
|
-
* @param toNegativeFraction
|
|
246104
|
-
*
|
|
246314
|
+
* @param toNegativeFraction exterior fraction handling:
|
|
246315
|
+
* * if true, return `fraction` period-shifted to within one period of the start
|
|
246316
|
+
* * if false, return `fraction` period-shifted to within one period of the end
|
|
246317
|
+
* * if undefined, return the period-shift of `fraction` closest to [0,1].
|
|
246105
246318
|
* @returns period-shifted fraction. If `fraction` is already in [0,1], or the sweep is empty, then `fraction` is
|
|
246106
246319
|
* returned unchanged.
|
|
246107
246320
|
*/
|
|
@@ -268808,8 +269021,7 @@ class Point4d extends _geometry3d_Plane3d__WEBPACK_IMPORTED_MODULE_0__.Plane3d {
|
|
|
268808
269021
|
distanceSquaredXYZW(other) {
|
|
268809
269022
|
return _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.hypotenuseSquaredXYZW(other.xyzw[0] - this.xyzw[0], other.xyzw[1] - this.xyzw[1], other.xyzw[2] - this.xyzw[2], other.xyzw[3] - this.xyzw[3]);
|
|
268810
269023
|
}
|
|
268811
|
-
/** Return the distance between the instance and other after normalizing by weights
|
|
268812
|
-
*/
|
|
269024
|
+
/** Return the xy distance between the instance and `other` after normalizing by weights */
|
|
268813
269025
|
realDistanceXY(other) {
|
|
268814
269026
|
const wA = this.w;
|
|
268815
269027
|
const wB = other.w;
|
|
@@ -268817,6 +269029,14 @@ class Point4d extends _geometry3d_Plane3d__WEBPACK_IMPORTED_MODULE_0__.Plane3d {
|
|
|
268817
269029
|
return undefined;
|
|
268818
269030
|
return _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.hypotenuseXY(other.xyzw[0] / wB - this.xyzw[0] / wA, other.xyzw[1] / wB - this.xyzw[1] / wA);
|
|
268819
269031
|
}
|
|
269032
|
+
/** Return the xy squared distance between the instance and `other` after normalizing by weights */
|
|
269033
|
+
realDistanceSquaredXY(other) {
|
|
269034
|
+
const wA = this.w;
|
|
269035
|
+
const wB = other.w;
|
|
269036
|
+
if (_Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.isSmallMetricDistance(wA) || _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.isSmallMetricDistance(wB))
|
|
269037
|
+
return undefined;
|
|
269038
|
+
return _Geometry__WEBPACK_IMPORTED_MODULE_1__.Geometry.hypotenuseSquaredXY(other.xyzw[0] / wB - this.xyzw[0] / wA, other.xyzw[1] / wB - this.xyzw[1] / wA);
|
|
269039
|
+
}
|
|
268820
269040
|
/** Return the largest absolute distance between corresponding components
|
|
268821
269041
|
* * x,y,z,w all participate without normalization.
|
|
268822
269042
|
*/
|
|
@@ -269553,6 +269773,7 @@ class BezierCoffs {
|
|
|
269553
269773
|
roots(targetValue, _restrictTo01) {
|
|
269554
269774
|
const bezier = UnivariateBezier.create(this);
|
|
269555
269775
|
bezier.addInPlace(-targetValue);
|
|
269776
|
+
bezier.clampZero();
|
|
269556
269777
|
const roots = UnivariateBezier.deflateRoots(bezier);
|
|
269557
269778
|
return this.filter01(roots, true);
|
|
269558
269779
|
}
|
|
@@ -269616,6 +269837,16 @@ class BezierCoffs {
|
|
|
269616
269837
|
}
|
|
269617
269838
|
return d;
|
|
269618
269839
|
}
|
|
269840
|
+
/** Assist Newton with slow-to-converge roots at e.g., Bezier endpoints. */
|
|
269841
|
+
clampZero(maxAbs = _Geometry__WEBPACK_IMPORTED_MODULE_0__.Geometry.smallFloatingPoint) {
|
|
269842
|
+
if (maxAbs > 0) {
|
|
269843
|
+
for (let i = 0; i < this.coffs.length; ++i) {
|
|
269844
|
+
const coff = this.coffs[i];
|
|
269845
|
+
if (coff && Math.abs(coff) < maxAbs)
|
|
269846
|
+
this.coffs[i] = 0.0;
|
|
269847
|
+
}
|
|
269848
|
+
}
|
|
269849
|
+
}
|
|
269619
269850
|
}
|
|
269620
269851
|
/**
|
|
269621
269852
|
* Static methods to operate on univariate bezier polynomials, with coefficients in simple Float64Array or as components of blocked arrays.
|
|
@@ -274426,10 +274657,10 @@ class SmallSystem {
|
|
|
274426
274657
|
* @param spacePoint homogeneous point in space
|
|
274427
274658
|
*/
|
|
274428
274659
|
static lineSegment3dHXYClosestPointUnbounded(hA0, hA1, spacePoint) {
|
|
274429
|
-
// Considering only x,y,w parts
|
|
274660
|
+
// Considering only x,y,w parts.
|
|
274430
274661
|
// weighted difference of (A1 w0 - A0 w1) is (cartesian) tangent vector along the line as viewed.
|
|
274431
|
-
// The perpendicular (pure vector) W = (-y,x) flip is the direction of projection
|
|
274432
|
-
// Point Q along A is (in full homogeneous)
|
|
274662
|
+
// The perpendicular (pure vector) W = (-y,x) flip is the direction of projection.
|
|
274663
|
+
// Point Q along A is (in full homogeneous) `(1-lambda) A0 + lambda 1 A1`.
|
|
274433
274664
|
// PointQ is colinear with spacePoint and and W when the xyw homogeneous determinant | Q W spacePoint | is zero.
|
|
274434
274665
|
const tx = hA1.x * hA0.w - hA0.x * hA1.w;
|
|
274435
274666
|
const ty = hA1.y * hA0.w - hA0.y * hA1.w;
|
|
@@ -277182,7 +277413,7 @@ class IndexedPolyfaceVisitor extends _PolyfaceData__WEBPACK_IMPORTED_MODULE_0__.
|
|
|
277182
277413
|
*/
|
|
277183
277414
|
class IndexedPolyfaceSubsetVisitor extends IndexedPolyfaceVisitor {
|
|
277184
277415
|
_facetIndices;
|
|
277185
|
-
_currentSubsetIndex; // index within _facetIndices
|
|
277416
|
+
_currentSubsetIndex; // index within _facetIndices
|
|
277186
277417
|
_nextSubsetIndex; // index within _facetIndices
|
|
277187
277418
|
constructor(polyface, facetIndices, numWrap) {
|
|
277188
277419
|
super(polyface, numWrap);
|
|
@@ -303938,6 +304169,7 @@ class HalfEdgeGraphSearch {
|
|
|
303938
304169
|
}
|
|
303939
304170
|
/**
|
|
303940
304171
|
* Search the graph for the face with the most negative area.
|
|
304172
|
+
* * If the graph has exactly one connected component, this is its outer face.
|
|
303941
304173
|
* @param oneCandidateNodePerFace graph or an array containing one node from each face to be considered.
|
|
303942
304174
|
* @returns node on the negative area face with largest absolute area, or `undefined` if no negative area face.
|
|
303943
304175
|
*/
|
|
@@ -330231,7 +330463,7 @@ class TestContext {
|
|
|
330231
330463
|
this.initializeRpcInterfaces({ title: this.settings.Backend.name, version: this.settings.Backend.version });
|
|
330232
330464
|
const iModelClient = new imodels_client_management_1.IModelsClient({ api: { baseUrl: `https://${process.env.IMJS_URL_PREFIX ?? ""}api.bentley.com/imodels` } });
|
|
330233
330465
|
await core_frontend_1.NoRenderApp.startup({
|
|
330234
|
-
applicationVersion: "5.1.0-dev.
|
|
330466
|
+
applicationVersion: "5.1.0-dev.25",
|
|
330235
330467
|
applicationId: this.settings.gprid,
|
|
330236
330468
|
authorizationClient: new frontend_1.TestFrontendAuthorizationClient(this.serviceAuthToken),
|
|
330237
330469
|
hubAccess: new imodels_access_frontend_1.FrontendIModelsAccess(iModelClient),
|
|
@@ -355279,7 +355511,7 @@ var loadLanguages = instance.loadLanguages;
|
|
|
355279
355511
|
/***/ ((module) => {
|
|
355280
355512
|
|
|
355281
355513
|
"use strict";
|
|
355282
|
-
module.exports = /*#__PURE__*/JSON.parse('{"name":"@itwin/core-frontend","version":"5.1.0-dev.
|
|
355514
|
+
module.exports = /*#__PURE__*/JSON.parse('{"name":"@itwin/core-frontend","version":"5.1.0-dev.25","description":"iTwin.js frontend components","main":"lib/cjs/core-frontend.js","module":"lib/esm/core-frontend.js","typings":"lib/cjs/core-frontend","license":"MIT","scripts":{"build":"npm run -s copy:public && npm run -s build:cjs && npm run -s build:esm && npm run -s webpackWorkers && npm run -s copy:workers","build:cjs":"npm run -s copy:js:cjs && tsc 1>&2 --outDir lib/cjs","build:esm":"npm run -s copy:js:esm && tsc 1>&2 --module ES2022 --outDir lib/esm","clean":"rimraf -g lib .rush/temp/package-deps*.json","copy:public":"cpx \\"./src/public/**/*\\" ./lib/public","copy:js:cjs":"cpx \\"./src/**/*.js\\" ./lib/cjs","copy:js:esm":"cpx \\"./src/**/*.js\\" ./lib/esm","copy:workers":"cpx \\"./lib/workers/webpack/parse-imdl-worker.js\\" ./lib/public/scripts","docs":"betools docs --json=../../generated-docs/core/core-frontend/file.json --tsIndexFile=./core-frontend.ts --onlyJson --excludes=webgl/**/*,**/map/*.d.ts,**/tile/*.d.ts,**/*-css.ts","extract-api":"betools extract-api --entry=core-frontend && npm run extract-extension-api","extract-extension-api":"eslint --no-inline-config -c extraction.eslint.config.js \\"./src/**/*.ts\\" 1>&2","lint":"eslint \\"./src/**/*.ts\\" 1>&2","lint-fix":"eslint --fix -f visualstudio \\"./src/**/*.ts\\" 1>&2","pseudolocalize":"betools pseudolocalize --englishDir ./src/public/locales/en --out ./public/locales/en-PSEUDO","test":"npm run webpackTestWorker && vitest --run","cover":"npm run webpackTestWorker && vitest --run","webpackTests":"webpack --config ./src/test/utils/webpack.config.js 1>&2 && npm run -s webpackTestWorker","webpackTestWorker":"webpack --config ./src/test/worker/webpack.config.js 1>&2 && cpx \\"./lib/test/test-worker.js\\" ./lib/test","webpackWorkers":"webpack --config ./src/workers/ImdlParser/webpack.config.js 1>&2"},"repository":{"type":"git","url":"https://github.com/iTwin/itwinjs-core.git","directory":"core/frontend"},"keywords":["Bentley","BIM","iModel","digital-twin","iTwin"],"author":{"name":"Bentley Systems, Inc.","url":"http://www.bentley.com"},"peerDependencies":{"@itwin/appui-abstract":"workspace:*","@itwin/core-bentley":"workspace:*","@itwin/core-common":"workspace:*","@itwin/core-geometry":"workspace:*","@itwin/core-orbitgt":"workspace:*","@itwin/core-quantity":"workspace:*","@itwin/ecschema-metadata":"workspace:*","@itwin/ecschema-rpcinterface-common":"workspace:*"},"//devDependencies":["NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install","NOTE: All tools used by scripts in this package must be listed as devDependencies"],"devDependencies":{"@itwin/appui-abstract":"workspace:*","@itwin/build-tools":"workspace:*","@itwin/core-bentley":"workspace:*","@itwin/core-common":"workspace:*","@itwin/core-geometry":"workspace:*","@itwin/core-orbitgt":"workspace:*","@itwin/core-quantity":"workspace:*","@itwin/ecschema-metadata":"workspace:*","@itwin/ecschema-rpcinterface-common":"workspace:*","@itwin/eslint-plugin":"5.0.0-dev.1","@types/chai-as-promised":"^7","@vitest/browser":"^3.0.6","@vitest/coverage-v8":"^3.0.6","cpx2":"^8.0.0","eslint":"^9.13.0","glob":"^10.3.12","playwright":"~1.47.1","rimraf":"^6.0.1","source-map-loader":"^5.0.0","typescript":"~5.6.2","typemoq":"^2.1.0","vitest":"^3.0.6","vite-multiple-assets":"^1.3.1","vite-plugin-static-copy":"2.2.0","webpack":"^5.97.1"},"//dependencies":["NOTE: these dependencies should be only for things that DO NOT APPEAR IN THE API","NOTE: core-frontend should remain UI technology agnostic, so no react/angular dependencies are allowed"],"dependencies":{"@itwin/cloud-agnostic-core":"^2.2.4","@itwin/object-storage-core":"^2.3.0","@itwin/core-i18n":"workspace:*","@itwin/webgl-compatibility":"workspace:*","@loaders.gl/core":"^3.1.6","@loaders.gl/draco":"^3.1.6","fuse.js":"^3.3.0","wms-capabilities":"0.4.0"}}');
|
|
355283
355515
|
|
|
355284
355516
|
/***/ }),
|
|
355285
355517
|
|