明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 半听可乐

编程申请:以块中心画直径为25米的圆,圆的交集内填充阴影或颜色,鼠标左键单击退出…

  [复制链接]
发表于 2012-12-12 19:37:08 | 显示全部楼层
本帖最后由 wowan1314 于 2012-12-13 20:10 编辑

这个程序到此为止了。

感觉实际使用要比G的好用点(尽管速度慢点)
1、省略25米的输入,按S才出现。省了一步操作
2、加入删圆的操作。默认不删圆。按D才删圆。看着更直观。
3、加入状态栏进度条,使用过程更友好。

具体操作步骤
1、选块  
2、暂停观察 。
      2.1按S可设置半径,然后结束程序删除过程物。下次运行按新半径计算
      2.2按D可删除圆,然后暂停,仅剩余填充及填充边界,方便更好的观察。
             再按鼠标左右键结束程序删除过程物
      2.3按鼠标左右键结束程序删除过程物。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
半听可乐 + 1 感谢关注,赞一个!

查看全部评分

回复

使用道具 举报

发表于 2012-12-12 19:47:33 | 显示全部楼层
对单个及一个交集没有的情况下会填充某一个。 不过实际中也不会有这个情况。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

 楼主| 发表于 2012-12-13 09:47:40 | 显示全部楼层
wowan1314 发表于 2012-12-12 19:37
这个程序到此为止了。

感觉实际使用要比G的好用点(尽管速度慢点)

朋友,能增加图块识别选项吗?仅放到选项里,特殊情况选取需要识别的图块(有时候要看灭火器的保护半径,图块名称不一样)
回复

使用道具 举报

发表于 2012-12-13 13:37:09 | 显示全部楼层
本帖最后由 wowan1314 于 2012-12-13 16:02 编辑

是把第一步改为先选块确定块名再选范围。还是把选块得块名这步也放选项里面
回复

使用道具 举报

发表于 2012-12-13 17:26:09 | 显示全部楼层
本帖最后由 阿然 于 2012-12-13 17:30 编辑

虽然解决了,附上我按照gu版给的思路写的代码,争取顶到50楼看看GU版的代码。输入消防栓块名(可以使用*来代替尾数,比如j_xhs*),输入半径,框选,然后有结果
  1. (vl-load-com)
  2. (setvar "cmdecho" 0)
  3. (setq *AcadDoc* (vla-get-ActiveDocument (vlax-get-Acad-Object)))
  4. (setq *MoSpace* (vla-get-ModelSpace *AcadDoc*))

  5. (defun c:test (/            ss                 blockname    blocklist
  6.                ocirlist            regionlist         blocklength  i
  7.                j            tempregion1         tempregion2  intersectlist
  8.                intersectregion                 ocir              oregion
  9.                cenptlist    pt                 hatchlist    ohatch
  10.                code
  11.               )
  12.   (if (and
  13.         (setq blockname (getstring "\n请输入块名:"))
  14.         (setq CenRad (getreal "\n请输入圆半径:"))
  15.         (setq ss (ssget        "_W"
  16.                         (setq pt (getpoint "\n选取第一点:"))
  17.                         (getcorner pt "\n选取第二点:")
  18.                         (list
  19.                           '(0 . "INSERT")
  20.                           (cons 2 blockname)
  21.                         )
  22.                  )
  23.         )
  24.       )
  25.     (progn
  26.       (setq blocklength
  27.              (sslength ss)
  28.             i 0
  29.       )
  30.       (while (< i blocklength)
  31.         (setq blocklist        (cons (ssname ss i) blocklist)
  32.               i                (1+ i)
  33.         )
  34.       )
  35.       (setq ss nil)
  36.       (setq
  37.         cenptlist (mapcar '(lambda (x)
  38.                              (cdr (assoc 10 (entget x)))
  39.                            )
  40.                           blocklist
  41.                   )
  42.       )
  43.       (setq ocirlist
  44.              (mapcar '(lambda (x)
  45.                         (vla-addCircle *mospace* (vlax-3d-point x) cenrad)
  46.                       )
  47.                      cenptlist
  48.              )
  49.       )
  50.       (setq regionlist
  51.              (vlax-safearray->list
  52.                (vlax-variant-value
  53.                  (vla-addregion
  54.                    *mospace*
  55.                    (Xr:list->Obj-Array ocirlist)
  56.                  )
  57.                )
  58.              )
  59.             i 0
  60.       )
  61.       (while (< i blocklength)
  62.         (setq j (1+ i))
  63.         (while (< j blocklength)
  64.           (setq        tempregion1
  65.                             (vlax-invoke-method (nth i regionlist) 'Copy)
  66.                 tempregion2
  67.                             (vlax-invoke-method (nth j regionlist) 'Copy)
  68.           )
  69.           (vlax-invoke-method
  70.             tempregion1
  71.             'Boolean
  72.             1
  73.             tempregion2
  74.           )
  75.           (if (not (equal
  76.                      (vlax-get-property tempregion1 'Area)
  77.                      0.0
  78.                      0.000001
  79.                    )
  80.               )
  81.             (progn
  82.               (setq intersectlist (cons tempregion1 intersectlist))
  83.               (if (not (vlax-erased-p tempregion2))
  84.                 (vla-erase tempregion2)
  85.               )
  86.             )
  87.             (progn
  88.               (if (not (vlax-erased-p tempregion1))
  89.                 (vla-erase tempregion1)
  90.               )
  91.               (if (not (vlax-erased-p tempregion2))
  92.                 (vla-erase tempregion2)
  93.               )
  94.             )
  95.           )
  96.           (setq j (1+ j))
  97.         )
  98.         (setq i (1+ i))
  99.       )
  100.       (setq
  101.         hatchlist (mapcar '(lambda (x) (Xr:addhatch x)) intersectlist)
  102.       )
  103. ;;;      (vlax-invoke-method *acaddoc* 'Regen 0)
  104. ;;;      (prompt "\n按回车结束!")
  105. ;;;      (while (equal
  106. ;;;               (setq code (grread T 8))
  107. ;;;               '(2 13)
  108. ;;;             )
  109. ;;;      )
  110. ;;;      (Xr:delete (append hatchlist intersectlist regionlist ocirlist))
  111.     )
  112.   )
  113.   (princ)
  114. )

  115. (defun Xr:addhatch (obj / ohatch)
  116.   (setq ohatch (vla-AddHatch *mospace* 0 "ANSI31" T))
  117.   (vlax-invoke-method
  118.     ohatch
  119.     'AppendOuterLoop
  120.     (Xr:list->Obj-Array (list obj))
  121.   )
  122.   ohatch
  123. )

  124. (defun Xr:delete (objlist / obj)
  125.   (foreach obj objlist
  126.     (if        (not (vlax-erased-p obj))
  127.       (vla-erase obj)
  128.     )
  129.   )
  130. )

  131. (defun Xr:list->Obj-Array (objList / arraySpace sArray)
  132.   (setq        arraySpace
  133.          (vlax-make-safearray
  134.            vlax-vbObject                ; 元素类型
  135.            (cons 0
  136.                  (1- (length objList))
  137.            )                                ; 数组维数
  138.          )
  139.   )
  140.   (setq sArray (vlax-safearray-fill arraySpace objList))
  141. )


点评

填充太密了。填充的比例应该设置为2000为佳。  发表于 2012-12-13 19:38
正想找VLA处理的方法呢。就是代码这么多! VL函数几乎没研究啊。头大。有空再看  发表于 2012-12-13 19:33
回复

使用道具 举报

 楼主| 发表于 2012-12-13 17:45:05 | 显示全部楼层
wowan1314 发表于 2012-12-13 13:37
是把第一步改为先选块确定块名再选范围。还是把选块得块名这步也放选项里面

选块得块名这步放选项里面比较好,默认操作顺序不变,输入关键词才进入“选块得块名”这一步
回复

使用道具 举报

发表于 2012-12-13 19:29:34 | 显示全部楼层
嗯。
1、可根据不同的块名来提示程序要检查的是消火栓还是灭火器,这样更人性化
2、如果是灭火器多数情况下是多少半径? 直接在程序中默认下,省的输入。特殊情况再输入
回复

使用道具 举报

发表于 2012-12-13 19:33:57 | 显示全部楼层
本帖最后由 wuqiu1986 于 2012-12-13 19:48 编辑

自己做了一个,感觉速度有点慢,不过应该满足要求,由于有急事,没来得及做图片。命令是gxfs,选取一个消防栓样本,目的在于消防栓块以后改名也能用,然后是半径,然后选择,可以自动全选,任意键退出。还是个初学者,程序有待提高。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

发表于 2012-12-13 19:58:02 | 显示全部楼层
本帖最后由 wowan1314 于 2013-6-8 11:19 编辑

奇怪了。VLA代码怎么那么长啊。看不下去。
下面是按楼主意思修改的。
1、程序根据块名不同提示选择消火栓OR灭火器
2、加入选块得块名选项。
3、状态栏进度条简化下,少用个循环,免得使本来就不快的程序变的更慢
4、小技巧,若想留圆及填充按ESC即可。
5、程序写的很乱,就不拿出来丢人了。实现功能就好。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
半听可乐 + 1 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-12-14 09:17:53 | 显示全部楼层
wowan1314 发表于 2012-12-13 19:58
奇怪了。VLA代码怎么那么长啊。看不下去。
下面是按楼主意思修改的。
1、程序根据块名不同提示选择消火栓 ...

这样更实用了,如果图纸不是很大,跟G版的速度也差不了多少,呵呵,非常感谢大家!

点评

发现个BUG。改块名如果选择的不是块。程序就没法运行了,得关掉图纸再打开呢。有时间我再调整吧  发表于 2012-12-14 10:01
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 11:34 , Processed in 0.161029 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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