pezyl 发表于 2017-6-16 22:05:46

[已解决]批量矩形统计

本帖最后由 pezyl 于 2017-6-17 17:01 编辑

批量统计矩形(任意角度)的长和宽,并把长宽数据导到excel表里,数值大的放在“长度”,数值小的放在“宽度”
这个帖子版主的代码 http://bbs.xdcad.net/thread-707851-3-2.html 基本一样,我把帖子里的"3dsolid"改成"lwpolyline"一切正都是需要的,只是统计成角度矩形的时候数据不对,特求助修改

newer 发表于 2017-6-16 23:00:15

本帖最后由 newer 于 2017-6-16 23:13 编辑

API都有现成的函数,判断是否矩形什么的,统计的程序就是个套路,往里面套就改统计其他的了。表格生成了,你用晓东工具箱的
表格 转 EXCEL 就行了。
http://bbs.xdcad.net/forum.php?mod=viewthread&tid=707894&highlight=%B1%ED%B8%F1





(defun c:tt ()
(defun _process (e)
    (if (XD::Polyline:IsRectang e)
      (progn
      (setq pts (xdrx_getpropertyvalue e "vertices")
            p1(car pts)
            p2(cadr pts)
            p3(caddr pts)
            l   (list (distance p1 p2) (distance p2 p3))
            l   (vl-sort l '(lambda (x y) (> x y)))
      )
      (list (rtos (car l) 2 #xd_rectang_tol)
            (rtos (cadr l) 2 #xd_rectang_tol)
      )
      )
    )
)
(defun _keyword (key)
    (cond
      ((= key "D")
       (if (setq val
                  (getint
                  (xdrx_prompt "\n保留小数位数<" #xd_rectang_tol ">:" t)
                  )
         )
         (setq #xd_rectang_tol val)
       )
      )
      ((= key "E")
       (if (setq val (getreal
                     (xdrx_prompt
                         "\n表格字高<"
                         #xd_rectang_txtheight
                         ">:"
                         t
                     )
                     )
         )
         (setq #xd_rectang_txtheight val)
       )
      )
    )
    (_prompt)
)
(defun _prompt ()
    (xdrx_prompt
      "\n当前设置: 字高("   #xd_rectang_txtheight
      ") / 小数位数("         #xd_rectang_tol
      ")"
   )
)

(xdrx_begin)
(xdrx_sysvar_push '("dimzin" 8))
(if (not #xd_rectang_tol)
    (setq #xd_rectang_tol 1)
)
(if (not #xd_rectang_txtheight)
    (setq #xd_rectang_txtheight 3.5)
)
(_prompt)
(if (and (xdrx_initget "D E")
         (xdrx_initssget
             "\n选取要统计的矩形[字高(E)/小数位(D)]<退出>:"
             "D E"
             ""
             "_keyword"
         )
         (setq ss (xdrx_ssget '((0 . "*POLYLINE") (-4 . "&=") (70 . 1))))
      )
    (progn
      (setq data nil
            i    0
      )
      (mapcar '(lambda (x)
               (if (setq lst (_process x))
                   (setq
                     lst(cons (setq i (1+ i)) lst)
                     data (cons lst data)
                   )
               )
               )
            (xdrx_pickset->ents ss)
      )
      (setq
      data (reverse data)
      data (cons (list "" "长度" "高度") data)
      data (cons (list "矩形统计表" nil nil) data)
      )
      (if (setq pt (getpoint "\n表格插入点<退出>:"))
      (progn
          (xd::text:init 2)
          (setq scl(* (xd::var:getratio) (XD::Var:GetScaleRatio))
                txth (* scl #xd_rectang_txtheight)
          )
          (setq tb (xd::table:makefromlist
                     data
                     pt
                     txth
                     (/ txth 3.0)
                   )
          )
      )
      )
    )
)
(xdrx_sysvar_pop)
(xdrx_end)
(princ)
)



pezyl 发表于 2017-6-17 08:37:07

newer 发表于 2017-6-16 23:00


忘了说明数量也要统计了,相同长宽的矩形数量汇总统计。空出时间了一定要好好学学编程,书到用时方恨少。

yzhyxh 发表于 2017-6-17 08:44:46

{:1_1:}{:1_1:}{:1_1:}{:1_1:}

newer 发表于 2017-6-17 15:26:54

pezyl 发表于 2017-6-17 08:37


加入统计数量了,试下下面代码:




(defun c:tt ()
(defun _process (e)
    (if        (XD::Polyline:IsRectang e)
      (progn
        (setq pts (xdrx_getpropertyvalue e "vertices")
              p1(car pts)
              p2(cadr pts)
              p3(caddr pts)
              l1(distance p1 p2)
              l2(distance p2 p3)
              l          (list l1 l2)
              l          (vl-sort l '(lambda (x y) (> x y)))
        )
        (list (rtos (car l) 2 #xd_rectang_tol)
              (rtos (cadr l) 2 #xd_rectang_tol)
        )
      )
    )
)
(defun _keyword (key)
    (cond
      ((= key "D")
       (if (setq val
                  (getint
                  (xdrx_prompt "\n保留小数位数<" #xd_rectang_tol ">:" t)
                  )
           )
       (setq #xd_rectang_tol val)
       )
      )
      ((= key "E")
       (if (setq val (getreal
                     (xdrx_prompt
                       "\n表格字高<"
                       #xd_rectang_txtheight
                       ">:"
                       t
                     )
                     )
           )
       (setq #xd_rectang_txtheight val)
       )
      )
    )
    (_prompt)
)
(defun _prompt ()
    (xdrx_prompt
      "\n当前设置: 字高("   #xd_rectang_txtheight
      ") / 小数位数("              #xd_rectang_tol
      ")"
   )
)

(xdrx_begin)
(xdrx_sysvar_push '("dimzin" 0))
(if (not #xd_rectang_tol)
    (setq #xd_rectang_tol 1)
)
(if (not #xd_rectang_txtheight)
    (setq #xd_rectang_txtheight 3.5)
)
(_prompt)
(if (and (xdrx_initget "D E")
           (xdrx_initssget
             "\n选取要统计的矩形[字高(E)/小数位(D)]<退出>:"
             "D E"
             ""
             "_keyword"
           )
           (setq ss (xdrx_ssget '((0 . "*POLYLINE") (-4 . "&=") (70 . 1))))
      )
    (progn
      (setq data nil
          i       0
      )
      (mapcar '(lambda (x)
               (if (setq lst (_process x))
                   (setq
                     lst(cons (apply 'strcat lst) lst)
                     data (cons lst data)
                   )
               )
             )
              (xdrx_pickset->ents ss)
      )
      (setq
        data (xd::list:groupbyindex data 0.1)
        data (vl-sort data '(lambda (x y) (< (car x) (car y))))
        i    0
        data (mapcar '(lambda (x)
                        (list (itoa (setq i (1+ i)))
                              (caadr x)
                              (cadadr x)
                              (itoa (length (cdr x)))
                        )
                      )
                     data
             )
        data (cons (list "" "长度" "高度" "数量") data)
        data (cons (list "矩形统计表" nil nil nil) data)
      )
      (if (setq pt (getpoint "\n表格插入点<退出>:"))
        (progn
          (xd::text:init 2)
          (setq        scl(* (xd::var:getratio) (XD::Var:GetScaleRatio))
                txth (* scl #xd_rectang_txtheight)
          )
          (setq        tb (xd::table:makefromlist
                     data
                     pt
                     txth
                     (/ txth 3.0)
                   )
          )
        )
      )
    )
)
(xdrx_sysvar_pop)
(xdrx_end)
(princ)
)


pezyl 发表于 2017-6-17 16:56:51

newer 发表于 2017-6-17 15:26


谢谢,谢谢newer老师,完美解决了。

huisguiji 发表于 2023-4-14 21:52:55

newer 发表于 2017-6-16 23:00
API都有现成的函数,判断是否矩形什么的,统计的程序就是个套路,往里面套就改统计其他的了。表格生成了, ...

你这个表格可以在数量后面加1列空白的表格吗,写上备注方便些

hzyhzjjzh1 发表于 2023-4-16 12:00:09

谢谢楼主分享{:1_1:}

kmliro_2017 发表于 2023-9-13 07:55:00

谢谢分享!!!!!!

acoff 发表于 2023-9-13 08:50:11

看着不错,多谢分享

kmliro_2017 发表于 2023-10-31 08:22:46

谢谢分享!!!!

kmliro_2017 发表于 2023-12-1 08:37:17

谢谢分享!!!!!

zhchkuo 发表于 2024-7-22 20:02:58

学习一下。

xmlk 发表于 2024-8-20 11:21:56

版主666,{:1_23:}{:1_23:}{:1_23:}
页: [1]
查看完整版本: [已解决]批量矩形统计