QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
许久没发过工具了~ 发一个吧~功能:自动计算一个组件中,零件的个数。- ?& t" Y3 j) E5 h$ [" W" I
注:使用该功能时,请关闭相关的SW文档,最好直接把SW关了!
! W: X0 E2 r: s- H4 T因为使用的是DM API !有BUG请反映~谢谢!8 u0 Z6 K* V" z: y3 S  h
有BUG请反映~- h. J  L5 u3 U1 D6 c+ m1 ^
下载地址
$ a; T' h2 b2 P
3 s  D; {% Z: ~7 j9 X/ z: F QQ图片20170224164337.png . L% q1 X4 x; ?( C# y) t8 q

2 a* ~8 [# x9 I& _, r. p+ Y3 I% {- @4 I
8 d. J' a0 v+ ]1 U3 r5 a4 @
* M( _& T$ K7 y5 V. U7 L4 x
1 ], m, M9 _- q5 O, H; K

+ R: T' ?3 e, ~
发表于 2019-1-27 16:24:41 | 显示全部楼层 来自: 中国广东广州
没有用过不知掉 是否好用
发表于 2019-1-23 09:34:59 | 显示全部楼层 来自: 中国广东佛山
顶一个,下载来备用 了
发表于 2018-10-5 11:50:29 | 显示全部楼层 来自: 中国广东惠州
太好用用了、客户的图纸都没数量、这个正好解决大问题、感谢
发表于 2017-6-3 09:42:54 | 显示全部楼层 来自: 中国浙江宁波
6 Z7 e, d6 A$ ~+ |2 A* |
朋友,此方法可以将单台数量显示出来,有没有好的方法将多台数量显示出来的呢,比如我要做3台,那么单台数量乘以3。。。怎么可以只输入3就可以自动出来多台数量
发表于 2017-4-2 17:20:39 | 显示全部楼层 来自: 中国四川自贡
貌似这个功能没有意义?数量软件自带统计6 i! Q  @- g1 N; Y- Q" s4 ?4 i
发表于 2017-3-29 22:10:12 | 显示全部楼层 来自: 中国广东中山
感谢分享,支持楼主
发表于 2017-3-11 13:34:45 | 显示全部楼层 来自: 中国天津
为什么2014不能用呢
 楼主| 发表于 2017-2-28 08:42:48 | 显示全部楼层 来自: 中国广东佛山
# X& F/ @" t! r! X4 \5 t& \# j0 Q
谢谢,不过,我这小工具用的不是“在线API”!无参考意义!! v& N8 ]+ O: R+ T  o5 w: y$ h: g
下个版本我会把修改的文件锁定在“本目录”,以防某些朋友“不按常规出牌~”。
发表于 2017-2-27 21:57:29 | 显示全部楼层 来自: 中国福建厦门
本帖最后由 fend5566 于 2017-2-27 22:00 编辑
- V( {1 y, M# Z% D2 _
  1. <div><div>Dim TopDocPathOnly As String
    : c9 `; B* i3 o' K% n8 ]
  2. Dim PartsCollect() As String '遍历清单
    ; b' x8 B) `( g0 h7 |" W  r
  3. Dim InCollectCount As Double '遍历清单长度. l- V% B4 q0 T$ J% t& g! T( `2 R  Z7 H" V
  4. Dim CustomInfoQTY As String
    - [" f. A  {$ S4 R, N% f! R
  5. ; _1 a) l  H( H0 }  ]. t
  6. Sub main()
    3 K) z& M8 g5 X0 u% r  O/ ~
  7. Set swApp = Application.SldWorks '对象
    2 \8 O- W: T! H  g" B- C0 m4 H
  8. Set TopDoc = swApp.ActiveDoc '总装对象
    " X. A4 R, ?1 W# `+ D  \; d9 W+ ]
  9. If TopDoc.GetType <> 2 Then Exit Sub '不是装配=退出
    " i6 f6 Y+ O% H" Y, b
  10. TopDocPathSplit = Split(TopDoc.GetPathName, "") '分割! Z7 ^- H6 X. H6 j  i
  11. TopDocName = TopDocPathSplit(UBound(TopDocPathSplit)) '总装文件名称$ K! e7 I( z9 @2 z) I
  12. TopDocName = Left(TopDocName, Len(TopDocName) - 7) '总装文件名称(排除.SLDASM)0 G' C7 [4 V* M6 `9 ^* d; Y
  13. TopDocPathOnly = TopDocPathSplit(UBound(TopDocPathSplit) - 1) '总装目录名称8 r2 |! ]+ y. U) w" @
  14. TopConfString = TopDoc.GetActiveConfiguration.Name '总装配置名称! I6 ]- S/ e: u& _& {+ g6 S
  15. CustomInfoQTY = InputBox("自定义属性名称", "遍历" & TopDocName, "数量") '  可按个人喜好修改预设值
    1 D, _" L( n/ Q6 h3 A
  16. If CustomInfoQTY = "" Then Exit Sub '按下取消离开宏
    & A# o, ?( [8 s3 z$ H" D/ U, A
  17. InCollectCount = 1 '遍历清单长度基数
    ( H3 I& D; d" ]+ R5 m4 D( D
  18. ReDim PartsCollect(InCollectCount) '定义阵列项数( l9 H7 e/ v: c. R: p% ?+ Q8 R: P
  19. SubAsm TopDoc, TopConfString '遍历
    7 t5 x) q+ V6 z6 e2 u  ?
  20. End Sub
    ) t  W% Y0 q/ a9 c/ C

  21. 8 O" }2 h  U' H7 m
  22. Function SubAsm(AsmDoc, ConfString)
    6 [. ~) P7 @/ @' Z8 D
  23. Set Configuration = AsmDoc.GetConfigurationByName(ConfString)
    7 r" l2 r0 G+ m* F8 k: |
  24. Set RootComponent = Configuration.GetRootComponent
    8 Q7 V$ Q# C1 {" k2 E/ M
  25. Components = RootComponent.GetChildren4 \9 u+ {/ O9 W+ }$ P
  26. For Each Child In Components
      n( ^! X1 L8 k2 t6 A. Y
  27.     Set ChildModel = Child.GetModelDoc
    . V/ z! W' j7 H5 k3 C3 C, o$ F
  28.     If Not (ChildModel Is Nothing) Then '排除抑制及轻化
    " _! k3 v* a9 B2 [  |1 _" O  u7 J. a
  29.     ChildConfString = Child.ReferencedConfiguration '零件配置名称
    2 w; M: F4 _+ }$ F# D
  30.         ChildType = ChildModel.GetType
    ( ]$ c! q5 ~3 l& C3 f
  31.             ChildPathSplit = Split(Child.GetPathName, "") '分割. x( u" G! j! N, b$ B2 w
  32.             ChildName = ChildPathSplit(UBound(ChildPathSplit)) '零件文件名称
    ' P) T1 K* O+ H2 Q5 t
  33.             ChildPathOnly = ChildPathSplit(UBound(ChildPathSplit) - 1) '零件目录名称& F7 Z: |0 i8 T: O
  34.             If ChildPathOnly = TopDocPathOnly Then SamePath = True Else SamePath = False '是否在总装目录8 X0 v! T& V; Z/ P0 [# U
  35.             If SamePath And (Not Child.ExcludeFromBOM) And (Not Child.IsEnvelope) Then '跳过:不在总装目录及不包括在材料明细表中及封套 
      ]# i* r! O! c. G, k
  36.                 UNIT_OF_MEASURE_Name = ChildModel.CustomInfo2(ChildConfString, "UNIT_OF_MEASURE") '备用量属性名称
    ; `8 q3 M7 j; l7 R6 ?% i
  37.                 UNIT_OF_MEASURE = ChildModel.CustomInfo2(ChildConfString, UNIT_OF_MEASURE_Name) '备用量9 [8 Q3 `' b9 }& P
  38.                 If (UNIT_OF_MEASURE = 0) Or (UNIT_OF_MEASURE = "") Then UNIT_OF_MEASURE = 1 '备用量除错
    1 n1 {$ y# A$ o) `- z5 P( Z( H
  39.                 inCollect = False '重置判断变量
    2 ~$ H( c8 s+ s/ u
  40.                 For Each PartinCollect In PartsCollect '判断是否已在遍历清单内
    $ I3 c  W* J. B1 M* D9 j% h
  41.                 If ChildConfString & "@" & ChildName = PartinCollect Then inCollect = True
    # E, L" Y" I8 P+ P& c2 j% }- q- K
  42.                 Next9 R$ i# f( t; X" c
  43.                 If inCollect Then '已在遍历清单内1 s8 w. L) V3 l3 t
  44.                 ht_Qty = ChildModel.CustomInfo2(ChildConfString, CustomInfoQTY) + 1 * UNIT_OF_MEASURE: D$ e3 P2 G' \6 f
  45.                     ChildModel.DeleteCustomInfo2 ChildConfString, CustomInfoQTY
    " X) C2 p" j% [
  46.                     ChildModel.AddCustomInfo3 ChildConfString, CustomInfoQTY, 30, ht_Qty
    8 j" \5 d, _  C5 O5 l: N: s& j
  47.                 Else '不在遍历清单内(首次处理). N# _6 R- l3 P7 n. C# A) M
  48.                 ChildModel.DeleteCustomInfo2 ChildConfString, CustomInfoQTY! Q( Q+ W" d! s2 ~2 k$ s
  49.                     ChildModel.AddCustomInfo3 ChildConfString, CustomInfoQTY, 30, UNIT_OF_MEASURE
    4 w, [3 f# s  L9 c8 o
  50.                     InCollectCount = InCollectCount + 1
    ' b* L9 O) l  E6 n" z+ b
  51.                     ReDim Preserve PartsCollect(InCollectCount) '重新定义数组项数(保留内含数据)
    7 b; i% Y- @: L  j& r! u8 x( `  C7 N
  52.                     PartsCollect(InCollectCount - 1) = ChildConfString & "@" & ChildName '加入到遍历清单中5 \- L' e7 \+ V% D7 ?
  53.                     ChildModel.SetUserPreferenceIntegerValue swUnitsMassPropMass, swUnitsMassPropMass_Kilograms '单位设定为kg(可按喜好加入设定)8 V( s) \" }2 i( L8 W7 }
  54.                 End If, [! Z2 F. J. r- T; g% b6 B
  55.             End If) ]& x8 u6 K. v* N! H' u- G. I5 _
  56.             If ChildType = 2 Then5 X4 `9 I& F# g7 M
  57.             SubAsm ChildModel, ChildConfString '如果是装配则向下遍历( q4 @, O  H2 e/ o& A7 E5 y2 o
  58.         End If
    $ E: h0 |4 s3 ~$ z7 \* w
  59.     End If4 K' H2 d- B2 l0 b5 W) \: k. {
  60. Next
    * t+ i- U; j: N" h' s2 A; z
  61. End Function</div><div></div><div></div><div>新建个宏,这个是在其他网站转后修改的,可以对子装配相同零件单台用的统计,数量写入特定配置进,自定义属性是:数量。9 r# ^1 ^& Z8 r+ j/ P/ I) q9 ?, h
  62. </div></div>
复制代码
发表于 2017-2-27 20:55:53 | 显示全部楼层 来自: 中国江苏苏州
bash 发表于 2017-2-27 10:54
% P0 v  j% L6 S果然,2016版的DM API 不再线程安全!* {: s. e1 \" O' X5 L3 E
使用SW2016版本的朋友,请不要使用“线程”,否则会被删除原有属性 ...
  {, Z- S2 j. b3 \
果然如此,谢谢楼主,盼楼主早日更新版本!!
 楼主| 发表于 2017-2-27 10:55:17 | 显示全部楼层 来自: 中国广东佛山
正确的使用办法:先用SW把组件打包一份出来,然后再修改。
 楼主| 发表于 2017-2-27 10:54:45 | 显示全部楼层 来自: 中国广东佛山
果然,2016版的DM API 不再线程安全!) `* z9 o8 _3 |- {
使用SW2016版本的朋友,请不要使用“线程”,否则会被删除原有属性。
4 ]8 B% f) u+ [这个我在下个版本中会修正,自动判断是不是2016版好了!
发表于 2017-2-26 07:41:17 | 显示全部楼层 来自: 中国辽宁丹东
谢谢楼主分享好工具,测试一下,目录在桌面上,对属性没有修改,win7 64位 SW2013 64位
发表于 2017-2-25 22:45:04 | 显示全部楼层 来自: 中国江苏苏州
本帖最后由 wenmk123 于 2017-2-26 20:16 编辑
. h; J2 e& S+ I' J  }
- a( I7 F, o: x( o5 g先谢过楼主,刚刚下载试用了一下,SW2016SP2,装配体的零件数量是对了,但是有个问题,幸亏我打包出来测试,不然问题大了!!就是总装配体的数量是对的,但是却把我所有的自定义属性中的所有设定参数全部删除了,只留下一个数量。麻烦楼主测试一下,如果这个问题不能解决,这个宏是不能用的……谢谢!!
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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