明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2641|回复: 9

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

[复制链接]
发表于 2020-4-16 19:32:25 | 显示全部楼层 |阅读模式
50明经币
新人自学lisp不久,望高手指点一二
插件写完经过测试发现如下问题,本人使用天正电气T20V5.0
1,在CAD2017版本,win10系统中,能够正确无误统计出闭合曲线范围内块的数量,无论曲线范围内块数量是多少。
2,在CAD2016版本,win7系统中,不能正确统计出闭合曲线范围内块数量,且每次统计出来的块数量均不一致,且多次运行后插件返回“lselsetp nil”;在数量不多的情况下(估算在100个内)又能够正确统计。

望能够指点一二,看代码有什么问题
  1. (defun c:tet()
  2. (setq
  3.    zm nil
  4.    name nil
  5.    tkmz nil
  6.    ssd nil
  7.    pts nil
  8.    ii 0
  9.    i 0
  10.    tcq_num 0
  11.    xhs_num 0
  12.    wg_num 0
  13.    slzs_num 0
  14.    xhf_num 0
  15.    ssbjf_num 0
  16.    70if_num 0
  17.    280if_num 0
  18.    
  19.    sgbj_num 0
  20.    sb_num 0
  21.    jlm_num 0
  22.    qyxs_num 0

  23.    xfdh_num 0
  24.    xfgb_num 0
  25.    )
  26. ;获取闭合曲线  
  27. (setq zm (entget(car(entsel"\n选闭合曲线范围"))))
  28. ;得到闭合曲线点坐标
  29. (repeat (length zm)
  30.   (if (= 10 (car (nth ii zm)))
  31.    (setq pts (append pts (list (cdr(nth ii zm)))))
  32.   )  
  33.    (setq ii (1+ ii))
  34. )
  35. ;获取闭合曲线范围内的块的选择集
  36. (setq ssd(ssget "wp" pts '((0 . "insert"))))
  37. ;判断选择集中,块名是"$equip$00002649","$equip$00002656"等的数量
  38. (repeat (sslength ssd)
  39.   (setq name (ssname ssd i))
  40.   (setq tkmz (cdr (assoc 2 (entget name))))
  41.   (cond
  42.     ((= "$equip$00002649" tkmz)(setq tcq_num(1+ tcq_num)));如果块名是"$equip$00002649",则对应数量加+1
  43.     ((= "$equip$00002656" tkmz)(setq xhs_num(1+ xhs_num)));余同
  44.     ((= "$equip$00002648" tkmz)(setq wg_num(1+ wg_num)))
  45.     ((= "$equip$00002760" tkmz)(setq slzs_num(1+ slzs_num)))
  46.     ((= "$equip$00002794" tkmz)(setq xhf_num(1+ xhf_num)))
  47.     ((= "$equip$00002662" tkmz)(setq ssbjf_num(1+ ssbjf_num)))
  48.     ((= "$equip$00002402" tkmz)(setq 70if_num(1+ 70if_num)))
  49.     ((= "$equip$00002403" tkmz)(setq 280if_num(1+ 280if_num)))
  50.    
  51.     ((= "$equip$00002679" tkmz)(setq sgbj_num(1+ sgbj_num)))
  52.     ((= "$equip$00002655" tkmz)(setq sb_num(1+ sb_num)))
  53.     ((= "$equip$00002781" tkmz)(setq jlm_num(1+ jlm_num)))
  54.     ((= "$equip$00002779" tkmz)(setq qyxs_num(1+ qyxs_num)))

  55.     ((= "$equip$00002658" tkmz)(setq xfdh_num(1+ xfdh_num)))
  56.     ((= "$equip$00002677" tkmz)(setq xfgb_num(1+ xfgb_num)))
  57.   )
  58.   (setq i (1+ i))
  59. )
  60. ;文字输出位置坐标
  61. (setq pta1 (getpoint"\n文字输出起始位置"));获取第一个(块数量)文字输出的位置
  62. (setq pta2 (polar pta1 (/ pi 2) -400));第二个(块数量)文字输出的位置
  63. (setq pta3 (polar pta1 (/ pi 2) -800))
  64. (setq pta4 (polar pta1 (/ pi 2) -1200))
  65. (setq pta5 (polar pta1 (/ pi 2) -1600))
  66. (setq pta6 (polar pta1 (/ pi 2) -2000))
  67. (setq pta7 (polar pta1 (/ pi 2) -2400))
  68. (setq pta8 (polar pta1 (/ pi 2) -2800))
  69.   
  70. (setq ptb1 (polar pta1 (/ pi 2) -3200))
  71. (setq ptb2 (polar pta1 (/ pi 2) -3600))
  72. (setq ptb3 (polar pta1 (/ pi 2) -4000))
  73. (setq ptb4 (polar pta1 (/ pi 2) -4400))

  74. (setq ptc1 (polar pta1 (/ pi 2) -4800))
  75. (setq ptc2 (polar pta1 (/ pi 2) -5200))
  76. ;文字输出
  77. (command "text" "S" "宋体" "J" "mc" "non" pta1 "300" "0" tcq_num)
  78. (command "text" "S" "宋体" "J" "mc" "non" pta2 "300" "0" xhs_num)
  79. (command "text" "S" "宋体" "J" "mc" "non" pta3 "300" "0" wg_num)
  80. (command "text" "S" "宋体" "J" "mc" "non" pta4 "300" "0" slzs_num)
  81. (command "text" "S" "宋体" "J" "mc" "non" pta5 "300" "0" xhf_num)
  82. (command "text" "S" "宋体" "J" "mc" "non" pta6 "300" "0" ssbjf_num)
  83. (command "text" "S" "宋体" "J" "mc" "non" pta7 "300" "0" 70if_num)
  84. (command "text" "S" "宋体" "J" "mc" "non" pta8 "300" "0" 280if_num)
  85.   
  86. (command "text" "S" "宋体" "J" "mc" "non" ptb1 "300" "0" sgbj_num)
  87. (command "text" "S" "宋体" "J" "mc" "non" ptb2 "300" "0" sb_num)
  88. (command "text" "S" "宋体" "J" "mc" "non" ptb3 "300" "0" jlm_num)
  89. (command "text" "S" "宋体" "J" "mc" "non" ptb4 "300" "0" qyxs_num)

  90. (command "text" "S" "宋体" "J" "mc" "non" ptc1 "300" "0" xfdh_num)
  91. (command "text" "S" "宋体" "J" "mc" "non" ptc2 "300" "0" xfgb_num)
  92.   
  93. (princ)
  94. )
附件: 您需要 登录 才可以下载或查看,没有账号?注册
发表于 2020-4-16 22:39:03 | 显示全部楼层
改了下,尽量少用command
代码比较冗长,优化空间比较大。满足功能了在慢慢优化哇

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2020-4-17 16:59:15 | 显示全部楼层
略作修改

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2020-4-17 19:50:19 | 显示全部楼层
jun353835273 发表于 2020-4-16 22:39
改了下,尽量少用command
代码比较冗长,优化空间比较大。满足功能了在慢慢优化哇

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


本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2020-4-17 19:52:26 | 显示全部楼层

谢谢,又看到了新的写法
回复

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

发表于 2020-4-17 22:18:44 | 显示全部楼层
其实可以用
(setq SS (ssget  "wp"   pts (list  '(0 . "insert")(cons 2  "$equip$00002649,$equip$00002656"))))
这种方式,选中的对象全是你想要的
代码还可以简化很多
回复

使用道具 举报

 楼主| 发表于 2020-4-19 16:34:53 | 显示全部楼层
jun353835273 发表于 2020-4-17 22:16
可以zoom E 屏幕缩放一下多段线,这样图元就能选中

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

使用道具 举报

发表于 2023-11-12 11:32:27 | 显示全部楼层
Hanvey 发表于 2020-4-19 16:34
多谢提醒,在插件头加了 zoom O,缩放到选中的对象上就可以了。

你好大神,最后修改好能用的可以发一个吗
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-23 10:47 , Processed in 0.170384 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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