lisp捕捉垂足_详细分析G版的“自定义带捕捉的grread函数”源代码

无私奉献了此源代码,使我能给自己的程序顺利增加了

拖放中实现点捕捉 的功能。

开心之余,也对这个函数本身很好奇,于是就逐句分析了源程序并做了注释,在此记录下来供自己和网友查阅。

再次声明:本文列出的源代码,其版权归明经通道的超版 Gu_xl

所有;原帖地址是: http://bbs.mjtd.com/thread-91191-1-1.html

本人在此只是根据自己的理解对源程序进行了注释和说明;说明和注释有谬误之处尽管拍砖。

;;;==================================================================

;;gxl-Sel-ReDrawSel 重画选择集中的对象,Sel 为选择集或图元名 mode 为方式码

;;;重画选择集中的对象,mode 为方式码,

;;;方式码 1 在屏幕重画该选择集对象

;;;方式码 2 隐藏该选择集对象

;;;方式码 3 “醒目显示”该选择集对象

;;;方式码 4 取消“醒目显示”该选择集对象

;;;==================================================================

;;; 笨猫注释:此例程比较简单,主要就是使用了 redraw

函数,遍历选择集里面的每一个实体,对其应用redraw函数;

;;; 注意,redraw函数的第一个参数为实体名,所以要用ssname函数从选择集sel中提取。

;;; 另外,原代码中这个函数的定义是在

gxl-Ge-grread函数定义的里面的,我觉得还是拿出来比较方便;这个例程还是蛮有用的。

;;; 用户没有输入 mode 参数,redraw不会报错

(defun gxl-Sel-ReDrawSel  (Sel mode / m

n)

(if sel  ;;; --> 如果存在sel参数

(progn

(cond

((= 'pickset (type Sel))  ;;; --- >

用type函数判断sel是不是选择集

(setq

m (sslength Sel)

n

0)

(repeat m

(redraw (ssname Sel n) mode)

(setq n (1+ n))

)

)

((=

'ename (type Sel))  ;;; --->

用type函数判断sel是不是实体名

(redraw Sel mode)

)

)

)

)

)  ;defun

gxl-Sel-ReDrawSel

;;;gxl-Ge-grread 自定义带捕捉的GrRead函数

;;;参数:GR_MODE = 函数GrRead的参数表 如: (list [track] [allkeys

[curtype]),参数个数按需要设置,可为nil

;;;  STARTPT =

基点,计算垂足点、正交模式等坐标的基点,若为nil,则基点默认为系统变量LastPoint值

;;;  SS =

捕捉避开的物体,可以是选择集或图元名

(DEFUN gxl-Ge-grread (GR_MODE STARTPT SS /  GET_OSMODE

GETGRVECS DRAWVECS  TIME

F3

F8  STR_OSMODE

LST_OSMODE DRAFTOBJ  AUTOSNAPMARKERSIZE

AUTOSNAPMARKERCOLOR  DRAG

DRAGMODE GHOSTPT  X0

Y0

X1  Y1

Z1

DISTPERPIXEL BOLD

)

;;;分列字串

;;;

笨猫注释:此例程输入参数为字符串str和字符串del,返回一个表,表内的元素分别为del之前的字符串和del之后的字符串

;;;; 例如,输入 (gxl-strparse "abcdefgdef12345"

"def") 返回的结果是 ("abc" "g" "12345")

(defun gxl-StrParse ( str del / pos lst )

(while (setq pos (vl-string-search del

str))  ;;

找到字串del在字串str中的位置,赋值给pos;注意,字符串的位置序号是从0开始的

(setq lst (cons (substr

str 1 pos) lst)  ;;

将str中从第1位开始,长度为pos的子字串提取出来,作为一个元素,然后添加到表lst前面,

;;;

并赋值给lst

str (substr str (+ pos 1 (strlen del)))

;;

将str中del之后的部分取出来,并赋值给str;然后执行while循环,判断str中是否存在多个del

)

)

(if (= " " Del) ;; 如果del是空格

(vl-remove "" (reverse

(cons str lst)));;  反向排列表lst中的元素并去除字符串中的空格

(reverse (cons str lst))

;; 反向排列表lst中的元素, ,

)

) ;; 函数gxl-StrParse定义结束

;;;返回捕捉模式字串<

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值