明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1202|回复: 6

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

[复制链接]
发表于 2008-11-6 09:39 | 显示全部楼层 |阅读模式
我希望能编一个批量写外部块的功能,原来的可以使用只是写出来的外部块的插入点离图元很远,现在我想修改能让插入点控制在图元的范围内(开始是想能控制在质心,但不成面域的多个环形不知道怎么弄,水平问题),但是我参考各位高手的代码写出来的代码有问题,图元选择出现了错误,请高手们指点,谢谢!
[code]
;选择图中所有图元并获得外轮廓的两角点
    (setq ss (ssget "x"))
    (setq obj (vlax-ename->vla-object ss))
    (vla-GetBoundingBox obj "p1" "p2")
;取得中点
    (setq p1_x (car p1))
    (setq p2_x (car p2))
    (Setq p1_y (cadr p1))
    (setq p2_y (cadr p2))
    (setq p_x (+ (/ (- p1_x p2_x) 2) p2_x))
    (Setq p_y (+ (/ (- p1_y p2_y) 2) p2_y))
    (setq p_new (list p_X p_y 0))

;以中点写外部块
    (COMMAND "WBLOCK" (STRCAT path "\\" "1" "\\" name)  "" p_new obj "")
[code]
 楼主| 发表于 2008-11-7 08:37 | 显示全部楼层
好像vla-GetBoundingBox命令只能对一个图元进行操作,是这样的吗?
 楼主| 发表于 2008-11-7 11:43 | 显示全部楼层
这是全部代码,但是执行有问题,那位高手可以帮我看一下啊?谢谢了
;尝试能在图块的中心写外部块
(defun c:b6 (/ path #time time-1 fn n name time-2 time-last ss idx count en entall)

    (vl-load-com)
  (setq path (getstring "\n请指定 DWG 文件目录:"))
  (princ "\n   正在处理,等一下...")
  (princ)  
  (setq cmdecho-save (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (setq #time (getvar "DATE"))                    ;Time1
  (setq time1 (* 86400.0 (- #time (fix #time))))  ;Time1
  (setq fn (open (strcat path "\\" "namelist.txt") "a"))
  (setq n 0)
  (foreach name (vl-directory-files path nil 1)
    (if (= (strcase (vl-filename-extension name) t) ".dwg")
      (progn
;*******************************************************************
    ;插入块
        (vl-cmdf "-insert" (strcat path "\\" name) '(0 0 0)"""""")
;*******************************************************************
    ;炸开块
    (setq ss (ssget "x" '((0 . "INSERT"))))

;选择图中所有图元并获得外轮廓的两角点
;    (setq ss (ssget "x"))
    (setq obj (vlax-ename->vla-object ss))
    (vla-GetBoundingBox obj "minp" "maxp")
    (setq p1 (vlax-safearray->list minp)
        p2 (vlax-safearray->list maxp));查询返回值
;取得中点
    (setq p1_x (car p1))
    (setq p2_x (car p2))
    (Setq p1_y (cadr p1))
    (setq p2_y (cadr p2))
    (setq p_x (+ (/ (- p1_x p2_x) 2) p2_x))
    (Setq p_y (+ (/ (- p1_y p2_y) 2) p2_y))
    (setq p_new (list p_X p_y 0))

(setq idx -1 count 0)
(if ss
(while (<= (setq idx (1+ idx)) (1- (sslength ss)))
(setq en (ssname ss idx))
(if (not (assoc 1 (tblsearch "BLOCK"
    (cdr (assoc 2 (entget en))))))
(progn
  (command "explode" en)
  (setq count (1+ count))
)
);endif
)
)
(princ (strcat "\n" (itoa count)
   " block(s) exploded."))
(princ)
;*******************************************************************


;以中点写外部块
    (setq ss (ssget "x"))
    (COMMAND "WBLOCK" (STRCAT path "\\" "1" "\\" name)  "" p_new obj "")
;*******************************************************************
;删除图
    (vl-cmdf "erase" "all" "")
    
      )
    )
  )
)
 楼主| 发表于 2008-11-8 14:40 | 显示全部楼层
vla-GetBoundingBox命令只能对一个图元进行操作,我想在块还没有炸开的时候就获取点,但到了点的处理的时候出现了问题,那位高手给指点一下呢?
下面是我的代码
;尝试能在图块的中心写外部块
(defun c:b6 (/ path #time time-1 fn n name time-2 time-last ss idx count en entall)

(vl-load-com)
(setq path (getstring "\n请指定 DWG 文件目录:"))
(princ "\n 正在处理,等一下...")
(princ)
(setq cmdecho-save (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq #time (getvar "DATE")) ;Time1
(setq time1 (* 86400.0 (- #time (fix #time)))) ;Time1
(setq fn (open (strcat path "\\" "namelist.txt") "a"))
(setq n 0)
(foreach name (vl-directory-files path nil 1)
(if (= (strcase (vl-filename-extension name) t) ".dwg")
(progn
;*******************************************************************
;插入块
(vl-cmdf "-insert" (strcat path "\\" name) '(0 0 0)"""""")
;*******************************************************************
;炸开块
(setq ss (ssget "x" '((0 . "INSERT"))))

(setq idx -1 count 0)
(if ss
(while (<= (setq idx (1+ idx)) (1- (sslength ss)))
(setq en (ssname ss idx))
(if (not (assoc 1 (tblsearch "BLOCK" (cdr (assoc 2 (entget en))))))
(progn
;选择图中块外轮廓的两角点
(vla-GetBoundingBox en "minp" "maxp")
(setq p1 (vlax-safearray->list minp)
p2 (vlax-safearray->list maxp));查询返回值
;取得中点
(setq p1_x (car p1))
(setq p2_x (car p2))
(Setq p1_y (cadr p1))
(setq p2_y (cadr p2))
(setq p_x (+ (/ (- p1_x p2_x) 2) p2_x))
(Setq p_y (+ (/ (- p1_y p2_y) 2) p2_y))
(setq p_new (list p_X p_y 0))



(command "explode" en)
(setq count (1+ count))
)
);endif
)
)
(princ (strcat "\n" (itoa count)
" block(s) exploded."))
(princ)
;*******************************************************************


;以中点写外部块
(setq ss (ssget "x"))
(COMMAND "WBLOCK" (STRCAT path "\\" "1" "\\" name) "" p_new ss "")
;*******************************************************************
;删除图
(vl-cmdf "erase" "all" "")

)
)
)
)
 楼主| 发表于 2008-11-10 16:42 | 显示全部楼层
怎么没有人理呢?
发表于 2008-11-11 07:52 | 显示全部楼层
  1. (defun C:B6 (/ BLK_BOUND CMDECHO-SAVE MPT PATH SS)
  2.   (vl-load-com)
  3.   (setq PATH (getstring "\n請指定 DWG 文件目錄:")) ;k:\temp
  4.   (princ "\n 正在處理,等一下...")
  5.   (princ)
  6.   (setq CMDECHO-SAVE (getvar "CMDECHO"))
  7.   (setvar "CMDECHO" 0)
  8.   (foreach NAME (vl-directory-files PATH "*.dwg" 1)
  9.     (command "_.insert"
  10.       (strcat PATH "\" NAME)
  11.       '(0 0 0)
  12.       ""
  13.       ""
  14.       ""
  15.     )
  16.     (command "_.explode" (entlast))
  17.     (command "_.zoom" "e")
  18.     (setq SS (ssget "p"))
  19.     (setq BLK_BOUND (ACET-GEOM-SS-EXTENTS SS t))
  20.     (setq MPT (mapcar '/
  21.         (mapcar '+ (car BLK_BOUND) (cadr BLK_BOUND))
  22.         '(2.0 2.0 2.0)
  23.        )
  24.     )
  25.     (command "_.WBLOCK"
  26.       (strcat PATH "\" "1-" NAME)
  27.       ""
  28.       "non"
  29.       MPT
  30.       SS
  31.       ""
  32.     )
  33.     (command "_.purge" "b" "*" "n")
  34.   )
  35.   (setvar "cmdecho" CMDECHO-SAVE)
  36.   (princ)
  37. )
 楼主| 发表于 2008-11-11 11:28 | 显示全部楼层
谢谢啊!我的问题解决了,o(∩_∩)o...
差距实在太大了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-21 07:09 , Processed in 0.207661 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表