明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1286|回复: 4

[源码] 求改编工程量统计源码

[复制链接]
发表于 2021-12-20 11:03:35 | 显示全部楼层 |阅读模式
5明经币
源码如下:
(defun c:zz()
(if *error* quit)
(setq cmdmode (getvar "cmdecho"))  
(setvar "cmdecho" 0)
(setq myosmode (getvar "osmode"))  
(setvar "osmode" 0)  
(prompt "\n选择计算工作量对象: ")
(setq sset (ssget))
(if (null sset)
(princ "\n错误: 没有选择对象!\n")
;过滤出选中的“text”实体nsset。
(progn
(setq ssl (sslength sset))
(setq nsset (ssadd)) ;“text”实体
(setq nsset1 (ssadd)) ;工作量实体
(setq nsset2 (ssadd)) ;光、电缆程式实体
(while (> ssl 0)
  (setq temp (ssname sset (setq ssl(1- ssl))))
  (if (= (cdr (assoc 0 (entget temp))) "TEXT")
    (ssadd temp nsset)
  )
)
(setq ssl (sslength nsset))
;选出形如"墙20+架10"的对象和"HYA10*0.4"。
(setq total 0)
(setq ssl1 ssl)
(setq ssl2 ssl)
(while (> ssl1 0)
  (setq temp (ssname nsset (setq ssl1 (1- ssl1))))
  (setq txt0 (cdr (assoc 1 (entget temp))))
  (selecttxt_dlcs)
  (selecttxt_gzl)
)))
(gzl_duihao)
(gzl_guilei)
(gzl_culture)
(gzl_viewresult)
(setvar "OSMODE" myosmode)
(setvar "CMDECHO" cmdmode)
(prin1)
)  

;;;选出形如"墙20+架10"
(defun selecttxt_gzl()
(setq re_call 0)
(setq txt_l (strlen txt0))
  ;形如"墙2*******"  
(if (> txt_l 2)
    (if (and (> (ascii (substr txt0 1 1)) 128) (> (ascii (substr txt0 2 1)) 128) (< (ascii (substr txt0 3 1)) 58) (> (ascii (substr txt0 3 1)) 47))
    (progn
      (setq txt0 (substr txt0 3 (- txt_l 2)))
      (setq re_call 1)
     )))
  ;形如"20.5+******"  
  ;形如"20.5"
(if (and (< (ascii (substr txt0 1 1)) 58) (> (ascii (substr txt0 1 1)) 47) (= re_call 0))
    (progn
       (setq i 0)
       (while (< i txt_l)
            (setq i (1+ i))
            (setq txt_it (ascii (substr txt0 i 1)))
            (if (and (= txt_it 43) (< i txt_l))
              (progn
                (setq txt0 (substr txt0 (+ i 1) (- txt_l i)))
                (setq i txt_l)
                (setq re_call 1)))
            (if (and (or (> txt_it 57) (< txt_it 43) (= txt_it 44) (= txt_it 45) (= txt_it 47)) (= re_call 0))
              (progn
                (setq i txt_l)
                (setq re_call 2)))
            (if (and (= i txt_l) (= re_call 0))
                (if (and (< txt_it 58) (> txt_it 47))
                (ssadd temp nsset1))
             )
        )
     )
  )  
(if (= re_call 1) (selecttxt_gzl))  
)

;;;选出"HYA"、"GYT"、"GYS"文字数
(defun selecttxt_dlcs()
(setq txt_l (strlen txt0))
(if (> txt_l 3)
    (if (or (= (substr txt0 1 3) "HYA") (= (substr txt0 1 3) "GYT") (= (substr txt0 1 3) "GYS"))
    (ssadd temp nsset2))
  )
)

;;;工作量与电缆程式对号
(defun gzl_duihao()
  (setq duihao_ls1 nil)
  (setq duihao_ls2 nil)
  (setq nsset1_len (sslength nsset1))
  (while (> nsset1_len 0)
    (setq duihao_yes 0)
    (setq nsset1_temp (ssname nsset1 (setq nsset1_len (1- nsset1_len))))
    (setq nsset1_rd (cdr (assoc 50 (entget nsset1_temp))))
    (setq nsset1_pt (cdr (assoc 10 (entget nsset1_temp))))
    (setq nsset1_pt (list (car nsset1_pt) (cadr nsset1_pt)))
    (setq nsset2_len (sslength nsset2))
          (while (> nsset2_len 0)
                (setq nsset2_temp (ssname nsset2 (setq nsset2_len (1- nsset2_len))))
            (setq nsset2_rd (cdr (assoc 50 (entget nsset2_temp))))
            (if (or (< (abs (- nsset1_rd nsset2_rd)) 0.1) (> (abs (- nsset1_rd nsset2_rd)) 6.2))
              (progn
                          (setq nsset2_pt (cdr (assoc 10 (entget nsset2_temp))))
                            (setq nsset2_pt (list (car nsset2_pt) (cadr nsset2_pt)))
                      (setq dis_n1n2 (distance nsset1_pt nsset2_pt))
                      (if (< dis_n1n2 12)         ;指定插入点间距范围
                        (progn
                               (setq n1n2_rd (- (angle nsset2_pt nsset1_pt) nsset1_rd))
                           (setq dis_yn1n2 (abs (* dis_n1n2 (sin n1n2_rd))))
                           (if (and (< dis_yn1n2 5) (>= n1n2_rd 0) (<= n1n2_rd Pi))
                             (progn
                                 (setq duihao_yes 1)
                                 (setq nsset2_temp1 nsset2_temp))
                             (if (and (< dis_yn1n2 5) (= duihao_yes 0))
                               (progn
                                 (setq duihao_yes 1)
                                 (setq nsset2_temp1 nsset2_temp))
                             ))
                        ))
               )       
            )
        )
        (if (= duihao_yes 0)
                 (progn
                   (setq duihao_lstemp nil)
                   (setq duihao_lstemp (cdr (assoc 1 (entget nsset1_temp))))
                   (setq duihao_ls2 (cons duihao_lstemp duihao_ls2))
        ))
        (if (= duihao_yes 1)
                 (progn
                    (setq duihao_lstemp nil)
                    (setq duihao_lstemp (cons (cdr (assoc 1 (entget nsset2_temp1))) (cdr (assoc 1 (entget nsset1_temp)))))
                    (setq duihao_ls1 (cons duihao_lstemp duihao_ls1))
                    (ssdel nsset2_temp1 nsset2)
        ))
    )
)

;归类
(defun gzl_guilei(/ guilei_temp1 guilei_temp2 guilei_temp3 guilei_temp4)
(setq guilei_temp1 duihao_ls1)
(setq guilei_result nil)
(while (/= guilei_temp1 nil)
     (setq guilei_temp2 (car guilei_temp1))
     (setq guilei_temp3 (car guilei_temp2))
     (setq guilei_temp1 (cdr guilei_temp1))
     (if (/= guilei_result nil)
        (progn
           (if (/= (assoc guilei_temp3 guilei_result) nil)
             (progn
                 (setq guilei_temp4 (cdr guilei_temp2))
                 (setq guilei_temp4 (strcat (cdr (assoc guilei_temp3 guilei_result)) "+" guilei_temp4))
                 (setq guilei_result (subst (cons guilei_temp3 guilei_temp4) (assoc guilei_temp3 guilei_result) guilei_result))
             )
           (setq guilei_result (cons guilei_temp2 guilei_result)))
        )
        (setq guilei_result (cons guilei_temp2 guilei_result)))
)
)

;计算工作量文字
(defun gzl_culture(/ cu_temp1 cu_temp2 cu_temp3 cu_temp4 cu_temp5 cu_temp6 cu_temp7 cu_temp8)
(setq cu_result nil)
(setq cu_temp1 guilei_result)
(while (/= cu_temp1 nil)
     (setq cu_temp6 nil)
     (setq cu_temp2 (car cu_temp1))
     (setq cu_temp3 (cdr cu_temp2))
     (setq cu_temp1 (cdr cu_temp1))
     (while (> (setq cu_te3_len (strlen cu_temp3)) 0)
         (setq i 0)
         (while (< i cu_te3_len)
             (setq i (1+ i))
             (setq cu_temp4 (substr cu_temp3 i 1))
             (if (= cu_temp4 "+")
               (progn
                   (setq cu_temp5 (substr cu_temp3 1 (- i 1)))
                   (setq cu_temp3 (substr cu_temp3 (+ i 1)))
                   (setq i cu_te3_len)
                )
              (if (= i cu_te3_len)
                (progn
                  (setq cu_temp5 cu_temp3)
                  (setq cu_temp3 ""))))
         )
         (if (and (< (ascii (substr cu_temp5 1 1)) 58) (> (ascii (substr cu_temp5 1 1)) 47))
           (setq cu_temp7 (cons " " cu_temp5))
           (setq cu_temp7 (cons (substr cu_temp5 1 2) (substr cu_temp5 3))))
         (if (or (= cu_temp6 nil) (= (assoc (car cu_temp7) cu_temp6) nil))
            (setq cu_temp6 (cons cu_temp7 cu_temp6))
            (progn
                 (setq cu_temp8 (rtos (+ (atof (cdr (assoc (car cu_temp7) cu_temp6))) (atof (cdr cu_temp7)))))
                 (setq cu_temp6 (subst (cons (car cu_temp7) cu_temp8) (assoc (car cu_temp7) cu_temp6) cu_temp6))
            ))
    )
    (setq cu_result (cons (cons (car cu_temp2) cu_temp6) cu_result))
)
)


;显示结果
(defun gzl_viewresult(/ viere_temp1 viere_temp2)
(setq viere_temp1 cu_result)
(while (/= viere_temp1 nil)
      (setq viere_temp2 (car viere_temp1))
      (setq viere_temp1 (cdr viere_temp1))
      (princ viere_temp2)
      (princ "\n")
)
(if (= duihao_ls2 nil)
  (princ "无可疑数据,图纸很标准。")  
  (progn
      (princ "以下数据为可疑数据,请认真核对:\n")
      (princ duihao_ls2)
  ))
)

想改编目的:
1、本源码适合统计工作量前缀一个字符+数量,想改编成适合统计二个内字符内+数量统计;
2、改编后将结果插入图形中,不再命令行中显示。

查询了函数使用因水平有限,不知从哪改。 (if (or (= (substr txt0 1 3) "HYA") (= (substr txt0 1 3) "GYT") (= (substr txt0 1 3) "GYS"))这段倒是看明白了,英文字符为1个,汉字2个,如想更改汉字类型号,将(substr txt0 1 3)改成4即可。但统计数量不知如何改,请大神们出手帮帮,谢谢!

附件: 您需要 登录 才可以下载或查看,没有账号?注册
发表于 2021-12-20 19:20:07 | 显示全部楼层

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2021-12-20 20:17:09 | 显示全部楼层
本帖最后由 jhzxj 于 2021-12-20 20:19 编辑

大神就是大神,三下五除二就搞定了,怎么改的,能告之下吗?我用的CAD是中望的,能加载你的E派工具箱吗?
回复

使用道具 举报

 楼主| 发表于 2021-12-22 19:21:57 | 显示全部楼层
我自己顶起来,路过的大神们出手帮帮忙,这个插件对我帮助很大,大量的统计可以节省不少时间,谢谢!谢谢!谢谢!
回复

使用道具 举报

发表于 2023-3-24 23:25:18 | 显示全部楼层
看了这个贴特意注册了账号,同行呀,多关照,分享一下给我,交个朋友,加个威信
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 12:30 , Processed in 0.145727 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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