congcong96 发表于 2008-11-6 09:39:00

【求助】批量外部块对象选择问题

我希望能编一个批量写外部块的功能,原来的可以使用只是写出来的外部块的插入点离图元很远,现在我想修改能让插入点控制在图元的范围内(开始是想能控制在质心,但不成面域的多个环形不知道怎么弄,水平问题),但是我参考各位高手的代码写出来的代码有问题,图元选择出现了错误,请高手们指点,谢谢!<br/><br/>;选择图中所有图元并获得外轮廓的两角点<br/>    (setq ss (ssget "x"))<br/>    (setq obj (vlax-ename-&gt;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/>

congcong96 发表于 2008-11-7 08:37:00

好像vla-GetBoundingBox命令只能对一个图元进行操作,是这样的吗?

congcong96 发表于 2008-11-7 11:43:00

这是全部代码,但是执行有问题,那位高手可以帮我看一下啊?谢谢了<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-&gt;vla-object ss))<br/>    (vla-GetBoundingBox obj "minp" "maxp")<br/>    (setq p1 (vlax-safearray-&gt;list minp)<br/>        p2 (vlax-safearray-&gt;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 (&lt;= (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/>)

congcong96 发表于 2008-11-8 14:40:00

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 (&lt;= (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-&gt;list minp)<br/>
                p2 (vlax-safearray-&gt;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>

congcong96 发表于 2008-11-10 16:42:00

怎么没有人理呢?

龙龙仔 发表于 2008-11-11 07:52:00


(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)
)

congcong96 发表于 2008-11-11 11:28:00

谢谢啊!我的问题解决了,o(∩_∩)o...<br/>差距实在太大了<br/>
页: [1]
查看完整版本: 【求助】批量外部块对象选择问题