QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
许久没发过工具了~ 发一个吧~功能:自动计算一个组件中,零件的个数。
$ m% N5 b; w) F2 P& `注:使用该功能时,请关闭相关的SW文档,最好直接把SW关了!
0 e: u+ P' B+ U  n因为使用的是DM API !有BUG请反映~谢谢!
8 ^7 o- R& R; l0 t) i) p! O
有BUG请反映~
- n. D) [, [6 G5 i4 [+ P下载地址- ~+ g8 c; Q/ p- P4 l6 b; [9 p
( z, V$ u' C* p) Z  o5 ]) ]; v
QQ图片20170224164337.png   R+ x* o& D  {! ^7 ^
' d8 M7 B6 [/ H6 k. R

( p3 g* V  m) }! Y0 O, q# F# S: Y4 w# c. Q0 _0 m+ ?5 _

# }; n1 Q! g* k9 H- m) k* U6 m
2 [# p" j& \8 J! ~1 D9 q* Y2 \& z, w7 q8 C( }
发表于 2019-1-27 16:24:41 | 显示全部楼层 来自: 中国广东广州
没有用过不知掉 是否好用
发表于 2019-1-23 09:34:59 | 显示全部楼层 来自: 中国广东佛山
顶一个,下载来备用 了
发表于 2018-10-5 11:50:29 | 显示全部楼层 来自: 中国广东惠州
太好用用了、客户的图纸都没数量、这个正好解决大问题、感谢
发表于 2017-6-3 09:42:54 | 显示全部楼层 来自: 中国浙江宁波

$ ]: X; w9 O& f, F7 x朋友,此方法可以将单台数量显示出来,有没有好的方法将多台数量显示出来的呢,比如我要做3台,那么单台数量乘以3。。。怎么可以只输入3就可以自动出来多台数量
发表于 2017-4-2 17:20:39 | 显示全部楼层 来自: 中国四川自贡
貌似这个功能没有意义?数量软件自带统计3 V: t6 v+ g! \
发表于 2017-3-29 22:10:12 | 显示全部楼层 来自: 中国广东中山
感谢分享,支持楼主
发表于 2017-3-11 13:34:45 | 显示全部楼层 来自: 中国天津
为什么2014不能用呢
 楼主| 发表于 2017-2-28 08:42:48 | 显示全部楼层 来自: 中国广东佛山

) K0 E( O. @8 F$ @* P* O, Y2 p& H谢谢,不过,我这小工具用的不是“在线API”!无参考意义!
6 n+ W* Z4 V0 Q: B- R- R下个版本我会把修改的文件锁定在“本目录”,以防某些朋友“不按常规出牌~”。
发表于 2017-2-27 21:57:29 | 显示全部楼层 来自: 中国福建厦门
本帖最后由 fend5566 于 2017-2-27 22:00 编辑 % ]2 [( B& O5 a3 `7 @
  1. <div><div>Dim TopDocPathOnly As String8 ^& H6 ?5 S0 h2 n/ j! _
  2. Dim PartsCollect() As String '遍历清单( k' R1 @+ z1 Z
  3. Dim InCollectCount As Double '遍历清单长度2 Q( u: f! B' r# t3 V. r. S. _
  4. Dim CustomInfoQTY As String: V, d. q' B" a8 L* }
  5. # B6 {2 B: C; B8 R/ F( q0 U% @8 S
  6. Sub main()
    9 ]* }# `/ O- H+ {
  7. Set swApp = Application.SldWorks '对象
      Z# V8 p0 ]( _: Z' U3 \! n
  8. Set TopDoc = swApp.ActiveDoc '总装对象9 B& @4 C7 n# t0 {
  9. If TopDoc.GetType <> 2 Then Exit Sub '不是装配=退出/ l- q5 e/ k2 O9 M  E
  10. TopDocPathSplit = Split(TopDoc.GetPathName, "") '分割
    ; G2 ^& @2 b/ z# |+ |- g# g0 v
  11. TopDocName = TopDocPathSplit(UBound(TopDocPathSplit)) '总装文件名称
    3 h; {3 Y5 u; t, G
  12. TopDocName = Left(TopDocName, Len(TopDocName) - 7) '总装文件名称(排除.SLDASM)
    7 `! _; r5 E% E2 i$ i6 a5 q
  13. TopDocPathOnly = TopDocPathSplit(UBound(TopDocPathSplit) - 1) '总装目录名称
    6 {/ Z$ i# O& V  t* Z2 w2 I4 c6 E
  14. TopConfString = TopDoc.GetActiveConfiguration.Name '总装配置名称0 j" a1 b9 S+ W1 ^
  15. CustomInfoQTY = InputBox("自定义属性名称", "遍历" & TopDocName, "数量") '  可按个人喜好修改预设值0 y: E  t5 k# W3 z
  16. If CustomInfoQTY = "" Then Exit Sub '按下取消离开宏9 \8 G# l9 }& C
  17. InCollectCount = 1 '遍历清单长度基数
    + s1 ?: _/ j* l# f
  18. ReDim PartsCollect(InCollectCount) '定义阵列项数
    ; y3 ?) Y4 T0 Z" Y
  19. SubAsm TopDoc, TopConfString '遍历
    + @* F; j. u9 W1 G1 j
  20. End Sub1 Z9 e7 g/ Z2 c
  21. 2 ]3 ]3 M7 W& e7 E! t7 h0 W
  22. Function SubAsm(AsmDoc, ConfString)
    1 B  J7 Q. a  r- t7 ^8 N! t
  23. Set Configuration = AsmDoc.GetConfigurationByName(ConfString)8 j- G3 l. p" \: W7 l$ t3 C  k
  24. Set RootComponent = Configuration.GetRootComponent0 h! e, n2 j8 f; {+ A
  25. Components = RootComponent.GetChildren
    ' r- }) I* x& v7 D
  26. For Each Child In Components* v- n2 B4 A" F9 Z1 o- s' v
  27.     Set ChildModel = Child.GetModelDoc( w, R  c, Z- x2 I# S1 Y
  28.     If Not (ChildModel Is Nothing) Then '排除抑制及轻化
    9 e; T' A" t' ^% o5 V
  29.     ChildConfString = Child.ReferencedConfiguration '零件配置名称- i0 a* Y- A/ V% s
  30.         ChildType = ChildModel.GetType
    : o, D4 `, s! [- t/ H
  31.             ChildPathSplit = Split(Child.GetPathName, "") '分割
    ; V- o% `' V2 \2 Q5 u* H1 T2 i* a
  32.             ChildName = ChildPathSplit(UBound(ChildPathSplit)) '零件文件名称& M( I. d* d: p, k+ j
  33.             ChildPathOnly = ChildPathSplit(UBound(ChildPathSplit) - 1) '零件目录名称' r0 F2 p/ g2 }% d2 `
  34.             If ChildPathOnly = TopDocPathOnly Then SamePath = True Else SamePath = False '是否在总装目录
    & M6 |+ y# O" c( ~; g2 c6 F6 I4 }
  35.             If SamePath And (Not Child.ExcludeFromBOM) And (Not Child.IsEnvelope) Then '跳过:不在总装目录及不包括在材料明细表中及封套 ! T/ F. n  {+ H/ E# G1 A
  36.                 UNIT_OF_MEASURE_Name = ChildModel.CustomInfo2(ChildConfString, "UNIT_OF_MEASURE") '备用量属性名称
    2 A6 E% ^$ f" g0 I8 N) _# j% l" E3 c
  37.                 UNIT_OF_MEASURE = ChildModel.CustomInfo2(ChildConfString, UNIT_OF_MEASURE_Name) '备用量2 o* e& Y2 \* S( B2 V
  38.                 If (UNIT_OF_MEASURE = 0) Or (UNIT_OF_MEASURE = "") Then UNIT_OF_MEASURE = 1 '备用量除错
    & y  T+ c$ [. _% c; l7 ~% ?
  39.                 inCollect = False '重置判断变量/ M1 C) S- Q; L8 G
  40.                 For Each PartinCollect In PartsCollect '判断是否已在遍历清单内% m) r7 `4 s6 {7 g7 ?) {5 W9 B
  41.                 If ChildConfString & "@" & ChildName = PartinCollect Then inCollect = True% w4 Y' R1 a4 a
  42.                 Next
    2 b' J6 P( P8 E9 e
  43.                 If inCollect Then '已在遍历清单内; G* a4 E8 L4 e  p- w% \
  44.                 ht_Qty = ChildModel.CustomInfo2(ChildConfString, CustomInfoQTY) + 1 * UNIT_OF_MEASURE
    - W( Y+ n: c- _! X; i
  45.                     ChildModel.DeleteCustomInfo2 ChildConfString, CustomInfoQTY; M  D0 D( W% l) g
  46.                     ChildModel.AddCustomInfo3 ChildConfString, CustomInfoQTY, 30, ht_Qty
    ' u) K0 `4 g% c5 M$ Q( y
  47.                 Else '不在遍历清单内(首次处理)" C( k+ l. @1 o& D
  48.                 ChildModel.DeleteCustomInfo2 ChildConfString, CustomInfoQTY+ I1 |$ c! ~; q% ]+ a) F$ z
  49.                     ChildModel.AddCustomInfo3 ChildConfString, CustomInfoQTY, 30, UNIT_OF_MEASURE
    ! C1 H! S# J: v2 t9 H' x
  50.                     InCollectCount = InCollectCount + 1; \1 }, p1 ?) r4 ?9 \  q
  51.                     ReDim Preserve PartsCollect(InCollectCount) '重新定义数组项数(保留内含数据)$ _! w8 ]9 z; S  _2 G2 u: s* O4 T
  52.                     PartsCollect(InCollectCount - 1) = ChildConfString & "@" & ChildName '加入到遍历清单中4 j; C) G. c9 _# W+ y5 w6 F
  53.                     ChildModel.SetUserPreferenceIntegerValue swUnitsMassPropMass, swUnitsMassPropMass_Kilograms '单位设定为kg(可按喜好加入设定)
    ( o. U! V1 X; D
  54.                 End If# ]6 |* o9 d8 I
  55.             End If
    5 i( t% [! g3 l9 G, v
  56.             If ChildType = 2 Then
    % Z7 b: P. t% U  Q: T+ `) l1 {
  57.             SubAsm ChildModel, ChildConfString '如果是装配则向下遍历' M# w  y$ V0 s" k" m
  58.         End If: |5 J2 X8 B, B& K$ u& ?4 u
  59.     End If9 M0 }  c, C) l9 M+ I. N: J" {
  60. Next
    & m8 k1 {5 x8 R
  61. End Function</div><div></div><div></div><div>新建个宏,这个是在其他网站转后修改的,可以对子装配相同零件单台用的统计,数量写入特定配置进,自定义属性是:数量。( [/ b8 R6 V$ r9 X
  62. </div></div>
复制代码
发表于 2017-2-27 20:55:53 | 显示全部楼层 来自: 中国江苏苏州
bash 发表于 2017-2-27 10:54
5 o* H: J" r- W' r, A& `; F果然,2016版的DM API 不再线程安全!  i7 O! P+ e# W; _' H3 |. o) ]1 [
使用SW2016版本的朋友,请不要使用“线程”,否则会被删除原有属性 ...

# y7 w) O! X' y+ t( o果然如此,谢谢楼主,盼楼主早日更新版本!!
 楼主| 发表于 2017-2-27 10:55:17 | 显示全部楼层 来自: 中国广东佛山
正确的使用办法:先用SW把组件打包一份出来,然后再修改。
 楼主| 发表于 2017-2-27 10:54:45 | 显示全部楼层 来自: 中国广东佛山
果然,2016版的DM API 不再线程安全!
0 u3 Q$ W4 ?/ i/ n4 B4 e) Z使用SW2016版本的朋友,请不要使用“线程”,否则会被删除原有属性。: l# ]$ R/ S% a+ d  `
这个我在下个版本中会修正,自动判断是不是2016版好了!
发表于 2017-2-26 07:41:17 | 显示全部楼层 来自: 中国辽宁丹东
谢谢楼主分享好工具,测试一下,目录在桌面上,对属性没有修改,win7 64位 SW2013 64位
发表于 2017-2-25 22:45:04 | 显示全部楼层 来自: 中国江苏苏州
本帖最后由 wenmk123 于 2017-2-26 20:16 编辑
' F' W3 l7 z: ]6 \: F  R/ y
4 O2 d; l* e( P8 F; x" R先谢过楼主,刚刚下载试用了一下,SW2016SP2,装配体的零件数量是对了,但是有个问题,幸亏我打包出来测试,不然问题大了!!就是总装配体的数量是对的,但是却把我所有的自定义属性中的所有设定参数全部删除了,只留下一个数量。麻烦楼主测试一下,如果这个问题不能解决,这个宏是不能用的……谢谢!!
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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