Skip to content

Commit b7e6b0d

Browse files
committed
fix(widgets): fix paintWidget example and small bugs
BREAKING CHANGE: SplineWidget's handles now scale up automatically.
1 parent 54b5823 commit b7e6b0d

File tree

4 files changed

+68
-62
lines changed

4 files changed

+68
-62
lines changed

Sources/Widgets/Widgets3D/PaintWidget/example/index.js

Lines changed: 61 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,6 @@ reader
298298
image.imageMapper.onModified(update);
299299
// trigger initial update
300300
update();
301-
302-
// readyAll();
303301
});
304302

305303
// register readyAll to resize event
@@ -370,14 +368,11 @@ function initializeHandle(handle) {
370368
handle.onStartInteractionEvent(() => {
371369
painter.startStroke();
372370
});
373-
374371
handle.onEndInteractionEvent(() => {
375372
painter.endStroke();
376373
});
377374
}
378375

379-
initializeHandle(scene.paintHandle);
380-
381376
scene.paintHandle.onStartInteractionEvent(() => {
382377
painter.startStroke();
383378
painter.addPoint(widgets.paintWidget.getWidgetState().getTrueOrigin());
@@ -386,82 +381,91 @@ scene.paintHandle.onStartInteractionEvent(() => {
386381
scene.paintHandle.onInteractionEvent(() => {
387382
painter.addPoint(widgets.paintWidget.getWidgetState().getTrueOrigin());
388383
});
384+
initializeHandle(scene.paintHandle);
389385

390-
initializeHandle(scene.rectangleHandle);
391-
392-
scene.rectangleHandle.onInteractionEvent(() => {
393-
const rectangleHandle = scene.rectangleHandle
394-
.getWidgetState()
395-
.getRectangleHandle();
386+
scene.rectangleHandle.onEndInteractionEvent((pointPlaced) => {
387+
if (pointPlaced) {
388+
const rectangleHandle = scene.rectangleHandle
389+
.getWidgetState()
390+
.getRectangleHandle();
396391

397-
painter.paintRectangle(
398-
rectangleHandle.getOrigin(),
399-
rectangleHandle.getCorner()
400-
);
392+
painter.paintRectangle(
393+
rectangleHandle.getOrigin(),
394+
rectangleHandle.getCorner()
395+
);
396+
}
401397
});
398+
initializeHandle(scene.rectangleHandle);
402399

403-
initializeHandle(scene.ellipseHandle);
404-
405-
scene.ellipseHandle.onInteractionEvent(() => {
406-
const center = scene.ellipseHandle
407-
.getWidgetState()
408-
.getEllipseHandle()
409-
.getOrigin();
410-
const point2 = scene.ellipseHandle
411-
.getWidgetState()
412-
.getPoint2Handle()
413-
.getOrigin();
414-
415-
const corner = [
416-
center[0] - point2[0],
417-
center[1] - point2[1],
418-
center[2] - point2[2],
419-
];
420-
painter.paintEllipse(center, corner);
400+
scene.ellipseHandle.onEndInteractionEvent((pointPlaced) => {
401+
if (pointPlaced) {
402+
const center = scene.ellipseHandle
403+
.getWidgetState()
404+
.getEllipseHandle()
405+
.getOrigin();
406+
const point2 = scene.ellipseHandle
407+
.getWidgetState()
408+
.getPoint2Handle()
409+
.getOrigin();
410+
411+
let corner = [];
412+
413+
if (
414+
scene.ellipseHandle.isBehaviorActive(
415+
BehaviorCategory.RATIO,
416+
ShapeBehavior[BehaviorCategory.RATIO].FIXED
417+
)
418+
) {
419+
const radius = vec3.distance(center, point2);
420+
corner = [radius, radius, radius];
421+
} else {
422+
corner = [
423+
center[0] - point2[0],
424+
center[1] - point2[1],
425+
center[2] - point2[2],
426+
];
427+
}
428+
429+
painter.paintEllipse(center, corner);
430+
}
421431
});
432+
initializeHandle(scene.ellipseHandle);
422433

423-
initializeHandle(scene.circleHandle);
424-
425-
scene.circleHandle.onInteractionEvent(() => {
426-
const center = scene.circleHandle
427-
.getWidgetState()
428-
.getEllipseHandle()
429-
.getOrigin();
430-
const point2 = scene.circleHandle
431-
.getWidgetState()
432-
.getPoint1Handle()
433-
.getOrigin();
434-
435-
const radius = vec3.distance(center, point2);
434+
scene.circleHandle.onEndInteractionEvent((pointPlaced) => {
435+
if (pointPlaced) {
436+
const center = scene.circleHandle
437+
.getWidgetState()
438+
.getEllipseHandle()
439+
.getOrigin();
440+
const point2 = scene.circleHandle
441+
.getWidgetState()
442+
.getPoint2Handle()
443+
.getOrigin();
436444

437-
const corner = [radius, radius, radius];
438-
painter.paintEllipse(center, corner);
439-
});
445+
const radius = vec3.distance(center, point2);
440446

441-
scene.splineHandle.onStartInteractionEvent(() => {
442-
painter.startStroke();
447+
const corner = [radius, radius, radius];
448+
painter.paintEllipse(center, corner);
449+
}
443450
});
451+
initializeHandle(scene.circleHandle);
444452

445453
scene.splineHandle.onEndInteractionEvent(() => {
446454
const points = scene.splineHandle.getPoints();
447455
painter.paintPolygon(points);
448-
painter.endStroke();
449456

450457
scene.splineHandle.reset();
451458
scene.splineHandle.updateRepresentationForRender();
452459
scene.widgetManager.grabFocus(widgets.splineWidget);
453460
});
454-
455-
scene.polygonHandle.onStartInteractionEvent(() => {
456-
painter.startStroke();
457-
});
461+
initializeHandle(scene.splineHandle);
458462

459463
scene.polygonHandle.onEndInteractionEvent(() => {
460464
const points = scene.polygonHandle.getPoints();
461465
painter.paintPolygon(points);
462-
painter.endStroke();
463466

464467
scene.polygonHandle.reset();
465468
scene.polygonHandle.updateRepresentationForRender();
466469
scene.widgetManager.grabFocus(widgets.polygonWidget);
467470
});
471+
initializeHandle(scene.polygonHandle);

Sources/Widgets/Widgets3D/ShapeWidget/behavior.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ export default function widgetBehavior(publicAPI, model) {
526526
} else {
527527
publicAPI.placePoint2(model.point2Handle.getOrigin());
528528
publicAPI.invokeInteractionEvent();
529-
publicAPI.invokeEndInteractionEvent();
529+
publicAPI.invokeEndInteractionEvent(true);
530530
}
531531

532532
return macro.EVENT_ABORT;
@@ -558,7 +558,7 @@ export default function widgetBehavior(publicAPI, model) {
558558
model.apiSpecificRenderWindow.setCursor('pointer');
559559
model.widgetState.deactivate();
560560
model.interactor.cancelAnimation(publicAPI);
561-
publicAPI.invokeEndInteractionEvent();
561+
publicAPI.invokeEndInteractionEvent(true);
562562

563563
return macro.EVENT_ABORT;
564564
}
@@ -587,7 +587,7 @@ export default function widgetBehavior(publicAPI, model) {
587587

588588
if (distance > maxDistance || publicAPI.isDraggingForced()) {
589589
publicAPI.invokeInteractionEvent();
590-
publicAPI.invokeEndInteractionEvent();
590+
publicAPI.invokeEndInteractionEvent(true);
591591

592592
if (publicAPI.getResetAfterPointPlacement()) {
593593
publicAPI.reset();
@@ -608,7 +608,7 @@ export default function widgetBehavior(publicAPI, model) {
608608
publicAPI.handleKeyDown = ({ key }) => {
609609
if (key === 'Escape') {
610610
if (model.hasFocus) {
611-
publicAPI.invokeEndInteractionEvent();
611+
publicAPI.invokeEndInteractionEvent(false);
612612
publicAPI.reset();
613613
publicAPI.loseFocus();
614614
}

Sources/Widgets/Widgets3D/SplineWidget/behavior.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,6 @@ export default function widgetBehavior(publicAPI, model) {
356356
model.activeState.activate();
357357
model.activeState.setVisible(true);
358358
model.interactor.requestAnimation(publicAPI);
359-
publicAPI.invokeStartInteractionEvent();
360359
updateHandlesSize();
361360
}
362361

Sources/Widgets/Widgets3D/SplineWidget/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ function vtkSplineWidget(publicAPI, model) {
3838
{
3939
builder: vtkSphereHandleRepresentation,
4040
labels: ['handles', 'moveHandle'],
41+
initialValues: {
42+
scaleInPixels: true,
43+
},
4144
},
4245
{
4346
builder: vtkSplineContextRepresentation,

0 commit comments

Comments
 (0)