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