iCAx开思网

标题: 更改装配体特征树标准件图标——更新适用2014——2017 [打印本页]

作者: lkai    时间: 2017-7-5 23:40
标题: 更改装配体特征树标准件图标——更新适用2014——2017
本帖最后由 lkai 于 2017-7-18 22:07 编辑

更改装配体特征树标准件图标

功能:从装配体中选择一个或多个零件,将其图标更改成“标准件”图标,同样,也可以将图标还原。
操作间下图:
[attach]1250578[/attach][attach]1250579[/attach][attach]1250580[/attach]

适用sw2013及以下——宏文件下载地址:
[attach]1250581[/attach]源代码如下:
  1. ' ------------------------------------------------------------------------------
  2. ' ChangeToolboxPartProperty
  3. ' ChangeToolboxPartProperty.swp -  by Lunkay, Copyright 2017/7/4
  4. ' Contact:  313618812@qq.com (Lunkay)

  5. ' 功能:
  6. '       选中零件,更改标准件图标属性。
  7. '
  8. ' 使用方法:
  9. ' 无
  10. 'BGU: 有时kill文件报错,无权限
  11. ' -------------------------------------------------------------------------------

  12. #If VBA7 Then
  13.     Private Declare PtrSafe Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
  14. #Else
  15.     Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
  16. #End If


  17. Dim swDM As SwDMApplication
  18. Dim swDoc As SwDMDocument12
  19. Dim mOpenErrors As SwDmDocumentOpenError
  20. Dim swCfgMgr As SwDMConfigurationMgr
  21. Dim objClassfac As SwDMClassFactory
  22. Const SWDMLicenseKey = "LicenseKey"


  23. Dim swApp As SldWorks.SldWorks
  24. Dim swModel As SldWorks.ModelDoc2
  25. Dim swComp As SldWorks.Component2
  26. Dim swCompModel As SldWorks.ModelDoc2

  27. Dim ArrSelectedObjects() As Variant

  28. Dim sCompName As String

  29. Dim sMgr As SldWorks.SelectionMgr
  30. Dim sTyp As SwConst.swSelectType_e
  31. Dim iReply As String
  32. Dim swFrame As SldWorks.Frame    ' declare status bar object

  33. Dim nRetval As Long
  34. Dim bRet As Boolean
  35. Dim nErrors As Long
  36. Dim nWarnings As Long
  37. Dim mlngSWFileType As Long
  38. Dim ret As Integer

  39. Dim FilePath As String

  40. Dim ml As String

  41. Dim keys(0 To 255) As Byte

  42. Dim n As Long
  43. Dim CurSelCount As Long

  44. Dim swCompPartName As String
  45. Dim longstatus As Long, longwarnings As Long

  46. Public BZJ As Long


  47. Const MINSELECTIONS = 1

  48. Sub main()
  49.     FrmChangeToolboxPartProperty.Show
  50.     Set swApp = Application.SldWorks

  51.     Set swModel = swApp.ActiveDoc

  52.     If swModel Is Nothing Then
  53.         MsgBox "请先打开一个装配体文件!  ", vbCritical, "更改标准件标记 By Lunkay"
  54.         End

  55.     End If

  56.     If swModel.GetType = 2 Then    '如果模型是“装配体”

  57.         Set sMgr = swModel.SelectionManager
  58.         
  59.         If sMgr.GetSelectedObjectCount < MINSELECTIONS Then
  60.         
  61.             MsgBox "下面请在装配体中选择要改变标准件图标的零件!", vbCritical, "更改标准件标记 By Lunkay"
  62.             
  63.         Else
  64.         
  65.         End If
  66.         
  67.         While sMgr.GetSelectedObjectCount < MINSELECTIONS
  68.         
  69.             DoEvents
  70.             GetKeyboardState keys(0)

  71.             If keys(27) > 127 Then End

  72.         Wend
  73.       
  74.         CurSelCount = sMgr.GetSelectedObjectCount
  75.         
  76.         ReDim ArrSelectedObjects(1 To CurSelCount)
  77.         AtIndex = 1
  78.         
  79.         For n = 1 To CurSelCount

  80.                 Set ArrSelectedObjects(n) = sMgr.GetSelectedObjectsComponent2(n)
  81.         Next n

  82.         For n = 1 To CurSelCount
  83.                 sMgr.DeSelect AtIndex
  84.         Next n

  85.         For n = 1 To CurSelCount

  86.              Set swComp = ArrSelectedObjects(n)
  87.             If swComp Is Nothing Then

  88.                 MsgBox "请先在装配体中选择要改变标准件图标的零件!", vbCritical, "更改标准件标记 By Lunkay"
  89.             
  90.                 End

  91.             Else

  92.                 If swComp.GetSuppression = 1 Or swComp.GetSuppression = 4 Then    '零件压缩状态为轻化

  93.                     nRetval = swComp.SetSuppression2(2)    '将轻化还原

  94.                 End If
  95.                 sCompName = swComp.GetPathName
  96.             
  97.                 Set swCompModel = swApp.ActivateDoc2(sCompName, True, nRetval)

  98.                 Set swCompModel = swApp.ActiveDoc

  99.                 swCompPartName = swCompModel.GetTitle

  100.                 If swCompModel.GetType <> 1 Then

  101.                     MsgBox "请先在装配体中选择要改变标准件图标的零件!", vbCritical, "更改标准件标记 By Lunkay"
  102.                     End

  103.                 End If

  104.                 longstatus = swCompModel.SaveAs3("C:\更改标准件标记.SLDPRT", 0, 1)
  105.                 Set swCompModel = Nothing
  106.                 swApp.CloseDoc "更改标准件标记.SLDPRT"

  107.                 Set swModel = swApp.ActiveDoc

  108.                 Set objClassfac = CreateObject("SwDocumentMgr.SwDMClassFactory")
  109.                 Set swDM = objClassfac.GetApplication(SWDMLicenseKey)    '启动SWDM
  110.                 Set swDoc = swDM.GetDocument(sCompName, 1, False, mOpenErrors)

  111.                 If BZJ = 1 Then    '变成标准件图标

  112.                     If swDoc.ToolboxPart <> swDmNotAToolboxPart Then

  113.                         MsgBox "所选零件是标准件!请选择一个非标准件!", vbCritical, "更改标准件标记 By Lunkay"
  114.                     
  115.                         swDoc.CloseDoc
  116.                         sMgr.DeSelect 1
  117.                         bRet = swComp.Select(True)
  118.                         bRet = swModel.ReplaceComponents(sCompName, "", True, True)
  119.                     
  120.                         Kill "C:\更改标准件标记.SLDPRT"
  121.                     
  122.                         End
  123.                     
  124.                     Else

  125.                         swDoc.ToolboxPart = swDmToolboxStandardPart

  126.                         swDoc.Save
  127.                         swDoc.CloseDoc
  128.                         'sMgr.DeSelect 1
  129.                         bRet = swComp.Select(True)

  130.                         bRet = swModel.ReplaceComponents(sCompName, "", True, True)

  131.                         Kill "C:\更改标准件标记.SLDPRT"

  132.                     End If

  133.                 ElseIf BZJ = 0 Then    '变成零件图标

  134.                     If swDoc.ToolboxPart = swDmNotAToolboxPart Then

  135.                         MsgBox "所选零件不是标准件!", vbCritical, "更改标准件标记 By Lunkay"
  136.                         swDoc.CloseDoc
  137.                         sMgr.DeSelect 1
  138.                         bRet = swComp.Select(True)
  139.                         bRet = swModel.ReplaceComponents(sCompName, "", True, True)
  140.                         Kill "C:\更改标准件标记.SLDPRT"     
  141.                         End
  142.                     Else
  143.                         swDoc.ToolboxPart = swDmNotAToolboxPart
  144.                         swDoc.Save
  145.                         swDoc.CloseDoc
  146.                         sMgr.DeSelect 1
  147.                         bRet = swComp.Select(True)
  148.                         bRet = swModel.ReplaceComponents(sCompName, "", True, True)
  149.                         Kill "C:\更改标准件标记.SLDPRT"
  150.                     End If
  151.                 End If
  152.             End If
  153.         Next n
  154.         swModel.ClearSelection2 True
  155.     Else
  156.         MsgBox "请打开标装配体文件后再运行本程序!", vbCritical, "更改标准件标记 By Lunkay"
  157.     End If
  158. End Sub

复制代码


更新:适用于2014——2017
SW宏文件在此下载:[attach]1250728[/attach]
源代码如下:
  1. ' ------------------------------------------------------------------------------
  2. ' ChangeToolboxPartProperty
  3. ' ChangeToolboxPartProperty.swp -  by Lunkay, Copyright 2017/7/4
  4. ' Contact:  313618812@qq.com (Lunkay)

  5. ' 功能:
  6. '       选中零件,更改标准件图标属性。
  7. '
  8. ' 使用方法:
  9. ' 适用于solidworks2014_2017
  10. 'BGU: 有时kill文件报错,无权限
  11. ' -------------------------------------------------------------------------------

  12. #If VBA7 Then
  13.     Private Declare PtrSafe Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
  14. #Else
  15.     Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
  16. #End If


  17. Dim swApp As Object
  18. Dim swModel As Object
  19. Dim swComp As Object
  20. Dim swCompModel As Object

  21. Dim ArrSelectedObjects() As Variant

  22. Dim sCompName As String

  23. Dim sMgr As Object

  24. Dim iReply As String
  25. Dim swFrame As Object    ' declare status bar object

  26. Dim nRetval As Long
  27. Dim bRet As Boolean
  28. Dim nErrors As Long
  29. Dim nWarnings As Long
  30. Dim mlngSWFileType As Long
  31. Dim ret As Integer

  32. Dim FilePath As String

  33. Dim ml As String

  34. Dim keys(0 To 255) As Byte

  35. Dim n As Long
  36. Dim CurSelCount As Long
  37. Dim AtIndex  As Long

  38. Dim swCompPartName As String
  39. Dim longstatus As Long, longwarnings As Long

  40. Public BZJ As Long

  41. Dim modelDocExt As Object

  42. Const MINSELECTIONS = 1

  43. Sub main()
  44.     FrmChangeToolboxPartProperty.Show
  45.     Set swApp = Application.SldWorks

  46.     Set swModel = swApp.ActiveDoc

  47.     If swModel Is Nothing Then
  48.         MsgBox "请先打开一个装配体文件!  ", vbCritical, "更改标准件标记 By Lunkay"
  49.         End

  50.     End If

  51.     If swModel.GetType = 2 Then    '如果模型是“装配体”

  52.         Set sMgr = swModel.SelectionManager
  53.         
  54.         If sMgr.GetSelectedObjectCount < MINSELECTIONS Then
  55.         
  56.             MsgBox "下面请在装配体中选择要改变标准件图标的零件!", vbCritical, "更改标准件标记 By Lunkay"
  57.             
  58.         Else

  59.         End If

  60.         While sMgr.GetSelectedObjectCount < MINSELECTIONS
  61.         
  62.             DoEvents
  63.             GetKeyboardState keys(0)

  64.             If keys(27) > 127 Then End

  65.         Wend

  66.         CurSelCount = sMgr.GetSelectedObjectCount
  67.         
  68.         ReDim ArrSelectedObjects(1 To CurSelCount)
  69.         AtIndex = 1
  70.         
  71.         For n = 1 To CurSelCount

  72.                 Set ArrSelectedObjects(n) = sMgr.GetSelectedObjectsComponent2(n)

  73.         Next n

  74.         For n = 1 To CurSelCount

  75.                 sMgr.DeSelect AtIndex

  76.         Next n

  77.         For n = 1 To CurSelCount

  78.              Set swComp = ArrSelectedObjects(n)
  79.             If swComp Is Nothing Then

  80.                 MsgBox "请先在装配体中选择要改变标准件图标的零件!", vbCritical, "更改标准件标记 By Lunkay"
  81.             
  82.                 End

  83.             Else

  84.                 If swComp.GetSuppression = 1 Or swComp.GetSuppression = 4 Then    '零件压缩状态为轻化

  85.                     nRetval = swComp.SetSuppression2(2)    '将轻化还原

  86.                 End If
  87.                 sCompName = swComp.GetPathName
  88.             
  89.                 Set swCompModel = swApp.ActivateDoc2(sCompName, True, nRetval)

  90.                 Set swCompModel = swApp.ActiveDoc

  91.                 swCompPartName = swCompModel.GetTitle

  92.                 If swCompModel.GetType <> 1 Then

  93.                     MsgBox "请先在装配体中选择要改变标准件图标的零件!", vbCritical, "更改标准件标记 By Lunkay"
  94.                     End

  95.                 End If

  96.                 Set modelDocExt = swCompModel.Extension

  97.                 If BZJ = 1 Then    '变成标准件图标

  98.                     If modelDocExt.ToolboxPartType <> 0 Then

  99.                         MsgBox "所选零件是标准件!请选择一个非标准件!", vbCritical, "更改标准件标记 By Lunkay"

  100.                         End
  101.                     
  102.                     Else

  103.                         modelDocExt.ToolboxPartType = 1

  104.                         swCompModel.Save

  105.                     End If

  106.                 ElseIf BZJ = 0 Then    '变成零件图标

  107.                     If modelDocExt.ToolboxPartType = 0 Then

  108.                         MsgBox "所选零件不是标准件!", vbCritical, "更改标准件标记 By Lunkay"

  109.                         End

  110.                     Else

  111.                         modelDocExt.ToolboxPartType = 0

  112.                         swCompModel.Save

  113.                     End If

  114.                 End If

  115.             End If

  116.         Next n

  117.         swModel.ClearSelection2 True
  118.     Else
  119.    
  120.         MsgBox "请打开标装配体文件后再运行本程序!", vbCritical, "更改标准件标记 By Lunkay"

  121.     End If

  122. End Sub

复制代码






作者: qxzch    时间: 2017-7-5 23:47
怎么变脸的?
作者: lkai    时间: 2017-7-5 23:56
qxzch 发表于 2017-7-5 23:47
怎么变脸的?

更改文件的ToolboxPart属性

作者: 豬頭2017    时间: 2017-7-6 03:26


作者: xiabulai    时间: 2017-7-6 05:59
方便很多,谢谢分享。
作者: gt.adan    时间: 2017-7-6 07:42
本帖最后由 gt.adan 于 2017-7-6 07:49 编辑

謝謝樓主的分享!
是否限定使用版本?

作者: 海饼干    时间: 2017-7-6 08:16
好腻害的样子
作者: lkai    时间: 2017-7-6 08:20
本帖最后由 lkai 于 2017-7-6 23:19 编辑
gt.adan 发表于 2017-7-6 07:42
謝謝樓主的分享!
是否限定使用版本?

所用函数,在高版本中任然有,没有被废弃。应该是都可以用的,但是使用了SWDM,不同sw,其SWDM license不同,所以没法通用,需要自行修改license。宏文件solidworks对象为前期绑定,不知道到其他soldiworks版本会不会引用丢失。有肯能需要修复。

作者: lkai    时间: 2017-7-6 08:22
gt.adan 发表于 2017-7-6 07:42
謝謝樓主的分享!
是否限定使用版本?

代码简陋,请版主予以完善修正。
作者: qiminger    时间: 2017-7-6 10:07
谢谢分享好方法,学习。
作者: topenny    时间: 2017-7-9 07:07
谢谢楼主的分享!
作者: yx1991    时间: 2017-7-9 20:47
很厉害的样子
作者: shui321yang    时间: 2017-7-10 11:49
谢谢分享

作者: qxzch    时间: 2017-7-10 22:10
在SW2017没用成功
作者: 山羊不吃草    时间: 2017-7-11 08:48
学习学习!!!


作者: lkai    时间: 2017-7-11 13:35
qxzch 发表于 2017-7-10 22:10
在SW2017没用成功

下载顶楼sw2014-2017版本的试下

作者: sxl_sxl    时间: 2017-7-11 22:48
改变图标的用意还望楼主明示
作者: xiabulai    时间: 2017-7-12 07:36
lkai 发表于 2017-7-11 13:35
下载顶楼sw2014-2017版本的试下

SW2016及2017版本已测试,可以使用,只是改变后,零件的图标没变化,其实已经改成功了,关闭装配体,重新打开装配体,图标才显示正常。

作者: lkai    时间: 2017-7-12 09:24
xiabulai 发表于 2017-7-12 07:36
SW2016及2017版本已测试,可以使用,只是改变后,零件的图标没变化,其实已经改成功了,关闭装配体,重新 ...

收到,感谢提出问题,针对此问题,已更正顶楼代码,代码适当位置增加了“强制重建模”。请测试。
作者: lkai    时间: 2017-7-12 09:36
sxl_sxl 发表于 2017-7-11 22:48
改变图标的用意还望楼主明示

更改意图场景:
1、从标准件库toolbox中脱出标准件,在上作修改另存当作己用,打开含有此文件的装配文档,文档图标为标准件图标。
2、……待补充……

作者: xiabulai    时间: 2017-7-12 09:39
lkai 发表于 2017-7-12 09:24
收到,感谢提出问题,针对此问题,已更正顶楼代码,代码适当位置增加了“强制重建模”。请测试。

应该是我们感谢楼主的分享。   刚下载试过了,还是那样,而且比原来还慢了。

作者: xiabulai    时间: 2017-7-12 09:54
lkai 发表于 2017-7-12 09:24
收到,感谢提出问题,针对此问题,已更正顶楼代码,代码适当位置增加了“强制重建模”。请测试。

感觉是在零件里重建了,没在装配里重建。  卡在零件里一会儿,回到装配还是没变。

作者: lonelylu    时间: 2017-7-13 09:13
感觉不错哦
作者: 莱虫    时间: 2017-7-18 17:54
本帖最后由 莱虫 于 2017-7-18 21:25 编辑

非常钦敬楼主的分享精神, 但是没必要搞出那么长的代码吧,
还有,既然SW已经在线,怎么还要用到离线界面:SWDM-API?

俺也搞了一下,代码没顾及到小白们,在此向小白们致歉。ps:小白是指那些没看清楚内文就执行代码,然后大呼小叫的人

有先决条件几个:
1. 需修改图示的零件已经打开(不需当前打开)
2. 当前打开了一个装配,并点选了一个零件
3. 代码只支持SW2014及后版本
执行以下代码,如非Toolbox则变为Toolbox,如是Toolbox则变为非Toolbox。
  1. 按照楼下大大意见,删除多此一举的宏代码。
复制代码

作者: qxzch    时间: 2017-7-18 20:44
个人认为还是使用X:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\Toolbox\data utilities中的sldsetdocprop.exe更好,毕竟Toolbox则变为非Toolbox或者非Toolbox则变为Toolbox并不常用,不必用宏来搞
作者: 莱虫    时间: 2017-7-18 21:26
qxzch 发表于 2017-7-18 20:44
个人认为还是使用X:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\Toolbox\data utilities中的sldsetdocprop. ...

大大所言极是,俺已删除多此一举的宏代码。

作者: lkai    时间: 2017-7-18 22:03
莱虫 发表于 2017-7-18 17:54
非常钦敬楼主的分享精神, 但是没必要搞出那么长的代码吧,
还有,既然SW已经在线,怎么还要用到离线界面 ...

奈何本人所用SW版本为2013,没有toolbox属性修改的 sldworks API,故此智能SWDM-API。


作者: makejon    时间: 2018-10-3 13:18
FrmChangeToolboxPartProperty.Show  这个提示错误
作者: chenjiansen01    时间: 2018-10-4 12:56
顶顶顶顶顶顶顶顶顶顶
作者: 风中de沙    时间: 2018-11-23 12:36
FrmChangeToolboxPartProperty.Show  这个提示错误
作者: ningxin4567    时间: 2019-4-3 13:22
提示如下错误。。。。。。。。

作者: peng18067    时间: 2019-5-29 23:01
谢谢分享
作者: JX小鱼    时间: 2019-6-17 12:08
感谢分享,方便许多
作者: zjmj2002    时间: 2019-6-17 14:31
谢谢楼主的分享!
作者: zjmj2002    时间: 2019-6-19 16:12
谢谢楼主的分享!
作者: qzf1    时间: 2021-12-12 17:07
[attach]1273428[/attach]为什么SW2016用不了,这里代码是黄色的





欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3