API提供了访问iPart表,行,列的属性。但是没有提供直接修改行,列,或增加删除行列的方法。
实际上,每个iPart表都和一个后台的Excel表格关联,在用户界面里,右键iPart表,可以看到两个菜单【修改表】或【通过Excel表修改】(我这里只有英文版Inventor,或许中文版的翻译不是这样,但可通过截图找到对应菜单)
例如,假设我们有这样一个iPart。其中有一列还是自定义的。
关闭后,在用Excel方式打开,能看到如下情况:
可以看到,iProperties对应的列定义为: 特性名[特性集合名]; 如果是自定义的,则带有xml标签<free>; 如果是普通参数列,则直接用其名字,例如d0,d1
现在增加一列和一行。
再从Inventor打开,则是这样的结果:
也就是说,我们可以通过修改Excel表来操作其行和列。而API提供了访问对应Excel表的方法:
iPartFactory.ExcelWorkSheet
本文中首先看看如何创建新的iPart表,其行列的内容由代码确定。
VBA
记得先添加Excel的引用
Private Sub CreateNewiPartTable()
Dim oPartDoc As PartDocument
Set oPartDoc = ThisApplication.ActiveDocument
On Error Resume Next
Dim oFactory As iPartFactory
Set oFactory = oPartDoc.ComponentDefinition.iPartFactory
'Get the iPartTable
If Err > 0 Or oFactory Is Nothing Then
Set oFactory = oPartDoc.ComponentDefinition.CreateFactory
Else
Exit Sub
End If
On Error GoTo 0
Dim oWorkSheet As WorkSheet
Set oWorkSheet = oFactory.ExcelWorkSheet
Dim oCells As Range
Set oCells = oWorkSheet.Cells
' Column names...
'Set the key for the iPartTable, here we use the key 'Part Number"
With oCells
.Item(1, 2) = oCells.Item(1, 2) + "0"
.Item(1, 3) = oPartDoc.ComponentDefinition.Parameters.ModelParameters.Item(1).Name
.Item(1, 4) = oPartDoc.ComponentDefinition.Parameters.ModelParameters.Item(2).Name
.Item(1, 5) = oPartDoc.ComponentDefinition.Parameters.ModelParameters.Item(3).Name
.Item(1, 6) = oPartDoc.ComponentDefinition.Parameters.ModelParameters.Item(4).Name
End With
Dim oUM As UnitsOfMeasure
Set oUM = oPartDoc.UnitsOfMeasure
Dim oParameter As Parameter
Set oParameter = oPartDoc.ComponentDefinition.Parameters.ModelParameters.Item(1)
'The first row is column name in excel table, the first ipart row is the second row in fact
Dim iInitRow, i As Integer
iInitRow = 2
With oCells
.Item(iInitRow, 3) = _
oUM.GetStringFromValue( _
oParameter.Value, oParameter.Units)
Set oParameter = _
oPartDoc.ComponentDefinition. _
Parameters.ModelParameters.Item(2)
.Item(iInitRow, 4) = _
oUM.GetStringFromValue( _
oParameter.Value, oParameter.Units)
Set oParameter = _
oPartDoc.ComponentDefinition. _
Parameters.ModelParameters.Item(3)
.Item(iInitRow, 5) = _
oUM.GetStringFromValue( _
oParameter.Value, oParameter.Units)
.Item(iInitRow, 6) = _
oPartDoc.ComponentDefinition. _
Parameters.ModelParameters.Item(4).Expression
End With
'We need query the part number from iProperties of the part document.
Dim sPartNumber As String
sPartNumber = _
oPartDoc.PropertySets.Item( _
"{32853F0F-3444-11d1-9E93-0060B03C1CA6}"). _
ItemByPropId(kPartNumberDesignTrackingProperties).Value
Dim pos As Integer
pos = InStrRev(sPartNumber, "-")
Dim str As String
str = Left(sPartNumber, pos)
Dim iNumber As Integer
iNumber = Right(sPartNumber, Len(sPartNumber) - pos)
'Assume the offset of the parameter's value _
' (between two rows) is equal to 0.5cm
Dim offset As Double
offset = 0.5
'Add 20 rows into the iPartTable
For i = 1 To 20
' Row i values...
If (iNumber + i) < 10 Then
sPartNumber = _
str + "0" + CStr(iNumber + i)
Else
sPartNumber = _
str + CStr(iNumber + i)
End If
With oCells
.Item(iInitRow + i, 1) = _
sPartNumber
.Item(iInitRow + i, 2) = _
sPartNumber
Set oParameter = _
oPartDoc.ComponentDefinition. _
Parameters.ModelParameters.Item(1)
.Item(iInitRow + i, 3) = _
oUM.GetStringFromValue( _
oParameter.Value + offset * i, _
oParameter.Units)
Set oParameter = _
oPartDoc.ComponentDefinition.Parameters. _
ModelParameters.Item(2)
.Item(iInitRow + i, 4) = _
oUM.GetStringFromValue( _
oParameter.Value + offset * i, _
oParameter.Units)
Set oParameter = _
oPartDoc.ComponentDefinition. _
Parameters.ModelParameters.Item(3)
.Item(iInitRow + i, 5) = _
oUM.GetStringFromValue( _
oParameter.Value + offset * i, oParameter.Units)
.Item(iInitRow + i, 6) = _
oPartDoc.ComponentDefinition. _
Parameters.ModelParameters.Item(4).Expression
End With
Next
Set oUM = Nothing
Dim oWB As Workbook
Set oWB = oWorkSheet.Parent
oWB.Save
oWB.Close
End Sub
VB.NET
同样,记得添加引用
PrivateSub CreateNewiPartTable()
Dim oPartDocAsPartDocument
oPartDoc = ThisApplication.ActiveDocument
Dim oFactoryAsiPartFactory
'Get the iPartTable
Try
oFactory = oPartDoc.ComponentDefinition.iPartFactory
Catch exAsException
oFactory = oPartDoc.ComponentDefinition.CreateFactory
EndTry
If oFactoryIsNothingThen
Exit Sub
EndIf
Try
Dim oWorkSheetAs WorkSheet
oWorkSheet = oFactory.ExcelWorkSheet
Dim oCellsAs Range
oCells = oWorkSheet.Cells
' Column names...
'Set the key for the iPartTable, here we use the key 'Part Number"
With oCells
.Item(1, 2) = oCells.Item(1, 2) +"0"
.Item(1, 3) = oPartDoc.ComponentDefinition.Parameters.ModelParameters.Item(1).Name
.Item(1, 4) = oPartDoc.ComponentDefinition.Parameters.ModelParameters.Item(2).Name
.Item(1, 5) = oPartDoc.ComponentDefinition.Parameters.ModelParameters.Item(3).Name
.Item(1, 6) = oPartDoc.ComponentDefinition.Parameters.ModelParameters.Item(4).Name
EndWith
Dim oUMAsUnitsOfMeasure
oUM = oPartDoc.UnitsOfMeasure
Dim oParameterAsParameter
oParameter = oPartDoc.ComponentDefinition.Parameters.ModelParameters.Item(1)
'The first row is column name in excel table, the first ipart row is the second row in fact
Dim iInitRow, iAsInteger
iInitRow = 2
With oCells
.Item(iInitRow, 3) =
oUM.GetStringFromValue(oParameter.Value,
oParameter.Units)
oParameter =
oPartDoc.ComponentDefinition.
Parameters.ModelParameters.Item(2)
.Item(iInitRow, 4) =
oUM.GetStringFromValue(oParameter.Value,
oParameter.Units)
oParameter =
oPartDoc.ComponentDefinition.
Parameters.ModelParameters.Item(3)
.Item(iInitRow, 5) =
oUM.GetStringFromValue(
oParameter.Value, oParameter.Units)
.Item(iInitRow, 6) =
oPartDoc.ComponentDefinition.
Parameters.ModelParameters.Item(4).Expression
EndWith
'We need query the part number from iProperties of the part document.
Dim sPartNumberAsString
sPartNumber =
oPartDoc.PropertySets.Item(
"{32853F0F-3444-11d1-9E93-0060B03C1CA6}").
ItemByPropId(
PropertiesForDesignTrackingPropertiesEnum.
kPartNumberDesignTrackingProperties).Value
Dim posAsInteger
pos = InStrRev(sPartNumber,"-")
Dim strAsString
str = sPartNumber.Substring(0, pos)
Dim iNumberAsInteger
iNumber = sPartNumber.Substring(
sPartNumber.Length - pos, sPartNumber.Length)
'Assume the offset of the parameter's value
'(between two rows) is equal to 0.5cm
Dim offsetAsDouble
offset = 0.5
'Add 20 rows into the iPartTable
For i = 1To 20
' Row i values...
If (iNumber + i) < 10Then
sPartNumber = str +"0" +CStr(iNumber + i)
Else
sPartNumber = str +CStr(iNumber + i)
EndIf
With oCells
.Item(iInitRow + i, 1) = sPartNumber
.Item(iInitRow + i, 2) = sPartNumber
oParameter =
oPartDoc.ComponentDefinition.Parameters.
ModelParameters.Item(1)
.Item(iInitRow + i, 3) =
oUM.GetStringFromValue(
oParameter.Value + offset * i,
oParameter.Units)
oParameter =
oPartDoc.ComponentDefinition.
Parameters.ModelParameters.Item(2)
.Item(iInitRow + i, 4) =
oUM.GetStringFromValue(
oParameter.Value + offset * i,
oParameter.Units)
oParameter =
oPartDoc.ComponentDefinition.Parameters.
ModelParameters.Item(3)
.Item(iInitRow + i, 5) =
oUM.GetStringFromValue(
oParameter.Value + offset * i,
oParameter.Units)
.Item(iInitRow + i, 6) =
oPartDoc.ComponentDefinition.Parameters.
ModelParameters.Item(4).Expression
EndWith
Next
oUM =Nothing
Dim oWBAs WorkBook
oWB = oWorkSheet.Parent
oWB.Save()
oWB.Close()
Catch exAsException
EndTry
EndSub
以上代码的结果如下: