|
옵션값을 줘서 중첩수량으로 표기 / 전체 동적블럭 나열 두 명령으로 나눴습니다.
광역변수 대신 각각 명령에 지역변수로 넣어서 변수를 조절하도록 바꿔두었습니다.
DIN1 : 중첩수량 표기
DIN2 : 전체 블럭 나열
;; 선택 세트 정렬
;; 선택 순서 우선 / 상->하 정렬 / Y값이 5.0이하로 차이날 땐 X값 정렬
(defun #SortBlockSS->ObjList (ss / n buffer ss_lst SortSS )
(setq n (cadddr (car (ssnamex ss))))
(foreach x (ssnamex ss)
(if (equal n (cadddr x))
(setq buffer (append buffer (list (cadr x))))
(setq ss_lst (append ss_lst (list (list n buffer))) n (cadddr x) buffer (list (cadr x)))
)
)
(foreach x (vl-remove-if '(lambda (x) (listp (car (cadr x)))) (append ss_lst (list (list n buffer))))
(if (= (length (cadr x)) 1)
(setq SortSS (cons (vlax-ename->vla-object (caadr x)) SortSS))
(mapcar (function (lambda (en) (setq SortSS (cons (vlax-ename->vla-object en) SortSS))))
(vl-sort (cadr x)
(function
(lambda (e1 e2 / d1 d2)
(mapcar 'set '(d1 d2) (mapcar '- (cdr (assoc 10 (entget e2))) (cdr (assoc 10 (entget e1)))))
(if (> -5.0 d2 5.0) (> d1 0) (minusp d2))
)
)
)
)
)
)
(reverse SortSS)
)
;; 동적 블록 속성 추출 / 중복값 확인
;; 오브젝트 리스트에서 사용자 매개변수를 추출, 중복값 체크하여 수량 체크
;; 중복값 체크 옵션 추가 ($Mod 변수)
;; $Mod = T: 중복값 체크 / nil: 중복값 체크 안함
(defun #DynBlock_PropList2 (obj_lst $Mod / prop_lst prop_lst2 i)
(foreach ob obj_lst
(foreach pob (vlax-safearray->list (vlax-variant-value (vla-GetDynamicBlockProperties ob)))
(and
(= (vla-get-UnitsType pob) 2)
(setq prop_lst (cons (list (vlax-get pob 'Value) (vla-get-PropertyName pob)) prop_lst))
)
)
)
(setq i 0)
(while (> (length prop_lst) i)
(setq lst (nth i prop_lst) i (1+ i))
(or
(and (not $Mod) (setq prop_lst2 (cons (reverse (cons 1 lst)) prop_lst2)))
(setq prop_lst
(cons
(reverse
(cons
(- (length prop_lst) (length (setq prop_lst (vl-remove lst prop_lst))))
lst
)
)
prop_lst
)
)
)
) (if $Mod prop_lst prop_lst2)
)
;; 매개변수 곱셈기
;; $Mod = T: 수량 출력 / nil: 수량 제외
(defun #DynProp_Multiplier2 (prop_org $Mod / prop_val)
(setq prop_val (list (car prop_org) (rtos (cadr prop_org) 2 1) (if $Mod (rtos (last prop_org) 2 0))))
(foreach x $DynProps_Multiple_Index
(and (wcmatch (car prop_org) (car x))
(setq prop_val
(list
(car prop_org)
(rtos (* (cadr prop_org) (cdr x)) 2 1)
(if $Mod (rtos (caddr prop_org) 2 0))
)
)
)
) (vl-remove 'nil prop_val)
)
;; 동적블럭 매개변수 테이블 작성
;; 지정된 포인트에 매개변수 테이블을 작성
;; 중복값 작성 옵션 추가 ($Mod 변수)
;; $Mod = T: 중복값 작성 / nil: 중복값 작성 안함
(defun #DynProp_TableMaker2 (prop_lst pt $Mod / $LineMaker $MTextMaker tbl_w tbl_h la col i n m pt_lst new_ss)
(if
(and
(= (type #DynProp_TableLayer) 'STR)
(tblsearch "LAYER" #DynProp_TableLayer)
)
(setq la #DynProp_TableLayer)
(setq la "0")
)
(if
(and
(= (type #DynProp_TableColor) 'INT)
(<= 0 #DynProp_TableColor 256)
)
(setq col #DynProp_TableColor)
(setq col 256)
)
(setq m (if $Mod 3 2))
(mapcar 'set '(tbl_w tbl_h) #DynProp_TableSize)
(setq tbl_w (/ tbl_w m))
(setq $LineMaker
(lambda (ia na ib nb)
(ssadd
(entmakex
(list
'(0 . "LINE") (cons 8 la) (cons 62 col)
(cons 10 (mapcar '+ pt (list (* na tbl_w) (* ia tbl_h) 0.0)))
(cons 11 (mapcar '+ pt (list (* nb tbl_w) (* ib tbl_h) 0.0)))
)
) new_ss
)
)
)
(setq $MTextMaker
(lambda (dat i n sz)
(ssadd
(entmakex
(list
'(0 . "MTEXT") '(100 . "AcDbEntity") (cons 8 la) (cons 62 col) '(100 . "AcDbMText")
(cons 10 (mapcar '+ pt (list (* tbl_w n) (* tbl_h i) 0.0))) (cons 40 sz) '(41 . 0.0)
'(46 . 0.0) '(71 . 5) '(72 . 5) (cons 1 dat) (cons 7 (getvar 'textstyle))
'(210 0.0 0.0 1.0) '(11 1.0 0.0 0.0) '(50 . 0.0) '(73 . 1) (cons 44 (getvar 'tspacefac))
)
)
new_ss
)
)
)
(setq new_ss (ssadd) i 0 n 0)
(repeat (+ (length prop_lst) 2) ($LineMaker i n i m) (setq i (1+ i)))
(setq i (+ i (/ 2.0 9.0)))
($LineMaker i n i m)
($LineMaker 0 n i n)
($LineMaker 0 m i m)
(setq i (1+ (length prop_lst)) n 0)
(repeat (1- m) (setq n (1+ n)) ($LineMaker 0 n i n))
(setq i (+ (length prop_lst) 1.5) n (* m 0.5))
($MTextMaker (if $Mod "동적블럭 수량" "동적블럭 테이블") (+ i (/ 1.0 9.0)) n (/ tbl_h 1.5))
(setq i (1- i) n 0.5)
(foreach dat (if $Mod '("매개변수" "거리 값" "수량") '("매개변수" "거리 값"))
($MTextMaker dat i n (* tbl_h 0.5))
(setq n (1+ n))
)
(foreach lst prop_lst
(setq n 0.5 i (1- i))
(foreach dat (#DynProp_Multiplier2 lst $Mod)
($MTextMaker dat i n (* tbl_h 0.5))
(setq n (1+ n))
)
) new_ss
)
;; 메인 함수
;; $Mod: 중복값 체크 / 체크해제 옵션
(defun $DynPropsMain ($Mod / *error* acDoc acBlk dyn_lst ss prop_lst new_ss)
(vl-load-com)
(defun *error* (msg)
(vla-endundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(or (wcmatch (strcase msg) "*취소*,*CANCEL*,*QUIT*,*EXIT*") (prompt (strcat "\nError: " msg "\n")))
(princ)
)
(setq acDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq acBlk (vla-get-Blocks acDoc))
(vla-startundomark acDoc)
(vlax-for obj acBlk
(and
(= :vlax-true (vla-get-IsDynamicBlock obj))
(setq dyn_lst (cons (vla-get-Name obj) dyn_lst))
)
)
(or dyn_lst (prompt "\n도면 내에 동적 블럭이 없습니다.") (quit))
(setq ss
(ssget
(list
(cons 2
(strcat
(substr (apply 'strcat (mapcar (function (lambda (str) (strcat "," str))) dyn_lst)) 2)
",`*U#,`*U#*#"
)
)
)
)
)
(or ss (prompt "\n블럭이 선택되지 않았습니다.") (quit))
(or
(setq prop_lst (#DynBlock_PropList2 (#SortBlockSS->ObjList ss) $Mod))
(prompt "\n동적 블럭에서 추출 가능한 사용자 속성이 없습니다.")
(quit)
)
(initget 1)
(setq pt (getpoint "\n테이블을 작성할 점 지정: "))
(and (zerop (getvar "worlducs")) (setq pt (trans pt 1 0)))
(setq new_ss (#DynProp_TableMaker2 prop_lst pt $Mod))
(prompt (strcat "\n" (rtos (length prop_lst) 2 0) "개의 매개변수에 대한 테이블 작성이 완료되었습니다."))
(vla-endundomark acDoc)
(princ)
)
;; 명령 연결 함수 1
;; 중복된 매개변수 값을 중첩하여 수량 표기
(defun c:DIN1 (/ $DynProps_Multiple_Index #DynProp_TableLayer #DynProp_TableColor #DynProp_TableSize)
(prompt "DYNINDEX\n중복된 매개변수 값을 중첩하여 작성할 동적 블럭 선택...")
(setq $DynProps_Multiple_Index (list (cons "거리*" 1.1) (cons "rad*" pi))) ; 특정 매개변수 값에서 곱할 값을 입력
(setq #DynProp_TableLayer "1Mview") ; 테이블 작성 시 레이어 명
(setq #DynProp_TableColor 6) ; 테이블 작성 시 색상 값
(setq #DynProp_TableSize '(69.0 7.2)) ; 테이블 폭, 높이
($DynPropsMain T)
)
;; 명령 연결 함수 2
;; 모든 매개변수 값을 나열하여 표기
(defun c:DIN2 (/ $DynProps_Multiple_Index #DynProp_TableLayer #DynProp_TableColor #DynProp_TableSize)
(prompt "DYNINDEX\n모든 매개변수 값을 추출할 동적 블럭 선택...")
(setq $DynProps_Multiple_Index (list (cons "거리*" 1.1) (cons "rad*" pi))) ; 특정 매개변수 값에서 곱할 값을 입력
(setq #DynProp_TableLayer "1Mview") ; 테이블 작성 시 레이어 명
(setq #DynProp_TableColor 6) ; 테이블 작성 시 색상 값
(setq #DynProp_TableSize '(69.0 7.2)) ; 테이블 폭, 높이
($DynPropsMain nil)
)
|
첫댓글 감사합니다!
아.. 한번 여쭤볼때 해결해야하는데.. 또 사용하다보니.. 궁금증이생기네요 ㅠㅠㅠㅠ
현재 소숫점 첫째자리까지만 표현되는데.. mm 단위를 m단위로 표현되게 하려고 리습 계산식에 1000을 나눠줬더니 거리값이 0으로 산출되네요 ㅠㅠ
거리값을 소숫점 둘째짜리까지 표현하게하면 표시될거같긴한데.. 가능할까요? ㅠㅠㅠㅠ
소수점 자릿수 변경은 간단한 내용이라서 함수에 대한 설명만 드릴께요
숫자를 출력할 때 소수점 둘째자리까지 표시하려면 rtos 함수쪽을 변경하면 됩니다.
rtos 함수는 숫자를 문자로 변환하는 함수이며 세 가지 인자를 사용합니다.
rtos 함수 형식: (rtos <숫자> [모드] [정밀도])
rtos 함수 도움말: https://help.autodesk.com/view/ACD/2020/KOR/?guid=GUID-D03ABBC2-939A-44DB-8C93-FC63B64DE4A2
첫 번째 인자는 변환할 숫자이며, 두 번째 인자는 반환 값에 대한 형식 모드를 나타냅니다.
세 번째 인자가 정밀도이며 여기에 소수점 자릿수를 넣으면 됩니다.
예를 들어 (rtos num 2 2)와 같이 작성하면 됩니다.
만약 도면 내 시스템 변수와 동일한 정밀도를 사용하고 싶다면 (rtos num 2)와 같이 작성하면 됩니다.
이 리습에서는 #DynProp_Multiplier2 함수에서 rtos 함수를 사용하고 있으니 이쪽만 변경해주면 적용 될거에요
@예성 이렇게까지 알려주셔서 진짜 감사해요!
이번기회에 리습에대해 좀더 알게됐습니다!
@예성 저... 예성님.... 진짜진짜진짜 죄송하지만 하나만 더 부탁드려봅니다......
우선 진짜 죄송합니다..
부탁드릴지말지 몇날몇일 고민하다가 글써봐요..
매개변수 중에 원하는 이름만 산출하도록 가능할까요...??
튜브길이 (거리1, 거리2, 거리3, rad1) 은 산출이 되고 그외 다른이름의 매개변수들이 있더라도 그것들은 산출안되게끔 수정 가능할까요..?