明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 10346|回复: 51

跟我一起打酱油,轻松学习Lisp编程

    [复制链接]
发表于 2012-8-19 11:44:04 | 显示全部楼层 |阅读模式
本帖最后由 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,就象写一句话一样简单
  一直以来编程语言都是西方思维,由小到大;
而东方思维却是由大到小,这也是本人实现东方思维编程的一次尝试
希望大家能够互动,提出宝贵意见!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 5明经币 +5 金钱 +5 收起 理由
VBALISPER + 1 赞一个!学生前来报道!
lohas1118 + 1 赞一个!
小心蜡笔 + 5 赞一个!
头大无恼 + 1 赞一个!加币,加吼吼
仲文玉 + 2 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2012-8-19 11:44:38 | 显示全部楼层
本帖最后由 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



评分

参与人数 1明经币 +1 收起 理由
adc + 1 赞一个!顺便顶楼主的程序!

查看全部评分

回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2012-8-19 11:45:12 | 显示全部楼层
本帖最后由 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)等等
这些内容里含有很多的信息,我没有多少时间仔细说,大家要体验才行
具体的解释,慢慢再补充,可能大家一时没有理解,情有可原
 楼主| 发表于 2012-8-19 11:46:37 | 显示全部楼层
本帖最后由 gbhsu 于 2012-9-24 20:41 编辑

第三节      自学                           
发表于 2012-8-19 11:46:38 | 显示全部楼层
沙发坐着!!!静候佳音。。。
发表于 2012-8-19 11:50:47 | 显示全部楼层
顶顶。 很强大。 不过新手我觉的还是从基本函数学习好点。
发表于 2012-8-19 11:57:17 | 显示全部楼层
顶起来是必须的,期待早日。。。。。。
发表于 2012-8-19 13:07:20 | 显示全部楼层
顶顶。 很强大
发表于 2012-8-19 14:42:32 | 显示全部楼层
顶顶。
发表于 2012-8-19 14:43:47 | 显示全部楼层
期待中 辛苦了!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-9 21:12 , Processed in 0.273278 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表