张大锤 发表于 2018-9-10 16:52:46

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)
)

htlaser 发表于 2018-9-11 22:04:36

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)
)

t18-13nil 发表于 2018-9-10 19:08:54

没有长度这个组码

urings 发表于 2018-9-11 19:29:51

选择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)
)

依然小小鸟 发表于 2018-9-11 21:17:52

你最近是不是在学习lisp呢你是看什么视频或者书籍呢 能推荐一下吗

urings 发表于 2018-9-12 10:07:21

本帖最后由 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)
)

htlaser 发表于 2018-9-12 10:14:36

urings 发表于 2018-9-12 10:07
已点支持
改动了两点
1.先设置参数(长度),再选择实体


看到了,谢谢。

张大锤 发表于 2018-9-14 16:46:20

urings 发表于 2018-9-12 10:07
已点支持
改动了两点
1.先设置参数(长度),再选择实体


谢谢你~ 很感谢

guankuiwu 发表于 2021-4-25 10:10:07

不错不错!
页: [1]
查看完整版本: ssget可以这样选择吗:(ssget '((0 . "LINE")(长度 . "100")))