프로그램
캐드 분류

닫힌 폴리선이나 원, 사각형 등이 내부에 있는지를 아는것이 필요합니다.

컨텐츠 정보

본문

제가 예전에 최우측, 최좌측, 최상단, 최하단 포인트를 가져오는 리습으로
여러개의 폴리선(닫힘) 이나 원, 사각형등의 객체를 선택하여

가장 외곽에 있는것을 알아내는것과
그외의 나머지 것은 전부 내각객체라고 분리하는 리습을 만드려고 했습니다.
(그리고 응용하여 다른 소스를 작성하려 했습니다.)


근데 문제점이 원같은게 들어갈경우 최우측 최상단 같은걸 뽑아내는게 문제가 생기더라구요.


저번에 상큼님이 올려주신
최외곽 치수를 뽑는 리습이 있는데요.
그건 정말 잘뽑혔습니다.
원이 있어도 불구하고 최외곽 포인트 2점을 뽑아내시더라구요.
그 부분을 알고싶은데 비밀이니…..흑..



결론은 제가 생각하고 있는건 아래와 같습니다.

전제조건: 단면적을 가지고 있는 여러 객체가 있습니다.
(원, 사각형, 닫힌 폴리라인 등    직선이나 ARC 같은건 제외)

1. 해당 형상들을 전부 선택하고
2. 객체들을 순회하면서 최외곽 포인트를 잡습니다.
(최상단 최우측, 최하단 최좌측 같읕 느낌으로)

3. 해당 포인트로 사각형 영역을 계산하여
다음 형상의 포인트와 비교하여 내부에 있는지 외부에 있는지를 확인하고
가장 바깥에 있는 객체를 저장해둡니다.

4. area 명령어로
(command "area" "a" "e" 가장외곽객체" "" "s" "e" 나머지내각객체를순차적으로선택)
을 하려고 하는데

4번에서 나머지 객체 선택도 애로사항이 있겠네요..
이부분도 리습으로 커버해야 할것 같은데 제 생각에는
선택한 객체중 가장 내각에 있는 객체를 제외한 나머지 영역크기의
정보를 가져와 빼면 되는것이니 굳이 area로 쓸필요는 없겠네요…..

결과적으로 얻고싶은 정보는
영역 = 최외곽영역 – (나머지 내부 영역 + …..)

둘레 = 최외곽객체에 대한둘레
ex. command "area" "a" "o" 최외곽객체 ""  하고 (getvar "perimeter") 라든가
vla-object 로 이용하여 가져오는 방법도 있을것 같습니다.

고수님들의 자문을 구하고 싶어 이렇게 글을 올리게 되었습니다.
긴글을 읽어주셔서 감사합니다.

관련자료

댓글 7

xcsh님의 댓글

저는 그림을 봐야만 이해가 잘가는 편이라 거들 수나 있을지 모르겠습니다.

제생각에는 분류를  포함  교차  분리의 세가지로 구분할 필요와 vla-getboundingbox와  ssget의 wp와 cp를 활용할 여지가  없을까라는 생각이드네요.

그리고 상큼메론90님 만큼 꾸준히 다른 분께 신경써주시는 분이 간단한 소스의 내용을 비밀로 하시지는 않을것 같은데요. 제가 보기에는 피시님이 바로 알 수 있는 간단한 것이라서 말씀을 안하셧을 것입니다. 아마 피시님이 사탕하나 만드셔서 우는 조카딸한테 나눠주길 바라실지도…

뭐하남님의 댓글

최외각에 있다는 것은 area가 가장 크다는 것입니다. 소트하여 area가 가장 큰 객체부터 시작하여 그 안에 든 객체들을 제거 하면 속도도 빠르겠죠.

피시님의 댓글

………일단 임시적으로 막장소스 타이핑..

(defun c:aaaa ()  (if (setq ss (ssget (list (cons 0 "LWPOLYLINE,CIRCLE"))))   (progn    (setq doc (vla-get-activedocument (vlax-get-acad-object)))    (vla-startundomark doc)    (setq index 0)    (setq getnum 0)    (setq getara 0)    (repeat (sslength ss)     (setq e (ssname ss index))     (setq obj (vlax-ename->vla-object e))     (setq ara (vlax-get obj 'Area))     (if (< getara ara)      (progn       (setq getara ara)       (setq getnum index)      )     )     (setq index (1+ index))    )    (setq index 0)    (setq addara 0)    (repeat (sslength ss)     (setq e (ssname ss index))     (setq obj (vlax-ename->vla-object e))     (setq ara (vlax-get obj 'Area))     (if (/= index getnum)      (setq addara (+ addara ara))     )     (setq index (1+ index))    )    (setq e (ssname ss getnum))    (setq obj (vlax-ename->vla-object e))    (setq len (vlax-get obj 'Length))    (setq ara (- getara addara))    (princ "n")    (princ (rtos ara))    (princ "n")    (princ (rtos len))    (princ "n")    (vla-endundomark doc)   )  ) )

피시님의 댓글

아니면 hatch 로 선택해서 해치영역을 가지고 영역과 둘레값을 구하는게 낳을까요? (속도면에서 좀 느린거같은느낌이)

피시님의 댓글

vlax-get obj 'Area vlax-get obj 'Length

찾았다…….. 으윽 자문자답…돋네요 orz

피시님의 댓글

아?! 제가 바보였네요.

선택한객체들의 영역값중 제일 큰거 – 작은것들….을 하면 되는건데………….

질문을 바꾸겠습니다. 혹시 (setq e (ssname ss index)) ; index 는 증가     (setq obj (vlax-ename->vla-object e)) 형태로 객체들을 선택해서 순회하여

obj나 e 값을 이용하여 객체의 영역과 둘레 값을 얻어오는 명령어를 알수 있을까요? 나머지는 제가 어떻게든 해보겠습니다.

여분필드1 여분필드2 여분필드3
전체 88 / 4 페이지
번호
제목
이름
알림 0