明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1694|回复: 5

【讨论】:求选择集左下角点的最快的方法(已附3种源码和测试图形及时间)

[复制链接]
发表于 2012-5-11 22:35 | 显示全部楼层 |阅读模式
1明经币
本帖最后由 sfzyr 于 2012-5-12 12:24 编辑

选择一堆图形,自动求得其“左下角” 经常在实用程序中用到,比如自动坐标标注 (三个视图默认左下角为坐标的0点),这是就要用到,今天写一个 模拟 :"ctrl +shift +v”  建立一个图块,(也以左下角为基点,但是以“图层名+视图位置编号”为块名) 可是人家的ctrl +shift +v就是速度快,几万个数据点,也看不出假死现象,我写了三种方法,速度都慢,现把三种方法贴上,希望大家讨论,并给出最好的程序,最快求得“左下角” 坐标??
注:选择对象不含 "CENTER"  "ARC" "HATCH" "TEXT" "MTEXT" "ATTDEF"

法一:求点集list  ,对点表 按 x排序,取最小x ,对电表按照 y排序取 最小y ,最终求得 左下角(x y)



  1. (defun data_num (xx lstSel_xx / data_xx)
  2.   (setq data_xx nil)
  3.   (setq lstSel_xx (member (assoc xx lstSel_xx) lstSel_xx))
  4.   (while lstSel_xx
  5.     (setq data_xx (cons (cdr (car lstSel_xx)) data_xx))
  6.     (setq
  7.       lstSel_xx (member (assoc xx (cdr lstSel_xx)) (cdr lstSel_xx))
  8.     )
  9.   )
  10.   data_xx
  11. )
  12. (defun sub_getdata
  13.      (objSel    /  data   data10    data11
  14.       ssIndex   objLen objCur   lstSel    objtype
  15.       entCur
  16.      )
  17.   (vl-load-com)
  18.   (setq data nil)
  19.   (setq ssIndex 0)
  20.   (setq objLen (sslength objSel))
  21.   (repeat objLen
  22.     (setq objCur (ssname objSel ssIndex))
  23.     (setq lstSel (entget objCur))
  24.     (setq objtype (cdr (assoc '6 lstSel)))
  25.     (setq entCur (cdr (assoc '0 lstSel)))
  26.     (if (and (/= objtype "CENTER")
  27.       (/= entCur "ARC")
  28.       (/= entCur "HATCH")
  29.       (/= entCur "TEXT")
  30.       (/= entCur "MTEXT")
  31.       (/= entcur "ATTDEF")
  32. )
  33.       (progn
  34. (setq data10 (data_num 10 lstsel))
  35. (setq data11 (data_num 11 lstsel))
  36. (setq data (append (append data10 data11) data))
  37.       )
  38.     )
  39.     (setq ssIndex (+ ssIndex 1))
  40.   )
  41.   (setq data (vl-remove nil data))
  42. )
  43. ;;;====================================================================
  44. (defun sub_minx (data_xsrt / datax e1 e2 minx)
  45.   (vl-load-com)
  46.   (setq datax
  47.   (vl-sort data_xsrt
  48.     (function (lambda (e1 e2) (< (car e1) (car e2))))
  49.   )
  50.   )
  51.   (setq minx (car (car datax)))
  52. )
  53. ;;;====================================================================
  54. (defun sub_miny (data_ysrt / datay e3 e4 miny)
  55.   (vl-load-com)
  56.   (setq datay
  57.   (vl-sort data_ysrt
  58.     (function (lambda (e3 e4) (< (cadr e3) (cadr e4))))
  59.   )
  60.   )
  61.   (setq miny (cadr (car datay)))
  62. )
  63. (defun c:t1
  64.        (/ oldOsm oldCmdecho selset t0 ssdata ssminx ssminy wd_bpnt)
  65.   (setq oldOsm (getvar "OSMODE"))
  66.   (setq oldCmdecho (getvar "CMDECHO"))
  67.   (setvar "OSMODE" 0)
  68.   (setvar "CMDECHO" 0)
  69.   (setq selset (ssget))
  70.   (if selset
  71.     (progn
  72.       (setq t0 (getvar "TDUSRTIMER"))
  73.       (setq ssdata (sub_getdata selset))
  74.       (setq ssminx (sub_minx ssdata))
  75.       (setq ssminy (sub_miny ssdata))
  76.       (setq wd_bpnt (list ssminx ssminy))
  77.       (princ (* (- (getvar "TDUSRTIMER") t0) 86400))
  78.       (princ "秒,最小x,y是:")
  79.       wd_bpnt
  80.     )
  81.   )
  82. )


法二:用vla-GetBoundingBox 求点表 在对点表求最小(x y)

  1. (defun get_all_rectang (/ ss pt_list sn n en pt1 pt2)
  2.   (setq ss (ssget "p"
  3.     '((-4 . "<not")
  4.       (0 . "LEADER,CENTER,ARC,HATCH,TEXT,MTEXT,ATTDEF")
  5.       (-4 . "not>")
  6.      )
  7.     )
  8.   )
  9.   (setq pt_list '())
  10.   (setq sn (sslength ss))
  11.   (setq n -1)
  12.   (repeat sn
  13.     (setq en (ssname ss (setq n (1+ n))))
  14.     (vla-GetBoundingBox (vlax-ename->vla-object en) 'pt1 'pt2)
  15.     (setq pt_list (cons (vlax-safearray->list pt1) pt_list))
  16.     ;;(setq pt_list (cons (vlax-safearray->list pt2) pt_list))
  17.   )
  18.   (setq pt1 (apply 'mapcar (cons 'min pt_list)))
  19. )
  20. (defun c:t2
  21.      (/ oldOsm oldCmdecho selset t0 wd_bpnt)
  22.   (setq oldOsm (getvar "OSMODE"))
  23.   (setq oldCmdecho (getvar "CMDECHO"))
  24.   (setvar "OSMODE" 0)
  25.   (setvar "CMDECHO" 0)
  26.   (setq selset (ssget))
  27.   (if selset
  28.     (progn
  29.       (setq t0 (getvar "TDUSRTIMER"))
  30.       (setq wd_bpnt (get_all_rectang))
  31.       (princ (* (- (getvar "TDUSRTIMER") t0) 86400))
  32.       (princ "秒,最小x,y是:")
  33.       wd_bpnt
  34.     )
  35.   )
  36. )


法三:用 ET工具里求极限点的函数 (ACET-GEOM-SS-EXTENTS SS t)


  1. (defun c:t3 (/ oldOsm oldCmdecho selset t0 wd_bpnt)
  2.   (setq oldOsm (getvar "OSMODE"))
  3.   (setq oldCmdecho (getvar "CMDECHO"))
  4.   (setvar "OSMODE" 0)
  5.   (setvar "CMDECHO" 0)
  6.   (setq selset (ssget))
  7.   (if selset
  8.     (progn
  9.       (setq t0 (getvar "TDUSRTIMER"))
  10.       (setq
  11. ss (ssget "p"
  12.     '((-4 . "<not")
  13.       (0 . "LEADER,CENTER,ARC,HATCH,TEXT,MTEXT,ATTDEF")
  14.       (-4 . "not>")
  15.      )
  16.     )
  17.       )
  18.       (setq wd_bpnt (car (ACET-GEOM-SS-EXTENTS SS t)))
  19.       (princ (* (- (getvar "TDUSRTIMER") t0) 86400))
  20.       (princ "秒,最小x,y是:")
  21.       wd_bpnt
  22.     )
  23.   )
  24. )

对下图运算后:


时间如下:

命令: t1
选择对象: 指定对角点: 找到 14400 个
选择对象:
44.235秒,最小x,y是:(-384.388 -172.718)
命令:
命令: t2
选择对象: 指定对角点: 找到 14400 个
选择对象:
1.672秒,最小x,y是:(-384.388 -172.718 0.0)
命令:
命令: t3
选择对象: 指定对角点: 找到 14400 个
选择对象:
4.156秒,最小x,y是:(-384.388 -172.718 0.0)
命令


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

最佳答案

查看完整内容

其中对et函数(ACET-GEOM-SS-EXTENTS SS t) 不解,内部不知道什么算法。用时居然超过 t2 方法 注明:不知道各位运算时间怎样,与配置是否有关 我电脑的配置 电脑型号 技嘉 GA-880G-UD3H 台式电脑 操作系统 Windows XP 专业版 32位 SP3 ( DirectX 9.0c ) 处理器 AMD Athlon(速龙) II X4 640 四核 主板 技嘉 GA-880G-UD3H (AMD 760G/780G/780V/785G/790GX/880G/890GX) ...

评分

参与人数 1明经币 +1 收起 理由
328302216 + 1 赞一个!

查看全部评分

 楼主| 发表于 2012-5-11 22:35 | 显示全部楼层
本帖最后由 sfzyr 于 2012-5-11 23:01 编辑

其中对et函数(ACET-GEOM-SS-EXTENTS SS t)

不解,内部不知道什么算法。用时居然超过 t2 方法

注明:不知道各位运算时间怎样,与配置是否有关 我电脑的配置

        
电脑型号        技嘉 GA-880G-UD3H 台式电脑
操作系统        Windows XP 专业版 32位 SP3 ( DirectX 9.0c )
        
处理器        AMD Athlon(速龙) II X4 640 四核
主板        技嘉 GA-880G-UD3H (AMD 760G/780G/780V/785G/790GX/880G/890GX)
内存        2 GB ( 金士顿 DDR3 1333MHz )
主硬盘        希捷 ST31000524AS ( 1 TB / 7200 转/分 )
显卡        ATI Radeon HD 5600/5700  ( 512 MB / HIS )


望各位版主,各位高手给出个优化算法,谢谢!!
回复

使用道具 举报

 楼主| 发表于 2012-5-11 22:40 | 显示全部楼层
本帖最后由 sfzyr 于 2012-5-11 22:59 编辑

第一次发有代码的帖子,希望给予支持,得到满意答案,谢谢!

为什么 “ctrl + shift + v” 马上就算出了左下角??不解
回复

使用道具 举报

发表于 2012-12-18 09:27 | 显示全部楼层
这贴要得,学习了   顶一下
回复

使用道具 举报

发表于 2012-12-18 09:38 | 显示全部楼层
T3  出错   命令: T3

选择对象: 指定对角点: 找到 11 个

选择对象:  ; 错误: no function definition: ACET-GEOM-SS-EXTENTS
回复

使用道具 举报

发表于 2012-12-18 09:41 | 显示全部楼层
t1  t2 有圆弧的没把圆弧也计算进去 圆的话算的是圆心……  期待完善
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-18 22:39 , Processed in 0.170185 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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