http://inventor.gocad.co.kr/2892286
글에서 상큼님에게 얻은 리습을 잘 애용중입니다.
그런데 수정이 불가피하다보니
텍스트나 치수선까지 선택하면 그곳까지 외곽으로 판단해서 치수를 가져오는 애로사항이 있더군요..ㅠ
이것을 얻기 전까지 사용하던건 아래와 같습니다.
(defun c:SDD( / se en ent pt maxx minx maxy miny minxp maxxp minyp maxyp)
(if (setq sel (entsel “n폴리선 선택:”))
(progn
(setq en (car sel) ent (entget en))
(foreach e ent
(if (= (car e) 10)
(progn
(setq pt (trans (cdr e) 0 1) x (car pt) y (cadr pt))
(if (or (null minx) (< x minx))
(setq minx x minxp pt)
)
(if (or (null miny) (< y miny))
(setq miny y minyp pt)
)
(if (or (null maxx) (> x maxx))
(setq maxx x maxxp pt)
)
(if (or (null maxy) (> y maxy))
(setq maxy y maxyp pt)
)
)
)
)
(
(lambda (vs)
;최하단 : minyp, 최상단 : maxyp, 제일 좌측 : minxp, 제일 우측 maxxp
(foreach p (list minxp maxxp minyp maxyp)
(setq p (trans p 1 0))
(grvecs
‘(6 (1 -1) (-1 1) (-1 -1) (1 1))
(list
(list vs 0.0 0.0 (car p))
(list 0.0 vs 0.0 (cadr p))
(list 0.0 0.0 vs 0.0)
(list 0.0 0.0 1.0 0.0)
)
)
)
)
(* (/ (getvar “VIEWSIZE”) (cadr (getvar “SCREENSIZE”))) 10)
)
)
)
(setq pt1 (polar minxp (angtof “180”) 12))
(setq pt2 (polar maxyp (angtof “90”) 12))
(command “dim” “ver” maxyp minyp pt1 “” “hor” minxp maxxp pt2 “” “exit”)
(princ)
)
단점은 반원같은게 들어갈경우
최외곽에 있는 ‘점’ 을 가져오니… 원의 외곽을 무시하게 되더라구요…..
상큼님 소스를 수정할수 있다면
아래문의한 것 + 제외필터를 걸어보려했었는데 말이죠..ㅠ
공유
완성!!!
도움주신분들 감사드립니다…
팁이되는 의견들 정말감사드립니다.
일단 위쪽의 x 값들과 y값들을 서로 교환하는 이유는
max 값 포인트와 min 값 포인트가 서로
대각선 방향에 있는 사각형을 이루게 되는데
제가 얻고자하는 사각형의 포인트가
상단쪽의 최우측, 최좌측
하단쪽의 최좌측
을 얻으려고 교환방법도 같이 물어본것이었습니다. ㅎ
xcsh 님이 알려주신방법으로 순회해서 상단최우측, 하단최좌측을 뽑고
뭐하남님이 알려주신방법으로 3포인트를 만들어내고
치수를 꺼내면 될것 같네요.
두분모두 감사드립니다.!
그림으로 보는게 아니라 대화의 핀트가 조금 어긋나긴 하지만 의견을 교환하니 재미있습니다.
제가 말한 부분은 치수선을 뽑기위한 부분을 말한것이 아닙니다.
vla-getboundingbox 에서 min_p와 max_p가 나오므로
치수선을 뽑는 부분에서는 교환만 하면 되므로 굳이 max min을 쓸필요가 없고
선택한 모든 대상의 전체 all_min_p 와 all_ max_p를 구할 때를 말한 것입니다.
예를 들어 3개를 선택해서 대상이 각각 1번부터 3번이라고 하면
min_p1 max_p1, min_p2 max_p2 , min_p3 max_p3 를 구하게 됩니다.
이경우 3개의 대상이 차지하는 사각영역의 모서리는
(setq all_min_p (mapcar ‘min min_p1 min_p2 min_p3) )
(setq all_max_p (mapcar ‘max max_p1 max_p2 max_p3) )
가 될테고
반복문에서는 1번 값 min_p max_p 를 all_min_p all_max_p의 초기값으로 한후
(setq all_min_p (mapcar ‘min all_min_p min_p) )
(setq all_max_p (mapcar ‘max all_max_p max_p) )
나머지 값을 적용하는 방식을 언급한 것입니다.
(mapcar ‘apply ‘(max min) (mapcar ‘list p1 p2))
(mapcar ‘apply ‘(min max) (mapcar ‘list p1 p2))
쩝… 이렇게 하는 것보다는
(list (max (car p1) (car p2)) (min (cadr p1) (cadr p2)))
(list (min (car p1) (car p2)) (max (cadr p1) (cadr p2)))
이게 더 심플하죠?
오호라!
혹시 2포인트를 구해서 최대 최소를 mapcar ‘max 와 ‘min을 이용하면 서로 교환이 되는데
(setq p3 (mapcar ‘min p1 p2))
(setq p4 (mapcar ‘max p1 p2))
2포인트를 아래와 같이
x 축은 max . y축은 min로
혹은 그 반대로 x축은 min, y축을 max 형태로 교환하는것도
mapcar를 이용하는건가요?
ex.)
p1= 10,100
p2 = 20, 200
를
p1= 20,100
p2 =10, 200
맞습니다. 구글링으로 손쉽게 검색 됩니다.
대상의 범위를 사각형태로 좌측하단과 우측상단을 구해주는 코드입니다.
구하고나서 예전에 질문하신 2 포인트 x, y값 교환 방법을 적용하면 여러 대상 일 때도
범위를 쉽게 구할수 있습니다.
vla-getboundingbox 라…. 뒤쪽 3개중 2개의 변수가…얻어올 것을 지정하는건가요….?
10번 비교하시지 말고 vla-getboundingbox를 사용하세요.