QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 7312|回复: 14
收起左侧

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

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

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

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

x
许久没发过工具了~ 发一个吧~功能:自动计算一个组件中,零件的个数。- y* R7 K+ _+ ]4 Q
注:使用该功能时,请关闭相关的SW文档,最好直接把SW关了!+ o4 [2 x5 C2 R! U# @1 Q' L
因为使用的是DM API !有BUG请反映~谢谢!
" }0 W0 |- V, Q$ R/ h9 C) U/ _
有BUG请反映~. s* W* H" m: y! p" |# y7 V, w
下载地址
+ h& \2 q/ O5 i* N: Y3 _& H( u  Y  H" Z% Q# G
QQ图片20170224164337.png   k& o2 S' p& I- Y" T( H

' z8 d5 l+ {  g0 w
. ^5 n) }. v* v5 {6 O& B% B) s7 ?7 p
1 c' t- v) S2 E' C! |  U+ k

* V) z9 M8 j( q5 I& l$ K9 y- I2 M% {: c) A7 V
发表于 2019-1-27 16:24:41 | 显示全部楼层 来自: 中国广东广州
没有用过不知掉 是否好用
发表于 2019-1-23 09:34:59 | 显示全部楼层 来自: 中国广东佛山
顶一个,下载来备用 了
发表于 2018-10-5 11:50:29 | 显示全部楼层 来自: 中国广东惠州
太好用用了、客户的图纸都没数量、这个正好解决大问题、感谢
发表于 2017-6-3 09:42:54 | 显示全部楼层 来自: 中国浙江宁波

0 i# }9 U5 ^' ?8 D( Z2 o6 H朋友,此方法可以将单台数量显示出来,有没有好的方法将多台数量显示出来的呢,比如我要做3台,那么单台数量乘以3。。。怎么可以只输入3就可以自动出来多台数量
发表于 2017-4-2 17:20:39 | 显示全部楼层 来自: 中国四川自贡
貌似这个功能没有意义?数量软件自带统计
+ ~& u4 J# g- S' h; {, N( {
发表于 2017-3-29 22:10:12 | 显示全部楼层 来自: 中国广东中山
感谢分享,支持楼主
发表于 2017-3-11 13:34:45 | 显示全部楼层 来自: 中国天津
为什么2014不能用呢
 楼主| 发表于 2017-2-28 08:42:48 | 显示全部楼层 来自: 中国广东佛山
0 N& I. P( ^1 k' T( V9 b
谢谢,不过,我这小工具用的不是“在线API”!无参考意义!
7 B3 R8 w/ |2 s4 N3 \! t6 p. W) i' u下个版本我会把修改的文件锁定在“本目录”,以防某些朋友“不按常规出牌~”。
发表于 2017-2-27 21:57:29 | 显示全部楼层 来自: 中国福建厦门
本帖最后由 fend5566 于 2017-2-27 22:00 编辑 9 B0 e" @+ R# z. |
  1. <div><div>Dim TopDocPathOnly As String% K$ d+ Q2 s% B7 ?
  2. Dim PartsCollect() As String '遍历清单
    * `1 @- V0 m6 [% q5 [7 R( F8 o6 g
  3. Dim InCollectCount As Double '遍历清单长度
    ' y+ M0 }4 ]% P
  4. Dim CustomInfoQTY As String
    3 @" x- A/ s1 A/ X

  5. + \8 C- M, t9 O  E; A4 ]$ n: @
  6. Sub main()
    , F0 L5 o+ W" S6 F8 D/ [
  7. Set swApp = Application.SldWorks '对象
    3 J: g. k/ @3 b) e1 E
  8. Set TopDoc = swApp.ActiveDoc '总装对象
    - @+ O% M# p2 J" p) n
  9. If TopDoc.GetType <> 2 Then Exit Sub '不是装配=退出
    . n4 b8 g( u9 G! f! C6 h1 N
  10. TopDocPathSplit = Split(TopDoc.GetPathName, "") '分割3 n4 O3 }* Z5 a) v1 D: F( {# t
  11. TopDocName = TopDocPathSplit(UBound(TopDocPathSplit)) '总装文件名称
    3 q4 J  E3 ~2 w' B  ^& }$ e
  12. TopDocName = Left(TopDocName, Len(TopDocName) - 7) '总装文件名称(排除.SLDASM)
    + j- w1 e+ D! |; [6 r: |# b6 ]
  13. TopDocPathOnly = TopDocPathSplit(UBound(TopDocPathSplit) - 1) '总装目录名称1 H% N) n# n* R
  14. TopConfString = TopDoc.GetActiveConfiguration.Name '总装配置名称
    * z# J) o* Z/ n5 P* v
  15. CustomInfoQTY = InputBox("自定义属性名称", "遍历" & TopDocName, "数量") '  可按个人喜好修改预设值$ M; V  y. ?) C6 N
  16. If CustomInfoQTY = "" Then Exit Sub '按下取消离开宏/ A' F7 |- `! E4 ~7 {0 ^6 z
  17. InCollectCount = 1 '遍历清单长度基数
    6 l$ S/ \" P( ^9 o5 A! p
  18. ReDim PartsCollect(InCollectCount) '定义阵列项数2 Y2 o7 Q) k; T) s! N. g$ N& u
  19. SubAsm TopDoc, TopConfString '遍历
    . Y$ J- Y$ c: G8 O& H; v
  20. End Sub
    " C& b4 C, W2 s7 d

  21. 3 K) {. w* H9 R7 g, ?& Y) t
  22. Function SubAsm(AsmDoc, ConfString)+ I9 {' b( w+ x8 S
  23. Set Configuration = AsmDoc.GetConfigurationByName(ConfString)" T+ M! \4 S& l/ F! ^( [$ `
  24. Set RootComponent = Configuration.GetRootComponent3 X- I" c$ K, A) w4 C
  25. Components = RootComponent.GetChildren& a$ p, g3 m# _/ `( v
  26. For Each Child In Components
    * }/ O* j3 T# d+ @, i/ `$ t) v- p
  27.     Set ChildModel = Child.GetModelDoc/ g; F* X+ u. k' M
  28.     If Not (ChildModel Is Nothing) Then '排除抑制及轻化
    & ~% {3 R2 C: h. P# @% w; `3 k9 J* b
  29.     ChildConfString = Child.ReferencedConfiguration '零件配置名称
    - G# J  U0 ?& G9 E& E/ L  R4 H0 ?
  30.         ChildType = ChildModel.GetType
    3 n) D$ A& b7 y( M1 D
  31.             ChildPathSplit = Split(Child.GetPathName, "") '分割
    . Y" D% s- r7 A
  32.             ChildName = ChildPathSplit(UBound(ChildPathSplit)) '零件文件名称
    0 d! }$ P1 H9 S3 K* q, {- ?; t
  33.             ChildPathOnly = ChildPathSplit(UBound(ChildPathSplit) - 1) '零件目录名称9 I0 G" |1 Z/ ^7 [% k! T" }
  34.             If ChildPathOnly = TopDocPathOnly Then SamePath = True Else SamePath = False '是否在总装目录
    - J) c1 i, x, G6 D5 H" V4 @
  35.             If SamePath And (Not Child.ExcludeFromBOM) And (Not Child.IsEnvelope) Then '跳过:不在总装目录及不包括在材料明细表中及封套 : h6 y* h1 Y4 C9 F  s
  36.                 UNIT_OF_MEASURE_Name = ChildModel.CustomInfo2(ChildConfString, "UNIT_OF_MEASURE") '备用量属性名称
    ; J: {8 d( f  L8 U- p
  37.                 UNIT_OF_MEASURE = ChildModel.CustomInfo2(ChildConfString, UNIT_OF_MEASURE_Name) '备用量
    " B8 E2 o  A% x) F# G1 z
  38.                 If (UNIT_OF_MEASURE = 0) Or (UNIT_OF_MEASURE = "") Then UNIT_OF_MEASURE = 1 '备用量除错9 A- v9 ?8 O/ n, u
  39.                 inCollect = False '重置判断变量
    . R: c7 ?! y& o0 }8 z6 T
  40.                 For Each PartinCollect In PartsCollect '判断是否已在遍历清单内4 }0 p  J7 q; M+ z; g( L- j
  41.                 If ChildConfString & "@" & ChildName = PartinCollect Then inCollect = True+ N3 G" P. v& Y: U# F
  42.                 Next
    . h1 a! X1 F; K" v$ N/ j  g- R/ C
  43.                 If inCollect Then '已在遍历清单内4 E7 K5 A  a, b& M- G
  44.                 ht_Qty = ChildModel.CustomInfo2(ChildConfString, CustomInfoQTY) + 1 * UNIT_OF_MEASURE
    ' b9 i: H3 @0 }0 z4 u' e1 [
  45.                     ChildModel.DeleteCustomInfo2 ChildConfString, CustomInfoQTY
    . k, x% J  R( F" n+ I
  46.                     ChildModel.AddCustomInfo3 ChildConfString, CustomInfoQTY, 30, ht_Qty% l8 y1 l7 @( V6 g
  47.                 Else '不在遍历清单内(首次处理)
    6 c. v9 x- |# d9 ^. {' D* @
  48.                 ChildModel.DeleteCustomInfo2 ChildConfString, CustomInfoQTY' r- r4 }8 U) t' Z" s# I% d9 {
  49.                     ChildModel.AddCustomInfo3 ChildConfString, CustomInfoQTY, 30, UNIT_OF_MEASURE) O3 D( q$ D8 c+ K# H. J
  50.                     InCollectCount = InCollectCount + 1
    & h- @" \) S: b! C
  51.                     ReDim Preserve PartsCollect(InCollectCount) '重新定义数组项数(保留内含数据)
    2 m6 {& x' q1 A* i" }+ g9 o* o
  52.                     PartsCollect(InCollectCount - 1) = ChildConfString & "@" & ChildName '加入到遍历清单中) c/ v1 J' e$ b& G- ~! u% S! M! f
  53.                     ChildModel.SetUserPreferenceIntegerValue swUnitsMassPropMass, swUnitsMassPropMass_Kilograms '单位设定为kg(可按喜好加入设定)+ _0 V( D4 t" |6 \2 |, |4 ]
  54.                 End If6 r2 u- k; s9 v; Q+ K* x
  55.             End If4 O% e( J4 W" J) o6 h5 c& W
  56.             If ChildType = 2 Then3 p2 i6 J& P4 {/ w! r6 {
  57.             SubAsm ChildModel, ChildConfString '如果是装配则向下遍历: w: d/ m. [" g! g* b1 |
  58.         End If
    5 v' `) G. `+ x& `
  59.     End If' z9 F" I4 a9 ~: K0 r$ Q
  60. Next
    : q+ D0 @, A1 J
  61. End Function</div><div></div><div></div><div>新建个宏,这个是在其他网站转后修改的,可以对子装配相同零件单台用的统计,数量写入特定配置进,自定义属性是:数量。: `, e  e& ~; f7 r. N: S8 ^4 y7 T9 ^
  62. </div></div>
复制代码
发表于 2017-2-27 20:55:53 | 显示全部楼层 来自: 中国江苏苏州
bash 发表于 2017-2-27 10:54: J& ?: j5 L/ V* c! v
果然,2016版的DM API 不再线程安全!
) q* d1 Y! \' H使用SW2016版本的朋友,请不要使用“线程”,否则会被删除原有属性 ...

& U- Q: j# q. o果然如此,谢谢楼主,盼楼主早日更新版本!!
 楼主| 发表于 2017-2-27 10:55:17 | 显示全部楼层 来自: 中国广东佛山
正确的使用办法:先用SW把组件打包一份出来,然后再修改。
 楼主| 发表于 2017-2-27 10:54:45 | 显示全部楼层 来自: 中国广东佛山
果然,2016版的DM API 不再线程安全!
& U/ P8 W% ^: J6 s使用SW2016版本的朋友,请不要使用“线程”,否则会被删除原有属性。  A  Y  ]  q! K, d7 U$ {- U3 f' N6 j
这个我在下个版本中会修正,自动判断是不是2016版好了!
发表于 2017-2-26 07:41:17 | 显示全部楼层 来自: 中国辽宁丹东
谢谢楼主分享好工具,测试一下,目录在桌面上,对属性没有修改,win7 64位 SW2013 64位
发表于 2017-2-25 22:45:04 | 显示全部楼层 来自: 中国江苏苏州
本帖最后由 wenmk123 于 2017-2-26 20:16 编辑
; a& V9 K0 P3 _7 q$ C* `2 q# z2 M5 U
先谢过楼主,刚刚下载试用了一下,SW2016SP2,装配体的零件数量是对了,但是有个问题,幸亏我打包出来测试,不然问题大了!!就是总装配体的数量是对的,但是却把我所有的自定义属性中的所有设定参数全部删除了,只留下一个数量。麻烦楼主测试一下,如果这个问题不能解决,这个宏是不能用的……谢谢!!
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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