블록안의 블록 이름바꾸는 리습 질문요
컨텐츠 정보
- 262 조회
- 6 댓글
- 0 추천
- 0 비추천
- 목록
본문
CB명령어를 쳐서 블록안에 블록을 치면 원본블록은 그대로 있고 그위에 겹쳐서 다른블록이 생성되는데 원본블록이 지워지게끔 가능하게 고수님 수정좀 해주세요
(defun c:cb nil (LM:RenameBlockReference t))
(defun c:rb nil (LM:RenameBlockReference nil))
(defun LM:RenameBlockReference ( cpy / *error* abc app dbc dbx def doc dxf new old prp src tmp vrs )
(defun *error* ( msg )
(if (and (= 'vla-object (type dbx)) (not (vlax-object-released-p dbx)))
(vlax-release-object dbx)
)
(if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
(princ (strcat "nError: " msg))
)
(princ)
)
(while
(progn
(setvar 'errno 0)
(setq src (car (entsel (strcat "nSelect block reference to " (if cpy "copy & " "") "rename: "))))
(cond
( (= 7 (getvar 'errno))
(princ "nMissed, try again.")
)
( (= 'ename (type src))
(setq dxf (entget src))
(cond
( (/= "INSERT" (cdr (assoc 0 dxf)))
(princ "nPlease select a block reference.")
)
( (= 4 (logand 4 (cdr (assoc 70 (tblsearch "layer" (cdr (assoc 8 dxf)))))))
(princ "nSelected block is on a locked layer.")
)
)
)
)
)
)
(if (= 'ename (type src))
(progn
(setq app (vlax-get-acad-object)
doc (vla-get-activedocument app)
src (vlax-ename->vla-object src)
old (vlax-get-property src (if (vlax-property-available-p src 'effectivename) 'effectivename 'name))
tmp 0
)
(while (tblsearch "block" (setq def (strcat (vl-string-left-trim "*" old) "_" (itoa (setq tmp (1+ tmp)))))))
(while
(and (/= "" (setq new (getstring t (strcat "nSpecify new block name <" def ">: "))))
(or (not (snvalid new))
(tblsearch "block" new)
)
)
(princ "nBlock name invalid or already exists.")
)
(if (= "" new)
(setq new def)
)
(setq dbx
(vl-catch-all-apply 'vla-getinterfaceobject
(list app
(if (< (setq vrs (atoi (getvar 'acadver))) 16)
"objectdbx.axdbdocument"
(strcat "objectdbx.axdbdocument." (itoa vrs))
)
)
)
)
(if (or (null dbx) (vl-catch-all-error-p dbx))
(princ "nUnable to interface with ObjectDBX.")
(progn
(setq abc (vla-get-blocks doc)
dbc (vla-get-blocks dbx)
)
(vlax-invoke doc 'copyobjects (list (vla-item abc old)) dbc)
(if (wcmatch old "`**")
(vla-put-name (vla-item dbc (1- (vla-get-count dbc))) new)
(vla-put-name (vla-item dbc old) new)
)
(vlax-invoke dbx 'copyobjects (list (vla-item dbc new)) abc)
(vlax-release-object dbx)
(if cpy (setq src (vla-copy src)))
(if
(and
(vlax-property-available-p src 'isdynamicblock)
(= :vlax-true (vla-get-isdynamicblock src))
)
(progn
(setq prp (mapcar 'vla-get-value (vlax-invoke src 'getdynamicblockproperties)))
(vla-put-name src new)
(mapcar
'(lambda ( a b )
(if (/= "ORIGIN" (strcase (vla-get-propertyname a)))
(vla-put-value a b)
)
)
(vlax-invoke src 'getdynamicblockproperties) prp
)
)
(vla-put-name src new)
)
(if (= :vlax-true (vla-get-isxref (setq def (vla-item (vla-get-blocks doc) new))))
(vla-reload def)
)
(if cpy (sssetfirst nil (ssadd (vlax-vla-object->ename src))))
)
)
)
)
(princ)
)
;;———————————————————————-;;
;; End of File ;;
;;———————————————————————-;;
관련자료
rnsdlsajfl님의 댓글
- rnsdlsajfl 이름으로 검색
- 작성일
머하남님 죄송합니다 직원들이 설명을 잘못해서 1번을 클릭하면 1번2번 동일 블록이름이 같기 때문에 3번처럼 뜹니다 여기서 3번에 M12 이름을 RB나CB로 클릭해서 바꾸면 1번2번 블록이름이 같이 따라 옵니다 즉 M12 만 개별적으로 바꿀수 없는지요 참고로 1번 2번 3번은 같은 이름입니다 즉 서브 블록만 바꿀수 없는가 해서요. 파일 참조해서 봐주세요. 부탁드립니다.
rnsdlsajfl님의 댓글
- rnsdlsajfl 이름으로 검색
- 작성일
뭐하남님 너무 고맙습니다^^ 염치없지만 하나만 더 물어봐도 되겠습니까 CB명령어로 쳐서 ** (블록안에 블록을)** 치면 원본블록은 그대로 있고 그위에 겹쳐서 다른블록이 생성되는데 원본블록이 지워지게끔 가능하게 고수님 수정좀 해주세요 유일하게 이리습이 블록안에 불록이름을 바꿀수 있더라구요 근데 블록안에 블록이름이 바꿔면서 기존에 있던 원본은 블록이 있더라구요 즉 겹쳐지는데 가능할수 있는지요 부탁좀 드리겠습니다 이런 종루에 블록도면이 너무 많아서 공수가 많이 들어가네요