开发平台: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"命令 清理,就能删除了