|
製作紙本BOM時通常是另存工程圖中的零件表再開啟Excel編輯成規定的格式
如果可以用程式取出BOM表資料透過自定義的方式輸出Excel就可以節省一點時間了
這個程式算是半成品,因為製作Excel的部分還要看使用者需要什麼格式
- Imports SolidWorks.Interop.sldworks
- Imports SolidWorks.Interop.swconst
- Imports Microsoft.Office.Interop
- Public Class Form1
- '定義拖曳起始與結束的Item位置
- Private InitialCount, FinalCount As Integer
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- '建議Excel物件
- Dim ExcelApp As New Excel.Application 'ExcelApp 是操作 Excel 的變數
- Dim Workbook As Excel.Workbook 'Workbook 代表的是一個 Excel 本體
- Dim Worksheet As Excel.Worksheet 'Worksheet 代表的是 Excel 工作表
- ExcelApp.Visible = True
- '建立活頁簿
- Workbook = ExcelApp.Workbooks.Add()
- '選定工作表
- Worksheet = Workbook.Sheets(1)
- '顯示工作表
- ExcelApp.Visible = True
- '建立資料字串陣列
- Dim Data(ListView_BOM.Items.Count - 1, ListView_BOM.Columns.Count - 1) As String
- For i = 0 To ListView_BOM.Items.Count - 1
- For j = 0 To ListView_BOM.Columns.Count - 1
- Data(i, j) = ListView_BOM.Items(i).SubItems(j).Text
- Next
- Next
- Worksheet.Range(Worksheet.Cells(1, 1), Worksheet.Cells(ListView_BOM.Items.Count, ListView_BOM.Columns.Count)).Value = Data
- End Sub
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- Dim OpenFile As OpenFileDialog = New OpenFileDialog '創建檔案瀏覽物件
- OpenFile.CheckFileExists = True '開啟檔案不存在警告
- OpenFile.Filter = "工程圖 (*.SLDDRW)|*.SLDDRW" '設定檔案類型
- OpenFile.Multiselect = False '禁止複選檔案
- OpenFile.ShowDialog() '秀出檔案瀏覽視窗
- Dim Path As String = OpenFile.FileName '取得檔案路徑
- '判定檔案類型
- If Strings.Right(Path, 6) = "SLDDRW" Then
- GetBOMTable(Path)
- Else
- MsgBox("檔案類型錯誤")
- End If
- End Sub
- Sub GetBOMTable(ByVal Path As String)
- Dim SwApp As New SldWorks
- '取得回傳訊息
- Dim longstatus, longwarnings As Integer
- Dim swModel As ModelDoc2 = SwApp.OpenDoc6(Path, swDocumentTypes_e .swDocDRAWING, 0, "", longstatus, longwarnings)
- Dim swDraw As DrawingDoc = swModel
- Dim swFeat As Feature = swModel.FirstFeature
- Dim swBomFeat As BomFeature
- '開啟含有BOM表的工程圖
- swModel = SwApp.ActiveDoc
- '比對圖檔內是否有零件表
- Do While Not swFeat Is Nothing
- If "BomFeat" = swFeat.GetTypeName Then
- Debug.Print("******************************")
- '顯示零件表名稱
- Debug.Print("Feature Name : " & swFeat.Name)
- '取得零件表物件
- swBomFeat = swFeat.GetSpecificFeature2
- ProcessBomFeature(SwApp, swModel, swBomFeat)
- SwApp.CloseDoc(swModel.GetTitle)
- SwApp.ExitApp()
- SwApp = Nothing
- Exit Do
- End If
- '取得下一個特徵型態
- swFeat = swFeat.GetNextFeature
- Loop
- End Sub
- Sub ProcessBomFeature(ByVal swApp As SldWorks, ByVal swModel As ModelDoc2, ByVal swBomFeat As BomFeature)
- Dim swFeat As Feature
- Dim vTableArr As Object
- Dim vTable As Object
- Dim vConfigArray As Object
- Dim vConfig As Object
- Dim ConfigName As String
- Dim swTable As TableAnnotation
- '取得零件表物件
- swFeat = swBomFeat.GetFeature
- vTableArr = swBomFeat.GetTableAnnotations
- For Each vTable In vTableArr
- swTable = vTable
- vConfigArray = swBomFeat.GetConfigurations(True, True)
- For Each vConfig In vConfigArray
- '顯示組件組態
- ConfigName = vConfig
- Debug.Print("-------------------------------------------------------")
- Debug.Print(" Component for Configuration : " & ConfigName)
- '取得BOM表詳細資訊
- ProcessTableAnn(swApp, swModel, swTable, ConfigName)
- Next vConfig
- Next vTable
- End Sub
- Sub ProcessTableAnn(ByVal swApp As SldWorks, ByVal swModel As ModelDoc2, ByVal swTableAnn As TableAnnotation, ByVal ConfigName As String)
- Dim BOM As TableAnnotation = swTableAnn
- With ListView_BOM
- .Columns.Clear()
- .Items.Clear()
- End With
- For i = 1 To swTableAnn.RowCount - 1
- Dim RowData(swTableAnn.ColumnCount - 1) As String
- For j = 0 To swTableAnn.ColumnCount - 1
- If i = 1 Then
- With ListView_BOM
- .Columns.Add(BOM.DisplayedText(i, j))
- .Columns(j).Width = BOM.GetColumnWidth(j) * 6000
- End With
- Else
- RowData(j) = BOM.DisplayedText(i, j)
- End If
- Next
- Dim Item As New ListViewItem(RowData)
- ListView_BOM.Items.Add(Item)
- Next
- End Sub
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- With ListView_BOM
- .View = Windows.Forms.View.Details
- .GridLines = True
- .MultiSelect = False
- .AllowDrop = True
- .FullRowSelect = True
- End With
- End Sub
- '處發條件:開始Item拖曳
- Private Sub ListView_BOM_ItemDrag(sender As Object, e As ItemDragEventArgs) Handles ListView_BOM.ItemDrag
- '讀取被拖曳Item
- Dim SelectItem As ListViewItem = ListView_BOM.SelectedItems.Item(0)
- sender.DoDragDrop(SelectItem, DragDropEffects.Move)
- End Sub
- '觸發條件:拖曳完成
- Private Sub ListView_BOM_DragDrop(sender As Object, e As DragEventArgs) Handles ListView_BOM.DragDrop
- With sender
- '取得拖曳完成時的位置
- FinalCount = .Items.IndexOf(.HitTest(.PointToClient(New Point(e.X, e.Y))).Item)
- '判定拖曳的資料類型是否正確
- If e.Data.GetDataPresent(GetType(ListViewItem)) Then
- '取得被拖曳的元素
- Dim InsertItem As ListViewItem = e.Data.GetData(GetType(ListViewItem))
- '必須先移除被拖曳的元素才能重新加入,不然會發生錯誤
- .items.Remove(InsertItem)
- '被拖曳Item插入位置
- If FinalCount = -1 Then
- '拖曳至空白區,插入至最下方
- .items.add(InsertItem)
- Else
- '拖曳至Item群組內,插入滑鼠放開的位置
- .items.insert(FinalCount, InsertItem)
- End If
- End If
- End With
- End Sub
- '觸發條件:拖曳中
- Private Sub ListView_BOM_DragOver(sender As Object, e As DragEventArgs) Handles ListView_BOM.DragOver
- '按著滑鼠左鍵且點選Item時才執行下列程式碼
- If InitialCount <> -1 And MouseButtons = MouseButtons.Left Then
- '定義拖曳鼠標型態,如果沒有使用這個事件與拖曳效果無法完成拖曳
- e.Effect = DragDropEffects.Move
- End If
- End Sub
- '觸發條件:在ListView內按下滑鼠
- Private Sub ListView_BOM_MouseDown(sender As Object, e As MouseEventArgs) Handles ListView_BOM.MouseDown
- '取得滑鼠點擊時所在的Item位置
- InitialCount = ListView_BOM.Items.IndexOf(ListView_BOM.HitTest(e.X, e.Y).Item)
- End Sub
- '觸發條件:拖曳時離開ListView
- Private Sub ListView_BOM_DragLeave(sender As Object, e As EventArgs) Handles ListView_BOM.DragLeave
- '刪除Item
- With sender
- '按著滑鼠左鍵且點選Item時才執行下列程式碼()
- If InitialCount <> -1 And MouseButtons = MouseButtons.Left And .Items.Count - 1 >= InitialCount Then
- .items.removeat(InitialCount)
- End If
- End With
- End Sub
- End Class
複製代碼
|
本帖子中包含更多資源
您需要 登錄 才可以下載或查看,沒有賬號?註冊
x
|