操作iPart表的行和列 -1

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


以上代码的结果如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值