尒樣僮 发表于 2018-3-12 21:39:55

按颜色选择

这个写了半天,终于写出来了,那位牛人能把我这个改精简点吗?
;按颜色选择
(defun c:xyc ()
(setq txh 1)
(while txh
    (setq object (entsel "\n请选过滤颜色对象"))
    (if (= object nil)
      nil
      (setq txh nil)
    )
)
(setq txh 1)
(while txh
    (setq ss (ssadd))
    (if (= ss nil)
      nil
      (setq txh nil)
    )
)
(if (= (assoc 62 (entget (car object))) nil);如果图元颜色为随层
    (progn
      (setq object_Name (cdr (assoc 8 (entget (car object)))));提取图元图层名
      (setq object_Color (cdr (assoc 62 (tblsearch "layer" object_Name))));提取图层颜色
    )
    (progn
      (setq object_Color (cdr (assoc 62 (entget (car object)))));提取图元颜色
    )
)
(setq ss1 (ssget));新建选择集
(setq xh 0)
(repeat (sslength ss1);循环选择集的每一个图元
    (setq Object_Color2 (cdr (assoc 62 (entget (ssname ss1 xh)))));图元颜色
    (if (= Object_Color2 nil);如果图元颜色为随层
      (progn
      (setq object_Name (cdr (assoc 8 (entget (ssname ss1 xh)))));提取图元图层名
      (setq object_Color2 (cdr (assoc 62 (tblsearch "layer" object_Name))));提取图层颜色
      (if (= object_Color2 object_Color)
          (ssadd (ssname ss1 xh) ss);加入到选择集
      )
      )
      (progn
      (if (= object_Color2 object_Color)
          (ssadd (ssname ss1 xh) ss);加入到选择集
      )
      )
    )
    (setq xh (+ xh 1))
)
(sssetfirst nil ss)
(princ (strcat "\n已选择" (rtos (sslength ss) 2 4) "个对象"))
(princ)
)

kucha007 发表于 2022-11-17 23:27:21

本帖最后由 kucha007 于 2022-12-4 14:00 编辑

kucha007 发表于 2022-11-17 22:45
Lee Mac写的,点选确定颜色,然后选择同色或相同色图层中颜色随层的对象
改了一下,支持多选或者先选(但得先勾选“先选择后执行”)
PS:代码有误,还在想如何合并选择集= =
(setvar "PICKFIRST" 1);勾选先选择后执行(defun c:TT (/ Old_Cmd Doc ss Cols co Dxf Lst sss)
(vl-load-com)
(if (not (setq ss (ssget "i")))
      (setq ss (ssget))
)
(setq Old_Cmd (getvar "cmdecho"))
(setq Doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(vla-startundomark Doc) ;记录编组
    (setvar "cmdecho" 0)
    (if ss
      (progn
      (repeat (setq i (sslength ss))
          (setq e (ssname ss (setq i (1- i))))
          (setq Cols (cons
                        (cond
                            ((cdr (assoc 62 (entget e))))
                            ((abs (cdr (assoc 62 (tblsearch "LAYER" (cdr (assoc 8 (entget e))))))))
                        )
                        Cols
                  )
          )
      )
      (foreach co Cols
            (while (setq Dxf (tblnext "LAYER" (null Dxf)))
                (if (= co (abs (cdr (assoc 62 Dxf))))
                  (setq Lst (cons "," (cons (cdr (assoc 2 Dxf)) Lst)))
                )
            );获取颜色的图层
            (setq sss
                        (ssget "_X"
                              (if Lst
                                  (list
                                    (cons -4 "<OR")
                                    (cons -4 "<AND")
                                    (cons 62 co)
                                    (if (= 1 (getvar 'cvport))
                                        (cons 410 (getvar 'ctab)) '(410 . "Model")
                                    )
                                    (cons -4 "AND>")
                                    (cons -4 "<AND")
                                    (cons 62 256)
                                    (cons 8 (apply 'strcat (cdr Lst)))
                                    (if (= 1 (getvar 'cvport))
                                        (cons 410 (getvar 'ctab)) '(410 . "Model")
                                    )
                                    (cons -4 "AND>")
                                    (cons -4 "OR>")
                                  )
                                  (list (cons 62 co))
                              )
                        )
            )
            (if (> (sslength sss) 0)(sssetfirst nil sss))
      )
      )
    )
    (setvar "cmdecho" Old_Cmd)
(vla-endundomark Doc) ;结束编组
(princ)
)



vectra 发表于 2018-3-15 10:27:27

尒樣僮 发表于 2018-3-15 09:42
谢谢楼上两位的帮忙一下看不懂的慢慢理解

地板的代码是使用CAD自带的过滤选择系统,可以一次选定结果不用排查(不满足条件的对象直接无法选中)

5#代码仅演示代码精简优化(差不多少了一半的行数)

ghgh0130 发表于 2018-3-13 17:52:34

对象过滤还是用SSGET这个函数比较有效率,楼主不妨试试。
另外所谓的优化和程序精简是不一样的,优化后的程序比当前程序更长也是可能的。

尒樣僮 发表于 2018-3-14 12:39:00

我刚开始写就是用ssget写的 但是图元为随层我就弄不好了 要取的选择图元的所有图层 再找符合颜色的图层下图元为随层的图元
我的水平就只有这样了

namezg 发表于 2018-3-14 16:30:00

本帖最后由 namezg 于 2018-3-15 18:15 编辑

;;;获取对象颜色函数
;(setq col (GetColor (setq en (car (entsel)))))
(defun GetColor (en / dxf col)
(setq dxf (entget en))
(if (not (setq col (cdr (assoc 62 dxf))))
    (setq col (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 dxf))))))
)
col
)
;获得颜色为指定颜色的选择集(包括随层对象,包括块对象)
;col -- 颜色索引(0-256)
;(setq ss (GetColorSS (setq col 4)))
(defun GetColorSS (col / Layers laystr lay ss)
(setq Layers (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))))
(setq laystr "")
(vlax-for item Layers
    (setq lay (vla-get-Name item))
    (if (= (vla-get-Color item) col)
      (if (= laystr "")
      (setq laystr lay)
      (setq laystr (strcat laystr "," lay))
      )
    )
)
(if (= laystr "")
    (setq ss (ssget (list (cons 62 col))))
    (setq ss
      (ssget
      (list
          '(-4 . "<OR")
            (cons 62 col)
            '(-4 . "<AND")
                  (cons 8 laystr)
                  '(62 . 256)
            '(-4 . "AND>")
          '(-4 . "OR>")
      )
      )
    )
)
)
;选择与指定对象颜色相同的对象(包括随层对象,包括块对象)
(defun c:GetSameColorSS ( / en ss n)
(vl-load-com)
(if (setq en (car (entsel "\n请选择源对象:")))
    (setq ss (GetColorSS (GetColor en)))
)
(sssetfirst nil ss)
(if ss
    (setq n (sslength ss))
    (setq n 0)
)
(princ (strcat "\n选择与指定对象颜色相同的对象" (rtos n 2 4) "个。"))
(princ)
)

vectra 发表于 2018-3-15 08:53:07

(defun c:xyc ()
(while (null (setq obj (entsel "\n请选过滤颜色对象"))))
(setq        dxf (entget (car obj))
        c   (cdr (assoc 62 dxf))
)
(if (null c)                                ;如果图元颜色为随层
    (setq c (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 dxf)))))) ;提取图层颜色
)
(setq        ss1 (ssget)
        ss(ssadd)
)                                        ;新建选择集
(repeat (setq xh (sslength ss1))        ;循环选择集的每一个图元
    (setq dxf (entget (ssname ss1 (setq xh (1- xh))))
          c2(cdr (assoc 62 dxf))
    )                                        ;图元颜色
    (if        (null c2)                        ;如果图元颜色为随层
      (setq c2 (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 dxf)))))) ;提取图层颜色
    )
    (if        (= c2 c)
      (ssadd (ssname ss1 xh) ss)        ;加入到选择集
    )
)
(sssetfirst nil ss)
(princ (strcat "\n已选择" (itoa (sslength ss)) "个对象"))
(princ)
)

尒樣僮 发表于 2018-3-15 09:42:23

谢谢楼上两位的帮忙一下看不懂的慢慢理解

start4444 发表于 2019-2-15 17:21:16

xyp1964 发表于 2019-2-15 22:42:21

;; 按颜色选择
(defun c:tt ()
(defun GetCo (s0 / a la co en)
    (setq en (entget s0))
    (if(setq a (assoc 62 en))
      (cdr a)
      (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 en)))))
    )
)
(if (progn(setq s0 (car (entsel "\n请选过滤颜色对象: ")))
      (redraw s0 3)
      (setq ss1 (ssget))
      )
    (progn      (setq co (GetCo s0) ss (ssadd) i-1)
      (while (setq s1 (ssname ss1 (setq i (1+ i))))
      (if (= (GetCo s1) co) (ssadd s1 ss))
      )
      (sssetfirst nil ss)
      (princ (strcat "\n已选择" (itoa (sslength ss)) "个对象"))
    )
)
(princ)
)

笑我秦兴 发表于 2020-8-13 10:53:11

感谢,终于找到了想要的功能
页: [1] 2 3
查看完整版本: 按颜色选择