iCAx开思网

标题: 【遍历宏】在总装配內零件的自定义属性写入页码 [打印本页]

作者: qxzch    时间: 2018-2-24 00:47
标题: 【遍历宏】在总装配內零件的自定义属性写入页码
  1. 由于平时需要在工程图中填写页码(底图张次),于是在闷大“【遍历宏】在总装配內零件的自定义属性写入配套数量”一贴的基础上修改为写入页码,页码是都填写出来,可是它不一定按总装设计树的顺序编号,有点随机,以下代码不知道能否修改一下,使得页码按总装设计树的顺序编号?请教各位大侠![attach]1255038[/attach]
复制代码
  1. Dim TopDocPathOnly As String
  2. Dim PartsCollect() As String    '遍历清单(阵列)
  3. Dim InCollectCount As Double    '遍历清单长度
  4. Dim CustomInfoQTY  As String

  5. '*******************************************************
  6. Dim Page_Qty           As String
  7. Dim Page_Pre           As String
  8. Dim swApp              As SldWorks.SldWorks
  9. Dim swModelDoc         As SldWorks.ModelDoc2
  10. Dim swConfig           As SldWorks.Configuration
  11. Dim CustPropMgr        As SldWorks.CustomPropertyManager

  12. Sub main()

  13. Answer = MsgBox("① 本程序将遍历装配体填写“页码”属性,请确认顶层装配体已保存!" & Chr(13) & "② 不在顶层装配体目录或子目录、压缩、轻化、虚拟、封套、不包括在BOM中的零部件不作处理。", vbOKCancel + 48)
  14. If Answer = vbOK Then
  15.   Set swApp = Application.SldWorks        'SW对象
  16.   Set TopDoc = swApp.ActiveDoc            '顶层装配体对象
  17.   If TopDoc.GetType <> 2 Then Exit Sub    '如果不是装配体则退出
  18.   TopDocPathSplit = Split(TopDoc.GetPathName, "")         '分割
  19.   TopDocName = TopDocPathSplit(UBound(TopDocPathSplit))    '顶层装配体文件名称
  20.   TopDocName = Left(TopDocName, Len(TopDocName) - 7)       '顶层装配体文件名称(排除.SLDASM)
  21.   TopDocPathOnly = Mid(TopDoc.GetPathName, 1, InStrRev(TopDoc.GetPathName, "", -1))    '顶层装配体的完整目录
  22.   TopConfString = TopDoc.GetActiveConfiguration.Name       '顶层装配体配置名称
  23.   CustomInfoQTY = "配套数量"                               '可根据需要改为其它
  24.   Page_Qty = 1                            '页码递增基数
  25.   InCollectCount = 1                      '遍历清单长度基数
  26.   ReDim PartsCollect(InCollectCount)      '定义阵列项数
  27. Else: Exit Sub
  28. End If

  29. '*******************************************************
  30. Page_Pre = InputBox("输入页码前缀再按“确定”,无前缀请按任意键。")
  31. Set TopCustPropMgr = TopDoc.Extension.CustomPropertyManager("")
  32. TopCustPropMgr.Delete ("页码")
  33. TopCustPropMgr.Add2 "页码", swCustomInfoText, Page_Pre & "" & "1"             '指定顶层装配体的页码为“1”
  34. '*******************************************************

  35. SubAsm TopDoc, TopConfString     '遍历

  36. Beep    '响铃

  37. End Sub

  38. Function SubAsm(AsmDoc, ConfString)

  39. Set Configuration = AsmDoc.GetConfigurationByName(ConfString)
  40. Set RootComponent = Configuration.GetRootComponent
  41. Components = RootComponent.GetChildren
  42. For Each Child In Components
  43.     Set ChildModel = Child.GetModelDoc
  44.     If Not (ChildModel Is Nothing) Then    '排除压缩及轻化
  45.         ChildConfString = Child.ReferencedConfiguration    '零件配置名称
  46.         ChildType = ChildModel.GetType
  47.         ChildPathSplit = Split(Child.GetPathName, "")     '分割
  48.         ChildName = ChildPathSplit(UBound(ChildPathSplit)) '零件文件名称

  49.         ChildPathOnly = Mid(Child.GetPathName, 1, InStrRev(Child.GetPathName, "", -1))  '零件的完整目录
  50.         If ChildPathOnly = Replace(ChildPathOnly, TopDocPathOnly, "") Then SamePath = False Else SamePath = True    '零件是否在顶层装配体目录或子目录中

  51.         If SamePath And (Not Child.ExcludeFromBOM) And (Not Child.IsEnvelope) Then       '跳过:不在顶层装配体目录或子目录 及 不包括在BOM中 及 封套
  52.         'If (Not Child.ExcludeFromBOM) And (Not Child.IsEnvelope) Then                    '跳过:不包括在BOM中 及 封套
  53.             UNIT_OF_MEASURE_Name = ChildModel.CustomInfo2("", "UNIT_OF_MEASURE")         '备用量属性名称
  54.             UNIT_OF_MEASURE = ChildModel.CustomInfo2("", UNIT_OF_MEASURE_Name)           '备用量
  55.             If (UNIT_OF_MEASURE = 0) Or (UNIT_OF_MEASURE = "") Then UNIT_OF_MEASURE = 1  '备用量除错
  56.             inCollect = False    '重置判断变量
  57.             For Each PartinCollect In PartsCollect    '判断是否已在遍历清单内
  58.                 If "" & "@" & ChildName = PartinCollect Then inCollect = True
  59.             Next
  60.             If inCollect Then    '已在遍历清单内
  61. '                ht_Qty = ChildModel.CustomInfo2("", CustomInfoQTY) + 1 * UNIT_OF_MEASURE
  62. '                ChildModel.DeleteCustomInfo2 "", CustomInfoQTY
  63. '                ChildModel.AddCustomInfo3 "", CustomInfoQTY, 30, ht_Qty
  64.             Else                 '不在遍历清单内(首次处理)
  65. '                ChildModel.DeleteCustomInfo2 "", CustomInfoQTY
  66. '                ChildModel.AddCustomInfo3 "", CustomInfoQTY, 30, UNIT_OF_MEASURE
  67.                 InCollectCount = InCollectCount + 1            '遍历清单长度基数+1
  68.                 ReDim Preserve PartsCollect(InCollectCount)    '重新定义阵列项数(保留内含数据)
  69.                 PartsCollect(InCollectCount - 1) = "" & "@" & ChildName    '加入到遍历清单中

  70.                 '*******************************************************
  71.                 Set CustPropMgr = ChildModel.Extension.CustomPropertyManager("")
  72.                 Page_Qty = Page_Qty + 1
  73.                 ChildModel.DeleteCustomInfo2 "", ("页码")
  74.                 ChildModel.AddCustomInfo3 "", ("页码"), 30, Page_Pre & Page_Qty
  75.                 '*******************************************************

  76.                 ChildModel.SketchManager.Insert3DSketch True     '插入3D草图,从而激活零件的“需存盘标签”
  77.                 ChildModel.SketchManager.Insert3DSketch True     '离开3D草图

  78.             End If
  79.             If ChildType = 2 Then
  80.                 SubAsm ChildModel, ChildConfString               '如果是装配体则向下遍历
  81.             End If

  82.         End If
  83.     End If
  84. Next

  85. End Function
复制代码



作者: gdzsh    时间: 2018-2-24 15:26
顶起来,很实用的宏 复制代码运行报错
作者: qxzch    时间: 2018-2-24 18:38
gdzsh 发表于 2018-2-24 15:26
顶起来,很实用的宏 复制代码运行报错

请问报了什么错?

作者: gdzsh    时间: 2018-2-26 13:44
qxzch 发表于 2018-2-24 18:38
请问报了什么错?

上传报错附件

作者: 大鹿    时间: 2018-2-26 14:18
标题: 放羊:球面写字
gdzsh 发表于 2018-2-26 13:44
上传报错附件

俺好象看到脏话
作者: 大鹿    时间: 2018-2-26 14:20
页码是工程图的东东吧,怎么要写到零件属性?

作者: qxzch    时间: 2018-2-26 21:27
gdzsh 发表于 2018-2-26 13:44
上传报错附件

奇怪!我这里运行正常啊,SW2017。

作者: qxzch    时间: 2018-2-26 21:46
大鹿 发表于 2018-2-26 14:20
页码是工程图的东东吧,怎么要写到零件属性?

如附图明细栏最后一列所示,需要列出每个零部件的底图张次,就像普通自定义属性一样写在模型文件中的。
[attach]1255074[/attach]

作者: gdzsh    时间: 2018-2-28 13:58
qxzch 发表于 2018-2-26 21:27
奇怪!我这里运行正常啊,SW2017。

我也是SW2017啊

作者: gdzsh    时间: 2018-2-28 14:02
大鹿 发表于 2018-2-26 14:18
俺好象看到脏话

我怎么没有发现有一点脏话的意思啊?

作者: 大鹿    时间: 2018-2-28 14:23
gdzsh 发表于 2018-2-28 14:02
我怎么没有发现有一点脏话的意思啊?

俺指截图中的乱码

作者: 大鹿    时间: 2018-2-28 14:29
qxzch 发表于 2018-2-26 21:46
如附图明细栏最后一列所示,需要列出每个零部件的底图张次,就像普通自定义属性一样写在模型文件中的。
...

倒不如写个遍历工程图的宏,寻找零部件处于哪个页面,再写到零部件的属性。
更可作为检查有没有零部件漏做或重复制作工程图。


作者: qxzch    时间: 2018-2-28 21:43
大鹿 发表于 2018-2-28 14:29
倒不如写个遍历工程图的宏,寻找零部件处于哪个页面,再写到零部件的属性。
更可作为检查有没有零部件漏 ...

谢谢回复!已经用遍历文件夹的方式解决了

作者: 大鹿    时间: 2018-3-1 01:27
qxzch 发表于 2018-2-28 21:43
谢谢回复!已经用遍历文件夹的方式解决了

虽然俺没需要,但也希望qxzch可以分享解决方法,以达投桃报李之效。

作者: gdzsh    时间: 2018-3-1 10:39
大鹿 发表于 2018-3-1 01:27
虽然俺没需要,但也希望qxzch可以分享解决方法,以达投桃报李之效。

支持,解决支持

作者: gdzsh    时间: 2018-3-1 16:07
qxzch 发表于 2018-2-28 21:43
谢谢回复!已经用遍历文件夹的方式解决了

遍历文件夹不适用吧?做设计总不可能文件价里面的零件全部都是装配体里面的零件吧?我的文件夹里面有不少的设计时替换下来的没有用的零件在里面,想删除掉还不好找。

作者: gdzsh    时间: 2018-3-1 16:20
求传个压缩包上来哟,复制代码粘贴后文字全是乱码,运行宏就报错
作者: qxzch    时间: 2018-3-1 21:54
大鹿 发表于 2018-3-1 01:27
虽然俺没需要,但也希望qxzch可以分享解决方法,以达投桃报李之效。

代码如下,希望不要贻笑大方才好:
  1. Dim swApp           As SldWorks.SldWorks
  2. Dim swDoc           As SldWorks.ModelDoc2
  3. Dim longstatus      As Long
  4. Dim longwarnings    As Long
  5. Dim PathName        As String
  6. Dim FilePath        As String
  7. Dim FullFileName    As String

  8. Dim swDocName       As String
  9. Dim swDocType       As Long

  10. Dim fso             As New Scripting.FileSystemObject
  11. Dim MYext           As String

  12. Sub main()
  13.     On Error Resume Next
  14.     Set swApp = Application.SldWorks
  15.     FilePath = InputBox("本程序将向指定路径下的模型文件填写“页码”属性。" & Chr(13) & "请输入或粘贴完整路径后按“确定”。")
  16.     If FilePath = "" Then Exit Sub
  17.     FilePath = FilePath & ""
  18.     BatchFolder FilePath, ".SLDPRT", ".SLDASM", True
  19. End Sub

  20. '批量处理文件夹的递归过程
  21. Sub BatchFolder(folder As String, ext As String, ext2 As String, silent As Boolean)
  22.     Dim swModelDocExt As ModelDocExtension
  23.     Dim swCustProp    As CustomPropertyManager
  24.     Dim Page_Pre      As String
  25.     Dim Page_Qty      As String
  26.    
  27.     If Right(folder, 1) <> "" Then folder = folder & ""
  28.     ChDir (folder)
  29.     PathName = Dir(folder)
  30.    
  31.     Page_Pre = InputBox("请输入页码的前缀再按“确定”,无前缀按任意键。")
  32.     Page_Qty = 0    '页码递增基数
  33.    
  34.     Do Until PathName = ""
  35.         FullFileName = folder & PathName
  36.         MYext = Right(UCase$(PathName), 7)
  37.         
  38.         If MYext = ext Or MYext = ext2 Then    '如果这个文件类型是所需的,就进行处理
  39.             swDocType = Switch(MYext = ".SLDPRT", swDocPART, MYext = ".SLDDRW", swDocDRAWING, MYext = ".SLDASM", swDocASSEMBLY, True, -1)
  40.             Set swDoc = swApp.OpenDoc6(FullFileName, swDocType, swOpenDocOptions_Silent, "", longstatus, longwarnings)
  41.             Set swDoc = swApp.ActiveDoc
  42.             
  43.             swDocName = Mid(swDoc.GetPathName, InStrRev(swDoc.GetPathName, "") + 1)
  44.             swDocName = Left(swDocName, InStrRev(swDocName, ".") - 1)
  45.             
  46.             Page_Qty = Page_Qty + 1    '页码递增基数+1
  47.             swDoc.DeleteCustomInfo2 "", ("底图张次")
  48.             swDoc.AddCustomInfo3 "", ("底图张次"), 30, Page_Pre & Page_Qty
  49.             swDoc.Save    '保存
  50.             
  51.             swApp.CloseDoc swDoc.GetTitle    '关闭文件
  52.             
  53.             Set swDoc = Nothing
  54.         End If
  55.         PathName = Dir
  56.     Loop
  57.    
  58.     '如果有子文件夹,进行递归处理
  59. '    Dim myFolder As folder
  60. '    Dim mySub As folder
  61. '
  62. '    Set myFolder = fso.GetFolder(folder)
  63. '    For Each mySub In myFolder.SubFolders
  64. '        BatchFolder mySub.Path, ext, ext2, silent
  65. '    Next
  66. End Sub
复制代码



作者: qxzch    时间: 2018-3-1 22:01
gdzsh 发表于 2018-3-1 16:07
遍历文件夹不适用吧?做设计总不可能文件价里面的零件全部都是装配体里面的零件吧?我的文件夹里面有不少 ...

窃以为遍历文件夹也是好的,把总装所属的零部件放在一个文件夹里,其它诸如标准件、外购件等等分好类,该放哪放哪,借用件跟随原所属总装存放,避免文件夹像个垃圾桶。

作者: dr666666    时间: 2018-3-6 16:38
贡献值啊
作者: s78763036    时间: 2018-10-9 17:29
请问一下,遍历宏如何剔除指定的零件,我有一些标准件,GB开头的,这些零件我不需要遍历宏进行分离图号名称写入属性,我想知道如何把GB开头的不包含在遍历清单中,自己捣鼓没结果,望指教,谢谢!
作者: qxzch    时间: 2018-10-9 19:06
s78763036 发表于 2018-10-9 17:29
请问一下,遍历宏如何剔除指定的零件,我有一些标准件,GB开头的,这些零件我不需要遍历宏进行分离图号名称 ...

别放在遍历的文件夹里就行

作者: wenmk    时间: 2018-10-10 12:34
本帖最后由 wenmk 于 2018-10-11 18:07 编辑

谢谢您的分享,我复制代码后运行没有反映,能否分享完整文件,谢谢!

作者: s78763036    时间: 2018-10-13 10:34
qxzch 发表于 2018-10-9 19:06
别放在遍历的文件夹里就行

意思是硬盘零件不放在同一文件夹?我试过了没效果啊

作者: wenmk    时间: 2018-10-15 11:33
s78763036 发表于 2018-10-13 10:34
意思是硬盘零件不放在同一文件夹?我试过了没效果啊

楼上的兄弟,能否把宏分享一份给我,我复制代码后运行没反映,谢谢!
作者: qxzch    时间: 2018-10-15 20:30
wenmk 发表于 2018-10-15 11:33
楼上的兄弟,能否把宏分享一份给我,我复制代码后运行没反映,谢谢!

代码复制上来后,不知何故,有几处与路径有关的反斜杠“\”丢失了!

作者: qxzch    时间: 2018-10-15 20:33
第20行:FilePath = FilePath & "\"
第31行:If Right(folder, 1) <> "\" Then folder = folder & "\"
作者: wenmk    时间: 2018-10-16 11:36
qxzch 发表于 2018-10-15 20:33
第20行:FilePath = FilePath & "\"
第31行:If Right(folder, 1)  "\" Then folder = folder & "\"

楼主能上传一份完整文件不,我复制后运行没有反映,也不报错,谢谢!

作者: wenmk    时间: 2020-2-17 12:29
可以用遍历设计树的方法去添加页码,过滤掉压缩、阵列、标准件、及不包括在BOM内的模型,这样做可以使页码与装配顺序一至。
作者: gdzsh    时间: 2024-9-26 10:15
很实用的宏,几年了也没见合理更新呢?

作者: gdzsh    时间: 2024-10-29 16:15
大鹿 发表于 2018-2-26 14:20
页码是工程图的东东吧,怎么要写到零件属性?

单页工程图内没有连续的页码显示,写入到零件属性里面连接到单页工程图实现连续页码

作者: 大鹿    时间: 2024-10-31 03:05
gdzsh 发表于 2024-10-29 16:15
单页工程图内没有连续的页码显示,写入到零件属性里面连接到单页工程图实现连续页码

不是直接写到工程图slddrw的属性更为直观吗?

作者: gdzsh    时间: 2024-11-5 14:15
大鹿 发表于 2024-10-31 03:05
不是直接写到工程图slddrw的属性更为直观吗?

求发一个直接写道工程图的页码宏





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