AutoLISP在测绘中的应用讲座2(3) [上一篇] [下一篇]

[ 2010-11-11 19:53:52 | 作者:motu | 出处:原创 | 天气:晴 ] 字体:

3 实现图层批量转换的范例

上两讲,我们已经学习了几个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]
此日志由 motu 在 2010-11-12 7:32:00 编缉过。

分类:漠土测绘科技 | 部落: | 评论:8 | 引用通告 | 阅读次数(4400)

Tags:无

用 户: 密 码:
验 证: 不不清或没看到请点这里!
标 题:

内 容:

[加粗] [下划线] [居中] [网址] [图片] [代码] [UBB表情]

导航

归档

日历

我的简历

  • 姓名:motu
  • 性别:1
  • 注册日期:
  • Email:zdh1977@126.com
  • 城市:北京
  • 发消息给我

公告

本博客的文字和图片均为作者原创,如有转载,请注明作者和出处,欢迎光临!

部落

最新回复

联接

统计

  • 访问人数: 人
  • 创建时间:2008-9-14
  • 发表文章:231 篇
  • 上传相片:9 张
  • 回复总数:867 篇
  • 阅读总数:960618 次