QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 7316|回复: 14
收起左侧

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

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

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

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

x
许久没发过工具了~ 发一个吧~功能:自动计算一个组件中,零件的个数。8 w( j/ K8 P6 ~4 K3 a
注:使用该功能时,请关闭相关的SW文档,最好直接把SW关了!' K( [; e! d2 Q
因为使用的是DM API !有BUG请反映~谢谢!
9 i1 F9 _  R5 B, e5 j
有BUG请反映~4 i5 D% g. _7 J2 w) t6 o+ J9 Q
下载地址, L8 J) {9 O5 w2 Z- }6 g% p# n

( x4 U$ u3 Q; q5 S: C QQ图片20170224164337.png 8 `+ M8 E7 K( \( i  E
9 r: ?/ x5 C3 T3 [- I- P
; q. `9 L2 \5 b

: A, [8 F- X- H9 }
# t8 j$ N% K. R* k
4 k+ X+ \5 B) W7 o9 K6 `' r3 Q0 |4 q% G: `' {+ V: Y% E3 n
发表于 2019-1-27 16:24:41 | 显示全部楼层 来自: 中国广东广州
没有用过不知掉 是否好用
发表于 2019-1-23 09:34:59 | 显示全部楼层 来自: 中国广东佛山
顶一个,下载来备用 了
发表于 2018-10-5 11:50:29 | 显示全部楼层 来自: 中国广东惠州
太好用用了、客户的图纸都没数量、这个正好解决大问题、感谢
发表于 2017-6-3 09:42:54 | 显示全部楼层 来自: 中国浙江宁波

/ B" z1 X& o1 R1 B  ~朋友,此方法可以将单台数量显示出来,有没有好的方法将多台数量显示出来的呢,比如我要做3台,那么单台数量乘以3。。。怎么可以只输入3就可以自动出来多台数量
发表于 2017-4-2 17:20:39 | 显示全部楼层 来自: 中国四川自贡
貌似这个功能没有意义?数量软件自带统计
/ h* ?3 I/ j3 J
发表于 2017-3-29 22:10:12 | 显示全部楼层 来自: 中国广东中山
感谢分享,支持楼主
发表于 2017-3-11 13:34:45 | 显示全部楼层 来自: 中国天津
为什么2014不能用呢
 楼主| 发表于 2017-2-28 08:42:48 | 显示全部楼层 来自: 中国广东佛山

. I' p% p8 r$ w& ~, T谢谢,不过,我这小工具用的不是“在线API”!无参考意义!
" q, ?9 t* e: h, E% c% F" d. {9 }' T下个版本我会把修改的文件锁定在“本目录”,以防某些朋友“不按常规出牌~”。
发表于 2017-2-27 21:57:29 | 显示全部楼层 来自: 中国福建厦门
本帖最后由 fend5566 于 2017-2-27 22:00 编辑 " A$ j$ W8 S. t
  1. <div><div>Dim TopDocPathOnly As String* m/ Y$ I( ?- y) F4 A
  2. Dim PartsCollect() As String '遍历清单+ d7 p/ B8 A) J1 @% T5 d
  3. Dim InCollectCount As Double '遍历清单长度
    ! `/ O+ E' m' a) \# z/ P
  4. Dim CustomInfoQTY As String
    6 k( C* Q; z& Z* |- r1 }$ @

  5. 8 S" l3 X- b! w, M
  6. Sub main()7 w" k9 e" R2 C* [; W4 ?" @
  7. Set swApp = Application.SldWorks '对象. D( X% r: j. u3 k
  8. Set TopDoc = swApp.ActiveDoc '总装对象
    & F# N2 }  c* m4 i, C
  9. If TopDoc.GetType <> 2 Then Exit Sub '不是装配=退出* S+ A4 ]6 v8 ]6 E1 R  X: @) i4 B
  10. TopDocPathSplit = Split(TopDoc.GetPathName, "") '分割
    & ?# i+ R( s! i1 h9 q
  11. TopDocName = TopDocPathSplit(UBound(TopDocPathSplit)) '总装文件名称
    ( y- h; m, A3 u$ A7 f: c1 ]6 z
  12. TopDocName = Left(TopDocName, Len(TopDocName) - 7) '总装文件名称(排除.SLDASM)
      C. l+ W( T1 J; |+ m; [6 v
  13. TopDocPathOnly = TopDocPathSplit(UBound(TopDocPathSplit) - 1) '总装目录名称
    % X) ?$ ]+ G# f! _; l: L
  14. TopConfString = TopDoc.GetActiveConfiguration.Name '总装配置名称1 j- F6 J7 |( m# c
  15. CustomInfoQTY = InputBox("自定义属性名称", "遍历" & TopDocName, "数量") '  可按个人喜好修改预设值
    ; M. g4 b6 H* v
  16. If CustomInfoQTY = "" Then Exit Sub '按下取消离开宏. h8 P0 d. n! o3 E4 O/ X0 D2 D$ E( Y
  17. InCollectCount = 1 '遍历清单长度基数* K: g4 I' q. H% B% ]  {
  18. ReDim PartsCollect(InCollectCount) '定义阵列项数+ [. h3 p. ]4 x
  19. SubAsm TopDoc, TopConfString '遍历8 ?, v6 J8 }5 a0 [
  20. End Sub
    6 m( n/ y; W( O, h& C2 }
  21. & O0 @: z: H* L( f0 M: o
  22. Function SubAsm(AsmDoc, ConfString)9 L$ ?+ y' n$ M+ I% b' G
  23. Set Configuration = AsmDoc.GetConfigurationByName(ConfString)9 p$ B9 Z% r1 D! V  R
  24. Set RootComponent = Configuration.GetRootComponent" o/ P0 ?7 U: P7 K. X
  25. Components = RootComponent.GetChildren& x' n8 Y$ T3 `
  26. For Each Child In Components5 s' A( t- `8 @& {+ [( t6 F
  27.     Set ChildModel = Child.GetModelDoc
    # |% f4 l& z& _5 T4 w* g
  28.     If Not (ChildModel Is Nothing) Then '排除抑制及轻化
    + i$ f. P5 p  h& x/ ?# Z1 H; f  u
  29.     ChildConfString = Child.ReferencedConfiguration '零件配置名称
    1 n" j3 c1 C' [9 o" m; i
  30.         ChildType = ChildModel.GetType- q* M3 w* L/ W- C# S& x
  31.             ChildPathSplit = Split(Child.GetPathName, "") '分割8 X' W) |* {$ Y
  32.             ChildName = ChildPathSplit(UBound(ChildPathSplit)) '零件文件名称5 z( F  j: g8 @% ^# F3 b2 {6 Q4 X
  33.             ChildPathOnly = ChildPathSplit(UBound(ChildPathSplit) - 1) '零件目录名称
    3 f7 [' i- y  V  a( I& Q& c2 ^6 X4 E
  34.             If ChildPathOnly = TopDocPathOnly Then SamePath = True Else SamePath = False '是否在总装目录' E, U) C; r/ Y- S" l/ P; @2 f$ J
  35.             If SamePath And (Not Child.ExcludeFromBOM) And (Not Child.IsEnvelope) Then '跳过:不在总装目录及不包括在材料明细表中及封套 / V; a+ z0 b5 N  p. E6 |
  36.                 UNIT_OF_MEASURE_Name = ChildModel.CustomInfo2(ChildConfString, "UNIT_OF_MEASURE") '备用量属性名称
    8 T  q& r7 T5 K# M: Y  Z
  37.                 UNIT_OF_MEASURE = ChildModel.CustomInfo2(ChildConfString, UNIT_OF_MEASURE_Name) '备用量
    6 h# I  g1 q# Y) O/ q, X. o
  38.                 If (UNIT_OF_MEASURE = 0) Or (UNIT_OF_MEASURE = "") Then UNIT_OF_MEASURE = 1 '备用量除错
    9 O0 B: t% d0 A' n* X. a
  39.                 inCollect = False '重置判断变量
    9 Y% O5 p  X, l( U- f* J7 q
  40.                 For Each PartinCollect In PartsCollect '判断是否已在遍历清单内
    $ c& F9 E3 G- L+ ^6 h: a7 v+ o
  41.                 If ChildConfString & "@" & ChildName = PartinCollect Then inCollect = True
    / M' Q2 s5 s+ Y
  42.                 Next
    2 z2 e9 E8 ]5 N1 k
  43.                 If inCollect Then '已在遍历清单内
    + o  m- B! ]0 M7 ?* Y
  44.                 ht_Qty = ChildModel.CustomInfo2(ChildConfString, CustomInfoQTY) + 1 * UNIT_OF_MEASURE
    * t: V+ \6 z& M* [- @* u
  45.                     ChildModel.DeleteCustomInfo2 ChildConfString, CustomInfoQTY1 c2 c1 ]# a$ p  b
  46.                     ChildModel.AddCustomInfo3 ChildConfString, CustomInfoQTY, 30, ht_Qty' {, p4 w: a$ _! `& B' @
  47.                 Else '不在遍历清单内(首次处理)) s; H  O, B/ w7 t; f0 \" k6 C
  48.                 ChildModel.DeleteCustomInfo2 ChildConfString, CustomInfoQTY
    3 _" D. Q& c$ L' H
  49.                     ChildModel.AddCustomInfo3 ChildConfString, CustomInfoQTY, 30, UNIT_OF_MEASURE+ ?! l( H! g' m' ^# D# ^6 j7 N
  50.                     InCollectCount = InCollectCount + 19 S" o1 w1 B& U( B; H* d3 ~
  51.                     ReDim Preserve PartsCollect(InCollectCount) '重新定义数组项数(保留内含数据)
    / P% Y! z/ z- m: d7 P( {
  52.                     PartsCollect(InCollectCount - 1) = ChildConfString & "@" & ChildName '加入到遍历清单中7 S2 O# f; d  C/ q+ k4 D1 N
  53.                     ChildModel.SetUserPreferenceIntegerValue swUnitsMassPropMass, swUnitsMassPropMass_Kilograms '单位设定为kg(可按喜好加入设定)1 g( P$ {4 J' r$ [5 [
  54.                 End If1 v1 e6 c) z* A' D; j: t& k
  55.             End If
    / C0 V2 Y- H, O! x! U
  56.             If ChildType = 2 Then/ {5 n7 }% T, x! L/ o
  57.             SubAsm ChildModel, ChildConfString '如果是装配则向下遍历
    + X. s5 G& ~0 O# _( T
  58.         End If
    & U# C! Y3 v; g
  59.     End If* y, W8 T( P/ ]7 a6 ?
  60. Next
    1 ~4 l( T( D' n( C9 g. [
  61. End Function</div><div></div><div></div><div>新建个宏,这个是在其他网站转后修改的,可以对子装配相同零件单台用的统计,数量写入特定配置进,自定义属性是:数量。
    : [7 K( g- w0 p3 ^; r" p
  62. </div></div>
复制代码
发表于 2017-2-27 20:55:53 | 显示全部楼层 来自: 中国江苏苏州
bash 发表于 2017-2-27 10:54
/ a) K9 }4 ^& }9 z1 b  |0 h0 f* k  a果然,2016版的DM API 不再线程安全!; d/ a" i( q' n# p. U$ E
使用SW2016版本的朋友,请不要使用“线程”,否则会被删除原有属性 ...

. W  w+ ?6 r! {$ _$ I果然如此,谢谢楼主,盼楼主早日更新版本!!
 楼主| 发表于 2017-2-27 10:55:17 | 显示全部楼层 来自: 中国广东佛山
正确的使用办法:先用SW把组件打包一份出来,然后再修改。
 楼主| 发表于 2017-2-27 10:54:45 | 显示全部楼层 来自: 中国广东佛山
果然,2016版的DM API 不再线程安全!
' m. a& y( b$ `( y) C4 v& V使用SW2016版本的朋友,请不要使用“线程”,否则会被删除原有属性。/ L7 Z( R, f( G* |3 V8 g
这个我在下个版本中会修正,自动判断是不是2016版好了!
发表于 2017-2-26 07:41:17 | 显示全部楼层 来自: 中国辽宁丹东
谢谢楼主分享好工具,测试一下,目录在桌面上,对属性没有修改,win7 64位 SW2013 64位
发表于 2017-2-25 22:45:04 | 显示全部楼层 来自: 中国江苏苏州
本帖最后由 wenmk123 于 2017-2-26 20:16 编辑
* S  p3 p1 P: E/ j- d% p* L, J. ^- ^
先谢过楼主,刚刚下载试用了一下,SW2016SP2,装配体的零件数量是对了,但是有个问题,幸亏我打包出来测试,不然问题大了!!就是总装配体的数量是对的,但是却把我所有的自定义属性中的所有设定参数全部删除了,只留下一个数量。麻烦楼主测试一下,如果这个问题不能解决,这个宏是不能用的……谢谢!!
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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