SolidWorks机械工程师网——最大的SolidWorks学习平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

好品数字
好品数字
查看: 1277|回复: 12
打印 上一主题 下一主题

用API操作装配体的配合(Mate)示例

[复制链接]

12

主题

211

帖子

29

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
261
QQ
跳转到指定楼层
楼主
发表于 2012-1-22 13:03:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
  

图示箭头,选择配合
采用Debug.Print 输出结果
距离1
2 5
File = d:My Documents11.SLDASM
距离1
Type = 5
Alignment = 0
CanBeFlipped = True
MaxVar = 0 mm
MinVar = 0 mm
Dim Value = 100 mm
RefType(0) = 3
Component = a-1 (默认) --> d:My Documentsa.SldPrt
Point = (0, -1750, 2158.19209299164) mm
Vector = (0, 0, 1)
Radius 1 = 0 mm
Radius 2 = 0 mm
RefType(1) = 3
Component = a1-2 (默认) --> d:My Documentsa1.SLDPRT
Point = (0, 0, 2258.19209299164) mm
Vector = (0, 0, 1)
Radius 1 = 0 mm
Radius 2 = 0 mm
程序如下:
    'Edit Mate Example (VB)
    'This example shows how to edit an assembly mate.
    '------------------------------------------------
    '
    ' Preconditions: Assembly is open and an assembly mate is selected.
    '
    ' Postconditions: Selected assembly mate is edited.
    '
    '-----------------------------------------------
    Option Explicit
    Public Enum swMateType_e
    swMateCOINCIDENT = 0
    swMateCONCENTRIC = 1
    swMatePERPENDICULAR = 2
    swMatePARALLEL = 3
    swMateTANGENT = 4
    swMateDISTANCE = 5
    swMateANGLE = 6
    swMateUNKNOWN = 7
    swMateSYMMETRIC = 8
    swMateCAMFOLLOWER = 9
    swMateGEAR = 10
    End Enum
    Public Enum swMateAlign_e
    swMateAlignALIGNED = 0
    swMateAlignANTI_ALIGNED = 1
    swMateAlignCLOSEST = 2
    End Enum
    Public Enum swMateEntity2ReferenceType_e
    swMateEntity2ReferenceType_Point = 0
    swMateEntity2ReferenceType_Line = 1
    swMateEntity2ReferenceType_Circle = 2
    swMateEntity2ReferenceType_Plane = 3
    swMateEntity2ReferenceType_Cylinder = 4
    swMateEntity2ReferenceType_Sphere = 5
    swMateEntity2ReferenceType_Set = 6
    swMateEntity2ReferenceType_Cone = 7
    swMateEntity2ReferenceType_SweptSurface = 8
    swMateEntity2ReferenceType_MultipleSurface = 9
    swMateEntity2ReferenceType_GenSurface = 10
    swMateEntity2ReferenceType_Ellipse = 11
    swMateEntity2ReferenceType_GeneralCurve = 12
    swMateEntity2ReferenceType_UNKNOWN = 13
    End Enum
    Public Enum swAddMateError_e
    swAddMateError_ErrorUknown = 0
    swAddMateError_NoError = 1
    swAddMateError_IncorrectMateType = 2
    swAddMateError_IncorrectAlignment = 3
    swAddMateError_IncorrectSelections = 4
    swAddMateError_OverDefinedAssembly = 5
    End Enum
    Function SelectMateEntity _
    ( _
    swApp As SldWorks.SldWorks, _
    swModel As SldWorks.ModelDoc2, _
    swMateEnt As SldWorks.MateEntity2, _
    nMark As Long _
    ) As Boolean
    Dim swEnt As SldWorks.Entity
    Dim swSelMgr As SldWorks.SelectionMgr
    Dim swSelData As SldWorks.SelectData
    Dim bRet As Boolean
    Select Case swMateEnt.ReferenceType
    Case swMateEntity2ReferenceType_Point, _
    swMateEntity2ReferenceType_Line, _
    swMateEntity2ReferenceType_Circle, _
    swMateEntity2ReferenceType_Plane, _
    swMateEntity2ReferenceType_Cylinder, _
    swMateEntity2ReferenceType_Sphere, _
    swMateEntity2ReferenceType_Cone, _
    swMateEntity2ReferenceType_SweptSurface
    Set swSelMgr = swModel.SelectionManager
    Set swSelData = swSelMgr.CreateSelectData
    Set swEnt = swMateEnt.Reference: Debug.Assert Not swEnt Is Nothing
    swSelData.Mark = nMark
    bRet = swEnt.Select4(True, swSelData): Debug.Assert bRet
    SelectMateEntity = bRet
    Exit Function
    Case swMateEntity2ReferenceType_Set, _
    swMateEntity2ReferenceType_MultipleSurface, _
    swMateEntity2ReferenceType_GenSurface, _
    swMateEntity2ReferenceType_Ellipse, _
    swMateEntity2ReferenceType_GeneralCurve, _
    swMateEntity2ReferenceType_UNKNOWN
    Debug.Assert False
    Case Else
    Debug.Assert False
    End Select
    SelectMateEntity = False
    End Function
    Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swAssy As SldWorks.AssemblyDoc
    Dim swSelMgr As SldWorks.SelectionMgr
    Dim swFeat As SldWorks.Feature
    Dim swMate As SldWorks.Mate2
    Dim swDispDim As SldWorks.DisplayDimension
    Dim swDim As SldWorks.Dimension
    Dim sVarType As String
    Dim nVarFactor As Double
    Dim nMateDist As Double
    Dim nNumMateEnt As Long
    Dim swMateEnt() As SldWorks.MateEntity2
    Dim vMateEntPar As Variant
    Dim swComp As SldWorks.Component2
    Dim nNewMateAlign As Long
    Dim nRetVal As Long
    Dim i As Long
    Dim bRet As Boolean
    Dim vDimValueArr As Variant
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swAssy = swModel
    Set swSelMgr = swModel.SelectionManager
    Set swFeat = swSelMgr.GetSelectedObject5(1)
    Set swMate = swFeat.GetSpecificFeature2
    Set swDispDim = swMate.DisplayDimension2(0)
    Debug.Print "File = " & swModel.GetPathName
    Debug.Print " " & swFeat.Name
    Debug.Print " Type = " & swMate.Type
    Debug.Print " Alignment = " & swMate.Alignment
    Debug.Print " CanBeFlipped = " & swMate.CanBeFlipped
    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
    Debug.Print " MaxVar = " & swMate.MaximumVariation * nVarFactor & sVarType
    Debug.Print " MinVar = " & swMate.MinimumVariation * nVarFactor & sVarType
    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
    End If
    nNumMateEnt = swMate.GetMateEntityCount
    ReDim swMateEnt(nNumMateEnt)
    For i = 0 To nNumMateEnt - 1
    Set swMateEnt(i) = swMate.MateEntity(i)
    Set swComp = swMateEnt(i).ReferenceComponent
    vMateEntPar = swMateEnt(i).EntityParams
    Debug.Print " RefType(" & i & ") = " & swMateEnt(i).ReferenceType
    Debug.Print " Component = " & swComp.Name2 & " (" & swComp.ReferencedConfiguration & ") --> " & swComp.GetPathName
    Debug.Print " Point = (" & vMateEntPar(0) * 1000# & ", " & vMateEntPar(1) * 1000# & ", " & vMateEntPar(2) * 1000# & ") mm"
    Debug.Print " Vector = (" & vMateEntPar(3) & ", " & vMateEntPar(4) & ", " & vMateEntPar(5) & ")"
    Debug.Print " Radius 1 = " & vMateEntPar(6) * 1000# & " mm"
    Debug.Print " Radius 2 = " & vMateEntPar(7) * 1000# & " mm"
    Next i
    Select Case swMate.Type
    ' Cannot change alignment on these mate types
    Case swMateGEAR
    Exit Sub
    End Select
    If swMateAlignALIGNED = swMate.Alignment Then
    nNewMateAlign = swMateAlignANTI_ALIGNED
    Else
    If swMateAlignANTI_ALIGNED = swMate.Alignment Then
    nNewMateAlign = swMateAlignALIGNED
    Else
    ' Closest alignment, so changing alignment does not make sense
    Debug.Assert swMateAlignCLOSEST = swMate.Alignment
    Exit Sub
    End If
    End If
    swModel.ClearSelection2 True
    For i = 0 To nNumMateEnt - 1
    ' AssemblyDoc::EditMate2 requires mate entities
    ' to be selected with mark of 1 except for:
    ' swMateCAMFOLLOWER
    ' cam face --> 1
    ' cam follower face --> 8
    ' swMateSYMMETRIC
    ' symmetry faces --> 1
    ' symmetry plane --> 4
    bRet = SelectMateEntity(swApp, swModel, swMateEnt(i), 1): Debug.Assert bRet
    Next i
    ' AssemblyDoc::EditMate2 requires mate feature to be last selected object
    ' mark is ignored
    bRet = swFeat.Select2(True, 0): Debug.Assert bRet
    swAssy.EditMate2 _
    swMate.Type, _
    nNewMateAlign, _
    True, _
    nMateDist, _
    swMate.MaximumVariation, _
    swMate.MinimumVariation, _
    0#, _
    0#, _
    nMateDist, _
    swMate.MaximumVariation, _
    swMate.MinimumVariation, nRetVal
    ' Do not assert because may overdefine assembly or other error
    'Debug.Assert swAddMateError_NoError = nRetVal
    ' Do not assert because assemlby may have rebuild errors
    ' due to changing mate alignment
    bRet = swModel.EditRebuild3: 'Debug.Assert bRet
    End Sub
    '------------------------------------------------

复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享教程|习题|模型|技巧 点赞点赞16303 拍砖拍砖4809
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复

使用道具 举报

79

主题

297

帖子

165

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
483
QQ
沙发
发表于 2012-1-22 13:04:56 | 只看该作者
不懂
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复 支持 反对

使用道具 举报

9

主题

213

帖子

20

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
256
QQ
板凳
发表于 2012-1-22 13:06:03 | 只看该作者
我继续顶你!太好的帖子了 支持
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

12

主题

206

帖子

24

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
251
QQ
地板
发表于 2012-1-22 13:06:23 | 只看该作者
顶一下,谢谢分享
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

7

主题

231

帖子

15

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
270
QQ
5#
发表于 2012-1-22 13:07:50 | 只看该作者

   经典案例图书
厉害!强~~~~没的说了!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

6

主题

216

帖子

16

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
247
QQ
6#
发表于 2012-1-22 13:08:39 | 只看该作者
Haogfffddd
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

8

主题

226

帖子

17

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
257
QQ
7#
发表于 2012-1-22 13:12:07 | 只看该作者

   经典案例图书
如果了解SW API的,当两个配合零件已经载入装配环境中,那么配合程序只有三句。同你的操作过程一样。
1.SelectByID2
2.SelectByID2
3.AddMate3

但要理解这三句话中的每一参数,需要一定的功力。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

14

主题

213

帖子

133

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
363
8#
发表于 2012-1-22 13:14:59 | 只看该作者
其实采用API来实现零件之间的配合是十分复杂,下说说编制配合的过程设计。

1.需要在装配环境中,将该名读出
2.转入零件环境中,打开需要装配的零件
3.转入读名装配环境,将零件载入装配环境中
4.改变你的观察视角,找出你所需要的配合关系如平面
5.再次重复2至4过程,找出另一配合面
6.关闭两个零件
7.使用配合语句
8.改变装配视角

如果需要API来实现的话,你对这些过程中的每一过程实现语句均需要十分清楚,才能自动装配配合。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

8

主题

217

帖子

23

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
241
9#
发表于 2012-1-22 13:15:12 | 只看该作者
    Dim longstatus As Long, longwarnings As Long
    Sub ll()
      Dim SwPart As SldWorks.ModelDoc2
      Dim SwApp As SldWorks.SldWorks
      Set SwApp = Application.SldWorks
      Set SwPart = SwApp.ActiveDoc
      ss = SwPart.GetPathName
      
      Dim Arr
      Arr = Array(&quotl.SldDrw", &quotl.SldAsm", &quotl.SldPrt", "接管.SldPrt", "接管展开.SldPrt", "筒体.SldPrt", "筒体展开.SldPrt")
      Dim oPath, oPath1, FileName
      nn = InStrRev(ss, "")
      oPath = Mid(ss, 1, nn)
      oPath = "E:MyWorkSummaryBE(J)SHG20592-2012HG20592ObliqueCutting"
      nn = InStrRev(Left(oPath, Len(oPath) - 1), "")
      oPath1 = Mid(oPath, 1, nn)
      'Debug.Print oPath1
      Dim Part1 As SldWorks.ModelDoc2
      Dim SaveFile
      For ii = 0 To UBound(Arr)
        FileName = oPath & Arr(ii)
        'Debug.Print FileName
        If InStr(Arr(ii), "Drw") > 0 Then
          qq = 3
        ElseIf InStr(Arr(ii), &quotrt") > 0 Then
          qq = 1
        ElseIf InStr(Arr(ii), "Asm") > 0 Then
          qq = 2
        End If
        Set Part1 = SwApp.OpenDoc6(FileName, qq, 0, "", longstatus, longwarnings)
       
        'Debug.Print Part1.GetPathName
        SaveFile = oPath1 & "aax" & Arr(ii)
        'Debug.Print SaveFile
        Part1.SaveAs2 SaveFile, 0, False, False
        SwApp.CloseDoc "x" & Arr(ii)
        Set Part1 = Nothing
      Next ii
      Debug.Print
      
    End Sub

复制代码
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

9

主题

243

帖子

31

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
292
QQ
10#
发表于 2012-1-22 13:25:00 | 只看该作者
装配确实是比较难啊
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

10

主题

241

帖子

26

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
276
QQ
11#
发表于 2012-1-22 13:29:16 | 只看该作者

先在已经实现了装配,但是有时候 swMateAlignANTI_ALIGNED    swMateAlignALIGNED两个参数需要转换,如果用该第一个错了,那么就换第二个参数,这个要怎么使用editmate2啊
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

7

主题

213

帖子

17

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
243
QQ
12#
发表于 2012-1-22 13:30:21 | 只看该作者
  
如何得到每個零件原奌在組合件的座標下面的程式碼可以找到,但是要先畫一個點,有沒有不用畫點就可以找到件原奌在組合件的座標的方法(目前只想到:每查一次畫一個點,再把剛才畫的點刪了)'Transform Point from Component Space to Assembly Space Example (VBA)'This example shows how to transform a point from component space to assembly space.'----------------------------------------'' Preconditions:'       (1) Assembly document is open.'       (2) Component is selected.'' Postconditions: Component's origin is transformed to a point assembly space.''-----------------------------------------Option ExplicitSub main()    Dim swApp                   As SldWorks.SldWorks    Dim swMathUtil              As SldWorks.MathUtility    Dim swModel                 As SldWorks.ModelDoc2    Dim swSelMgr                As SldWorks.SelectionMgr    Dim swComp                  As SldWorks.Component2    Dim swXform                 As SldWorks.MathTransform    Dim nPt(2)                  As Double    Dim vPt                     As Variant    Dim swPt                    As SldWorks.MathPoint    Dim i                       As Long    Dim bRet                    As Boolean    Set swApp = Application.SldWorks    Set swMathUtil = swApp.GetMathUtility    Set swModel = swApp.ActiveDoc    Set swSelMgr = swModel.SelectionManager    Set swComp = swSelMgr.GetSelectedObjectsComponent(1)    Set swXform = swComp.Transform2    ' Point at component origin    nPt(0) = 0#    nPt(1) = 0#    nPt(2) = 0#    vPt = nPt    Set swPt = swMathUtil.CreatePoint(vPt)    Set swPt = swPt.MultiplyTransform(swXform)    Debug.Print "File = " & swModel.GetPathName    Debug.Print "  Comp = " & swComp.Name2 & " [" & swComp.GetPathName & "]"    Debug.Print "    Pt in comp = (" & nPt(0) * 1000# & ", " & nPt(1) * 1000# & ", " & nPt(2) * 1000# & ") mm"    Debug.Print "    Pt in assy = (" & swPt.ArrayData(0) * 1000# & ", " & swPt.ArrayData(1) * 1000# & ", " & swPt.ArrayData(2) * 1000# & ") mm"End Sub
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

18

主题

234

帖子

43

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
303
QQ
13#
发表于 2012-1-22 13:31:46 | 只看该作者

最好帖个图,看了一这段程序代码。
生成一个点,再对这个点进行矩阵转换。
Set swPt = swMathUtil.CreatePoint(vPt)
Set swPt = swPt.MultiplyTransform(swXform)
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭 卷起
关闭 卷起

SOLIDWORKS 2023 机械设计从入门到精通

手机版|小黑屋| GMT+8, 2024-5-28 10:18 , Processed in 0.222839 second(s), 40 queries .

SolidWorks机械工程师网 ( 鲁ICP备14025122号-2 ) 鲁公网安备 37028502190335号

声明:本网言论纯属发表者个人意见,与本网立场无关。
如涉版权,可发邮件: admin@swbbsc.com

快速回复 返回顶部 返回列表