找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3916|回复: 33

[研讨] 【炫翔】函数是否还有优化的空间

[复制链接]

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2013-9-12 10:19:11 | 显示全部楼层 |阅读模式

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

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

×
  1. ;功能:指定图元最小外接矩形的九点坐标 9点
  2. ;;;(xx-9pt 实体名 参数)
  3. ;上:7 8 9 中:4 5 6  下:1 2 3
  4. ;;;参数=1~9,上中下9位码;其他均为左下角点
  5. ;7 8 9
  6. ;4 5 6
  7. ;1 2 3
  8. ;(xx-9pt (CAR(ENTSEL)) 5)
  9. (defun xx-9pt (s1 mode / dx dy pt maxp minp x1 x2 y1 y2)
  10.    (setq s1 (vlax-ename->vla-object s1))
  11.    (vla-getboundingbox s1 'minpoint 'maxpoint)
  12.    (setq maxp (vlax-safearray->list maxpoint);取得第9点
  13.          minp (vlax-safearray->list minpoint);取得第1点
  14.               x1  (car minp)
  15.               x2  (car maxp)
  16.               y1  (cadr minp)
  17.               y2  (cadr maxp)
  18.               dx  (* (- x2 x1) 0.5)
  19.               dy  (* (- y2 y1) 0.5)
  20.    )
  21.    (cond ((= mode 1) (setq pt minp))
  22.          ((= mode 2) (setq pt (list (+ x1 dx) y1 0.0)))
  23.          ((= mode 3) (setq pt (list x2 y1 0.0)))
  24.          ((= mode 4) (setq pt (list x1 (+ y1 dy)0.0)))
  25.          ((= mode 5) (setq pt (list (+ x1 dx) (+ y1 dy)0.0)))
  26.          ((= mode 6) (setq pt (list x2 (+ y1 dy)0.0)))
  27.          ((= mode 7) (setq pt (list x1 y2 0.0)))
  28.          ((= mode 8) (setq pt (list (+ x1 dx) y2 0.0)))
  29.          ((= mode 9) (setq pt maxp))
  30.          (t (setq pt minp))
  31.    )
  32.    pt
  33. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-12 10:35:39 | 显示全部楼层
是程序就有继续完善的空间,

炫版,试试你的函数对 裁剪块,MTEXT,UCS下,图形有转角,是否都能正确求出准确的9点坐标?

点评

newer版主,你考虑了 裁剪块,MTEXT,UCS下,图形有转角等情况,更通用了,能否贴出来我们学习一下?  详情 回复 发表于 2013-9-12 11:34
当然是不能的,这里只是相对的  发表于 2013-9-12 10:44
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 10398个

财富等级: 富甲天下

发表于 2013-9-12 10:55:07 | 显示全部楼层
  1. ;功能:指定图元最小外接矩形的九点坐标 9点
  2. ;;;(xx-9pt 实体名 参数)
  3. ;上:7 8 9 中:4 5 6  下:1 2 3
  4. ;;;参数=1~9,上中下9位码;其他均为左下角点
  5. ;7 8 9
  6. ;4 5 6
  7. ;1 2 3
  8. ;(xx-9pt (CAR(ENTSEL)) 5)
  9. (defun xx-9pt (s1 mode / dx dy pt maxp minp x1 x2 y1 y2)
  10. (setq s1 (vlax-ename->vla-object s1))
  11. (vla-getboundingbox s1 'minpoint 'maxpoint)
  12. (setq maxp (vlax-safearray->list maxpoint);取得第9点
  13.        minp (vlax-safearray->list minpoint);取得第1点
  14.        x1  (car minp)
  15.        x2  (car maxp)
  16.        y1  (cadr minp)
  17.        y2  (cadr maxp)
  18.        dx  (* (- x2 x1) 0.5)
  19.        dy  (* (- y2 y1) 0.5)
  20. )
  21. (cond
  22.   ((= mode 1) minp)
  23.   ((= mode 2) (list (+ x1 dx) y1 0.0))
  24.   ((= mode 3) (list x2 y1 0.0))
  25.   ((= mode 4) (list x1 (+ y1 dy) 0.0))
  26.   ((= mode 5) (list (+ x1 dx) (+ y1 dy)0.0))
  27.   ((= mode 6) (list x2 (+ y1 dy)0.0))
  28.   ((= mode 7) (list x1 y2 0.0))
  29.   ((= mode 8) (list (+ x1 dx) y2 0.0))
  30.   ((= mode 9) maxp)
  31.   (t minp)
  32. )
  33. )

点评

XP好像不是第9点吧,应该是第5点吧?  详情 回复 发表于 2013-9-12 11:09

评分

参与人数 1D豆 +5 收起 理由
炫翔 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

 楼主| 发表于 2013-9-12 11:06:52 | 显示全部楼层
另一种方法<不过速度好像还慢些,供参考
  1. (defun xx-9pt (s1 mode / np xd xp xyd yd)
  2.    (setq s1 (vlax-ename->vla-object s1))
  3.    (vla-getboundingbox s1 'minpoint 'maxpoint)
  4.    (setq xp (vlax-safearray->list maxpoint);取得第9点
  5.          np (vlax-safearray->list minpoint);取得第1点
  6.    )
  7.   (setq xyd(mapcar (function (lambda (a b c) (abs (- a b)))) xp np '(0 0)));(xd yd)
  8.   (setq xd(car xyd) yd(cadr xyd))
  9.    (cond ((= mode 1) np)
  10.          ((= mode 2) (polar np (* pi 2) (* xd 0.5)))
  11.          ((= mode 3) (polar np (* pi 2) xd))
  12.          ((= mode 4) (polar np (* pi 0.5) (* yd 0.5)))
  13.          ((= mode 5) (list (+ (car np) (* xd 0.5)) (+ (cadr np) (* yd 0.5))0.0))
  14.          ((= mode 6) (polar xp (* 1.5 pi) (* yd 0.5)))
  15.          ((= mode 7) (polar np (* pi 0.5) yd))
  16.          ((= mode 8) (polar xp 0 (* xd 0.5)))
  17.          ((= mode 9) xp)
  18.          (t np)
  19.    )
  20. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-12 11:09:52 | 显示全部楼层
本帖最后由 newer 于 2013-9-12 11:13 编辑

MAXXP好像不是第9点吧,应该是第5点吧?

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-12 11:16:59 | 显示全部楼层
继续讨论前 ,应该首先定义下你的9点是什么位置? 定义的不一样,肯定就不同了。

我的定义是 逆时针方向 0-7, 加一个最后的中心点9, 你呢?

点评

9点的位置顺序定义,最好要和MTEXT 附着点的顺序一致:这样取得位置点后方便后续编程利用!  详情 回复 发表于 2013-9-12 13:18
789456 123 分别是9点位置,5在中心,1在左下点,9在右上点  详情 回复 发表于 2013-9-12 11:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

 楼主| 发表于 2013-9-12 11:18:52 | 显示全部楼层
newer 发表于 2013-9-12 11:16
继续讨论前 ,应该首先定义下你的9点是什么位置? 定义的不一样,肯定就不同了。

我的定义是 逆时针方向 ...

789456
123


分别是9点位置,5在中心,1在左下点,9在右上点

点评

支持这种小键盘排位法~~~~对于我们这些E文不懂的人来说很容易记  详情 回复 发表于 2013-9-12 20:20
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 862个

财富等级: 财运亨通

发表于 2013-9-12 11:24:46 | 显示全部楼层
院长的9点坐标~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~···
  1. (defun xyp-9Pt (ename site / MinPT MaxPT p1 p9 p5 p3 p7 p2 p4 p6 p8)
  2.   (defun mid (p1 p2)(mapcar '(lambda (x) (* x 0.5)) (mapcar '+ p1 p2)))
  3.   (setq ename (cond ((= (type ename) 'ENAME) (vlax-ename->vla-object ename))
  4.              ((= (type ename) 'VLA-OBJECT) ename)
  5.               )
  6.   )
  7.   (vla-getboundingbox ename 'MinPT 'MaxPT)
  8.   (setq p1 (vlax-safearray->list MinPT)
  9.         p9 (vlax-safearray->list MaxPT)
  10.         p5 (mid p1 p9)
  11.         p3 (if (< (car p9) (car p1))
  12.              (list (car p1) (cadr p9) (caddr p1))
  13.              (list (car p9) (cadr p1) (caddr p1))
  14.            )
  15.         p7 (if (< (car p9) (car p1))
  16.              (list (car p9) (cadr p1) (caddr p9))
  17.              (list (car p1) (cadr p9) (caddr p9))
  18.            )
  19.         p2 (mid p1 p3)
  20.         p4 (mid p1 p7)
  21.         p6 (mid p3 p9)
  22.         p8 (mid p7 p9)
  23.   )
  24.   (nth (- site 1) (list p1 p2 p3 p4 p5 p6 p7 p8 p9))
  25. )

点评

院长的测试时间;目前最慢  详情 回复 发表于 2013-9-12 11:29

评分

参与人数 1D豆 +5 收起 理由
炫翔 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

 楼主| 发表于 2013-9-12 11:29:18 | 显示全部楼层
zhangq_cai1 发表于 2013-9-12 11:24
院长的9点坐标~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~···

院长的测试时间;目前最慢
  1. (defun get-utime()(* 86400.0 (getvar"tdusrtimer")))
  2. (defun c:xx (/ i s1 ss t1 t2)
  3.   (setq ss (ssget '((0 . "text")))
  4.         i -1
  5.   )
  6.   (setq t1 (get-utime))
  7.   (while (setq s1 (ssname ss (setq i (1+ i))))
  8.     (xyp-9Pt s1 5)
  9.   )
  10.   (setq t2 (get-utime))
  11.   (PRINC (list 0 0 (- t2 t1)))
  12.   (princ)
  13. )

  14. ;时间:9.172

点评

具体到这个问题是,不能以大作借口啊,你的函数的参数是实体名, mtext 块这些的,你不准备做参数吗? 如果把mtext 实体做参数放你这个函数里面,你不是一样要计算吗? 可你计算的结果不对啊。 不能让用户再去做  详情 回复 发表于 2013-9-12 11:46
讨论帖子嘛,把具体运行时间贴出来吧,大家上下看着好比较,不能让大家回去自己运行啊。  详情 回复 发表于 2013-9-12 11:33
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-12 11:33:08 | 显示全部楼层
炫翔 发表于 2013-9-12 11:29
院长的测试时间;目前最慢

讨论帖子嘛,把具体运行时间贴出来吧,大家上下看着好比较,不能让大家回去自己运行啊。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-9-12 11:34:37 | 显示全部楼层
newer 发表于 2013-9-12 10:35
是程序就有继续完善的空间,

炫版,试试你的函数对 裁剪块,MTEXT,UCS下,图形有转角,是否都能正确求 ...

newer版主,你考虑了 裁剪块,MTEXT,UCS下,图形有转角等情况,更通用了,能否贴出来我们学习一下?

点评

现成的,函数发布里面都有  详情 回复 发表于 2013-9-12 11:49
通用函数弄的太大不是件好事,其他的情况都是单独的处理  发表于 2013-9-12 11:40
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

 楼主| 发表于 2013-9-12 11:40:52 | 显示全部楼层
  1. ;7 8 9
  2. ;4 5 6
  3. ;1 2 3
  4. (defun xx-9pt (s1 mode / np p6 xd xp yd)
  5.    (setq s1 (vlax-ename->vla-object s1))
  6.    (vla-getboundingbox s1 'minpoint 'maxpoint)
  7.    (setq xp (vlax-safearray->list maxpoint);取得第9点
  8.          np (vlax-safearray->list minpoint);取得第1点
  9.    )
  10.    (setq p6(list(car xp)(cadr np) 0.0))
  11.    (setq xd(distance np p6) yd(distance xp p6))
  12.    (cond ((= mode 1) np)
  13.          ((= mode 2) (polar np (* pi 2) (* xd 0.5)))
  14.          ((= mode 3) p6)
  15.          ((= mode 4) (polar np (* pi 0.5) (* yd 0.5)))
  16.          ((= mode 5) (list (+ (car np) (* xd 0.5)) (+ (cadr np) (* yd 0.5))0.0))
  17.          ((= mode 6) (polar xp (* 1.5 pi) (* yd 0.5)))
  18.          ((= mode 7) (polar np (* pi 0.5) yd))
  19.          ((= mode 8) (polar xp 0 (* xd 0.5)))
  20.          ((= mode 9) xp)
  21.          (t np)
  22.    )
  23. )
  24. ;下面是测试程序(1560 个文字)
  25. ;7.343秒;炫翔旧
  26. ;7.844秒;院长
  27. ;7.328秒;炫翔新
  28. (defun get-utime()(* 86400.0 (getvar"tdusrtimer")))
  29. (defun c:xx (/ i s1 ss t1 t2)
  30.   (setq ss (ssget '((0 . "text")))
  31.         i -1
  32.   )
  33.   (setq t1 (get-utime))
  34.   (while (setq s1 (ssname ss (setq i (1+ i))))
  35.    (mapcar '(lambda (x) (xx-9pt s1 x)) '(1 2 3 4 5 6 7 8 9))
  36.   )
  37.   (setq t2 (get-utime))
  38.   (PRINC (list 0 0 (- t2 t1)))
  39.   (princ)
  40. )

评分

参与人数 1D豆 +3 收起 理由
/db_自贡黄明儒_ + 3 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-12 11:46:09 | 显示全部楼层
炫翔 发表于 2013-9-12 11:29
院长的测试时间;目前最慢

具体到这个问题是,不能以大作借口啊,你的函数的参数是实体名, mtext 块这些的,你不准备做参数吗? 如果把mtext 实体做参数放你这个函数里面,你不是一样要计算吗? 可你计算的结果不对啊。

不能让用户再去做个函数去处理MTEXT啊。

函数就是个黑盒子,你能做的都放里面,用户用着就舒心了。

点评

特殊情况只能特殊处理的,不然N多这种情况,头都大了  发表于 2013-9-12 11:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-12 11:49:45 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-9-12 11:34
newer版主,你考虑了 裁剪块,MTEXT,UCS下,图形有转角等情况,更通用了,能否贴出来我们学习一下?

现成的,函数发布里面都有

  1. ;|
  2. 获得实体或选集的9个特征点
  3. 参数:
  4.    e --- 实体或选择集
  5. 返回值:
  6.    点表
  7. 说明:特征点,左下第一点,然后逆时针,中心点最后
  8. 基于当前UCS平行的包围盒
  9. |;
  10. (defun XD::Geom:9pt (e / box)
  11.    (setq box (XD::Entity:BOX e))
  12.    (XD::Geom:BOX->9PT box)
  13. )
  14. ;|
  15. 获得实体或选择集9点中的指定点
  16. 参数:
  17.    e --- 实体或选择集
  18.    index--指定索引(0-8)
  19. 返回值:
  20.    点
  21. |;
  22. (defun XD::Geom:Get9PT(e index / box)
  23.    (setq box (XD::Geom:9pt e))
  24.    (nth index e)
  25. )         


  26. ;|
  27. 包围盒4点得到9点坐标
  28. 参数:
  29.   box --- 点表(4个)

  30. 返回值:

  31.   点表(9点)
  32. |;
  33. (defun XD::Geom:BOX->9PT (box / p0 p1 p2 p3 p4 p5 p6 p7 p8)
  34.   (setq p0 (nth 0 box)
  35.         p2 (nth 1 box)
  36.         p1 (xdrx_midp p0 p2)
  37.         p4 (nth 2 box)
  38.         p3 (xdrx_midp p2 p4)
  39.         p6 (nth 3 box)
  40.         p5 (xdrx_midp p4 p6)
  41.         p7 (xdrx_midp p0 p6)
  42.         p8 (xdrx_midp p0 p4)
  43.   )
  44.   (list p0 p1 p2 p3 p4 p5 p6 p7 p8)
  45. )


点评

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-9-12 12:01:22 | 显示全部楼层
现在电脑速度越来越快,所以我认为考虑通用是必要的。但你这个看不出对裁剪块,MTEXT,UCS是如何处理的。

点评

一个函数一个函数往上面找。不能在最终的应用函数,还要把那些基础的代码都写到一起啊。 UCS的,看 XD::Entity:BOX mtext,clipblock的,API直接就提供了 xdrx_entity_box ,你可以拿这个函数,去试试MTEXT,CLIPBL  详情 回复 发表于 2013-9-12 12:09
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 12:13 , Processed in 0.223618 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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