维坦
感谢您的关注!
-
Jan192 Comments
使用Lisp语言读取MAC地址, 目前最合适的方法是通过WMI实现. 但是网上可查到的几种方法都有一个弊端, 就是通过识别ID为[本地连接]的设备来读取MAC, 并且标注为仅支持中文系统.
事实上这是行不通的, 如果你研究过系统的克隆, 你就会发现,[本地连接 2]是XP系统经常出现的一个问题.
在DOSLib6.1中也具备读取MAC的函数, 但是貌似实现的方法是读取最后一个MAC地址, 当你把一个Windows Mobile 系统的手机连到电脑上, 它竟然返回手机的MAC...
经过对流行代码的少量修改, 写出了一个能返回所有设备MAC地址列表的小程序, 源码如下:
;;; 获取网卡MAC地址 ;;; 对win2000系统的兼容性未做测试 ;;; 暂不知道是否会读取到非网卡设备 (defun macaddr (/ mac WMIobj con lox sn) (vl-load-com) (if (setq WMIobj (vlax-create-object "wbemScripting.SwbemLocator")) (progn (setq con (vl-catch-all-apply 'vlax-invoke (list WMIobj 'ConnectServer "." "" "" "" "" "" 128 nil))) (if (vl-catch-all-error-p con) (setq con (vlax-invoke WMIobj 'ConnectServer "." "" "" "" "" "")) ) (setq lox (vlax-invoke con 'ExecQuery "Select * From Win32_NetworkAdapter ")) (vlax-for i lox (if (vlax-get i 'NetConnectionID) (progn (setq sn (vlax-get i 'MACAddress)) (or (member sn mac) (setq mac (cons sn mac)) ) ) ) ) (mapcar 'vlax-release-object (list lox con WMIobj) ) ) ) (reverse mac) )
-
Dec18No Comments
数据库死而复生, 虚惊一场.
言归正传, 也许你早就知道LISP的精髓在于递归, 但是对于初学者来说, 往往仍然不知道递归要怎么实现, 或者干脆不知道递归有什么好处. 接下来的例子也许会使你重新面对递归这一问题.
上面图片中演示了家谱式结构, 越上层的圆辈份越高, 圆有后代, 用线段标明血缘关系. 例如: 第二层的三个黄色圆为第一层白色圆的孩子.
为了记录这种血缘关系, 我们将第二层三个黄色圆的图元名记录成表, 放到白色圆的ldata中. 这一步可以通过以下语句实现:
;;; 选择集转化为表 (defun ent2list (ss / lst i ent) (setq i -1) (while (setq ent (ssname ss (setq i (1+ i)))) (setq lst (cons ent lst)) ) ) ;;; 定义父子关系 (vlax-ldata-put (car (entsel "选择父圆:")) "son" (ent2list (ssget)))
好了, 我们得到了一个树状结构, 特点是, 辈份级数不定, 后代数量不定.
此时如果想要获得任意圆的所有后代, 该怎么做呢? 请看下面:;;; 遍历家族树 仅输出 (defun tree (e) (foreach e (vlax-ldata-get e "son") (print e) (tree e) ) )
如果仅仅是显示, 或许用处不大, 那么我们再加上执行函数部分:
;;; 遍历家族树 执行函数 (defun tree (e f / r) (foreach e (vlax-ldata-get e "son") (if (= (type f) 'list) (apply (car f) (if (cdr f) (cons e (cdr f)) (list e) ) ) ) (tree e f) ) )
测试一下, 我们先写个改变图元颜色的函数:
;;; 设置颜色 (defun entSetColor (e c) (setq e (entget e)) (if (assoc 62 e) (entmod (subst (cons 62 c) (assoc 62 e) e ) ) (entmod (append e (list (cons 62 c)) ) ) ) )
OK, 让我们用以下语句对任意一个圆操作一下:
;;; 遍历 并改变后代的颜色 (tree (car (entsel "选择圆:")) (list 'entSetColor 1))
-
Nov191 Comment
;;; 双击反应器 2007-11-19 ;;; http://www.ViTarn.com/ ;;; 命令: (>DoubleClickAttach (car (entsel)) T) (defun >DoubleClickDefine () (vl-load-com) ; 建立反应器对象 (or *MY_Mouse_Reactor* (setq *MY_Mouse_Reactor* (vlr-mouse-Reactor "MY_Mouse" '((:vlr-beginDoubleClick . >DoubleClickCallback)))) ) ; 尝试加载/卸载ARX (vl-catch-all-apply 'arxunload '("acdblclkedit.arx")) (vl-catch-all-apply 'arxload '("acdblclkedit.arx")) ; 定义双击回调函数 (defun >DoubleClickCallback (reactor point / selp point ent) ; 双击时的坐标 转化到当前坐标系 (setq point (trans (car point) 0 1)) (if (setq selp (nentselp point)) (progn ; 如果是块 取块的图元名 (if (> (length selp) 2) (setq ent (last (last selp))) (setq ent (car selp)) ) ; 是否自定义双击 取决于ldata中的"DoubleClick" (if (vlax-ldata-get ent "DoubleClick") (progn ; 令系统自带的双击功能失效 (vl-catch-all-apply 'arxunload '("acdblclkedit.arx")) ; 取消选取的对象 这是令双击失效的关键 (sssetfirst nil) ; 自定义处理 (>DoubleClickExecute ent point) ; 恢复系统自带的双击功能 (vl-catch-all-apply 'arxload '("acdblclkedit.arx")) ) ) ) ) ) ) ;;; 双击反应器自动加载 (or *MY_Mouse_Reactor* (>DoubleClickDefine) ) ;;; 双击事件自定义处理函数 (defun >DoubleClickExecute (ent point) (prompt (strcat (VL-PRINC-TO-STRING ent) " " (VL-PRINC-TO-STRING point) "\n")) ) ;;; 清除图形中的全部双击反应器 (defun >DoubleClickClearAll (/ ss i e) (setq *MY_Mouse_Reactor* nil) (setq ss (ssget "x")) (setq i 0) (repeat (sslength ss) (vlax-ldata-delete (ssname ss i) "DoubleClick") (setq i (1+ i)) ) ) ;;; 绑定图元双击反应器 (defun >DoubleClickAttach (ent on) (if on (vlax-ldata-put ent "DoubleClick" T) (vlax-ldata-delete ent "DoubleClick") ) )
-
Oct181 Comment
第一次听说DOSLib已经是半年以前的事了, 初试之后爱不释手. 但苦于当时只有英文版, 很多地方理解不透甚至是曲解, 导致自己走了不少弯路.
在此之前曾经不只一次的搜索中文版, 唯独找到那么一次, 打开后大失所望, 是用快译软件刷出来的, 中英文错乱不堪, 已经没法看了.
通过半年时间的学习和使用, 自认为对DOSLib有了初步的了解, 至少其中80%的命令都在程序中详细使用过, 其余20%也都做过测试. 于是下定决心借这几天空闲时间对这份帮助文件进行了翻译.
什么是DOSLib?
它是一个ARX程序, 允许autolisp调用它内部的函数, 完成LISP难以完成的任务. 这个项目起源于1992年9月, 那个时候我还只会玩小霸王游戏机. ~_~ 从命名方式可以看出,项目一开始的本意要想让LISP可以通过它与DOS沟通,这可以从它的四个函数集看出来, (驱动器, 路径, 目录, 文件) 不过由于年代久远, 为了保证兼容, 程序里保留了许多如今在VLISP中已经实现了的函数, 从这一点上来看, 似乎很多时候DOSLib都走在VLISP前面. 总之, 无论是可用性还是稳定性, DOSLib都是值得去尝试和学习的, 希望这份翻译的中文手册可以给你带来帮助.
翻译手记
翻译过程中发现了一些原版中的笔误(很少), 均在AutoCAD 2008中进行测试证实后对原文进行了更正, 并在文末加以说明. 个别文章中出现的灰色字体为译者后加上去的, 其中包括: 对文中未能详述的部分进行解释;自己当初曲解文意所走的弯路;还有一些对函数用法的心得体会, 希望能对您有所帮助. 帮助文件采用了灵格斯(Lingoes.cn)作为翻译参考, 使用FAR HTML打包, 编辑过程使用EditPlus直接修改HTML文件.
下载地址:
http://www.box.net/shared/lr6l09dhds主程序DOSLib.arx请到官方下载
http://download.mcneel.com/download.asp?id=doslib -
Jun23No Comments
自发现美洲新大陆"vl-"之后的又一重大发现:{澳洲新大陆DOSLib},基本上是变态了,目前正在逐个尝鲜,新奇功能敬请关注.
我到底是哥伦布还是麦哲伦?
我到底是造船的还是添海的? -
May31No Comments
单选最佳方案,有可能只是暂时的,做个备忘录先!
(prompt "\n选择对象:") (while (or (not e) (/= (car e) 3) (not (setq e (nentselp "" (cadr e)))) (/= (type (setq e (car (last e)))) 'ENAME) (/= (cdr (assoc 0 (setq tmp (entget e)))) "INSERT") (/= (cdr (assoc 8 tmp)) "螺栓") (/= (substr (cdr (assoc 2 tmp)) 1 1) "M") ) (setq e (grread)) (if (= (car e) 11) (exit) ) )
-
Apr22No Comments
本次更新的内容:
发现AutoLisp新大陆"vl-", 基本上是无敌了, 目前正在逐个试验, 新奇功能敬请关注.
期待值较高的几项功能如下: [板输出] [两面板] [小图输出] [脚钉布置]闲聊几句题外话: (我的地盘我说点废话你有意见吖?那RFC文档都能把PARTY地点写进去,我这点算什么!)
在这个世界上谁是孤独的?
- 女娲: 生了那么多孩子,没有一个管她叫妈的,一个也没有,直到她累死都没有.
- 盘古: 一个加班狂,努力工作直到死了还是个单身汉,何止孤独,简直是可怜.
- 夸父: 如果不是因为孤独,为什么要追逐太阳?就算是轻生也不能选择这种自残的方式啊!
- 大禹: 三过家门而不入,有家都不回,没有困难就创造困难,没有孤独就创造孤独.
- 牛顿: 他说白光是七彩的,所有人都笑了,狗没笑,因为狗是色盲,不过后来人也不笑了.
- 麦哲伦: 他说地球是圆的,所有人都笑了,他想哭,上帝看到后笑了,于是麦哲伦也笑了.
- 爱因斯坦: "人们对爱因斯坦微笑是因为没人能理解他的相对论,人们对我微笑是因为谁都能理解我的幽默." --- 卓别林.
所以,享受孤独吧,如果你做到了,将来不是神仙就是伟人!


评论