- UID
- 42964
- 积分
- 2669
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-4-14
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
网上收集的AutoLISP程序源码之一
========== 实用程序范例 (楼梯剖面) ==========
----- 程序简介 -----
在使用者输入各项资料后,程序自动计算出每级楼梯的宽度及高度;
利用重复及不断更新坐标位置的方法,划出楼梯的剖面.
这是一个很典型的回圈程序范例.
----- 程序码 -----
(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) <X> ? "))
(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> ? 输入X等于垂直对齐,Y等于水平对齐,默认值(按下ENTER)为X
3. Select Object : 选取其它要对齐的文字对象
----- 注意事项 -----
1. 在第3步骤选取的对象中,可包含非文字对象,但当中只有文字对象会进行对齐处理
2. 在程序中修改的是文字的插入点(DXF码10),而不是文字的对齐点(DXF码11) |
|