(nentsel) 로 일반객체와 블럭구별하기.
entsel 과 nentsel 의 차이는 복합객체를 선택할때의 응답값에 따라 구별할수 있습니다.
일반 객체는 2가지값을 리턴하지만 복합객체는 4개의 요소를 리턴하게 됩니다.
(setq ent (nentsel "\n객체선택:"))
(setq en (car ent) p1 (cadr ent) BlockJudg (nth 2 ent))
en 는 EntityName (첫번째요소)
p1 는 객체를 선택할때 pickBox 로 선택한 점 (두번째요소)
BlockJudg 는 3번째요소가 됩니다.(nth 2 ent) nth 는 0부터 시작하니...
즉....BlockJudg(3번째요소) 가 nil 이면 일반 객체 BlockJudg 값이 있다면 복합객체가 됩니다.
이번엔 아까 해당 라인블럭을 똑같은 위치에 생성이 되게 만들어 보겠습니다.
아래와 같은 라인으로 된 블럭이 있습니다.
구별을 할수 있게 다른 레이어로 라인을 선택해서 그려보겠습니다.
CHAPTER#1 에 있는 리습을 사용
자 CHAPTER#1 에서 알아본데로 들어갔습니다.
그럼 move 를 합니다. 원점에서 삽입점으로... CHAPTER#1 에서 알아본봐~~ mcs 의 원점=삽입점과 같다.
자 동일한 위치에 놓인걸 볼수가 있습니다. 이걸 리습화 해보겠습니다.
빨간색부분이 CHAPTER#1 에 있는 리습에서 바뀐부분입니다.
(defun c:test1()
(vl-load-com)
(setq AcDoc (vla-get-activedocument (vlax-get-acad-object)))
(cond
((= (vla-get-activespace AcDoc) 1) (setq oSpace (vla-get-modelspace AcDoc)))
((= (vla-get-activespace AcDoc) 0) (setq oSpace (vla-get-paperspace AcDoc)))
)
(setq ent (nentsel "\n라인 선택:"))
;; car 이 빠졌습니다. 이유는 블럭의 삽입점을 가져오기 위해서입니다.
(setq en (car ent) p1 (cadr ent) BlockJudg (nth 2 ent))
;; en(객체이름) 을 가져오고 BlockJudg 블럭삽입점이 있는곳을 가져옵니다.
(setq Obj (vlax-ename->vla-Object en))
(setq stp (vla-get-Startpoint Obj))
(setq enp (vla-get-Endpoint Obj))
(setq oline (vla-addline oSpace stp enp))
(setq Binsertp (nth 3 BlockJudg))
;; 해당 요소는 총 4개의 요소로 이뤄져있고 마지막요소가 삽입점이라고 말씀드렸져.
(vla-move oline (vlax-3d-point (list 0.0 0.0 0.0)) (vlax-3d-point Binsertp))
;; 라인을 그린후 이동합니다. 원점에서 삽입점으로...
(princ)
)
이번엔 회전된 블럭을 가지고 위에 리습으로 해보겠습니다.
자 위에 리습으로 돌려보겠습니다.
헛.... 제대로 안생기는군여......
WHY????
mcs 좌표계를 볼때는 2가지를 고려해야합니다.
1. 블럭의 삽입점
2. 블럭의 회전값
(mirror 도 생각은 해야됩니다...)
위 블럭은 102도 회전된 블럭입니다.
그럼 새로 그려진 라인을 삽입점을 기준으로 해서 102도 회전시켜보겠습니다.
자 그럼 회전값도 한번 추가해서 리습을 만들어보겠습니다.
(defun c:test1()
(vl-load-com)
(setq AcDoc (vla-get-activedocument (vlax-get-acad-object)))
(cond
((= (vla-get-activespace AcDoc) 1) (setq oSpace (vla-get-modelspace AcDoc)))
((= (vla-get-activespace AcDoc) 0) (setq oSpace (vla-get-paperspace AcDoc)))
)
(setq ent (nentsel "\n라인 선택:"))
(setq en (car ent) p1 (cadr ent) BlockJudg (nth 2 ent))
(setq Obj (vlax-ename->vla-Object en))
(setq stp (vla-get-Startpoint Obj))
(setq enp (vla-get-Endpoint Obj))
(setq oline (vla-addline oSpace stp enp))
(setq Binsertp (nth 3 BlockJudg))
(setq oBlockAng (vla-get-Rotation (vlax-ename->vla-Object (car (last ent)))))
;; nentsel 블럭의 이름들입니다. 선택한 객체의 바로윗단계의 블럭이 먼저 표시됩니다.
;; 즉...블럭안에 여러개의 블럭이 중복되어있을때 가장안쪽 객체를 선택했다면.
;; 가장 마지막에 있는 블럭이 젤 밖의 블럭이 되겠져.
;; 그러나 삽입점은 바로윗블럭이 중요합니다. 여기서는여....다음엔 블럭을 다 보긴봐야합니다.
(vla-move oline (vlax-3d-point (list 0.0 0.0 0.0)) (vlax-3d-point Binsertp))
(vla-rotate oline (vlax-3d-point Binsertp) oBlockAng)
(princ)
)
위의 리습처럼 하면 회전된 블럭에 대해서는 동일위치에 라인을 그릴수 있게 되네여.^^
라인을 그릴수 있다면 원/폴리라인등등.. 다 가능합니다. 개념만 알고있다면.
여기서 한가지 더 봐야될것은 각각의 블럭이 밀러가 됐는지 안됐는지 여부입니다.
XScaleFactor 값이 -1 이면 밀러가 된것입니다. 이것은 따로 해봐야될거같습니다.^^
첫댓글 만약 블럭안에 블럭이 있다면... 블럭안에 또 블럭이 있다면... 해당블럭들의 회전값을 다 가져와야합니다. (nentsel) 맨 마지막요소에서 추출할수있습니다. 해당 회전값들을 차례대로 삽입점에서 돌려주면 블럭안에 블럭...... 이라도 제자리를 알수 있습니다.
해당 참고리습은 지금 수정중엔 sua 간편스냅 걸리 나주엥 올리면 참고하시기 바랍니다.
음.....하루님 수고하셨습니다...우와 이걸 어케 정리하셨데요...흐미흐미...보기만해도 머리가 아프네요~~
참고로 제가 예전에 올려드렸던 mcs->wcs 좌표계변환Function이 있습니다.
mcs->wcs 로 함 검색해보세요. ^^*
아... 그거 본거 같은데 사용법을 잘모르겟어여.^^;;
eval 막 들어가는 그거 잔아여??
재귀함수가 생각나네요^^* ㅎㅎ 하얀제비님하구요^^* ㅎㅎ
어렵더라구여... 블럭안에 블럭.............. 있을때.. 상위블럭들의 삽입점에 mcs 좌표가 모두 영향을 받더라구여...헐...ㅎㅎ
고마워요^^
고맙습니다...ㅎ