- UID
- 173
- 积分
- 518
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-10
- 最后登录
- 1970-1-1
|
发表于 2002-1-31 11:54:42
|
显示全部楼层
4.6.2 在程序中,对象选择集组建和对象的响应
(1)用户指定对象
适用于对用户指定的对象,进行编辑处理的应用程序中,选择集组建。
(While (Progn (PrinC "\n选择要处理的图形对象...")
(Not (SetQ ss (SSGet)))
)
(Alert "没有任何对象被选中,请重选…")
)
t 点评:
· 因为 SSGet 函数没有显示用户输入提示的功能,要在使用它之前发出提示。
· 为了对用户的输入做必需的检查,用了While和Progn函数组成了后条件循环,用户必须选定有效的选择集,才能使程序向下执行。
(2)从头顺次提取
如果有关图线是顺序画成,在此过程中没有夹杂其它对象,程序设计要求图线是:轮廓线用黄色,剖面线用绿色。
首先,用 (SSAdd)定义一个空的选择集SS备用。当画完第一个对象后,立即把它的对象名放置在名为 FIRST的变量中,并把它填入 SS 集。之后就可以连续使用 (Command) 函数画完所有的有关对象。最后用 (While) 函数从头顺次提取,得到的选择集SS 就可以用了(T409.LSP)。
(Defun C:SS1()
(SetQ p (GetPoint "基点: ") ss (SsAdd))
(Command "color" 2 "line" p "@100,0" "")
(SetQ first (EntLast) ss (SsAdd first ss))
(Command "arc" "" "@20,20"
"line" "" "@0,50" "@ -100,0" p ""
)
(While (SetQ s (EntNext first))
(SetQ ss (SsAdd s ss) first (EntNext first))
)
(Command "color" 3 "hatch" "u" 45 10 "n" ss "")
)
t 点评:
· 这种模式适用于有关图线是顺序生成的,其中没有夹杂其他的图线。
· 程序设计的关键是记下整套图线的“头”,就是变量 first 中记载的对象名。
· 之后用 While 函数将他们收集在一起。
· 因为要逐个添加对象名,所以预置一个空的选择集是必要的:
(SetQ ss (SSAdd))
(3)边画边提取
适用于所有的模式。每当生成了一条有关的图线,就将它收到选择集中(T410.LSP)。
(Defun IAdd () (SsAdd (EntLast) ss))
(Defun C:SS2()
(SetQ p (GetPoint "Base point: ") ss (SsAdd))
(Command "color" 2 "line" p "@100,0" "") (IAdd)
(Command "text" p 10 0 "Point1"
"arc" "" "@20,20"
) (IAdd)
(Command "circle" (Polar p 2.5 30) 25
"line" "" "@0,50" ""
) (IAdd)
(Command "line" "" "@-100,0" "") (IAdd)
(Command "line" "" p "") (IAdd)
(Command "color" 3 "hatch" "u" 45 10 "n" ss "")
)
t 点评:
· 这种模式适用所有的情况,只是有点罗嗦。
· 声明一个 (IAdd) 函数,是为了程序设计能够逐渐标准化。
· 必须用 (EntLast) 函数取出对象名,这样才能万无一失。
(4)按事先约定的特征提取。
这种方法适用于所有的情况。
首先要事先约定有关的对象用颜色 99 绘制(或者其它的统一特征,例如:层名、线形等),而其它的对象当然就不再能使用这个色号。
画图描述中可不必考虑各个对象的生成顺序,只要保证有关对象用 99 号色,其它对象不用 99 号色即可。当有关对象的最后一个生成完毕后,可用(SsGet "x" '((62 . 99))) 响应 HATCH要目标的提示,也不必建立有名的选择集。
请注意,打完剖面线后,别忘了把这些对象变成绘图规定的颜色 (T411.LSP)。
(Defun C:SS3()
(SetQ p (GetPoint "Base point: "))
(Command "color" 99
"line" p "@100,0" "" "arc" "" "@20,20"
"color" 2 "circle" (Polar p 3 50) 30
"color" 99 "line" "" "@0,50" "@ -100,0" p ""
"color" 3
"hatch" "u" 45 10 "n"
(SsGet "x" '((62 . 99))) ""
"change" “p” "" "p" "c" 2 ""
)
)
t 点评:
· 这种事先约定的模式,实际上是利用了 AutoCAD 数据库的检索功能。
· 这个程序中用了传统的 (Command),是因为如果用 (VL-CmdF),程序会发生奇怪的错误。当然每一个命令引用都使用一个单独的 (VL-CmdF),就没有错误了。但这样似乎太罗嗦了一些。
另外的例子是,检索所有名称中包含指定字串的块。自定义函数如下(T411a.LSP)
(Defun SBlock (st)
(SSGet "x" (List '(0 . "INSERT") (Cons 2 st)))
)
例如要搜索以”CCD”为块名前缀的块,可以:(SetQ bs (Sblock “ccd*”))。在提供参数时,可以使用 ”*”、”?” 等统配符号。这个例子可以说明,选择集的建立,除了使用选择集过滤功能之外,还可以由用户自己编写程序,再加上几层的过滤条件。这个例子中就是增加了“块名”的过滤。
——摘自《Visual LISP for AutoCAD2000程序设计——从学会到用好》第四章 |
|