Hanvey 发表于 2020-4-16 19:32:25

统计闭合曲线范围内块数量,块统计

新人自学lisp不久,望高手指点一二
插件写完经过测试发现如下问题,本人使用天正电气T20V5.0
1,在CAD2017版本,win10系统中,能够正确无误统计出闭合曲线范围内块的数量,无论曲线范围内块数量是多少。
2,在CAD2016版本,win7系统中,不能正确统计出闭合曲线范围内块数量,且每次统计出来的块数量均不一致,且多次运行后插件返回“lselsetp nil”;在数量不多的情况下(估算在100个内)又能够正确统计。

望能够指点一二,看代码有什么问题

(defun c:tet()
(setq
   zm nil
   name nil
   tkmz nil
   ssd nil
   pts nil
   ii 0
   i 0
   tcq_num 0
   xhs_num 0
   wg_num 0
   slzs_num 0
   xhf_num 0
   ssbjf_num 0
   70if_num 0
   280if_num 0
   
   sgbj_num 0
   sb_num 0
   jlm_num 0
   qyxs_num 0

   xfdh_num 0
   xfgb_num 0
   )
;获取闭合曲线
(setq zm (entget(car(entsel"\n选闭合曲线范围"))))
;得到闭合曲线点坐标
(repeat (length zm)
(if (= 10 (car (nth ii zm)))
   (setq pts (append pts (list (cdr(nth ii zm)))))
)
   (setq ii (1+ ii))
)
;获取闭合曲线范围内的块的选择集
(setq ssd(ssget "wp" pts '((0 . "insert"))))
;判断选择集中,块名是"$equip$00002649","$equip$00002656"等的数量
(repeat (sslength ssd)
(setq name (ssname ssd i))
(setq tkmz (cdr (assoc 2 (entget name))))
(cond
    ((= "$equip$00002649" tkmz)(setq tcq_num(1+ tcq_num)));如果块名是"$equip$00002649",则对应数量加+1
    ((= "$equip$00002656" tkmz)(setq xhs_num(1+ xhs_num)));余同
    ((= "$equip$00002648" tkmz)(setq wg_num(1+ wg_num)))
    ((= "$equip$00002760" tkmz)(setq slzs_num(1+ slzs_num)))
    ((= "$equip$00002794" tkmz)(setq xhf_num(1+ xhf_num)))
    ((= "$equip$00002662" tkmz)(setq ssbjf_num(1+ ssbjf_num)))
    ((= "$equip$00002402" tkmz)(setq 70if_num(1+ 70if_num)))
    ((= "$equip$00002403" tkmz)(setq 280if_num(1+ 280if_num)))
   
    ((= "$equip$00002679" tkmz)(setq sgbj_num(1+ sgbj_num)))
    ((= "$equip$00002655" tkmz)(setq sb_num(1+ sb_num)))
    ((= "$equip$00002781" tkmz)(setq jlm_num(1+ jlm_num)))
    ((= "$equip$00002779" tkmz)(setq qyxs_num(1+ qyxs_num)))

    ((= "$equip$00002658" tkmz)(setq xfdh_num(1+ xfdh_num)))
    ((= "$equip$00002677" tkmz)(setq xfgb_num(1+ xfgb_num)))
)
(setq i (1+ i))
)
;文字输出位置坐标
(setq pta1 (getpoint"\n文字输出起始位置"));获取第一个(块数量)文字输出的位置
(setq pta2 (polar pta1 (/ pi 2) -400));第二个(块数量)文字输出的位置
(setq pta3 (polar pta1 (/ pi 2) -800))
(setq pta4 (polar pta1 (/ pi 2) -1200))
(setq pta5 (polar pta1 (/ pi 2) -1600))
(setq pta6 (polar pta1 (/ pi 2) -2000))
(setq pta7 (polar pta1 (/ pi 2) -2400))
(setq pta8 (polar pta1 (/ pi 2) -2800))

(setq ptb1 (polar pta1 (/ pi 2) -3200))
(setq ptb2 (polar pta1 (/ pi 2) -3600))
(setq ptb3 (polar pta1 (/ pi 2) -4000))
(setq ptb4 (polar pta1 (/ pi 2) -4400))

(setq ptc1 (polar pta1 (/ pi 2) -4800))
(setq ptc2 (polar pta1 (/ pi 2) -5200))
;文字输出
(command "text" "S" "宋体" "J" "mc" "non" pta1 "300" "0" tcq_num)
(command "text" "S" "宋体" "J" "mc" "non" pta2 "300" "0" xhs_num)
(command "text" "S" "宋体" "J" "mc" "non" pta3 "300" "0" wg_num)
(command "text" "S" "宋体" "J" "mc" "non" pta4 "300" "0" slzs_num)
(command "text" "S" "宋体" "J" "mc" "non" pta5 "300" "0" xhf_num)
(command "text" "S" "宋体" "J" "mc" "non" pta6 "300" "0" ssbjf_num)
(command "text" "S" "宋体" "J" "mc" "non" pta7 "300" "0" 70if_num)
(command "text" "S" "宋体" "J" "mc" "non" pta8 "300" "0" 280if_num)

(command "text" "S" "宋体" "J" "mc" "non" ptb1 "300" "0" sgbj_num)
(command "text" "S" "宋体" "J" "mc" "non" ptb2 "300" "0" sb_num)
(command "text" "S" "宋体" "J" "mc" "non" ptb3 "300" "0" jlm_num)
(command "text" "S" "宋体" "J" "mc" "non" ptb4 "300" "0" qyxs_num)

(command "text" "S" "宋体" "J" "mc" "non" ptc1 "300" "0" xfdh_num)
(command "text" "S" "宋体" "J" "mc" "non" ptc2 "300" "0" xfgb_num)

(princ)
)

jun353835273 发表于 2020-4-16 22:39:03

改了下,尽量少用command
代码比较冗长,优化空间比较大。满足功能了在慢慢优化哇

xvjiex 发表于 2020-4-17 16:59:15

略作修改

Hanvey 发表于 2020-4-17 19:50:19

jun353835273 发表于 2020-4-16 22:39
改了下,尽量少用command
代码比较冗长,优化空间比较大。满足功能了在慢慢优化哇

1,今天试了这个代码,cad2017还是能完全正确统计,cad2016统计的时候还是会出现数据不准确的情况。多次调试后突然意识到,会不会是闭合曲线内的块只有部分在当前窗口能够显示的范围内,所以造成最后的数据不准确。经测试后发现确实是这个问,在cad2016上,闭合曲线范围内的块必须要全部在当前窗口可见,不然只会统计当前窗口范围内的块数量,在2017上却没有这个问题。这个有遇到过没呢。
2,另外在请教一下,代码中这些内容是个什么逻辑关系(意思)。谢谢


Hanvey 发表于 2020-4-17 19:52:26

xvjiex 发表于 2020-4-17 16:59
略作修改

谢谢,又看到了新的写法

jun353835273 发表于 2020-4-17 21:49:50

Hanvey 发表于 2020-4-17 19:50
1,今天试了这个代码,cad2017还是能完全正确统计,cad2016统计的时候还是会出现数据不准确的情况。多次 ...

那个是给你写的自定义函数,生成文字的。比command的通用性好,主要是速度快。
你可以了解下entmake生成图元

jun353835273 发表于 2020-4-17 22:16:58

Hanvey 发表于 2020-4-17 19:50
1,今天试了这个代码,cad2017还是能完全正确统计,cad2016统计的时候还是会出现数据不准确的情况。多次 ...

可以zoom E 屏幕缩放一下多段线,这样图元就能选中

jun353835273 发表于 2020-4-17 22:18:44

其实可以用
(setq SS (ssget"wp"   pts (list'(0 . "insert")(cons 2"$equip$00002649,$equip$00002656"))))
这种方式,选中的对象全是你想要的
代码还可以简化很多

Hanvey 发表于 2020-4-19 16:34:53

jun353835273 发表于 2020-4-17 22:16
可以zoom E 屏幕缩放一下多段线,这样图元就能选中

多谢提醒,在插件头加了 zoom O,缩放到选中的对象上就可以了。

664571221 发表于 2023-11-12 11:32:27

Hanvey 发表于 2020-4-19 16:34
多谢提醒,在插件头加了 zoom O,缩放到选中的对象上就可以了。

你好大神,最后修改好能用的可以发一个吗
页: [1]
查看完整版本: 统计闭合曲线范围内块数量,块统计