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

标题: 装配体属性零件数量遍历和批量修改零件属性 [打印本页]

作者: xiaomu007    时间: 2016-11-21 09:19
标题: 装配体属性零件数量遍历和批量修改零件属性
装配体属性零件数量遍历和批量修改零件属性能否合并呢?就是在打开装配体的时候自动遍历装配体下面所有的零件的数量和属性。谁能给合并下啊
作者: bjcgm2000    时间: 2016-11-25 07:02
论坛中已经包含了渔具和鱼饵了。
作者: lgzhao    时间: 2016-11-26 19:30
可是我不会弄啊。有人出来帮忙吗?
作者: kai0603    时间: 2016-12-1 13:27
Dim TopDocPathOnly As String
Dim PartsCollect() As String '遍历清单(阵列)
Dim InCollectCount As Double '遍历清单长度
Dim CustomInfoQTY  As String
Dim S1     As Integer
Dim S2     As Integer
Dim Path_Name    As String
Dim Code_Name_C  As String
Dim Code_    As String
Dim Name_    As String
Dim swApp    As SldWorks.SldWorks
Dim swModelDoc   As SldWorks.ModelDoc2
Dim swConfig   As SldWorks.Configuration
Dim CustPropMgr  As SldWorks.CustomPropertyManager

Sub main096()
Set swApp = Application.SldWorks 'SW对象
Set TopDoc = swApp.ActiveDoc '总装对象
If TopDoc.GetType <> 2 Then Exit Sub '不是装配=退出
TopDocPathSplit = Split(TopDoc.GetPathName, "\") '分割
TopDocName = TopDocPathSplit(UBound(TopDocPathSplit)) '总装文件名称
TopDocName = Left(TopDocName, Len(TopDocName) - 7) '总装文件名称(排除.SLDASM)
TopDocPathOnly = Mid(TopDoc.GetPathName, 1, InStrRev(TopDoc.GetPathName, "\", -1)) '总装的完整目录
TopConfString = TopDoc.GetActiveConfiguration.name '总装配置名称

CustomInfoQTY = "加工数量" '可按个人喜好修改预设值

InCollectCount = 1 '遍历清单长度基数
ReDim PartsCollect(InCollectCount) '定义阵列项数

TopCode_ = Left(TopDocName, InStr(TopDocName, " ") - 1)
TopName_ = Right(TopDocName, Len(TopDocName) - InStr(TopDocName, " "))

'Set TopCustPropMgr = TopDoc.Extension.CustomPropertyManager(TopConfString) '如要添加到配置中请启用本代码
Set TopCustPropMgr = TopDoc.Extension.CustomPropertyManager(ConfName) '写入自定义


TopCustPropMgr.Add2 "材料", 30, Chr(34) & "SW-Material@*" & TopDocName & ".SLDASM""" '在自订属性加入属性

TopCustPropMgr.Add2 "重量", 30, Chr(34) & "SW-Mass@*" & TopDocName & ".SLDASM""" '在自订属性加入属性

TopCustPropMgr.Add2 "体积", 30, Chr(34) & "SW-Volume@*" & TopDocName & ".SLDASM"""'在自订属性加入属性

TopCustPropMgr.Add2 "表面积", 30, Chr(34) & "SW-SurfaceArea@*" & TopDocName & ".SLDASM""" '在自订属性加入属性

TopCustPropMgr.Add2 "公司名称", 30, "浩气航空地面设备"

TopCustPropMgr.Add2 "设计者", 30, "谢贵明"

TopCustPropMgr.Add2 "备注说明", 30, " "

TopCustPropMgr.Add2 "表面处理", 30, " "

TopCustPropMgr.Add2 "工艺类型", 30, " "


TopCustPropMgr.Delete ("图号") '删除栏
TopCustPropMgr.Delete ("名称")


TopCustPropMgr.Add2 "图号", swCustomInfoText, TopCode_ '新增
TopCustPropMgr.Add2 "名称", swCustomInfoText, TopName_


SubAsm TopDoc, TopConfString '遍历

Set swApo = Application.SldWorks '重建模型
Set Part = swApo.ActiveDoc
Part.EditRebuild

Set swModel = swApo.ActiveDoc '保存当前文件
swModel.Save
Set swApo = _
Application.SldWorks

Beep '嘟的提示音

End Sub

Function SubAsm(AsmDoc, ConfString) '统计装配体各零件数量
Set Configuration = AsmDoc.GetConfigurationByName(ConfString)
Set RootComponent = Configuration.GetRootComponent
Components = RootComponent.GetChildren
For Each Child In Components
Set ChildModel = Child.GetModelDoc
If Not (ChildModel Is Nothing) Then '排除抑制及轻化
ChildConfString = Child.ReferencedConfiguration '零件配置名称
ChildType = ChildModel.GetType
ChildPathSplit = Split(Child.GetPathName, "\") '分割
ChildName = ChildPathSplit(UBound(ChildPathSplit)) '零件文件名称
ChildPathOnly = Mid(Child.GetPathName, 1, InStrRev(Child.GetPathName, "\", -1)) '零件的完整目录
If ChildPathOnly = Replace(ChildPathOnly, TopDocPathOnly, "") Then SamePath = False Else SamePath = True '零件是否在总装目录或往下目录
If SamePath And (Not Child.ExcludeFromBOM) And (Not Child.IsEnvelope) Then '跳过:不在总装目录或其往下目录 或 不包括在材料明细表中 或 是个封套
If (Not Child.ExcludeFromBOM) And (Not Child.IsEnvelope) Then '跳过:不包括在材料明细表中 及 封套
UNIT_OF_MEASURE_Name = ChildModel.CustomInfo2(ChildConfString, "UNIT_OF_MEASURE") '备用量属性名称
UNIT_OF_MEASURE = ChildModel.CustomInfo2(ChildConfString, UNIT_OF_MEASURE_Name) '备用量
If (UNIT_OF_MEASURE = 0) Or (UNIT_OF_MEASURE = "") Then UNIT_OF_MEASURE = 1 '备用量除错
inCollect = False '重置判断变量
For Each PartinCollect In PartsCollect '判断是否已在遍历清单内
If ChildConfString & "@" & ChildName = PartinCollect Then inCollect = True
Next
If inCollect Then '已在遍历清单内
ht_Qty = ChildModel.CustomInfo2("", CustomInfoQTY) + 1 * UNIT_OF_MEASURE
ChildModel.DeleteCustomInfo2 "", CustomInfoQTY
ChildModel.AddCustomInfo3 "", CustomInfoQTY, 30, ht_Qty
Else '不在遍历清单内(首次处理)
ChildModel.DeleteCustomInfo2 "", CustomInfoQTY
ChildModel.AddCustomInfo3 "", CustomInfoQTY, 30, UNIT_OF_MEASURE
InCollectCount = InCollectCount + 1 '遍历清单长度基数+1
ReDim Preserve PartsCollect(InCollectCount) '重新定义阵列项数(保留内含数据)
PartsCollect(InCollectCount - 1) = ChildConfString & "@" & ChildName '加入到遍历清单中
ChildModel.SetUserPreferenceIntegerValue swUnitSystem, swUnitSystem_Custom '单位系统=Custom
ChildModel.SetUserPreferenceIntegerValue swUnitsMassPropMass, swUnitsMassPropMass_Kilograms '重量单位设定为kg(可按喜好加入设定)
ChildModel.SetUserPreferenceIntegerValue swUnitsMassPropLength, swMM '设定长度单位为毫米
ChildModel.SetUserPreferenceIntegerValue swUnitsMassPropVolume, swUnitsMassPropVolume_Centimeters3 '设定体积单位为立方厘米
ChildModel.SetUserPreferenceIntegerValue swUnitsMassPropDecimalPlaces, 2 '质量及体积小数点后2位

ChildModel.AddCustomInfo3 "", "材料", 30, Chr(34) & "SW-Material@*" & ChildName & Chr(34) '在自订属性加入属性

ChildModel.AddCustomInfo3 "", "重量", 30, Chr(34) & "SW-Mass@*" & ChildName & Chr(34) '在自订属性加入属性

ChildModel.AddCustomInfo3 "", "体积", 30, Chr(34) & "SW-Volume@*" & ChildName & Chr(34) '在自订属性加入属性

ChildModel.AddCustomInfo3 "", "表面积", 30, Chr(34) & "SW-SurfaceArea@*" & ChildName & Chr(34) '在自订属性加入属性

ChildModel.AddCustomInfo3 "", "公司名称", 30, "上海浩气机械设备有限公司"

ChildModel.AddCustomInfo3 "", "设计者", 30, "谢贵明"

ChildModel.AddCustomInfo3 "", "备注说明", 30, " "

ChildModel.AddCustomInfo3 "", "表面处理", 30, " "

ChildModel.AddCustomInfo3 "", "工艺类型", 30, " "

'ChildModel.AddCustomInfo3 ChildConfString, "Weight", 30, Chr(34) & "SW-Mass@@" & ChildConfString & "@*" & ChildName & Chr(34) '如要添加到配置中请启用本代码
'ChildModel.AddCustomInfo3 ChildConfString, "Material", 30, Chr(34) & "SW-Material@@" & ChildConfString & "@*" & ChildName & Chr(34) '如要添加到配置中请启用本代码

'ConfName = ChildModel.GetActiveConfiguration.Name '如要添加到配置中请启用本代码
Set CustPropMgr = ChildModel.Extension.CustomPropertyManager(ConfName)

Path_Name = ChildModel.GetPathName() '取得"路径名称及扩展名",不管扩展名是否应藏
S1 = InStrRev(Path_Name, "\") '\符号在路径之最后位置数
Code_Name_C = Right(Path_Name, Len(Path_Name) - S1) '取得件号_名称.扩展名"
S2 = InStr(Code_Name_C, " ") '_符号在"件号_名称.扩展名"之位数
Code_ = Left(Code_Name_C, S2 - 1) '?取得"件号"
Name_ = Mid(Code_Name_C, S2 + 1, Len(Code_Name_C) - S2 - 7) '取得"件号_名称"


CustPropMgr.Delete ("图号") '删除栏
CustPropMgr.Delete ("名称")


CustPropMgr.Add2 "图号", swCustomInfoText, Code_ '新增
CustPropMgr.Add2 "名称", swCustomInfoText, Name_


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

End If
If ChildType = 2 Then
SubAsm ChildModel, ChildConfString '如果是装配则向下遍历
End If
End If
End If
End If
Next
End Function
作者: lht5610    时间: 2017-1-13 06:24
这个可以在exel表中运行吗?好像这是个sw的宏吧
作者: a13058637792    时间: 2017-1-13 20:19
是的
作者: houzuonanhai    时间: 2017-1-23 12:22
假设流程如下可否接受:
1. 在SW手动打开总组合件
2. 运行特定的巨集(宏)
3. 巨集自动打开指定Excel文档匯入总组合件内所有次组件及零件的属性
4. 在Excel内按照自己的意愿手动修改属性
5. 点选Excel内的特定巨集,巨集会自动将表格内的属性写进次组件及零件
6. 回到SW可发现所有的属性已经更新,保存一下即可
作者: liuqw790723    时间: 2017-2-6 12:20
楼上的,这个流程也很好啊。不知道能否贴出你的代码呢?就是不知道导入EXCEL文件后。零件的路径。能不能也跟着出现呢?不过我还是想问下。就是在EXC里能不能打开一个装配体。然后他就会遍历出所有的零件及属性呢啊?
作者: hhh001    时间: 2022-7-3 23:41
活到老学到老!
作者: qq804848912    时间: 2022-7-8 20:06


SW机械工程师网,找到组织了!
作者: lxs997527761    时间: 2022-11-18 15:39
以上代码运行出错,不知道是那里问题
作者: lxs997527761    时间: 2022-11-21 12:35
运行到这一句时出错:TopCode_ = Left(TopDocName, InStr(TopDocName, " ") - 1)
作者: bingjianzuozhan    时间: 2023-3-10 11:24
很不错,找到组织了!
作者: zhaozhensheng24    时间: 2023-4-11 15:15
感谢楼主分享,很不错!
作者: my511725147    时间: 2023-5-1 10:33
楼主辛苦了!




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