QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
许久没发过工具了~ 发一个吧~功能:自动计算一个组件中,零件的个数。
6 h* J  ]) h! L注:使用该功能时,请关闭相关的SW文档,最好直接把SW关了!
( W* }0 }3 E. T1 e6 T( O+ W  ]; Y9 t因为使用的是DM API !有BUG请反映~谢谢!
7 L- }+ |. H9 b! F: o
有BUG请反映~( U/ y5 ^2 @( t5 i/ i$ a
下载地址  Y( p- Z+ c2 ]  d6 ^3 W6 k% t
* t* {$ @9 y6 j6 k" M4 a$ Q
QQ图片20170224164337.png 1 \, Q7 H: s3 G4 P
& r" K6 b" |! x+ }* N
& k* B$ C! {, G1 f: j

( N8 ~, B8 j: S! X. |& r' n$ d& X9 s6 M5 Z) m, I
9 i' l) `3 i1 y$ E  y& Q

3 D7 y! U/ Y2 K) ]8 X+ a1 y" L( K7 T
发表于 2019-1-27 16:24:41 | 显示全部楼层 来自: 中国广东广州
没有用过不知掉 是否好用
发表于 2019-1-23 09:34:59 | 显示全部楼层 来自: 中国广东佛山
顶一个,下载来备用 了
发表于 2018-10-5 11:50:29 | 显示全部楼层 来自: 中国广东惠州
太好用用了、客户的图纸都没数量、这个正好解决大问题、感谢
发表于 2017-6-3 09:42:54 | 显示全部楼层 来自: 中国浙江宁波

% z- F/ M  v2 A, f. C  s朋友,此方法可以将单台数量显示出来,有没有好的方法将多台数量显示出来的呢,比如我要做3台,那么单台数量乘以3。。。怎么可以只输入3就可以自动出来多台数量
发表于 2017-4-2 17:20:39 | 显示全部楼层 来自: 中国四川自贡
貌似这个功能没有意义?数量软件自带统计* y  Z: ?& S) ?+ S; J* D* H& C
发表于 2017-3-29 22:10:12 | 显示全部楼层 来自: 中国广东中山
感谢分享,支持楼主
发表于 2017-3-11 13:34:45 | 显示全部楼层 来自: 中国天津
为什么2014不能用呢
 楼主| 发表于 2017-2-28 08:42:48 | 显示全部楼层 来自: 中国广东佛山

* ]. e- E/ _3 N: X" h6 ]/ B谢谢,不过,我这小工具用的不是“在线API”!无参考意义!
1 i8 l. E3 t9 v! V( r下个版本我会把修改的文件锁定在“本目录”,以防某些朋友“不按常规出牌~”。
发表于 2017-2-27 21:57:29 | 显示全部楼层 来自: 中国福建厦门
本帖最后由 fend5566 于 2017-2-27 22:00 编辑 ! o: M* p6 J# A- u* s
  1. <div><div>Dim TopDocPathOnly As String  v6 G; U/ r- ^) F2 U' ~$ S
  2. Dim PartsCollect() As String '遍历清单$ ]' h3 z$ E' R* }! Q2 y# X
  3. Dim InCollectCount As Double '遍历清单长度
    / K. _( Z) E3 `7 G$ d8 X
  4. Dim CustomInfoQTY As String
    $ Z. ~9 Z( O. G' r1 U! h

  5. 7 d! C% b  W4 q4 f# F4 k6 B9 x
  6. Sub main()
    ! z9 y% v* g9 ^+ @2 Q3 p
  7. Set swApp = Application.SldWorks '对象
    3 W6 s- R1 y1 e0 \4 X8 i2 l' `
  8. Set TopDoc = swApp.ActiveDoc '总装对象" v; D/ G1 p7 \' l( w
  9. If TopDoc.GetType <> 2 Then Exit Sub '不是装配=退出
    ; |2 v4 G' T, r$ A# k
  10. TopDocPathSplit = Split(TopDoc.GetPathName, "") '分割0 ]7 |; l: n! p- \. j* t: b; Q
  11. TopDocName = TopDocPathSplit(UBound(TopDocPathSplit)) '总装文件名称- O+ t3 N5 [! I; b
  12. TopDocName = Left(TopDocName, Len(TopDocName) - 7) '总装文件名称(排除.SLDASM). G: ]4 M, Z/ U( `7 Q' E  `* I
  13. TopDocPathOnly = TopDocPathSplit(UBound(TopDocPathSplit) - 1) '总装目录名称
    ; I! A3 |) R  M: V7 y9 v. w' K
  14. TopConfString = TopDoc.GetActiveConfiguration.Name '总装配置名称7 A/ Q/ ~6 o$ G0 T8 |& L9 S
  15. CustomInfoQTY = InputBox("自定义属性名称", "遍历" & TopDocName, "数量") '  可按个人喜好修改预设值
    3 H: D! t5 \5 v# n: B3 G! Y
  16. If CustomInfoQTY = "" Then Exit Sub '按下取消离开宏
    ; [7 k# }! n& C' a
  17. InCollectCount = 1 '遍历清单长度基数
    $ ], i6 H3 V, L6 [2 I4 a+ F
  18. ReDim PartsCollect(InCollectCount) '定义阵列项数
    7 j2 ]8 b1 o0 i* S2 j
  19. SubAsm TopDoc, TopConfString '遍历( e5 Q, I3 L5 K3 K* W. ~' X" N
  20. End Sub# _" P6 }- C' m
  21. % G4 `1 Z# K$ I9 J
  22. Function SubAsm(AsmDoc, ConfString)
    ! E8 {3 K+ R. s' B4 ]0 c. R
  23. Set Configuration = AsmDoc.GetConfigurationByName(ConfString)8 v$ i: ^* P8 F8 D% ~* v
  24. Set RootComponent = Configuration.GetRootComponent
    ) k% D' t9 M1 a4 I3 {
  25. Components = RootComponent.GetChildren$ e- u! V  }- I# r% f& P( J0 l4 S( N
  26. For Each Child In Components
    ' W/ L& j3 w, r  h, ]: T( h" ~
  27.     Set ChildModel = Child.GetModelDoc
    - H0 B( r* F2 x
  28.     If Not (ChildModel Is Nothing) Then '排除抑制及轻化
    0 M5 f" x6 V7 t& C
  29.     ChildConfString = Child.ReferencedConfiguration '零件配置名称: Z& A% w( b+ d) ?6 C! M
  30.         ChildType = ChildModel.GetType
    2 B- t7 p/ t$ t/ B: i6 w! P
  31.             ChildPathSplit = Split(Child.GetPathName, "") '分割
    ' \( ?, p+ s+ D2 K* {8 m4 _
  32.             ChildName = ChildPathSplit(UBound(ChildPathSplit)) '零件文件名称
    . `5 g; y# i& v7 E, f
  33.             ChildPathOnly = ChildPathSplit(UBound(ChildPathSplit) - 1) '零件目录名称% P% O* P1 J. M# Z! L
  34.             If ChildPathOnly = TopDocPathOnly Then SamePath = True Else SamePath = False '是否在总装目录- l* l2 B: }7 {: Y$ l
  35.             If SamePath And (Not Child.ExcludeFromBOM) And (Not Child.IsEnvelope) Then '跳过:不在总装目录及不包括在材料明细表中及封套 
    % o% A( R5 \/ k; i( i; E
  36.                 UNIT_OF_MEASURE_Name = ChildModel.CustomInfo2(ChildConfString, "UNIT_OF_MEASURE") '备用量属性名称- P1 \9 c( e7 U0 Q/ ^! T0 r
  37.                 UNIT_OF_MEASURE = ChildModel.CustomInfo2(ChildConfString, UNIT_OF_MEASURE_Name) '备用量
    ( }7 w; u! W* e
  38.                 If (UNIT_OF_MEASURE = 0) Or (UNIT_OF_MEASURE = "") Then UNIT_OF_MEASURE = 1 '备用量除错
    ! L& o8 h& J' a! \2 t3 D
  39.                 inCollect = False '重置判断变量: X, l9 I, g4 A1 o$ V3 n4 f6 S3 i
  40.                 For Each PartinCollect In PartsCollect '判断是否已在遍历清单内4 {+ R7 @: U" c3 ]3 _
  41.                 If ChildConfString & "@" & ChildName = PartinCollect Then inCollect = True
    2 P8 P; j* d1 V6 J
  42.                 Next0 h- }9 j) C$ h8 K# D, V) O8 P
  43.                 If inCollect Then '已在遍历清单内# f2 n" ?. N) r4 ?4 X, E: N. a
  44.                 ht_Qty = ChildModel.CustomInfo2(ChildConfString, CustomInfoQTY) + 1 * UNIT_OF_MEASURE6 Z: ?" v3 H- D" _
  45.                     ChildModel.DeleteCustomInfo2 ChildConfString, CustomInfoQTY
    3 R% G: n" z) L' m# u2 ^1 d  b
  46.                     ChildModel.AddCustomInfo3 ChildConfString, CustomInfoQTY, 30, ht_Qty5 Z/ D% v8 x# [
  47.                 Else '不在遍历清单内(首次处理)
      c8 Y4 M0 t5 e5 ~
  48.                 ChildModel.DeleteCustomInfo2 ChildConfString, CustomInfoQTY
    1 x% B+ O7 f1 e9 _
  49.                     ChildModel.AddCustomInfo3 ChildConfString, CustomInfoQTY, 30, UNIT_OF_MEASURE
      ~; i. V8 P0 i1 N3 P
  50.                     InCollectCount = InCollectCount + 17 L3 ?' h  I1 D! {  h" u& I
  51.                     ReDim Preserve PartsCollect(InCollectCount) '重新定义数组项数(保留内含数据)
    , c' [# U. G  m8 [9 d0 \* P
  52.                     PartsCollect(InCollectCount - 1) = ChildConfString & "@" & ChildName '加入到遍历清单中
    ; S! K/ e+ y, {5 c4 S( @" {
  53.                     ChildModel.SetUserPreferenceIntegerValue swUnitsMassPropMass, swUnitsMassPropMass_Kilograms '单位设定为kg(可按喜好加入设定)* D! j% H, g! |0 ~" R5 x4 R
  54.                 End If  F+ k+ m9 ^+ U7 z/ o' A* I
  55.             End If
    3 O6 A7 X7 F7 i# C6 f
  56.             If ChildType = 2 Then
    + `3 p8 B( J. d
  57.             SubAsm ChildModel, ChildConfString '如果是装配则向下遍历( q0 U1 F2 e9 s5 K" E2 r, K
  58.         End If8 J2 r. B0 }* D7 M$ `# J
  59.     End If
    2 E9 E  g/ E6 F
  60. Next( v6 U# g0 j7 P/ c5 k: F
  61. End Function</div><div></div><div></div><div>新建个宏,这个是在其他网站转后修改的,可以对子装配相同零件单台用的统计,数量写入特定配置进,自定义属性是:数量。
    ! \8 W8 `! p* w5 J* O* I
  62. </div></div>
复制代码
发表于 2017-2-27 20:55:53 | 显示全部楼层 来自: 中国江苏苏州
bash 发表于 2017-2-27 10:54$ a' j% A- \; ^$ r$ G! h8 o% h8 O
果然,2016版的DM API 不再线程安全!
; S8 [, ]" b5 ~使用SW2016版本的朋友,请不要使用“线程”,否则会被删除原有属性 ...
! V1 f% a4 H4 ?4 ?  d4 n) O
果然如此,谢谢楼主,盼楼主早日更新版本!!
 楼主| 发表于 2017-2-27 10:55:17 | 显示全部楼层 来自: 中国广东佛山
正确的使用办法:先用SW把组件打包一份出来,然后再修改。
 楼主| 发表于 2017-2-27 10:54:45 | 显示全部楼层 来自: 中国广东佛山
果然,2016版的DM API 不再线程安全!+ q; C! r- o2 j% b& ~
使用SW2016版本的朋友,请不要使用“线程”,否则会被删除原有属性。7 F$ e- c& b& A0 |$ _
这个我在下个版本中会修正,自动判断是不是2016版好了!
发表于 2017-2-26 07:41:17 | 显示全部楼层 来自: 中国辽宁丹东
谢谢楼主分享好工具,测试一下,目录在桌面上,对属性没有修改,win7 64位 SW2013 64位
发表于 2017-2-25 22:45:04 | 显示全部楼层 来自: 中国江苏苏州
本帖最后由 wenmk123 于 2017-2-26 20:16 编辑
: |+ Q2 `" _3 V" m9 u0 b
7 ]/ M9 U7 h: D2 D1 g先谢过楼主,刚刚下载试用了一下,SW2016SP2,装配体的零件数量是对了,但是有个问题,幸亏我打包出来测试,不然问题大了!!就是总装配体的数量是对的,但是却把我所有的自定义属性中的所有设定参数全部删除了,只留下一个数量。麻烦楼主测试一下,如果这个问题不能解决,这个宏是不能用的……谢谢!!
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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