明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 844|回复: 8

[提问] 求助,关于统计封闭多线段范围内圆直径及数量的lsp修改问题

[复制链接]
发表于 2018-3-31 11:30 | 显示全部楼层 |阅读模式
请教下各位大神,关于统计封闭多线段范围内圆直径及数量的lsp修改问题
多数情况下要统计圆种类、数量的范围,都是用封闭多线段或云线来划分的不规则图形,不好框选,
如果改成统计所选封闭多线段范围内各种圆直径、数量并写到指定位置,就方便很多了。
万分谢谢!谢谢!!

这是ZZXXQQ大神提供的统计封闭多线段范围内圆数量的代码
(注:选择的多线段必须全在屏幕范围内,否则出错)
[code="lisp] (defun c:tt ()
(while (and (setq s1 (entsel "\n选择多段线: "))
             (setq ent (entget(car s1)))
             (= (cdr(assoc 0 ent)) "LWPOLYLINE"))
   (setq ptlst (list))
   (foreach x ent (if (= (car x) 10) (setq ptlst (cons (cdr x) ptlst))))
   (princ (setq n (sslength(ssget "WP" ptlst '((0 . "CIRCLE"))))))
)
(princ)
)
[/code]

这是fan_zh大神提供的框选统计圆种类和数量的代码
(选择范围是框选,不是选择封闭多线段)
[code="lisp] ;;;统计相同矩形边长的数量.
;;;编写日期2013-07-05
;;;编写: CADMAN
;;;子函数 (求矩形边长)   
;(defun qbc (pts / b h)
;(setq b (distance (car pts) (cadddr pts)))
;(setq h (distance (car pts) (cadr pts)))
;(cons (max b h) (min b h))
;);结束qbc
(defun c:tg ( / bclst pts ss el bc_new i p2 p3 m x1 x2)
(princ "\n请框选:")
(setq ss (ssget '((0 . "circle"))))
(setq i 0 bclst nil pts nil)
(repeat (sslength ss)
  (setq el (entget (ssname ss i)))
  (setq pts nil)
  (foreach pt el (if (= (car pt) 40) (setq pts (cons (cdr pt) pts))))      
  (setq bclst (cons pts bclst))
  (setq i (1+ i))
);repeat
(setq bc_new nil)
(while bclst
  (setq m (car bclst) x1 (length bclst))
  (setq bclst (vl-remove m bclst))
  (setq x2 (length bclst))
  (setq n (- x1 x2))
  (setq bc_new (cons (list m n) bc_new))
)
(setq p2 (getpoint "\起始位置"))
(setq p3 (polar p2 0 3000))
(command "_.TEXT" "c" (polar p2 (* pi 0.5) 800) "300" "0" "半径");指定书写标题的位置
(command "_.TEXT" "c" (polar p3 (* pi 0.5) 800) "300" "0" "数量")
(foreach bg bc_new                                                      ;设定重复次数为新表的长度
  (command "_.TEXT" "c" p2 "300" "0" (strcat (rtos (car (car bg)) 2)))      
  (command "_.TEXT" "c" p3 "300" "0" (cadr bg))
  (setq p2 (polar p2 (* pi 1.5) 800))
  (setq p3 (polar p2 0 3000))
)
(princ)
)
[/code]

有劳论坛大神们在百忙中抽空帮帮忙,再次对各位大神的帮助表示由衷的感谢!谢谢!!





本帖子中包含更多资源

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

x
发表于 2018-4-1 09:40 | 显示全部楼层
这个做什么用啊,好像可以标注模板
发表于 2018-4-1 20:52 | 显示全部楼层

;;伪源码程序

本帖子中包含更多资源

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

x

评分

参与人数 1金钱 +50 收起 理由
1681008 + 50 谢谢版主!可以改成不用自定义函数的就完美.

查看全部评分

发表于 2018-4-2 12:43 | 显示全部楼层
多段线简单,用ssget建立选区即可,圆弧的话需要用多段线去拟合,稍微麻烦点。
 楼主| 发表于 2018-4-2 19:17 | 显示全部楼层
本帖最后由 1681008 于 2018-4-2 19:43 编辑

谢谢版主!有劳版主指教下,运行命令时提示no function definition: XYP-STARTSC,可以改成不用自定义函数的吗
 楼主| 发表于 2018-4-2 20:03 | 显示全部楼层
yxp 发表于 2018-4-2 12:43
多段线简单,用ssget建立选区即可,圆弧的话需要用多段线去拟合,稍微麻烦点。

有劳大神抽空帮忙写个多线段的用用,谢谢!
发表于 2018-4-2 20:45 | 显示全部楼层
;;统计封闭多线段范围内圆直径及数量
(defun c:cirn( / cc n dd dxf pt en)
(princ "\n选择多段线")
(setq en (entget (car (entsel))) n 0
        pt (vl-remove 'nil (mapcar '(lambda(x)(if (= (car x) 10)(cdr x))) en))
        cir (ssget "wp" pt '((0 . "circle"))))
(repeat (sslength cir)
        (setq dxf (entget (ssname cir n)) n (1+ n)
                cc (cons (cdr (assoc 40 dxf)) cc))
)
(setq n 1)
(while (progn
        (setq r (car cc) cc (cdr cc))
        (if (equal r (car cc) 0.001)
                (setq n (1+ n))
                (setq dd (cons (list r n) dd) n 1))
        (car cc)
))
(foreach x dd (princ (strcat "\n半径: " (rtos (car x) 2 3) " 个数: " (itoa (cadr x)))))
(princ)
)
 楼主| 发表于 2018-4-3 07:31 | 显示全部楼层
yxp 发表于 2018-4-2 20:45
;;统计封闭多线段范围内圆直径及数量
(defun c:cirn( / cc n dd dxf pt en)
(princ "\n选择多段线")

谢谢,谢谢,这下统计起来方便多了,太感谢了!
发表于 2019-5-13 14:00 | 显示全部楼层
1681008 发表于 2018-4-3 07:31
谢谢,谢谢,这下统计起来方便多了,太感谢了!

兄弟你能用吗?我的怎么用不了啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-19 14:25 , Processed in 0.190191 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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