안녕하세요.
다음은 제가 사용하는 블록명을 자동으로 날짜 시간으로
지정해주는 리습입니다.
현재 블록안에서는 사용이 안되는데 블록 안에서도 사용 할 수있게
수정이 가능 할까요?
부탁 드립니다.
(defun c:bn( / a p1)
(command “layer” “m” “0” “”)
(setq date (rtos (getvar “cdate”) 2 8))
(setq p1 (getpoint “t base point ? :”))
(setq a (ssget))
(command “chprop” a “” “lt” “bylayer” “”)
(setq xxx (strcat date))
(command “copybase” p1 a “”)
(command “block” xxx p1 a “”)
(setq #os (getvar “osmode”))
(setvar “osmode” 0)
(command “insert” xxx p1 1 1 0)
(setvar “osmode” #os)
(princ “nt블록명 : “) (princ xxx)
(princ)
)
AHN GISEOGLv.0
블록을 날짜 이름으로 변경 리습 수정 부탁드립니다.
공유
현재 블록 안에 들어가서 일부분을 다른 이름으로
블록을 생성 하는데 그시점의 날짜와 시간으로 블록명을 지정 하는 것이니
당연히 같은 이름은 아니지요.
예를 들면 pasteblock 명령은 블록 안에서 사용 가능 한데 문제는 임의의 블록 이름으로 지정 후에
그이름을 날짜와시간의 이름으로 rename 하면 될것 같습니다.
어떻게 리습으로 가능 할까요? 도와 주십시요.
현재 블록 안에 들어간다는 말이 블록편집을 이야기 하는것 같은데…
블록편집 상태에서는 블록생성과 편집이 불가능합니다.
pasteblock명령도 안됩니다. (pasteclip는 사용가능, Ctrl + V)
그리고 블록이름을 변경한다고 했는데 블록이름을 변경할수는 없습니다.
현재 돌아다니는 블록이름 변경 프로그램은 모두
explode 해서 다시 특정 블록 이름으로 새롭게 만들어 주는 것입니다.
영원낙원님이 질문 난위도를 높이셧군요.
직접 코드를 제어하셔서 저에게도 깨닳음을 주셧으면 합니다.
블록편집기 안에서는 블록생성과 변경에 관련된 command 명령은 막혀 있습니다.
하지만 lisp으로 만들거나 변경하는것은 가능합니다.
저는 완전한 코드를 보낼만한 실력이 아니므로
참조하시도록 블록명을 변경하는 코드만 올려드립니다.
(defun c:@blk_ren(/ sel_ ent_list blk_name new_name acad_obj act_docu blocks blk_old)
;블록을 선택해서 이름을 바꾼다.
(setq sel_ (entsel “n블록선택:”))
(setq ent (car sel_))
(setq ent_list (entget ent))
(setq blk_name (cdr (assoc 2 ent_list)))
(setq acad_obj (vlax-get-acad-object)
act_docu (vla-get-ActiveDocument acad_obj)
blocks (vla-get-blocks act_docu)
blk_old (vla-item blocks blk_name)
)
(setq new_name (getstring (strcat “n변경할 블록명<“blk_name”>:”)))
(vla-put-name blk_old new_name)
);defun
여기 고캐드에서도 많은 분들이 해답을 알고 있기에 다른 분들의 댓글을 보고 싶어서 기다렷는데
부족한 제 댓글을 올리게 되었네요.
안녕하세요
댓글 주신분들께 감사드립니다.
아래는 또다른 블록 생성리습인데요
이것은 블록안에서도 실행됩니다.
그러나 블록명이 임의로 지정되지요.
그 임의로 지정된 블록명을 현재의 날짜와 시간으로 바꿔주면
블록 안에서도 사용 가능할것 같은데요.
(defun c:B1( / a p1)
(COMMAND “LAYER” “M” “0” “”)
(setq p1 (getpoint “t Base Point ? :”))
(setq a (ssget))
(COMMAND “CHPROP” A “” “LT” “BYLAYER” “”)
(command “Copybase” p1 a “”)
(command “Erase” “P” “”)
(setq #os (getvar “osmode”))
(setvar “osmode” 0)
(command “Pasteblock” p1)
(setvar “osmode” #os)
(princ)
)
아래는 다른분의 리습입니다.
(defun c:ABCN( / block nbn bn)
(setvar “cmdecho” 0)
(setq block (tblnext “block” T))
(while block
(if (/= (substr (setq bn (cdr (assoc 2 block))) 1 1) “*”)
(progn
(while (tblsearch “block” (setq nbn (rtos (getvar “cdate”) 2 8))))
(command “rename” “b” bn nbn)
)
)
(setq block (tblnext “block”))
)
(princ)
)
여기서 rename 을 조합 하면 안될까요?
도와 주신분 들께 감사드립니다.
우선 급한대로 xcsh 님이 올려 주신걸로 제가 약간 수정해서(이게 맞는 건지?)
아래처럼 쓰기로 했습니다
(defun c:bkr(/ sel_ ent_list blk_name new_name acad_obj act_docu blocks blk_old)
;블록을 선택해서 이름을 바꾼다.
(setq sel_ (entsel “n블록선택:”))
(setq ent (car sel_))
(setq ent_list (entget ent))
(setq blk_name (cdr (assoc 2 ent_list)))
(setq acad_obj (vlax-get-acad-object)
act_docu (vla-get-ActiveDocument acad_obj)
blocks (vla-get-blocks act_docu)
blk_old (vla-item blocks blk_name)
)
(setq date (rtos (getvar “cdate”) 2 8))
(setq new_name (strcat date))
(vla-put-name blk_old new_name)
);defun
다시 정리하면
1.블록편집기로 들어간다.
2.리습명령 ‘b1’ 으로 새로운 블록 생성한다.
3.상기의 리습명령 ‘b1’ 으로 임의의 이름으로 저장된 블록이름을 ‘bkr’ 로 이름을 재지정 한다.
입니다.
한번더 질문을 드린다면 리습을 두번 실행 할 수 밖에 없는데
2번과 3번을 하나의 리습으로 실행 할 수는 없을까요?
건승하세요.
잘 하셧습니다. 하지만 블록만드는 것은 안될 것입다.
지금 된다고 생각하신 방법은 command 문장을 사용해야 하기 때문에 안됩니다.
이번에 참조하실 코드는 아래와 같습니다.
(defun @blk_make( blk_name p0 ss_ / n sel_ min_p max_p min_1 max_1)
; 점과 셀렉션으로 블록만들기
(setq ActDoc (vla-get-activedocument (vlax-get-acad-object)))
(setq blk_Obj (vla-add (vla-get-Blocks ActDoc) (vlax-3D-point p0) blk_name))
(setq ss_obj (mapcar ‘vlax-ename->vla-object
(vl-remove-if ‘listp (mapcar ‘cadr (ssnamex ss_ ))) ))
(vlax-invoke ActDoc ‘CopyObjects ss_obj blk_Obj)
(vlax-release-object Actdoc)
);defun
한번 더 결합해 보십시오. 저는 완벽하게 만든것이 아니기 때문에
하시고 나면 문제점이 무엇인지 설명드리겠습니다.