@toolpath/viewer 1.1.1 → 1.2.0
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/README.md +866 -94
- package/dist/{chunk-4BU4QZCL.js → chunk-HWAEUJ4H.js} +636 -277
- package/dist/engine/index.d.ts +2 -2
- package/dist/engine/index.js +1 -1
- package/dist/index.d.ts +615 -198
- package/dist/index.js +1000 -1
- package/dist/{normalize-OULo7e0F.d.ts → normalize-DHOSNiuO.d.ts} +221 -139
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { Group, Mesh, LineSegments, Box3, Plane, BufferGeometry,
|
|
2
|
+
import { Group, Mesh, LineSegments, Box3, Plane, BufferGeometry, Vector3, Raycaster, Object3D, Intersection, Camera } from 'three';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* The normalized part — the only thing the renderer consumes.
|
|
@@ -175,8 +175,13 @@ interface ViewerTheme {
|
|
|
175
175
|
/** `EdgesGeometry` line color and opacity. */
|
|
176
176
|
readonly edge: number;
|
|
177
177
|
readonly edgeOpacity: number;
|
|
178
|
-
/**
|
|
178
|
+
/**
|
|
179
|
+
* The capped face of a section cut: its fill, and the hatch lines drawn over
|
|
180
|
+
* it. The cap's edge takes {@link ViewerTheme.sectionHandleOutline}.
|
|
181
|
+
*/
|
|
179
182
|
readonly sectionCap: number;
|
|
183
|
+
readonly sectionHatch: number;
|
|
184
|
+
/** The cutting plane itself — the translucent sheet `<SectionTool>` draws, its outline, and the surface preview. */
|
|
180
185
|
readonly sectionOutline: number;
|
|
181
186
|
/**
|
|
182
187
|
* The arrow that drags the cut, and the shell that outlines it. Hovered it
|
|
@@ -184,6 +189,13 @@ interface ViewerTheme {
|
|
|
184
189
|
*/
|
|
185
190
|
readonly sectionHandle: number;
|
|
186
191
|
readonly sectionHandleOutline: number;
|
|
192
|
+
/**
|
|
193
|
+
* A measurement: its lines, end markers, arc and label border, as
|
|
194
|
+
* `<MeasureTool>` draws them. The indicator that shows where the pointer
|
|
195
|
+
* will snap takes {@link ViewerTheme.measureSnap}.
|
|
196
|
+
*/
|
|
197
|
+
readonly measure: number;
|
|
198
|
+
readonly measureSnap: number;
|
|
187
199
|
/**
|
|
188
200
|
* The view cube's panels, the lines between them, and its face names. A
|
|
189
201
|
* hovered panel takes {@link ViewerTheme.hover}, the same color the part uses
|
|
@@ -397,101 +409,144 @@ interface HighlightLayers {
|
|
|
397
409
|
declare function applyHighlightLayers(part: PartObject, layers: HighlightLayers, theme: ViewerTheme): void;
|
|
398
410
|
|
|
399
411
|
/**
|
|
400
|
-
*
|
|
401
|
-
*
|
|
402
|
-
*
|
|
403
|
-
* platform convention — command on a Mac, control everywhere else — and which
|
|
404
|
-
* key means what belongs to the app, not to a viewport.
|
|
412
|
+
* Render order. The stencil pass must precede the cap, and the part must draw
|
|
413
|
+
* after both or it overwrites the cap it is supposed to be capped by. The part
|
|
414
|
+
* draws at 3 and its edges at 4, so the handle sits above the cap it stands on.
|
|
405
415
|
*/
|
|
406
|
-
|
|
407
|
-
readonly
|
|
408
|
-
readonly
|
|
409
|
-
readonly
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
declare const
|
|
416
|
+
declare const SECTION_RENDER_ORDER: {
|
|
417
|
+
readonly stencil: 1;
|
|
418
|
+
readonly cap: 2;
|
|
419
|
+
readonly handle: 6;
|
|
420
|
+
/** The tool's translucent plane and its outline, over everything but the handle. */
|
|
421
|
+
readonly outline: 5;
|
|
422
|
+
};
|
|
423
|
+
/** The handle's length on screen, in CSS pixels, whatever the zoom. */
|
|
424
|
+
declare const HANDLE_PIXELS = 78;
|
|
415
425
|
/**
|
|
416
|
-
*
|
|
417
|
-
*
|
|
418
|
-
*
|
|
419
|
-
* `owners` travels alongside `best` on purpose. A click resolves to five to
|
|
420
|
-
* eight readings and the ranking puts one of them up; that is a *default*, not
|
|
421
|
-
* a claim of correctness, and a consumer that was handed only the winner could
|
|
422
|
-
* not offer the alternatives it silently discarded.
|
|
426
|
+
* The hatch on the cap: stripe pitch and line thickness in CSS pixels, and the
|
|
427
|
+
* outline's width. Screen-space, so the cut reads the same at any zoom.
|
|
423
428
|
*/
|
|
424
|
-
|
|
425
|
-
readonly
|
|
426
|
-
|
|
427
|
-
readonly
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
429
|
+
declare const CAP_HATCH: {
|
|
430
|
+
readonly pitch: 9;
|
|
431
|
+
readonly line: 1.25;
|
|
432
|
+
readonly outline: 1.5;
|
|
433
|
+
};
|
|
434
|
+
/**
|
|
435
|
+
* The global cutting planes the tool offers: how far outside the part each one
|
|
436
|
+
* stands, and how much larger than the part it is drawn. Both are fractions of
|
|
437
|
+
* the part's largest dimension.
|
|
438
|
+
*/
|
|
439
|
+
declare const AXES_PLANE_OFFSET = 0.55;
|
|
440
|
+
declare const AXES_PLANE_SCALE = 1.2;
|
|
441
|
+
/** The surface preview under the pointer, as a fraction of the part's diagonal. */
|
|
442
|
+
declare const PREVIEW_SCALE = 0.125;
|
|
443
|
+
/** How far the tool's translucent plane extends past the part, as a fraction of the diagonal. */
|
|
444
|
+
declare const OUTLINE_SCALE = 1.2;
|
|
445
|
+
interface SectionOptions {
|
|
446
|
+
enabled: boolean;
|
|
437
447
|
/**
|
|
438
|
-
*
|
|
439
|
-
*
|
|
440
|
-
* Reported rather than interpreted, for the same reason the modifiers are:
|
|
441
|
-
* what a second click means belongs to the app. A viewer that decided —
|
|
442
|
-
* withholding the pick so a double click could not disturb the selection —
|
|
443
|
-
* would be right for a list that walks through a face's readings and wrong
|
|
444
|
-
* for an editor where clicking a face twice puts it in and takes it out
|
|
445
|
-
* again. Both are ordinary, and only the app knows which one it is showing.
|
|
446
|
-
*
|
|
447
|
-
* The viewport still acts on the gesture itself: `retargetOnDoubleClick`
|
|
448
|
-
* re-aims the orbit, which is a question about the view rather than about the
|
|
449
|
-
* part, and is nobody else's to answer.
|
|
448
|
+
* The half-space that stays. Defaults to +Z, which keeps the top of the part
|
|
449
|
+
* and eats upward from the bottom as `offset` grows.
|
|
450
450
|
*/
|
|
451
|
-
|
|
451
|
+
normal?: Vec3;
|
|
452
|
+
/** Where the sweep sits, 0 (whole part) to 1 (gone). */
|
|
453
|
+
offset?: number;
|
|
454
|
+
/** Key the cut off one surface instead, usually from `sectionFromPick`. */
|
|
455
|
+
plane?: SectionPlacement | null;
|
|
456
|
+
/** How far past that surface to cut, in model units. */
|
|
457
|
+
depth?: number;
|
|
452
458
|
}
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
readonly
|
|
457
|
-
readonly
|
|
458
|
-
readonly
|
|
459
|
-
readonly
|
|
460
|
-
readonly normal: readonly [number, number, number];
|
|
461
|
-
readonly modifiers?: PickModifiers;
|
|
459
|
+
interface SectionState {
|
|
460
|
+
readonly enabled: boolean;
|
|
461
|
+
readonly normal: Vec3;
|
|
462
|
+
readonly offset: number;
|
|
463
|
+
readonly constant: number;
|
|
464
|
+
readonly plane: SectionPlacement | null;
|
|
465
|
+
readonly depth: number | null;
|
|
462
466
|
/**
|
|
463
|
-
*
|
|
464
|
-
*
|
|
465
|
-
*
|
|
466
|
-
*
|
|
467
|
+
* How far the cut can travel from its anchor, in model units, or `null` for a
|
|
468
|
+
* sweep — which is measured as a fraction of the part rather than a distance.
|
|
469
|
+
*
|
|
470
|
+
* Reported because a control that moves the cut has to be bounded by the same
|
|
471
|
+
* numbers the cut is, and only the viewer knows the part's extent along a
|
|
472
|
+
* given normal.
|
|
467
473
|
*/
|
|
468
|
-
readonly
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
474
|
+
readonly depthRange: {
|
|
475
|
+
readonly min: number;
|
|
476
|
+
readonly max: number;
|
|
477
|
+
} | null;
|
|
478
|
+
}
|
|
479
|
+
declare const DEFAULT_SECTION_NORMAL: Vec3;
|
|
480
|
+
/**
|
|
481
|
+
* What is reported when a cut goes away.
|
|
482
|
+
*
|
|
483
|
+
* A state rather than `null`, so a consumer that echoes the callback into its
|
|
484
|
+
* own state never has to special-case the absence: `enabled` says it.
|
|
485
|
+
*/
|
|
486
|
+
declare const DISABLED_SECTION: SectionState;
|
|
487
|
+
/**
|
|
488
|
+
* The options that would resolve to `state` again.
|
|
489
|
+
*
|
|
490
|
+
* A cut keyed off a surface keeps its anchor and is moved by depth; a sweep is
|
|
491
|
+
* moved by offset. The state carries both descriptions, and which one to keep
|
|
492
|
+
* is what makes a dragged cut stay anchored to the face it was picked from.
|
|
493
|
+
*/
|
|
494
|
+
declare function sectionOptionsFromState(state: SectionState): SectionOptions;
|
|
495
|
+
/** One of the three global cutting planes the tool offers. */
|
|
496
|
+
interface AxesPlane {
|
|
497
|
+
/** Which world axis the plane is perpendicular to. */
|
|
498
|
+
readonly axis: 'x' | 'y' | 'z';
|
|
499
|
+
/** Which side of the part the camera is on along that axis, +1 or -1. */
|
|
500
|
+
readonly sign: 1 | -1;
|
|
501
|
+
/** Where to draw it: outside the part, on the side away from the camera. */
|
|
502
|
+
readonly position: Vec3;
|
|
503
|
+
/** Its edge length. */
|
|
504
|
+
readonly size: number;
|
|
505
|
+
/** The sweep a click on it starts: cutting in from the camera's side, halfway through. */
|
|
506
|
+
readonly options: SectionOptions;
|
|
472
507
|
}
|
|
473
|
-
declare function buildPick(input: BuildPickInput): PartPick;
|
|
474
508
|
/**
|
|
475
|
-
*
|
|
509
|
+
* Where the three global planes stand for a camera at `eye`.
|
|
476
510
|
*
|
|
477
|
-
*
|
|
478
|
-
*
|
|
479
|
-
*
|
|
511
|
+
* They sit past the part on the side *away* from the camera, like the walls of
|
|
512
|
+
* a room the part is standing in, so the part is never hidden behind them —
|
|
513
|
+
* and each one cuts in from the camera's own side, which is the half of the
|
|
514
|
+
* part somebody looking at it can see into. A camera dead on an axis has no
|
|
515
|
+
* side along the other two; they fall to +1, so the planes still stand
|
|
516
|
+
* somewhere rather than at the part's centre.
|
|
480
517
|
*/
|
|
481
|
-
declare function
|
|
482
|
-
|
|
518
|
+
declare function axesPlanes(box: Box3, eye: Vec3): readonly AxesPlane[];
|
|
519
|
+
/** A point on the part under the pointer, with the surface's outward normal in world space. */
|
|
520
|
+
interface SurfaceHit {
|
|
521
|
+
readonly point: Vector3;
|
|
522
|
+
readonly normal: Vector3;
|
|
523
|
+
}
|
|
483
524
|
/**
|
|
484
|
-
*
|
|
485
|
-
*
|
|
486
|
-
*
|
|
525
|
+
* The nearest hit on the part along `raycaster`'s ray, or `null`.
|
|
526
|
+
*
|
|
527
|
+
* "The part" is whatever in the scene is a visible mesh outside an overlay —
|
|
528
|
+
* every overlay here marks its outermost group with `EXCLUDE_FROM_FRAME`, the
|
|
529
|
+
* same flag that keeps it out of the camera's framing, and the ones that are
|
|
530
|
+
* not clickable turn their own raycast off besides. What is left is the
|
|
531
|
+
* geometry the consumer put in.
|
|
532
|
+
*
|
|
533
|
+
* A surface a section cut has clipped away is skipped too. three's raycaster
|
|
534
|
+
* knows nothing about clipping planes, so without this a ray through the open
|
|
535
|
+
* half of a cut part lands on a face nobody can see — and a tool that previews
|
|
536
|
+
* or measures there is working on something that is not on screen.
|
|
487
537
|
*/
|
|
488
|
-
declare
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
declare
|
|
538
|
+
declare function hitUnderRay(raycaster: Raycaster, root: Object3D): Intersection | null;
|
|
539
|
+
/**
|
|
540
|
+
* The nearest surface of the part along `raycaster`'s ray, or `null`, with the
|
|
541
|
+
* surface's outward normal in world space. Used by the tool to preview a cut
|
|
542
|
+
* on a hovered face without the part having to tell it where the pointer is.
|
|
543
|
+
*/
|
|
544
|
+
declare function surfaceUnderRay(raycaster: Raycaster, root: Object3D): SurfaceHit | null;
|
|
545
|
+
/**
|
|
546
|
+
* Where the cut's plane meets the line through the part's centre along its
|
|
547
|
+
* normal — where the cap, the handle and the tool's outline all sit.
|
|
548
|
+
*/
|
|
549
|
+
declare function sectionAnchor(box: Box3, plane: Plane, into?: Vector3): Vector3;
|
|
495
550
|
interface SectionBounds {
|
|
496
551
|
/** Plane constant at which the whole part is clipped away. */
|
|
497
552
|
readonly min: number;
|
|
@@ -586,68 +641,89 @@ declare function sectionPlane(box: Box3, normal: Vec3, offset: number, into?: Pl
|
|
|
586
641
|
*/
|
|
587
642
|
declare function dragPlane(axis: Vector3, view: Vector3, point: Vector3, into?: Plane): Plane;
|
|
588
643
|
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
644
|
+
/**
|
|
645
|
+
* Which modifier keys were down when the pick happened.
|
|
646
|
+
*
|
|
647
|
+
* Reported rather than interpreted: "hold this to add to the selection" is a
|
|
648
|
+
* platform convention — command on a Mac, control everywhere else — and which
|
|
649
|
+
* key means what belongs to the app, not to a viewport.
|
|
650
|
+
*/
|
|
651
|
+
interface PickModifiers {
|
|
652
|
+
readonly alt: boolean;
|
|
653
|
+
readonly ctrl: boolean;
|
|
654
|
+
readonly meta: boolean;
|
|
655
|
+
readonly shift: boolean;
|
|
656
|
+
/** The right button, on a click that did not become a pan. */
|
|
657
|
+
readonly secondary: boolean;
|
|
602
658
|
}
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
659
|
+
declare const NO_MODIFIERS: PickModifiers;
|
|
660
|
+
/**
|
|
661
|
+
* A pointer event on the part, resolved to the face it landed on and the
|
|
662
|
+
* features that own it.
|
|
663
|
+
*
|
|
664
|
+
* `owners` travels alongside `best` on purpose. A click resolves to five to
|
|
665
|
+
* eight readings and the ranking puts one of them up; that is a *default*, not
|
|
666
|
+
* a claim of correctness, and a consumer that was handed only the winner could
|
|
667
|
+
* not offer the alternatives it silently discarded.
|
|
668
|
+
*/
|
|
669
|
+
interface PartPick {
|
|
670
|
+
readonly region: number;
|
|
671
|
+
/** Every feature owning the face, in report order. */
|
|
672
|
+
readonly owners: readonly FeatureTag[];
|
|
673
|
+
/** The same set, ranked for this click. Filtered by an active direction. */
|
|
674
|
+
readonly ranked: readonly FeatureTag[];
|
|
675
|
+
/** The ranked pick, or `null` when nothing here is reachable that way. */
|
|
676
|
+
readonly best: FeatureTag | null;
|
|
677
|
+
readonly triangleIndex: number;
|
|
678
|
+
readonly point: readonly [number, number, number];
|
|
679
|
+
/** The surface's outward normal in world space — the plane under the cursor. */
|
|
680
|
+
readonly normal: readonly [number, number, number];
|
|
681
|
+
readonly modifiers: PickModifiers;
|
|
610
682
|
/**
|
|
611
|
-
*
|
|
612
|
-
* sweep — which is measured as a fraction of the part rather than a distance.
|
|
683
|
+
* Whether this click completed a double click on the part.
|
|
613
684
|
*
|
|
614
|
-
* Reported
|
|
615
|
-
*
|
|
616
|
-
*
|
|
685
|
+
* Reported rather than interpreted, for the same reason the modifiers are:
|
|
686
|
+
* what a second click means belongs to the app. A viewer that decided —
|
|
687
|
+
* withholding the pick so a double click could not disturb the selection —
|
|
688
|
+
* would be right for a list that walks through a face's readings and wrong
|
|
689
|
+
* for an editor where clicking a face twice puts it in and takes it out
|
|
690
|
+
* again. Both are ordinary, and only the app knows which one it is showing.
|
|
691
|
+
*
|
|
692
|
+
* The viewport still acts on the gesture itself: `retargetOnDoubleClick`
|
|
693
|
+
* re-aims the orbit, which is a question about the view rather than about the
|
|
694
|
+
* part, and is nobody else's to answer.
|
|
617
695
|
*/
|
|
618
|
-
readonly
|
|
619
|
-
readonly min: number;
|
|
620
|
-
readonly max: number;
|
|
621
|
-
} | null;
|
|
696
|
+
readonly doubled: boolean;
|
|
622
697
|
}
|
|
623
|
-
/**
|
|
624
|
-
declare function
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
698
|
+
/** A unit vector from the part toward the camera, for the owner ranking. */
|
|
699
|
+
declare function viewDirection(camera: Camera, target: Vector3): Vec3;
|
|
700
|
+
interface BuildPickInput {
|
|
701
|
+
readonly model: PartModel;
|
|
702
|
+
readonly region: number;
|
|
703
|
+
readonly triangleIndex: number;
|
|
704
|
+
readonly point: readonly [number, number, number];
|
|
705
|
+
readonly normal: readonly [number, number, number];
|
|
706
|
+
readonly modifiers?: PickModifiers;
|
|
707
|
+
/**
|
|
708
|
+
* The machining direction the pick is scoped to, as an index into
|
|
709
|
+
* `candidateDirections`. Narrows the owners to two, one, or **none** — the
|
|
710
|
+
* empty case is real, and reads as "nothing here in this direction" rather
|
|
711
|
+
* than as a pick that missed.
|
|
712
|
+
*/
|
|
713
|
+
readonly activeDirection?: number | null;
|
|
714
|
+
readonly viewDirection?: Vec3 | null;
|
|
715
|
+
/** Whether this click completed a double click. Defaults to `false`. */
|
|
716
|
+
readonly doubled?: boolean;
|
|
635
717
|
}
|
|
718
|
+
declare function buildPick(input: BuildPickInput): PartPick;
|
|
636
719
|
/**
|
|
637
|
-
*
|
|
638
|
-
*
|
|
639
|
-
* The cap is the standard two-pass stencil trick: draw the clipped geometry's
|
|
640
|
-
* back faces incrementing the stencil and its front faces decrementing it, so a
|
|
641
|
-
* non-zero stencil marks exactly where the plane passes through solid material,
|
|
642
|
-
* then fill that region with a quad. Without it a section shows the inside of
|
|
643
|
-
* the far wall and the part reads as hollow.
|
|
720
|
+
* The owner to focus for a click, given what the last click focused.
|
|
644
721
|
*
|
|
645
|
-
*
|
|
646
|
-
*
|
|
647
|
-
*
|
|
648
|
-
* confusing way to find out.
|
|
722
|
+
* Clicking the same face again walks its readings — the standard CAD escape
|
|
723
|
+
* hatch for an ambiguous click — while a click on a different face starts from
|
|
724
|
+
* that face's own best answer.
|
|
649
725
|
*/
|
|
650
|
-
declare
|
|
726
|
+
declare function focusForPick(pick: PartPick, previousRegion: number | null, previousFocus: FeatureTag | null): FeatureTag | null;
|
|
651
727
|
|
|
652
728
|
interface PartMeshProps {
|
|
653
729
|
/** The normalized report. `engine/normalize.ts` produces it. */
|
|
@@ -692,17 +768,23 @@ interface PartMeshProps {
|
|
|
692
768
|
*/
|
|
693
769
|
activeDirection?: number | null;
|
|
694
770
|
/**
|
|
695
|
-
* The section cut.
|
|
771
|
+
* The section cut. Pass `enabled: false` for none.
|
|
696
772
|
*
|
|
697
773
|
* Either sweep an axis — `normal` points into the half that stays and
|
|
698
774
|
* `offset` runs 0 (whole) to 1 (gone) — or key the cut off one surface with
|
|
699
775
|
* `plane`, which `depth` then moves in model units. `sectionFromPick` turns a
|
|
700
776
|
* pick into that placement with the normal the right way round.
|
|
777
|
+
*
|
|
778
|
+
* **Omit it** and the part follows the cut the viewer holds for itself — the
|
|
779
|
+
* one `<SectionTool>` places and `ViewerHandle.setSection` sets — and shows
|
|
780
|
+
* the handle whenever there is one. Passing it takes that over: the cut is
|
|
781
|
+
* then the consumer's, and the viewer's own is ignored.
|
|
701
782
|
*/
|
|
702
783
|
section?: SectionOptions;
|
|
703
784
|
/**
|
|
704
785
|
* The cut changed, including when the handle was dragged. Emitted only on a
|
|
705
|
-
* real change, so echoing it into state is safe.
|
|
786
|
+
* real change, so echoing it into state is safe. A cut going away is
|
|
787
|
+
* reported as `enabled: false`, once.
|
|
706
788
|
*/
|
|
707
789
|
onSectionChange?: (state: SectionState) => void;
|
|
708
790
|
/**
|
|
@@ -818,4 +900,4 @@ declare function normalizePartReport(report: unknown): PartModel;
|
|
|
818
900
|
*/
|
|
819
901
|
declare function assertSupportedKernelVersion(kernelVersion: string): void;
|
|
820
902
|
|
|
821
|
-
export {
|
|
903
|
+
export { type SurfaceHit as $, AXES_PLANE_OFFSET as A, type BuildPickInput as B, CANDIDATE_WEIGHT as C, DEFAULT_SECTION_NORMAL as D, EnginePart as E, type FeatureTag as F, type PartObject as G, HANDLE_PIXELS as H, type PartPick as I, type PickModifiers as J, type KnownFeatureType as K, REGION_ATTRIBUTE as L, MIN_KERNEL_VERSION as M, NO_MODIFIERS as N, OUTLINE_SCALE as O, type PartModel as P, type RegionHighlight as Q, type RegionIndex as R, type SectionOptions as S, type TriangleRange as T, type RegionPaint as U, type Vec3 as V, SECTION_RENDER_ORDER as W, type SectionAnchor as X, type SectionBounds as Y, type SectionPlacement as Z, type ShapeKind as _, type PartMeshRefs as a, applyHighlightLayers as a0, axesPlanes as a1, buildPick as a2, buildRegionAttribute as a3, buildRegionTexels as a4, createPart as a5, directionColor as a6, dragPlane as a7, focusForPick as a8, hitUnderRay as a9, pickedStartDepth as aa, resolveTheme as ab, sectionAnchor as ac, sectionBounds as ad, sectionConstant as ae, sectionDepth as af, sectionDepthConstant as ag, sectionDepthRange as ah, sectionFromPick as ai, sectionOffset as aj, sectionOptionsFromState as ak, sectionPlane as al, surfaceUnderRay as am, themesEqual as an, viewDirection as ao, type EnginePartProps as b, assertSupportedKernelVersion as c, type ViewerTheme as d, type SectionState as e, type PartModelRegion as f, type PartModelFeature as g, type FeatureType as h, AXES_PLANE_SCALE as i, type AxesPlane as j, CAP_HATCH as k, DEFAULT_THEME as l, DIRECTION_COLORS as m, normalizePartReport as n, DISABLED_SECTION as o, type FeatureHighlight as p, HIGHLIGHT_COLORS as q, HIGHLIGHT_WEIGHT as r, smoothRegionNormals as s, HOVER_WEIGHT as t, type HighlightLayers as u, type KnownShapeKind as v, PICKED_SURFACE_LABEL as w, PREVIEW_SCALE as x, PartMesh as y, type PartMeshProps as z };
|