跟我一起打酱油,轻松学习Lisp编程
本帖最后由 gbhsu 于 2012-8-23 20:41 编辑鉴于LISP语言函数众多,语法繁琐,对于初学者没有丰富的经验积累,很难轻松写出所需的程序;而对于经验丰富者,要管理好LISP函数和自定义函数,亦非易事。明经资源极其丰富,精华好贴目不暇接,经典函数不计其数;但实际编程时往往记不住函数名,或下载的资源不知存于何处,极大降低工作效率。如果能编一两个通用函数让初学者,轻松明白其含义,快速编出想要的函数,那该多好!呵呵,不要急,这样的函数我已经编出两个,可以做很多很的事情,希望大家能喜欢。大家有币的出币,有钱的出钱,没钱没币的,吼吼呀。
下面来详细说明
先介绍第一个函数 get:
说明get后要带冒号--":"
我们可以先做一个选择集ss (setq ss(ssget))
或在命令行输入 ss: 就可以得到一个名为 ss 的选择集
(get: 'ss:0)就可以得到ss选择集的第一个对象,等于(ssname ss 0)
以次类推(get: 'ss:1)......
(get: 'ss:0) = <图元名: 7ef978c8>
同时ss:0也已被赋值 ss:0 = <图元名: 7ef978c8>
你也可以(setq xx (get: 'ss:0))
(get: 'ss:0:name)= "CIRCLE" 说明第一个对象是圆
(get: 'ss:0:color) = 2 说明第一个对象是黄色的
(get: 'ss:1:layer) = "WALL" 说明第二个对象在"WALL"层
(get: 'ss:circle)= <Selection set: d5c> 为圆的选择集
(sslength ss:circle)=10说明选择中有10个圆
(get: 'ss:block) 得到所有块的选择集
(get: 'ss:block:椅子1)得到所有块名为"椅子1"的选择集
(get: 'ss:text)得到文字的选择集
(get: 'ss:text:list)得到文字的选择集列表
(<图元名: 7ef976f0> <图元名: 7ef976e8> <图元名: 7ef97600> <图元名: 7ef975f8> <图元名: 7ef975f0> <图元名: 7ef975e8> <图元名: 7ef975e0> <图元名: 7ef975d8>)
(get: 'ss:text:list:string)得到文字的选择集列表字符
("STR8" "STR7" "STR6" "STR5" "STR4" "STR3" "STR2" "STR1")
(get: 'ss:text:0:string)= "STR8" 明白什么意思了吧
(get: 'ss:circle:color:2:layer:wall:radius:100)
就得到颜色为黄色,WALL层,半径为100圆的选择集
怎么样,比用ssget方便吧,后面的属性可以任意带,
再介绍第二个函数 put:
同样先构造一个选择集(setq ss (ssget))
(setq sscircle (get: 'ss:circle))得到圆的选择集
(put: 'sscircle:color:5)修改圆为5号色
(put: 'sscircle:layer:wall)修改圆为 wall层 wall首先要存在
(put: 'sscircle:layer:wall:color:5:radius:100)修改圆为 wall层 5号色 半径为100
(put: 'ss:text:string:cmdX:height:100:color:6)修改文字为 "cmdX" 字高为100 6号色
第三个函数set:
此函数主要是生成新的对象如line circle text等 类似vba的method方法
(setq pt1 (getpoint));第一点
(setq pt2 (getpoint));第二点
(set: 'line:pt1:pt2)=(vla-addline pt1 pt2)就创建了一条经pt1,pt2的直线
(set: 'circle:pt1:100)就创建了一条中心点pt1,圆半径为100的圆
如果要wall层,创建5号色的对象可以这样写
(set: 'line:pt1:pt2:layer:wall:color:5)
(set: 'circle:pt1:layer:wall:color:5)
如果要在创建对象的同时,移动,拷贝对象可以如下写:
(set: 'line:pt1:pt2:layer:wall:color:5:move:pt3:pt4)
(set: 'circle:pt1:layer:wall:color:5:copy:pt3:pt4)
程序已更新.
增加一功能: (set: 'line:getpoint:getpoint)可以交互选点.
CAD绘图本质就三部分 一是创建对象 二是修改对象属性 三是查询对象属性
至此"程咬金的三板斧"主要框架已搭成,主要功能已实现,但还有很多工作量没有完成
我在明经也就是个打酱油的,跟在众多高人身后跟班学习,
写这个玩意主要目的,是整合资源,整理函数库,希望写lisp,就象写一句话一样简单
一直以来编程语言都是西方思维,由小到大;
而东方思维却是由大到小,这也是本人实现东方思维编程的一次尝试
希望大家能够互动,提出宝贵意见!
本帖最后由 gbhsu 于 2012-8-20 21:59 编辑
第一节
如果同名选择集如"SS" 重新 (SETQ SS (SSGET))
则使用GET:函数前要使用 (NIL: 'SS)将SS选择集附属的变量释放
;下面介绍一个圆半径的刷子的简单程序
(defun c:tt( / s1 ss var_radius)
(setq s1 (ssget ":S")) ;选取单个对象
(and (ssp: s1) ; 判断s1是否是选择集且长度不为 0
(eq (get: 's1:0:name)"CIRCLE") ;判断s1:0是否为)"CIRCLE"
(or(redraw s1:0 3)t) ;亮显s1:0
(setq ss(ssget '((0 . "CIRCLE")))) ;选取圆的选择集
(ssp: ss) ;判断ss是否是选择集且长度不为 0
(setq var_radius(get: 's1:0:radius)) ;获取s1中圆半径赋予变量var_radius
(put: 'ss:circle:radius:var_radius) ;赋值ss选择集中圆的半径为var_radius
) ;and并列条件满足
(nil: 's1) ;释放s1选择集变量集
(nil: 'ss) ;释放ss选择集变量集,也可以合并写(nil: (list 's1 'ss))
(princ) ;静默退出
) ;结束defun
其实说明了就三行程序,其他都是废话
(setq s1 (ssget ":S")) ;选圆
(setq var_radius (get: 's1:0:radius)) ;获取半径var_radius
(put: 'ss:circle:radius:var_radius) ;赋值ss中圆的半径为var_radius
本帖最后由 gbhsu 于 2012-8-21 21:11 编辑
第二节
TEXT MTEXT CIRCLE INSERT BLOCK ATTDEF DIMENSION......这些是对象名,跟在选择集后可进行分类
NAME RADUIS STRING LIST HEIGHT COLOR......这些是属性名,可以当函数用
例如 (name: en)(color: en)(radius: en)(list: sym)(num: ss)(string: sym)等等,这些函数的参数可以是多种,
ename,vlaobj,string,list大家要试验才知道它的妙处
(list: ss)(list: str)(list: ename)等等
这些内容里含有很多的信息,我没有多少时间仔细说,大家要体验才行
具体的解释,慢慢再补充,可能大家一时没有理解,情有可原
本帖最后由 gbhsu 于 2012-9-24 20:41 编辑
第三节 自学 沙发坐着!!!静候佳音。。。 顶顶。 很强大。 不过新手我觉的还是从基本函数学习好点。 顶起来是必须的,期待早日。。。。。。 顶顶。 很强大 顶顶。 期待中 辛苦了!!!