【越飞越高讲堂6】十年磨一剑--openDCL和反应器
<P></P><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT size=2><P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT size=3>长期以来我就想把<SPAN lang=EN-US>Express tools工具中的arc-aligned text的功能扩展。但在我未学编程之前,这一直是个空想。到今天,学LISP也将近一年了,自认为,快要毕业了,(autolisp基本语法,VLISP,对话框,反应器等可算勉强及格了),不是论文的话,总得交一份答卷吧!
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>(不知道这份答卷能得多少分?请各位提提批评意见和测试。)<SPAN lang=EN-US>
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal>
<P><FONT size=3></FONT> </P>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>于是趁着自己稍微学了一下反应器的知识和刚刚接触的<SPAN lang=EN-US>openDCL ,编写了一个程序。编这个程序,的确花费我许多时间,一来是我水平有限,经验不够丰富,二来中间插了很多事情,断断续续,说十年磨一剑是夸张了点,但十天半个月是已经超出的。
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal>
<P><FONT size=3></FONT> </P>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>本程序的运行命令为<SPAN lang=EN-US>:eee.
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>本程序需要<SPAN lang=EN-US>openDCL.16.ARX或者openDCL.17.ARX支持,最好把程序文件和原代码全部拷贝到搜索路径中。因为反应器和openDCL 以及自己水平的缘故,所以程序可能导致CAD 崩溃,故运行前务必先保存文件。<SPAN style="mso-spacerun: yes">
<P></P></SPAN></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>没有<SPAN lang=EN-US>openDCL.arx的到我的网络硬盘<A href="http://highflybird.ys168.com/"><FONT color=#800080>http://highflybird.ys168.com/</FONT></A>中去下载。
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>本程序只能运行于<SPAN lang=EN-US>AutoCAD R2004以上。对AutoCAD R2006支持最好。
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal>
<P><FONT size=3></FONT> </P>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>我这个程序有点有点象<SPAN lang=EN-US>3dsmax的路径路径追随功能,能沿曲线或者直线路径阵列 CAD 物体:文字,选择集,图块。
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>也许你们要说,我这个程序不就是用命令<SPAN lang=EN-US>MESURE,或者DIVIDE就能完成吗? 当然,如果我的程序仅仅是达到这两个命令的功能,我也就不好意思把这个程序拿出来了。下面我来说说其中几个功能:
<P></P></FONT></SPAN>
<P></P>
<P style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l2 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal><SPAN style="mso-list: Ignore"><FONT size=3>1、</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><FONT size=3>如果是文字的话,则你输入一行文字,或者选择文本,则此文字内容可以沿路径阵列相当于<SPAN lang=EN-US>express tools 中ArcAlignedText工具的扩展。</FONT></SPAN></P><FONT size=3>
<P><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10.5pt" lang=EN-US>
<P></P>
<P></P>
<P>
<P></P>
<P></P>
<P style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l2 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal>
<P></P>
<P></P></FONT></SPAN>
<P style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l2 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal><SPAN style="mso-list: Ignore"><FONT size=3>2、</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><FONT size=3>如果是你在<SPAN lang=EN-US>CAD 中选择物体的话,则选择的物体沿着路径阵列而且阵列后的物体不是块,也不是组,只是原选择集的复制。</FONT></SPAN></P><FONT size=3>
<P><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10.5pt" lang=EN-US>
<P></P>
<P></P>
<P></P></FONT></SPAN>
<P style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l2 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal><SPAN style="mso-list: Ignore"><FONT size=3>3、</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><FONT size=3>如果是选择图块,则从对话框或图形中选择图块沿着路径阵列阵列后的图块可以有随机比例大小。(在某些情况有用)</FONT></P><FONT size=3>
<P><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10.5pt" lang=EN-US>
<P></P>
<P></P>
<P>
<P></P>
<P></P>
<P style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l2 level1 lfo1; tab-stops: list 18.0pt" class=MsoNormal>
<P></P>
<P></P></FONT></SPAN>
<P style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><FONT size=3>所有阵列后物体可以跟路径关联,如果是永久关联的话,下次打开文件需要加载程序才能运行。如果关联了鼠标双击反应器,可以对路径或者阵列后的物体双击,则弹出对话框,你可以随时改变参数。如果你对路径作夹点编辑或者移动旋转等变换,则阵列物体跟随路径的形状一起动<SPAN lang=EN-US>.
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>两大突出的功能<SPAN lang=EN-US>:
<P></P></FONT></SPAN>
<P></P>
<P style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt" class=MsoNormal><SPAN style="mso-list: Ignore"><FONT size=3>1、</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><FONT size=3>吸星大法。阵列的物体仿佛吸在路径上。路径怎么动,它就怎么动。它长我也长,它缩我也缩。</FONT></P><FONT size=3>
<P><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10.5pt" lang=EN-US>
<P></P>
<P></P>
<P></P></FONT></SPAN>
<P style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt" class=MsoNormal><SPAN style="mso-list: Ignore"><FONT size=3>2、</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><FONT size=3>乾坤大挪移。当你选择另外一条路径关联时,则阵列的物体就自动跑到那条路径上去。</FONT></P><FONT size=3>
<P><SPAN style="FONT-FAMILY: Arial; FONT-SIZE: 10.5pt" lang=EN-US>
<P></P>
<P></P>
<P></P></FONT></SPAN>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>其他还有很多功能就不一一说明了。<SPAN lang=EN-US>
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal>
<P><FONT size=3></FONT> </P>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>编写了这次程序后,最大的心得和体会就是:<SPAN lang=EN-US>
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>程序在进入主题前,要进行严格的数据检查,否则程序会出现各种难以预料的错误。令外在程序的结构上最好不要有冗余的程序段,应尽量做到能省则一定省<SPAN lang=EN-US>,否则对计算和运行都有影响。
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>对反应器的深刻体会是:<SPAN lang=EN-US>
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>要避免反应器出错,必须要了解反应器的流程。因为反应器不像一个程序一个流程。它的流程不是线性的,也不是连续的。<SPAN lang=EN-US>
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>要避免删除和恢复删除这之类的错误,如:<SPAN lang=EN-US>"; 错误: Automation 错误。 对象已被删除"必须定义四个函数:
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>:vlr-OpenedForModify<SPAN style="mso-spacerun: yes"> :vlr-erased :vlr-unerased :vlr-modified;
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>要不然就得用到<SPAN lang=EN-US>command反应器或者数据库反应器。</FONT><BR><FONT size=3>顺序一般是删除时</FONT><FONT size=3>: :vlr-OpenedForModify->:vlr-erased->:vlr-modified;<BR>恢复删除时:</FONT><FONT size=3>:vlr-OpenedForModify->:vlr-unerased->:vlr-modified;<BR>搞清楚了它们的顺序,然后分别定义好各自的函数,(例如我上面的例子),在函数中加上判</FONT><BR><FONT size=3>断语句,这样就不会出错了。
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal>
<P><FONT size=3></FONT> </P>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>对<SPAN lang=EN-US>openDCL的体会就是:openDCL对话框的操作实在太简便了,而且多了很多autocad中DCL中不能完成的功能。我就是即学即会的。
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal>
<P><FONT size=3></FONT> </P>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>我想尽力去赶超<SPAN lang=EN-US>Express Tools,但我深知这是不可能的,也是不现实的。</SPAN><SPAN style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">J</SPAN>
<P></P></FONT>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>这个程序中有几个小小的错误,我正在想办法解决:<SPAN lang=EN-US>
<P></P></FONT></SPAN>
<P></P>
<P style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l1 level1 lfo3; tab-stops: list 18.0pt" class=MsoNormal><SPAN style="mso-list: Ignore"><FONT size=3>1、</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><FONT size=3>鼠标双击的错误:在鼠标双击弹出对话框后,如果进行交互操作可能有错误提示:但并不影响程序进行。<SPAN lang=EN-US>
<P></P></FONT></SPAN>
<P></P>
<P style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l1 level1 lfo3; tab-stops: list 18.0pt" class=MsoNormal><SPAN style="mso-list: Ignore"><FONT size=3>2、</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><FONT size=3>选择集的错误,有好几个,因为选择集最麻烦了,不像图块或者文字。<SPAN lang=EN-US>
<P></P></FONT></SPAN>
<P></P>
<P style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-list: l1 level1 lfo3; tab-stops: list 18.0pt" class=MsoNormal><SPAN style="mso-list: Ignore"><FONT size=3>3、</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><FONT size=3>乾坤大挪移后的关联问题,也没仔细考虑清楚。<SPAN lang=EN-US>
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=3>其他隐藏的就还暂时没发现,所以这个版本不能是正式版本,需要做很多调整。大家多提意见啊,谢谢了!<SPAN lang=EN-US>
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><FONT size=2><SPAN lang=EN-US><BR></FONT></SPAN></P></FONT></SPAN></SPAN><FONT size=2><SPAN lang=EN-US><BR></FONT></SPAN>
<P></P>
<P></P>
<P><FONT size=2 face=宋体></FONT></P> 太厉害了,我一直在找这种曲线路径变形是怎么实现了,没想到这里有源码。
感谢。 是不是 DCL 全 CAD 支持,OPENDCL 部分 CAD 支持 <p>沙发.</p><p>支持一下,能做出一百多K的这种程序.可见根底很不错.</p> 支持,要做这种程序也很不容易,恐怕我十年也学不会…… <p>这么棒的程序!太帅了,楼主花大心思啦!向您学习!</p> 太帅了,值得向楼主学习 只能说是强人! 本帖最后由 作者 于 2007-7-11 21:37:48 编辑 <br /><br /> <p>版主真是利害,这几天也是着用看看OPENDCL<br/>不过发现这软体的输出LSP是要自己手动执行<br/>真是不方便.<br/>另外官网下载点<br/><a href="https://sourceforge.net/project/showfiles.php?group_id=187950">https://sourceforge.net/project/showfiles.php?group_id=187950</a><br/>下载回来 4.0 (RC1) 安装后的 OpenDCL.16.arx 及 OpenDCL.17.arx<br/>在使用版主的程序为何会缺少 ODCL_PROJECT_LOAD 函数<br/>但使用您所提供的 OpenDCL.16.arx 及 OpenDCL.17.arx 却不会发生这情况<br/>发现这两组的大小有异,不知道为何呢?</p><p>另外版主或是其他高手,有人知道<br/>OpenDCL.Runtime.4.0.2.0.msm<br/>这档案是做什么用的吗? </p><p>最后希望版主可以提供些您在使用OPENDCL上的编写技巧,<br/>给大家参考学习一下.谢谢~</p> <p>我以前的用的openDCL的版本是4.0.1.16,但现在的版本4.0.2.1有很多地方都做了改变,以前所有的以ODCL开头的函数现在都变成了DCL的函数,所以程序不能运行。另外新版本的支持路径为\common\openDCL 和openDCL Studio,所以要使得我的程序能运行,还需做一些代码上的改动。明天我发上修改过后的英文版。<br/>关于做个openDCL教程或技巧,我会做的,只怕得不好,请大家多担待。</p><p>我估计以后ACAD的lisp的对话框可能是openDCL了。<br/></p> 原来如此,果真是版本问题.<br/>要麻烦版主修改了.<br/>期待修正后的版本了<br/>另外请问反应器在于 永久反应器 与 暂时反应器<br/>在维护上哪种比较方便.<br/>先谢了~ <p>太牛了,继续努力楼主</p>