안녕하세요. 항상 고캐드를 통해 많이 배우고 있습니다.
ob1의 문자값을 ob2에 복사하는 리습입니다.
현재는 텍스트 선택순으로 리습이 실행되는데
텍스트를 선택할때 X축이나 Y축 순으로 선택하고 싶습니다.
(defun C:tc(/ ob1 ob2 n i F1 F2 C )
(setq ob1 (ssget ‘((0 . “text”))))
(setq ob2 (ssget ‘((0 . “text”))))
(setq n (sslength ob1) i 0)
(repeat n
(setq F1 ( cdr (assoc 1 (entget (ssname ob1 i)))))
(setq F2 ( cdr (assoc 1 (entget (ssname ob2 i)))))
(setq C (ssname ob2 i))
(entmod (subst (cons 1 F1)(assoc 1 (entget C)) (entget C)))
(setq i (1+ i))
);re
)
선배님들 도움 부탁 드립니다.
https://blog.naver.com/khs12kim/223285732695
답변감사합니다!!! 딱 제가 원하는 기능이었습니다!!!!
혹시 vl-sort 함수와 lambda 함수 사용하는 방법좀 알려주실 수 있으실까요?
온라인 도움말에 잘 나와있어요 그런데 구지 설명하자면
vl-sort 함수는 자체적으로 정렬기준이 있는 데이터를 정렬할 수 있는 기능이 있는 함수입니다 가령 리스트가 단순 숫자 리스트라면 (setq Lst ‘ (1 3 6 2 9 10)) 이럴때
(vl-sort Lst ‘<)이러면 작은수 부터 큰수로
(vl-sort Lst ‘>) 이렇게 하면 반대로 큰수부터 작은수로 정렬 단순 구성이면 다른것도 다 정렬됩니다
그런데 리스트 원소 구성이 조금 복잡하게 구성 돼있다면 람다함수를 이용하여 조건을 부여 할 수 있습니다
예를 들면 제가 사용했던 리스트는 (setq Lst ‘((문자부착점 엔티티이름)(문자부착점 엔티티이름))순으로 돼있습니다
그러므로 무명함수로 조건을 주는 겁니다 리스트 원소들 끼리 비교를 해서 정렬을 하되 조건은( 원소 첫번째 중에 두번쩨 요소 끼리 비교)입니다
ex>
(setq Lst ‘(((x1 zy1 z1) entname1)) ((x2 zy2 z2) entname2)) …등등)) 리스트가 이런식으로 돼있습니다
(vl-sort L ‘(lambda (a b)(<(cadar a)(cadar b)))) 이렇게 조건을 주면 리스트 각 요소중에 첫번째 (문자부착점) 그중에 y좌표를 비교해서 낮은거 부터 높은걸로 정렬 합니다
(cadar a)<= 이걸 길게 쓰면 (cadr(car a)) 입니다 문자수를 줄여서 표현한거죠
촘합 함수 해석
(vl-sort Lst ‘<) 소트를 해라 Lst라는 리스트를 작은거 부터 큰걸로
(vl-sort L '(lambda (a b)(<(cadar a)(cadar b)))) 소트를 해라 L이라는 리스트를 뒤에 있는 조건으로.. 조건은
리스트 원소 첫번째 요소 두번째 값으로 작은거 부터 큰걸로