종단을 그릴려고하는데요.
문자에 있는 레벨값을 y값으로 인식해서 제가 설정한 시작점에서 각 레벨값을
포인트 및 문자로 보이게하는 리습이 있는데, 이상하게 되는 게 있고 안되는 게 있어서 어려움이 있어요;;
뭐가 문제인지 봐주실 수 있나요?
아니면 다른 방법이 있을까요?
아래는 리습 내용이예요.
(defun c:dell () ;
(setq ss (ssget ‘((0 . “TEXT”)))) ; 텍스트 객체만 선택
(setq pt-list ‘()) ; 점들을 저장할 리스트 초기화
;; 수직선만 선택 (X값이 일정한 선들만 선택)
(setq line-ss (ssget ‘((0 . “LINE”)))) ; 선 객체만 선택
(if (and ss line-ss) ; 텍스트 객체와 선 객체가 모두 선택된 경우
(progn
;; 기준점 설정 (시작점 X, Y, Z)
(setq start-point (getpoint “nSpecify the start point for the first level (pick point): “))
;; 시작점에서 X, Y 좌표를 추출
(setq start-x (car start-point)) ; 시작점의 X값
(setq start-y (cadr start-point)) ; 시작점의 Y값
;; 텍스트 크기 설정 (사용자 입력)
(setq text-size (getreal “nEnter the text size: “)) ; 텍스트 크기를 사용자에게 입력받기
;; 선택된 모든 텍스트 객체 순차적으로 처리
(setq n (sslength ss)) ; 선택한 텍스트 개수
(setq i 0) ; 인덱스를 0으로 초기화
(setq x-values ‘()) ; 수직선의 X값을 저장할 리스트 초기화
;; 수직선들의 X값을 저장
(setq line-i 0)
(while (< line-i (sslength line-ss)) ; 선 객체들에 대해 반복
(setq line (ssname line-ss line-i)) ; 선 객체 가져오기
(setq pt1 (cdr (assoc 10 (entget line)))) ; 선의 시작점
(setq pt2 (cdr (assoc 11 (entget line)))) ; 선의 끝점
;; X값이 동일하면 수직선으로 간주하고, X값만 리스트에 추가
(if (= (car pt1) (car pt2)) ; X값이 같으면 수직선으로 판단
(setq x-values (append x-values (list (car pt1)))) ; X값을 추가
)
(setq line-i (1+ line-i)) ; 선 인덱스를 증가
)
;; X값을 오름차순으로 정렬
(setq x-values (vl-sort x-values ‘<))
;; 선택된 텍스트 객체 순차적으로 처리하기 위해 객체의 순서를 반대로 변경
(setq text-objects ‘()) ; 텍스트 객체 리스트 초기화
(setq j (- n 1)) ; 역순으로 시작
;; 텍스트 객체를 리스트에 저장 (선택된 객체의 순서가 역순인 경우 반대로 배열)
(while (>= j 0) ; n개만큼 반복 (역순으로)
(setq ent (ssname ss j)) ; 선택된 텍스트 객체 가져오기
(setq text-objects (append text-objects (list ent))) ; 텍스트 객체 리스트에 추가
(setq j (1- j)) ; 인덱스를 1 감소시켜서 이전 텍스트 객체로 이동
)
;; 텍스트 객체들을 순차적으로 처리
(setq x-value (car x-values)) ; 첫 번째 수직선의 X값을 기준으로 시작
(foreach ent text-objects ; 텍스트 객체 순차 처리
(setq level (cdr (assoc 1 (entget ent)))) ; 텍스트 객체에서 레벨값 추출
(setq level (atof level)) ; 레벨값을 실수로 변환하여 Y값으로 사용
;; Y값은 시작점의 Y값을 기준으로, 레벨값에 따라 계산
(setq y-value (+ start-y level)) ; 시작점 Y값을 기준으로 레벨을 더하거나 빼서 Y값 계산
;; 각 포인트의 X값은 수직선의 X값, Y값은 계산된 레벨값
(setq pt (list x-value y-value 0)) ; X값 = 수직선의 X값, Y값 = 계산된 레벨값, Z값 = 0
(setq pt-list (append pt-list (list pt))) ; 점 리스트에 추가
;; 텍스트 삽입: 텍스트 크기, 내용은 레벨값, X값, Y값
;; 텍스트는 레벨값 포인트 아래로 삽입: Y – 텍스트 크기
(command “TEXT” (list x-value (- y-value text-size) 0) text-size 0 (rtos level 2 2) “”)
;; X값 업데이트
(setq x-values (cdr x-values)) ; X값 리스트에서 첫 번째 값 제거
(setq x-value (car x-values)) ; 다음 X값을 가져옴
)
;; 포인트 그리기
(setq i 0)
(while (< i (length pt-list))
(setq pt (nth i pt-list)) ; 점 리스트에서 포인트 가져오기
(command “POINT” pt) ; 포인트 삽입
(setq i (1+ i)) ; 인덱스를 1 증가시켜서 다음 점으로 이동
)
(princ “nLevel values added as text and points drawn.”) ; 메시지 출력
)
(princ “nNo text objects or vertical lines selected.”) ; 텍스트 객체나 수직선 객체가 선택되지 않은 경우
)
(princ) ; LISP 함수 종료
)