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">#&lt;VLA-OBJECT IAcadBlocks 05e686a4&gt;</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/>#&lt;VLA-OBJECT IAcadLayers2 0266a7a4&gt;<br/>命令: (setq newlay (vba "layers.add(\"234\")"))<br/>#&lt;VLA-OBJECT IAcadLayer2 026b3844&gt;<br/>命令: (vba "newlay.color=6")<br/>nil</p><p><br/>命令: (setq lay(vba "activedocument.layers.add(\"111\")"))<br/>#&lt;VLA-OBJECT IAcadLayer2 026b4954&gt;<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/>#&lt;variant 8197 ...&gt;<br/>命令: <font color="#ff0000">(vba "Documents(0).ModelSpace.addline(pt1,pt2)")<br/></font>#&lt;VLA-OBJECT IAcadLine 021861d4&gt;<br/>命令: (entget(entlast))<br/>((-1 . &lt;图元名: 7ef631a8&gt;) (0 . "LINE") (330 . &lt;图元名: 7ef61d18&gt;) (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/>&nbsp;(setq runtime_be (read (substr (rtos (getvar "date") 2 16) 9 5)))<br/>&nbsp;(setq pt1 (vlax-3d-point '(0 0)) pt2 (vlax-3d-point '(1 1)))<br/>&nbsp;(setq mps (vla-get-modelspace (vla-get-activedocument(vlax-get-acad-object))))<br/>&nbsp;(repeat 10000<br/>&nbsp;&nbsp;(vla-addline mps pt1 pt2)<br/>&nbsp;)<br/>&nbsp;(setq runtime_e (read (substr (rtos (getvar "date") 2 16) 9 5)))<br/>&nbsp;(print (strcat "运行时间" (itoa (- runtime_be runtime_e)) " secs."))<br/>)</p><p>命令: test<br/>"运行时间-3 secs." "运行时间-3 secs."</p><p>(defun c:test()<br/>&nbsp;(setq runtime_be (read (substr (rtos (getvar "date") 2 16) 9 5)))<br/>&nbsp;(setq pt1 (vlax-3d-point '(0 0)) pt2 (vlax-3d-point '(1 1)))<br/>&nbsp;(setq mps (vba "activedocument.ModelSpace"))<br/>&nbsp;(repeat 10000<br/>&nbsp;&nbsp;(vba "mps.addline(pt1,pt2)")<br/>&nbsp;)<br/>&nbsp;(setq runtime_e (read (substr (rtos (getvar "date") 2 16) 9 5)))<br/>&nbsp;(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代码--&gt;LISP转换器,则不受效率影响。
页: [1] 2 3 4
查看完整版本: 【原创】提供简化编程的一个思路-完美提高lisp开发效率-VBA语句的lisp解释函数