找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2837|回复: 38

[分享]:[分享]网上收集的AutoLISP程序源码

[复制链接]
发表于 2004-4-10 13:01:02 | 显示全部楼层 |阅读模式

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

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

×
网上收集的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)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-4-11 08:41:30 | 显示全部楼层
注释的很详细,
我是个新手,这对我很有用。
谢谢!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-11 16:54:02 | 显示全部楼层
哇,长老真是太好了,这些注释对我等初学者太有用了。谢谢了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2004-4-11 17:24:52 | 显示全部楼层
大家别客气,上面的程序不是我原创,是我在网上搜集的,希望对大家有用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2004-4-11 20:40:48 | 显示全部楼层
解释的真好
可惜没有人帮我们解释我们的帖子

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2004-4-16 22:26:59 | 显示全部楼层
实在是很不错!
对于初学者来说,是一个很好的东西!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-22 10:46:04 | 显示全部楼层
还是长老好呀~~
强烈支持~~
偶刚开始学LISP
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3719个

财富等级: 富可敌国

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

使用道具 举报

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

使用道具 举报

已领礼包: 208个

财富等级: 日进斗金

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 11:48 , Processed in 0.364638 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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