- UID
- 4508
- 积分
- 2485
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-4-29
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 snsj 于 2013-6-16 23:53 编辑
现在好些程序都是在LISP和VLISP之间的切换完成的,这样会经常在ENAME和VLA实体间的转化,影响效率,纯VLA编程很多老autoLISP的爱好者不太适应,因为VLA像VB的编程方式,纯LISP靠组码解决问题,一堆数字代表某种信息,而VLA更直观懂英文的更能很好的理解,而不用通过组码表去查找。希望通过这个帖子高手们能搜集齐所有VLA的技巧方法。
1、首先说一下ENTGET,LISP里很容易实现了 (entsel msg)就可以了,VLA实现起来比较麻烦一点,因为VLA主要要应对错误的处理,如果ENTSEL选择不到物体会返回NIL,但是VLA则会出现错误,必须在程序里截取错误,才能获得ENTSEL的效果
;;;取得文档的Utility对象
[pcode=lisp,true]
;;;得到CAD活动文档
(defun apple-act()
(vla-get-activedocument (vlax-get-acad-object))
)
(defun apple-util()
(vla-get-utility(apple-act))
)
[/pcode]
如果我们直接用
[pcode=lisp,true](vla-getentity(apple-util) 'obj 'ip "\nSelect Object: ")[/pcode]
来获取,则当空选时就会出错
VLA需要靠VL-CATCH-ALL-APPLY来截取错误
所有的互动函数都要靠这个函数来截取错误
不说废话直接上函数
一个跟ENTSEL等效的VLA的方法
[pcode=lisp,true]
(defun apple-vla-entsel (msg /)
(if(null(vl-catch-all-error-p(vl-catch-all-apply 'vla-getentity (list(apple-util) 'obj 'ip msg))))
(list obj ip)
nil
)
)
[/pcode]
这个就可以返回VLA的信息列表了
;;;VLA方法得到一个点PT为参照点,如果为NIL则直接获取一个点
;;;成功则返回一个VLA点,否则返回nil
[pcode=lisp,true]
(defun apple-vla-gpt (pt msg / ptt)
(if(null(vl-catch-all-error-p
(setq ptt(vl-catch-all-apply 'vla-getpoint(list(apple-util) pt msg)))))
ptt nil
)
)
[/pcode]
;;;橡皮筋获取点效果
(setq ip (vla-gpt (vla-gpt nil nil) "\nInsertion Point: "))
[pcode=lisp,true]
;;;vla的方法得到CORNER,VLAPT参照点,msg:提示信息
(defun apple-vla-getcorn (vlapt msg /)
(if(null(vl-catch-all-error-p
(setq corn(vl-catch-all-apply 'vla-GetCorner(list(apple-util)vlapt msg)))))
corn nil
)
)
[/pcode]
;配合apple-vla-gpt得到动态效果
[pcode=lisp,true](apple-vla-getcorn(apple-vla-gpt nil nil)"")[/pcode]
[pcode=lisp,true]
;;;相当于polar函数
;;;vlapt 一个VLA的点,ang为一个角度,DIS距离
(defun apple-vla-polar (vlapt ang dis / por)
(if(null(vl-catch-all-error-p
(setq por(vl-catch-all-apply 'vla-polarpoint(list(apple-util)vlapt ang dis)))))
por nil
)
)
[/pcode]
[pcode=lisp,true]
;;;|变体转化
(defun LstToArray (Typ Lst)
(vlax-make-variant(vlax-safearray-fill
(vlax-make-safearray Typ (cons 0 (1- (length Lst))))
Lst))
)
;;;VLA选择,带过滤,作者:SNSJ 2013.6.16
;;;fillist '((0 . "LINE")(8 . "0")...)
(defun apple-vla-select (fillist / a b zm1 zm2 sss ss newss)
(setq a(mapcar 'car fillist)
b(mapcar 'cdr fillist)
zm1(LstToArray vlax-vbInteger a)
zm2(LstToArray vlax-vbVariant b)
sss(vla-get-selectionsets(apple-act))
newss nil
)
(if(vl-catch-all-error-p(setq ss(vl-catch-all-apply 'vla-item (list sss "appless"))))
(setq newss (vla-add sss "appless"))
(progn(vla-delete ss)(setq newss (vla-add sss "appless")))
)
(vla-selectOnScreen newss zm1 zm2)
newss
)
[/pcode]
|
评分
-
查看全部评分
|