성심 성의껏 질문을 작성하여 주세요, 대충하시면 답변도 대충작성합니다.^^
① CAD 종류 : 오토캐드
② VERSION : 2010
③ 운영 체제 :윈7
기존에 사각형 배열하던거를 원형을 배열해보려고 손좀 봣는데
짝수 줄수 올라가면서 수량이1개씩 빠지는것까진 성공햇는데
최종수량이 3번째줄에서부터 오류가 나는데
머리가 잘 안돌아가서ㅠㅠ 수식을 못잡겟네요ㅠ 이렇게 저렇게 만져봐도 ㅠㅠ
수식 전체를 뜯어고쳐야 하는건가요?;
ccr 단순 배열 네스팅(원형 지그재그 ver1).lsp
⑤ 파일첨부 (LISP/DWG) - DWG 첨부시 보다 정확한 답변을 얻을수 있습니다.
(defun c:ccr(/ *error* _ij_getpt _ij_NewSS dtr os ss ob ssvaL obvaL cn sspoint sssPoint sssspoint wide hight obpoint
oobpoint ooobpoint wide1 wide11 hight1 hight11 war war1 war2 wartxt wide2 har har1 har2 hartxt hight2
ss1 1wide 1hight 1war 1war1 1war2 1wartxt 1wide2 1har 1har1 1har2 1hartxt 1hight2 1ea 1eatxt eL
eatxt txt gp1 gp2 gp3 gp4 o wn wwn dd angg gpgp3 ea har3);; 변수는 지역변수로 잡아 주는게 좋습니다
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(princ)
(vl-load-com) ;; vla 를 사용하기 위해서는 로드를 시켜야합니다.
(defun dtr (a) (* pi (/ a 180.0)))
(defun *error* (msg)
(princ "\nerror:")(princ msg)
(setvar "osmode" os)
)
(defun _ij_NewSS ( elast / newss enxt) ; elast 무언가 발생하기전 마지막 객체정보
(setq enxt elast
newss (ssadd))
(while (/= (setq enxt (entnext enxt)) nil) ;elast 후에 생성된 정보가 없을때 까지 반복
(ssadd enxt newss)
)
newss
)
(defun _ij_getpt(ss / k VtxList obj Minpt MaxPt XList YList n)
(setq k 0 VtxList '())
(repeat (sslength ss)
(setq Obj (vlax-ename->vla-object (ssname ss k))) ;; 자 선택객체를 vla 객체로 만들어줍니다.
(vla-GetBoundingBox Obj 'MinPt 'MaxPt) ;; getboundingbox 박스로 대각포인를 가져옵니다.
(setq MinPt (vlax-safearray->list MinPt))
(setq MaxPt (vlax-safearray->list MaxPt)) ;; 자 여기까지 이 3줄은 암기!!
(setq VtxList (append VtxList (list MinPt MaxPt))) ;; 각각의 객체의 대각포인트들을 리스트로 묶어줍니다.
(setq k (1+ k))
) ;; VtxList 에는 많은 좌표가 들어있을겁니다.
(setq n 0 XList '() YList '())
(repeat (length VtxList)
(setq XList (append XList (list (car (nth n VtxList))))) ;; X좌표끼리 묶어주고.
(setq YList (append YList (list (cadr (nth n VtxList))))) ;; Y좌표낄 묶어주고..
(setq n (1+ n))
)
(list (list (apply 'min XList) (apply 'min YList) 0.0)
(list (apply 'min XList) (apply 'max YList) 0.0)
(list (apply 'max XList) (apply 'min YList) 0.0)
)
) ;_ij_getpt_end.
;;;------------------------------------------------------------------------------
(setq cn 0)
(setq ss (ssget(prompt "\n배열할 객체를 선택하세요."))) ;; 배열할 객체 SS
(initget "15 30");단축키 필수옵션
(setq dd (getkword "\n 객체 간격 치수[15/30]:<15>"))
(cond ( (= dd "15") (setq dd 15) )
( (= dd "30") (setq dd 30) )
( (= dd nil) (setq dd 15) ));cond
(setq ssvaL(_ij_getpt ss))
(setq sspoint (car ssvaL) ; 복사할 객체 좌하단 좌표 sspoint
sssPoint (cadr ssvaL);; 복사할 객체 좌상단 좌표 ssspoint
sssspoint (last ssvaL);; 복사할 객체 우하단 좌표 sssspoint
)
;; (setq eL(entlast)) ;객체회전하기전 마지막 객체
;; (command "rotate" ss "" ssspoint "c" "90")
;; (setq ss1 (_ij_NewSS eL)) ;회전전 마지막객체정보로 그 이후 객체 값 얻어오는 함수
;; ;(setq ss1 (ssget(prompt "\n회전된 객체를 선택하세요.")))
;;(setq ss1vaL(_ij_getpt ss1))
;; (setq ss1point (car ss1vaL) ; 복사할 객체 좌하단 좌표 ss1point
;; sss1Point (cadr ss1vaL);; 복사할 객체 좌상단 좌표 sss1point
;; ssss1point (last ss1vaL);; 복사할 객체 우하단 좌표 ssss1point
;; )
(setq wide (distance sspoint sssspoint)) ; 가로사이즈
(setq hight (distance sspoint ssspoint)) ; 세로사이즈
(setq gp3 (polar sspoint (* pi 0.33333333333333333333333333333333) (+ wide dd)))
(setq gpgp3 (list (car gp3) (cadr sspoint) 0.0))
(setq gpgp3 (distance gp3 gpgp3));60도 높이구하는공식 모름 ㅠ
;;(setq 1wide hight) ; 회전된 가로사이즈
;;(setq 1hight wide) ; 회전된 세로사이즈
;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
(setq ob (ssget (prompt "\n원판 자재를 선택하세요."))) ;; 배열될 자재 선택 ob
(setq obvaL(_ij_getpt ob))
(setq obpoint (car obvaL) ; 원판 좌하단 좌표 obpoint
oobpoint (cadr obvaL) ;; 원판 좌상단 좌표 oobpoint
ooobpoint (last obvaL) ;; 원판 우하단 좌표 ooobspoint
)
(setq wide1 (distance obpoint ooobpoint)) ; 원판 가로사이즈
(setq wide11 (- wide1 60 )) ; 가로사이즈 여백
(setq hight1 (distance obpoint oobpoint)) ; 원판 세로사이즈
(setq hight11 (- hight1 60 )) ; 세로사이즈 여백
;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
(setq war (/ wide11 (+ dd wide))) ; 원판에서 객체 가로 수량 나누기
(setq war1 (substr (rtos war 2 1) 1 )) ; 소수점 가져오면서 문자로 변경
(setq war2 (atoi war1)) ; 소수점 버리고 정수
(setq wartxt (itoa war2)) ; 가로 갯수 문자
(setq wide2 (+ wide dd)) ; 가로 객체 간격
;;(setq 1war (/ wide11 (+ dd hight))) ; 원판에서 회전된 객체 가로 수량 나누기
;;(setq 1war1 (substr (rtos 1war 2 1) 1 )) ; 소수점 가져오면서 문자로 변경
;;(setq 1war2 (atoi 1war1)) ; 소수점 버리고 정수
;;(setq 1wartxt (itoa 1war2)) ; 회전된 가로 갯수 문자
;;(setq 1wide2 (+ hight dd)) ; 회전된 가로 객체 간격
(setq har (/ hight11 gpgp3)) ; 원판에서 객체 세로 수량 나누기
(setq har1 (substr (rtos har 2 1) 1 )) ; 소수점 가져오면서 문자로 변경
(setq har2 (atoi har1)) ; 소수점 버리고 정수
(setq har3 (/ har2 2))
(setq hartxt (itoa har2)) ; 세로 갯수 문자
(setq hight2 (+ hight dd)) ; 세로 객체 간격
;;(setq 1har (/ hight11 (+ dd wide))) ; 원판에서 회전된 객체 세로 수량 나누기
;;(setq 1har1 (substr (rtos 1har 2 1) 1 )) ; 소수점 가져오면서 문자로 변경
;;(setq 1har2 (atoi 1har1)) ; 소수점 버리고 정수
;;(setq 1hartxt (itoa 1har2)) ; 회전된 세로 갯수 문자
;;(setq 1hight2 (+ wide dd)) ; 회전된 세로 객체 간격
(setq ea (- (* war2 har2) har3)) ; 가로 세로 토탈 갯수
(setq eatxt (itoa ea)) ; 가로 세로 토탈 갯수 문자
;;(setq 1ea (* 1war2 1har2 )) ; 회전된 가로 세로 토탈 갯수
;;(setq 1eatxt (itoa 1ea)) ; 회전된 가로 세로 토탈 갯수 문자
;; (if (< ea 1ea) ; 회전해서 갯수가 더 많이 나오면 실행
;; (progn
;; (command "erase" ss "" "") ; 기존 원본 객체 삭제
;; (setq ss ss1) 회전한걸 ss로 대치
;; (setq ssvaL(_ij_getpt ss)) ;; 좌표 다시 구하기
;; (setq sspoint (car ssvaL) ; 복사할 객체 좌하단 좌표 sspoint
;; sssPoint (cadr ssvaL);; 복사할 객체 좌상단 좌표 ssspoint
;; sssspoint (last ssvaL);; 복사할 객체 우하단 좌표 sssspoint
;; wide2 1wide2
;; hight2 1hight2
;; war2 1war2)
;; (setq txt (strcat "\n회전 했습니다 !! " "\n\n가로 " 1wartxt "개 /" " 세로 " 1hartxt "개" "\n총 " 1eatxt "개 배열 할수있습니다." "\n\n 복사하실 갯수를 입력하세요:"))
;; );progn
;; (progn
;; (command "erase" ss1 "" "")
(setq txt (strcat "\n선택하신 자재에서" "\n가로 " wartxt "개 /" " 세로 " hartxt "개" "\n총 " eatxt "개 배열 할수있습니다." "\n\n 복사하실 갯수를 입력하세요:"))
;; );progn
;; );if
(setq cn nil) ;갯수 입력 안했을때
(while (= cn nil) ; 입력 값 있을때까지 반복
(setq cn (getint txt)) ;; 복사할 갯수 물어보기 cn
);while
;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
;; 배열할 객체 SS
; 복사할 객체 좌하단 좌표 sspoint
;; 복사할 갯수 물어보기 cn
;; 배열될 자재 선택 ob
; 배열될 자재 좌하단 좌표 obpoint
(setq gp1 sspoint) ; 선택 객체 좌하단 클릭
(setq gp2 obpoint) ; 판재 좌하단 클릭
(setq gp3(polar gp2 (* pi 0.25) (sqrt(+ (expt 30 2) (expt 30 2))))); pi=180 / 180*0.25 = 45도 / 45도의 42.426 = 30*30 거리가 gp3
;(setq gp4(polar gp3 (* pi 0.5) hight2))
(setq gp4(polar gp3 (* pi 0.33333333333333333333333333333333) wide2) angg 60)
(setq o 0) ; move 이동 좌표값 리스트 적용할 0 / 영문o
(if (<= cn war2) ; 입력한 갯수가 가로배열 갯수보다 작거나 같을때
(progn ; if 참이면
(repeat cn ; 입력한 횟수만큼 반복
(command "copy" ss "" gp1 gp3 ) ; 복사
(setq gp3(polar gp3 0.0 wide2))
);repeat
);progn
;ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ if 거짓이면
(progn ; if 개로 배열할 갯수보다 입력한 갯수가 많을때 위로 복사값 추가
(setq wn(/ cn war2)) ; 세로로 몇줄인지 계산하기
(setq wwn (- cn (* war2 wn))) ; 세로 몇줄 하고 나머지 수량
(setq cn (- (+ cn har3) 1))
(command "copy" ss "" gp1 gp3 ) ; 복사
(setq gp3(polar gp3 0.0 wide2)) ; 객체 가로 + 간격15 값 리스트 적용
(setq cn (- cn 1))
(repeat wn ;세로 줄수만큼 실행
(repeat (- war2 1)
(command "copy" ss "" gp1 gp3 ) ; 복사
(setq gp3(polar gp3 0.0 wide2)) ; 객체 가로 + 간격15 값 리스트 적용
(setq cn (- cn 1))
);repeat
(if (>= cn 1) ;나머지가 0이 아닐때만 실행
(progn
(command "copy" ss "" gp1 gp4); 위로 복사
(setq gp3(polar gp4 0.0 wide2))
;(setq gp4(polar gp4 (* pi 0.5) hight2));pi=180 / 180*0.5 = 90도
(cond ((= angg 120) (setq gp4(polar gp4 (* pi 0.33333333333333333333333333333333) wide2) angg 60 war2 (+ war2 1) cn (+ cn 1)))
((= angg 60) (setq gp4(polar gp4 (* pi 0.66666666666666666666666666666667) wide2) angg 120 war2 (- war2 1) cn (+ cn 1))) )
);progn
);if
);repeat
(if (>= wwn 1) ;나머지가 0이 아닐때만 실행
(progn
(repeat (- wwn 1) ; 나머지 수량 실행
(command "copy" ss "" gp1 gp3 ) ; 복사
(setq gp3(polar gp3 0.0 wide2)) ; 객체 가로 + 간격15 값 리스트 적용
);repeat
);progn
);if
);progn
);if
(setvar "osmode" os)(princ)
);defun
※ 유의사항
- ①말머리 : 말머리를 달아야 구분이 쉽겠죠^^(필수 선택)
- ②Screenshot : 이해를 돕기위해 삽입요망.
- ③파일 첨부 : 상위버전에서 테스트할 파일이 아니면 가급적 하위버전으로 저장후 첨부.
해당리습/해당파일(DWG) 도 같이 첨부하여 주세요.
- ④제 목 : 질문 내용 반영(개략적인 내용), 예) 해치를 만들고 싶어요, pline을 연결할려면?
금지어(만들어주세요? 해주세요? 안되는데 이렇게 변경해주세요? 등등)
- ⑤질문글 삭제금지 : 질문후 댓글이 달린글은 삭제금지.
여러 리플러들이 소중한 시간을 내어서 고민한후 댓글을 작성한 이상 "강력조치" 토록 하겠음.
※ 정답만이 댓글은 아닙니다. 그 답이 맞던 틀리던 그건 그 댓글로서 존중되어야 합니다.
회원님들이 글을 읽었다는것과 댓글을 달았다는건 그만큼 관심을 가지고 있고 또 그 답을 해주기 위해
검색도 해보고 도움말도 보고 고민도 하는 일련의 과정을 거치면서 나오기 때문이죠.
이에 대한 고마움과 감사함을 모르는 테러행위(?)는 없었으면 합니다.
첫댓글 안녕하세요
1.첫줄 6개 원을 그린다
2. 첫줄을 모두선택하여 두번째 줄로 카피.(각 줄 좌측 원 중심점을 기준으로)
3. 첫줄과 두번째줄을 선택하여 필요한 높이까지 카피
4. 테두리 정점을 이용하여 SSGET하여 겹치는 원 선택하여 ERASE함.
상기 방식으로 작업하면 어떨까요?
수고하세요
화이팅입니다.
우선 답변감사합니다^^
애초에 저도 심플하게 그럴려고햇지만ㅋ 첫번째줄을 정확하게 선택하고 필요없는수량을 지울 능력이안되서ㅠㅋ노가다식으로 하나씩쌓아올리는 방법으로 가게되엇어요ㅠㅋㅋ 그러다보니 수식으로 더 복잡해져버렷네요ㅠㅋㅋㅋ