SolidWorks二次开发之修改阵列里面的驱动特征
备注:关于所有的SolidWorks二次开发的问题可以加QQ群(952427329)进行交流。
今天之所以写这个程序,主要是在实际中遇到这样的问题,问题就是
在装配体的环境中,当替换零部件的时候可能导致原来的找不到阵列的特征了,就容易报错。
下面的代码是是实现的就是将上右图中的画横线的部分草图阵列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