Files
Aislo/B07_DesignDetail/openwebcad/src/tools/pedit-tool.ts
T
eomsangdonandClaude Opus 5.5 1d5cdff0a5 feat(CAD): 337-5 라 옮기기 무리 2 단계 — COPY · MIRROR · STRETCH · ARRAY · PEDIT 고르기
- 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
2026-10-16 00:25:20 +09:00

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,
});