维坦

感谢您的关注!


  • Jan
    19

    Lisp读取网卡MAC地址列表

    Filed under: 编程; Tagged as:

    使用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)
    )
    2 Comments
  • Dec
    18

    使用LISP遍历树状结构

    Filed under: 编程; Tagged as:

    数据库死而复生, 虚惊一场.

    言归正传, 也许你早就知道LISP的精髓在于递归, 但是对于初学者来说, 往往仍然不知道递归要怎么实现, 或者干脆不知道递归有什么好处. 接下来的例子也许会使你重新面对递归这一问题.

    Lisp traversal tree

    上面图片中演示了家谱式结构, 越上层的圆辈份越高, 圆有后代, 用线段标明血缘关系. 例如: 第二层的三个黄色圆为第一层白色圆的孩子.

    为了记录这种血缘关系, 我们将第二层三个黄色圆的图元名记录成表, 放到白色圆的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))
     
    No Comments
  • Nov
    19

    Vlisp自定义双击反应器

    Filed under: 编程; Tagged as:

     
    ;;; 双击反应器 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")
      )
    )
     
    1 Comment
  • Oct
    18

    DOSLib 7.8 中文参考手册

    Filed under: 作品; Tagged as: ,

    第一次听说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

    1 Comment
  • Jun
    23

    DOSLib

    Filed under: 编程; Tagged as:

    自发现美洲新大陆"vl-"之后的又一重大发现:{澳洲新大陆DOSLib},基本上是变态了,目前正在逐个尝鲜,新奇功能敬请关注.

      我到底是哥伦布还是麦哲伦?
      我到底是造船的还是添海的?

    No Comments
  • May
    31

    单选方案

    Filed under: 编程; Tagged as:

    单选最佳方案,有可能只是暂时的,做个备忘录先!

    (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)
      )
    )

    Read the rest of this entry »

    No Comments
  • Apr
    22

    井底之蛙竟然不知道Vlisp为何物

    Filed under: 随笔; Tagged as:

    本次更新的内容:
    发现AutoLisp新大陆"vl-", 基本上是无敌了, 目前正在逐个试验, 新奇功能敬请关注.
    期待值较高的几项功能如下: [板输出] [两面板] [小图输出] [脚钉布置]

    闲聊几句题外话: (我的地盘我说点废话你有意见吖?那RFC文档都能把PARTY地点写进去,我这点算什么!)

    在这个世界上谁是孤独的?

    • 女娲: 生了那么多孩子,没有一个管她叫妈的,一个也没有,直到她累死都没有.
    • 盘古: 一个加班狂,努力工作直到死了还是个单身汉,何止孤独,简直是可怜.
    • 夸父: 如果不是因为孤独,为什么要追逐太阳?就算是轻生也不能选择这种自残的方式啊!
    • 大禹: 三过家门而不入,有家都不回,没有困难就创造困难,没有孤独就创造孤独.
    • 牛顿: 他说白光是七彩的,所有人都笑了,狗没笑,因为狗是色盲,不过后来人也不笑了.
    • 麦哲伦: 他说地球是圆的,所有人都笑了,他想哭,上帝看到后笑了,于是麦哲伦也笑了.
    • 爱因斯坦: "人们对爱因斯坦微笑是因为没人能理解他的相对论,人们对我微笑是因为谁都能理解我的幽默." --- 卓别林.

    所以,享受孤独吧,如果你做到了,将来不是神仙就是伟人!

    No Comments