求助:按颜色移动的lsp
luyu9635
luyu9635 Lv.2
2007年05月25日 18:13:32
只看楼主

楼主,能帮我写一个fi(颜色过滤器)和m(移动)两个命令连起来用的lisp文件吗,谢了,我是想实现按颜色来移动对象的目的

楼主,能帮我写一个fi(颜色过滤器)和m(移动)两个命令连起来用的lisp文件吗,谢了,我是想实现按颜色来移动对象的目的
免费打赏
小萝卜的头
2007年05月25日 23:07:00
2楼
(defun getcolor_sslist (color / ss slen i ss_list na col)
(setq ss (ssget))
(setq slen (- (sslength ss) 1))
(setq i 0)
(setq ss_list (ssadd))
(while (<= i slen)
(setq na (ssname ss i))
(setq ent (entget na))
(cond
((setq col (cdr (assoc 62 ent))))
((setq
col (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 ent)))))
)
)
)
(if (= col color)
(ssadd na ss_list)
)
(setq i (+ i 1))
)
ss_list
)



(defun c:test ()
(setq color 1);设置选择的颜色号,1代表红色。
(setq ss (getcolor_sslist color))
(command "._move" ss "")
(princ)
)


回复
luyu9635
2007年05月26日 19:03:12
3楼
谢谢高手,但是能不能改一下呀,我想用鼠标来点选,不用输颜色号的,而且我有一点看不懂,你写的好象是两个程序吧,能不能说一下你的思路呀
回复
小萝卜的头
2007年05月26日 19:48:46
4楼
1.首先,我写的是一个程序。上面第一个是通用函数定义。第二个是主程序。当然也可以合在一起。不多说。。。
2.想鼠标来点选,有两种做法:
一、利用对话框,在弹出的对话框里用鼠标选啊。。。
二、直接用鼠标点CAD的工具栏上颜色下拉列表。然后(setq color (getvar "cecolor")),
不过这里如果是“随层”或是“随块”的时候行不通啊。。。
3.2楼的程序有个缺陷:就是不能选到“随块”的物体。。。不知道楼主有没有试过。。。。
4.知道为什么2楼的程序要写这么多吗?那是为了选到“随层”的物体,没办法。。。
5.其实,第一个通用函数再改一下,就可以一次过滤多种颜色。。。我再改改。。
回复
小萝卜的头
2007年05月26日 19:56:00
5楼
;;;选择红色和黄色的所有物件.............
(defun getcolor_sslist (colorlist / ss slen i ss_list na col)
(setq ss (ssget))
(setq slen (- (sslength ss) 1))
(setq i 0)
(setq ss_list (ssadd))
(while (<= i slen)
(setq na (ssname ss i))
(setq ent (entget na))
(cond
((setq col (cdr (assoc 62 ent))))
((setq
col (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 ent)))))
)
)
)
(foreach n colorlist
(if (= col (nth (1- n) colorlist))
(ssadd na ss_list)
)
)
(setq i (+ i 1))
)
ss_list
)



(defun c:test ()
(setq ss (getcolor_sslist (list 1 2))) ;设置选择的颜色号,(list 1 2)代表1红色和2黄色。
(command "._move" ss "")
(princ)
)
回复
小萝卜的头
2007年05月26日 20:04:19
6楼
;;;选择红色和黄色的文本.................
(defun getcolor_sslist (var colorlist / ss slen i ss_list na col)
(setq ss (ssget (list (cons 0 var))))
(setq slen (- (sslength ss) 1))
(setq i 0)
(setq ss_list (ssadd))
(while (<= i slen)
(setq na (ssname ss i))
(setq ent (entget na))
(cond
((setq col (cdr (assoc 62 ent))))
((setq
col (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 ent)))))
)
)
)
(foreach n colorlist
(if (= col (nth (1- n) colorlist))
(ssadd na ss_list)
)
)
(setq i (+ i 1))
)
ss_list
)



(defun c:test ()
(setq var "*text") ;_这个表示选择的是文本。
(setq colorlist (list 1 2)) ;_这个表示选择的是1红色和2黄色。
(setq ss (getcolor_sslist var colorlist))
(command "._move" ss "")
(princ)
)
回复
luyu9635
2007年05月27日 17:55:17
7楼
首先谢谢了,但是其中有两句我不太理解:(setq ent (entget na))和col (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 ent)))));能详细说明一下吗,还有就是我想能不用循环来实现吗,比如用(ssget "x")和按颜色过滤表来一次创建选择集;或者这样行不行呀:(ssget "x" vla-get-color:变量))
回复
luyu9635
2007年05月27日 20:09:07
8楼
能告诉我一个这样的程序吗:点选一条直线得到它的长度并获得直线的两个端点坐标
回复
biechen
2007年05月28日 13:15:12
9楼

(defun fe-entsel (msg filter / el )
(while (not (and (setq el (entsel msg)) (ssget (cadr el) filter))))
el
)
(defun test()
(setq s1 (car (setq s11 (fe-entsel "选择直线:" ’((0 . "LINE"))))))
(setq ptb (vlax-curve-getEndPoint s1)
pte (vlax-curve-getStartPoint s1))
(setq len (/ (distance ptb pte)))
)
回复
luyu9635
2007年05月29日 21:01:26
10楼
谢谢了,但是你还有一个问题没回答我呀:但是其中有两句我不太理解:(setq ent (entget na))和col (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 ent)))));能详细说明一下吗,还有就是我想能不用循环来实现吗,比如用(ssget "x")和按颜色过滤表来一次创建选择集;或者这样行不行呀:(ssget "x" vla-get-color:变量))
另你能把filter这个命令成一个lsp文件吗,感激不尽呀
回复
小萝卜的头
2007年06月04日 11:53:00
11楼

1.简单的说,分成两种情况:
第一种情况: (setq col (cdr (assoc 62 ent))))
第二种情况: (setq col (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 ent)))))
对应的意义:
一、过滤的颜色为颜色列表上的(除了随层,随块)。
二、图层默认的颜色(就是随层)
2.vla-get-color如果你的object的颜色是随层的话。你取得的值只是256。那样的话,就无法确定是什么颜色的。
因为256是随层的颜色。图层建立后的颜色可是0~255其中一个色,而你取得是256以致于无法确定是0~255中的哪一个

这个过滤表的话。一般用ssget都可以写出来吧。如果这种方法不行,就用别的过滤条件写ssget
因为有时候要考虑一些不是一句就能得到效果的情况。所以要自己写一个通用子程序。。
我也不是学得很深。。。互相学习。

回复

相关推荐

APP内打开