開發平台:VB +CAD 2004
由於變態的客戶不願意 裝CAD 2010,只用CAD 2004, 但是只有06 才支持.Net 方式,所以只能用古老的VB開發
實現功能:把幾個dwg 文件,合並到一個DWG 里,然后把所有的圖層 合並到一個圖層,所有的顏色為白色。然后自動保存新的文件
參考資料:《VisualBasic與AutoCAD二次開發》張晉西.pdf
C#語言操作ActiveX_automation CAD二次開發實例教程.pdf
AutoCAD+ActiveX二次開發技術.pdf
基於Visual+C#的AutoCAD+開發及其在工程中的應用.pdf
Option Explicit Dim cadapp As AcadApplication Dim foldname As String Private Sub Command3_Click() '創建一個新的文檔 'cadapp.Documents.Add 'Call aaa On Error Resume Next Dim k As Integer Dim fname As String 'ReDim AA(List1.ListCount - 1) As String For k = 0 To List1.ListCount - 1 fname = List1.List(k) & ".dwg" 'AA(k) = fname Next 'For k = 0 To List1.ListCount - 1 ' 'MsgBox (AA(k)) ' ' 'Next Dim a As Boolean a = IsNumeric(Mid(Text1.Text, 1, 3)) If a = True Then MsgBox "全是數子" Else MsgBox "中文" End If Call CreateFolder End Sub Private Sub Command4_Click() If List1.SelCount = 1 Then List1.RemoveItem List1.ListIndex End If End Sub Private Sub Form_Load() On Error Resume Next Set cadapp = GetObject(, "AutoCAD.Application") If Err Then Err.Clear Set cadapp = CreateObject("AutoCAD.Application") If Err Then MsgBox ("沒有安裝CAD") Exit Sub End If End If End Sub Private Sub Command1_Click() Dim ssetObj As AcadSelectionSet Set ssetObj = cadapp.ActiveDocument.SelectionSets.Add("Test1") AppActivate cadapp.Caption Dim FType(0) As Integer Dim FData(0) As Variant FType(0) = 0 FData(0) = "*text" Dim FilterType As Variant Dim FilterData As Variant FilterType = FType FilterData = FData ssetObj.SelectOnScreen FilterType, FilterData AppActivate 圖幅下載.Caption Dim pickedObjs As AcadEntity For Each pickedObjs In ssetObj pickedObjs.Highlight (True) ' MsgBox (pickedObjs.TextString) Dim a As Boolean a = IsNumeric(Mid(pickedObjs.TextString, 1, 3)) And Len(pickedObjs.TextString) = 10 If a = True Then List1.AddItem (pickedObjs.TextString) End If ' List1.AddItem (pickedObjs.Layer) pickedObjs.Update Next ssetObj.Delete End Sub Private Sub Command2_Click() Label3.Caption = "正在創建。。。。。。。" On Error Resume Next Dim acaddoc As AcadDocument cadapp.Documents.Add '插入dwg文件 Dim fcount As Integer fcount = List1.ListCount Dim fk As Integer Dim flong As Integer flong = fcount - 1 ReDim fname(flong) As String For fk = 0 To fcount - 1 fname(fk) = List1.List(fk) Next Dim findex As Integer Label3.Caption = "正在打開文件" For findex = 0 To fcount - 1 Dim insertedBlock As AcadBlockReference Dim Pt_Temp_1(0 To 2) As Double Pt_Temp_1(0) = 0 Pt_Temp_1(1) = 0 Pt_Temp_1(2) = 0 Dim Txtstr As String Txtstr = "F:\CAD數據\" & fname(findex) & ".dwg" If Dir(Txtstr) <> "" Then Set insertedBlock = cadapp.ActiveDocument.ModelSpace.AttachExternalReference(Txtstr, List1.List(findex), Pt_Temp_1, 1, 1, 1, 0, False) ' cadapp.ActiveDocument.Blocks.Item(insertedBlock.Name).Bind False cadapp.ActiveDocument.Blocks.Item(insertedBlock.Name).Bind True '必須綁定為 True ,要不然不能炸開塊 insertedBlock.Delete End If Next findex '炸開塊 Label3.Caption = "正在顯示塊。。。。。。。" For findex = 0 To fcount - 1 Dim explodeobjts As Variant Dim Iblock As AcadBlockReference Dim insertpoint(0 To 2) As Double insertpoint(0) = 0 insertpoint(1) = 0 insertpoint(2) = 0 Set Iblock = cadapp.ActiveDocument.ModelSpace.InsertBlock(insertpoint, List1.List(findex), 1, 1, 1, 0) ZoomExtents ' MsgBox (Iblock.name) Iblock.Explode Iblock.Delete cadapp.ActiveDocument.Blocks.Item(List1.List(findex)).Delete Next findex ' ' Dim cadlayer As AcadLayer ' Set cadlayer = cadapp.ActiveDocument.Layers.Item("Tk") ' ' cadlayer.Delete '刪除圖框 Label3.Caption = "正在刪除圖框。。。。。。。" Dim TksetObj As AcadSelectionSet Set TksetObj = cadapp.ActiveDocument.SelectionSets.Add("Tk") Dim TkType(0) As Integer Dim TkData(0) As Variant TkType(0) = 8 TkData(0) = "Tk" Dim TkFileterType As Variant Dim TkFileterData As Variant TkFileterType = TkType TkFileterData = TkData TksetObj.Select acSelectionSetAll, , , TkFileterType, TkFileterData Dim Tkpickobject As AcadEntity For Each Tkpickobject In TksetObj Tkpickobject.Delete Next TksetObj.Delete '合並圖層 Label3.Caption = "正在合並圖層。。。。。。。" Dim Ientity As AcadEntity For Each Ientity In cadapp.ActiveDocument.ModelSpace If Ientity.Layer <> "0" Then Ientity.Layer = "0" End If Next Ientity '(command "-purge" "la" lay_name "N") ' cadapp.ActiveDocument.SendCommand "PURGE" & vbCr & "la"&vbCr& "NET"& vbCr "N"&Chr(13) ' Dim cadlayer As AcadLayer ' Set cadlayer = cadapp.ActiveDocument.Layers.Item("HYD") ' ' ' On Error Resume Next ' cadlayer.Delete ' If Err <> 0 Then ' MsgBox "該圖層不能被刪除" ' End If ' Dim cadlayer As AcadLayers ' ' cadapp.ActiveDocument.Layers.Count ' Dim i As Integer ' For i = 0 To cadapp.ActiveDocument.Layers.Count - 1 ' If cadapp.ActiveDocument.Layers.Item(i).Name <> "0" Then ' ' cadapp.ActiveDocument.Layers.Item(i).Delete ' ' End If ' ' ' Next i ' MsgBox (cadapp.ActiveDocument.Layers.Item(1).Name) ' MsgBox (cadapp.ActiveDocument.Layers.Count) ' explodeobjts(0).Delete ' Dim BlockObj As AcadSelectionSet ' ' Set BlockObj = cadapp.ActiveDocument.SelectionSets.Add("Test2") ' ' Dim gpcode(0) As Integer ' Dim datavalue(0) As Variant ' gpcode(0) = 0 ' datavalue(0) = "INSERT" ' ' Dim groupcode As Variant, datacode As Variant ' groupcode = gpcode ' datacode = datavalue ' BlockObj.Select acSelectionSetAll, , , groupcode, datacode ' ' Dim i As Integer ' Dim ENT As AcadBlock ' Dim Qty As Integer ' Qty = 0 ' For i = 0 To BlockObj.Count - 1 ' Set ENT = BlockObj(i) ' ENT.Explode ' Qty = Qty + 1 ' Next i ' MsgBox "炸開" & Str(Qty) & "個塊!" '保存圖形 Label3.Caption = "正在保存文件。。。。。。。" Call CreateFolder Dim filename As String filename = foldname + "\" + Text1.Text + ".dwg" cadapp.ActiveDocument.SaveAs filename AppActivate 圖幅下載.Caption If Err Then MsgBox Err.Description Exit Sub End If MsgBox "成功!生成" + filename Label3.Caption = "創建完畢!" End Sub Public Function CreateFolder() Dim fso As New FileSystemObject Dim riqi As String riqi = Format(Now, "YYYY-MM-DD") + "—" + Text1.Text + "—" + Text2.Text 'MsgBox riqi foldname = "F:\圖幅下載\小雞雞\" + riqi If fso.FolderExists(foldname) Then MsgBox "創建的文件夾已經存在", vbOKOnly, "警告" Else fso.CreateFolder (foldname) If Err Then MsgBox Err.Description End If 'MsgBox "創建成功" End If End Function Private Sub Form_Unload(Cancel As Integer) 'cadapp.Quit Set cadapp = Nothing End Sub
注意的問題:
一:以塊的方式,插入dwg 文件,必須綁定為True ,要不然不能炸開。
插入后不能顯示到當前modelspace,需從blocks 里從新插入才能顯示
二:合並完圖層 后,發現不能刪除圖層,可以用“PURGE"命令 清理,就能刪除了