QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 7353|回复: 14
收起左侧

[分享] SW 零件数量计算/遍历小工具

[复制链接]
发表于 2017-2-24 16:54:17 | 显示全部楼层 |阅读模式 来自: 中国广东佛山
安装
主题分类用于问题归类:

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
许久没发过工具了~ 发一个吧~功能:自动计算一个组件中,零件的个数。- c& h7 b6 @0 j/ s: q
注:使用该功能时,请关闭相关的SW文档,最好直接把SW关了!
& M3 ?2 O/ _! P0 {因为使用的是DM API !有BUG请反映~谢谢!
8 \3 B' k; ?7 \( H" M2 C" h
有BUG请反映~
: v6 z0 }# I6 x" j) H下载地址9 R, t2 a3 M; L2 S
& d3 i& m6 U: t% ]3 i
QQ图片20170224164337.png & r: M0 y% i3 }/ W3 B  n* v9 Q

% X; y& R: w% v5 v, \$ l2 H( _' r) g+ `
& V& f9 w: J# i/ p/ `% u) x0 d. L* k$ }$ X" k6 Y' g4 B
1 @/ b1 A& [; T

+ y9 d8 ]- K/ r/ v+ K8 p+ i6 R5 n0 V+ j7 u
发表于 2019-1-27 16:24:41 | 显示全部楼层 来自: 中国广东广州
没有用过不知掉 是否好用
发表于 2019-1-23 09:34:59 | 显示全部楼层 来自: 中国广东佛山
顶一个,下载来备用 了
发表于 2018-10-5 11:50:29 | 显示全部楼层 来自: 中国广东惠州
太好用用了、客户的图纸都没数量、这个正好解决大问题、感谢
发表于 2017-6-3 09:42:54 | 显示全部楼层 来自: 中国浙江宁波

5 d. C) J  }$ v4 d5 T& l7 K% H9 {朋友,此方法可以将单台数量显示出来,有没有好的方法将多台数量显示出来的呢,比如我要做3台,那么单台数量乘以3。。。怎么可以只输入3就可以自动出来多台数量
发表于 2017-4-2 17:20:39 | 显示全部楼层 来自: 中国四川自贡
貌似这个功能没有意义?数量软件自带统计
5 f8 i$ L3 O  U9 B: Q) M" x
发表于 2017-3-29 22:10:12 | 显示全部楼层 来自: 中国广东中山
感谢分享,支持楼主
发表于 2017-3-11 13:34:45 | 显示全部楼层 来自: 中国天津
为什么2014不能用呢
 楼主| 发表于 2017-2-28 08:42:48 | 显示全部楼层 来自: 中国广东佛山

5 w9 A3 j" P+ f2 n6 o1 T% X! {谢谢,不过,我这小工具用的不是“在线API”!无参考意义!
& V4 ^+ N5 d" C8 J! M下个版本我会把修改的文件锁定在“本目录”,以防某些朋友“不按常规出牌~”。
发表于 2017-2-27 21:57:29 | 显示全部楼层 来自: 中国福建厦门
本帖最后由 fend5566 于 2017-2-27 22:00 编辑
) S4 a! Q% V# F1 T
  1. <div><div>Dim TopDocPathOnly As String
    5 M- O2 o, [5 p( X( \2 T, @# O' e
  2. Dim PartsCollect() As String '遍历清单7 Q$ K1 [. C# M- e; s: @, {+ c
  3. Dim InCollectCount As Double '遍历清单长度
    1 I: S) ^  T! ~" s' ]2 l8 ?
  4. Dim CustomInfoQTY As String
    ; n& L9 V; N: N/ @
  5. - B# R$ `; `& X7 W
  6. Sub main()
    ! ~# Z0 x) c" e2 ^6 q0 U
  7. Set swApp = Application.SldWorks '对象) o( v9 Q, ~2 X! r6 ^! w1 q
  8. Set TopDoc = swApp.ActiveDoc '总装对象
    4 |( e' ]% l" k: ~" o
  9. If TopDoc.GetType <> 2 Then Exit Sub '不是装配=退出  ?1 }! H* b% ?# V3 s, @
  10. TopDocPathSplit = Split(TopDoc.GetPathName, "") '分割
    - s4 \% m. e$ ]! i: V& t) c
  11. TopDocName = TopDocPathSplit(UBound(TopDocPathSplit)) '总装文件名称4 ?, l! b, ^& p* i" q5 K' x
  12. TopDocName = Left(TopDocName, Len(TopDocName) - 7) '总装文件名称(排除.SLDASM)& @6 Z) D4 X* ]1 c
  13. TopDocPathOnly = TopDocPathSplit(UBound(TopDocPathSplit) - 1) '总装目录名称
    - L& @) d: d) _7 x9 h4 V' R- y2 o' k
  14. TopConfString = TopDoc.GetActiveConfiguration.Name '总装配置名称
    , _. w7 B( n9 i! r% I* e* X
  15. CustomInfoQTY = InputBox("自定义属性名称", "遍历" & TopDocName, "数量") '  可按个人喜好修改预设值
    : Z. f6 r2 Q) C& s
  16. If CustomInfoQTY = "" Then Exit Sub '按下取消离开宏, L" v& G: A$ |
  17. InCollectCount = 1 '遍历清单长度基数) f: T7 I# ^, J; {5 E% Y  D7 N
  18. ReDim PartsCollect(InCollectCount) '定义阵列项数
    0 Y6 o8 E# N6 ^( e- W+ _
  19. SubAsm TopDoc, TopConfString '遍历
    . @( d, e. }, b6 _5 i' r& _
  20. End Sub
      J8 i7 q" N2 i/ X, W9 `  J
  21. & i* ?3 @- b6 K. B; I/ i" e& Q
  22. Function SubAsm(AsmDoc, ConfString)( E* `# o  h& p0 }
  23. Set Configuration = AsmDoc.GetConfigurationByName(ConfString)
    ) |, V8 E! w  `; i) @
  24. Set RootComponent = Configuration.GetRootComponent
    8 K) w8 x& J8 o! V: @
  25. Components = RootComponent.GetChildren0 f; B( |' [$ d; ]1 E& T, J' s7 I
  26. For Each Child In Components1 k0 A, w5 k% D9 X2 z+ P
  27.     Set ChildModel = Child.GetModelDoc
    . Q7 b& ^5 o2 b" k
  28.     If Not (ChildModel Is Nothing) Then '排除抑制及轻化3 G1 m0 z5 U* n$ O  {
  29.     ChildConfString = Child.ReferencedConfiguration '零件配置名称# G2 a) S0 a. W
  30.         ChildType = ChildModel.GetType5 V1 {5 Q7 I2 M* K8 S+ I( f
  31.             ChildPathSplit = Split(Child.GetPathName, "") '分割/ z9 d6 S  e  k; e9 s- K7 R
  32.             ChildName = ChildPathSplit(UBound(ChildPathSplit)) '零件文件名称8 u% c; d* n8 w! n
  33.             ChildPathOnly = ChildPathSplit(UBound(ChildPathSplit) - 1) '零件目录名称8 ]" p9 c+ U& L* E* v
  34.             If ChildPathOnly = TopDocPathOnly Then SamePath = True Else SamePath = False '是否在总装目录0 |7 H# w& p7 F- `4 O6 S
  35.             If SamePath And (Not Child.ExcludeFromBOM) And (Not Child.IsEnvelope) Then '跳过:不在总装目录及不包括在材料明细表中及封套 * g0 J+ O+ G! N/ v( N2 \: T
  36.                 UNIT_OF_MEASURE_Name = ChildModel.CustomInfo2(ChildConfString, "UNIT_OF_MEASURE") '备用量属性名称5 @) Q5 C( G+ Q. N$ z" f! g2 v
  37.                 UNIT_OF_MEASURE = ChildModel.CustomInfo2(ChildConfString, UNIT_OF_MEASURE_Name) '备用量
      B9 c6 P: e9 {! m  G
  38.                 If (UNIT_OF_MEASURE = 0) Or (UNIT_OF_MEASURE = "") Then UNIT_OF_MEASURE = 1 '备用量除错
    ; S- M9 T1 g. f4 M3 U! q! d
  39.                 inCollect = False '重置判断变量3 @, l. ~5 W* Y0 Y/ j6 N7 T
  40.                 For Each PartinCollect In PartsCollect '判断是否已在遍历清单内
    1 {& a1 p; d: D- E5 t- r* _$ w
  41.                 If ChildConfString & "@" & ChildName = PartinCollect Then inCollect = True
    6 \  Q% ^5 x. h! p( L
  42.                 Next
    " M1 c( g% W+ q" }
  43.                 If inCollect Then '已在遍历清单内
      e4 N8 _5 _" T3 Q
  44.                 ht_Qty = ChildModel.CustomInfo2(ChildConfString, CustomInfoQTY) + 1 * UNIT_OF_MEASURE
    8 T; n0 O6 Y% ~% ^
  45.                     ChildModel.DeleteCustomInfo2 ChildConfString, CustomInfoQTY
    0 ]* p% O2 G3 Z
  46.                     ChildModel.AddCustomInfo3 ChildConfString, CustomInfoQTY, 30, ht_Qty
    1 k1 Z& D* A0 O
  47.                 Else '不在遍历清单内(首次处理)( a! h5 F; y: x- C
  48.                 ChildModel.DeleteCustomInfo2 ChildConfString, CustomInfoQTY$ Q" F9 L0 O/ Q8 @; w
  49.                     ChildModel.AddCustomInfo3 ChildConfString, CustomInfoQTY, 30, UNIT_OF_MEASURE- K4 `: V: u- @* ~7 ]
  50.                     InCollectCount = InCollectCount + 1' R5 y- ^0 a4 Q; s5 F8 ]
  51.                     ReDim Preserve PartsCollect(InCollectCount) '重新定义数组项数(保留内含数据)
    " M+ L: L+ V7 z
  52.                     PartsCollect(InCollectCount - 1) = ChildConfString & "@" & ChildName '加入到遍历清单中: i8 b. d+ j& B4 y+ _  j
  53.                     ChildModel.SetUserPreferenceIntegerValue swUnitsMassPropMass, swUnitsMassPropMass_Kilograms '单位设定为kg(可按喜好加入设定)
    0 s9 m& f! O+ X$ A$ X) {
  54.                 End If
    + q$ c- U- h) f; y; ]1 u
  55.             End If
    % l# _) u! s# N
  56.             If ChildType = 2 Then
    9 o5 F% W% _) z- l
  57.             SubAsm ChildModel, ChildConfString '如果是装配则向下遍历  ~" T; l: f2 ?4 Q1 g. X; [
  58.         End If
    * i6 g* U, @+ E# v1 y
  59.     End If
    5 R2 o" k" l# e1 ]& _' K
  60. Next) K! W, z% L! ]& Q( @8 T
  61. End Function</div><div></div><div></div><div>新建个宏,这个是在其他网站转后修改的,可以对子装配相同零件单台用的统计,数量写入特定配置进,自定义属性是:数量。
    ) W5 k6 S! m# r: O; ^
  62. </div></div>
复制代码
发表于 2017-2-27 20:55:53 | 显示全部楼层 来自: 中国江苏苏州
bash 发表于 2017-2-27 10:54
* H4 o4 c8 X1 [7 D# ~& S果然,2016版的DM API 不再线程安全!# I' M! `9 p' W2 d& c+ a! J# G
使用SW2016版本的朋友,请不要使用“线程”,否则会被删除原有属性 ...
$ Z( r" M/ T( E1 }
果然如此,谢谢楼主,盼楼主早日更新版本!!
 楼主| 发表于 2017-2-27 10:55:17 | 显示全部楼层 来自: 中国广东佛山
正确的使用办法:先用SW把组件打包一份出来,然后再修改。
 楼主| 发表于 2017-2-27 10:54:45 | 显示全部楼层 来自: 中国广东佛山
果然,2016版的DM API 不再线程安全!7 M( S, n: D$ g' ^' w4 i1 i
使用SW2016版本的朋友,请不要使用“线程”,否则会被删除原有属性。
" u7 M# x2 ^' r/ O3 q) b这个我在下个版本中会修正,自动判断是不是2016版好了!
发表于 2017-2-26 07:41:17 | 显示全部楼层 来自: 中国辽宁丹东
谢谢楼主分享好工具,测试一下,目录在桌面上,对属性没有修改,win7 64位 SW2013 64位
发表于 2017-2-25 22:45:04 | 显示全部楼层 来自: 中国江苏苏州
本帖最后由 wenmk123 于 2017-2-26 20:16 编辑 ' w0 p. @9 ?6 |" \5 B' _; ?, R/ G
* J1 ]! Z8 }' d. H. y* a
先谢过楼主,刚刚下载试用了一下,SW2016SP2,装配体的零件数量是对了,但是有个问题,幸亏我打包出来测试,不然问题大了!!就是总装配体的数量是对的,但是却把我所有的自定义属性中的所有设定参数全部删除了,只留下一个数量。麻烦楼主测试一下,如果这个问题不能解决,这个宏是不能用的……谢谢!!
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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