获取SolidWorks文件的BOM信息

来源:这里教程网 时间:2026-02-17 11:33:02 作者:

今天是个好日子,心情比较沉闷,对自己将来的何去何从又迷茫了。

今天来把上一个月所弄的东西来和大家分享一下。希望大家都来指出不好的地方。

前段时间做了一个读取产品BOM信息的程序。刚开始觉得挺困难,后来慢慢的研究,最终还是解决了。不多说了,看看代码就知道了。写的有点乱(最闹心的地方)

view source

print?

001 ''' <summary>

002    ''' 获取BOM视图

003    ''' </summary>

004    ''' <param name="path1">文件路径</param>

005    ''' <param name="dt"></param> #p#分页标题#e#

006    ''' <remarks></remarks>

007    Public Sub GetBom(ByVal path1 As String, ByVal dt As DataTable)

008  

009        dt.Columns.Add("母件图号")

010  

011        dt.Columns.Add("级别")

012  

013        Dim edmBOMView As IEdmBomView                                   '声明IedmBomView对象,用来获取BOM视图

014  

015        Dim edmBomManager As IEdmBomMgr                                 '定义IEdmBomMgr对象,用来操作BOM #p#分页标题#e#

016  

017        file8 = vault.GetFileFromPath(path1)                            '根据文件路径来获取文件

018  

019        Dim edmBomArray() As EdmBomLayout                               '定义BOM的样式

020  

021        edmBomManager = vault.CreateUtility(EdmUtility.EdmUtil_BomMgr)  '创建IEdmBomMgr实例

022  

023        edmBomManager.GetBomLayouts(edmBomArray)                        '获取BOM的样式

024  

025        For i As Integer = 0 To UBound(edmBomArray)                     '根据BOM的样式来获取BOM视图 #p#分页标题#e#

026  

027            edmBOMView = file8.GetComputedBOM(edmBomArray(i).mlLayoutID, _

028               file8.CurrentVersion, "default", -1)

029  

030        Next

031  

032        Dim bomRows As Array = Array.CreateInstance(GetType(EdmBomCell), 1) '定义承装BOM行的数组

033  

034        edmBOMView.GetRows(bomRows)                                         '从视图中获取BOM的所有行

035        Dim bomClunms As Array = Array.CreateInstance(GetType(EdmBomColumn), 1) '定义承装BOM列的数组 #p#分页标题#e#

036  

037        edmBOMView.GetColumns(bomClunms)                                    '获取BOM的所有列

038  

039        Dim column As EdmBomColumn                                          '定义BOM列类型的变量

040  

041        For k As Integer = 0 To bomClunms.Length - 1                        '循环列数组来获取列名,添加到DataTable中

042  

043            column = bomClunms.GetValue(k)

044  

045            dt.Columns.Add(column.mbsCaption, GetType(String)) #p#分页标题#e#

046  

047        Next

048  

049        Dim j As Integer = bomRows.GetLength(bomRows.Rank - 1)              '获取BOM行数

050  

051        Dim cell As IEdmBomCell                                             '定义行变量

052  

053        Dim hjPath As String

054  

055        Dim level, fisLevel As Integer #p#分页标题#e#

056  

057        Dim r As Integer = 1

058  

059        For Each cell In bomRows                                           '循环行,并把行数据添加到DataTable中

060            Dim dr As DataRow = dt.NewRow()

061  

062            Dim pa As String = cell.GetPathName()

063  

064            dt.AcceptChanges()

065  

#p#分页标题#e# 066            For j = 0 To bomClunms.Length - 1

067  

068                Dim column1 As EdmBomColumn = bomClunms.GetValue(j)

069  

070                Dim b As Integer = cell.GetTreeLevel()

071  

072                level = cell.GetTreeLevel + 1

073  

074                Dim value As New Object

075  

076                hjPath = cell.GetPathName() #p#分页标题#e#

077  

078                Dim poComputedValue As New Object

079  

080                Dim config As String

081  

082                cell.GetVar(column1.mlVariableID, column1.meType, value, poComputedValue, config, True)

083  

084                dr("级别") = b + 1

085  

086                dr(j + 2) = value.ToString()

087  

088            Next #p#分页标题#e#

089  

090            dt.Rows.Add(dr)

091  

092            If dr("是否自制焊件") = "焊件" Then

093  

094                GetRef(hjPath, level, dr("图号"), dr("零件类型"))

095  

096            End If

097  

098            r += 1

099        Next

100        AdjustTable(dt)                                          '对DataTable进行处理 填充DataTable中的母件图号列 #p#分页标题#e#

101  

102  

103    End Sub

104    ''' <summary>

105    ''' 输出格式

106    ''' </summary>

107    ''' <param name="dt"></param>

108    ''' <remarks></remarks>

109    Private Sub AdjustTable(ByVal dt As DataTable)

110  

111        For i As Integer = 0 To dt.Rows.Count - 1 #p#分页标题#e#

112  

113            Try

114                If i = 0 Then

115  

116                    Continue For

117  

118                End If

119  

120                If dt.Rows(i)("级别") - dt.Rows(i - 1)("级别") = 0 Then

121  

122                    dt.Rows(i)("母件图号") = dt.Rows(i - 1)("母件图号") #p#分页标题#e#

123  

124                ElseIf dt.Rows(i)("级别") - dt.Rows(i - 1)("级别") > 0 Then

125  

126                    dt.Rows(i)("母件图号") = dt.Rows(i - 1)("图号").ToString

127  

128                Else

129  

130                    dt.Rows(i)("母件图号") = GetPre(i, dt)

131  

132                End If

133  

134            Catch ex As Exception #p#分页标题#e#

135                'MsgBox(ex.Message.ToString)

136            End Try

137  

138        Next

139    End Sub

140    ''' <summary>

141    ''' 调整输出格式

142    ''' </summary>

143    ''' <param name="i"></param>

144    ''' <param name="dt"></param>

145    ''' <returns></returns>

146    ''' <remarks></remarks> #p#分页标题#e#

147    Private Function GetPre(ByVal i As Integer, ByVal dt As DataTable) As String

148  

149        Dim strSre As String = dt(0)("图号").ToString

150  

151        For j As Integer = i - 1 To 0 Step -1

152  

153            Try

154                If dt.Rows(j)("级别") = dt.Rows(i)("级别") Then #p#分页标题#e#

155  

156                    strSre = dt.Rows(j)("母件图号").ToString

157  

158                    Exit For

159  

160                ElseIf dt.Rows(j)("级别") < dt.Rows(i)("级别") Then

161  

162                    strSre = dt.Rows(j)("图号").ToString

163  

164                    Exit For

165  

166                End If #p#分页标题#e#

167            Catch ex As Exception

168                'MsgBox(ex.Message.ToString)

169            End Try

170              

171  

172        Next

173  

174        Return strSre

175  

176    End Function

相关推荐