ssget可以这样选择吗:(ssget '((0 . "LINE")(长度 . "100")))
请问当我们选择一根线的时候 (setq aa (ssget '((0 . "LINE")))) 要知道他的长度 需要 得到10和11 再用(distance 10 11) 计算得到长度那么请问的是 是否可以使用setq 只选择 长度为100的线
如:(setq aa (ssget '((0 . "LINE")(长度 . "100"))))
疑问:因为圆是直接可以选择半径的 那么线有直接的长度值吗? 上边的写法可以实现吗?
这么做是因为 图面都是由线组成的
现在的做法是 判断出100的线 找到中心点画一个圆 使用循环 但是速度会特别的慢
如果选择直接得到100的线 计算中心点会省略很多循环的算法 节约了时间
(100的线只是我举例 不要纠结100的线很常见的问题)
顺便问一个entmake创建的问题
当entmake创建块的时候 如果创建带有属性的数值
使用这个是没有属性那个数值的
(defun c:tt( / del_ent ele ent i must new_ent)
(setq ent (entget (car (entsel "\n選擇一個圖元")))) ;得到組碼
(setq i 0 must '()) ;初始化
(repeat (length ent)
(setq del_ent (vl-remove (nth i ent) ent)) ;測試刪除
(setq new_ent (entmake del_ent)) ;測試生成
(if (= 10 (car (nth i ent)))
(progn
(setq must (append must (list (nth i ent))))
(if new_ent
(entdel (entlast))
)
)
(if new_ent
(entdel (entlast))
(setq must (append must (list (nth i ent))))
)
)
(setq i (1+ i))
) ;end repeat
(cond
((= "LWPOLYLINE" (cdr (assoc 0 ent)))
(setq must (append must (list (assoc 90 ent))))
)
((= "SPLINE" (cdr (assoc 0 ent)))
(setq must (append must (list (assoc 74 ent))))
(foreach ele ent
(if (= 11 (car ele))
(setq must (append must (list ele)))
)
)
)
((= "DIMENSION" (cdr (assoc 0 ent)))
(foreach ele ent
(if (or (= 11 (car ele))
(= 21 (car ele))
(= 31 (car ele))
(= 70 (car ele))
(= 71 (car ele))
(= 1 (car ele))
(= 3 (car ele))
)
(setq must (append must (list ele)))
)
)
)
)
(print must)
(princ)
)
urings 发表于 2018-9-11 19:29
选择10000个长度100的直线,过滤耗时0.1秒
抛砖引玉
正需要这类软件 收藏了 谢谢
;;==筛选直线小于长度(SXD)=================================================================================================
(defun c:sxd (/ n rel ss ssdl)
(setq ss (ssget '((0 . "*LINE"))) n 0 ssdl (ssadd))
(setq rel (getreal "\n请输入需要选择直线的长度值<0.2>"))
(if (or (= rel "") (= rel nil)) (setq rel 0.2))
(repeat (sslength ss)
(if (<= (distance (cdr (assoc 10 (entget (ssname ss n)))) (cdr (assoc 11 (entget (ssname ss n))))) rel)
(setq ssdl (ssadd (ssname ss n) ssdl))
)
(setq n (+ n 1))
)
(if (> (sslength ssdl) 0) (sssetfirst nil ssdl));这个是对已有的选择集进行亮显
(princ (strcat "\n\n\n共选择了" (rtos (sslength ssdl)) "条直线!!!"))
;(setq aa (cdr (ssgetfirst)));这个是根据选择的对象创建选择集
(prin1)
) 没有长度这个组码 选择10000个长度100的直线,过滤耗时0.1秒
抛砖引玉
(defun c:tt ( / dis l len mnd mxd t0 tol un x)
(setq tol 0.000001) ; 精度
(setq dis 100) ; 长度
(setq mxd (+ dis tol)) ; 最大长度
(setq mnd (- dis tol)) ; 最小长度
(and
(setq un (vl-catch-all-apply 'ssget '(((0 . "LINE")))))
(vl-catch-all-error-p un)
(setq un nil)
) ; 获取选择集
(setq t0 (* 86400 (getvar "TDUSRTIMER"))) ; 选择完成进入耗时
(and
un
(repeat (setq len (sslength un))
(setq l (cons (ssname un (setq len (1- len))) l))
)
) ; 获取图元表
(setq un nil) ; 清空选择集
(setq l (vl-remove-if-not '(lambda (x)
(setq x (entget x))
(setq x (distance (cdr (assoc 10 x)) (cdr (assoc 11 x))))
(and
(< x mxd)
(> x mnd)
)
) l
)
)
(setq t0 (- (* 86400 (getvar "TDUSRTIMER")) t0))
(prompt (strcat "\n过滤耗时 " (rtos t0 2 3) " 秒"))
(foreach x l
(redraw x 3)
)
(princ)
) 你最近是不是在学习lisp呢你是看什么视频或者书籍呢 能推荐一下吗 本帖最后由 urings 于 2018-9-12 10:10 编辑
htlaser 发表于 2018-9-11 22:04
正需要这类软件 收藏了 谢谢
已点支持
改动了两点
1.先设置参数(长度),再选择实体
2.不创建两个选择集,在原选择集上删除不符合的实体
(defun c:tt (/ dis l len n tol un un2 x)
(setq tol 0.000001) ; 精度
(setq dis 0.1) ; 默认最大长度
(and
(setq un2 (vl-catch-all-apply 'getreal '("\n请输入线段最大长度<0.1>:")))
(vl-catch-all-error-p un2)
(setq un2 -1)
)
(and
(not un2)
(setq un2 dis)
) ; 获取长度(字符串中的0.1要和默认值一致)
(and
(not (minusp un2)) ; 长度不为负数
(setq un (vl-catch-all-apply 'ssget '(((0 . "LINE")))))
(vl-catch-all-error-p un)
(setq un nil)
) ; 获取选择集
(and
un
(progn
(setq dis (+ un2 tol)) ; 长度加精度
(repeat (setq len (sslength un))
(setq len (1- len))
(setq n (ssname un len))
(setq x (entget n))
(and
(> (distance (cdr (assoc 10 x)) (cdr (assoc 11 x))) dis) ; 条件(可以自己更改)
(setq l (cons n l))
)
)
(foreach n l
(setq un (ssdel n un)) ; 从选择集中删除不符合的实体
)
(sssetfirst nil un) ; 夹点显示
(prompt (strcat "\n共找到 " (itoa (sslength un)) " 个实体"))
)
)
(setq un nil) ; 清空选择集
(princ)
)
urings 发表于 2018-9-12 10:07
已点支持
改动了两点
1.先设置参数(长度),再选择实体
看到了,谢谢。 urings 发表于 2018-9-12 10:07
已点支持
改动了两点
1.先设置参数(长度),再选择实体
谢谢你~ 很感谢 不错不错!
页:
[1]