SolidWorks二次开发之修改阵列里面的驱动特征

备注:关于所有的SolidWorks二次开发的问题可以加QQ群(952427329)进行交流。

今天之所以写这个程序,主要是在实际中遇到这样的问题,问题就是

在装配体的环境中,当替换零部件的时候可能导致原来的找不到阵列的特征了,就容易报错。

SolidWorks二次开发之修改阵列里面的驱动特征     SolidWorks二次开发之修改阵列里面的驱动特征

下面的代码是是实现的就是将上右图中的画横线的部分草图阵列1替换为草图阵列2。

    ''' <summary>
    ''' 替换驱动阵列里面的驱动特征
    ''' </summary>
    ''' <param name="swModel">Model2对象</param>
    ''' <param name="PatternFeatureName">阵列特征的名字</param>
    ''' <param name="DriveingFeatureName">驱动特征的名字</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Function ReplacePatternFeature(ByVal swModel As ModelDoc2, ByVal PatternFeatureName As String, ByVal DriveingFeatureName As String) As Boolean
        ' 定义函数返回值
        Dim blnstatue As Boolean = False

        ' 获取DriveingFeature
        Dim DriveingFeature As Feature
        DriveingFeature = GetFeature(swModel, DriveingFeatureName)

        ' 获取PatternFeature
        Dim PatternFeature As Feature
        PatternFeature = GetFeature(swModel, PatternFeatureName)

        ' 根据PatternFeature的特征类型进行不同的处理

        Select Case UCase(PatternFeature.GetTypeName2)
            ' 关于特征的类型怎么确定的方法,我们可以通过遍历,将自己需要的特诊的类型用debug打印处理,就可以知道特特征的什么
            Case "LOCALLPATTERN"
                ' ILocalLinearPatternFeatureData

            Case "LOCALCIRPATTERN"
                ' ILocalCircularPatternFeatureData

            Case "DERIVEDLPATTERN"
                ' IDerivedPatternFeatureData

            Case "DERIVEDCIRPATTERN"
                ' IDerivedPatternFeatureData

            Case "DERIVEDSKETCHPATTERN"
                ' 草图驱动阵列
                Dim dpDefinition As DerivedPatternFeatureData
                dpDefinition = PatternFeature.GetDefinition

                If dpDefinition.AccessSelections(swModel, Nothing) Then
                    ' 将原来的阵列特征换成DriveingFeature
                    dpDefinition.PatternFeature = DriveingFeature

                    ' 更新模型
                    blnstatue = PatternFeature.ModifyDefinition(dpDefinition, swModel, Nothing)
                End If

                ' 释放dpDefinition
                dpDefinition = Nothing
            Case Else
                MsgBox("还未覆盖,后期可以完善")
        End Select

        ' 返回函数值
        Return blnstatue
    End Function

    Function GetFeature(ByVal swModel As ModelDoc2, ByVal FeatureName As String) As Feature
        ' 定义函数返回值
        Dim RetFeature As Feature
        Dim swFeatMgr As FeatureManager
        swFeatMgr = swModel.FeatureManager

        Dim ArrFeature As Object
        ArrFeature = swFeatMgr.GetFeatures(True)

        ' 遍历第一层级的特征
        For iFeat = LBound(ArrFeature) To UBound(ArrFeature)
            Dim swFeature As Feature
            swFeature = ArrFeature(iFeat)

            ' 遍历特征
            RetFeature = iterateFeature(swFeature, FeatureName)

            '如果获得特征,则结束循环,返回特征,否则继续
            If RetFeature IsNot Nothing Then
                Return RetFeature
            Else
                Continue For
            End If
        Next

        ' 如果没有搜索到指定的特征,则返回Nothing
        Return Nothing
    End Function

    Function iterateFeature(ByVal swFeature As Feature, ByVal FeatureName As String) As Feature
        ' 判断特征是否零部件
        If swFeature.GetTypeName2 <> "Reference" Then
            ' 如果不是Component2

            If swFeature.Name = FeatureName Then
                ' 如果该特征的名字等于要搜索的特征的名字,则返回该特征
                Return swFeature
            End If
        Else
            ' 如果该特征是Component2

            Dim swComponent As Component2
            swComponent = swFeature.GetSpecificFeature2

            ' 遍历swComponent里面的特征
            Dim comFeature As Feature
            comFeature = swComponent.FirstFeature

            Do While Not comFeature Is Nothing
                ' 根据特征名字来判断该特征是否是要找的特征
                If comFeature.Name = FeatureName Then
                    '如果是要找的特征
                    Return comFeature
                Else
                    ' 找到了需要的特征
                    If IsNothing(iterateFeature(comFeature, FeatureName)) = False Then
                        Return iterateFeature(comFeature, FeatureName)
                    End If

                End If

                '获取下一个特征
                comFeature = comFeature.GetNextFeature
            Loop

           
        End If

        ' 如果没有搜索到指定的特征,则返回Nothing
        Return Nothing
    End Function