前阵子碰到一个需求,我先是发表在了全球博客。
该需求基于这样一个问题:一般从内容中心(或叫做零件库)插入零件,Inventor会列出一个族里所有可用的行,每行代表不同参数的零件。但有时并不是所有我们关心的参数搭配都在其中,例如,有这样的搭配
Diameter Length
10 1000
20 1000
30 1000
但没有 diameter = 10 且 length = 2000的搭配
API有方法!ContentFamily.TableRows.Add可添加行(只适用于自定义的零件库,Inventor本身提供的库不能修改)。该方法定义是:
Sub Add(ByRef RowData As SAFEARRAY(BSTR), ByRef Position As [defaultvalue(-1)] long, Result As [out, retval] ContentTableRow*)
RowData: 提供字串数组,即该行的数据。必须和列的数量一样,且顺序一样。
Position: 可选参数,规定新的行放置位置。如果不规定,则会作为最后一行
另外注意,大多数零件库的API做了修改后,必须调用ContentFamily.Save, 否则修改无法保存。以下简单代码演示如何解决前面的需求。
Sub addCCFamilyRow()
' 假定通过访问当前运行的Inventor
Dim m_inventorApp As Inventor.Application = Nothing
m_inventorApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application")
' 获取内容中心
Dim oContentCenter As ContentCenter
oContentCenter = m_inventorApp.ContentCenter
' 获取节点 "Fasteners:Bolts:Hex Head"
Dim oContentNode As ContentTreeViewNode
oContentNode =
oContentCenter.TreeViewTopNode.ChildNodes.Item("Fasteners").
ChildNodes.Item("Bolts").
ChildNodes.Item("Hex Head")
' 获取 "ISO 4015" 族
Dim oFamily As ContentFamily
For Each oFamily In oContentNode.Families
If oFamily.DisplayName = "ISO 4015" Then
Exit For
End If
Next
' 获取第一行
Dim oOneRow As ContentTableRow
oOneRow = oFamily.TableRows(1)
'为了演示,重用第一行的大部分数据,只修改其中一个数据
' 定义一个动态数组
Dim oNewRow() As String
Dim oCell As ContentTableCell
Dim i As Integer
i = 0
For Each oCell In oOneRow
' 每个数据
ReDim Preserve oNewRow(i)
oNewRow(i) = oCell.Value
' 本例中
'Fasteners >>Bolts>>Hex Head
'修改第10列[Bolt Length] '
' 注意,数组从0开始序号
If i = 10 Then
' 设置新的值
oNewRow(i) = "10.11111"
End If
i = i + 1
Next
'添加新行
oFamily.TableRows.Add( oNewRow)
'保存修改
oFamily.Save
End Sub