nonsmall
发表于 2008-12-5 16:58:00
【原创】提供简化编程的一个思路-完美提高lisp开发效率-VBA语句的lisp解释函数
本帖最后由 作者 于 2008-12-9 10:22:54 编辑 <br /><br /> <p>vlisp开始学习这3个多月来</p><p>每天都和</p><p>vlax-invoke-method</p><p>vlax-get-property</p><p>之类的函数打交道比如获得当前图层的方法</p><p>(vla-get-name (vla-get-ActiveLayer (vla-get-ActiveDocument (vlax-get-acad-object))))</p><p>看看vba的方法</p><p>ThisDrawing.ActiveLayer.Name</p><p>或者<br/>Application.ActiveDocument.ActiveLayer.Name</p><p><font color="#ff0000">Lisp为什么不能这么简化呢?</font></p><p></p><p>下面是我实现vba函数的部分结果:</p><p>当前图层</p><p>命令: <font color="#00ff00"><font color="#000000">(vba "ActiveDocument.ActiveLayer.name")</font><br/></font>"0"</p><p>图块集合</p><p>命令: (vba "ActiveDocument.Blocks")<br/><font color="#ff0000">#<VLA-OBJECT IAcadBlocks 05e686a4></font></p><p>当前cad路径<br/>命令: (vba "FullName")<br/>"C:\\Program Files\\AutoCAD 2006\\acad.exe"</p><p>当前字体样式</p><p>命令: (vba "ActiveDocument.ActiveTextStyle.name")<br/>"MR_ROMANS"</p><p></p><p>对于集合的处理和带参数的vlax-invoke方法处理比较麻烦</p><p>如果能够完善这个函数开发效率相信大大增加</p><p><font color="#ff0000">返回值是Lisp可以识别的对象和vla-eval调用VBA绝对不同</font></p><p>我打算以后直接copy VBA代码就行了</p><p>或者说是写一个真正的VBA语句的lisp解释函数还差不多吧</p><p>因为VBA语句里面还有多种嵌套模式 我目前没有完全解决 就不拿代码献丑了</p><p>只把思路放下,大家来实现完善吧</p><p>--------------------------------------------</p><p>命令: (setq layers (vba "activedocument.layers"))<br/>#<VLA-OBJECT IAcadLayers2 0266a7a4><br/>命令: (setq newlay (vba "layers.add(\"234\")"))<br/>#<VLA-OBJECT IAcadLayer2 026b3844><br/>命令: (vba "newlay.color=6")<br/>nil</p><p><br/>命令: (setq lay(vba "activedocument.layers.add(\"111\")"))<br/>#<VLA-OBJECT IAcadLayer2 026b4954><br/>命令: (vba "lay.color=3")<br/>nil</p><p><br/>命令: (vba "activedocument.layers.item(\"111\").color=1")<br/>nil</p>
mccad
发表于 2008-12-5 17:31:00
非常支持。严重关注一下。
liminnet
发表于 2008-12-5 17:41:00
祥子
发表于 2008-12-5 18:24:00
支持一下
nonsmall
发表于 2008-12-5 18:40:00
本帖最后由 作者 于 2008-12-9 10:23:26 编辑 <br /><br /> <p>谢谢楼上的关注</p><p>这是一共奋斗两个半小时的结果:</p><p>命令: (setq pt1 (vlax-3d-point '(0 0)) pt2 (vlax-3d-point '(1 1)))<br/>#<variant 8197 ...><br/>命令: <font color="#ff0000">(vba "Documents(0).ModelSpace.addline(pt1,pt2)")<br/></font>#<VLA-OBJECT IAcadLine 021861d4><br/>命令: (entget(entlast))<br/>((-1 . <图元名: 7ef631a8>) (0 . "LINE") (330 . <图元名: 7ef61d18>) (5 . "46D") <br/>(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 <br/>0.0 0.0 0.0) (11 1.0 1.0 0.0) (210 0.0 0.0 1.0))</p><p>看来还是有希望实现的 不过还需要多多测试和完善</p><p>以后写vlisp就可以轻松多了 有兴趣的朋友也尝试下吧</p>
lzj511
发表于 2008-12-5 23:40:00
各有个的长处而已,萝卜白菜各有所爱!!
飞诗(fsxm)
发表于 2008-12-6 00:22:00
<p>程序写的短少,与程序运行效率,首选效率</p><p>所以~还是老实点多写点代码!</p><p>本来这写这点代码纯属体力活~!</p>
不死猫
发表于 2008-12-6 11:29:00
<p>根据现在硬件的发展 运行部分的效率不用考虑太多</p><p>主要影响效率的部分可以多写代码</p><p>也要看自己对算法的理解运用</p><p>但对于开发人员来说</p><p>一天的工作半天完成 剩下半天用来学习和改进工作效率</p><p>这样永远比别人跑的要快对不?</p>
nonsmall
发表于 2008-12-6 15:10:00
<p>(defun c:test()<br/> (setq runtime_be (read (substr (rtos (getvar "date") 2 16) 9 5)))<br/> (setq pt1 (vlax-3d-point '(0 0)) pt2 (vlax-3d-point '(1 1)))<br/> (setq mps (vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object))))<br/> (repeat 10000<br/> (vla-addline mps pt1 pt2)<br/> )<br/> (setq runtime_e (read (substr (rtos (getvar "date") 2 16) 9 5)))<br/> (print (strcat "运行时间" (itoa (- runtime_be runtime_e)) " secs."))<br/>)</p><p>命令: test<br/>"运行时间-3 secs." "运行时间-3 secs."</p><p>(defun c:test()<br/> (setq runtime_be (read (substr (rtos (getvar "date") 2 16) 9 5)))<br/> (setq pt1 (vlax-3d-point '(0 0)) pt2 (vlax-3d-point '(1 1)))<br/> (setq mps (vba "activedocument.ModelSpace"))<br/> (repeat 10000<br/> (vba "mps.addline(pt1,pt2)")<br/> )<br/> (setq runtime_e (read (substr (rtos (getvar "date") 2 16) 9 5)))<br/> (print (strcat "运行时间" (itoa (- runtime_be runtime_e)) " secs."))<br/>)</p><p>命令: test<br/>"运行时间-8 secs." "运行时间-8 secs."</p><p>绘制10000条线这种情况当然选择第一种方式了</p><p>但只是一个程序内用几十次这样的方法 运行时间应该不差多少</p>
mccad
发表于 2008-12-6 16:39:00
我的建议,做一个VBA代码-->LISP转换器,则不受效率影响。