오토캐드(AUTO CAD) 문자 합치기 리습(lisp)

1. 문자 합치기 리습(lisp)

오토캐드에서 사용할 수 있는 문자 합치기 리습(lisp)을 작성하겠습니다. 오늘 다루는 내용은 AutoCAD 도면에서 문자(TEXT)와 여러 줄 문자(MTEXT)를 선택하고, 선택된 문자를 모두 결합하여 하나의 문자열로 작성하는 리습입니다. 작성된 리습을 설명하고 작동하는 원리를 간단히 설명하겠습니다.

1) 문자 합치기 리습 동작

문자 합치기 리습을 작성하기 위해 가장 먼저 동작을 세분화하고 필요한 함수와 조건을 구상하는 단계입니다. 동작을 구분 지어 구상하는 단계는 리습을 작성하는 데 필요한 과정으로 작성된 리습에서 발생하는 오류를 파악하기도 쉬워집니다. 오늘 작성하는 리습은 다음 단계로 구성됩니다.

① 문자열 누적 변수 설정 → ②객체 선택 → ③ 문자(TEXT)와 여러 줄 문자(MTEXT)만 선택 → ④ 조건 반복 → ⑤합쳐진 문자 위치 지정 → ⑥ 실행(Command 구문)


2) 리습 작성 및 구문 해석

문자 합치기 리습의 구문 해석입니다. 수정하여 사용하려면 구문 해석을 확인하시고, 바쁘신 분들은 맨 아래 전체 구문을 확인하시기 바랍니다.


(defun c:addtxt(/ x a ent txt x1 p1 txtsize )
리습을 실행하기 위한 명령어는 “addtxt”로 설정합니다. 명령어는 필요에 따라 수정하시면 됩니다.


(Setq x "MDTXT")

“MDTXT”라는 문자를 변수 “x”로 지정합니다. 합치기 위한 문자열에 누적 데이터로 사용하기 위한 임시 변수입니다.


(prompt "\n mtxt or dtxt 선택..")

문자(TEXT)와 여러 줄 문자(MTEXT)를 선택하기 위한 메시지를 띄웁니다.

(setq ent(ssget "_:S+." '((0 . "TEXT,MTEXT"))))
ssget을 이용하여 단일 객체를 선택하는 필터를 사용합니다. 선택하는 객체 유형은 TEXT, MTEXT만 선택합니다. 만약 다른 유형이 선택되면 nill이 반환됩니다. 객체가 선택되면 변수 “ent”로 지정합니다.


(if ent (progn (while ( /= ent nill)
ent 변수가 지정되면 progn 함수로 묶인 수식을 실행합니다. while 함수를 사용하여 객체가 선택되면(nill이 아니면) 실행문을 반복합니다.

(setq a (entget(ssname ent 0)))
ent 객체 0번에 있는 객체 이름을 호출하고, entget 함수를 이용하여 객체 속성을 변수 “a”로 지정합니다.

(Setq txt(cdr(assoc 1 a)))
“a” 변수에서 문자 내용이 담긴 dxf 코드 1번을 검색하여 txt 변수로 지정합니다.


(Setq x (strcat x txt))
위에서 지정한 변수 “x”와 선택한 문자 내용이 담기 “txt” 변수를 하나의 문자열로 결합합니다. 이 구문을 통해서 선택된 문자를 순서대로 누적합니다.
만약 합쳐진 문자 사이에 공백을 추가하려면 (Setq x (strcat x ” ” txt)) 구문으로 바꿔서 사용하세요.


(prompt "\n mtxt or dtxt 선택..")
(setq ent(ssget "_:S+." '((0 . "TEXT,MTEXT")))))
While 함수 반복을 위해 객체 선택을 반복합니다. 여기까지 while 함수로 반복되는 구문입니다.


(SETQ X1(vl-string-subst "" "MDTXT" x))
여기서부터 합칠 문자 선택을 마치고 실행하는 구간입니다. vl-string-subst 함수로 누적된 문자 데이터에서 “MDTXT” 문자를 제거합니다. 위에서 설명했던 누적을 위해 사용된 변수 “x”의 내용(“MDTXT”)을 제거하여 선택된 데이터만 추출합니다.
추가로 vl-string-subst 함수는 (Vl-string-subst new old string [문자열 위치]) 형태로 사용하며, 특정 문자열(string)에서 선택 문자(old)를 새로운 문자(new)로 변경하는 함수입니다. 대괄호는 생략할 수 있습니다.

(setq p1 (getpoint "\n텍스트 위치 지정!!!"))
getpoint 함수로 합쳐진 문자열을 표시할 위치를 “p1″변수로 지정합니다.


(SETQ txtsize (GETVAR "dimscale"))
getvar 함수로 도면에서 지정된 dimscale을 이용하여 합쳐진 문자의 크기를 “txtsize” 변수로 지정합니다.


(COMMAND "text" p1 txtsize "0" X1)(princ))))
command 문을 실행하여 선택한 문자열을 text 명령을 이용하여 작성합니다.


3) 전체 리습

(defun c:addtxt(/ x a ent txt x1 p1 txtsize )
(Setq x "MDTXT")
(prompt "\n mtxt or dtxt 선택..")
(setq ent(ssget "_:S+." '((0 . "TEXT,MTEXT"))))
	(if ent 
		(progn 
			(while ( /= ent nill)
				(setq a (entget(ssname ent 0)))
				(Setq txt(cdr(assoc 1 a)))
				(Setq x (strcat x txt))
				(prompt "\n mtxt or dtxt 선택..")
				(setq ent(ssget "_:S+." '((0 . "TEXT,MTEXT"))))
			)
		(SETQ X1(vl-string-subst "" "MDTXT" x))
		(setq p1 (getpoint "\n텍스트 위치 지정!!!"))
		(SETQ txtsize (GETVAR "dimscale"))
		(COMMAND "text" p1 txtsize "0" X1)
		(princ)
		)
	)
)




4) 리습 실행

위에서 작성된 리습을 실행한 결과입니다. 선택한 문자를 누적하여 하나의 문자열로 반환합니다. 문자 선택을 마치면 마우스 오른쪽을 클릭하거나, Enter키를 눌러주세요. 이 리습은 선택한 문자열이 삭제되지 않고 그대로 남아 있습니다. 조금 수정하면 선택한 문자열 삭제도 가능합니다. 선택된 객체 삭제 방법은 추후에 다른 리습 작성하면서 다시 다루도록 하겠습니다.

Leave a Comment