挑战自我 发表于 2012-5-19 20:24:18

SolidWorks二次开发装配

请问各位大侠,装配时,怎样用代码选择要配合的面,若面的名字不确定,能给它重命名吗?谢谢!

huweinew 发表于 2012-5-21 16:00:58

姣儿宝贝87 发表于 2012-6-3 14:53:43

huweinew 发表于 2012-5-21 16:00 static/image/common/back.gif
我刚才在另一贴中已经说过,现重新贴。

其实采用API来实现零件之间的配合是十分复杂,下说说编制配合的 ...

我目前也需要学习SolidWorks二次开发,自动装配方面的知识,想问一下,有没有什么资料讲解的比较详细。只要有书名就可以了,感觉这方面资料很少,不知道从哪开始入手学习,望指教。多谢了。

huweinew 发表于 2012-6-3 19:54:21

姣儿宝贝87 发表于 2012-6-4 09:19:12

huweinew 发表于 2012-6-3 19:54 static/image/common/back.gif
我上贴已经说明白了编制过程与方式,其它只能去参考SW-API中的实例,
学习资料基本找不到。如果你需要学习 ...

嗯,好的。谢谢了。

gronhi 发表于 2012-6-26 18:52:04

自动装配这个说法本身就有些不对,因为我们手动装配的话也需要选择相互配合面然后再选择配合关系,对于软件也是同样,没有了配合面、方向、距离、配合关系...它也不知道该干什么.
官方帮助也只是给了个销钉自动插入许多孔的例子,没什么实际意义的。
API中有个更改选择面的颜色的命令SelectedFaceProperties,可以更改或添加当前选择面的名字。不过实际操作起来不太舒服。
其实SolidWorks推荐的是将准备参与配合的零件所有面都遍历一遍,根据具体特征匹配的方法。

huweinew 发表于 2012-6-26 19:44:00

gronhi 发表于 2012-6-26 19:55:37

这些我还真用过,不过不是用来自动装配的。拷贝我程序中的一段:
Private Sub CommandButton2_Click()    '用户按下了复制按键以后

    Set swApp = Application.SldWorks
   
    Set swModel = swApp.ActiveDoc
   
    Set swAssy = swModel
   
    If qingxuanze = True Then             '没有在LISTBOX1中选择配合

      MsgBox ("没有选择配合类型!")

      Exit Sub

    End If

    qubujian = False

    Set swSelMgr = swModel.SelectionManager

    If (swSelMgr.GetSelectedObjectCount = 0) Then

      MsgBox ("没有选择配合面")

      Exit Sub
   
    End If
   
      Set swFace = swSelMgr.GetSelectedObject5(1) '''开始取得用户选择面

    Set swSelComp = swSelMgr.GetSelectedObjectsComponent2(1)

    Set swEnt = swFace

                pth = swselcompn'得到文件的FULLPATH全名

      openpart (pth) '在添加零部件前,先打开它

      Set swComp = swModel.AddComponent4(pth, swselcompnc, 0, 0, 0)

         'Get the name of the component for the mate

      party = swComp.Name2()
   
   Set swFeat = swModel.FirstFeature '''开始遍历模型树

    Do While Not swFeat Is Nothing   '''查找配合组
   
      If "MateGroup" = swFeat.GetTypeName Then
      
            Set swMateFeat = swFeat
            
            Exit Do
            
      End If
      
      Set swFeat = swFeat.GetNextFeature
      
    Loop
   
    Set swSubFeat = swMateFeat.GetFirstSubFeature

    Do While Not swSubFeat Is Nothing    '''在配合组中查找复制源部件

       Set swmate = swSubFeat.GetSpecificFeature2

      If Not swmate Is Nothing Then
         
            nNumMateEnt = swmate.GetMateEntityCount

            For i = 0 To nNumMateEnt - 1
               
                Set swMateEnt(i) = swmate.MateEntity(i)
               
                Set swComp = swMateEnt(i).ReferenceComponent
               
               If swComp.Name2 = TextBox1.Text And swSubFeat.Name = ListBox1.Text Then '''判断这个配合关系是否为复制移动的配合
               
                  Set swDispDim = swmate.DisplayDimension2(0)

                  Select Case swmate.Type

                      Case swMateANGLE

                        sVarType = " deg"

                        nVarFactor = 57.3

                      Case swMateDISTANCE

                        sVarType = " mm"

                        nVarFactor = 1000#

                      Case swMateGEAR

                        sVarType = " ratio"

                        nVarFactor = 1#

                  End Select

                  If swMateANGLE = swmate.Type Or swMateDISTANCE = swmate.Type Then

                  End If

                  If Not swDispDim Is Nothing Then

                      Set swDim = swDispDim.GetDimension

                      vDimValueArr = swDim.GetSystemValue3(swThisConfiguration, Empty)
                     
                      nMateDist = vDimValueArr(0)
                     
                  End If

                  For j = 0 To nNumMateEnt - 1

                      Set swMateEnt(j) = swmate.MateEntity(j)

                      Set swComp = swMateEnt(j).ReferenceComponent
      
                      vMateEntPar = swMateEnt(j).EntityParams

                  Next j
            
                  Select Case swmate.Type

                      Case swMateGEAR

                        Exit Sub

                  End Select
   
                   If swMateAlignALIGNED = swmate.Alignment Then
            
                        nNewMateAlign = swMateAlignALIGNED

                        Else

                        nNewMateAlign = swMateAlignANTI_ALIGNED
            
                   End If

                   cRet = SelectComponentFaceByName(party, partfx)'''选择新部件配合面
                  
                  Set swSelData = swSelMgr.CreateSelectData
                  
                  swSelData.Mark = 1
                  
                  bRet = swEnt.Select4(True, swSelData): Debug.Assert bRet

   
Set matefeature = swAssy.AddMate3(swmate.Type, nNewMateAlign, True, nMateDist, swmate.MaximumVariation, swmate.MinimumVariation, 0#, 0#, nMateDist, swmate.MaximumVariation, swmate.MinimumVariation, False, nRetVal)

                End If
            
            Next i
            
      End If
      
      Set swSubFeat = swSubFeat.GetNextSubFeature
      
    Loop
   
'========================第一次,寻找复制变化配合

Set swFeat = swModel.FirstFeature '''开始遍历模型树

    Do While Not swFeat Is Nothing   '''查找配合组
   
      If "MateGroup" = swFeat.GetTypeName Then
      
            Set swMateFeat = swFeat
            
            Exit Do
            
      End If
      
      Set swFeat = swFeat.GetNextFeature
    Loop
   
    Set swSubFeat = swMateFeat.GetFirstSubFeature

    Do While Not swSubFeat Is Nothing    '''在配合组中查找复制源部件

       Set swmate = swSubFeat.GetSpecificFeature2

      If Not swmate Is Nothing Then
         
            nNumMateEnt = swmate.GetMateEntityCount

            For i = 0 To nNumMateEnt - 1
               
                Set swMateEnt(i) = swmate.MateEntity(i)
               
                Set swComp = swMateEnt(i).ReferenceComponent
               
                If swComp.Name2 = TextBox1.Text And swSubFeat.Name <> ListBox1.Text Then '''此配合为源部件复制时不改变的配合关系
               
                  Set swDispDim = swmate.DisplayDimension2(0)

                  Select Case swmate.Type

                      Case swMateANGLE

                        sVarType = " deg"

                        nVarFactor = 57.3

                      Case swMateDISTANCE

                        sVarType = " mm"

                        nVarFactor = 1000#

                      Case swMateGEAR

                        sVarType = " ratio"

                        nVarFactor = 1#

                  End Select

                  If swMateANGLE = swmate.Type Or swMateDISTANCE = swmate.Type Then

                  End If

                  If Not swDispDim Is Nothing Then

                      Set swDim = swDispDim.GetDimension

                      vDimValueArr = swDim.GetSystemValue3(swThisConfiguration, Empty)
                      'Debug.Print "    Dim Value      = " & vDimValueArr(0) * nVarFactor & sVarType
                      nMateDist = vDimValueArr(0)

                  End If

                  For j = 0 To nNumMateEnt - 1

                      Set swMateEnt(j) = swmate.MateEntity(j)

                      Set swComp = swMateEnt(j).ReferenceComponent
                     
                      If swComp.Name2 <> TextBox1.Text Then
                     
                      Set swEnt = swMateEnt(j).Reference: Debug.Assert Not swEnt Is Nothing
                     
                      End If
      
                      vMateEntPar = swMateEnt(j).EntityParams

                  Next j
            
                  Select Case swmate.Type

                      Case swMateGEAR

                        Exit Sub

                  End Select
   
                   If swMateAlignALIGNED = swmate.Alignment Then
            
                        nNewMateAlign = swMateAlignALIGNED

                        Else

                        nNewMateAlign = swMateAlignANTI_ALIGNED
            
                   End If

                   cRet = SelectComponentFaceByName(party, partff)'''选择新部件配合面
                  

                  bRet = swEnt.Select4(True, swSelData): Debug.Assert bRet
   
Set matefeature = swAssy.AddMate3(swmate.Type, nNewMateAlign, True, nMateDist, swmate.MaximumVariation, swmate.MinimumVariation, 0#, 0#, nMateDist, swmate.MaximumVariation, swmate.MinimumVariation, False, nRetVal)


                End If
               
            Next i

            
      End If
      
      Set swSubFeat = swSubFeat.GetNextSubFeature
      
    Loop

'========================第二次找复制不变化配合


    bRet = swModel.EditRebuild3: 'Debug.Assert bRet

End Sub

huweinew 发表于 2012-6-26 20:02:03

huweinew 发表于 2012-6-26 20:07:40

页: [1] 2
查看完整版本: SolidWorks二次开发装配