[VBA][紧急求助]关于遍历多段线的问题!!!
<P>各位大侠好!</P><P>本人现有难题,请大家给予帮忙,在此多谢先!</P>
<P>我有很多autocad2000的旧图,使用了参照的功能,</P>
<P>在旧版软件里面打印时,可以通过设置颜色来统一设置线宽,没有问题。</P>
<P>但是现在更新autocad版本到2006后,这个方法却不管用了,尽管设置了线宽,</P>
<P>但是,每次打印时,在参照块里面的多段线的线宽总是不正确,</P>
<P>导致打印出来的图形线宽粗细不一,非常难看。</P>
<P>现在,一直没有办法解决,</P>
<P>除了就是到每一个参照块里面把所有的多段线都打散(分解)了。</P>
<P>这是一个非常麻烦的工作,由于大量的图纸,这几乎就是不可行的方法了。</P>
<P>所以,本人在想,是否可以做个VBA程序,直接在图纸里面运行,</P>
<P>遍历图中的多段线和参照块,</P>
<P>自动将图纸中的多段线以及所有参照块中的多段线全部分解,这样就省事多了;</P>
<P>或者是否可以在文件目录中,放置编写好的一个小程序,不用打开CAD程序,</P>
<P>直接遍历文件夹中的文件,以及文件中的多段线,并分解,这样是为了避免操作参照块。</P>
<P>以上思路不知道是否可行,还请高人出来指点一二!</P>
<P>谢谢!</P>
<P><A href="mailto:litsong@126.com" target="_blank" >litsong@126.com</A></P> <P>Sub test()<BR>On Error Resume Next</P>
<P>Dim MySet As AcadSelectionSet<BR>Dim FilterType(0) As Integer<BR>Dim FilterData(0) As Variant</P>
<P>ThisDrawing.SelectionSets.Item("MySet ").Delete</P>
<P>FilterType(0) = 0: FilterData(0) = "LWPOLYLINE,INSERT"<BR>Set MySet = ThisDrawing.SelectionSets.Add("MySet ")<BR>MySet.Select acSelectionSetAll, , , FilterType, FilterData</P>
<P>Dim i As Integer</P>
<P>Dim Bobj As Object</P>
<P>For i = 0 To MySet.Count - 1<BR>If MySet(i).ObjectName = "AcDbPolyline" Then<BR>MySet(i).Explode<BR>MySet(i).Delete<BR>Else<BR> For Each Bobj In ThisDrawing.Blocks(MySet(i).Name)<BR> If Bobj.ObjectName = "AcDbPolyline" Then<BR> Bobj.Explode<BR> Bobj.Delete<BR> End If<BR> Next<BR>End If<BR>Next</P>
<P>End Sub</P> <P>谢谢2楼的兄弟帮忙,给出了代码。</P>
<P>我想问一下,这个应该是不能对参考进行操作吧?</P>
<P>有些代码我还看不太懂</P> 能实现在一个文件里面对所有的参照文件都进行操作啊?? <P>还有,就是如果直接使用上面的代码,转而遍历文件夹中所有的*.DWG文件,然后在后台打开并运行宏代码操作。可是每次操作的文件高达2000,这样的话,系统能不能吃得消呢??真是头疼哦~~</P>
<P> </P> vba只能在cad环境下运行,不能在后台运行,要的话建议用vb写 <P>块参照多的情况下,也没有多大的影响</P>
<P>最近我刚刚对块进行炸开的操作,用的是过滤器的办法</P>
<P>这样就可以按照楼主的要求做了</P> <P><A name=34902><FONT color=#0000ff><B>wyj7485</B></FONT></A></P>
<P>说的不错,我正在弄这个,是用VB来实现呢,呵呵</P>
<P>VBA在VB里面着实折腾不出来啊,</P>
<P>能不能提供点代码,以便研究研究啊?</P>
<P>小弟平时会用VB编写一些东西,CAD的vba不太懂,还请多多指教,</P>
<P><A name=34902><FONT color=#0000ff><B>wyj7485</B></FONT></A>还有楼上的兄弟<A name=34935><FONT color=#000066><B>chman</B></FONT></A>,</P>
<P>多谢先,呵呵</P>
<P>网上,好像针对这方面的资料也不多,真头疼噢:(</P> <P>显示找不到“AcadSelectionSet”???</P>
<P>请帮忙分析一下下面的代码,谢谢先~~</P>
<P> </P>
<P> </P>
<P>Dim obj_Acad As Object, obj_Doc As Object, obj_ModelSpace As Object 'Application对象、Document对象、ModelSpace对象<BR> <BR>Public Sub AutoCADOpen(FileName As String) '打开AutoCAD子程序<BR>On Error Resume Next<BR>Set obj_Acad = GetObject(, "autocad.application") '若AutoCAD已启动,则直接得到Application对象,建议先打开CAD程序<BR>If Err Then<BR> Err.Clear<BR> On Error Resume Next<BR> Set obj_Acad = CreateObject("autocad.application") '若AutoCAD未启动,则运行AutoCAD程序<BR> If Err Then<BR> Err.Clear<BR> MsgBox "不能运行AutoCAD,请检查是否安装!", vbOKOnly, "警告!"<BR> Exit Sub<BR> End If<BR>End If<BR>obj_Acad.Visible = True '设置AutoCAD为可见(或者在后台运行,不可见)<BR>obj_Acad.Documents.open (FileName) '打开AutoCAD图形文件<BR>Set obj_Doc = obj_Acad.ActiveDocument '获得当前活动图形文件,即刚打开的图形文件<BR>Set obj_ModelSpace = obj_Doc.ModelSpace '获得当前活动图形文件的模型空间</P>
<P>On Error Resume Next</P>
<P>Dim MySet As AcadSelectionSet<BR>Dim FilterType(0) As Integer<BR>Dim FilterData(0) As Variant</P>
<P>ThisDrawing.SelectionSets.Item("MySet ").Delete</P>
<P>FilterType(0) = 0: FilterData(0) = "LWPOLYLINE,INSERT"<BR>Set MySet = ThisDrawing.SelectionSets.Add("MySet ")<BR>MySet.Select acSelectionSetAll, , , FilterType, FilterData</P>
<P>Dim i As Integer</P>
<P>Dim Bobj As Object</P>
<P>For i = 0 To MySet.Count - 1<BR>If MySet(i).ObjectName = "AcDbPolyline" Then<BR>MySet(i).explode<BR>MySet(i).Delete<BR>Else<BR> For Each Bobj In ThisDrawing.Blocks(MySet(i).Name)<BR> If Bobj.ObjectName = "AcDbPolyline" Then<BR> Bobj.explode<BR> Bobj.Delete<BR> End If<BR> Next<BR>End If<BR>Next</P>
<P>End Sub</P>
<P>MsgBox "运行结束!", vbOKOnly, "工程1!"<BR>End Sub</P>
页:
[1]