@toolpath/viewer 2.5.0 → 2.7.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 CHANGED
@@ -306,6 +306,7 @@ the part opaque. For multiselection, update your own tag array and avoid duplica
306
306
  | `Viewer` | Canvas, camera, lighting, controls, initial framing, and viewer-owned section state. |
307
307
  | `EnginePart` | Validated Engine report plus cached mesh loading; imports from `/engine`. |
308
308
  | `PartMesh` | Your normalized model and prepared geometry; selection, paint, picking, sections. |
309
+ | `ExplodedPart` | Supplied surface groups, translations, colors, and controlled explosion amount. |
309
310
  | `ViewCube` | 26 orientation targets: faces, edges, and corners. |
310
311
  | `Grid`, `Axes` | Reference geometry excluded from camera framing. |
311
312
  | `DirectionArrows` | Candidate and optional named/preview machining directions. |
@@ -394,6 +395,118 @@ has `best === null`. `owners` still carries all owners. `directionHighlights(mod
394
395
  index)` produces region paint matching `DirectionArrows`; it does not hide geometry
395
396
  or establish that an unpainted face is impossible to machine.
396
397
 
398
+ ### `<ExplodedPart>`
399
+
400
+ Renders application-defined surface pieces inside `<Viewer>` or an R3F canvas. Import
401
+ `ExplodedPart`, `ExplodedPartProps`, `ExplodeGroup`, `ExplodeGroupIds`, `ExplodeInput`,
402
+ `ExplodePick`, `ExplodeRegionColors`, `createExplodeAmount`, and `ExplodeAmount` from
403
+ `@toolpath/viewer`. Version 2.5.0 does not contain these exports.
404
+
405
+ The application supplies the pieces and their translations. The renderer neither selects
406
+ feature interpretations nor chooses machining directions, setups, or an ownership policy for
407
+ overlapping surfaces. It reads no planning data and makes no API requests.
408
+
409
+ ```tsx
410
+ import { useMemo, useState } from 'react'
411
+ import { ExplodedPart, Viewer, type ExplodeGroup, type PartModel } from '@toolpath/viewer'
412
+ import type { BufferGeometry } from 'three'
413
+
414
+ const ExplodeView = ({
415
+ model,
416
+ geometry,
417
+ groups,
418
+ amount,
419
+ }: {
420
+ model: PartModel
421
+ geometry: BufferGeometry
422
+ groups: readonly ExplodeGroup[]
423
+ amount: number
424
+ }) => {
425
+ const [selected, select] = useState<string | null>(null)
426
+ const [hovered, hover] = useState<string | null>(null)
427
+ const explode = useMemo(() => ({ groups, amount }), [groups, amount])
428
+ return (
429
+ <Viewer>
430
+ <ExplodedPart
431
+ model={model}
432
+ geometry={geometry}
433
+ explode={explode}
434
+ selected={selected}
435
+ hovered={hovered}
436
+ onPick={(pick) => select(pick.explodeGroupId)}
437
+ onHover={(pick) => hover(pick?.explodeGroupId ?? null)}
438
+ />
439
+ </Viewer>
440
+ )
441
+ }
442
+ ```
443
+
444
+ Each `ExplodeGroup` contains a unique `id`, `regionIdxs`, an `offset: { x, y, z }` in
445
+ millimetres in the source geometry's frame, and a numeric RGB `color`. IDs belong to the
446
+ application and need not be feature tags. Groups may contain any region set, and different
447
+ groups can share the same surfaces without being merged. Region IDs must come from the same
448
+ model and mesh. Source geometry must be non-indexed and match `model.mesh.triangleCount`.
449
+ An empty `groups` array draws nothing. Invalid IDs, regions, or offsets throw before allocation.
450
+
451
+ `explode.amount` interpolates all supplied offsets from zero to their full translations;
452
+ values outside `[0, 1]` are clamped and nonfinite amounts use zero. The caller owns animation,
453
+ timing, and reduced-motion preferences. Pass a number for ordinary controlled React updates.
454
+ For frame-by-frame animation, create a stable controller with `createExplodeAmount(initial)`
455
+ and pass it as `explode.amount`:
456
+
457
+ ```tsx
458
+ const [amount] = useState(() => createExplodeAmount(0))
459
+ const explode = useMemo(() => ({ groups, amount }), [groups, amount])
460
+ // From the application's animation loop, slider, or animation library:
461
+ amount.set(0.5)
462
+ ```
463
+
464
+ The controller clamps its value to `[0, 1]`, exposes it as `amount.value`, and notifies
465
+ subscribers only when it changes. `ExplodedPart` subscribes and requests a frame automatically,
466
+ including on a demand-driven canvas, without React updates on every frame. Subscriptions are
467
+ removed on unmount or when the controller changes; one controller can drive multiple viewers.
468
+ The application owns scheduling and cancelling its animation loop. The renderer never moves
469
+ the camera. Fit and Reset remain explicit.
470
+
471
+ Keep the `groups` array stable across amount, selection, and color changes. An optional
472
+ `explode.colors: ReadonlyMap<string, number>` changes colors by group ID without rebuilding
473
+ the layout. Optional `explode.regionColors: ExplodeRegionColors` (a
474
+ `ReadonlyMap<string, ReadonlyMap<number, number>>`) sets colors by group ID and source region index, overriding that group's color. The same
475
+ source region may have different colors in different groups. Regions without an override use
476
+ `explode.colors` or the group's own color; selection and hover tint all of a group's surfaces.
477
+ Replace color maps when changing paint. Unknown group/region keys are ignored. Color changes
478
+ retain geometry buffers, pick identities, and shader programs; they do not require one group
479
+ per region. `visible={false}` retains its buffers while excluding it from rendering, picking,
480
+ and framing. Optional `onReady` runs after warming shaders and buffers for a layout; an app can
481
+ keep it hidden or disable its play control until then. Changing the source or group array
482
+ rebuilds the owned buffers; unmounting releases them without disposing the source geometry.
483
+ Batching uses per-instance colors where Three.js provides them and shared vertex colors on
484
+ earlier supported Three.js releases.
485
+
486
+ Pass `theme?: Partial<ViewerTheme>` to match the surrounding application. `part` colors
487
+ the source ghost, `partEmissive` sets emissive lighting, and `edge`/`edgeOpacity` control
488
+ the outlines (the ghost outline fades further with the explosion). `highlight` tints the
489
+ selected piece, `picked` colors its source surfaces, and `hover` tints the hovered piece. Group colors and
490
+ `explode.colors` remain application-owned. Omit the theme to retain the default explode
491
+ appearance. Theme changes update materials and colors in place without rebuilding geometry,
492
+ changing selection, warming shaders again, or moving the camera.
493
+
494
+ The source part is drawn as an unpickable ghost during explosion. Selecting a group highlights
495
+ its original surfaces and draws one connector. `selected` and `hovered` also accept arrays of
496
+ group IDs, so an application can interact with several render chunks as one logical piece.
497
+ Selection highlights all their source surfaces; one connector joins their combined source and
498
+ translated bounds. `onPick` and `onHover` return an `ExplodePick`:
499
+ the usual source `region` and `triangleIndex`, the application's `explodeGroupId`, the displayed
500
+ world-space `point`/`normal`, and `modelPoint` in the original geometry's frame. Region owners
501
+ and the default ranked feature remain available as `PartPick` fields; applications can use
502
+ the group ID to supply their own metadata. Pass `activeDirection`, as on `<PartMesh>`, to rank
503
+ those owners for one machining direction. Hidden groups and source overlays do not accept picks.
504
+
505
+ At stationary zero, the example gives rendering and picking back to its ordinary `PartMesh`.
506
+ That assembled/exploded mode switch and its toolbar are application UI. The example's candidate
507
+ grouping, colors, translation spacing, and rendering-budget policy stay in
508
+ `examples/react-viewer/src/explode/` and are not exported by the package.
509
+
397
510
  ### `<ViewCube>`, `<Grid>`, and `<Axes>`
398
511
 
399
512
  `ViewCube` defaults to `alignment="top-right"` and `margin={[80, 80]}` (pixels).
@@ -1983,7 +1983,16 @@ function createPart(model, geometry, theme) {
1983
1983
  // src/render/selection.ts
1984
1984
  var FEATURE_TYPE_RANKS = [
1985
1985
  ["blind_hole", "through_hole", "filleted_blind_hole"],
1986
- ["pocket", "open_pocket", "boss", "filleted_boss", "undercut_tslot", "undercut_dovetail", "sink"],
1986
+ [
1987
+ "pocket",
1988
+ "open_pocket",
1989
+ "boss",
1990
+ "filleted_boss",
1991
+ "circular_wall",
1992
+ "undercut_tslot",
1993
+ "undercut_dovetail",
1994
+ "sink"
1995
+ ],
1987
1996
  ["chamfer", "inner_fillet", "outer_fillet", "contour_surface", "slanted_face"],
1988
1997
  // Unrecognized types sit here, ahead of the bulk surfaces: `featureType` is
1989
1998
  // an open set, and a type a future kernel adds is far likelier to be a
@@ -2043,6 +2052,7 @@ var NO_MODIFIERS = {
2043
2052
  shift: false,
2044
2053
  secondary: false
2045
2054
  };
2055
+ var ignoreRay = () => void 0;
2046
2056
  function viewDirection(camera, target) {
2047
2057
  const { x, y, z } = camera.position;
2048
2058
  const dx = x - target.x;
@@ -5042,6 +5052,7 @@ export {
5042
5052
  bestOwner,
5043
5053
  cycleOwner,
5044
5054
  NO_MODIFIERS,
5055
+ ignoreRay,
5045
5056
  viewDirection,
5046
5057
  buildPick,
5047
5058
  focusForPick,
@@ -1,5 +1,5 @@
1
- import { P as PartModel, a as PartMeshRefs, b as PartModelFeature, T as ThreadMark } from '../normalize-BBADLCmd.js';
2
- export { E as EnginePart, c as EnginePartProps, M as MIN_KERNEL_VERSION, d as assertSupportedKernelVersion, n as normalizePartReport, s as smoothRegionNormals } from '../normalize-BBADLCmd.js';
1
+ import { P as PartModel, a as PartMeshRefs, b as PartModelFeature, T as ThreadMark } from '../normalize-CIesT6vv.js';
2
+ export { E as EnginePart, c as EnginePartProps, M as MIN_KERNEL_VERSION, d as assertSupportedKernelVersion, n as normalizePartReport, s as smoothRegionNormals } from '../normalize-CIesT6vv.js';
3
3
  import { BufferGeometry } from 'three';
4
4
  import 'react';
5
5
 
@@ -13,7 +13,7 @@ import {
13
13
  partMeshAssets,
14
14
  smoothRegionNormals,
15
15
  threadMark
16
- } from "../chunk-LBG6GVGE.js";
16
+ } from "../chunk-EYNPC2YB.js";
17
17
  export {
18
18
  EnginePart,
19
19
  MIN_KERNEL_VERSION,
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as PartModel, F as FeatureTag, e as PartPick, V as Vec3, R as RegionHighlight, f as ViewerTheme, S as SectionOptions, g as SectionState, h as ViewerCamera, i as ViewportSize, j as PartModelRegion, C as CameraLimits, k as ViewerView, l as Projection, m as TriangleRange, o as RegionIndex, b as PartModelFeature, p as FeatureType } from './normalize-BBADLCmd.js';
2
- export { A as AXES_PLANE_OFFSET, q as AXES_PLANE_SCALE, r as AxesPlane, B as BuildPickInput, t as CAD_CAMERA_UP, u as CANDIDATE_WEIGHT, v as CAP_HATCH, D as DEFAULT_FIT_MARGIN, w as DEFAULT_SECTION_NORMAL, x as DEFAULT_THEME, y as DIRECTION_COLORS, z as DISABLED_SECTION, G as EXCLUDE_FROM_FRAME, E as EnginePart, H as FeatureHighlight, I as FocusOptions, J as HANDLE_PIXELS, K as HIGHLIGHT_COLORS, L as HIGHLIGHT_WEIGHT, N as HOVER_WEIGHT, O as HighlightLayers, Q as KnownFeatureType, U as KnownShapeKind, W as MAX_FRAME_RATIO, X as MIN_FRAME_RATIO, Y as NO_MODIFIERS, Z as OUTLINE_SCALE, _ as PERSPECTIVE_FOV, $ as PICKED_SURFACE_LABEL, a0 as PREVIEW_SCALE, a1 as PartDisplay, a2 as PartMesh, a3 as PartMeshProps, a as PartMeshRefs, a4 as PartObject, a5 as PickModifiers, a6 as PointerLocation, a7 as REGION_ATTRIBUTE, a8 as RegionPaint, a9 as SECTION_GIZMO_FRAME_SCALE, aa as SECTION_RENDER_ORDER, ab as SceneBounds, ac as SectionAnchor, ad as SectionBounds, ae as SectionPlacement, af as ShapeKind, ag as SharpCorner, ah as SharpCornerOptions, ai as SurfaceCreases, aj as SurfaceHit, T as ThreadMark, ak as ThreadOptions, al as adaptedUp, am as applyHighlightLayers, an as applyProjection, ao as aspectRatio, ap as axesPlanes, aq as boundsFromBox, ar as buildPick, as as buildRegionAttribute, at as buildRegionTexels, au as cadViewDirections, av as cameraLimits, aw as contentBounds, ax as createPart, ay as currentViewDirection, az as defaultBounds, aA as directionColor, aB as dragPlane, aC as excludedFromFrame, aD as findSharpCorners, aE as fitDistance, aF as focusForPick, aG as hitUnderRay, n as normalizePartReport, aH as orthographicHalfHeight, aI as perspectiveFitDistance, aJ as pickedStartDepth, aK as resolveTheme, aL as screenLength, aM as sectionAnchor, aN as sectionBounds, aO as sectionConstant, aP as sectionDepth, aQ as sectionDepthConstant, aR as sectionDepthRange, aS as sectionFromPick, aT as sectionMeasurement, aU as sectionOffset, aV as sectionOptionsFromState, aW as sectionPlane, aX as sharpCornerPositions, s as smoothRegionNormals, aY as startPosition, aZ as surfaceCreases, a_ as surfaceUnderRay, a$ as targetBoundary, b0 as themesEqual, b1 as viewDirection } from './normalize-BBADLCmd.js';
1
+ import { P as PartModel, F as FeatureTag, V as Vec3, e as PartPick, f as ViewerTheme, R as RegionHighlight, S as SectionOptions, g as SectionState, h as ViewerCamera, i as ViewportSize, j as PartModelRegion, C as CameraLimits, k as ViewerView, l as Projection, m as TriangleRange, o as RegionIndex, b as PartModelFeature, p as FeatureType } from './normalize-CIesT6vv.js';
2
+ export { A as AXES_PLANE_OFFSET, q as AXES_PLANE_SCALE, r as AxesPlane, B as BuildPickInput, t as CAD_CAMERA_UP, u as CANDIDATE_WEIGHT, v as CAP_HATCH, D as DEFAULT_FIT_MARGIN, w as DEFAULT_SECTION_NORMAL, x as DEFAULT_THEME, y as DIRECTION_COLORS, z as DISABLED_SECTION, G as EXCLUDE_FROM_FRAME, E as EnginePart, H as FeatureHighlight, I as FocusOptions, J as HANDLE_PIXELS, K as HIGHLIGHT_COLORS, L as HIGHLIGHT_WEIGHT, N as HOVER_WEIGHT, O as HighlightLayers, Q as KnownFeatureType, U as KnownShapeKind, W as MAX_FRAME_RATIO, X as MIN_FRAME_RATIO, Y as NO_MODIFIERS, Z as OUTLINE_SCALE, _ as PERSPECTIVE_FOV, $ as PICKED_SURFACE_LABEL, a0 as PREVIEW_SCALE, a1 as PartDisplay, a2 as PartMesh, a3 as PartMeshProps, a as PartMeshRefs, a4 as PartObject, a5 as PickModifiers, a6 as PointerLocation, a7 as REGION_ATTRIBUTE, a8 as RegionPaint, a9 as SECTION_GIZMO_FRAME_SCALE, aa as SECTION_RENDER_ORDER, ab as SceneBounds, ac as SectionAnchor, ad as SectionBounds, ae as SectionPlacement, af as ShapeKind, ag as SharpCorner, ah as SharpCornerOptions, ai as SurfaceCreases, aj as SurfaceHit, T as ThreadMark, ak as ThreadOptions, al as adaptedUp, am as applyHighlightLayers, an as applyProjection, ao as aspectRatio, ap as axesPlanes, aq as boundsFromBox, ar as buildPick, as as buildRegionAttribute, at as buildRegionTexels, au as cadViewDirections, av as cameraLimits, aw as contentBounds, ax as createPart, ay as currentViewDirection, az as defaultBounds, aA as directionColor, aB as dragPlane, aC as excludedFromFrame, aD as findSharpCorners, aE as fitDistance, aF as focusForPick, aG as hitUnderRay, n as normalizePartReport, aH as orthographicHalfHeight, aI as perspectiveFitDistance, aJ as pickedStartDepth, aK as resolveTheme, aL as screenLength, aM as sectionAnchor, aN as sectionBounds, aO as sectionConstant, aP as sectionDepth, aQ as sectionDepthConstant, aR as sectionDepthRange, aS as sectionFromPick, aT as sectionMeasurement, aU as sectionOffset, aV as sectionOptionsFromState, aW as sectionPlane, aX as sharpCornerPositions, s as smoothRegionNormals, aY as startPosition, aZ as surfaceCreases, a_ as surfaceUnderRay, a$ as targetBoundary, b0 as themesEqual, b1 as viewDirection } from './normalize-CIesT6vv.js';
3
3
  import { BufferGeometry, Box3, CanvasTexture, Plane, Vector3, Matrix4, Vector2, Ray, ShaderMaterial, Texture, Color, MeshBasicMaterial, WebGLRenderTarget } from 'three';
4
4
  import * as react from 'react';
5
5
  import { ReactNode, PropsWithChildren, RefObject, CSSProperties } from 'react';
@@ -38,6 +38,73 @@ interface FeatureTriangles {
38
38
  */
39
39
  declare function featureTriangles(model: Pick<PartModel, 'regionIndex'>, geometry: BufferGeometry, tag: FeatureTag): FeatureTriangles;
40
40
 
41
+ /** An application-controlled amount with subscriptions for demand-driven canvases. */
42
+ interface ExplodeAmount {
43
+ readonly value: number;
44
+ set: (value: number) => void;
45
+ subscribe: (listener: () => void) => () => void;
46
+ }
47
+ /** Owns no clock or easing. Setting a changed value requests a frame from attached viewers. */
48
+ declare const createExplodeAmount: (initial?: number) => ExplodeAmount;
49
+
50
+ /** Rendering input only. Apps choose groups, approaches, names, and any planning policy. */
51
+ interface ExplodeGroup {
52
+ /** Unique within this layout. May name anything in the consuming application. */
53
+ readonly id: string;
54
+ /** Regions of the supplied source model. Different groups may repeat or overlap them. */
55
+ readonly regionIdxs: readonly number[];
56
+ /** Full translation in millimetres, in the supplied geometry's coordinate frame. */
57
+ readonly offset: Vec3;
58
+ readonly color: number;
59
+ }
60
+ /** One group ID, several treated as one piece, or `null` for none. */
61
+ type ExplodeGroupIds = string | ReadonlyArray<string> | null;
62
+ /** Colors by group ID, then by source region index. */
63
+ type ExplodeRegionColors = ReadonlyMap<string, ReadonlyMap<number, number>>;
64
+ interface ExplodeInput {
65
+ /** Fraction of each group's offset, clamped to [0, 1]. Read each rendered frame. */
66
+ readonly amount: number | ExplodeAmount;
67
+ /** Stable layout; changing colors does not replace this array. */
68
+ readonly groups: readonly ExplodeGroup[];
69
+ /** Optional color overrides by group ID; preserves layout buffers when recoloring. */
70
+ readonly colors?: ReadonlyMap<string, number>;
71
+ /** Per-group source-region colors, overriding the group color without splitting its identity.
72
+ * Replace maps to update paint. Unknown groups/regions are ignored.
73
+ */
74
+ readonly regionColors?: ExplodeRegionColors;
75
+ }
76
+ /** World coordinates describe the displayed hit; modelPoint names its original location. */
77
+ interface ExplodePick extends PartPick {
78
+ readonly explodeGroupId: string;
79
+ readonly modelPoint: readonly [number, number, number];
80
+ }
81
+
82
+ interface ExplodedPartProps {
83
+ /** Source report geometry. All region indices must refer to this model. */
84
+ model: PartModel;
85
+ geometry: BufferGeometry;
86
+ /** Controlled layout and appearance; application metadata stays outside the renderer. */
87
+ explode: ExplodeInput;
88
+ /** Application-owned group IDs; independent of feature tags and API feature IDs. */
89
+ selected?: ExplodeGroupIds;
90
+ hovered?: ExplodeGroupIds;
91
+ /**
92
+ * Scopes a pick's ranked owners to one machining direction, as an index into
93
+ * the model's `candidateDirections`, as `<PartMesh activeDirection>` does.
94
+ */
95
+ activeDirection?: number | null;
96
+ /** Part/edge colors, emissive, edge opacity, selection/hover tints, and `picked` source surfaces. */
97
+ theme?: Partial<ViewerTheme>;
98
+ /** False hides rendering, picking, and framing while retaining prepared buffers. Default true. */
99
+ visible?: boolean;
100
+ /** Programs and buffers have been warmed for this layout. Optional; no camera change occurs. */
101
+ onReady?: () => void;
102
+ onPick?: (pick: ExplodePick) => void;
103
+ onHover?: (pick: ExplodePick | null) => void;
104
+ }
105
+ /** GPU batching preserves each piece's pick map, source highlight, and connector. */
106
+ declare const ExplodedPart: (props: ExplodedPartProps) => react.JSX.Element | null;
107
+
41
108
  /**
42
109
  * The part an overlay is drawn on: its model and the mesh `<PartMesh>` draws.
43
110
  *
@@ -1231,7 +1298,7 @@ declare function bananaFrameBounds(part: Box3, banana: Box3, position: Vector3):
1231
1298
  *
1232
1299
  * The mesh must be non-indexed, which `parsePartGeometry` guarantees.
1233
1300
  */
1234
- declare function regionEdgesGeometry(geometry: BufferGeometry, model: Pick<PartModel, 'regions' | 'regionIndex'>): BufferGeometry;
1301
+ declare function regionEdgesGeometry(geometry: BufferGeometry, model: Pick<PartModel, 'regions'> & Partial<Pick<PartModel, 'regionIndex'>>): BufferGeometry;
1235
1302
 
1236
1303
  /** Region index → the visual surface it belongs to. */
1237
1304
  type SurfaceOf = ReadonlyMap<number, number>;
@@ -1789,4 +1856,4 @@ declare const ORBIT_TARGET_FADE_MS = 1000;
1789
1856
  */
1790
1857
  declare function orbitTargetOpacity(sinceHold: number, fade?: number): number;
1791
1858
 
1792
- export { ANGLE_ARC_FRACTION, ANGLE_ARC_SEGMENTS, AXIS_COLORS, type AngleMeasurement, type ArrowPlacement, Axes, type AxesProps, type Axis, type AxisLock, BANANA_GAP, BANANA_MODEL_URL, Banana, type BananaProps, type BoxStockFigure, type BoxStockInput, type BoxStockPreview, CHAMFER, CONTROL_SCHEME_OPTIONS, CadCameraControls, type CadCameraControlsProps, CameraLimits, type CapMaterial, type CapUniforms, type ControlScheme, type ControlSchemeOption, type CubeZone, type CylinderStockFigure, type CylinderStockInput, type CylinderStockPreview, DELTA_DASH_PIXELS, DOUBLE_TAP_MS, type DeltaLeg, DirectionArrows, type DirectionArrowsProps, type DirectionGroup, type DistanceMeasurement, type DoubleTapPoint, type DoubleTapTracker, ExtendedCameraControls, type ExtendedCameraControlsOptions, FEATURE_TYPE_RANKS, FeatureTag, type FeatureTriangles, FeatureType, Grid, type GridProps, type GridSpec, HoverCard, type HoverCardProps, MEASURE_LABEL_CLASS, MEASURE_LINE_PIXELS, MEASURE_MARKER_PIXELS, MEASURE_RENDER_ORDER, type MeasureLabelKind, type MeasureMode, MeasureTool, type MeasureToolProps, type Measurement, type NamedDirection, ORBIT_TARGET_COLOR, ORBIT_TARGET_FADE_MS, ORBIT_TARGET_FLASH_MS, ORBIT_TARGET_PIXELS, ORBIT_TARGET_RING_COLOR, ORBIT_TARGET_RING_OPACITY, ORBIT_TARGET_RING_PIXELS, ORBIT_TARGET_RING_WIDTH, POINTS_PER_MEASUREMENT, type PartContextValue, PartModel, PartModelFeature, PartModelRegion, PartPick, PartReportFormatError, Projection, type RankingContext, RegionHighlight, RegionIndex, type Retarget, type RetargetPose, SNAP_MARKER_PIXELS, SNAP_PIXELS, SectionOptions, type SectionSample, SectionState, type SectionStore, SectionTool, type SectionToolProps, SectionView, type Snap, type SnapEdges, type SnapHit, type SnapKind, Stock, type StockAllowance, type StockAppearanceProps, type StockPosition, type StockProps, type StockSource, type SurfaceOf, TAP_SLOP, type TapPoint, type TapTracker, type ToolMark, ToolMarks, type ToolMarksProps, type ToolProfilePoint, TriangleRange, UnsupportedKernelVersionError, VIEW_NAMES, VIEW_SIGNS, Vec3, ViewCube, type ViewCubeProps, type ViewKind, type ViewName, Viewer, ViewerCamera, type ViewerControls, type ViewerHandle, type ViewerProps, ViewerTheme, ViewerToolbar, type ViewerToolbarControl, type ViewerToolbarControls, type ViewerToolbarControlsProps, type ViewerToolbarProps, ViewerToolbarProvider, ViewerView, ViewportSize, angleArc, angleArcRadius, angleAt, applyCapTheme, arrowPlacement, bananaFrameBounds, bananaPosition, bestOwner, boxStockBounds, buildRegionIndex, capHit, clipSegments, createCapMaterial, createMaskMaterial, createMaskTarget, createSectionStore, createStencilMaterials, cubeOutlineGeometry, cubeZones, cycleOwner, deltaBetween, deltaLegs, directionHighlights, directionIndexOf, directionLabel, distanceBetween, featureTriangles, featureTypeRank, fixedBoxStockBounds, formatDegrees, formatMillimetres, gridGeometry, gridSpec, groupByDirection, labelGeometry, labelTexture, lockToAxis, measurementFromPoints, measurementLabel, measurementLabelAnchor, midpoint, movedFar, nextMeasurementId, orbitTargetOpacity, panelGeometry, pointInContour, rankOwners, regionAdjacency, regionEdgesGeometry, regionNormals, resolveSectionPlane, retargetPose, sameDirection, sampleSection, screenPoint, sectionContour, snapAt, squaredUp, trackDoubleTaps, trackTaps, useContentBox, usePartContext, useRetarget, useSectionStore, useTapGuard, useViewerControls, useViewerToolbar, viewKind, viewUp, viewVector, visualSurfaces };
1859
+ export { ANGLE_ARC_FRACTION, ANGLE_ARC_SEGMENTS, AXIS_COLORS, type AngleMeasurement, type ArrowPlacement, Axes, type AxesProps, type Axis, type AxisLock, BANANA_GAP, BANANA_MODEL_URL, Banana, type BananaProps, type BoxStockFigure, type BoxStockInput, type BoxStockPreview, CHAMFER, CONTROL_SCHEME_OPTIONS, CadCameraControls, type CadCameraControlsProps, CameraLimits, type CapMaterial, type CapUniforms, type ControlScheme, type ControlSchemeOption, type CubeZone, type CylinderStockFigure, type CylinderStockInput, type CylinderStockPreview, DELTA_DASH_PIXELS, DOUBLE_TAP_MS, type DeltaLeg, DirectionArrows, type DirectionArrowsProps, type DirectionGroup, type DistanceMeasurement, type DoubleTapPoint, type DoubleTapTracker, type ExplodeAmount, type ExplodeGroup, type ExplodeGroupIds, type ExplodeInput, type ExplodePick, type ExplodeRegionColors, ExplodedPart, type ExplodedPartProps, ExtendedCameraControls, type ExtendedCameraControlsOptions, FEATURE_TYPE_RANKS, FeatureTag, type FeatureTriangles, FeatureType, Grid, type GridProps, type GridSpec, HoverCard, type HoverCardProps, MEASURE_LABEL_CLASS, MEASURE_LINE_PIXELS, MEASURE_MARKER_PIXELS, MEASURE_RENDER_ORDER, type MeasureLabelKind, type MeasureMode, MeasureTool, type MeasureToolProps, type Measurement, type NamedDirection, ORBIT_TARGET_COLOR, ORBIT_TARGET_FADE_MS, ORBIT_TARGET_FLASH_MS, ORBIT_TARGET_PIXELS, ORBIT_TARGET_RING_COLOR, ORBIT_TARGET_RING_OPACITY, ORBIT_TARGET_RING_PIXELS, ORBIT_TARGET_RING_WIDTH, POINTS_PER_MEASUREMENT, type PartContextValue, PartModel, PartModelFeature, PartModelRegion, PartPick, PartReportFormatError, Projection, type RankingContext, RegionHighlight, RegionIndex, type Retarget, type RetargetPose, SNAP_MARKER_PIXELS, SNAP_PIXELS, SectionOptions, type SectionSample, SectionState, type SectionStore, SectionTool, type SectionToolProps, SectionView, type Snap, type SnapEdges, type SnapHit, type SnapKind, Stock, type StockAllowance, type StockAppearanceProps, type StockPosition, type StockProps, type StockSource, type SurfaceOf, TAP_SLOP, type TapPoint, type TapTracker, type ToolMark, ToolMarks, type ToolMarksProps, type ToolProfilePoint, TriangleRange, UnsupportedKernelVersionError, VIEW_NAMES, VIEW_SIGNS, Vec3, ViewCube, type ViewCubeProps, type ViewKind, type ViewName, Viewer, ViewerCamera, type ViewerControls, type ViewerHandle, type ViewerProps, ViewerTheme, ViewerToolbar, type ViewerToolbarControl, type ViewerToolbarControls, type ViewerToolbarControlsProps, type ViewerToolbarProps, ViewerToolbarProvider, ViewerView, ViewportSize, angleArc, angleArcRadius, angleAt, applyCapTheme, arrowPlacement, bananaFrameBounds, bananaPosition, bestOwner, boxStockBounds, buildRegionIndex, capHit, clipSegments, createCapMaterial, createExplodeAmount, createMaskMaterial, createMaskTarget, createSectionStore, createStencilMaterials, cubeOutlineGeometry, cubeZones, cycleOwner, deltaBetween, deltaLegs, directionHighlights, directionIndexOf, directionLabel, distanceBetween, featureTriangles, featureTypeRank, fixedBoxStockBounds, formatDegrees, formatMillimetres, gridGeometry, gridSpec, groupByDirection, labelGeometry, labelTexture, lockToAxis, measurementFromPoints, measurementLabel, measurementLabelAnchor, midpoint, movedFar, nextMeasurementId, orbitTargetOpacity, panelGeometry, pointInContour, rankOwners, regionAdjacency, regionEdgesGeometry, regionNormals, resolveSectionPlane, retargetPose, sameDirection, sampleSection, screenPoint, sectionContour, snapAt, squaredUp, trackDoubleTaps, trackTaps, useContentBox, usePartContext, useRetarget, useSectionStore, useTapGuard, useViewerControls, useViewerToolbar, viewKind, viewUp, viewVector, visualSurfaces };