找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: eachy

[他山之石] 一个排序函数,应用慢慢添加

  [复制链接]
发表于 2013-5-18 11:53:56 | 显示全部楼层
发帖看帖:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2013-5-18 12:22:31 | 显示全部楼层
由于函数无说明,自己估的,mode应该只有0 1,key应该只有1 2 3 4,建议:第一应该控制用户的输入,第二可否像ossnap一样用位去控制,这样mode和key就可以只留一个参数,下面我mode取1000key取10000都没报错。
(setq lst '((53366.0 39118.1 0.0)
            (50864.3 38429.3 0.0)
            (49179.4 38735.4 0.0)
            (49996.3 40036.6 0.0)
            (53366.0 41337.8 0.0)
            (51834.3 42562.4 0.0)
            (50124.0 42741.0 0.0)
            (48924.1 40878.5 0.0)
          )
      mod 1000
      key 10000
      vx  1.e-6
)
(ybl-ent-sort lst mod key vx)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 396个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2013-5-18 19:23:52 | 显示全部楼层
  1. ;;********************************************************
  2. ;;示例一:将文字按要求排序号                              
  3. ;;********************************************************
  4. (defun c:t1 (/ ss ssl e elst el n k1 k2 d pre sub)
  5.   (if (and (setq ss (ssget '((0 . "text"))))
  6.      (progn
  7.        (initget "0 1")
  8.        (setq k1 (getkword "\n[0 -按行/1 -按列]:"))
  9.      )
  10.      (progn
  11.        (initget "1 2 3 4")
  12.        (setq k2
  13.         (getkword
  14.           "\n[1-左上至右下/2-右上至左下/3-右下至左上/4-左下至右上]:"
  15.         )
  16.        )
  17.      )
  18.      (setq d (getdist "\n输入允许误差: "))
  19.       )
  20.     (progn
  21.       (setq ssl (sslength ss))
  22.       (while (> ssl 0)
  23.   (setq e (ssname ss (setq ssl (1- ssl))))
  24.   (setq elst (cons (list (cdr (assoc 10 (entget e))) e) elst))
  25.       )
  26.       (setq pre  "K+" ;_ 前缀
  27.     ;;sub  "A" ;_ 后缀
  28.       )
  29.       (setq el (mapcar '(lambda (x) (mapcar 'cadr x))
  30.            (ybl-ent-sort elst (atoi k1) (atoi k2) d)
  31.          )
  32.       )
  33.       (setq n 1) ;_ 起始值,
  34.       (mapcar
  35.   '(lambda (x)
  36.      (mapcar
  37.        '(lambda (e1)
  38.     (setq el (entget e1))
  39.     (entmod  (subst (cons 1
  40.              (strcat pre ;_ 前缀
  41.                (if (< n 10)
  42.                  (strcat "0" (itoa n))
  43.                  (itoa n)
  44.                ) ;_ 可以进行格式化
  45.                ;; sub;_ 后缀
  46.              )
  47.              )
  48.              (assoc 1 el)
  49.              el
  50.       )
  51.     )
  52.     (setq n (1+ n)) ;_ 可以定义步距
  53.         )
  54.        x
  55.      )
  56.    )
  57.   el
  58.       )
  59.     )
  60.   )
  61.   (princ)
  62. )

评分

参与人数 1D豆 +5 收起 理由
牢固 + 5 技术引导讨论和指点奖!

查看全部评分

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2013-5-18 19:29:50 | 显示全部楼层
  1. ;;实体排序示例二,按行连接文字
  2. (defun ea:Clearcset (/ cset)
  3.   (if (not (vl-catch-all-error-p
  4.       (setq cset
  5.       (vl-catch-all-apply
  6.         'vla-item
  7.         (list
  8.    (vlax-get-property
  9.      (vlax-get-property
  10.        (vlax-get-acad-object)
  11.        'activedocument
  12.      )
  13.      'selectionsets
  14.    )
  15.    "CURRENT"
  16.         )
  17.       )
  18.       )
  19.     )
  20.       )
  21.     (vla-delete cset)
  22.   )
  23.   (princ)
  24. )
  25. ;;构造实体表要根据需要决定采用 Object 还是 Entity,这样才能精简代码并提高效率
  26. (vl-load-com)
  27. (defun c:t3 (/ objlst tlst first_obj strlst fstr)
  28.   (ea:clearcset) ;_ 此处必须,原因见以前讨论帖
  29.   (princ "\n选择按行连接文字...")
  30.   (if (ssget '((0 . "text")))
  31.     (progn
  32.       ;;获取实体表
  33.       (vlax-map-collection
  34. (vlax-get-property
  35.    (vlax-get-property (vlax-get-acad-object) 'activedocument)
  36.    'activeselectionset
  37. )
  38. '(lambda (x)
  39.     (setq objlst
  40.     (cons (list (vlax-get x 'insertionpoint) x) objlst)
  41.     )
  42.     (if (not hi)
  43.       (setq hi (vlax-get-property x 'height))
  44.     ) ;_ 取字高作为误差,仅取一次
  45.   )
  46.       ) ;_ end vlax-map-colllection
  47.       ;;排序并处理
  48.       (setq tlst      (mapcar '(lambda (x) (mapcar 'cadr x))
  49.          (ybl-ent-sort objlst 0 1 hi) ;_ 按行排序
  50.         ) ;_ 排序后实体表
  51.      first_obj (mapcar 'car tlst) ;_每行第一个实体列表
  52.      strlst    (mapcar '(lambda (x) (mapcar 'vla-get-textstring x))
  53.          tlst
  54.         ) ;_ 每行字符串列表
  55.      fstr      (mapcar '(lambda (x) (apply 'strcat x)) strlst) ;_合并每行字符串
  56.       )
  57.       (mapcar '(lambda (a b) (vlax-put-property a 'textstring b))
  58.        first_obj
  59.        fstr
  60.       ) ;_ 修改每行第一个文字
  61.       (mapcar '(lambda (x) (mapcar 'vla-delete x))
  62.        (vl-remove nil (mapcar '(lambda (e) (cdr e)) tlst))
  63.       ) ;_ 删除每行第二个以后的实体
  64.     )
  65.   )
  66.   (princ)
  67. )

评分

参与人数 1D豆 +5 收起 理由
牢固 + 5 技术引导讨论和指点奖!

查看全部评分

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2013-5-18 20:05:06 | 显示全部楼层
  1. ;;排序示例三:行对齐(文字)
  2. (defun c:t4 (/ objlst tlst ptl hi)
  3.   (ea:clearcset) ;_ 此处必须,原因见以前讨论帖
  4.   (princ "\n选择按行对齐文字...")
  5.   (if (ssget '((0 . "text")))
  6.     (progn
  7.       ;;获取实体表
  8.       (vlax-map-collection
  9. (vlax-get-property
  10.    (vlax-get-property (vlax-get-acad-object) 'activedocument)
  11.    'activeselectionset
  12. )
  13. '(lambda (x / bb uu)
  14.     (vla-getboundingbox x 'bb 'uu) ;_还可以用来做实体对齐
  15.     (setq objlst
  16.     (cons (list (safearray-value bb) x) objlst)
  17.     )
  18.     (if (not hi)
  19.       (setq hi (vlax-get-property x 'height))
  20.     ) ;_ 取字高作为误差,仅取一次
  21.   )
  22.       ) ;_ end vlax-map-colllection
  23.       ;;排序并处理
  24.       (setq tlst   (ybl-ent-sort objlst 0 1 hi) ;_ 按行排序
  25.      objlst (mapcar '(lambda (x) (mapcar 'cadr x))
  26.       tlst
  27.      ) ;_ 排序后实体表
  28.      ptl    (mapcar '(lambda (x) (caar x)) tlst) ;_每行第一个点
  29.       )
  30.       (mapcar '(lambda (a b)
  31.    (mapcar '(lambda (e)
  32.        (vla-move (cadr e)
  33.           (vlax-3d-point (car e))
  34.           (vlax-3d-point
  35.      (list (caar e) (cadr b) 0.)
  36.           )
  37.        )
  38.      )
  39.     a
  40.    )
  41.         )
  42.        tlst
  43.        ptl
  44.       )
  45.     )
  46.   )
  47.   (princ)
  48. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-18 21:48:23 | 显示全部楼层
好思路!还可以按行列分别设误差排序!
我咋想不到呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2013-5-18 22:16:13 | 显示全部楼层
  1. ;|
  2. 1  ybl-ent-sort 实体按规则分行/列
  3. 调用格式: (ybl-ent-sort entity_list mode key vx)
  4. 参数说明:
  5.         1 mode 0 按行 1 按列
  6.         2 key
  7.              (mod = 0)    (mod = 1)
  8.           1  Y降X升       X升Y降   (左上至右下)
  9.           2  Y降X降       X降Y降   (右上至左下)
  10.           3  Y升X降       X降Y升   (右下至左上)
  11.           4  Y升X升       X升Y升   (左下至右上)
  12.         3 vx 行(列)允许误差,为 nil 实取 0
  13.         4 entity_list 表, 格式如下
  14.           ((pt1 ent1) (pt2 ent2) ... (ptn entn))
  15.           a pt 为 ent 的特征点, ent 可以为 entity 或 vla-object
  16.             比如对文字排序,pt 可以使用文字的插入点
  17.             
  18.           b 当 pt 为实数时,vx 为行列最大及最小值的差值,此时 mode key 为任意值
  19.             如一组数 (1 3 56 89 56 45 6 8 45 91 45 69 78 15 12 11) vx 取 10
  20.             排序后为 ((1 3 6 8 11) (12 15) (45 45 45) (56 56) (69 78) (89 91))
  21.             总表及子表均为由大到小排列
  22. |;
  23. (defun c:test (/ ss ssl i e el lst n xl)
  24.   (if (setq ss (ssget))
  25.     (progn
  26.       (setq ssl (sslength ss)
  27.      i -1
  28.       )
  29.       (repeat ssl
  30. (setq e   (ssname ss (setq i (1+ i)))
  31.        el  (entget e)
  32.        lst (cons (list (cdr (assoc 10 el)) e) lst)
  33. )
  34.       )
  35.       (setq lst (mapcar '(lambda (x) (mapcar 'car x))
  36.    (ybl-ent-sort lst 0 1 1.)
  37.   )
  38.      n (apply 'max (setq ln (mapcar 'length lst)))
  39.      xl (nth (vl-position n ln) lst)
  40.       )
  41.       (setq
  42. v (mapcar
  43.      '(lambda (a / ll)
  44.         (mapcar
  45.    '(lambda (b / tf tf1)
  46.       (if (member
  47.      't
  48.      (mapcar '(lambda (c)
  49.          (if (equal (car c) (car b) 1.)
  50.            t
  51.            nil
  52.          )
  53.        )
  54.       a
  55.      )
  56.    )
  57.         b
  58.         " "
  59.       )
  60.     )
  61.    xl
  62.         )
  63.       )
  64.      lst
  65.    )
  66.       )
  67.       (princ v)
  68.     )
  69.   )
  70.   (princ)
  71. )

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

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 2688个

财富等级: 家财万贯

发表于 2013-5-22 14:01:13 | 显示全部楼层
强,顶一个,向楼主学习:lol
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2013-5-22 16:57:00 | 显示全部楼层
另外一个应用,生成一个外围盒
http://bbs.xdcad.net/forum.php?m ... 171&pid=3454532
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 394个

财富等级: 日进斗金

发表于 2013-5-23 19:45:55 | 显示全部楼层
请问这个点排序可以做到下面 图那样吗,把每根线的p1p2点找出来,然后在想在p1处画一个矩形.
11.jpg
如果可以,请指导一下要怎么弄?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2013-5-23 20:12:35 | 显示全部楼层
这个用不到 ybl-ent-sort ,给你个思路,取点集的 中心点 ,比较这个中心点和每个线的 Startpoint 及 Endpoint  的距离远近
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2013-5-26 19:31:03 | 显示全部楼层
以前写的一个土方计算,排序部分用 ybl-ent-sort 替换
  1. ;;土方随手算系列二,
  2. ;;本程序中高差点与网格交点的位置相对固定, 并使用对齐点作为网格交点,
  3. ;;任何对高差数字的移动,其方格将被忽略计算
  4. ;;本程序中网格按1图形单位为1米计算,如果按1:1绘图先将图缩小0.001倍
  5. ;;感谢秋枫哥
  6. ;;土方计算
  7. (defun c:Ea:TfJs (/      #test_item #v1    #v2
  8.     #v3      #z_pt addtxt    addline
  9.     caltf      thisdrawing    modelspace
  10.    )
  11.   ;; elst 为 (h11 h12 h21 h22)
  12.   ;;测试表中负值数目,返回表 (负值个数 (索引位置)),当三负时索引值为正值的索引位置
  13.   (defun #test_item (lst / a i plst nlst)
  14.     (setq i    0
  15.    plst nil
  16.    nlst nil
  17.     )
  18.     (foreach a lst
  19.       (if (< 0 a)
  20. (setq plst (append plst (list i)))
  21. (setq nlst (append nlst (list i)))
  22.       )
  23.       (setq i (1+ i))
  24.     )
  25.     (list (length nlst)
  26.    (if (= 3 (length nlst))
  27.      plst
  28.      nlst
  29.    )
  30.     )
  31.   )
  32.   ;;计算一: 一负或三负
  33.   (defun #v1 (h1 h2 h3 h4 a str / v- v+)
  34.     (if str
  35.       (progn
  36. (setq v- (/ (* a h1 h1 h1) 6 (+ h1 h2) (+ h1 h3))
  37.        v+ (+ (/ (* a (- (+ (* 2 (+ h2 h3)) h4) h1)) 6) v-)
  38. )
  39.       )
  40.       (progn
  41. (setq v+ (/ (* a h1 h1 h1) 6 (+ h1 h2) (+ h1 h3))
  42.        v- (+ (/ (* a (- (+ (* 2 (+ h2 h3)) h4) h1)) 6) v+)
  43. )
  44.       )
  45.     )
  46.     (list (rtos v- 2 2) (rtos v+ 2 2))
  47.   )
  48.   ;;计算二: 两负(相邻)
  49.   (defun #v2 (h1 h2 h3 h4 a / v- v+)
  50.     (setq
  51.       v+ (/ (* a (+ h1 h2) (+ h1 h2))
  52.      (* 4 (+ h1 h2 h3 h4))
  53.   )
  54.       v- (/ (* a (+ h3 h4) (+ h3 h4))
  55.      (* 4 (+ h1 h2 h3 h4))
  56.   )
  57.     )
  58.     (list (rtos v- 2 2) (rtos v+ 2 2))
  59.   )
  60.   ;;计算三: 两负(对角)
  61.   (defun #v3 (h1 h2 h3 h4 a / v1+ v2+ v- v+)
  62.     (setq
  63.       v1+
  64.    (/ (* a h2 h2 h2) (* 6 (+ h1 h2) (+ h1 h3)))
  65.       v2+
  66.    (/ (* a h3 h3 h3) (* 6 (+ h3 h1) (+ h3 h4)))
  67.       v-
  68.    (+ (/ (* a (- (* 2 (+ h1 h4)) h2 h3)) 6) v1+ v2+)
  69.       v+  (+ v1+ v2+)   ;???
  70.     )
  71.     (list (rtos v- 2 2) (rtos v+ 2 2))
  72.   )
  73.   ;;零线点
  74.   (defun #z_pt (h1 h2 p1 p2 / z_p)
  75.     (if (/= h2 0)
  76.       (setq z_p (polar p1
  77.          (angle p1 p2)
  78.          (/ (* (distance p1
  79.            p2
  80.         )
  81.         h1
  82.      )
  83.      (+ h1 h2)
  84.          )
  85.   )
  86.       )
  87.       (setq z_p p2)
  88.     )
  89.     z_p
  90.   )
  91.   ;;计算主程序
  92.   (defun caltf (p1    p2    p3   p4 h1    h2    h3   h4 /
  93.   _area pmid  pmid1 pmid2 #el   n     #_indx n-
  94.   #tf   hi1   v   z_p1 z_p2  z_p3  z_p4  _v
  95.         )
  96.     (setq _area (* (distance p1 p2) (distance p1 p3)) ;_网格面积
  97.    pmid (mapcar '* '(0.5 0.5) (mapcar '+ p1 p4))
  98.    pmid1 (polar pmid (* pi 0.5) 1.5)
  99.    pmid2 (polar pmid (- (* pi 0.5)) 0.2)
  100.     )
  101.     (setq #el  (#test_item (list h1 h2 h3 h4))
  102.      ;            0┍---------┐1
  103.    n  (car #el)  ;负值数量     │         │
  104.    #_indx (last #el)  ;负值位置     │         │
  105.     )     ;            2┗---------┚3
  106.     (cond
  107.       ((or (= n 1) ;_一负或三负
  108.     (= n 3)
  109.        )
  110.        (setq n- (car #_indx))
  111.        (cond
  112.   ((= n- 0)
  113.    (setq v    (if (= n 1)
  114.          (#v1 (abs h1)
  115.        (abs h2)
  116.        (abs h3)
  117.        (abs h4)
  118.        _area
  119.        T
  120.          )
  121.          (#v1 (abs h1)
  122.        (abs h2)
  123.        (abs h3)
  124.        (abs h4)
  125.        _area
  126.        nil
  127.          )
  128.        )
  129.   z_p1 (#z_pt (abs h1) (abs h2) p1 p2)
  130.   z_p2 (#z_pt (abs h1) (abs h3) p1 p3)
  131.    )
  132.   )
  133.   ((= n- 1)
  134.    (setq v    (if (= n 1)
  135.          (#v1 (abs h2)
  136.        (abs h1)
  137.        (abs h4)
  138.        (abs h3)
  139.        _area
  140.        T
  141.          )
  142.          (#v1 (abs h2)
  143.        (abs h1)
  144.        (abs h4)
  145.        (abs h3)
  146.        _area
  147.        nil
  148.          )
  149.        )
  150.   z_p1 (#z_pt (abs h2) (abs h1) p2 p1)
  151.   z_p2 (#z_pt (abs h2) (abs h4) p2 p4)
  152.    )
  153.   )
  154.   ((= n- 2)
  155.    (setq v    (if (= n 1)
  156.          (#v1 (abs h3)
  157.        (abs h1)
  158.        (abs h4)
  159.        (abs h2)
  160.        _area
  161.        T
  162.          )
  163.          (#v1 (abs h3)
  164.        (abs h1)
  165.        (abs h4)
  166.        (abs h2)
  167.        _area
  168.        nil
  169.          )
  170.        )
  171.   z_p1 (#z_pt (abs h3) (abs h1) p3 p1)
  172.   z_p2 (#z_pt (abs h3) (abs h4) p3 p4)
  173.    )
  174.   )
  175.   (T
  176.    (setq v    (if (= n 1)
  177.          (#v1 (abs h4)
  178.        (abs h2)
  179.        (abs h3)
  180.        (abs h1)
  181.        _area
  182.        T
  183.          )
  184.          (#v1 (abs h4)
  185.        (abs h2)
  186.        (abs h3)
  187.        (abs h1)
  188.        _area
  189.        nil
  190.          )
  191.        )
  192.   z_p1 (#z_pt (abs h4) (abs h2) p4 p2)
  193.   z_p2 (#z_pt (abs h4) (abs h3) p4 p3)
  194.    )
  195.   )
  196.        )
  197.       )
  198.       ((= n 2) ;_两负,相临或对角
  199.        (cond
  200.   ((equal #_indx '(0 3)) ;_对角
  201.    (setq v    (#v3 (abs h2)
  202.      (abs h1)
  203.      (abs h4)
  204.      (abs h3)
  205.      _area
  206.        )
  207.   z_p1 (#z_pt (abs h1) (abs h3) p1 p3)
  208.   z_p2 (#z_pt (abs h4) (abs h3) p4 p3)
  209.   z_p3 (#z_pt (abs h1) (abs h2) p1 p2)
  210.   z_p4 (#z_pt (abs h4) (abs h2) p4 p2)
  211.    )
  212.   )
  213.   ((equal #_indx '(1 2)) ;_对角
  214.    (setq v    (#v3 (abs h1)
  215.      (abs h2)
  216.      (abs h3)
  217.      (abs h4)
  218.      _area
  219.        )
  220.   z_p1 (#z_pt (abs h2) (abs h1) p2 p1)
  221.   z_p2 (#z_pt (abs h3) (abs h1) p3 p1)
  222.   z_p3 (#z_pt (abs h2) (abs h4) p2 p4)
  223.   z_p4 (#z_pt (abs h3) (abs h4) p3 p4)
  224.    )
  225.   )
  226.   ((equal #_indx '(0 1)) ;_相邻
  227.    (setq v    (#v2 (abs h3)
  228.      (abs h4)
  229.      (abs h1)
  230.      (abs h2)
  231.      _area
  232.        )
  233.   Z_P1 (#z_pt (abs h1) (abs h3) p1 p3)
  234.   z_p2 (#z_pt (abs h2) (abs h4) p2 p4)
  235.    )
  236.   )
  237.   ((equal #_indx '(0 2))
  238.    (setq v    (#v2 (abs h2)
  239.      (abs h4)
  240.      (abs h1)
  241.      (abs h3)
  242.      _area
  243.        )
  244.   Z_P1 (#z_pt (abs h1) (abs h2) p1 p2)
  245.   z_p2 (#z_pt (abs h3) (abs h4) p3 p4)
  246.    )
  247.   )
  248.   ((equal #_indx '(1 3))
  249.    (setq v    (#v2 (abs h1)
  250.      (abs h3)
  251.      (abs h2)
  252.      (abs h4)
  253.      _area
  254.        )
  255.   Z_P1 (#z_pt (abs h2) (abs h1) p2 p1)
  256.   z_p2 (#z_pt (abs h4) (abs h3) p4 p3)
  257.    )
  258.   )
  259.   (T
  260.    ;;(2 3)
  261.    (setq v    (#v2 (abs h1)
  262.      (abs h2)
  263.      (abs h3)
  264.      (abs h4)
  265.      _area
  266.        )
  267.   Z_P1 (#z_pt (abs h3) (abs h1) p3 p1)
  268.   z_p2 (#z_pt (abs h4) (abs h2) p4 p2)
  269.    )
  270.   )
  271.        )
  272.       )
  273.       (T ;_全正(负)
  274.        (setq #tf (* (* (+ h1 h2 h3 h4) 0.25)
  275.       _area
  276.    )
  277.       #tf (if (> #tf 0)
  278.      (strcat "+"
  279.       (rtos #tf 2 2)
  280.      )
  281.      (rtos #tf 2 2)
  282.    )
  283.        )
  284.       ) ;_全正
  285.     ) ;_cond
  286.     (if (and (/= n 0)
  287.       (/= n 4)
  288.       (/= (distance z_p1 z_p2) 0)
  289. )
  290.       (progn
  291. (ybvl-addline modelspace z_p1 z_p2 "TF-LX") )
  292. (if (and z_p3
  293.    (/= (distance z_p3 z_p4) 0)
  294.      )
  295.    (ybvl-addline modelspace z_p3 z_p4 "TF-LX")
  296. )
  297.       )
  298.     )
  299.     (if v
  300.       (progn
  301. (ybvl-addtext modelspace (strcat "-" (car v)) pmid1 0.9 1 "TF-TF")
  302. (ybvl-addtext modelspace (strcat "+" (cadr v)) pmid2 0.9 1 "TF-TF")
  303.       )
  304.       (ybvl-addtext modelspace #tf pmid 0.9 1 "TF-TF")
  305.     )
  306.   )
  307.   ;;main
  308.   (setq thisdrawing (vla-get-activedocument (vlax-get-acad-object))
  309. modelspace  (vla-get-modelspace thisdrawing)
  310.   )
  311.   (vla-startundomark thisdrawing)
  312.   (vl-catch-all-apply
  313.     (function
  314.       (lambda (/ _v tb ll tf l1 l2 j11 j12 _l2)
  315. (setq _v '(2.1 -0.5 0.))
  316. (ybvl-clearcset)
  317. (while
  318.    (progn (princ "\n请选取计算列的高程文字 <退出>: ")
  319.    (ssget '((0 . "TEXT") (8 . "TF-GC")))
  320.    )
  321.     (setq tb nil)
  322.     ;;构造表(((x1 y1) "string1") ((x2 y2) "string2") ......)
  323.     (vlax-for obj (vla-get-activeselectionset thisdrawing)
  324.       ;;(if tf (setq h (vla-get-height obj) tf nil))
  325.       (setq tb
  326.       (cons
  327.         (list
  328.    (ybl-pt->2d (vlax-get obj 'textalignmentpoint)) ;_标高右下对齐点
  329.    (read (vl-string-left-trim "+" (vla-get-textstring obj)) ;_高差
  330.    )
  331.         )
  332.         tb
  333.       )
  334.       )
  335.     )
  336.     (setq ll (ybl-ent-sort tb 0 1 0.001)) ;_按行排列 (((p11 h11) (p12 h12) ...) ((p21 h21) (p22 h22) ...) ...)
  337.     ;; ll 网格交点坐标
  338.     (while (>= (length ll) 2) ;_保证一行方格
  339.       (setq l1  (car ll)
  340.      l2  (cadr ll)
  341.      _l2 l2
  342.       ) ;_第二行
  343.       (while (> (length l1) 1) ;_第一行
  344.         ;;   L1    j11 +-------------+j12
  345.         ;;             |             |
  346.         ;;             |             |
  347.         ;;             |             |
  348.         ;;   L2    j21 +-------------+j22
  349.         (setq j11 (car l1) ;_(p11 h11)
  350.        j12 (cadr l1) ;_(p12 h12)
  351.        tf  t
  352.         )
  353.         (while (and tf _l2)
  354.    (if (equal (caaar _l2) (caar j11) 1e-3)
  355.      (setq tf nil)
  356.      (setq _l2 (cdr _l2))
  357.    )
  358.         )
  359.         (if (and _l2 ;_第二行中有对应的点
  360.    (equal (caar j11) (caaar _l2) 1e-3) ;_ x of j11 & x of j21
  361.    (equal (caar j12) (caaadr _l2) 1e-3) ;_ x of j21 & x of j22
  362.      ) ;_矩形
  363.    (progn
  364.      (caltf (mapcar '+ (car j11) _v)
  365.      (mapcar '+ (car j12) _v)
  366.      (mapcar '+ (caar _l2) _v)
  367.      (mapcar '+ (caadr _l2) _v)
  368.      (last j11)
  369.      (last j12)
  370.      (last (car _l2))
  371.      (last (cadr _l2))
  372.      )
  373.    ) ;_progn
  374.         ) ;_if
  375.         (setq l1 (cdr l1))
  376.       ) ;_while 第一行
  377.       (setq ll (cdr ll))
  378.     ) ;_while 总行
  379. ) ;_while
  380.       )
  381.     )
  382.   )
  383.   (vla-endundomark thisdrawing)
  384.   (princ)
  385. )

评分

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

查看全部评分

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

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

发表于 2013-5-29 17:49:03 | 显示全部楼层
看不到!!!来混个豆!!!!{:soso_e113:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 15:20 , Processed in 0.485016 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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