明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 15767|回复: 35

[【不死猫】] 【原创】提供简化编程的一个思路-完美提高lisp开发效率-VBA语句的lisp解释函数

  [复制链接]
发表于 2008-12-5 16:58:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2008-12-9 10:22:54 编辑

vlisp开始学习这3个多月来

每天都和

vlax-invoke-method

vlax-get-property

之类的函数打交道比如获得当前图层的方法

(vla-get-name (vla-get-ActiveLayer (vla-get-ActiveDocument (vlax-get-acad-object))))

看看vba的方法

ThisDrawing.ActiveLayer.Name

或者
Application.ActiveDocument.ActiveLayer.Name

Lisp为什么不能这么简化呢?

下面是我实现vba函数的部分结果:

当前图层

命令: (vba "ActiveDocument.ActiveLayer.name")
"0"

图块集合

命令: (vba "ActiveDocument.Blocks")
#<VLA-OBJECT IAcadBlocks 05e686a4>

当前cad路径
命令: (vba "FullName")
"C:\\Program Files\\AutoCAD 2006\\acad.exe"

当前字体样式

命令: (vba "ActiveDocument.ActiveTextStyle.name")
"MR_ROMANS"

对于集合的处理和带参数的vlax-invoke方法处理比较麻烦

如果能够完善这个函数开发效率相信大大增加

返回值是Lisp可以识别的对象和vla-eval调用VBA绝对不同

我打算以后直接copy VBA代码就行了

或者说是写一个真正的VBA语句的lisp解释函数还差不多吧

因为VBA语句里面还有多种嵌套模式 我目前没有完全解决 就不拿代码献丑了

只把思路放下,大家来实现完善吧

--------------------------------------------

命令: (setq layers (vba "activedocument.layers"))
#<VLA-OBJECT IAcadLayers2 0266a7a4>
命令: (setq newlay (vba "layers.add(\"234\")"))
#<VLA-OBJECT IAcadLayer2 026b3844>
命令: (vba "newlay.color=6")
nil


命令: (setq lay(vba "activedocument.layers.add(\"111\")"))
#<VLA-OBJECT IAcadLayer2 026b4954>
命令: (vba "lay.color=3")
nil


命令: (vba "activedocument.layers.item(\"111\").color=1")
nil

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2008-12-5 17:31:00 | 显示全部楼层
非常支持。严重关注一下。
发表于 2008-12-5 17:41:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2008-12-5 18:24:00 | 显示全部楼层
支持一下
 楼主| 发表于 2008-12-5 18:40:00 | 显示全部楼层
本帖最后由 作者 于 2008-12-9 10:23:26 编辑

谢谢楼上的关注

这是一共奋斗两个半小时的结果:

命令: (setq pt1 (vlax-3d-point '(0 0)) pt2 (vlax-3d-point '(1 1)))
#<variant 8197 ...>
命令: (vba "Documents(0).ModelSpace.addline(pt1,pt2)")
#<VLA-OBJECT IAcadLine 021861d4>
命令: (entget(entlast))
((-1 . <图元名: 7ef631a8>) (0 . "LINE") (330 . <图元名: 7ef61d18>) (5 . "46D")
(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10
0.0 0.0 0.0) (11 1.0 1.0 0.0) (210 0.0 0.0 1.0))

看来还是有希望实现的 不过还需要多多测试和完善

以后写vlisp就可以轻松多了 有兴趣的朋友也尝试下吧

发表于 2008-12-5 23:40:00 | 显示全部楼层
各有个的长处而已,萝卜白菜各有所爱!!
发表于 2008-12-6 00:22:00 | 显示全部楼层

程序写的短少,与程序运行效率,首选效率

所以~还是老实点多写点代码!

本来这写这点代码纯属体力活~!

发表于 2008-12-6 11:29:00 | 显示全部楼层

根据现在硬件的发展 运行部分的效率不用考虑太多

主要影响效率的部分可以多写代码

也要看自己对算法的理解运用

但对于开发人员来说

一天的工作半天完成 剩下半天用来学习和改进工作效率

这样永远比别人跑的要快对不?

点评

原来有两只猫啊!一只叫不死猫,一只叫nonsmall  发表于 2011-11-12 10:23
 楼主| 发表于 2008-12-6 15:10:00 | 显示全部楼层

(defun c:test()
 (setq runtime_be (read (substr (rtos (getvar "date") 2 16) 9 5)))
 (setq pt1 (vlax-3d-point '(0 0)) pt2 (vlax-3d-point '(1 1)))
 (setq mps (vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object))))
 (repeat 10000
  (vla-addline mps pt1 pt2)
 )
 (setq runtime_e (read (substr (rtos (getvar "date") 2 16) 9 5)))
 (print (strcat "运行时间" (itoa (- runtime_be runtime_e)) " secs."))
)

命令: test
"运行时间-3 secs." "运行时间-3 secs."

(defun c:test()
 (setq runtime_be (read (substr (rtos (getvar "date") 2 16) 9 5)))
 (setq pt1 (vlax-3d-point '(0 0)) pt2 (vlax-3d-point '(1 1)))
 (setq mps (vba "activedocument.ModelSpace"))
 (repeat 10000
  (vba "mps.addline(pt1,pt2)")
 )
 (setq runtime_e (read (substr (rtos (getvar "date") 2 16) 9 5)))
 (print (strcat "运行时间" (itoa (- runtime_be runtime_e)) " secs."))
)

命令: test
"运行时间-8 secs." "运行时间-8 secs."

绘制10000条线这种情况当然选择第一种方式了

但只是一个程序内用几十次这样的方法 运行时间应该不差多少

发表于 2008-12-6 16:39:00 | 显示全部楼层
我的建议,做一个VBA代码--&gt;LISP转换器,则不受效率影响。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-6 09:59 , Processed in 0.168856 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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