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

标题: 尺寸驱动模型,写个通用的VBA代码,哪位大神能指导下? [打印本页]

作者: ss404770848    时间: 2016-4-8 14:05
标题: 尺寸驱动模型,写个通用的VBA代码,哪位大神能指导下?
做个通用的VBA代码,要实现以下功能:打开已有的一个部件或零件,通过VBA提取部件或零件中所有的特征与草图所包含的尺寸名称与尺寸数值大小,导入到excel,再在excel中修改相应的尺寸数值,来驱动模型使之更新。
自己查的资料附上,只能读出零件的尺寸名称及数值,并写入excel。
Function SetSwPart()
  Dim SwApp As Object
  Dim SelMgr As Object, boolStatus As Boolean
  Dim longstatus As Long, longwarnings As Long
  
  Set SwApp = GetObject(, "sldworks.application")
  
  Set SetSwPart = SwApp.ActiveDoc
  
End Function
''****************************
Private Sub ReadSwDimensionInSldPrt()
  ''读SW的变量数据
  Dim oDic
  Set oDic = CreateObject("Scripting.Dictionary")
   
  
  nn = Range("A65536").End(3).Row
  Set Rng = Range("A1:Z" & nn)
  
    Dim swFeat As Object, swSubFeat As Object
    Dim swDispDim As Object, SwDim As Object
    Dim swAnn As Object
    Dim bRet As Boolean
    Dim Str
   
    Set SwApp = CreateObject("SldWorks.Application")
    Set SwPart = SetSwPart
    Set swFeat = SwPart.FirstFeature
   
   
    kk = 1
    Do While Not swFeat Is Nothing
        Debug.Print "  " + swFeat.Name
        Set swSubFeat = swFeat.GetFirstSubFeature
        Do While Not swSubFeat Is Nothing
            Debug.Print "      " + swSubFeat.Name
            
            Set swDispDim = swSubFeat.GetFirstDisplayDimension
            Do While Not swDispDim Is Nothing
                Set swAnn = swDispDim.GetAnnotation
                Set SwDim = swDispDim.GetDimension
                Debug.Print "          [" & SwDim.FullName & "] = " & SwDim.GetSystemValue2("")
                'Debug.Print swDim.FullName, swDim.GetSystemValue2("")
                Set swDispDim = swSubFeat.GetNextDisplayDimension(swDispDim)
            Loop
            Set swSubFeat = swSubFeat.GetNextSubFeature
        Loop
        
        Set swDispDim = swFeat.GetFirstDisplayDimension
        Do While Not swDispDim Is Nothing
            Set swAnn = swDispDim.GetAnnotation
            Set SwDim = swDispDim.GetDimension
            
            Debug.Print "    [" & SwDim.FullName & "] = " & SwDim.GetSystemValue2("")
            Debug.Print SwDim.FullName, SwDim.GetSystemValue2("")
            Str = SwDim.FullName
            oArr = Split(Str, "@")
            Str = oArr(0) & "@" & oArr(1)
            '
            Cells(kk, 5) = SwDim.GetSystemValue2("")
            Cells(kk, 4) = oArr(1)
            Debug.Print SwDim.GetSystemValue2("")
            oDic(Str) = SwDim.GetSystemValue2("")
            
            Set swDispDim = swFeat.GetNextDisplayDimension(swDispDim)
            kk = kk + 1
        Loop
        Set swFeat = swFeat.GetNextFeature
    Loop
    Dim oArr1, oArr2, cc
    cc = 6
    oArr1 = oDic.keys: oArr2 = oDic.items
    For kk = 1 To UBound(oArr1) + 1
        Cells(kk, 1 + cc) = kk - 1
        Cells(kk, 2 + cc) = "=" & """Arr(""" & " & " & Cells(kk, 1 + cc).Address(0, 0) & " & " & """)="""
        Cells(kk, 3 + cc) = "'" & Chr(34) & oArr1(kk - 1) & Chr(34)
        Cells(kk, 4 + cc) = Split(oArr1(kk - 1), "@")(1)
        Cells(kk, 5 + cc) = oArr2(kk - 1)
   
    Next kk
End Sub


作者: ss404770848    时间: 2016-4-12 09:36
零件级的已解决,只差部件级的。
作者: ss404770848    时间: 2016-4-15 16:06
高手来指导下吧
作者: lcj2018    时间: 2018-6-12 19:59
支持一下,我也想学习学习!
作者: 冻结best    时间: 2019-5-16 15:20
求分享解决方案及代码

作者: zjx839392    时间: 2019-5-16 21:41
谢谢分享
作者: 冻结best    时间: 2019-5-17 17:27
读取、写入SW变量数据部分代码可否分享一下
作者: fuchong2009    时间: 2019-6-25 09:57
EXCEL数据赋值给SolidWorks特征尺寸变量参数:

  'Values for calcualtions are in meters

    Part.Parameter("球罐内直径@草图1").SystemValue = Range("B2").Value / 1000

    Part.Parameter("球壳壁厚@草图1").SystemValue = Range("B3").Value / 1000

Part.Parameter("支柱外径@草图3").SystemValue = Range("B4").Value / 1000

Part.Parameter("托板厚度@拉伸-薄壁5").SystemValue = Range("B7").Value / 1000

Part.Parameter("透气孔@草图12").SystemValue = Range("B9").Value / 1000

Part.Parameter("透气孔孔距@草图12").SystemValue = Range("B10").Value / 1000
Part.EditRebuild
Part.ViewZoomtofit2
MsgBox "三维造型结束", vbOKOnly, "提示"
End Sub

作者: 332508689    时间: 2019-6-29 12:43
楼主,求指导,可否发送一份。
作者: 332508689    时间: 2019-6-29 12:54
楼主,这个怎么用?
作者: ryouss    时间: 2019-7-1 17:51
參考

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">'讀取SW零件的全部尺寸,寫到Excel。</font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">'在Excel變動尺寸後,修改SW的零件尺寸。</font></font>

  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">函數SetSwPart()</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  Dim SwApp作為對象</font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  Dim SelMgr作為對象,boolStatus As Boolean </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  Dim longstatus As Long,longwarnings As Long </font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  Set SwApp = GetObject(,“sldworks.application”)</font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  Set SetSwPart = SwApp.ActiveDoc </font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">End Function </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">'' **** ************************ </font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Private Sub ReadSwDimensionInSldPrt()</font></font>
  12. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  '讀取SW的全部尺寸</font></font>
  13. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  Dim oDic </font></font>
  14. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  Set oDic = CreateObject(“Scripting.Dictionary”)</font></font>
  15. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">' ***獲取Excel中的活動工作表</font></font>
  16. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  設置xl = GetObject(,“Excel.Application”)</font></font>
  17. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  設置xls = xl.ActiveSheet </font></font>
  18. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">使用</font></font>
  19. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">xls'nn = .range(“A65536”)。End(3).Row'End(3) ==></font></font>
  20. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  '設置Rng = .range(“A1:Z”&nn)</font></font>
  21.   
  22. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    Dim swFeat As Object,swSubFeat As Object </font></font>
  23. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    Dim swDispDim As Object,SwDim As Object </font></font>
  24. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    Dim swAnn As Object </font></font>
  25. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    Dim bRet As Boolean </font></font>
  26. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    Dim Str </font></font>
  27. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    Set SwApp = CreateObject(“SldWorks.Application” “)</font></font>
  28. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    設置SwPart = SetSwPart </font></font>
  29. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    設置swFeat = SwPart.FirstFeature </font></font>
  30. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    kk = 1 </font></font>
  31. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    做什麼不是swFeat什麼都不</font></font>
  32. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        Debug.Print”“+ swFeat.Name </font></font>
  33. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        設置swSubFeat = swFeat.GetFirstSubFeature </font></font>
  34. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        做什麼不swSubFeat什麼都不</font></font>
  35. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            Debug.Print”“+ swSubFeat。名稱</font></font>
  36. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            設置swDispDim = swSubFeat。GetFirstDisplayDimension </font></font>
  37. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            執行時不是swDispDim什麼都不是</font></font>
  38. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                設置swAnn = swDispDim.GetAnnotation </font></font>
  39. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                設置SwDim = swDispDim.GetDimension </font></font>
  40. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                Debug.Print“[”&SwDim.FullName&“] =”&SwDim.GetSystemValue2(“”)</font></font>
  41. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                'Debug.Print swDim.FullName,swDim.GetSystemValue2(“”)</font></font>
  42. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                設置swDispDim = swSubFeat.GetNextDisplayDimension(swDispDim)</font></font>
  43. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            循環</font></font>
  44. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            集swSubFeat = swSubFeat.GetNextSubFeature </font></font>
  45. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        循環</font></font>
  46. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        集swDispDim = swFeat.GetFirstDisplayDimension </font></font>
  47. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        執行時沒有swDispDim沒有</font></font>
  48. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            設置swAnn = swDispDim.GetAnnotation </font></font>
  49. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            設置SwDim = swDispDim.GetDimension</font></font>
  50. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            Debug.Print“[”&SwDim.FullName&“] =”&SwDim.GetSystemValue2(“”)</font></font>
  51. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            Debug.Print SwDim.FullName,SwDim.GetSystemValue2(“”)</font></font>
  52. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            Str = SwDim.FullName </font></font>
  53. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            oArr = Split(Str,“@ “)</font></font>
  54. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            Str = oArr(0)&”@“&oArr(1)</font></font>
  55. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            .cells(kk,5)= SwDim.GetSystemValue2(”“)。</font></font>
  56. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            cells(kk,4)= oArr(1)</font></font>
  57. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            Debug.Print SwDim.GetSystemValue2 (“”)</font></font>
  58. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            oDic(Str)= SwDim.GetSystemValue2(“”)</font></font>
  59. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            設置swDispDim = swFeat.GetNextDisplayDimension(swDispDim)</font></font>
  60. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            kk = kk + 1 </font></font>
  61. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        循環</font></font>
  62. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        設置swFeat = swFeat。GetNextFeature </font></font>
  63. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    Loop </font></font>
  64. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    Dim oArr1,oArr2,cc </font></font>
  65. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    cc = 6</font></font>
  66. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    oArr1 = oDic.keys:oArr2 = oDic.Items </font></font>
  67. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    for kk = 1 To UBound(oArr1)+ 1 </font></font>
  68. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        .cells(kk,1 + cc)= kk  -  1 </font></font>
  69. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        .cells(kk,2 + cc)=“=”&“ “”Arr(“”“&”&“&.cells(kk,1 + cc)。Address(0,0)&”&“&”“”)=“”“. </font></font>
  70. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        cells(kk,3 + cc) =“'”&Chr(34)&oArr1(kk  -  1)&Chr(34)</font></font>
  71. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        .cells(kk,4 + cc)=分裂(oArr1(kk  -  1),“@”)(1)</font></font>
  72. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        .cells( kk,5 + cc)= oArr2(kk  -  1)</font></font>
  73. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    下一個kk </font></font>
  74. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">nn = .range(“I65536”)。End(3).Row'End(3)==> End(xlUp)Stop'Chen </font></font>
  75. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">停修改Excel之尺寸後,再按RUN執行鍵</font></font>
  76. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Set Part = SwApp.ActiveDoc </font></font>
  77. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">'依據Excel變動值修改到sw零件</font></font>
  78. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">對於mm = 1到nn </font></font>
  79. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    Size_name = Mid(.cells(mm,9),2,Len(.cells(mm,9)) -  2)</font></font>
  80. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    Part.Parameter(Size_name).SystemValue = .cells(mm,11)</font></font>
  81. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">下一個mm </font></font>
  82. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">結束用</font></font>
  83. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">boolStatus = Part.EditRebuild3()</font></font>
  84. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">MsgBox“零件尺寸修改結束” </font></font>
  85. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">End Sub</font></font>
复制代码




作者: ryouss    时间: 2019-7-2 10:46
附swp文件   Macro0701.rar (11.8 KB, 下载次数: 66)





作者: 332508689    时间: 2019-7-12 11:11
ryouss 发表于 2019-7-2 10:46
附swp文件  
  • 讀取SW零件的全部尺寸,寫到Excel。

  • 您好,宏文件用solidworks打不开,如果是装配体怎么弄呀,帮帮忙
    作者: 332508689    时间: 2019-7-12 11:16
    楼主,这个怎么用?
    作者: ryouss    时间: 2019-7-13 11:37
    332508689 发表于 2019-7-12 11:16
    楼主,这个怎么用?

    操作:
    1.開EXCEL文件。
    2.開SW零件。
    3.執行ReadSwDimensionInSldPrt()。
    4.在EXCEL修改尺寸。

    功能:
    1.讀取SW零件的全部尺寸,寫到Excel。
    2.在Excel變動尺寸後,修改SW的零件尺寸。








    欢迎光临 SolidWorks机械工程师网——最大的SolidWorks学习平台 (https://www.swbbsc.com/) Powered by Discuz! X3.2