선택한 블록만 다른 이름으로 새롭게 저장하기. 즉, 복제하기
AutoLISP: Copy Block with New Name
If you have ever needed to make an instance of a block unique so that it may have different geometry or whatever…. One way to do so is to open the the block in the Block Editor and then enter…
autocadtips1.com
1) Block Editor > BSAVEAS
2) COPYBLOCK3 (bellow lisp)
3) BN (recommand)
2) COPYBLOCK3
;VVA
;make a copy of a block with a new name
;select block to copy
;enter new name unless anonymous block, then new name = ols name less *
;pick insertion point
(defun C:CopyBlock3 (/ *error* OldBlockName NewBlockName
rewind BlockName Info BlockInfo ent_name ent_info)
(defun *error* (Msg)
(cond
((or (not Msg)
(member Msg '("console break"
"Function cancelled"
"quit / exit abort"))))
((princ (strcat "\nError: " Msg)))
) ;cond
(princ)
) ;end error
(sssetfirst)
(setq OldBlockName (entsel "\nSelect Block to copy: "))
(while
(or
(null OldBlockName)
(/= "INSERT" (cdr (assoc 0 (entget (car OldBlockName)))))
)
(princ "\nSelection was not a block - try again...")
(setq OldBlockName (entsel "\nSelect Block to copy: "))
)
;block name
(setq OldBlockName (strcase (cdr (assoc 2 (entget (car OldBlockName))))))
(princ (strcat "\nSelected block name: " OldBlockName))
(if (= "*" (substr OldBlockName 1 1))
(setq NewBlockName (substr OldBlockName 2))
(setq NewBlockName (getstring T "\nEnter new block name: "))
)
(setq rewind T)
(while (setq Info (tblnext "BLOCK" rewind))
(setq BlockName (strcase (cdr (assoc 2 Info))))
(if (= OldBlockName BlockName)
(setq BlockInfo Info)
)
(setq rewind nil)
)
(if BlockInfo
(progn
(setq ent_name (cdr (assoc -2 BlockInfo)))
;header definition:
(entmake (list '(0 . "BLOCK")
(cons 2 NewBlockName)
'(70 . 2)
(cons 10 '(0 0 0))
)
)
;body definition:
(entmake (cdr (entget ent_name)))
(while (setq ent_name (entnext ent_name))
(setq ent_info (cdr (entget ent_name)))
(entmake ent_info)
)
;footer definition:
(entmake '((0 . "ENDBLK")))
(command "-INSERT" NewBlockName pause "1" "1" "0")
)
)
(*Error* nil)
(princ)
) ;end
3) BN
LISP을 이용한 선택한 하나의 블록만 이름 바꾸기
RENAME 이라는 명령어로 블럭 이름을 바꾸면 도면 내에 있는 AAAA라는 이름의 블럭이 전부 BBBBB라는 이름으로 바뀌게 된다. 원하는 것이 선택한 하나의 블럭만 이름을 바꾸고자 한다면 LISP을 이용해
fulnbi.tistory.com
(defun c:bn(/ os ent elist ins)
(setvar "cmdecho" 0)
(setq os (getvar "osmode"))
(if (setq ent (car (entsel "\nBlock select:")))
(progn (setq elist (entget ent))
(setq obn (cdr (assoc 2 elist)))
(setq ins (cdr (assoc 10 elist)))
(setq rname nil)
(while (= rname nil)
(setq rname (getstring t "\nNew block name:"))
(setq byn (assoc 2 (tblsearch "block" rname)))
(setq byn2 (cdr byn)) ; byn2 블럭이름
(if (= rname byn2)
(progn (setq rname nil)
(prompt "블럭이름중복->다시입력")
) ;progn
);if
) ;while
(if (/= rname "")
(progn (command "explode" ent)
(setvar "osmode" 0)
(command "_.block" rname ins "P" "")
(command "_.insert" rname ins "" "" "")
(setvar "osmode" os)
(princ "블럭이름: ")(princ obn)(princ " --> ")(princ rname)(princ " 로 교체함")
);progn
);if
);progn
);if
(princ)
);defun
'autocad' 카테고리의 다른 글
Copy Block Definition (0) | 2025.01.13 |
---|---|
블럭삽입 오토스크립트 (0) | 2025.01.13 |
숫자에 콤마 ',' 넣기 빼기 (0) | 2025.01.10 |
Pdf 출력 후 문자 주위로 상자 보이는 문제 (0) | 2025.01.10 |
간단하게 리스트 내 요소들을 연산 (0) | 2024.12.19 |