- COPY: 기준점 [변위(D)/모드(O)/다중(M)] · 두 번째 점 [배열(A)] → [배열(A)/종료(E)/명령 취소(U)] <종료> 되풀이 · 첫 빈 Enter = 변위 · COPYMODE 기억 · A 항목 수 · F 맞춤 - MIRROR: 대칭선 두 점 → 원본 객체를 지우시겠습니까? [예(Y)/아니오(N)] <아니오> · Esc = 안 만듦 - STRETCH: MOVE 틀 + 걸침 창 안 꼭짓점만(선 · 폴리선 토막 · 사각형) · 창 안 통째 · 하나씩 고른 것 = 이동 · STRETCH.DISP - ARRAY: 유형 [직사각형(R)/원형(PO)] <직사각형>(ARRAYTYPE) → 편집 물음 되풀이(COU · S · COL · R · X / I · A · F · ROT · X) · 미리보기 4 × 3 · 6 개 360° · 처음 간격 범위 1.5 배 · Esc = 안 만듦(N17 없어짐) - PEDIT: 공용 고르기 상태(객체 선택 · 빈 Enter · Esc = 끝 · 묶은 뒤 끝) - 시험 transform-acad 29 + ALL · L · P 1(선택 도구 처리 뒤 돎) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TteK8mfYZetk5P3bEZkyVZ
49 lines
1.8 KiB
TypeScript
49 lines
1.8 KiB
TypeScript
/**
|
|
* PEDIT — 고른 선 · 호를 폴리선 하나로 묶음. 고르기 물음 = 오토캐드 「객체 선택:」(337 라 · 설계 2-14 ④) ·
|
|
* 고른 것 있으면 바로 · 빈 고르기 Enter · Esc = 끝 · 묶은 뒤 끝(쉬는 상태).
|
|
*/
|
|
import { toast } from 'react-toastify';
|
|
import { createMachine } from 'xstate';
|
|
import { PolyLineEntity } from '../entities/PolyLineEntity.ts';
|
|
import {
|
|
getActiveLayerId,
|
|
getNotSelectedEntities,
|
|
getSelectedEntities,
|
|
setEntities,
|
|
} from '../state';
|
|
import { Tool } from '../tools';
|
|
import { END_STATE, type StateEvent, type ToolContext } from './tool.types';
|
|
import { endState, selectionState, startState } from './transform.helpers';
|
|
|
|
export interface PeditContext extends ToolContext {}
|
|
|
|
export enum PeditState {
|
|
INIT = 'INIT',
|
|
WAITING_FOR_SELECTION = 'WAITING_FOR_SELECTION',
|
|
CONVERT_SELECTION_TO_POLYLINE = 'CONVERT_SELECTION_TO_POLYLINE',
|
|
}
|
|
|
|
const convert = () => {
|
|
const newPolyLine = new PolyLineEntity(getActiveLayerId(), getSelectedEntities());
|
|
setEntities([...getNotSelectedEntities(), newPolyLine], true);
|
|
toast.success(`Created polyline with ${newPolyLine.numberOfSegments()} segments`);
|
|
};
|
|
|
|
// biome-ignore lint/suspicious/noExplicitAny: 공용 상태 조각(여러 도구 공통)을 섞어 만든다
|
|
const states: Record<string, any> = {
|
|
[PeditState.INIT]: startState(PeditState.CONVERT_SELECTION_TO_POLYLINE),
|
|
[PeditState.WAITING_FOR_SELECTION]: selectionState(PeditState.CONVERT_SELECTION_TO_POLYLINE),
|
|
[PeditState.CONVERT_SELECTION_TO_POLYLINE]: {
|
|
always: { actions: convert, target: END_STATE },
|
|
},
|
|
[END_STATE]: endState,
|
|
};
|
|
|
|
/** 고른 객체를 폴리선 하나로 */
|
|
export const peditToolStateMachine = createMachine({
|
|
types: {} as { context: PeditContext & { originals: unknown[] }; events: StateEvent },
|
|
context: { originals: [], type: Tool.PEDIT },
|
|
initial: PeditState.INIT,
|
|
states,
|
|
});
|