上两讲,我们已经学习了几个AutoLISP函数基本用法。其实我们学任何东西都不要急于求成,AutoLISP程序的学习也一样,如果最初就拿大篇幅来做讲解,这会扼杀我们的兴趣。而且,力图要让在学中体会,在学的过程中试着去应用,这会让初学者找到兴趣找到成就感。学这样的东西,初学者若使用开发宝典去学,那样十有八九会把我们拒绝在这个编程天地的门外。下面我们还是以选择集的使用入手,以实现图层批量转换的范例来学习程序的制作来做一下讲解。
(defun c:bc() ;1
(command "layer" "n" "交通设施" "S" "交通设施" "c" "6" "" "") ;2
(command "layer" "s" "0" "") ;3
(setq ss (ssget "x" (list (cons 8 "dlss")))) ;4
(if ss ;5
(command "change" "p" "" "p" "layer" "交通设施" "") ;6
) ;7
(command "change" "p" "" "p" "c" "bylayer" "") ;8
);end ;9
上面程序中遇到了新的函数defun,defun函数用于在AutoLISP程序中定义函数,其格式为:
(defun name [argument])
其中 name为函数名;argument为函数列表
示例:
(defun adnum();略
(defun adnum(abc);略
(defun adnum(/a b);略
以上使用方式这次不用,故略去。
(defun c:adnum(),在函数名前加上c:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用c:,函数名则必须置于圆括号中。
在没有完全搞懂这组程序语句之前,我们把不甚理解的地方把它想成是固定模式,这样对学习AutoLISP程序是很好的,有些很难理解的东西在随后学习的时日里会不攻自破的。要说明的一点,AutoLISP程序的括号是成对出现的,也就是最终左括号的个数要和右括号的个数匹配。这个程序1部分是定义了函数bc;2部分是用command函数使用AutoCAD的layer命令在 AutoCAD中创建“交通设施”图层,并且定义图层的颜色为品红;3部分是定义图形的当前层为0层;4部分是定义一个选择集,用来过滤dlss层;5部分是个条件语句,如果ss不为空,则继续往下执行程序;6部分是command函数利用change命令来实现把dlss层中的实体改到“交通设施”层中去;8部分是利用change这个命令把当前图形中的颜色还原为层本身颜色。
以上是对这个程序的解释,其中英文状态下的双引号""是代表回车的意思,看起来不难吧。但上述程序只是实现把“dlss”层转成“交通设施”层去,但实际上我们的图形中往往会有很多层。这里只要稍加改动,一个实现cass图层批量转为已定义好汉字层的程序就会呈现在眼前,程序如下:
(defun c:bc()
(command "layer" "n" " 交通设施" "S" "交通设施" "c" "6" ""
"n" "地貌" "S" "地貌" "c" "1" ""
"n" "居民地" "S" "居民地" "c" "2" ""
"n" "管线" "S" "管线" "c" "6" ""
"n" "控制点" "S" "控制点" "c" "4" ""
"n" "高程" "S" "高程" "c" "7" ""
"n" "植被" "S" "植被" "c" "3" ""
"n" "注记" "S" "注记" "c" "3" ""
"n" "独立地物" "S" "独立地物" "c" "4" ""
"n" "图廓" "S" "图廓" "c" "7" ""
"n" "等高线" "S" "等高线" "c" "3" ""
"n" "水系" "S" "水系" "c" "5" ""
"n" "中线层" "S" "中线层" "c" "7" ""
"n" "记曲线" "S" "计曲线" "c" "2" ""
"")
(command "layer" "s" "0" "")
(setq ss (ssget "x" (list (cons 8 "dgx"))))
(if ss
(command "change" "p" "" "p" "layer" "等高线" "")
)
(setq ss (ssget "x" (list (cons 8 "dldw"))))
(if ss
(command "change" "p" "" "p" "layer" "独立地物" "")
)
(setq ss (ssget "x" (list (cons 8 "dlss"))))
(if ss
(command "change" "p" "" "p" "layer" "交通设施" "")
)
(setq ss (ssget "x" (list (cons 8 "dmtz"))))
(if ss
(command "change" "p" "" "p" "layer" "地貌" "")
)
(setq ss (ssget "x" (list (cons 8 "gcd"))))
(if ss
(command "change" "p" "" "p" "layer" "高程" "")
)
(setq ss (ssget "x" (list (cons 8 "gxyz"))))
(if ss
(command "change" "p" "" "p" "layer" "管线" "")
)
(setq ss (ssget "x" (list (cons 8 "jmd"))))
(if ss
(command "change" "p" "" "p" "layer" "居民地" "")
)
(setq ss (ssget "x" (list (cons 8 "kzd"))))
(if ss
(command "change" "p" "" "p" "layer" "控制点" "")
)
(setq ss (ssget "x" (list (cons 8 "sxss"))))
(if ss
(command "change" "p" "" "p" "layer" "水系" "")
)
(setq ss (ssget "x" (list (cons 8 "tk"))))
(if ss
(command "change" "p" "" "p" "layer" "图廓" "")
)
(setq ss (ssget "x" (list (cons 8 "zbtz"))))
(if ss
(command "change" "p" "" "p" "layer" "植被" "")
)
(setq ss (ssget "x" (list (cons 8 "zj"))))
(if ss
(command "change" "p" "" "p" "layer" "注记" "")
)
(setq ss (ssget "x" (list (cons 8 "中线"))))
(if ss
(command "change" "p" "" "p" "layer" "中线层" "")
)
(command "change" "p" "" "p" "c" "bylayer" "")
);end
把此程序粘贴进记事本里以bc.lsp的文件名保存到某目录下,打开一幅由cass软件绘制的地形图,然后用调用应用程序命令appload加载该程序,然后在命令行上输入bc,正常即可执行该程序,实现整幅图图层的批量转换。想方便的话,也可新建命令按钮,在“关联的宏”的的语言框中输入“(load “d:/lisp程序/bc.lsp”)bc”应用这个程序,这里指的是bc.lsp的程序文件是放在d盘根目录下的lisp程序的文件夹下。如果是放在自定义的别的目录下,只要将目录名更正一下即可。试试看,批量改图层的程序,你也掌握了。
本讲掌握要点:掌握图层转换程序的编写。
下一讲:AutoLISP在测绘中的应用讲座3的第1讲实现图层批量转换的范例
[size=4] 2 选择集的应用
在学习选择集之前,我们要了解组码是什么。我们在AutoCAD命令行敲入函数(entget (car (entsel)))然后选择图形中的一个实体回车,然后按F2键,会出现如下的一些数据:
((-1 . <图元名: 7efacd58>) (0 . "LWPOLYLINE") (330 . <图元名: 7efacc10>) (5 . "2B") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "DLSS") (6 . "X2") (370 . 0) (100 . "AcDbPolyline") (90 . 2) (70 . 128) (43 . 0.4) (38 . 0.0) (39 . 0.0) (10 491000.0 4.63675e+006) (40 . 0.4) (41 . 0.4) (42 . 0.0) (10 490991.0 4.63675e+006) (40 . 0.4) (41 . 0.4) (42 . 0.0) (210 0.0 0.0 1.0))。什么是组码,上面数据的括号中打头的那个数字就是组码,知道这个很重要,否则我们不知道 该如何写选择集中的语句。下面是一个选择集。
(setq ss (ssget "x" (list (cons 8 "dlss"))))
我们可以打开一个有dlss层实体的图形,找到相关实体,然后在命令行上粘上这个函数语句回车执行,然后在命令行上敲上命令erase回车后,再在命令行上输入p会车,你会发现erase命令对刚才得选择集进行了处理,处理的结果是删没了。我们看以看出,这个选择集的功能很类似于AutoCAD中的过滤命令filter,但是AutoLISP中的选择集在程序中应用就使得这一功能强大了不知道有多少。上述选择集中,很显然能看出,8是层的组码,最开始就把它理解成固定使用。也不需要记,用到得时候查在命令行上查一下即可。这个语句还涉及到几个函数,setq函数,ssget函数,list函数,cons函数,下面列举它们的功用。
1 setq函数
setq函数用于给变量赋值,其格式如下:
(setq name value [name value]。。。)
其中,name为变量名;value为赋予变量的值。
2 ssget “x”函数
ssget函数允许用户选择图形中任意对象。该函数的格式为:
(ssget [selection-mode][point1][point2]),其中selection-mode为对象选择模式(W、C、L、P等);point1为窗口的第一个点;point2为窗口的第二个点。示例:
(ssget “ x”);允许用户在整个图形数据库中选择指定类型的对象,即使图层被冻结或关闭。Ssget “x”函数的格式为:
(ssget “x” specified-criteria);其中X为ssget函数的过滤模式;specified-criteria为选择对象的指定规则列表。
3 list函数
list函数用于定义一个二维或三维点。若表达式中不包含任何变量及未定义项,则该函数还可以使用单引号(’)命名。示例:(setq x (list 2.5 3.56)),返回结果为:2.5,3.56。
4 cons函数
cons函数依据给定的元素或列表构造一个新的列表。Cons函数格式为:
(cons first-element second-element);其中,first-element为第一个元素或列表;second-element为第二个元素或列表。示例:(cons “x” “y”),返回(“x” “y”)。
对于选择集的应用,这里再枚举几个例子,以供参考。
(setq ss (ssget "x" (list (cons 8 "2110")(cons 0 "LWPOLYLINE"))))全图选择2110层的LWPOLYLINE线;
(setq ss (ssget "x" (list (cons 0 "TEXT")(cons 8 "8310"))))全图选择8310层的文本;
(setq ss (ssget "x" (list (cons 0 "insert")(cons 8 "8310"))))全图选择8310层中的实体块;
(setq ss (ssget "x" (list (cons 8 "dgx")(cons 40 0.3))))全图选择dgx层宽度为0.3的实体;
本讲掌握要点:学会使用选择集语句。
下一讲:AutoLISP在测绘中的应用讲座2的第3讲实现图层批量转换的范例
(原创作品,未经允许不得转载)
[/size]
回复:领导视察工作 匿名网友 于 2018-4-3 10:48:01 发表评论 [引用]
montre
mulberry
nike mercurial
reebok
mac cosmetics
nike mercurial
tommy hilfiger
converse
ray ban
pandora
sac longchamp
nike air max
nike pas cher
ray ban
lacoste shoes
nike air max 95
adidas soccer cleats
nike store
jordan xx9
ray ban sunglasses
nike vapor max
roshe run
kate spade outlet
wedding dresses
skechers shoes
nike blazer
true religion
jordans
ralph lauren uk
oakley
timberland
nike air max plus
nike air max
jerseys
timberland boots
sac burberry
louboutin pas cher
adidas
nike free run
versace handbags
bottega
roty burch outlet
hermes outlet
longchamp
argentina world cup jersey
boy london clothing
kevin durant shoes
nike roshe run
nike free
nike free
nike shoes
para jumpers
louboutin
201804.3chenyangpeng