找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2630|回复: 17

[每日一码] 质心批标

[复制链接]

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-9-10 10:17:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 q3_2006 于 2013-9-10 14:47 编辑

已经按照版主的指点改过来了。

  1. ;批标面积
  2. (defun c:tt (/ ar pt s1 ss th)
  3.   (if (setq ss (ssget '((0 . "*line,arc,circle,ellipse"))))
  4.     (progn
  5.       (xdrx_setsstodb ss 0)
  6.       (while (setq s1 (xdrx_getentdata 0))
  7. (setq th (getvar "dimscale")
  8.        pt (cadr (assoc "Centroid" (xdrx_curve_info s1)))
  9.        ar (rtos (cadr (assoc "Area" (xdrx_curve_info s1))) 2 2)
  10. )
  11. (if pt
  12.    (vl-cmdf "text" "j" "mc" pt th "" (strcat "面积=" ar "平方米") "")
  13. )
  14.       )
  15.     )
  16.   )
  17.   (princ)
  18. )
  19. ;批标质心
  20. (defun c:tt ( / ar i pt s1 ss len)
  21.   (if (setq ss (ssget '((0 . "*line,arc,circle,ellipse")))
  22.       )
  23.       (progn
  24.        (xdrx_setsstodb ss 0)
  25.     (while (setq s1 (xdrx_getentdata 0))
  26.                           (setq len (getvar "dimscale")
  27.                  pt (cadr (assoc "Centroid" (xdrx_curve_info s1))))
  28.       (if pt
  29.        (xdrx_polyline_make (polar pt (/ pi 2) (* len 5)) pt (polar pt 0 (* len 5)) t)
  30.     )
  31.   )
  32. )
  33. )
  34.   (princ)
  35. )

000.JPG
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-9-10 10:46:29 | 显示全部楼层
批标面积
  1. (defun c:tt ( / ar i pt s1 ss th)
  2.   (if (setq ss (ssget)
  3.             i -1
  4.       )
  5.     (while (setq s1 (ssname ss (setq i (1+ i)))
  6.                  th (getvar "dimscale")
  7.                  pt (cadr (assoc "Centroid" (xdrx_curve_info s1)))
  8.                  ar (rtos (cadr (assoc "Area" (xdrx_curve_info s1))) 2 2)
  9.            )
  10.       (vl-cmdf "text" "j" "mc" pt th "" (strcat "面积=" ar "平方米") "")
  11.     )
  12.   )
  13.   (princ)
  14. )
同样提示
000.JPG

点评

还有,创建多段线,API也有现成函数,替换掉命令 vl-cmdf (xdrx_polyline_make p1 p2 ...pn T)  详情 回复 发表于 2013-9-10 11:17
另外,关于选择集处理,建议熟悉下面的结构。 (xdrx_setsstodb ss 0) (while (setq e (xdrx_getentdata 0)) ...... ) 或者: (setq entl (xdrx_pickset->ents ss)) (foreach e entl ...... )  详情 回复 发表于 2013-9-10 11:15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-10 10:47:37 | 显示全部楼层
把有问题的图传到论坛来,供测试下,谢谢!

图不要全部,就你选完有问题的曲线做个外部块出来。

点评

CAD版本2010 就是写代码时临时测试图,没什么特别的!  详情 回复 发表于 2013-9-10 11:24
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-10 11:12:37 | 显示全部楼层
给你的代码提点建议,ssget的时候,一般加上过滤条件,把不需要处理的实体剔除掉。

比如:(if (setq ss (ssget '((0 . "*line,arc,circle,ellipse"))))
               (progn
               )
           )

因为你只要处理的是曲线类实体。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-10 11:15:39 | 显示全部楼层
q3_2006 发表于 2013-9-10 10:46
批标面积同样提示

另外,关于选择集处理,建议熟悉下面的结构。

(xdrx_setsstodb ss 0)
(while (setq e (xdrx_getentdata 0))
    ......
)

或者:

(setq entl (xdrx_pickset->ents ss))
(foreach e entl
    ......
)

点评

对API了解不多,知道的函数很少 ,知道了,改了。另外,晓东服务器没问题吧,怎么打开网页要好几分钟?都没耐性了!  详情 回复 发表于 2013-9-10 11:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-10 11:17:03 | 显示全部楼层
q3_2006 发表于 2013-9-10 10:46
批标面积同样提示

还有,创建多段线,API也有现成函数,替换掉命令 vl-cmdf

(xdrx_polyline_make p1 p2 ...pn T)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-9-10 11:24:03 | 显示全部楼层
XDSoft 发表于 2013-9-10 10:47
把有问题的图传到论坛来,供测试下,谢谢!

图不要全部,就你选完有问题的曲线做个外部块出来。

CAD版本2010  就是写代码时临时测试图,没什么特别的!

测试.rar

11.47 KB, 下载次数: 3, 下载积分: D豆 -1 , 活跃度 1

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-9-10 11:35:41 | 显示全部楼层
newer 发表于 2013-9-10 11:15
另外,关于选择集处理,建议熟悉下面的结构。

(xdrx_setsstodb ss 0)

对API了解不多,知道的函数很少{:soso_e127:}  ,知道了,改了。另外,晓东服务器没问题吧,怎么打开网页要好几分钟?都没耐性了!

点评

测试了你的图形,2008下,三条曲线都没有问题  详情 回复 发表于 2013-9-10 11:45
感觉是比以前慢,但是可以忍受啊,基本几秒内就打开了。你用的是什么网络,联通?电信? 移动?  详情 回复 发表于 2013-9-10 11:41
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-10 11:41:40 | 显示全部楼层
q3_2006 发表于 2013-9-10 11:35
对API了解不多,知道的函数很少  ,知道了,改了。另外,晓东服务器没问题吧,怎么打开网页 ...

感觉是比以前慢,但是可以忍受啊,基本几秒内就打开了。你用的是什么网络,联通?电信? 移动?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-10 11:45:04 | 显示全部楼层
q3_2006 发表于 2013-9-10 11:35
对API了解不多,知道的函数很少  ,知道了,改了。另外,晓东服务器没问题吧,怎么打开网页 ...

测试了你的图形,2008下,三条曲线都没有问题

  1. 令: (xdrx_curve_info (car (entsel)))

  2. 选择对象: (("Perimeter" 59.1002) ("Area" 306.085) ("Centroid" (3873.45 1357.92))
  3. ("MomInertia" 5.6441e+008 4.59238e+009) ("ProdInertia" 1.60995e+009)
  4. ("PrinMoments" 7457.72 8080.82) ("PrinAxes" (0.604355 0.796715) (-0.796715
  5. 0.604355)) ("RadGyration" 1357.93 3873.45) ("Box" (3864.02 1347.7) (3893.44
  6. 1376.55)))

  7. 命令: (xdrx_curve_info (car (entsel)))

  8. 选择对象: (("Perimeter" 50.833) ("Area" 324.995) ("Centroid" (3904.1 1354.22))
  9. ("MomInertia" 5.96017e+008 4.95357e+009) ("ProdInertia" 1.71825e+009)
  10. ("PrinMoments" 7499.78 9586.81) ("PrinAxes" (0.996754 -0.0805023) (0.0805023
  11. 0.996754)) ("RadGyration" 1354.23 3904.1) ("Box" (3893.45 1345.11) (3914.63
  12. 1364.06)))

  13. 命令: (xdrx_curve_info (car (entsel)))

  14. 选择对象: (("Perimeter" 45.7777) ("Area" 127.21) ("Centroid" (3850.63 1371.09))
  15. ("MomInertia" 2.39141e+008 1.88618e+009) ("ProdInertia" 6.7161e+008)
  16. ("PrinMoments" 1899.16 957.533) ("PrinAxes" (1.0 0.0) (0.0 1.0)) ("RadGyration"
  17. 1371.09 3850.63) ("Box" (3845.88 1364.4) (3855.38 1377.78)))

复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-9-10 11:52:54 | 显示全部楼层
批标面积改版
  1. (defun c:tt ( / ar pt s1 ss th)
  2.   (if (setq ss (ssget '((0 . "*line,arc,circle,ellipse"))))
  3.     (progn
  4.       (xdrx_setsstodb ss 0)
  5.       (while (setq s1 (xdrx_getentdata 0)
  6.                    th (getvar "dimscale")
  7.                    pt (cadr (assoc "Centroid" (xdrx_curve_info s1)))
  8.                    ar (rtos (cadr (assoc "Area" (xdrx_curve_info s1))) 2 2)
  9.              )
  10.         (vl-cmdf "text" "j" "mc" pt th "" (strcat "面积=" ar "平方米") "")
  11.       )
  12.     )
  13.   )
  14.   (princ)
  15. )

点评

while 里面不要写那么多,就一个获得E的代码就够,选择集遍历完,E为NIL,结束循环,别在SETQ里面后面加那么多别的语句,这样就容易出错,因为SETQ最后一个赋值才是SETQ返回给WHILE判断的条件。  详情 回复 发表于 2013-9-10 11:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-10 11:55:15 | 显示全部楼层
本帖最后由 newer 于 2013-9-10 11:56 编辑


你试试,下面代码还保错不。
  1. (defun c:tt (/ i len pt s1 ss)
  2.   (if (setq ss (ssget)
  3.             i -1
  4.       )
  5.     (while (setq s1 (ssname ss (setq i (1+ i))))
  6.       (setq len (getvar "dimscale")
  7.             pt (cadr (assoc "Centroid" (xdrx_curve_info s1)))
  8.       )
  9.       (if pt
  10.         (vl-cmdf "pline" (polar pt (/ pi 2) (* len 5)) pt (polar pt 0 (* len 5)) "")
  11.       )
  12.     )
  13.   )
  14.   (princ)
  15. )


点评

ok了,谢谢提醒,没注意这里面的区别,已经改了!  详情 回复 发表于 2013-9-10 12:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-10 11:58:15 | 显示全部楼层

while 里面不要写那么多,就一个获得E的代码就够,选择集遍历完,E为NIL,结束循环,别在SETQ里面后面加那么多别的语句,这样就容易出错,因为SETQ最后一个赋值才是SETQ返回给WHILE判断的条件。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-9-10 11:59:26 | 显示全部楼层
批标质心改版
  1. (defun c:tt ( / ar i pt s1 ss len)
  2.   (if (setq ss (ssget '((0 . "*line,arc,circle,ellipse")))
  3.       )
  4.       (progn
  5.               (xdrx_setsstodb ss 0)
  6.     (while (setq s1 (xdrx_getentdata 0)
  7.                  len (getvar "dimscale")
  8.                  pt (cadr (assoc "Centroid" (xdrx_curve_info s1)))
  9.            )
  10.       (xdrx_polyline_make (polar pt (/ pi 2) (* len 5)) pt (polar pt 0 (* len 5)) t)
  11.     )
  12.   )
  13. )
  14.   (princ)
  15. )

点评

没有看到上面帮你修改的代码吗? 你的代码,在WHILE循环判断结束里面,在选择集遍历完毕后,S1等于NIL了,应该结束,可你还要运行了 len (getvar "dimscale") pt (cadr (assoc "Centroid" (xdrx_curve_info s  详情 回复 发表于 2013-9-10 12:08
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-10 12:08:09 | 显示全部楼层

没有看到上面帮你修改的代码吗?

你的代码,在WHILE循环判断结束里面,在选择集遍历完毕后,S1等于NIL了,应该结束,可你还要运行了
len (getvar "dimscale")
pt (cadr (assoc "Centroid" (xdrx_curve_info s1)))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 01:27 , Processed in 0.233643 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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