@vertexvis/viewer 0.21.0-testing.0 → 0.21.0-testing.1

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.
@@ -130,13 +130,13 @@ export function computeInputPosition(viewport, bounds, shapePoints) {
130
130
  : closest, topLeft);
131
131
  switch (closestPoint) {
132
132
  case topLeft:
133
- return { point: closestPoint, position: 'top-left' };
133
+ return { point: closestPoint, placement: 'top-left' };
134
134
  case topRight:
135
- return { point: closestPoint, position: 'top-right' };
135
+ return { point: closestPoint, placement: 'top-right' };
136
136
  case bottomLeft:
137
- return { point: closestPoint, position: 'bottom-left' };
137
+ return { point: closestPoint, placement: 'bottom-left' };
138
138
  default:
139
- return { point: closestPoint, position: 'bottom-right' };
139
+ return { point: closestPoint, placement: 'bottom-right' };
140
140
  }
141
141
  }
142
142
  //# sourceMappingURL=util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../../src/components/viewer-transform-widget/util.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Euler,\n Matrix4,\n Plane,\n Point,\n Quaternion,\n Ray,\n Rectangle,\n Vector3,\n} from '@vertexvis/geometry';\n\nimport {\n AngleUnits,\n AngleUnitType,\n DistanceUnits,\n DistanceUnitType,\n Frame,\n Viewport,\n} from '../../lib/types';\n\nexport interface PointAndPosition {\n point: Point.Point;\n position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n}\n\nexport function convertPointToCanvas(\n point: Point.Point,\n bounds?: DOMRect\n): Point.Point | undefined {\n return bounds != null\n ? Point.create(point.x - bounds.left, point.y - bounds.top)\n : undefined;\n}\n\nexport function convertCanvasPointToWorld(\n point?: Point.Point,\n frame?: Frame,\n viewport?: Viewport,\n transform?: Matrix4.Matrix4\n): Vector3.Vector3 | undefined {\n const position =\n transform != null ? Vector3.fromMatrixPosition(transform) : undefined;\n\n if (point != null && frame != null && viewport != null && position != null) {\n if (frame.scene.camera.isOrthographic()) {\n const ray = viewport.transformPointToOrthographicRay(\n point,\n frame.image,\n frame.scene.camera\n );\n // Offset the point to past the bounding sphere of the model to\n // adjust the position plane location.\n const offsetPoint = Ray.at(\n Ray.create({\n origin: position,\n direction: frame.scene.camera.direction,\n }),\n Vector3.magnitude(frame.scene.camera.viewVector) * 2\n );\n\n return Ray.intersectPlane(\n ray,\n Plane.fromNormalAndCoplanarPoint(\n frame.scene.camera.direction,\n offsetPoint\n )\n );\n } else {\n const ray = viewport.transformPointToRay(\n point,\n frame.image,\n frame.scene.camera\n );\n\n return Ray.intersectPlane(\n ray,\n Plane.fromNormalAndCoplanarPoint(frame.scene.camera.direction, position)\n );\n }\n }\n return undefined;\n}\n\nexport function computeInputTransform(\n identifier: string,\n value: number,\n lastValue: number,\n distanceUnit: DistanceUnitType = 'millimeters',\n angleUnit: AngleUnitType = 'degrees'\n): Matrix4.Matrix4 {\n const units = new DistanceUnits(distanceUnit);\n const angles = new AngleUnits(angleUnit);\n\n const rotation = (): number => angles.convertFrom(value - lastValue);\n const position = (): number =>\n units.convertRealValueToWorld(value - lastValue);\n\n switch (identifier) {\n case 'x-translate':\n return Matrix4.makeTranslation(Vector3.create(position(), 0, 0));\n case 'y-translate':\n return Matrix4.makeTranslation(Vector3.create(0, position(), 0));\n case 'z-translate':\n return Matrix4.makeTranslation(Vector3.create(0, 0, position()));\n case 'x-rotate':\n return Matrix4.makeRotation(\n Quaternion.fromAxisAngle(Vector3.left(), rotation())\n );\n case 'y-rotate':\n return Matrix4.makeRotation(\n Quaternion.fromAxisAngle(Vector3.down(), rotation())\n );\n case 'z-rotate':\n return Matrix4.makeRotation(\n Quaternion.fromAxisAngle(Vector3.forward(), rotation())\n );\n }\n return Matrix4.makeIdentity();\n}\n\nexport function computeInputDisplayValue(\n identifier: string,\n current: Matrix4.Matrix4,\n start: Matrix4.Matrix4,\n distanceUnit: DistanceUnitType = 'millimeters',\n angleUnit: AngleUnitType = 'degrees'\n): number {\n const units = new DistanceUnits(distanceUnit);\n const angles = new AngleUnits(angleUnit);\n\n const rotation = (): Matrix4.Matrix4 =>\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(current));\n const transformDiff = (): Matrix4.Matrix4 =>\n Matrix4.multiply(current, Matrix4.invert(start));\n const relativeTranslationDiff = (): Vector3.Vector3 =>\n Vector3.transformMatrix(\n Vector3.fromMatrixPosition(transformDiff()),\n Matrix4.invert(rotation())\n );\n const relativeRotationDiff = (): Euler.Euler =>\n Euler.create(\n Vector3.transformMatrix(\n Euler.fromRotationMatrix(Matrix4.invert(transformDiff())),\n Matrix4.invert(rotation())\n )\n );\n\n switch (identifier) {\n case 'x-translate':\n return units.convertWorldValueToReal(relativeTranslationDiff().x);\n case 'y-translate':\n return units.convertWorldValueToReal(relativeTranslationDiff().y);\n case 'z-translate':\n return units.convertWorldValueToReal(relativeTranslationDiff().z);\n case 'x-rotate':\n return angles.convertTo(relativeRotationDiff().x);\n case 'y-rotate':\n return angles.convertTo(relativeRotationDiff().y);\n case 'z-rotate':\n return angles.convertTo(relativeRotationDiff().z);\n }\n return 0;\n}\n\nexport function computeUpdatedTransform(\n current: Matrix4.Matrix4,\n previous: Vector3.Vector3,\n next: Vector3.Vector3,\n viewVector: Vector3.Vector3,\n angle: number,\n identifier: string\n): Matrix4.Matrix4 {\n const delta = Vector3.subtract(next, previous);\n\n switch (identifier) {\n case 'x-translate': {\n return Matrix4.multiply(\n current,\n computeTranslation(current, Vector3.right(), delta)\n );\n }\n case 'y-translate':\n return Matrix4.multiply(\n current,\n computeTranslation(current, Vector3.up(), delta)\n );\n case 'z-translate':\n return Matrix4.multiply(\n current,\n computeTranslation(current, Vector3.back(), delta)\n );\n case 'x-rotate':\n return Matrix4.multiply(\n computeRotation(\n current,\n Matrix4.makeRotation(\n Quaternion.fromAxisAngle(\n computeRotationAxis(current, viewVector, Vector3.right()),\n angle\n )\n )\n ),\n current\n );\n case 'y-rotate':\n return Matrix4.multiply(\n computeRotation(\n current,\n Matrix4.makeRotation(\n Quaternion.fromAxisAngle(\n computeRotationAxis(current, viewVector, Vector3.up()),\n angle\n )\n )\n ),\n current\n );\n case 'z-rotate':\n return Matrix4.multiply(\n computeRotation(\n current,\n Matrix4.makeRotation(\n Quaternion.fromAxisAngle(\n computeRotationAxis(current, viewVector, Vector3.forward()),\n angle\n )\n )\n ),\n current\n );\n default:\n return current;\n }\n}\n\nexport function computeRotationAxis(\n current: Matrix4.Matrix4,\n viewVector: Vector3.Vector3,\n axis: Vector3.Vector3\n): Vector3.Vector3 {\n const rotation = Matrix4.makeRotation(Quaternion.fromMatrixRotation(current));\n const rotatedAxis = Vector3.transformMatrix(axis, rotation);\n const rotatedNegatedAxis = Vector3.transformMatrix(\n Vector3.negate(axis),\n rotation\n );\n\n return Vector3.dot(viewVector, rotatedAxis) >\n Vector3.dot(viewVector, rotatedNegatedAxis)\n ? rotatedAxis\n : rotatedNegatedAxis;\n}\n\nexport function computeTranslation(\n current: Matrix4.Matrix4,\n axis: Vector3.Vector3,\n delta: Vector3.Vector3\n): Matrix4.Matrix4 {\n const rotation = Matrix4.makeRotation(Quaternion.fromMatrixRotation(current));\n const rotatedAxis = Vector3.transformMatrix(axis, rotation);\n const rotatedDelta = Vector3.multiply(rotatedAxis, delta);\n\n return Matrix4.makeTranslation(\n Vector3.scale(rotatedDelta.x + rotatedDelta.y + rotatedDelta.z, axis)\n );\n}\n\n/**\n * Computes a rotation Matrix4 by applying the rotation at the given position,\n * then translating it back to convert it to a world delta.\n * @param rotation\n * @param current\n * @returns\n */\nexport function computeRotation(\n current: Matrix4.Matrix4,\n delta: Matrix4.Matrix4\n): Matrix4.Matrix4 {\n return Matrix4.multiply(\n Matrix4.multiply(\n Matrix4.makeTranslation(Vector3.fromMatrixPosition(current)),\n delta\n ),\n Matrix4.makeTranslation(Vector3.negate(Vector3.fromMatrixPosition(current)))\n );\n}\n\nexport function computeInputPosition(\n viewport: Viewport,\n bounds: Rectangle.Rectangle,\n shapePoints: Point.Point[]\n): PointAndPosition {\n const paddedBounds = Rectangle.pad(bounds, 5);\n const canvasPoints = shapePoints.map((sp) =>\n viewport.transformNdcPointToViewport(sp)\n );\n\n const topLeft = Rectangle.topLeft(paddedBounds);\n const topRight = Point.add(topLeft, Point.create(paddedBounds.width, 0));\n const bottomRight = Rectangle.bottomRight(paddedBounds);\n const bottomLeft = Point.subtract(\n bottomRight,\n Point.create(paddedBounds.width, 0)\n );\n\n const center = Point.scale(\n canvasPoints.reduce((sum, pt) => Point.add(sum, pt), Point.create()),\n 1 / canvasPoints.length,\n 1 / canvasPoints.length\n );\n\n const closestPoint = [topRight, bottomLeft, bottomRight].reduce(\n (closest, pt) =>\n Point.distance(center, pt) < Point.distance(center, closest)\n ? pt\n : closest,\n topLeft\n );\n\n switch (closestPoint) {\n case topLeft:\n return { point: closestPoint, position: 'top-left' };\n case topRight:\n return { point: closestPoint, position: 'top-right' };\n case bottomLeft:\n return { point: closestPoint, position: 'bottom-left' };\n default:\n return { point: closestPoint, position: 'bottom-right' };\n }\n}\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../../src/components/viewer-transform-widget/util.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Euler,\n Matrix4,\n Plane,\n Point,\n Quaternion,\n Ray,\n Rectangle,\n Vector3,\n} from '@vertexvis/geometry';\n\nimport {\n AngleUnits,\n AngleUnitType,\n DistanceUnits,\n DistanceUnitType,\n Frame,\n Viewport,\n} from '../../lib/types';\nimport { TransformWidgetInputPlacement } from './viewer-transform-widget-components';\n\nexport interface PointAndPlacement {\n point: Point.Point;\n placement: TransformWidgetInputPlacement;\n}\n\nexport function convertPointToCanvas(\n point: Point.Point,\n bounds?: DOMRect\n): Point.Point | undefined {\n return bounds != null\n ? Point.create(point.x - bounds.left, point.y - bounds.top)\n : undefined;\n}\n\nexport function convertCanvasPointToWorld(\n point?: Point.Point,\n frame?: Frame,\n viewport?: Viewport,\n transform?: Matrix4.Matrix4\n): Vector3.Vector3 | undefined {\n const position =\n transform != null ? Vector3.fromMatrixPosition(transform) : undefined;\n\n if (point != null && frame != null && viewport != null && position != null) {\n if (frame.scene.camera.isOrthographic()) {\n const ray = viewport.transformPointToOrthographicRay(\n point,\n frame.image,\n frame.scene.camera\n );\n // Offset the point to past the bounding sphere of the model to\n // adjust the position plane location.\n const offsetPoint = Ray.at(\n Ray.create({\n origin: position,\n direction: frame.scene.camera.direction,\n }),\n Vector3.magnitude(frame.scene.camera.viewVector) * 2\n );\n\n return Ray.intersectPlane(\n ray,\n Plane.fromNormalAndCoplanarPoint(\n frame.scene.camera.direction,\n offsetPoint\n )\n );\n } else {\n const ray = viewport.transformPointToRay(\n point,\n frame.image,\n frame.scene.camera\n );\n\n return Ray.intersectPlane(\n ray,\n Plane.fromNormalAndCoplanarPoint(frame.scene.camera.direction, position)\n );\n }\n }\n return undefined;\n}\n\nexport function computeInputTransform(\n identifier: string,\n value: number,\n lastValue: number,\n distanceUnit: DistanceUnitType = 'millimeters',\n angleUnit: AngleUnitType = 'degrees'\n): Matrix4.Matrix4 {\n const units = new DistanceUnits(distanceUnit);\n const angles = new AngleUnits(angleUnit);\n\n const rotation = (): number => angles.convertFrom(value - lastValue);\n const position = (): number =>\n units.convertRealValueToWorld(value - lastValue);\n\n switch (identifier) {\n case 'x-translate':\n return Matrix4.makeTranslation(Vector3.create(position(), 0, 0));\n case 'y-translate':\n return Matrix4.makeTranslation(Vector3.create(0, position(), 0));\n case 'z-translate':\n return Matrix4.makeTranslation(Vector3.create(0, 0, position()));\n case 'x-rotate':\n return Matrix4.makeRotation(\n Quaternion.fromAxisAngle(Vector3.left(), rotation())\n );\n case 'y-rotate':\n return Matrix4.makeRotation(\n Quaternion.fromAxisAngle(Vector3.down(), rotation())\n );\n case 'z-rotate':\n return Matrix4.makeRotation(\n Quaternion.fromAxisAngle(Vector3.forward(), rotation())\n );\n }\n return Matrix4.makeIdentity();\n}\n\nexport function computeInputDisplayValue(\n identifier: string,\n current: Matrix4.Matrix4,\n start: Matrix4.Matrix4,\n distanceUnit: DistanceUnitType = 'millimeters',\n angleUnit: AngleUnitType = 'degrees'\n): number {\n const units = new DistanceUnits(distanceUnit);\n const angles = new AngleUnits(angleUnit);\n\n const rotation = (): Matrix4.Matrix4 =>\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(current));\n const transformDiff = (): Matrix4.Matrix4 =>\n Matrix4.multiply(current, Matrix4.invert(start));\n const relativeTranslationDiff = (): Vector3.Vector3 =>\n Vector3.transformMatrix(\n Vector3.fromMatrixPosition(transformDiff()),\n Matrix4.invert(rotation())\n );\n const relativeRotationDiff = (): Euler.Euler =>\n Euler.create(\n Vector3.transformMatrix(\n Euler.fromRotationMatrix(Matrix4.invert(transformDiff())),\n Matrix4.invert(rotation())\n )\n );\n\n switch (identifier) {\n case 'x-translate':\n return units.convertWorldValueToReal(relativeTranslationDiff().x);\n case 'y-translate':\n return units.convertWorldValueToReal(relativeTranslationDiff().y);\n case 'z-translate':\n return units.convertWorldValueToReal(relativeTranslationDiff().z);\n case 'x-rotate':\n return angles.convertTo(relativeRotationDiff().x);\n case 'y-rotate':\n return angles.convertTo(relativeRotationDiff().y);\n case 'z-rotate':\n return angles.convertTo(relativeRotationDiff().z);\n }\n return 0;\n}\n\nexport function computeUpdatedTransform(\n current: Matrix4.Matrix4,\n previous: Vector3.Vector3,\n next: Vector3.Vector3,\n viewVector: Vector3.Vector3,\n angle: number,\n identifier: string\n): Matrix4.Matrix4 {\n const delta = Vector3.subtract(next, previous);\n\n switch (identifier) {\n case 'x-translate': {\n return Matrix4.multiply(\n current,\n computeTranslation(current, Vector3.right(), delta)\n );\n }\n case 'y-translate':\n return Matrix4.multiply(\n current,\n computeTranslation(current, Vector3.up(), delta)\n );\n case 'z-translate':\n return Matrix4.multiply(\n current,\n computeTranslation(current, Vector3.back(), delta)\n );\n case 'x-rotate':\n return Matrix4.multiply(\n computeRotation(\n current,\n Matrix4.makeRotation(\n Quaternion.fromAxisAngle(\n computeRotationAxis(current, viewVector, Vector3.right()),\n angle\n )\n )\n ),\n current\n );\n case 'y-rotate':\n return Matrix4.multiply(\n computeRotation(\n current,\n Matrix4.makeRotation(\n Quaternion.fromAxisAngle(\n computeRotationAxis(current, viewVector, Vector3.up()),\n angle\n )\n )\n ),\n current\n );\n case 'z-rotate':\n return Matrix4.multiply(\n computeRotation(\n current,\n Matrix4.makeRotation(\n Quaternion.fromAxisAngle(\n computeRotationAxis(current, viewVector, Vector3.forward()),\n angle\n )\n )\n ),\n current\n );\n default:\n return current;\n }\n}\n\nexport function computeRotationAxis(\n current: Matrix4.Matrix4,\n viewVector: Vector3.Vector3,\n axis: Vector3.Vector3\n): Vector3.Vector3 {\n const rotation = Matrix4.makeRotation(Quaternion.fromMatrixRotation(current));\n const rotatedAxis = Vector3.transformMatrix(axis, rotation);\n const rotatedNegatedAxis = Vector3.transformMatrix(\n Vector3.negate(axis),\n rotation\n );\n\n return Vector3.dot(viewVector, rotatedAxis) >\n Vector3.dot(viewVector, rotatedNegatedAxis)\n ? rotatedAxis\n : rotatedNegatedAxis;\n}\n\nexport function computeTranslation(\n current: Matrix4.Matrix4,\n axis: Vector3.Vector3,\n delta: Vector3.Vector3\n): Matrix4.Matrix4 {\n const rotation = Matrix4.makeRotation(Quaternion.fromMatrixRotation(current));\n const rotatedAxis = Vector3.transformMatrix(axis, rotation);\n const rotatedDelta = Vector3.multiply(rotatedAxis, delta);\n\n return Matrix4.makeTranslation(\n Vector3.scale(rotatedDelta.x + rotatedDelta.y + rotatedDelta.z, axis)\n );\n}\n\n/**\n * Computes a rotation Matrix4 by applying the rotation at the given position,\n * then translating it back to convert it to a world delta.\n * @param rotation\n * @param current\n * @returns\n */\nexport function computeRotation(\n current: Matrix4.Matrix4,\n delta: Matrix4.Matrix4\n): Matrix4.Matrix4 {\n return Matrix4.multiply(\n Matrix4.multiply(\n Matrix4.makeTranslation(Vector3.fromMatrixPosition(current)),\n delta\n ),\n Matrix4.makeTranslation(Vector3.negate(Vector3.fromMatrixPosition(current)))\n );\n}\n\nexport function computeInputPosition(\n viewport: Viewport,\n bounds: Rectangle.Rectangle,\n shapePoints: Point.Point[]\n): PointAndPlacement {\n const paddedBounds = Rectangle.pad(bounds, 5);\n const canvasPoints = shapePoints.map((sp) =>\n viewport.transformNdcPointToViewport(sp)\n );\n\n const topLeft = Rectangle.topLeft(paddedBounds);\n const topRight = Point.add(topLeft, Point.create(paddedBounds.width, 0));\n const bottomRight = Rectangle.bottomRight(paddedBounds);\n const bottomLeft = Point.subtract(\n bottomRight,\n Point.create(paddedBounds.width, 0)\n );\n\n const center = Point.scale(\n canvasPoints.reduce((sum, pt) => Point.add(sum, pt), Point.create()),\n 1 / canvasPoints.length,\n 1 / canvasPoints.length\n );\n\n const closestPoint = [topRight, bottomLeft, bottomRight].reduce(\n (closest, pt) =>\n Point.distance(center, pt) < Point.distance(center, closest)\n ? pt\n : closest,\n topLeft\n );\n\n switch (closestPoint) {\n case topLeft:\n return { point: closestPoint, placement: 'top-left' };\n case topRight:\n return { point: closestPoint, placement: 'top-right' };\n case bottomLeft:\n return { point: closestPoint, placement: 'bottom-left' };\n default:\n return { point: closestPoint, placement: 'bottom-right' };\n }\n}\n"]}
@@ -6,12 +6,12 @@ import { h } from '@stencil/core';
6
6
  import { Dimensions } from '@vertexvis/geometry';
7
7
  import { AngleUnits, DistanceUnits, } from '../../lib/types';
8
8
  export const TransformWidgetInput = ({ ref, bounds, viewport, point, placement, distance, angle, decimalPlaces, distanceUnit, angleUnit, onChange, onIncrement, onDecrement, }) => {
9
+ var _a;
9
10
  const angles = new AngleUnits(angleUnit);
10
11
  const units = new DistanceUnits(distanceUnit);
11
- const displayValue = distance != null
12
- ? `${distance.toFixed(decimalPlaces)} ${units.unit.abbreviatedName}`
13
- : `${angle === null || angle === void 0 ? void 0 : angle.toFixed(decimalPlaces)} ${angles.unit.abbreviatedName}`;
14
- const inputPlacement = computeInputPlacement(viewport, bounds !== null && bounds !== void 0 ? bounds : Dimensions.create(100, 30), point, placement);
12
+ const definedValue = (_a = distance !== null && distance !== void 0 ? distance : angle) !== null && _a !== void 0 ? _a : 0;
13
+ const displayValue = `${parseFloat(definedValue.toFixed(decimalPlaces))} ${distance != null ? units.unit.abbreviatedName : angles.unit.abbreviatedName}`;
14
+ const inputPlacement = computeInputPlacement(viewport, bounds !== null && bounds !== void 0 ? bounds : Dimensions.create(0, 0), point, placement);
15
15
  const handleChange = (event) => {
16
16
  if (event.target != null) {
17
17
  const parsed = parseFloat(event.target.value);
@@ -1 +1 @@
1
- {"version":3,"file":"viewer-transform-widget-components.js","sourceRoot":"","sources":["../../../../../src/components/viewer-transform-widget/viewer-transform-widget-components.tsx"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { FunctionalComponent, h } from '@stencil/core';\nimport { Dimensions, Point } from '@vertexvis/geometry';\n\nimport {\n AngleUnits,\n AngleUnitType,\n DistanceUnits,\n DistanceUnitType,\n Viewport,\n} from '../../lib/types';\n\nexport type TransformWidgetInputPlacement =\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right';\n\nexport interface TransformWidgetInputProps {\n ref: (el?: HTMLInputElement) => void;\n bounds?: DOMRect;\n\n viewport: Viewport;\n point: Point.Point;\n placement: TransformWidgetInputPlacement;\n\n distance?: number;\n angle?: number;\n decimalPlaces: number;\n distanceUnit: DistanceUnitType;\n angleUnit: AngleUnitType;\n\n onChange?: (value: number) => void | Promise<void>;\n onIncrement?: VoidFunction;\n onDecrement?: VoidFunction;\n}\n\nexport const TransformWidgetInput: FunctionalComponent<\n TransformWidgetInputProps\n> = ({\n ref,\n bounds,\n viewport,\n point,\n placement,\n distance,\n angle,\n decimalPlaces,\n distanceUnit,\n angleUnit,\n onChange,\n onIncrement,\n onDecrement,\n}) => {\n const angles = new AngleUnits(angleUnit);\n const units = new DistanceUnits(distanceUnit);\n const displayValue =\n distance != null\n ? `${distance.toFixed(decimalPlaces)} ${units.unit.abbreviatedName}`\n : `${angle?.toFixed(decimalPlaces)} ${angles.unit.abbreviatedName}`;\n const inputPlacement = computeInputPlacement(\n viewport,\n bounds ?? Dimensions.create(100, 30),\n point,\n placement\n );\n\n const handleChange = (event: Event): void => {\n if (event.target != null) {\n const parsed = parseFloat((event.target as HTMLInputElement).value);\n\n if (!isNaN(parsed)) {\n onChange?.(parseFloat((event.target as HTMLInputElement).value));\n }\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'ArrowUp') {\n onIncrement?.();\n } else if (event.key === 'ArrowDown') {\n onDecrement?.();\n }\n };\n\n return (\n <div\n class=\"widget-input wrapper\"\n style={{ ...inputPlacement }}\n onKeyDown={handleKeyDown}\n >\n <input\n ref={ref}\n class=\"widget-input\"\n type=\"text\"\n value={displayValue}\n onChange={handleChange}\n ></input>\n </div>\n );\n};\n\nfunction constrainTo(dimension: number, length: number): number {\n return Math.min(dimension, Math.max(0, length));\n}\n\ninterface InputPlacement {\n left?: string;\n right?: string;\n top?: string;\n bottom?: string;\n}\n\nfunction computeInputPlacement(\n viewport: Viewport,\n inputDimensions: Dimensions.Dimensions,\n point: Point.Point,\n placement: TransformWidgetInputPlacement\n): InputPlacement {\n const { width, height } = viewport.dimensions;\n\n function toCssLength(length: number): string {\n return `${length}px`;\n }\n\n switch (placement) {\n case 'top-left':\n return {\n right: toCssLength(\n constrainTo(width - inputDimensions.width, width - point.x)\n ),\n bottom: toCssLength(\n constrainTo(height - inputDimensions.height, height - point.y)\n ),\n };\n case 'top-right':\n return {\n left: toCssLength(constrainTo(width - inputDimensions.width, point.x)),\n bottom: toCssLength(\n constrainTo(height - inputDimensions.height, height - point.y)\n ),\n };\n case 'bottom-left':\n return {\n right: toCssLength(\n constrainTo(width - inputDimensions.width, width - point.x)\n ),\n top: toCssLength(constrainTo(height - inputDimensions.height, point.y)),\n };\n case 'bottom-right':\n default:\n return {\n left: toCssLength(constrainTo(width - inputDimensions.width, point.x)),\n top: toCssLength(constrainTo(height - inputDimensions.height, point.y)),\n };\n }\n}\n"]}
1
+ {"version":3,"file":"viewer-transform-widget-components.js","sourceRoot":"","sources":["../../../../../src/components/viewer-transform-widget/viewer-transform-widget-components.tsx"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { FunctionalComponent, h } from '@stencil/core';\nimport { Dimensions, Point } from '@vertexvis/geometry';\n\nimport {\n AngleUnits,\n AngleUnitType,\n DistanceUnits,\n DistanceUnitType,\n Viewport,\n} from '../../lib/types';\n\nexport type TransformWidgetInputPlacement =\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right';\n\nexport interface TransformWidgetInputProps {\n ref: (el?: HTMLInputElement) => void;\n bounds?: DOMRect;\n\n viewport: Viewport;\n point: Point.Point;\n placement: TransformWidgetInputPlacement;\n\n distance?: number;\n angle?: number;\n decimalPlaces: number;\n distanceUnit: DistanceUnitType;\n angleUnit: AngleUnitType;\n\n onChange?: (value: number) => void | Promise<void>;\n onIncrement?: VoidFunction;\n onDecrement?: VoidFunction;\n}\n\nexport const TransformWidgetInput: FunctionalComponent<\n TransformWidgetInputProps\n> = ({\n ref,\n bounds,\n viewport,\n point,\n placement,\n distance,\n angle,\n decimalPlaces,\n distanceUnit,\n angleUnit,\n onChange,\n onIncrement,\n onDecrement,\n}) => {\n const angles = new AngleUnits(angleUnit);\n const units = new DistanceUnits(distanceUnit);\n const definedValue = distance ?? angle ?? 0;\n const displayValue = `${parseFloat(definedValue.toFixed(decimalPlaces))} ${\n distance != null ? units.unit.abbreviatedName : angles.unit.abbreviatedName\n }`;\n const inputPlacement = computeInputPlacement(\n viewport,\n bounds ?? Dimensions.create(0, 0),\n point,\n placement\n );\n\n const handleChange = (event: Event): void => {\n if (event.target != null) {\n const parsed = parseFloat((event.target as HTMLInputElement).value);\n\n if (!isNaN(parsed)) {\n onChange?.(parseFloat((event.target as HTMLInputElement).value));\n }\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'ArrowUp') {\n onIncrement?.();\n } else if (event.key === 'ArrowDown') {\n onDecrement?.();\n }\n };\n\n return (\n <div\n class=\"widget-input wrapper\"\n style={{ ...inputPlacement }}\n onKeyDown={handleKeyDown}\n >\n <input\n ref={ref}\n class=\"widget-input\"\n type=\"text\"\n value={displayValue}\n onChange={handleChange}\n ></input>\n </div>\n );\n};\n\nfunction constrainTo(dimension: number, length: number): number {\n return Math.min(dimension, Math.max(0, length));\n}\n\ninterface InputPlacement {\n left?: string;\n right?: string;\n top?: string;\n bottom?: string;\n}\n\nfunction computeInputPlacement(\n viewport: Viewport,\n inputDimensions: Dimensions.Dimensions,\n point: Point.Point,\n placement: TransformWidgetInputPlacement\n): InputPlacement {\n const { width, height } = viewport.dimensions;\n\n function toCssLength(length: number): string {\n return `${length}px`;\n }\n\n switch (placement) {\n case 'top-left':\n return {\n right: toCssLength(\n constrainTo(width - inputDimensions.width, width - point.x)\n ),\n bottom: toCssLength(\n constrainTo(height - inputDimensions.height, height - point.y)\n ),\n };\n case 'top-right':\n return {\n left: toCssLength(constrainTo(width - inputDimensions.width, point.x)),\n bottom: toCssLength(\n constrainTo(height - inputDimensions.height, height - point.y)\n ),\n };\n case 'bottom-left':\n return {\n right: toCssLength(\n constrainTo(width - inputDimensions.width, width - point.x)\n ),\n top: toCssLength(constrainTo(height - inputDimensions.height, point.y)),\n };\n case 'bottom-right':\n default:\n return {\n left: toCssLength(constrainTo(width - inputDimensions.width, point.x)),\n top: toCssLength(constrainTo(height - inputDimensions.height, point.y)),\n };\n }\n}\n"]}
@@ -77,12 +77,10 @@ export class ViewerTransformWidget {
77
77
  }
78
78
  };
79
79
  this.handleInputResize = () => {
80
- console.log(this.inputRef);
81
80
  if (this.inputRef != null) {
82
81
  const inputElement = this.inputRef;
83
82
  readDOM(() => {
84
83
  this.inputBounds = inputElement.getBoundingClientRect();
85
- console.log(this.inputBounds);
86
84
  });
87
85
  }
88
86
  };
@@ -224,7 +222,6 @@ export class ViewerTransformWidget {
224
222
  this.handleInputIncrement = () => {
225
223
  if (this.inputValue != null && this.lastInputValue != null) {
226
224
  this.inputValue = this.lastInputValue + 1;
227
- console.log(this.inputValue);
228
225
  this.handleInputChange(this.inputValue);
229
226
  }
230
227
  };
@@ -485,7 +482,7 @@ export class ViewerTransformWidget {
485
482
  (_b = this.inputResizeObserver) === null || _b === void 0 ? void 0 : _b.unobserve(this.inputRef);
486
483
  }
487
484
  this.inputRef = el;
488
- }, bounds: this.inputBounds, viewport: this.viewer.viewport, point: this.inputPosition.point, placement: this.inputPosition.position, angle: this.getDisplayedAngle(), distance: this.getDisplayedDistance(), decimalPlaces: this.decimalPlaces, distanceUnit: this.distanceUnit, angleUnit: this.angleUnit, onChange: this.handleInputChange, onIncrement: this.handleInputIncrement, onDecrement: this.handleInputDecrement }))));
485
+ }, bounds: this.inputBounds, viewport: this.viewer.viewport, point: this.inputPosition.point, placement: this.inputPosition.placement, angle: this.getDisplayedAngle(), distance: this.getDisplayedDistance(), decimalPlaces: this.decimalPlaces, distanceUnit: this.distanceUnit, angleUnit: this.angleUnit, onChange: this.handleInputChange, onIncrement: this.handleInputIncrement, onDecrement: this.handleInputDecrement }))));
489
486
  }
490
487
  transform(previous, next, angle) {
491
488
  var _a, _b;
@@ -1 +1 @@
1
- {"version":3,"file":"viewer-transform-widget.js","sourceRoot":"","sources":["../../../../../src/components/viewer-transform-widget/viewer-transform-widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport {\n Angle,\n Euler,\n Matrix4,\n Point,\n Quaternion,\n Vector3,\n} from '@vertexvis/geometry';\nimport { Color, Disposable } from '@vertexvis/utils';\nimport classNames from 'classnames';\n\nimport { readDOM, writeDOM } from '../../lib/stencil';\nimport { TransformController } from '../../lib/transforms/controller';\nimport { Drawable } from '../../lib/transforms/drawable';\nimport { AngleUnitType, DistanceUnitType } from '../../lib/types';\nimport {\n computeInputDisplayValue,\n computeInputPosition,\n computeInputTransform,\n computeUpdatedTransform,\n convertCanvasPointToWorld,\n convertPointToCanvas,\n PointAndPosition,\n} from './util';\nimport { TransformWidgetInput } from './viewer-transform-widget-components';\nimport { TransformWidget } from './widget';\n\n@Component({\n tag: 'vertex-viewer-transform-widget',\n styleUrl: 'viewer-transform-widget.css',\n shadow: true,\n})\nexport class ViewerTransformWidget {\n /**\n * An event that is emitted when the position of the widget changes.\n */\n @Event({ bubbles: true })\n public positionChanged!: EventEmitter<Vector3.Vector3 | undefined>;\n\n /**\n * An event that is emitted when the rotation of the widget changes.\n */\n @Event({ bubbles: true })\n public rotationChanged!: EventEmitter<Euler.Euler | undefined>;\n\n /**\n * An event that is emitted when the interaction has ended\n */\n @Event({ bubbles: true })\n public interactionEnded!: EventEmitter<Matrix4.Matrix4 | undefined>;\n\n /**\n * An event that is emitted an interaction with the widget has started\n */\n @Event({ bubbles: true })\n public interactionStarted!: EventEmitter<void>;\n\n /**\n * The viewer to connect to transforms. If nested within a <vertex-viewer>,\n * this property will be populated automatically.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The starting position of this transform widget. This position will be updated\n * as transforms occur. Setting this value to `undefined` will remove the widget.\n */\n @Prop({ mutable: true })\n public position?: Vector3.Vector3;\n\n /**\n * The starting angle for the transform widget. This rotation will be updated\n * as the rotations occur.\n */\n @Prop({ mutable: true })\n public rotation?: Euler.Euler;\n\n /**\n * The controller that is responsible for performing transforms.\n */\n @Prop({ mutable: true })\n public controller?: TransformController;\n\n /**\n * Determines whether or not the x-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xRotationDisabled = false;\n\n /**\n * Determines whether or not the y-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yRotationDisabled = false;\n\n /**\n * Determines whether or not the z-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public zRotationDisabled = false;\n\n /**\n * Determines whether or not the x-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xTranslationDisabled = false;\n\n /**\n * Determines whether or not the y-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yTranslationDisabled = false;\n\n /**\n * Determines whether or not the z-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public zTranslationDisabled = false;\n\n /**\n * The unit to show for translation inputs. Defaults to `millimeters`.\n *\n * @see DistanceUnitType\n */\n @Prop()\n public distanceUnit: DistanceUnitType = 'millimeters';\n\n /**\n * The unit to show for rotation inputs. Defaults to `degrees`.\n *\n * @see AngleUnitType\n */\n @Prop()\n public angleUnit: AngleUnitType = 'degrees';\n\n /**\n * The number of decimal places to show in the input. Defaults to `1`.\n */\n @Prop()\n public decimalPlaces = 1;\n\n /**\n * @internal\n * @ignore\n *\n * Visible for testing.\n */\n @Prop({ mutable: true })\n public hovered?: Drawable;\n\n @State()\n protected inputPosition?: PointAndPosition;\n\n @State()\n protected inputValue?: number;\n\n @Element()\n private hostEl!: HTMLElement;\n\n private startingTransform?: Matrix4.Matrix4;\n private currentTransform?: Matrix4.Matrix4;\n private dragStartTransform?: Matrix4.Matrix4;\n\n private xArrowColor: Color.Color | string = '#ea3324';\n private yArrowColor: Color.Color | string = '#4faf32';\n private zArrowColor: Color.Color | string = '#0000ff';\n private hoveredColor: Color.Color | string = '#ffff00';\n\n private widget?: TransformWidget;\n private lastDragged?: Drawable;\n private dragging?: Drawable;\n private lastAngle = 0;\n private lastWorldPosition?: Vector3.Vector3;\n private lastInputValue?: number;\n\n private canvasBounds?: DOMRect;\n private inputBounds?: DOMRect;\n private canvasResizeObserver?: ResizeObserver;\n private inputResizeObserver?: ResizeObserver;\n private hostStyleObserver?: MutationObserver;\n private canvasRef?: HTMLCanvasElement;\n private inputRef?: HTMLInputElement;\n\n private hoveredChangeDisposable?: Disposable;\n\n protected componentDidLoad(): void {\n window.addEventListener('pointermove', this.handlePointerMove);\n\n this.canvasResizeObserver = new ResizeObserver(this.handleResize);\n this.inputResizeObserver = new ResizeObserver(this.handleInputResize);\n this.hostStyleObserver = new MutationObserver(this.handleStyleChange);\n\n if (this.canvasRef != null) {\n this.canvasResizeObserver.observe(this.canvasRef);\n\n this.setupTransformWidget(this.canvasRef);\n }\n\n this.hostStyleObserver.observe(this.hostEl, {\n attributes: true,\n attributeFilter: ['style'],\n });\n\n this.handleViewerChanged(this.viewer, undefined);\n this.handleStyleChange();\n this.handleInputResize();\n }\n\n protected disconnectedCallback(): void {\n window.removeEventListener('pointermove', this.handlePointerMove);\n\n this.canvasResizeObserver?.disconnect();\n this.inputResizeObserver?.disconnect();\n this.hostStyleObserver?.disconnect();\n\n this.hoveredChangeDisposable?.dispose();\n this.widget?.dispose();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n oldViewer?.removeEventListener('frameDrawn', this.handleViewerFrameDrawn);\n oldViewer?.removeEventListener(\n 'dimensionschange',\n this.handleViewerDimensionsChange\n );\n newViewer?.addEventListener('frameDrawn', this.handleViewerFrameDrawn);\n newViewer?.addEventListener(\n 'dimensionschange',\n this.handleViewerDimensionsChange\n );\n\n if (newViewer?.stream != null) {\n this.controller?.dispose();\n this.controller = new TransformController(newViewer.stream);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('xTranslationDisabled')\n @Watch('yTranslationDisabled')\n @Watch('zTranslationDisabled')\n @Watch('xRotationDisabled')\n @Watch('yRotationDisabled')\n @Watch('zRotationDisabled')\n protected handleDisabledPropertyChanged(): void {\n this.widget?.updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n });\n }\n\n /**\n * @ignore\n */\n @Watch('rotation')\n protected handleRotationChanged(\n newRotation?: Euler.Euler,\n oldRotation?: Euler.Euler\n ): void {\n const rotationToApply = newRotation ?? Euler.create();\n\n this.currentTransform = this.getTransformForNewRotation(rotationToApply);\n this.startingTransform = this.currentTransform;\n\n // If the removal of the previous rotation above results in an identity matrix,\n // clear the transformation on the widget to prevent it from appearing at the origin.\n if (\n newRotation == null &&\n this.currentTransform != null &&\n Matrix4.isIdentity(this.currentTransform)\n ) {\n this.currentTransform = undefined;\n this.startingTransform = this.currentTransform;\n }\n\n this.widget?.updateTransform(this.currentTransform);\n\n console.debug(\n `Updating widget rotation [previous=${JSON.stringify(\n oldRotation\n )}, current=${JSON.stringify(newRotation)}]`\n );\n\n this.rotationChanged.emit(newRotation);\n }\n\n /**\n * @ignore\n */\n @Watch('position')\n protected handlePositionChanged(\n newPosition?: Vector3.Vector3,\n oldPosition?: Vector3.Vector3\n ): void {\n this.currentTransform = this.getTransformForNewPosition(newPosition);\n this.startingTransform = this.currentTransform;\n\n console.debug(\n `Updating widget position [previous=${JSON.stringify(\n oldPosition\n )}, current=${JSON.stringify(newPosition)}]`\n );\n this.widget?.updateTransform(this.currentTransform);\n\n if (newPosition == null) {\n this.lastDragged = undefined;\n this.inputPosition = undefined;\n this.controller?.clearTransform();\n }\n\n this.positionChanged.emit(newPosition);\n }\n\n public render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <canvas\n ref={(el) => {\n this.canvasRef = el;\n }}\n class={classNames('widget', {\n hovered: this.hovered != null,\n })}\n width={this.viewer?.viewport.width}\n height={this.viewer?.viewport.height}\n onPointerDown={this.handleBeginDrag}\n />\n\n {this.inputPosition &&\n this.inputValue != null &&\n this.viewer?.viewport && (\n <TransformWidgetInput\n ref={(el) => {\n if (el != null) {\n this.inputResizeObserver?.observe(el);\n } else if (this.inputRef != null) {\n this.inputResizeObserver?.unobserve(this.inputRef);\n }\n this.inputRef = el;\n }}\n bounds={this.inputBounds}\n viewport={this.viewer.viewport}\n point={this.inputPosition.point}\n placement={this.inputPosition.position}\n angle={this.getDisplayedAngle()}\n distance={this.getDisplayedDistance()}\n decimalPlaces={this.decimalPlaces}\n distanceUnit={this.distanceUnit}\n angleUnit={this.angleUnit}\n onChange={this.handleInputChange}\n onIncrement={this.handleInputIncrement}\n onDecrement={this.handleInputDecrement}\n />\n )}\n </Host>\n );\n }\n\n private handleHoveredDrawableChanged = (drawable?: Drawable): void => {\n this.hovered = drawable;\n };\n\n private handleViewerFrameDrawn = (): void => {\n this.updatePropsFromViewer();\n };\n\n private handleViewerDimensionsChange = (): void => {\n writeDOM(() => {\n if (this.viewer != null && this.canvasRef != null) {\n this.canvasRef.width = this.viewer.viewport.width;\n this.canvasRef.height = this.viewer.viewport.height;\n\n this.updateCanvasBounds(this.canvasRef);\n }\n });\n };\n\n private handleResize = (): void => {\n if (this.canvasRef != null) {\n this.updateCanvasBounds(this.canvasRef);\n }\n };\n\n private handleInputResize = (): void => {\n console.log(this.inputRef);\n if (this.inputRef != null) {\n const inputElement = this.inputRef;\n\n readDOM(() => {\n this.inputBounds = inputElement.getBoundingClientRect();\n console.log(this.inputBounds);\n });\n }\n };\n\n private handleStyleChange = (): void => {\n readDOM(() => {\n const hostStyles = window.getComputedStyle(this.hostEl);\n\n this.xArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-x-axis-arrow-color')\n .trim();\n this.yArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-y-axis-arrow-color')\n .trim();\n this.zArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-z-axis-arrow-color')\n .trim();\n this.hoveredColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-hovered-arrow-color')\n .trim();\n\n this.getTransformWidget().updateColors({\n xArrow: this.xArrowColor,\n yArrow: this.yArrowColor,\n zArrow: this.zArrowColor,\n hovered: this.hoveredColor,\n });\n });\n };\n\n private handlePointerMove = (event: PointerEvent): void => {\n if (this.dragging == null) {\n const canvasPoint = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n this.getCanvasBounds()\n );\n const widget = this.getTransformWidget();\n\n if (canvasPoint != null && widget.boundsContainsPoint(canvasPoint)) {\n widget.updateCursor(canvasPoint);\n } else {\n widget.updateCursor(undefined);\n this.hovered = undefined;\n }\n }\n };\n\n private handleBeginDrag = async (event: PointerEvent): Promise<void> => {\n const canvasBounds = this.getCanvasBounds();\n\n if (\n this.hovered != null &&\n canvasBounds != null &&\n this.viewer != null &&\n this.position != null &&\n this.viewer.frame != null\n ) {\n this.dragging = this.hovered;\n\n if (this.dragging.identifier !== this.lastDragged?.identifier) {\n this.dragStartTransform = this.currentTransform;\n }\n this.lastDragged = undefined;\n\n const currentCanvas = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n canvasBounds\n );\n const widgetCenter = this.viewer.viewport.transformWorldToViewport(\n this.position,\n this.viewer.frame.scene.camera.projectionViewMatrix\n );\n\n this.lastAngle =\n currentCanvas != null\n ? Angle.fromPoints(widgetCenter, currentCanvas)\n : 0;\n\n this.lastWorldPosition = convertCanvasPointToWorld(\n currentCanvas,\n this.viewer?.frame,\n this.viewer?.viewport,\n this.currentTransform\n );\n\n this.interactionStarted.emit();\n\n window.removeEventListener('pointermove', this.handlePointerMove);\n window.addEventListener('pointermove', this.handleDrag);\n window.addEventListener('pointerup', this.handleEndTransform);\n }\n };\n\n private handleDrag = async (event: PointerEvent): Promise<void> => {\n // Prevent selection of text and interaction with view cube while dragging the widget\n event.preventDefault();\n\n const canvasBounds = this.getCanvasBounds();\n\n if (\n this.dragging != null &&\n this.lastWorldPosition != null &&\n canvasBounds != null &&\n this.viewer != null &&\n this.viewer.frame != null &&\n this.position != null\n ) {\n // Begin the transform on the first `pointermove` event as opposed to the\n // `pointerdown` to prevent accidental no-op transforms (identity matrix).\n await this.controller?.beginTransform();\n\n const currentCanvas = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n canvasBounds\n );\n const widgetCenter = this.viewer.viewport.transformWorldToViewport(\n this.position,\n this.viewer.frame.scene.camera.projectionViewMatrix\n );\n\n const currentWorld = convertCanvasPointToWorld(\n currentCanvas,\n this.viewer?.frame,\n this.viewer?.viewport,\n this.currentTransform\n );\n\n if (\n currentWorld != null &&\n currentCanvas != null &&\n widgetCenter != null\n ) {\n const angle = Angle.fromPoints(widgetCenter, currentCanvas);\n\n this.transform(\n this.lastWorldPosition,\n currentWorld,\n angle - this.lastAngle\n );\n\n this.updateInputPosition();\n this.updateInputValue();\n\n this.lastWorldPosition = currentWorld;\n this.lastAngle = angle;\n }\n }\n };\n\n private handleEndTransform = async (event: PointerEvent): Promise<void> => {\n const canvasPoint = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n this.getCanvasBounds()\n );\n const widget = this.getTransformWidget();\n this.lastDragged = this.dragging;\n\n this.dragging = undefined;\n this.lastWorldPosition = undefined;\n this.position =\n this.currentTransform != null\n ? Vector3.fromMatrixPosition(this.currentTransform)\n : this.position;\n this.lastAngle = 0;\n\n this.updateInputPosition();\n this.updateInputValue();\n\n widget.updateCursor(canvasPoint);\n widget.updateTransform(this.currentTransform);\n\n widget.updateDisabledAxis({\n xRotation: true,\n yRotation: true,\n zRotation: true,\n xTranslation: true,\n yTranslation: true,\n zTranslation: true,\n });\n\n window.removeEventListener('pointermove', this.handleDrag);\n window.removeEventListener('pointerup', this.handleEndTransform);\n\n try {\n const delta = this.controller?.getCurrentDelta();\n\n await this.controller?.endTransform();\n\n this.interactionEnded.emit(delta);\n } catch (e) {\n console.error('Failed to end transform interaction', e);\n }\n\n window.addEventListener('pointermove', this.handlePointerMove);\n\n this.getTransformWidget().updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n });\n };\n\n private handleInputIncrement = (): void => {\n if (this.inputValue != null && this.lastInputValue != null) {\n this.inputValue = this.lastInputValue + 1;\n console.log(this.inputValue);\n this.handleInputChange(this.inputValue);\n }\n };\n\n private handleInputDecrement = (): void => {\n if (this.inputValue != null && this.lastInputValue != null) {\n this.inputValue = this.lastInputValue - 1;\n this.handleInputChange(this.inputValue);\n }\n };\n\n private handleInputChange = async (value: number): Promise<void> => {\n if (\n this.lastDragged != null &&\n this.currentTransform != null &&\n this.startingTransform != null &&\n this.lastInputValue != null\n ) {\n this.transformCurrent(\n computeInputTransform(\n this.lastDragged.identifier,\n value,\n this.lastInputValue,\n this.distanceUnit,\n this.angleUnit\n )\n );\n\n this.lastInputValue = value;\n\n await this.controller?.beginTransform();\n this.getTransformWidget().updateTransform(this.currentTransform);\n await this.controller?.updateTransform(\n Matrix4.multiply(\n this.currentTransform,\n Matrix4.invert(this.startingTransform)\n )\n );\n this.updateInputPosition();\n await this.controller?.endTransformDebounced(() => {\n this.position =\n this.currentTransform != null\n ? Vector3.fromMatrixPosition(this.currentTransform)\n : this.position;\n });\n }\n };\n\n private updatePropsFromViewer = (): void => {\n const { frame } = this.viewer || {};\n\n if (frame != null) {\n const widget = this.getTransformWidget();\n\n widget.updateFrame(frame, this.dragging == null);\n this.updateInputPosition();\n }\n };\n\n private transform(\n previous: Vector3.Vector3,\n next: Vector3.Vector3,\n angle: number\n ): void {\n if (\n this.position != null &&\n this.startingTransform != null &&\n this.currentTransform != null &&\n this.dragging != null &&\n this.viewer != null &&\n this.viewer.frame != null\n ) {\n this.currentTransform = computeUpdatedTransform(\n this.currentTransform,\n previous,\n next,\n this.viewer?.frame.scene.camera.viewVector,\n angle,\n this.dragging.identifier\n );\n\n this.getTransformWidget().updateTransform(this.currentTransform);\n this.controller?.updateTransform(\n Matrix4.multiply(\n this.currentTransform,\n Matrix4.invert(this.startingTransform)\n )\n );\n }\n }\n\n private handleSettingDisabledAxis(): void {\n if (this.widget) {\n this.widget.updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n });\n } else {\n console.warn('Cannot set disabled values - no widget defined');\n }\n }\n\n private setupTransformWidget = (\n canvasRef: HTMLCanvasElement\n ): TransformWidget => {\n console.debug(\n `Initializing transform widget. [initial-position=${JSON.stringify(\n this.position\n )}, has-initial-frame=${this.viewer?.frame != null}]`\n );\n\n this.widget = new TransformWidget(canvasRef, {\n xArrow: this.xArrowColor,\n yArrow: this.yArrowColor,\n zArrow: this.zArrowColor,\n hovered: this.hoveredColor,\n });\n\n if (this.rotation != null) {\n this.currentTransform = this.getTransformForNewRotation(this.rotation);\n this.startingTransform = this.currentTransform;\n this.widget.updateTransform(this.currentTransform);\n }\n\n if (this.position != null) {\n this.currentTransform = this.getTransformForNewPosition(this.position);\n this.startingTransform = this.currentTransform;\n this.widget.updateTransform(this.currentTransform);\n }\n if (this.viewer?.frame != null) {\n this.widget.updateFrame(this.viewer.frame, true);\n }\n\n this.handleSettingDisabledAxis();\n\n this.hoveredChangeDisposable = this.widget.onHoveredChanged(\n this.handleHoveredDrawableChanged\n );\n\n return this.widget;\n };\n\n private updateCanvasBounds = (canvasElement: HTMLCanvasElement): void => {\n readDOM(() => {\n this.canvasBounds = canvasElement.getBoundingClientRect();\n\n this.getTransformWidget().updateDimensions(canvasElement);\n });\n };\n\n private get currentRotation(): Matrix4.Matrix4 {\n if (this.currentTransform != null) {\n return Matrix4.makeRotation(\n Quaternion.fromMatrixRotation(this.currentTransform)\n );\n }\n return Matrix4.makeIdentity();\n }\n\n private updateInputValue = (): void => {\n const dragging = this.dragging ?? this.lastDragged;\n if (\n dragging != null &&\n this.currentTransform != null &&\n this.dragStartTransform != null\n ) {\n this.lastInputValue = this.inputValue;\n\n this.inputValue = computeInputDisplayValue(\n dragging.identifier,\n this.currentTransform,\n this.dragStartTransform,\n this.distanceUnit,\n this.angleUnit\n );\n }\n };\n\n private transformCurrent = (transform: Matrix4.Matrix4): void => {\n this.currentTransform =\n this.currentTransform != null\n ? Matrix4.multiply(this.currentTransform, transform)\n : transform;\n };\n\n private updateInputPosition = (): void => {\n const widget = this.getTransformWidget();\n const widgetBounds = widget.getFullBounds();\n const dragging = this.dragging ?? this.lastDragged;\n if (\n this.viewer?.frame != null &&\n this.position != null &&\n dragging != null &&\n widgetBounds != null\n ) {\n this.inputPosition = computeInputPosition(\n this.viewer.viewport,\n widgetBounds,\n dragging.points.toArray()\n );\n }\n };\n\n private getDisplayedAngle = (): number | undefined => {\n const draggingIdentifier =\n this.dragging?.identifier ?? this.lastDragged?.identifier;\n if (draggingIdentifier?.includes('rotate')) {\n return this.inputValue;\n }\n };\n\n private getDisplayedDistance = (): number | undefined => {\n const draggingIdentifier =\n this.dragging?.identifier ?? this.lastDragged?.identifier;\n if (draggingIdentifier?.includes('translate')) {\n return this.inputValue;\n }\n };\n\n private getTransformForNewPosition = (\n newPosition?: Vector3.Vector3\n ): Matrix4.Matrix4 | undefined => {\n if (newPosition != null) {\n const c =\n this.currentTransform != null\n ? this.currentTransform\n : Matrix4.makeIdentity();\n\n const currentRotation = Matrix4.makeRotation(\n Quaternion.fromMatrixRotation(c)\n );\n const position = Matrix4.makeTranslation(newPosition);\n\n return Matrix4.multiply(position, currentRotation);\n }\n };\n\n private getTransformForNewRotation = (\n newRotationEuler: Euler.Euler\n ): Matrix4.Matrix4 | undefined => {\n const c =\n this.currentTransform != null\n ? this.currentTransform\n : Matrix4.makeIdentity();\n\n const oldRotation = Matrix4.invert(\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(c))\n );\n\n const newRotation = Matrix4.makeRotation(\n Quaternion.fromEuler(newRotationEuler)\n );\n const oldTranslation = Matrix4.multiply(c, oldRotation);\n\n return Matrix4.multiply(oldTranslation, newRotation);\n };\n\n private getCanvasBounds = (): DOMRect | undefined => {\n if (this.canvasBounds != null) {\n return this.canvasBounds;\n } else if (this.canvasRef != null) {\n this.updateCanvasBounds(this.canvasRef);\n return this.canvasBounds;\n }\n };\n\n private getTransformWidget = (): TransformWidget => {\n if (this.widget == null && this.canvasRef != null) {\n return this.setupTransformWidget(this.canvasRef);\n } else if (this.widget != null) {\n return this.widget;\n } else {\n throw new Error(\n 'Transform widget was not initialized. The canvas element may not have been initialized.'\n );\n }\n };\n}\n"]}
1
+ {"version":3,"file":"viewer-transform-widget.js","sourceRoot":"","sources":["../../../../../src/components/viewer-transform-widget/viewer-transform-widget.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport {\n Angle,\n Euler,\n Matrix4,\n Point,\n Quaternion,\n Vector3,\n} from '@vertexvis/geometry';\nimport { Color, Disposable } from '@vertexvis/utils';\nimport classNames from 'classnames';\n\nimport { readDOM, writeDOM } from '../../lib/stencil';\nimport { TransformController } from '../../lib/transforms/controller';\nimport { Drawable } from '../../lib/transforms/drawable';\nimport { AngleUnitType, DistanceUnitType } from '../../lib/types';\nimport {\n computeInputDisplayValue,\n computeInputPosition,\n computeInputTransform,\n computeUpdatedTransform,\n convertCanvasPointToWorld,\n convertPointToCanvas,\n PointAndPlacement,\n} from './util';\nimport { TransformWidgetInput } from './viewer-transform-widget-components';\nimport { TransformWidget } from './widget';\n\n@Component({\n tag: 'vertex-viewer-transform-widget',\n styleUrl: 'viewer-transform-widget.css',\n shadow: true,\n})\nexport class ViewerTransformWidget {\n /**\n * An event that is emitted when the position of the widget changes.\n */\n @Event({ bubbles: true })\n public positionChanged!: EventEmitter<Vector3.Vector3 | undefined>;\n\n /**\n * An event that is emitted when the rotation of the widget changes.\n */\n @Event({ bubbles: true })\n public rotationChanged!: EventEmitter<Euler.Euler | undefined>;\n\n /**\n * An event that is emitted when the interaction has ended\n */\n @Event({ bubbles: true })\n public interactionEnded!: EventEmitter<Matrix4.Matrix4 | undefined>;\n\n /**\n * An event that is emitted an interaction with the widget has started\n */\n @Event({ bubbles: true })\n public interactionStarted!: EventEmitter<void>;\n\n /**\n * The viewer to connect to transforms. If nested within a <vertex-viewer>,\n * this property will be populated automatically.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The starting position of this transform widget. This position will be updated\n * as transforms occur. Setting this value to `undefined` will remove the widget.\n */\n @Prop({ mutable: true })\n public position?: Vector3.Vector3;\n\n /**\n * The starting angle for the transform widget. This rotation will be updated\n * as the rotations occur.\n */\n @Prop({ mutable: true })\n public rotation?: Euler.Euler;\n\n /**\n * The controller that is responsible for performing transforms.\n */\n @Prop({ mutable: true })\n public controller?: TransformController;\n\n /**\n * Determines whether or not the x-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xRotationDisabled = false;\n\n /**\n * Determines whether or not the y-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yRotationDisabled = false;\n\n /**\n * Determines whether or not the z-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public zRotationDisabled = false;\n\n /**\n * Determines whether or not the x-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xTranslationDisabled = false;\n\n /**\n * Determines whether or not the y-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yTranslationDisabled = false;\n\n /**\n * Determines whether or not the z-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public zTranslationDisabled = false;\n\n /**\n * The unit to show for translation inputs. Defaults to `millimeters`.\n *\n * @see DistanceUnitType\n */\n @Prop()\n public distanceUnit: DistanceUnitType = 'millimeters';\n\n /**\n * The unit to show for rotation inputs. Defaults to `degrees`.\n *\n * @see AngleUnitType\n */\n @Prop()\n public angleUnit: AngleUnitType = 'degrees';\n\n /**\n * The number of decimal places to show in the input. Defaults to `1`.\n */\n @Prop()\n public decimalPlaces = 1;\n\n /**\n * @internal\n * @ignore\n *\n * Visible for testing.\n */\n @Prop({ mutable: true })\n public hovered?: Drawable;\n\n @State()\n protected inputPosition?: PointAndPlacement;\n\n @State()\n protected inputValue?: number;\n\n @Element()\n private hostEl!: HTMLElement;\n\n private startingTransform?: Matrix4.Matrix4;\n private currentTransform?: Matrix4.Matrix4;\n private dragStartTransform?: Matrix4.Matrix4;\n\n private xArrowColor: Color.Color | string = '#ea3324';\n private yArrowColor: Color.Color | string = '#4faf32';\n private zArrowColor: Color.Color | string = '#0000ff';\n private hoveredColor: Color.Color | string = '#ffff00';\n\n private widget?: TransformWidget;\n private lastDragged?: Drawable;\n private dragging?: Drawable;\n private lastAngle = 0;\n private lastWorldPosition?: Vector3.Vector3;\n private lastInputValue?: number;\n\n private canvasBounds?: DOMRect;\n private inputBounds?: DOMRect;\n private canvasResizeObserver?: ResizeObserver;\n private inputResizeObserver?: ResizeObserver;\n private hostStyleObserver?: MutationObserver;\n private canvasRef?: HTMLCanvasElement;\n private inputRef?: HTMLInputElement;\n\n private hoveredChangeDisposable?: Disposable;\n\n protected componentDidLoad(): void {\n window.addEventListener('pointermove', this.handlePointerMove);\n\n this.canvasResizeObserver = new ResizeObserver(this.handleResize);\n this.inputResizeObserver = new ResizeObserver(this.handleInputResize);\n this.hostStyleObserver = new MutationObserver(this.handleStyleChange);\n\n if (this.canvasRef != null) {\n this.canvasResizeObserver.observe(this.canvasRef);\n\n this.setupTransformWidget(this.canvasRef);\n }\n\n this.hostStyleObserver.observe(this.hostEl, {\n attributes: true,\n attributeFilter: ['style'],\n });\n\n this.handleViewerChanged(this.viewer, undefined);\n this.handleStyleChange();\n this.handleInputResize();\n }\n\n protected disconnectedCallback(): void {\n window.removeEventListener('pointermove', this.handlePointerMove);\n\n this.canvasResizeObserver?.disconnect();\n this.inputResizeObserver?.disconnect();\n this.hostStyleObserver?.disconnect();\n\n this.hoveredChangeDisposable?.dispose();\n this.widget?.dispose();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n oldViewer?.removeEventListener('frameDrawn', this.handleViewerFrameDrawn);\n oldViewer?.removeEventListener(\n 'dimensionschange',\n this.handleViewerDimensionsChange\n );\n newViewer?.addEventListener('frameDrawn', this.handleViewerFrameDrawn);\n newViewer?.addEventListener(\n 'dimensionschange',\n this.handleViewerDimensionsChange\n );\n\n if (newViewer?.stream != null) {\n this.controller?.dispose();\n this.controller = new TransformController(newViewer.stream);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('xTranslationDisabled')\n @Watch('yTranslationDisabled')\n @Watch('zTranslationDisabled')\n @Watch('xRotationDisabled')\n @Watch('yRotationDisabled')\n @Watch('zRotationDisabled')\n protected handleDisabledPropertyChanged(): void {\n this.widget?.updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n });\n }\n\n /**\n * @ignore\n */\n @Watch('rotation')\n protected handleRotationChanged(\n newRotation?: Euler.Euler,\n oldRotation?: Euler.Euler\n ): void {\n const rotationToApply = newRotation ?? Euler.create();\n\n this.currentTransform = this.getTransformForNewRotation(rotationToApply);\n this.startingTransform = this.currentTransform;\n\n // If the removal of the previous rotation above results in an identity matrix,\n // clear the transformation on the widget to prevent it from appearing at the origin.\n if (\n newRotation == null &&\n this.currentTransform != null &&\n Matrix4.isIdentity(this.currentTransform)\n ) {\n this.currentTransform = undefined;\n this.startingTransform = this.currentTransform;\n }\n\n this.widget?.updateTransform(this.currentTransform);\n\n console.debug(\n `Updating widget rotation [previous=${JSON.stringify(\n oldRotation\n )}, current=${JSON.stringify(newRotation)}]`\n );\n\n this.rotationChanged.emit(newRotation);\n }\n\n /**\n * @ignore\n */\n @Watch('position')\n protected handlePositionChanged(\n newPosition?: Vector3.Vector3,\n oldPosition?: Vector3.Vector3\n ): void {\n this.currentTransform = this.getTransformForNewPosition(newPosition);\n this.startingTransform = this.currentTransform;\n\n console.debug(\n `Updating widget position [previous=${JSON.stringify(\n oldPosition\n )}, current=${JSON.stringify(newPosition)}]`\n );\n this.widget?.updateTransform(this.currentTransform);\n\n if (newPosition == null) {\n this.lastDragged = undefined;\n this.inputPosition = undefined;\n this.controller?.clearTransform();\n }\n\n this.positionChanged.emit(newPosition);\n }\n\n public render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <canvas\n ref={(el) => {\n this.canvasRef = el;\n }}\n class={classNames('widget', {\n hovered: this.hovered != null,\n })}\n width={this.viewer?.viewport.width}\n height={this.viewer?.viewport.height}\n onPointerDown={this.handleBeginDrag}\n />\n\n {this.inputPosition &&\n this.inputValue != null &&\n this.viewer?.viewport && (\n <TransformWidgetInput\n ref={(el) => {\n if (el != null) {\n this.inputResizeObserver?.observe(el);\n } else if (this.inputRef != null) {\n this.inputResizeObserver?.unobserve(this.inputRef);\n }\n this.inputRef = el;\n }}\n bounds={this.inputBounds}\n viewport={this.viewer.viewport}\n point={this.inputPosition.point}\n placement={this.inputPosition.placement}\n angle={this.getDisplayedAngle()}\n distance={this.getDisplayedDistance()}\n decimalPlaces={this.decimalPlaces}\n distanceUnit={this.distanceUnit}\n angleUnit={this.angleUnit}\n onChange={this.handleInputChange}\n onIncrement={this.handleInputIncrement}\n onDecrement={this.handleInputDecrement}\n />\n )}\n </Host>\n );\n }\n\n private handleHoveredDrawableChanged = (drawable?: Drawable): void => {\n this.hovered = drawable;\n };\n\n private handleViewerFrameDrawn = (): void => {\n this.updatePropsFromViewer();\n };\n\n private handleViewerDimensionsChange = (): void => {\n writeDOM(() => {\n if (this.viewer != null && this.canvasRef != null) {\n this.canvasRef.width = this.viewer.viewport.width;\n this.canvasRef.height = this.viewer.viewport.height;\n\n this.updateCanvasBounds(this.canvasRef);\n }\n });\n };\n\n private handleResize = (): void => {\n if (this.canvasRef != null) {\n this.updateCanvasBounds(this.canvasRef);\n }\n };\n\n private handleInputResize = (): void => {\n if (this.inputRef != null) {\n const inputElement = this.inputRef;\n\n readDOM(() => {\n this.inputBounds = inputElement.getBoundingClientRect();\n });\n }\n };\n\n private handleStyleChange = (): void => {\n readDOM(() => {\n const hostStyles = window.getComputedStyle(this.hostEl);\n\n this.xArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-x-axis-arrow-color')\n .trim();\n this.yArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-y-axis-arrow-color')\n .trim();\n this.zArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-z-axis-arrow-color')\n .trim();\n this.hoveredColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-hovered-arrow-color')\n .trim();\n\n this.getTransformWidget().updateColors({\n xArrow: this.xArrowColor,\n yArrow: this.yArrowColor,\n zArrow: this.zArrowColor,\n hovered: this.hoveredColor,\n });\n });\n };\n\n private handlePointerMove = (event: PointerEvent): void => {\n if (this.dragging == null) {\n const canvasPoint = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n this.getCanvasBounds()\n );\n const widget = this.getTransformWidget();\n\n if (canvasPoint != null && widget.boundsContainsPoint(canvasPoint)) {\n widget.updateCursor(canvasPoint);\n } else {\n widget.updateCursor(undefined);\n this.hovered = undefined;\n }\n }\n };\n\n private handleBeginDrag = async (event: PointerEvent): Promise<void> => {\n const canvasBounds = this.getCanvasBounds();\n\n if (\n this.hovered != null &&\n canvasBounds != null &&\n this.viewer != null &&\n this.position != null &&\n this.viewer.frame != null\n ) {\n this.dragging = this.hovered;\n\n if (this.dragging.identifier !== this.lastDragged?.identifier) {\n this.dragStartTransform = this.currentTransform;\n }\n this.lastDragged = undefined;\n\n const currentCanvas = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n canvasBounds\n );\n const widgetCenter = this.viewer.viewport.transformWorldToViewport(\n this.position,\n this.viewer.frame.scene.camera.projectionViewMatrix\n );\n\n this.lastAngle =\n currentCanvas != null\n ? Angle.fromPoints(widgetCenter, currentCanvas)\n : 0;\n\n this.lastWorldPosition = convertCanvasPointToWorld(\n currentCanvas,\n this.viewer?.frame,\n this.viewer?.viewport,\n this.currentTransform\n );\n\n this.interactionStarted.emit();\n\n window.removeEventListener('pointermove', this.handlePointerMove);\n window.addEventListener('pointermove', this.handleDrag);\n window.addEventListener('pointerup', this.handleEndTransform);\n }\n };\n\n private handleDrag = async (event: PointerEvent): Promise<void> => {\n // Prevent selection of text and interaction with view cube while dragging the widget\n event.preventDefault();\n\n const canvasBounds = this.getCanvasBounds();\n\n if (\n this.dragging != null &&\n this.lastWorldPosition != null &&\n canvasBounds != null &&\n this.viewer != null &&\n this.viewer.frame != null &&\n this.position != null\n ) {\n // Begin the transform on the first `pointermove` event as opposed to the\n // `pointerdown` to prevent accidental no-op transforms (identity matrix).\n await this.controller?.beginTransform();\n\n const currentCanvas = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n canvasBounds\n );\n const widgetCenter = this.viewer.viewport.transformWorldToViewport(\n this.position,\n this.viewer.frame.scene.camera.projectionViewMatrix\n );\n\n const currentWorld = convertCanvasPointToWorld(\n currentCanvas,\n this.viewer?.frame,\n this.viewer?.viewport,\n this.currentTransform\n );\n\n if (\n currentWorld != null &&\n currentCanvas != null &&\n widgetCenter != null\n ) {\n const angle = Angle.fromPoints(widgetCenter, currentCanvas);\n\n this.transform(\n this.lastWorldPosition,\n currentWorld,\n angle - this.lastAngle\n );\n\n this.updateInputPosition();\n this.updateInputValue();\n\n this.lastWorldPosition = currentWorld;\n this.lastAngle = angle;\n }\n }\n };\n\n private handleEndTransform = async (event: PointerEvent): Promise<void> => {\n const canvasPoint = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n this.getCanvasBounds()\n );\n const widget = this.getTransformWidget();\n this.lastDragged = this.dragging;\n\n this.dragging = undefined;\n this.lastWorldPosition = undefined;\n this.position =\n this.currentTransform != null\n ? Vector3.fromMatrixPosition(this.currentTransform)\n : this.position;\n this.lastAngle = 0;\n\n this.updateInputPosition();\n this.updateInputValue();\n\n widget.updateCursor(canvasPoint);\n widget.updateTransform(this.currentTransform);\n\n widget.updateDisabledAxis({\n xRotation: true,\n yRotation: true,\n zRotation: true,\n xTranslation: true,\n yTranslation: true,\n zTranslation: true,\n });\n\n window.removeEventListener('pointermove', this.handleDrag);\n window.removeEventListener('pointerup', this.handleEndTransform);\n\n try {\n const delta = this.controller?.getCurrentDelta();\n\n await this.controller?.endTransform();\n\n this.interactionEnded.emit(delta);\n } catch (e) {\n console.error('Failed to end transform interaction', e);\n }\n\n window.addEventListener('pointermove', this.handlePointerMove);\n\n this.getTransformWidget().updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n });\n };\n\n private handleInputIncrement = (): void => {\n if (this.inputValue != null && this.lastInputValue != null) {\n this.inputValue = this.lastInputValue + 1;\n this.handleInputChange(this.inputValue);\n }\n };\n\n private handleInputDecrement = (): void => {\n if (this.inputValue != null && this.lastInputValue != null) {\n this.inputValue = this.lastInputValue - 1;\n this.handleInputChange(this.inputValue);\n }\n };\n\n private handleInputChange = async (value: number): Promise<void> => {\n if (\n this.lastDragged != null &&\n this.currentTransform != null &&\n this.startingTransform != null &&\n this.lastInputValue != null\n ) {\n this.transformCurrent(\n computeInputTransform(\n this.lastDragged.identifier,\n value,\n this.lastInputValue,\n this.distanceUnit,\n this.angleUnit\n )\n );\n\n this.lastInputValue = value;\n\n await this.controller?.beginTransform();\n this.getTransformWidget().updateTransform(this.currentTransform);\n await this.controller?.updateTransform(\n Matrix4.multiply(\n this.currentTransform,\n Matrix4.invert(this.startingTransform)\n )\n );\n this.updateInputPosition();\n await this.controller?.endTransformDebounced(() => {\n this.position =\n this.currentTransform != null\n ? Vector3.fromMatrixPosition(this.currentTransform)\n : this.position;\n });\n }\n };\n\n private updatePropsFromViewer = (): void => {\n const { frame } = this.viewer || {};\n\n if (frame != null) {\n const widget = this.getTransformWidget();\n\n widget.updateFrame(frame, this.dragging == null);\n this.updateInputPosition();\n }\n };\n\n private transform(\n previous: Vector3.Vector3,\n next: Vector3.Vector3,\n angle: number\n ): void {\n if (\n this.position != null &&\n this.startingTransform != null &&\n this.currentTransform != null &&\n this.dragging != null &&\n this.viewer != null &&\n this.viewer.frame != null\n ) {\n this.currentTransform = computeUpdatedTransform(\n this.currentTransform,\n previous,\n next,\n this.viewer?.frame.scene.camera.viewVector,\n angle,\n this.dragging.identifier\n );\n\n this.getTransformWidget().updateTransform(this.currentTransform);\n this.controller?.updateTransform(\n Matrix4.multiply(\n this.currentTransform,\n Matrix4.invert(this.startingTransform)\n )\n );\n }\n }\n\n private handleSettingDisabledAxis(): void {\n if (this.widget) {\n this.widget.updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n });\n } else {\n console.warn('Cannot set disabled values - no widget defined');\n }\n }\n\n private setupTransformWidget = (\n canvasRef: HTMLCanvasElement\n ): TransformWidget => {\n console.debug(\n `Initializing transform widget. [initial-position=${JSON.stringify(\n this.position\n )}, has-initial-frame=${this.viewer?.frame != null}]`\n );\n\n this.widget = new TransformWidget(canvasRef, {\n xArrow: this.xArrowColor,\n yArrow: this.yArrowColor,\n zArrow: this.zArrowColor,\n hovered: this.hoveredColor,\n });\n\n if (this.rotation != null) {\n this.currentTransform = this.getTransformForNewRotation(this.rotation);\n this.startingTransform = this.currentTransform;\n this.widget.updateTransform(this.currentTransform);\n }\n\n if (this.position != null) {\n this.currentTransform = this.getTransformForNewPosition(this.position);\n this.startingTransform = this.currentTransform;\n this.widget.updateTransform(this.currentTransform);\n }\n if (this.viewer?.frame != null) {\n this.widget.updateFrame(this.viewer.frame, true);\n }\n\n this.handleSettingDisabledAxis();\n\n this.hoveredChangeDisposable = this.widget.onHoveredChanged(\n this.handleHoveredDrawableChanged\n );\n\n return this.widget;\n };\n\n private updateCanvasBounds = (canvasElement: HTMLCanvasElement): void => {\n readDOM(() => {\n this.canvasBounds = canvasElement.getBoundingClientRect();\n\n this.getTransformWidget().updateDimensions(canvasElement);\n });\n };\n\n private get currentRotation(): Matrix4.Matrix4 {\n if (this.currentTransform != null) {\n return Matrix4.makeRotation(\n Quaternion.fromMatrixRotation(this.currentTransform)\n );\n }\n return Matrix4.makeIdentity();\n }\n\n private updateInputValue = (): void => {\n const dragging = this.dragging ?? this.lastDragged;\n if (\n dragging != null &&\n this.currentTransform != null &&\n this.dragStartTransform != null\n ) {\n this.lastInputValue = this.inputValue;\n\n this.inputValue = computeInputDisplayValue(\n dragging.identifier,\n this.currentTransform,\n this.dragStartTransform,\n this.distanceUnit,\n this.angleUnit\n );\n }\n };\n\n private transformCurrent = (transform: Matrix4.Matrix4): void => {\n this.currentTransform =\n this.currentTransform != null\n ? Matrix4.multiply(this.currentTransform, transform)\n : transform;\n };\n\n private updateInputPosition = (): void => {\n const widget = this.getTransformWidget();\n const widgetBounds = widget.getFullBounds();\n const dragging = this.dragging ?? this.lastDragged;\n if (\n this.viewer?.frame != null &&\n this.position != null &&\n dragging != null &&\n widgetBounds != null\n ) {\n this.inputPosition = computeInputPosition(\n this.viewer.viewport,\n widgetBounds,\n dragging.points.toArray()\n );\n }\n };\n\n private getDisplayedAngle = (): number | undefined => {\n const draggingIdentifier =\n this.dragging?.identifier ?? this.lastDragged?.identifier;\n if (draggingIdentifier?.includes('rotate')) {\n return this.inputValue;\n }\n };\n\n private getDisplayedDistance = (): number | undefined => {\n const draggingIdentifier =\n this.dragging?.identifier ?? this.lastDragged?.identifier;\n if (draggingIdentifier?.includes('translate')) {\n return this.inputValue;\n }\n };\n\n private getTransformForNewPosition = (\n newPosition?: Vector3.Vector3\n ): Matrix4.Matrix4 | undefined => {\n if (newPosition != null) {\n const c =\n this.currentTransform != null\n ? this.currentTransform\n : Matrix4.makeIdentity();\n\n const currentRotation = Matrix4.makeRotation(\n Quaternion.fromMatrixRotation(c)\n );\n const position = Matrix4.makeTranslation(newPosition);\n\n return Matrix4.multiply(position, currentRotation);\n }\n };\n\n private getTransformForNewRotation = (\n newRotationEuler: Euler.Euler\n ): Matrix4.Matrix4 | undefined => {\n const c =\n this.currentTransform != null\n ? this.currentTransform\n : Matrix4.makeIdentity();\n\n const oldRotation = Matrix4.invert(\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(c))\n );\n\n const newRotation = Matrix4.makeRotation(\n Quaternion.fromEuler(newRotationEuler)\n );\n const oldTranslation = Matrix4.multiply(c, oldRotation);\n\n return Matrix4.multiply(oldTranslation, newRotation);\n };\n\n private getCanvasBounds = (): DOMRect | undefined => {\n if (this.canvasBounds != null) {\n return this.canvasBounds;\n } else if (this.canvasRef != null) {\n this.updateCanvasBounds(this.canvasRef);\n return this.canvasBounds;\n }\n };\n\n private getTransformWidget = (): TransformWidget => {\n if (this.widget == null && this.canvasRef != null) {\n return this.setupTransformWidget(this.canvasRef);\n } else if (this.widget != null) {\n return this.widget;\n } else {\n throw new Error(\n 'Transform widget was not initialized. The canvas element may not have been initialized.'\n );\n }\n };\n}\n"]}
@@ -137,24 +137,24 @@ function computeInputPosition(viewport, bounds, shapePoints) {
137
137
  : closest, topLeft);
138
138
  switch (closestPoint) {
139
139
  case topLeft:
140
- return { point: closestPoint, position: 'top-left' };
140
+ return { point: closestPoint, placement: 'top-left' };
141
141
  case topRight:
142
- return { point: closestPoint, position: 'top-right' };
142
+ return { point: closestPoint, placement: 'top-right' };
143
143
  case bottomLeft:
144
- return { point: closestPoint, position: 'bottom-left' };
144
+ return { point: closestPoint, placement: 'bottom-left' };
145
145
  default:
146
- return { point: closestPoint, position: 'bottom-right' };
146
+ return { point: closestPoint, placement: 'bottom-right' };
147
147
  }
148
148
  }
149
149
 
150
150
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
151
151
  const TransformWidgetInput = ({ ref, bounds, viewport, point, placement, distance, angle, decimalPlaces, distanceUnit, angleUnit, onChange, onIncrement, onDecrement, }) => {
152
+ var _a;
152
153
  const angles = new AngleUnits(angleUnit);
153
154
  const units = new DistanceUnits(distanceUnit);
154
- const displayValue = distance != null
155
- ? `${distance.toFixed(decimalPlaces)} ${units.unit.abbreviatedName}`
156
- : `${angle === null || angle === void 0 ? void 0 : angle.toFixed(decimalPlaces)} ${angles.unit.abbreviatedName}`;
157
- const inputPlacement = computeInputPlacement(viewport, bounds !== null && bounds !== void 0 ? bounds : dimensions.create(100, 30), point, placement);
155
+ const definedValue = (_a = distance !== null && distance !== void 0 ? distance : angle) !== null && _a !== void 0 ? _a : 0;
156
+ const displayValue = `${parseFloat(definedValue.toFixed(decimalPlaces))} ${distance != null ? units.unit.abbreviatedName : angles.unit.abbreviatedName}`;
157
+ const inputPlacement = computeInputPlacement(viewport, bounds !== null && bounds !== void 0 ? bounds : dimensions.create(0, 0), point, placement);
158
158
  const handleChange = (event) => {
159
159
  if (event.target != null) {
160
160
  const parsed = parseFloat(event.target.value);
@@ -620,12 +620,10 @@ const ViewerTransformWidget = /*@__PURE__*/ proxyCustomElement(class extends HTM
620
620
  }
621
621
  };
622
622
  this.handleInputResize = () => {
623
- console.log(this.inputRef);
624
623
  if (this.inputRef != null) {
625
624
  const inputElement = this.inputRef;
626
625
  readDOM(() => {
627
626
  this.inputBounds = inputElement.getBoundingClientRect();
628
- console.log(this.inputBounds);
629
627
  });
630
628
  }
631
629
  };
@@ -767,7 +765,6 @@ const ViewerTransformWidget = /*@__PURE__*/ proxyCustomElement(class extends HTM
767
765
  this.handleInputIncrement = () => {
768
766
  if (this.inputValue != null && this.lastInputValue != null) {
769
767
  this.inputValue = this.lastInputValue + 1;
770
- console.log(this.inputValue);
771
768
  this.handleInputChange(this.inputValue);
772
769
  }
773
770
  };
@@ -1026,7 +1023,7 @@ const ViewerTransformWidget = /*@__PURE__*/ proxyCustomElement(class extends HTM
1026
1023
  (_b = this.inputResizeObserver) === null || _b === void 0 ? void 0 : _b.unobserve(this.inputRef);
1027
1024
  }
1028
1025
  this.inputRef = el;
1029
- }, bounds: this.inputBounds, viewport: this.viewer.viewport, point: this.inputPosition.point, placement: this.inputPosition.position, angle: this.getDisplayedAngle(), distance: this.getDisplayedDistance(), decimalPlaces: this.decimalPlaces, distanceUnit: this.distanceUnit, angleUnit: this.angleUnit, onChange: this.handleInputChange, onIncrement: this.handleInputIncrement, onDecrement: this.handleInputDecrement }))));
1026
+ }, bounds: this.inputBounds, viewport: this.viewer.viewport, point: this.inputPosition.point, placement: this.inputPosition.placement, angle: this.getDisplayedAngle(), distance: this.getDisplayedDistance(), decimalPlaces: this.decimalPlaces, distanceUnit: this.distanceUnit, angleUnit: this.angleUnit, onChange: this.handleInputChange, onIncrement: this.handleInputIncrement, onDecrement: this.handleInputDecrement }))));
1030
1027
  }
1031
1028
  transform(previous, next, angle) {
1032
1029
  var _a, _b;