找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: ll_j

[原创]:Autolisp编程心得(有"心得"别忘了往里面贴,加币&分!)

[复制链接]
发表于 2004-1-9 11:40:14 | 显示全部楼层
最初由 灯火 发布
[B]"LISPDOC"不止可以检查局部变量,索性用它作最后处理。
下面演示为本人喜欢用的方法: [/B]


老孟兄你用这么复杂方法?
其实可以用vl语法检查直接报出。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-10 00:47:47 | 显示全部楼层
最初由 teatree 发布
[B]lisp运行太慢了 [/B]


运行快的学得慢.:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-20 14:35:13 | 显示全部楼层
最初由 cy956 发布
[B]

老孟兄你用这么复杂方法?
其实可以用vl语法检查直接报出。 [/B]


老菜的方法确实更好,受教!
有没有办法让检查结果不要变成大写?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-27 17:18:35 | 显示全部楼层
因为我一直用R14,所以只能使用LISP,程序编了不少,但是技巧没有学到,一本LISP的书倒是发现不少错误,现向初学者说一点心得(只针对初学者):

1. ""与nil的区别,""表示空字符串,nil表示空表或者空原子
2. 使用(command 命令 参数)函数时要小心,因为“参数”可能未nil,这时程序就会被中断,初学者一般被弄的莫名其妙。如(command "erase" (ssget "x" '((8 . "ABC"))) "")就不是很健壮的程序,最好先判断(ssget "x" '((8 . "ABC"))) 是否为空
3. print函数从下一行开头打印,并且给字符串加双引号,princ函数紧跟上次的打印位置打印,不加双引号
4. (strcat "" "我爱你"),可以将空字符串与字符串连接
5. 字符串比较函数判断时,(= (wcmatch txt "*我的*") T),注意函数最后的T表示“是”,不能加等号
6. 条件运算符“-4”,只适用于ads_ssget和ssget函数,如:
      (ssget "x" '((-4 . "<OR")
                              (0 . "POLYLINE")
                              (0 . "LWPOLYLINE")
                              (0 . "LINE")
                              (-4 . "OR>")
                             )
            )
7. 书写程序时一定要使用缩进式的格式,否则你会后悔不已
8. 一旦你遭遇了上面的难堪,请使用分段排除法,就是先剪切一段程序,看看能不能LOAD,如果可以,那就是剪切的那一段有问题,否则就是剩下的那一段有问题,继续使用这种方法,很快就能找到问题所在
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-13 11:43:57 | 显示全部楼层
供大家参考:((对初学者还比较有用)

========== 实用程序范例 (楼梯剖面) ==========

----- 程序简介 -----

在使用者输入各项资料后,程序自动计算出每级楼梯的宽度及高度;
利用重复及不断更新坐标位置的方法,划出楼梯的剖面.
这是一个很典型的回圈程序范例.

----- 程序码 -----

(DEFUN C:STAIR() (SETQ PT_BASE (GETPOINT "\nStair lower corner : ")
PT_TMP1 (GETPOINT PT_BASE "\nStair length : ")
PT_TMP2 (GETPOINT PT_BASE "\nStair height : ")
TEMP_N (GETINT "\nNumber of step : "))
(IF (OR (< TEMP_N 2) (= TEMP_N NIL)) (PRINC "\nNumber of stair error") (PROGN
(SETQ DIST_L (/ (DISTANCE PT_BASE PT_TMP1) (1- TEMP_N))
DIST_H (/ (DISTANCE PT_BASE PT_TMP2) TEMP_N)
ANGE_1 (ANGLE PT_BASE PT_TMP1)
ANGE_2 (ANGLE PT_BASE PT_TMP2))
(SETQ M_OSM (GETvar "OSMODE")) (SETvar "OSMODE" 0)
(COMMAND "PLINE" PT_BASE)
(REPEAT TEMP_N
(SETQ PT_TMP1 (POLAR PT_BASE ANGE_2 DIST_H))
(SETQ PT_TMP2 (POLAR PT_TMP1 ANGE_1 DIST_L))
(COMMAND PT_TMP1 PT_TMP2)
(SETQ PT_BASE PT_TMP2)
) ;关闭REPEAT
(COMMAND "U" "")
(SETvar OSMODE M_OSM)
)) ;关闭PROGN及IF;
(PRINC)) ;关闭DEFUN


----- 程序说明 -----

第1行 : 设定函数名称;以GETPOINT取得楼梯最底的一点(左边或右边均可),存入变数PT_BASE
第2行 : 用GETPOINT函数,以PT_BASE为基准点,取得楼梯横向的第二点,存入变数PT_TMP1
第3行 : 用GETPOINT函数,以PT_BASE为基准点,取得楼梯纵向的第三点,存入变数PT_TMP2
第4行 : 用GETINT函数,取得楼梯的级数(整数),存入变数TEMP_N
第5行 : 以IF判断输入的级数是否小于2或是(OR)等于NIL;若是则显示讯息,否则以PROGN函数包含以下各程序
第6行 : 用DISTANCE取得楼梯横向长度(PT_BASE至PT_TMP1),除以级数减1(1- TEMP_N),存入变数DIST_L
第7行 : 用DISTANCE取得楼梯纵向高度(PT_BASE至PT_TMP2),除以级数(TEMP_N),存入变数DIST_H
第8行 : 用ANGLE函数,取得横向角度(PT_BASE至PT_TMP1),存入变数ANGE_1
第9行 : 用ANGLE函数,取得纵向角度(PT_BASE至PT_TMP2),存入变数ANGE_2
第10行 : 用GETvar取得目前锁点模式的设定值,存入变数M_OSM;再用SETvar将锁点模式设为0(取消)
第11行 : 以COMMAND函数执行PLINE指令,聚合线的起点为变数PT_BASE(第一选取点)
第12行 : 用REPEAT函数重复执行以下程序(重复次数为变数TEMP_N,即为楼梯级数)
第13行 : 用POLAR取得新座标点:由楼梯(聚合线)起点,沿楼梯纵向角度(变数ANGE_2),距离为变数DIST_H,
存入变数PT_TMP1
第14行 : 用POLAR取得新座标点:由上一点(PT_TMP1)起,沿楼梯横向角度(变数ANGE_1),距离为变数DIST_L,
存入变数PT_TMP2
第15行 : 继续以两个新座标点(变数PT_TMP1,PT_TMP2)作为COMMAND函数(PLINE指令)的输入顶点
第16行 : 将最后取得的坐标点(变数PT_TMP2),存入变数PT_BASE中,并覆盖原值
第17行 : 用以对应REPEAT函数的小括号 : 第13至16行的程序会重复执行TEMP_N次
第18行 : 以COMMAND函数执行”U”选项(PLINE指令),取消最后绘划的一条线,并以空字符串(等于按下ENTER键)
结束PLINE指令(第11行)
第19行 : 用SETvar函数,将锁点模式还原(变数M_OSM)

----- 执行程序 -----

1. Stair lower corner : 选取楼梯最低的一点
2. Stair Length : 输入楼梯的总长度 (可以从键盘输入,或
在屏幕选取一点,与第一选取点的距离作为长度)
3. Stair Height : 输入楼梯的总高度 (可以从键盘输入,或
在屏幕选取一点,与第一选取点的距离作为高度)
4. Number of step : 输入楼梯的级数 (注意 : 输入值不可以小于2,且必须为整数值)




网上收集的AutoLISP程序源码之二


========== 实用程序范例 (单掩门) ==========

----- 程序简介 -----

可让使用者在在线选取门口两点,即可将线段断开;
并可以选取点作为门口的开启方向,划出一单掩门的平面图形.
程序中要特别注意 : 如何决定选取点落在对象的那一边,并作出相应的行动.

----- 程序代码 -----

(DEFUN C:DOOR () (SETQ PT_BASE (GETPOINT "\nSelect door hinge point : ")
PT_TMP1 (GETPOINT "\nSelect door second point : ")
PT_SIDE (GETPOINT "\nSelect door open side : ")
ANGE_1 (ANGLE PT_BASE PT_TMP1) ANGE_2 (/ PI 2)
DIST_1 (DISTANCE PT_BASE PT_TMP1))
(SETQ M_OSM (GETvar "OSMODE")) (SETvar "OSMODE" 0)
(SETQ GOP_1 (SSGET PT_BASE) GOP_2 (SSGET PT_TMP1))
(SETQ ENT_1 (SSNAME GOP_1 0) ENT_2 (SSNAME GOP_2 0))
(IF (NOT (EQUAL ENT_1 ENT_2))
(PRINC "\n** Select Two object is different **") (PROGN
(COMMAND "BREAK" PT_BASE "F" PT_BASE PT_TMP1)
(SETQ PT_TMP2 (POLAR PT_BASE (+ ANGE_1 ANGE_2) 1000)
PT_TMP3 (POLAR PT_BASE (- ANGE_1 ANGE_2) 1000))
(IF (< (DISTANCE PT_SIDE PT_TMP2) (DISTANCE PT_SIDE PT_TMP3))
(SETQ ANGE_3 (+ ANGE_1 ANGE_2) ANGE_4 (+ ANGE_1 (/ PI 4)))
(SETQ ANGE_3 (- ANGE_1 ANGE_2) ANGE_4 (- ANGE_1 (/ PI 4))))
(SETQ PT_TMP2 (POLAR PT_BASE ANGE_3 DIST_1)
PT_TMP3 (POLAR PT_BASE ANGE_4 DIST_1))
(COMMAND "PLINE" PT_BASE PT_TMP2 "A" "S" PT_TMP3 PT_TMP1 "")
)) ;关闭PROGN及IF
(SETvar "OSMODE" M_OSM) (PRINC))

----- 程序说明 -----

第1行 : 设定函数名称;并以GETPOINT函数取得使用者选取点(门较点),存入变量PT_BASE
第2行 : 以GETPOINT函数取得使用者另一选取点(开门点),存入变数PT_TMP1
第3行 : 以GETPOINT函数取得使用者另一选取点(门口开启的方向),存入变数PT_SIDE
第4行 : 以ANGLE函数取得变量PT_BASE(门较点)至变量PT_TMP1(开门点)的角度,存入变数ANGE_1中;
另外将90度角的弪度值存入变数ANGE_2(弪度PI等于180度角,除2等于90度角的弪度)
第5行 : 以DISTANCE取得变量PT_BASE(门较点)至变量PT_TMP1(开门点)的长度(门的阔度),存入变数DIST_1
第6行 : 用GETvar取得系统变量OSMODE(锁点模式)存入变量M_OSM;并用SETvar将锁点模式设定为0
第7行 : 用SSGET函数取得坐标点PT_BASE及PT_TMP1所在的像素,分别存入选集(变量)GOP_1及GOP_2内
第8行 : 以SSNAME分别取出选集GOP_1及GOP_2内的第一个(亦是唯一的,其序号为0)像素的名称;
分别存入变数ENT_1及ENT_2
第9行 : 用EQUAL函数判断变量ENT_1及ENT_2是否相同(判断两选取坐标点是否在同一对象上)
第10行 : 若变量ENT_1及ENT_2不是相同的对象,显示讯息提示;若是相同的对象,则以PROGN包含以下各程序
第11行 : 用COMMAND函数执行BREAK指令,选取在变量PT_BASE(坐标点)上的对象,再以F响应选取FIRST
选项,并指定变量PT_BASE(坐标点)为第一截断点,变数PT_TMP1(坐标点)为第二截断点
第12行 : 用POLAR取得新坐标点(以PT_BASE为起点,方向为ANGE_1逆时针90度,距离1000)存入变数PT_TMP2
第13行 : 用POLAR取得新坐标点(以PT_BASE为起点,方向为ANGE_1顺时针90度,距离1000)存入变数PT_TMP3
第14行 : 分别以DISTANCE函数测得PT_SIDE(第3行的门口开启方向选取点)与两个新坐标点(第12,13行)的距离;
并以IF函数判断那一个新坐标点较接近(距离较短)变数PT_SIDE
第15行 : 若加90度角的新坐标点较接近变量PT_SIDE,即将角度变量ANGE_1,分别加90度及45度角,再存入变数
ANGE_3及ANGE_4中;否则执行第16行
第16行 : 若减90度角的新坐标点较接近变量PT_SIDE,即将角度变量ANGE_1,分别减90度及45度角,再存入变数
ANGE_3及ANGE_4中
第17行 : 用POLAR取得新坐标点,存入变量PT_TMP2
以PT_BASE为起点,方向为ANGE_3(角度为ANGE_1加或减90度角),距离为变数DIST_1(门口的阔度)
第18行 : 用POLAR取得新坐标点,存入变量PT_TMP3
以PT_BASE为起点,方向为ANGE_4(角度为ANGE_1加或减45度角),距离为变数DIST_1(门口的阔度)
第19行 : 以COMMAND函数执行PLINE指令,选取起点为变量PT_BASE,第二顶点为变量PT_TMP2(第17行设定);
响应A以选取弧段选项,再响应S选取弧段的第二点选项,并输入变量PT_TMP3作为弧段的第二点(第18行设定);
最后一点为变量PT_TMP1(第二行的开门点),最后以空字符串(等于按下ENTER键)结束PLINE指令
第21行 : 使用SETVER函数将系统变量OSMODE还原为变量M_OSM

----- 程序执行 -----

1. Select door hinge point : 在线段上选取一点 (为门较的一边;需配合锁点模式)
2. Select door second point : 在线段上选取二点 (以决定门的阔度及角度,
要注意所选的两点要在同一对象上;需配合锁点模式)
3. Select door open side : 选取第三点 (决定门的开启方向)




网上收集的AutoLISP程序源码之三


========== 实用程序范例 (文字缩写) ==========

----- 程序简介 -----

此程序用以简化常用文字的输入.
程序中将开启一纯文字文件,文件内以每两行为一组 :
第一行是作为搜寻用的文字缩写,第二行为对应该缩写的全写.
使用者只需输入缩写即可得到对应的全写文字.
程序中特别注意 : 如何开启档案并读取数据

----- 程序代码 -----

(DEFUN C:TEXTIN () (SETQ PT_BASE (GETPOINT "\nSelect test start point : ")
TEXT_A (GETSTRING "\nInput the abbreviate text : "))
(SETQ FILE_ID (OPEN "C:\\TEXTIN.TXT" "r") CHECK 0 TEXT_O "")
(SETQ TEXT_T (READ-LINE FILE_ID))
(WHILE (AND (/= TEXT_T NIL) (= CHECK 0))
(IF (= TEXT_T TEXT_A)
(SETQ TEXT_O (READ-LINE FILE_ID) CHECK 1)
(READ-LINE FILE_ID)
) ;关闭IF
(SETQ TEXT_T (READ-LINE FILE_ID))
) ;关闭WHILE
(COND ((= TEXT_A "W")
(SETQ TEXT_O (STRCAT
(GETSTRING "\nInput weld side : ") TEXT_O)))
((= TEXT_A "SW")
(SETQ TEXT_0 (STRCAT "M"
(GETSTRING "\nInput screw diameter : ") "x"
(GETSTRING "\nInput screw length : ") TEXT_O)))
) ;关闭COND
(IF (= TEXT_O "") (SETQ TEXT_O TEXT_A))
(COMMAND "TEXT" PT_BASE "" TEXT_O)
(PRINC)) ;关闭DEFUN

----- 程序说明 -----

第1行 : 设定函数名称;使用GETPOINT函数取得文字的插入点位置,存入变量PT_BASE
第2行 : 使用GETSTRING函数取得使用者输入的缩写文字,存入变量TEXT_A
第3行 : 用OPEN将指定的档案开启("r"=只读模式),并将传回的档案描述子存入变量FILE_ID;设定变量CHECK
初始值为0(在循环中,若搜寻到该缩写文字,变量设为1以终止循环);变量TEXT_O初始值为空字符串
第4行 : 以READ-LINE函数读取指定档案中第一行的字符串(缩写),存入变量TEMP_T
第5行 : WHILE循环函数并设定进入循环的条件 : 变数TEMP_T不是空的(NIL)及(AND)变数CHECK等于0
第6行 : 用IF函数检查字符串(第4行取得的缩写,变量TEXT_T)是否等于使用者输入的缩写字符串(第2行,变量TEXT_A)
第7行 : 若IF条件成立,以READ-LINE函数读取下一行的字符串(全写),存入变量TEXT_O;设定变量CHECK为1(以结束循环)
第8行 : 若IF条件不成立,以READ-LINE函数读取下一行的字符串(全写),但不存入任何变数(作用为跳过一行)
第9,10行 : 关闭IF函数,再以READ-LINE函数读取下一行的字符串(缩写),存入变量TEXT_T并覆盖原值
第11行 : 关闭WHILE函数,返回循环的开头,重新检查条件式是否成立,以确定是否继续执行循环
第12行 : 使用COND函数,检查使用者输入的缩写是否等于W
第13,14行 : 若缩写是等于W,则以GETSTRING函数,要求输入焊接尺寸,并以STRCAT函数连接在档案中取得
的字符串(变量TEMP_O,全写),存回变量TEMP_O中并覆盖原值
第15行 : 检查使用者输入的缩写是否等于SW
第16,17,18行 : 若缩写是等于SW,则以GETSTRING函数,要求输入螺丝直径及长度,并以STRCAT函数连接在
档案中取得的字符串(变量TEMP_O,全写) ,存回变数TEMP_O中并覆盖原值
第19行 : 关闭COND多重条件判断函数
第20行 : 用IF检查变量TEXT_O是否为空字符串(初始值,即在档案中找不到对应的缩写),若是则以使用者的输入
(变量TEXT_A)存入变量TEXT_O,并覆盖原值
第21行 : 以COMMAND函数执行TEXT指令建立文字,插入点为变量PT_BASE,角度以空字符串响应(等于按下
ENTER键),文字符串则是在档案中搜寻到的全写(找不到全写则是使用者输入的缩写)

----- 注意事项 -----

1. 在此例中,档案内的文字或使用者输入的缩写,均有大小写的区别
2. 可在档案的偶数行的全写文字中,键入中文字;但须在执行程序(建立文字)之先,设定所需的中文字型
3. 档案中的文字可用文字编辑器随意增减,但必须遵从格式(基数行是缩写,偶数行是全写)
4. 纯文字文件TEXTIN.TXT必须存放在C磁盘的根目录内

----- 程序执行 -----
1. Select text start point : 选取文字的插入点
2. Input the abbreviate text : 输入缩写文字
3. 因应不同的情况,可能需要输入其它数据
(如上例中的W要输入焊接的大小,SW则要输入螺丝的直径及长度等)


附:“TEXTIN.txt”文件示例

W
mm LEG LENGTH FILLET WELD
SW
mmL STAINLESS STEEL MACHINE SCREW




网上收集的AutoLISP程序源码之四


========== 实用程序范例 (重复偏移) ==========

----- 程序简介 -----

使用者可将选取的对象(不能选取插入对象)连续向同一方向偏移(OFFSET)多次

----- 程序代码 -----

(DEFUN C:OR () (SETQ OBJ (ENTSEL "\nSelect object to offset :"))
(IF (= OBJ NIL) (PRINC "\n** None object select **")
(PROGN (SETQ TEMP_T (CDR (ASSOC 0 (ENTGET (CAR OBJ)))))
(IF (OR (= TEMP_T "ARC")(= TEMP_T "CIRCLE")(= TEMP_T "ELLIPSE")
(= TEMP_T "LINE")(= TEMP_T "LWPOLYLINE")(= TEMP_T "POLYLINE"))
(PROGN
(SETQ PT_SIDE (GETPOINT "\nSelect the offset side :"))
(SETQ TEMP_N 1 TEMP_O 0 TOTAL 0)
(WHILE (> TEMP_N 0)
(SETQ TEMP_N (GETDIST "\nOffset distance <0=EXIT> :"))
(IF (= TEMP_N NIL) (SETQ TEMP_N TEMP_O))
(IF (> TEMP_N 0) (PROGN (SETQ TOTAL (+ TOTAL TEMP_N))
(COMMAND "OFFSET" TOTAL OBJ PT_SIDE "")
(SETQ TEMP_O TEMP_N)
)) ;关闭PROGN及IF
) ;关闭WHILE
(PRINC "\n** Object cannot offset **")
)) ;关闭PROGN及IF
)) ;关闭PROGN及IF
(PRINC)) ;关闭DEFUN

----- 程序说明 -----

第1行 : 设定函数名称;用ENTSEL函数选取对象并存入变量OBJ
第2行 : 用IF函数检查变量OBJ是否为NIL(是否有选取对象),若没有选取对象,则显示讯息提示
第3行 : 若有选取对象,以PROGN函数包含以下各程序;用CAR取出变量OBJ的第一个元素(像素名称),再用
ENTGET函数取得像素数据,以ASSOC配合CDR取出像素数据中的像素型态(DXF码0),存入变量TEMP_T
第4,5行 : 用IF检查像素型态(变量TEMP_T)是否为 : 线,图,椭图,弧,细聚合线其中之一
第6行 : 若为上列其中一种型态,则以PROGN包含以下各程序
第7行 : 用GETPOINT函数取得坐标点(偏移方向),存入变量PT_SIDE
第8行 : 将1存入变量TEMP_N(储存新数值),0存入变量TEMP_O(储存旧数值),0存入变量TOTAL(储存累加值)
第9行 : 用WHILE循环函数以重复执行程序;进入循环的条件为 : 变量TEMP_N(储存新数值)不是0值
第10行 : 用GETDIST取得使用者输入(屏幕选取或键盘输入)的偏移距离,并存入变量TEMP_N(储存新数值)
第11行 : 用IF判断使用者的输入是否为NIL(变量TEMP_N);若是,则将变量TEMP_O(储存旧数值)存入变量TEMP_N
第12行 : 用IF判断使用者的输入是否大于0(变量TEMP_N);若是,则以PROGN包含以下各程序
将使用者的输入(变量TEMP_N)加上累加值(变量TOTAL),存回变量TOTAL内并覆盖原值
第13行 : 用COMMAND函数执行OFFSET指令,并设定偏移的距离为变量TOTAL(累加值),偏移的对象为变量OBJ
(在第1行中选取的),偏移方向选取点为变数PT_SIDE(在第7行选取的)
第14行 : 将变量TEMP_N(使用者输入的新数值)存入变量TEMP_O(储存旧数值);作用是在第11行中.若以NIL
响应输入时,可重复偏移上一次设定的距离
第15行 : 左边的关括号是对应第12行的PROGN,右边的关括号则是对应第12行的IF函数
第16行 : 关闭第9行的WHILE函数,其中10至15行的程序会否被重复执行,则视乎第10行的输入值(偏移距离)是否为0
第17行 : 对应第4,5行的IF判断;若选取的像素不属于指定的型态时,显示讯息提示
第18行 : 左边的关括号是对应第6行的PROGN,右边的关括号则是对应第4行的IF函数
第19行 : 左边的关括号是对应第3行的PROGN,右边的关括号则是对应第2行的IF函数

----- 程序执行 -----

1. Select object to offset : 选取要偏移的对象
2. Select the offset side : 选取一点,为对象的偏移方向
3. Offset distance <0=EXIT> 输入对象的偏移距离
(输入0会结束程序,按ENTER则重复偏移上一次的距离)




网上收集的AutoLISP程序源码之五


========== 实用程序范例 (折断符号) ==========

----- 程序简介 -----

在选取的对象上选取两点,然后将其断开;再以一指定的距离,在断开的部份,划出一折断符号

----- 程序代码 -----

(DEFUN C:BK () (SETQ OSM (GETvar "OSMODE")) (SETvar "OSMODE" 512)
(SETQ PT_TMP1 (GETPOINT "\nFirst point :"))
(SETQ PT_TMP2 (GETPOINT PT_TMP1 "\nSecond point :")) (SETvar "OSMODE" 0)
(SETQ DST1 (GETDIST "\nDistance point :" PT_TMP2)
ANGE1 (/ PI 2) DST2 (/ (DISTANCE PT_TMP1 PT_TMP2) 4)
ANGE2 (ANGLE PT_TMP1 PT_TMP2)
PT_TMP3 (POLAR PT_TMP1 ANGE2 DST2)
PT_TMP4 (POLAR PT_TMP3 (+ ANGE2 ANGE1) DST1)
PT_TMP3 (POLAR PT_TMP1 ANGE2 (* DST2 3))
PT_TMP5 (POLAR PT_TMP3 (- ANGE2 ANGE1) DST1))
(COMMAND "BREAK" PT_TMP1 PT_TMP2)
(COMMAND "PLINE" PT_TMP1 PT_TMP4 PT_TMP5 PT_TMP2 "")
(SETvar "OSMODE" OSM) (PRINC))
----- 程序说明 -----

第1行 : 设定函数名称;以GETvar取得系统变量OSMODE(锁点模式),存入变量OSM;再使用SETvar函数将
锁点模式设定为接近模式(NEA,代号为512)
第2行 : 用GETPOINT函数,选取对象上的一点,并将该坐标值存入变数PT_TMP1
第3行 : 用GETPOINT函数,以PT_TMP1为基准点,选取对象上的第二点,存入变数PT_TMP2
使用SETvar函数将系统变量OSMODE(锁点模式)设定为0(取消)
第4行 : 用GETDIST函数,输入距离值,存入变量DIST1
(可从键盘直接输入,或在屏幕上选取一点,与第二选取点的距离为长度)
第5行 : 将90度角的弪度(PI等于180度角)存入变数ANGE1
用DISTANCE函数,取得第一及第二选取点的距离;再除以4份,将结果存入变量DST2
第6行 : 用ANGLE函数,取得由第一选取点至第二选取点的角度;存入变数ANGE2
第7行 : 用POLAR函数,取得新的坐标点,存入变量PT_TMP3 : 从第一选取点开始,角度为ANGE2,距离为DST2
第8行 : 用POLAR函数,取得新的坐标点,存入变量PT_TMP4 :
从上一点(PT_TMP3)开始,角度为ANGE2加ANGE1(90度角),距离为DST1
第9行 : 用POLAR函数,取得新的坐标点,存入变量PT_TMP3 :
从第一选取点开始,角度为ANGE2,距离为DST2乘3(第一至第二选取点距离的4份之3)
第10行 : 用POLAR函数,取得新的坐标点,存入变量PT_TMP5 :
从上一点点(PT_TMP3)开始,角度为ANGE2减ANGE1(90度角),距离为DST1
注意最右边的关括号,是对应第4行最左边的开括号(SETQ函数)
第11行 : 以COMMAND函数执行BREAK指令,将对象从第一选取点(PT_TMP1)至第二选取点(PT_TMP2)断开
第12行 : 以COMMAND函数执行PLINE指令,顺序设定四个聚合线的顶点,最后以一个空字符串("",等于按下ENTER)
响应,以结束PLINE指令
第13行 : 使用SETvar函数,设定系统变量OSMODE(锁点模式)为变量OSM(将锁点模式还原)
以一个不带任何参数的PRINC函数,抑制多余的传回值或显示
最右边的关括号是对应第1行,最左边的开括号(DEFUN函数)

----- 执行程序 -----

1. First point : 选取对象上的一点 (自动设定为接近锁点模式)
2. Second point : 选取对象上的一点 (自动设定为接近锁点模式)
3. Distance point : 输入距离 (此时锁点模式取消,使用者可从键盘直接输入,
或在屏幕选取一点,与第二选取的距离作为长度)
----- 注意事项 -----
1. 第一及第二选取点必须落在同一对象上,而程序中并没有检查两个选取点是否选取了同一个对象
(若有需要可参考单掩门的范例并作出修改)
2. 若要断开的是圆对象,则第二选取点,须落在第一选取点的逆时针方向
3. 若要断开的是聚合线,且两选取点间包含有顶点,则选取点中间的所有顶点会消失,直接从第一选取点绘划一折断符号至第二选取点
4. 只可选取圆,弧,直线段,聚合线对象
(为了简化程序,并没有进行型态检查;若有需要可参考重复偏移的范例并作出修改)




网上收集的AutoLISP程序源码之六


========== 实用程序范例 (调节长孔) ==========

----- 程序简介 -----

在使用者选取调节长孔(SLOT HOLE)的中心点后,划出图形

----- 程序代码 -----

(DEFUN C:SL() (SETQ PT_BASE (GETPOINT "\nSlot hole center : ")
TEMP_P (GETPOINT PT_BASE "\nSlot hole length : ")
TEMP_R (GETDIST PT_BASE "\nSlot hole radius : ")
ANGE1 (ANGLE PT_BASE TEMP_P) ANGE2 (/ PI 2)
TEMP_L (DISTANCE PT_BASE TEMP_P)
DIST1 (/ (- TEMP_L TEMP_R TEMP_R) 2))
(SETQ OSM (GETvar "OSMODE")) (SETvar "OSMODE" 0)
(IF (<= TEMP_L (* TEMP_R 2))
(PRINC "\nERROR : Length <= diameter") (PROGN
(SETQ PT_TMP1 (POLAR PT_BASE (+ ANGE1 ANGE2) TEMP_R)
PT_TMP1 (POLAR PT_TMP1 ANGE1 DIST1))
(COMMAND "PLINE" PT_TMP1 "A" "S"
(SETQ PT_TMP2 (POLAR PT_BASE ANGE1 (+ DIST1 TEMP_R)))
(SETQ PT_TMP3 (POLAR PT_TMP1 (- ANGE1 ANGE2) (* TEMP_R 2)))
"L"
(SETQ PT_TMP4 (POLAR PT_TMP3 (- ANGE1 PI) (* DIST1 2)))
"A" "S"
(SETQ PT_TMP5 (POLAR PT_BASE (- ANGE1 PI) (+ DIST1 TEMP_R)))
(SETQ PT_TMP6 (POLAR PT_TMP1 (- ANGE1 PI) (* DIST1 2)))
"L" "CL")
))
(SETvar "OSMODE" OSM)
(PRINC))

----- 程序说明 -----

第1行 : 设定函数名称;以GETPOINT取得调节长孔的中心点,存入变量PT_BASE
第2行 : 用GETPOINT函数,以PT_BASE为基准点,取得第二个选取点,存入变量TEMP_P(整个长孔的长度)
第3行 : 用GETDIST函数,以PT_BASE为基准点,取得调节长孔的半径,存入变量TEMP_R
第4行 : 用ANGLE函数,取得由第一选取点(调节长孔的中心,变数PT_BASE),至第二选取点(TEMP_P)的角度,
存入变数ANGE1;并将90度角的弪度存入变数ANGE2(圆周率PI=180度角,除2等于90度)
第5行 : 用DISTANCE函数,取得第一选取点至第二选取点的距离,存入变数TEMP_L
第6行 : 先将长度(变数TEMP_L)减两个半径(变量TEMP_R),再除以2的结果,存入变量DIST1(等于直线段的一半)
第7行 : 用GETvar函数,取得目前锁点模式(OSMODE)的设定值,存入变量OSM;
再使用SETvar函数,将锁点模式设定为0 (取消)
第8行 : 用IF函数检查输入的长度(变量DIST1),是否小于或等于半径(变量TEMP_R)乘2(等于直径)
第9行 : 若是,则用PRINC函数显示错误讯息(长度大短,不能绘昼);否则以PROGN函数包含各后续要执行的程序
第10行 : 使用POLAR函数,取得新的坐标位置,存入变量PT_TMP1 : 新坐标以调节长孔的中心(变数PT_BASE)
开始,角度为变量ANGE1加90度角(变数ANGE2),距离为调节长孔的半径
第11行 : 使用POLAR函数,取得新的坐标位置(聚合线的起点),存入变量PT_TMP1 :
以对上一点(变量PT_TMP1)开始,角度为ANGE1,距离为变量DIST1(直线段的一半)
第12行 : 用COMMAND函数,执行PLINE指令,聚合线的起点为变量PT_TMP1,用"A"选项设定为弧段,
并使用"S"选项以设定弧段的第二点
第13行 : 使用POLAR函数,取得新的坐标位置,存入变量PT_TMP2,并作为弧段的第二选取点 :
从调节长孔的中心点(变量PT_BASE)开始,角度为ANGE1,距离为变量DIST1加半径(变数TEMP_R)
第14行 : 使用POLAR函数,取得新的坐标位置,存入变量PT_TMP3,并作为弧段的终点 :
从坐标点变量PT_TMP1开始,角度为ANGE1减90度角(变数ANGE2),距离为直径(变数TEMP_R的2倍)
第14行 : 设定PLINE指令的"L"选取,划出直线段
第15行 : 使用POLAR函数,取得新的坐标位置,存入变量PT_TMP4,作为直线段的终点 : 从对上一点(变数
PT_TMP3)开始,角度为变量ANGE1的相反方向(弪度PI等于180度角),距离为变数DIST1的2倍
第16行 : 使用PLINE指令的"A"选项设定为弧段模式,再使用"S"选项以设定弧段的第二选取点
第17行 : 使用POLAR函数,取得新的坐标位置,存入变量PT_TMP5,作为弧段的第二选取点 : 从调节长孔的中心点
(变量PT_BASE)开始,角度为变量ANGE1的相反方向,距离为变数DIST1加半径(变数TEMP_R)
第18行 : 使用POLAR函数,取得新的坐标位置,存入变量PT_TMP6,作为弧段的终点 :
从坐标点变量PT_TMP1(聚合线的起点)开始,角度为变量ANGE1的相反方向,距离为变数DIST1的2倍
第19行 : 使用PLINE指令的"L"选项,设定为直线段模式,再使用"CL"选项,将聚合线以直线段封闭
第20行 : 左边的关括号是对应第9行的PROGN函数;右边的关括号则是对应第8行的IF函数
第21行 : 用SETvar函数,将锁点模式还原(变量M_OSM)
第22行 : 使用一个不带任何参数的PRINC函数,以抑制多余的传回值及显示
最右边的关括号是对应第1行的DEFUN函数

----- 执行程序 -----

1. Slot hole center : 选取调节长孔的中心点
2. Slot hole Length : 输入调节长孔的总长度 (可以从键盘输入,
或在屏幕选取一点,与第一选取点的距离作为长度)
3. Slot hole radius : 输入调节长孔的半径 (可以从键盘输入,
或在屏幕选取一点,与第一选取点的距离作为半径)




网上收集的AutoLISP程序源码之七


========== 实用程序范例 (虚拟中点) ==========

----- 程序简介 -----

本程序主要作为通透指令使用,以选取两点间的中点

----- 程序代码 -----

(DEFUN C:MIDE () (SETQ PT_TMP1 (GETPOINT "\nSelect first point : ")
PT_TMP2 (GETPOINT PT_TMP1 "\nSelect second point : ")
ANGE_1 (ANGLE PT_TMP1 PT_TMP2)
DIST (/ (DISTANCE PT_TMP1 PT_TMP2) 2))
(SETQ PT_MID (POLAR PT_TMP1 ANGE_1 DIST))
) ;关闭DEFUN

----- 程序说明 -----

第1行 : 用GETPOINT函数取得第一选取点,存入变量PT_TMP1
第2行 : 用GETPOINT函数取得第二选取点,存入变量PT_TMP2
第3行 : 用ANGLE函数取得第一选取点(变量PT_TMP1)至第二选取点(变数PT_TMP2)的角度
第4行 : 用DISTANCE取得第一选取点(变量PT_TMP1)至第二选取点(变数PT_TMP2)的距离的一半,存入变数DIST
第5行 : 用POLAR取得新坐标点,存入变量PT_MID
从第一选取点(变数PT_TMP1)起,方向为变数ANGE_1,距离为变数DIST(两选取点距离的一半)

----- 程序执行 -----

1. Select first point : 选取第一点 (可配合适当的锁点模式)
2. Select second point : 选取第二点 (可配合适当的锁点模式,
与第一选取点的中点,即为虚拟中点)




网上收集的AutoLISP程序源码之八


========== 实用程序范例 (文字对齐) ==========

----- 程序简介 -----

先选取一文字对象为基准,再选取其它的文字对象,水平及垂直对齐第一个选取的文字对象

----- 程序代码 -----

(DEFUN C:TX () (SETQ ENT (ENTSEL "\nSelect \"TEXT\" object :"))
(IF (= ENT NIL) (PRINC "\nNone object select") (PROGN
(SETQ ENT (ENTGET (CAR ENT)))
(IF (/= (CDR (ASSOC 0 ENT)) "TEXT") (PRINC "\nObject is not a TEXT")
(PROGN (INITGET 128 "X Y")
(SETQ YESNO (GETKWORD "\nVertical(X) / Horizontal(Y) ? "))
(IF (OR (= YESNO "X") (= YESNO NIL))
(SETQ PT_BASE (CADR (ASSOC 10 ENT)))
(SETQ PT_BASE (CAR (CDDR (ASSOC 10 ENT)))))
(SETQ GOP (SSGET) COUNT 0 TOTAL 0)
(REPEAT (SSLENGTH GOP)
(SETQ NEXT (ENTGET (SSNAME GOP COUNT)))
(IF (= (CDR (ASSOC 0 NEXT)) "TEXT") (PROGN
(SETQ TEMP1 (CAR (CDR (ASSOC 10 NEXT)))
TEMP2 (CADR (CDR (ASSOC 10 NEXT)))
TEMP3 (CAR (CDDR (CDR (ASSOC 10 NEXT)))))
(IF (OR (= YESNO "X") (= YESNO NIL))
(SETQ PT_NEW (LIST PT_BASE TEMP2 TEMP3))
(SETQ PT_NEW (LIST TEMP1 PT_BASE TEMP3)))
(SETQ NEXT (SUBST (CONS 10 PT_NEW) (ASSOC 10 NEXT) NEXT))
(ENTMOD NEXT)
(SETQ TOTAL (1+ TOTAL))
))
(SETQ COUNT (1+ COUNT))
)
(PRINC "\nTotal ") (PRINC TOTAL) (PRINC " object to change")
))
))
(PRINC))

----- 程序说明 -----

第1行 : 设定函数名称;以ENTSEL函数选取对象,并存入变量ENT中
第2行 : 用IF判断变量ENT是否为空值(NIL) : 若是会显示讯息,否则以PROGN函数包含各后续执行的程序
第3行 : 用CAR配合ENTGET函数,取得选取对象(变量ENT)的数据,并存入变量ENT中(覆盖原值)
第4行 : 用ASSOC配合CDR函数,取得对象的型态数据(DXF码0),再用IF函数判断是否为TEXT(文字型态);
若不是文字型态,则显示错误讯息.
第5行 : 若选取的对象是文字型态,则以PROGN函数包含各后续执行的程序;
用INITGET函数设定输入限制及关键词为X及Y
第6行 : 用GETKWORD函数,取得使用者的选择,并存入变量YESNO
第7行 : 若使用者输入X或(OR)按ENTER(传回值为NIL)响应,执行第8行程序,否则执行第9行程序
第8行 : 以ASSOC配合CDR函数,取得对象数据(变量ENT)中,文字插入点(DXF码10)的坐标中的X坐标值,
存入变数PT_BASE
第9行 : 以ASSOC配合CDDR及CAR函数,取得对象数据(变量ENT)中,文字插入点(DXF码10)的坐标中的
Y坐标值,存入变数PT_BASE
第10行 : 用SSGET函数选取其它对象,存入变量GOP;将变量COUNT的初始值设定为0,作为选集(变量GOP)
的索引值,以取得选集中各像素;变量TOTAL初始值为0,用以计算有多少个文字对象被对齐
第11行 : 以REPEAT函数使程序重复执行,执行的次数为选集中对象的总数,以SSLENGTH函数取得
第12行 : 用SSNAME函数取得选集(变量GOP)中,第COUNT(索引号)个对象的名称;再以ENTGET函数取得
该对象的像素数据,存入变量NEXT中
第13行 : 用ASSOC配合CDR函数,最得对象(变量NEXT)的像素型态,并用IF函数检查是否为文字对象(TEXT);
若条件成立(是文字对象),则以PROGN函数包含各后续要执行的程序
第14行 : 用ASSOC配合CDR及CAR函数,取得文字的插入点(DXF码10)中的X坐标值,存入变数TEMP1
第15行 : 用ASSOC配合CDR及CADR函数,取得文字的插入点(DXF码10)中的Y坐标值,存入变数TEMP2
第16行 : 用ASSOC配合CDR,CDDR及CAR函数,取得文字的插入点(DXF码10)中的Z坐标值,存入变数TEMP2
第17行 : 若使用者选择垂直对齐(变量YESNO等于X或NIL),执行第18行程序,否则执行第19行程序
第18行 : 若选择垂直对齐 :用LIST函数,将各变量(坐标值)重新组合成新坐标点,并存入变量PT_NEW (注意X坐标被修改)
第19行 : 若选择水平对齐 :用LIST函数,将各变量(坐标值)重新组合成新坐标点,并存入变量PT_NEW (注意Y坐标被修改)
第20行 : 用SUBST函数进行串行元素的搜寻(以ASSOC函数取得数数ENT中,DXF码为10的元素)及取代
(用CONS将新的插入点 - 变量PT_NEW,建立为要替换的串行),将替换后的像素数据存回变量NEXT
第21行 : 将更新后的像素数据(变量NEXT),作为ENTMOD的参数,使像素在屏幕上更新
第22行 : 使用1+函数,使变量TOTAL递增(累计修改文字插入点的数量),再存回相同的变数中覆盖原值
第23行 : 左边的关括号是对应第13行的PROGN函数, 右边的关括号是对应第13行的IF函数
第24行 : 使用1+函数,使变量COUNT(选集的索引值)递增,再存回相同的变数中覆盖原值
第25行 : 关括号是对应第11行的REPEAT函数, 使中间的各程序(第12至24)重复执行
第26行 : 在完成选集中各像素的处理后,使用3个PRINC函数显示总共有多少个文字对象被修改
第27行 : 左边的关括号是对应第5行的PROGN函数, 右边的关括号是对应第4行的IF函数
第28行 : 左边的关括号是对应第2行的PROGN函数, 右边的关括号是对应第2行的IF函数
第29行 : 使用一个不带自变量的PRINC函数,以抑制多余的显示及传回值
最右边的关括号则是对应第1行的DEFUN函数

----- 执行程序 -----

1. Select "TEXT" object : 选取一文字对象为基准
2. Vertical (X) / Horizontal (Y) ? 输入X等于垂直对齐,Y等于水平对齐,默认值(按下ENTER)为X
3. Select Object : 选取其它要对齐的文字对象

----- 注意事项 -----

1. 在第3步骤选取的对象中,可包含非文字对象,但当中只有文字对象会进行对齐处理
2. 在程序中修改的是文字的插入点(DXF码10),而不是文字的对齐点(DXF码11)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-20 07:57:46 | 显示全部楼层
我也来凑凑热闹:
1、尽量少用COMMAND函数,改用VLA-函数,有利于程序的稳定。
2、遇到解决不了的问题,不要硬往墙上撞,可以先绕过去。
3、提供两个调试用函数:

  1.   [FONT=courier new]
  2. ;功能:显示实体的属性和方法
  3. ;调用方式:(XSVBA VBAOBJ)
  4. ;参数:VBAOBJ    VLA-OBJECT
  5. ;返回值:如果提供VBAOBJ为VLA-OBJECT,则返回VBAOBJ的属性和方法,如果VBAOBJ不为VLA-OBJECT,这提示你选择实体,并返回选中实体的属性和方法,否则返回NIL。
  6. (defun XSVBA (VBAOBJ /)
  7.   (if (= (type VBAOBJ) 'VLA-OBJECT)
  8.     (vlax-dump-object VBAOBJ t)
  9.     (if        (setq VBAOBJ (entsel "选择实体:"))
  10.       (progn
  11.         (setq vbaobj (car vbaobj))
  12.         (setq vbaobj (vlax-ename->vla-object vbaobj))
  13.         (vlax-dump-object VBAOBJ t)
  14.       )
  15.       (princ)
  16.     )
  17.   )
  18. )
  19. ;功能:显示实体的DXF代码
  20. ;调用方式:(XSVBA ENT)
  21. ;参数:ENT ENAME
  22. ;返回值:如果提供ENT为ENAME,则返回ENT 的DXF代码,如果ENT 不为ENAME,这提示你选择实体,并返回选中实体的DXF代码,否则返回NIL。
  23. (defun xsdxf (ent / )
  24.   (if (and ent (= (type ent) 'ENAME))
  25.     (entget ent '("*"))
  26.     (if (setq ent (entsel))
  27.       (entget (car ent) '("*"))
  28.       nil
  29.       )
  30.     )
  31.   )
  32.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-20 21:40:04 | 显示全部楼层
自编的调试工具是随意写着玩的,往往很有意思。因为截图和制作幻灯片,经常需要切换背景颜色,后来写了一个程序。本来用VBA写更容易些,为了实验特意用Vlisp来写。
[PHP]
(defun c:BackColor (/                  objPreferences
                    objDisplay          oldColor        varBlack
                    varWhite          acDocument
                   )
  (setq objPreferences (vla-get-Preferences (vlax-get-acad-Object)))
  (setq objDisplay (vla-get-Display objPreferences))
  (setq varBlack (vlax-Make-Variant 0 vlax-vbLong))
  (setq varWhite (vlax-Make-Variant 16777215 vlax-vbLong))
  (setq acDocument (vla-get-ActiveDocument (vlax-get-acad-Object)))
  (cond        ((= (vla-get-ActiveSpace acDocument) acModelSpace)
         (setq oldColor
                (vlax-Variant-Value
                  (vlax-Variant-Change-Type
                    (vla-Get-GraphicsWinModelBackgrndColor objDisplay)
                    vlax-vbLong
                  )
                )
         )
         (vla-Put-GraphicsWinModelBackgrndColor
           objDisplay
           (if (= oldColor 0)
             varWhite
             varBlack
           )
         )
         (vla-Put-ModelCrosshairColor
           objDisplay
           (if (= oldColor 0)
             varBlack
             varWhite
           )
         )
        )
        ((= (vla-get-ActiveSpace acDocument) acPaperSpace)
         (setq oldColor
                (vlax-Variant-Value
                  (vlax-Variant-Change-Type
                    (vla-Get-GraphicsWinLayoutBackgrndColor objDisplay)
                    vlax-vbLong
                  )
                )
         )
         (vla-Put-GraphicsWinLayoutBackgrndColor
           objDisplay
           (if (= oldColor 0)
             varWhite
             varBlack
           )
         )
         (vla-Put-LayoutCrosshairColor
           objDisplay
           (if (= oldColor 0)
             varBlack
             varWhite
           )
         )
        )
  )
  (princ)
)
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-21 04:46:31 | 显示全部楼层
灯火,这么改虽然使用有效,但是后来看 display的属性,那些改过的都显示
错误: LispFromPtr failed. The type is not supported: 19
why?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-31 19:31:45 | 显示全部楼层
我在40楼的发表内容申请加分,请斑竹看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-1 22:06:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
感觉lisp的语法跟其他常用语言的语法差别比较大,入门不是很方便
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-6-5 09:42:12 | 显示全部楼层

Re: [原创]:Autolisp编程心得

请大虾帮小弟看看下面的程什么问题?
(defun c:gq (/ pti1 pti2 pti3 pti4 pti5        pti6 pti7 pti8 pti9 pti10 pti11
             pti12 pti13 ss)
  (setq pti1 (getpoint "插入点:"))
  (setq pti2 (polar pti1 pi 16.0))
  (setq pti3 (polar pti1 0.0 16.0))
  (setq pti4 (polar pti1 (/ pi 2) 24.0))
  (setq pti5 (polar pti1 (* pi 1.5) 24.0))
  (setq pti6 (polar pti1 pi 8.0))
  (setq pti7 (polar pti1 (* pi 1.5) 16.0))
  (setq pti8 (polar pti1 0.0 8.0))
  (setq pti9 (polar pti1 (/ pi 2) 16.0))
  (setq pti10 (polar pti1 (/ pi 4) 5.0))
  (setq pti11 (polar pti3 (* pi 1.5) 24.0))
  (setq pti12 (polar pti2 (/ pi 2) 24.0))
  (setq pti13 (inters pti2 pti3 pti4 pti5))
  (if (tblsearch "layer" "螺栓")
    (progn
      (command "layer" "s" "螺栓" "")
    )
    (progn
      (command "layer" "m" "螺栓" "c" "15" "" "")
    )
  )
  (command "-osnap" "off")
  (command "layer" "s" "螺栓" "")
  (command "color" "bylayer")
  (setvar "plinewid" 0.0)
  (command "pline" pti6 pti7 pti8 pti9 "c" "")
  (setvar "HPNAME" "solid")
  (command "-bhatch" pti10 "")
  (command "line" pti2 pti3 "")
  (command "line" pti4 pti5 "")
  (setq ss (ssget "c" pti11 pti12))
  (if (tblsearch "block" "高强螺栓")
    (progn
      (command "erase" ss "")
      (command "-insert" "高强螺栓" pti1 "" "" "")
    )
    (progn
      (command "-block" "高强螺栓" pti13 ss "")
      (command "-insert" "高强螺栓" pti1 "" "" "")
    )
  )
  (command "-osnap" "end,mid,int,cen,qua,nod,ext")
)
运行后CAD提示“点在对象上”可能是插点的选择问题,但又不知道怎么解决?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-7 16:40:47 | 显示全部楼层
马虎鬼!
(command "-block" "高强螺栓" pti13 ss "")  
中的pti13 应为pti3
!!!!!hai
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-11 20:09:10 | 显示全部楼层
最初由 hi71400 发布
[B]马虎鬼!
(command "-block" "高强螺栓" pti13 ss "")  
中的pti13 应为pti3
!!!!!hai [/B]

你才马虎,我要选的是螺栓中心,你看懂没有?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-14 09:01:43 | 显示全部楼层
lisp最适用经常做重复性的工作,比如cad
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-14 10:55:39 | 显示全部楼层
如果有大量的计算,我想不应该使用LISP。LISP不是一个很难学的东西,可根据具体要求随时编写、随时修改,用到哪儿学哪儿。
当然,有一个值得上传的LISP,则应规范化、格式化,使人可以看得很明白。这才是LISP的优势。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-27 19:44 , Processed in 0.464021 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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