【求助】批量外部块对象选择问题
我希望能编一个批量写外部块的功能,原来的可以使用只是写出来的外部块的插入点离图元很远,现在我想修改能让插入点控制在图元的范围内(开始是想能控制在质心,但不成面域的多个环形不知道怎么弄,水平问题),但是我参考各位高手的代码写出来的代码有问题,图元选择出现了错误,请高手们指点,谢谢!<br/><br/>;选择图中所有图元并获得外轮廓的两角点<br/> (setq ss (ssget "x"))<br/> (setq obj (vlax-ename->vla-object ss))<br/> (vla-GetBoundingBox obj "p1" "p2")<br/>;取得中点<br/> (setq p1_x (car p1))<br/> (setq p2_x (car p2))<br/> (Setq p1_y (cadr p1))<br/> (setq p2_y (cadr p2))<br/> (setq p_x (+ (/ (- p1_x p2_x) 2) p2_x))<br/> (Setq p_y (+ (/ (- p1_y p2_y) 2) p2_y))<br/> (setq p_new (list p_X p_y 0))<br/><br/>;以中点写外部块<br/> (COMMAND "WBLOCK" (STRCAT path "\\" "1" "\\" name) "" p_new obj "")<br/><br/> 好像vla-GetBoundingBox命令只能对一个图元进行操作,是这样的吗? 这是全部代码,但是执行有问题,那位高手可以帮我看一下啊?谢谢了<br/>;尝试能在图块的中心写外部块<br/>(defun c:b6 (/ path #time time-1 fn n name time-2 time-last ss idx count en entall)<br/><br/> (vl-load-com)<br/> (setq path (getstring "\n请指定 DWG 文件目录:"))<br/> (princ "\n 正在处理,等一下...")<br/> (princ) <br/> (setq cmdecho-save (getvar "CMDECHO"))<br/> (setvar "CMDECHO" 0)<br/> (setq #time (getvar "DATE")) ;Time1<br/> (setq time1 (* 86400.0 (- #time (fix #time)))) ;Time1<br/> (setq fn (open (strcat path "\\" "namelist.txt") "a"))<br/> (setq n 0)<br/> (foreach name (vl-directory-files path nil 1)<br/> (if (= (strcase (vl-filename-extension name) t) ".dwg")<br/> (progn<br/>;*******************************************************************<br/> ;插入块<br/> (vl-cmdf "-insert" (strcat path "\\" name) '(0 0 0)"""""")<br/>;*******************************************************************<br/> ;炸开块<br/> (setq ss (ssget "x" '((0 . "INSERT"))))<br/><br/>;选择图中所有图元并获得外轮廓的两角点<br/>; (setq ss (ssget "x"))<br/> (setq obj (vlax-ename->vla-object ss))<br/> (vla-GetBoundingBox obj "minp" "maxp")<br/> (setq p1 (vlax-safearray->list minp)<br/> p2 (vlax-safearray->list maxp));查询返回值<br/>;取得中点<br/> (setq p1_x (car p1))<br/> (setq p2_x (car p2))<br/> (Setq p1_y (cadr p1))<br/> (setq p2_y (cadr p2))<br/> (setq p_x (+ (/ (- p1_x p2_x) 2) p2_x))<br/> (Setq p_y (+ (/ (- p1_y p2_y) 2) p2_y))<br/> (setq p_new (list p_X p_y 0))<br/><br/>(setq idx -1 count 0)<br/>(if ss<br/>(while (<= (setq idx (1+ idx)) (1- (sslength ss)))<br/>(setq en (ssname ss idx))<br/>(if (not (assoc 1 (tblsearch "BLOCK"<br/> (cdr (assoc 2 (entget en))))))<br/>(progn<br/> (command "explode" en)<br/> (setq count (1+ count))<br/>)<br/>);endif<br/>)<br/>)<br/>(princ (strcat "\n" (itoa count)<br/> " block(s) exploded."))<br/>(princ)<br/>;*******************************************************************<br/><br/><br/>;以中点写外部块<br/> (setq ss (ssget "x"))<br/> (COMMAND "WBLOCK" (STRCAT path "\\" "1" "\\" name) "" p_new obj "")<br/>;*******************************************************************<br/>;删除图<br/> (vl-cmdf "erase" "all" "")<br/> <br/> )<br/> )<br/> )<br/>) vla-GetBoundingBox命令只能对一个图元进行操作,<font face="宋体,verdana, arial, helvetica" id="text3" style="font-size: 10pt;">我想在块还没有炸开的时候就获取点,但到了点的处理的时候出现了问题,那位高手给指点一下呢?<br/>下面是我的代码<br/>
;尝试能在图块的中心写外部块<br/>
(defun c:b6 (/ path #time time-1 fn n name time-2 time-last ss idx count en entall)<br/>
<br/>
(vl-load-com)<br/>
(setq path (getstring "\n请指定 DWG 文件目录:"))<br/>
(princ "\n 正在处理,等一下...")<br/>
(princ)<br/>
(setq cmdecho-save (getvar "CMDECHO"))<br/>
(setvar "CMDECHO" 0)<br/>
(setq #time (getvar "DATE")) ;Time1<br/>
(setq time1 (* 86400.0 (- #time (fix #time))));Time1<br/>
(setq fn (open (strcat path "\\" "namelist.txt") "a"))<br/>
(setq n 0)<br/>
(foreach name (vl-directory-files path nil 1)<br/>
(if (= (strcase (vl-filename-extension name) t) ".dwg")<br/>
(progn<br/>
;*******************************************************************<br/>
;插入块<br/>
(vl-cmdf "-insert" (strcat path "\\" name) '(0 0 0)"""""")<br/>
;*******************************************************************<br/>
;炸开块<br/>
(setq ss (ssget "x" '((0 . "INSERT"))))<br/>
<br/>
(setq idx -1 count 0)<br/>
(if ss<br/>
(while (<= (setq idx (1+ idx)) (1- (sslength ss)))<br/>
(setq en (ssname ss idx))<br/>
(if (not (assoc 1 (tblsearch "BLOCK" (cdr (assoc 2 (entget en))))))<br/>
(progn<br/>
;选择图中块外轮廓的两角点<br/>
(vla-GetBoundingBox en "minp" "maxp")<br/>
(setq p1 (vlax-safearray->list minp)<br/>
p2 (vlax-safearray->list maxp));查询返回值<br/>
;取得中点<br/>
(setq p1_x (car p1))<br/>
(setq p2_x (car p2))<br/>
(Setq p1_y (cadr p1))<br/>
(setq p2_y (cadr p2))<br/>
(setq p_x (+ (/ (- p1_x p2_x) 2) p2_x))<br/>
(Setq p_y (+ (/ (- p1_y p2_y) 2) p2_y))<br/>
(setq p_new (list p_X p_y 0))<br/>
<br/>
<br/>
<br/>
(command "explode" en)<br/>
(setq count (1+ count))<br/>
)<br/>
);endif<br/>
)<br/>
)<br/>
(princ (strcat "\n" (itoa count)<br/>
" block(s) exploded."))<br/>
(princ)<br/>
;*******************************************************************<br/>
<br/>
<br/>
;以中点写外部块<br/>
(setq ss (ssget "x"))<br/>
(COMMAND "WBLOCK" (STRCAT path "\\" "1" "\\" name)"" p_new ss "")<br/>
;*******************************************************************<br/>
;删除图<br/>
(vl-cmdf "erase" "all" "")<br/>
<br/>
)<br/>
)<br/>
)<br/>
)</font> 怎么没有人理呢?
(defun C:B6 (/ BLK_BOUND CMDECHO-SAVE MPT PATH SS)
(vl-load-com)
(setq PATH (getstring "\n請指定 DWG 文件目錄:")) ;k:\temp
(princ "\n 正在處理,等一下...")
(princ)
(setq CMDECHO-SAVE (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(foreach NAME (vl-directory-files PATH "*.dwg" 1)
(command "_.insert"
(strcat PATH "\\" NAME)
'(0 0 0)
""
""
""
)
(command "_.explode" (entlast))
(command "_.zoom" "e")
(setq SS (ssget "p"))
(setq BLK_BOUND (ACET-GEOM-SS-EXTENTS SS t))
(setq MPT (mapcar '/
(mapcar '+ (car BLK_BOUND) (cadr BLK_BOUND))
'(2.0 2.0 2.0)
)
)
(command "_.WBLOCK"
(strcat PATH "\\" "1-" NAME)
""
"non"
MPT
SS
""
)
(command "_.purge" "b" "*" "n")
)
(setvar "cmdecho" CMDECHO-SAVE)
(princ)
)
谢谢啊!我的问题解决了,o(∩_∩)o...<br/>差距实在太大了<br/>
页:
[1]