机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 李邈

SW宏-零件数量自动写入自定义属性表

[复制链接]
 楼主| 发表于 2024-9-7 09:38:50 | 显示全部楼层
本帖最后由 李邈 于 2024-9-7 09:41 编辑   Z/ O2 r, t- G
sycfj 发表于 2024-9-7 09:27
) U6 m( J! b/ E0 A  t% o/ [1 q/ g: K能详细说明怎么使用吗?我在装配体中使用这个宏以后,工程图中不会出现数量

- @& m' ]! F# a8 v" Uhttps://baijiahao.baidu.com/s?id=1796657905732909661&wfr=spider&for=pc! D+ _7 F! Y" j0 E, N
按照这个方法设置,他链接的是仓库 你连接数量那一栏就行了  O& v8 l) j- P4 `/ X5 z: n
设置好之后,把工程图文件另存为工程图模板,删掉上面的视图,下次新建就会直接出现/ j- H0 i* X/ o) A. ^) S! m3 U
以前出的工程图,用批量替换模板的工具,全部替换成新的工程图模板就好啦$ _" u- a5 C, ?& `  F% Y7 R+ T. q
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-9-7 09:40:02 | 显示全部楼层
sycfj 发表于 2024-9-7 09:36' f" p0 K0 M$ U" R+ t
也就是说零件模板中要自定义属性 数量
3 s" f% H1 D- ]9 x- ]
这个宏会在每个零件体里添加了自定义属性数量这一栏,并且把数量填好了
; d& G% t! J* W6 f你只要工程图去连接就行了7 X$ ?3 v$ W* \5 f2 M
回复 支持 反对

使用道具 举报

发表于 2024-9-7 14:50:39 | 显示全部楼层
李邈 发表于 2024-9-7 09:25
# \" `' q0 u; |1 E装配体中使用
3 _5 m$ a& r( T" L8 x' A) R1 P" ^
还是不会用,加个微sycfj2
$ O2 I! p& O2 l3 T2 \2 _% p% t

点评

加了  发表于 2024-9-7 14:51
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-7 15:22:48 | 显示全部楼层
Type BomPosition
4 t' w  I& i* N# A$ p1 ~  `4 v  T    model As SldWorks.ModelDoc22 }& I) ?; g% V1 l
    Configuration As String
8 L4 }; G# ]6 l. B3 u' s    Quantity As Double6 w7 }* w( s) k, r' x* A
End Type+ T5 Z# y) x! Z6 ?

8 w% Y8 W/ @8 }8 J5 O/ aConst PRP_NAME As String = "数量"
* @+ i; d! J% c# h( W0 m/ jConst MERGE_CONFIGURATIONS As Boolean = True4 L: ?! l# U" p- P, ?+ d
Const INCLUDE_BOM_EXCLUDED As Boolean = False
. C; y0 V& _$ @" a1 U# T5 W
. ^* n9 J5 n# a" \9 |2 EDim swApp As SldWorks.SldWorks) H2 m7 a5 n5 {4 P% J. `- c
Sub main()
3 Q! a- W4 w( ]# G: B7 O6 X2 G6 V    Set swApp = Application.SldWorks
* d' j6 F/ f" e5 stry_:
( u( g+ ]$ B( K- ?) I8 j* V* F    On Error GoTo catch_4 G+ f  ~: j, I( n: I
    Dim swAssy As SldWorks.AssemblyDoc6 b" M% b4 q3 y2 A6 \! e6 ]5 [
    Set swAssy = swApp.ActiveDoc
7 r8 m; C3 k5 v% s: F( k0 o    If swAssy Is Nothing Then) b" O) P" h: Z/ l
        Err.Raise vbError, "", "Assembly is not opened"
, W# B+ m7 _  ~7 E0 ^- N    End If
6 r$ [0 H0 y3 L" g% _    swAssy.ResolveAllLightWeightComponents True
0 n1 z2 D9 G9 l2 ^) c3 l/ ^1 P  i. Y    Dim swConf As SldWorks.Configuration
1 G6 x( U* \, T$ s$ J    Set swConf = swAssy.ConfigurationManager.ActiveConfiguration
+ f: E4 `% z' ]6 h6 `1 Y' M    Dim bom() As BomPosition
% W' G1 u* ?4 I% s5 k1 H    ComposeFlatBom swConf.GetRootComponent3(True), bom+ n1 ?' N. a; L2 `
    If (Not bom) <> -1 Then5 m6 H$ j- k. H6 E7 W
        WriteBomQuantities bom& e0 ?" C8 v+ }, }3 h# s
    End If) A" \. n6 h3 q; O
    GoTo finally_; Q# T. ^# H% n, r7 m+ C/ B. r
catch_:
, D, m9 z" ~$ t, ~. B    MsgBox Err.Description, vbCritical, "Count Components"* s' t# Y+ u3 g8 w9 y
finally_:" ?, L( ^' b! E: N# H- B
End Sub" C8 k& d: G  ~" l3 p5 a$ O% x
( C' ?' C( ~  T$ A1 D
Sub ComposeFlatBom(swParentComp As SldWorks.Component2, bom() As BomPosition)* _, l0 w- l9 w
    Dim vComps As Variant
+ Z+ {& }* e6 r& S    vComps = swParentComp.GetChildren
& a0 v0 X4 ~/ [( J& ]6 C5 I% a8 P% V    If Not IsEmpty(vComps) Then$ b* A. H" a  t* u  c* W9 H
        Dim i As Integer
% t) ^2 }$ H/ ^) q# y$ A; E' m        For i = 0 To UBound(vComps); s  o" x6 u! }  \  S8 m. ^# @. R$ t
            Dim swComp As SldWorks.Component2
1 g( N/ \  {, I  W  Y            Set swComp = vComps(i)
6 L* Q2 [& n# s6 V            If swComp.GetSuppression() <> swComponentSuppressionState_e.swComponentSuppressed And (False = swComp.ExcludeFromBOM Or INCLUDE_BOM_EXCLUDED) Then
6 F5 f4 A- u5 H6 ^/ C7 K2 I+ G' C                Dim swRefModel As SldWorks.ModelDoc27 I& B7 j7 p+ Q& r4 @! u0 _. j
                Set swRefModel = swComp.GetModelDoc2()
! A& X( b) j+ F                If swRefModel Is Nothing Then  C! W1 C0 S  u  s
                    Err.Raise vbError, "", swComp.GetPathName() & " model is not loaded"2 u: D2 N5 T9 b
                End If
% w1 L3 b8 G% q2 i$ i                Dim swRefConf As SldWorks.Configuration9 |( s  M/ `6 K. p) }1 s
                Set swRefConf = swRefModel.GetConfigurationByName(swComp.ReferencedConfiguration)- r7 d1 N" f! @. c
                Dim bomChildType As Integer
& E1 _) h! m- x% R                bomChildType = swRefConf.ChildComponentDisplayInBOM
* \. x$ S* H* q# g                If bomChildType <> swChildComponentInBOMOption_e.swChildComponent_Promote Then
8 A5 L+ A# {8 ]                    Dim bomPos As Integer
9 X. Z' }( z0 \% j% Q6 T$ C# r6 W                    bomPos = FindBomPosition(bom, swComp)
7 T) ~0 m! X) S! N5 Z4 x* G                    If bomPos = -1 Then8 o9 C  o* z' F6 I  K2 z
                        If (Not bom) = -1 Then
/ W/ N) J% q' I  r# ]                            ReDim bom(0), w7 w$ c7 J$ E
                        Else/ y& D! l' h) ~$ m  I. x7 }
                            ReDim Preserve bom(UBound(bom) + 1)
( D2 L5 c3 R0 q( p# `# \                        End If* w: c$ z  [0 r& M
                        bomPos = UBound(bom)' E% \" b0 L# C# Y$ C
                        Dim refConfName As String. {. ~' Y' `3 d' O) X1 @2 p
                        If MERGE_CONFIGURATIONS Then  b, V+ T, Z; B$ j( D
                            refConfName = ""* N  s/ J, x. S4 ?/ B& A
                        Else2 ^9 u& s& d. ?% ~3 K
                            refConfName = swComp.ReferencedConfiguration2 v7 w' Q; R( d% W" A/ G- c& ~. f
                        End If' k; _, `$ d( W5 L+ z  ?" O8 Y
                        Set bom(bomPos).model = swRefModel
# J0 c+ K. {% \4 ]                        bom(bomPos).Configuration = refConfName
: N$ s" Q8 j* p) ]                        bom(bomPos).Quantity = GetQuantity(swComp)' ?, b: B  s2 O% v9 u! @) V9 H
                    Else
! w3 T7 F, ~+ ^% X/ f                        bom(bomPos).Quantity = bom(bomPos).Quantity + GetQuantity(swComp)
) K) j# |8 j9 e7 _                    End If
* ]2 t0 _( V2 m                End If
' ]$ P/ }$ ]0 p, c5 T3 |; d' N                If bomChildType <> swChildComponentInBOMOption_e.swChildComponent_Hide Then; T  w: N9 @" J
                    ComposeFlatBom swComp, bom
0 t: I9 i+ D# [                End If2 {2 M  c+ n/ I: I
            End If) k4 a3 F3 E' h* S8 r# S1 V
        Next
2 x2 y+ |" B% E* l( q    End If& m' M+ o* {! |4 L9 {
End Sub
+ l# B3 ]% |6 l# Q: u
2 R6 p! \/ F2 Q$ z6 {% ^Function FindBomPosition(bom() As BomPosition, comp As SldWorks.Component2) As Integer7 s' @: f2 u! A7 z/ `
    FindBomPosition = -1' j  M4 C6 U! B5 R, g- j) W
    Dim i As Integer- s9 e: z& {& z6 Y, A. U8 p7 q$ c5 w
    If (Not bom) <> -1 Then2 L2 V( w5 w1 O4 o) O8 h. O
        Dim refConfName As String0 n2 |' p. [  V* u
        If MERGE_CONFIGURATIONS Then
; X' W5 k, S% N3 E7 C" U  ^            refConfName = ""& v; o7 k  `! H& D; [! Y
        Else
9 G( L, i( ?$ w9 ~+ O0 F% ^            refConfName = comp.ReferencedConfiguration0 ^7 G- U1 c7 w3 q+ S* t% g1 ?8 _
        End If
$ n3 l6 `$ X3 f( Q        For i = 0 To UBound(bom)
& L5 c0 \" E( c( f# F* T            If LCase(bom(i).model.GetPathName()) = LCase(comp.GetPathName()) And LCase(bom(i).Configuration) = LCase(refConfName) Then/ @& g4 V/ ?9 n! Q- R
                FindBomPosition = i. p/ J/ q2 b5 i& [" l5 z: C# ?& v: ]
                Exit Function. g3 |, u, S: e9 P" L5 y/ I
            End If: ~+ U5 p" P9 N% V; c( f% u
        Next
# j; S0 E/ X, q0 \3 p    End If8 [4 W: i) S9 M" r% g$ b. z5 E6 h: P! I
End Function, S' i2 S" ?1 N5 s  c" D1 s

9 o" n1 L) D+ w" d% z4 FFunction GetQuantity(comp As SldWorks.Component2) As Double2 T' ?4 p. ]9 \! y$ @
On Error GoTo err_
0 V! M. m1 Y7 ?    Dim refModel As SldWorks.ModelDoc2/ T( G) z* a' c4 @, O' B
    Set refModel = comp.GetModelDoc2
1 H1 m) V- z+ H, Q6 U2 N    Dim qtyPrpName As String
7 ]0 Y- v. R2 M- r    qtyPrpName = GetPropertyValue(refModel, comp.ReferencedConfiguration, "UNIT_OF_MEASURE")
, M5 j: u: D, p  ]% e' I/ d    If qtyPrpName <> "" Then! y+ L4 N% d4 v
        GetQuantity = CDbl(GetPropertyValue(refModel, comp.ReferencedConfiguration, qtyPrpName))$ S6 w" Y% S" H! w' O: d- G
    Else! {( Z9 N3 J* e4 l) d: t6 `
        GetQuantity = 1
' l- ]) J3 w, [- f% v) V$ u0 L    End If
, o* z& U2 o: n, b9 e3 Q3 E    Exit Function1 Y  W( N7 A8 b# k5 n
err_:
  ^' J5 G* U; t    Debug.Print "Failed to extract quantity of " & comp.Name2 & ": " & Err.Description
) q! o- {3 N7 g. `/ q0 Z6 O    GetQuantity = 1
+ V1 P6 R3 T" }" H; t9 a; l; q* EEnd Function( H! n. X' A; }
( i- n6 d, z$ a8 y/ G7 T
Function GetPropertyValue(model As SldWorks.ModelDoc2, conf As String, prpName As String) As String
; N+ b; o- ^" O# q5 |/ I    Dim confSpecPrpMgr As SldWorks.CustomPropertyManager" o* E6 `8 A% |
    Dim genPrpMgr As SldWorks.CustomPropertyManager
# F8 I8 o# U6 z6 X  V    Set confSpecPrpMgr = model.Extension.CustomPropertyManager(conf)0 C6 k2 s, R- M9 C7 B/ G
    Set genPrpMgr = model.Extension.CustomPropertyManager("")0 Y# V) v$ H7 ^- d
    Dim prpResVal As String" x" A8 c' U* f9 Y& i
    confSpecPrpMgr.Get3 prpName, False, "", prpResVal, I+ }- m& Z2 X
    If prpResVal = "" Then
) u: n: H5 g/ n, {+ \        genPrpMgr.Get3 prpName, False, "", prpResVal
8 M" _, Y' J/ J) \" q' H* Z: N  E    End If
/ J/ k3 r; D( s0 n$ j    GetPropertyValue = prpResVal0 e3 @, R+ f0 G1 T
End Function5 Q# N& X  U: O
/ G: b' P+ U! P# K5 M
Sub WriteBomQuantities(bom() As BomPosition)% N' u7 i& _# T7 ^, _) ~8 B0 Z* F
    Dim i As Integer& r4 W# h- O6 w7 `% U2 q% Q( J; u( O
    If (Not bom) <> -1 Then
' E( o% w% K' I) S" R        For i = 0 To UBound(bom)( `  q6 T$ Q" ?' A: Q
            Dim refConfName As String
9 a% w. c1 y. E7 T            Dim swRefModel As SldWorks.ModelDoc26 e3 P0 F# Z8 u
            Set swRefModel = bom(i).model8 E/ g; A! F8 `1 y4 q1 f
            If MERGE_CONFIGURATIONS Then' Y9 H% g! k0 T$ R. K' n
                refConfName = "") x3 h& D0 g$ l3 r+ R( Q, }9 y, T
            Else
: x) X% h0 j1 L- `. S                refConfName = bom(i).Configuration
$ z; [9 M9 S* m- B                If swRefModel.GetBendState() <> swSMBendState_e.swSMBendStateNone Then
  m  y, e1 I1 \% @* C9 r) i+ I8 Q                    Dim swConf As SldWorks.Configuration4 P  O7 b2 m6 e* }! U& Y6 k) G
                    Set swConf = swRefModel.GetConfigurationByName(refConfName)
7 q/ }/ a( h- w+ z7 t9 N" D0 r                    Dim vChildConfs As Variant& n% n3 \0 t5 K  Q. e& k
                    vChildConfs = swConf.GetChildren(), J8 C$ b0 }7 I4 f/ R9 O2 n4 X% J
                    If Not IsEmpty(vChildConfs) Then
6 `, Y* m3 l* H& ^/ Y; ]4 G                        Dim j As Integer2 I- K% e8 L5 w. {4 i
                        For j = 0 To UBound(vChildConfs), Z( Y- G% R4 \3 S0 F2 }
                            Dim swChildConf As SldWorks.Configuration
5 h# i% z- i0 |) ]. \                            Set swChildConf = vChildConfs(j)
+ C- M- g" K6 a7 f% r- \. g0 M0 F                            If swChildConf.Type = swConfigurationType_e.swConfiguration_SheetMetal Then; w: v# U6 [5 H0 l1 S$ Y: H
                                SetQuantity swRefModel, swChildConf.Name, bom(i).Quantity4 {  \% C. n5 _) @  `. N
                            End If
" Q& M: Z. P! I2 j1 {                        Next/ Z2 K9 u: l. w* E9 x9 {1 a
                    End If
; `3 w) Q. X8 I0 r( Y6 p9 n                End If
5 K0 Q) ?2 y3 ]( m            End If
+ ~' Z: x: {1 G; n4 s            SetQuantity swRefModel, refConfName, bom(i).Quantity
5 H2 ~* W3 Q4 H8 \1 w) q        Next
$ G$ h6 B4 ^2 g6 Z! W: R- ]/ X7 D& @3 }* P    End If
4 _+ ^) _3 U" w! NEnd Sub
# _9 Y; p- o( a) ?8 O" S  N# X% q6 q  |7 ~. t. @
Sub SetQuantity(model As SldWorks.ModelDoc2, confName As String, qty As Double)7 u& Z  P$ R: s; M0 Z1 b* C- w
    Dim swCustPrpsMgr As SldWorks.CustomPropertyManager
  A! n& w+ {+ t+ R0 K) o    Set swCustPrpsMgr = model.Extension.CustomPropertyManager(confName)
% n: g2 O; e5 x  T2 X, I- C    swCustPrpsMgr.Add3 PRP_NAME, swCustomInfoType_e.swCustomInfoText, qty, swCustomPropertyAddOption_e.swCustomPropertyReplaceValue6 h+ Y; J/ o) E0 U: O! ]5 x, l- M
    swCustPrpsMgr.Set2 PRP_NAME, qty
/ R5 s5 g+ x. s$ n& e3 R* WEnd Sub7 d" ]0 \5 J# `% X/ o0 w+ w/ {& g
回复 支持 反对

使用道具 举报

发表于 2024-9-14 12:31:09 | 显示全部楼层
感谢楼主的分享 找了好久了
回复 支持 反对

使用道具 举报

发表于 2024-10-7 16:38:14 | 显示全部楼层
楼主,能求个宏吗?不会搞
; E# T- o  T6 G8 B6 L. n, G; R
回复 支持 反对

使用道具 举报

发表于 昨天 16:35 | 显示全部楼层
看前方 发表于 2024-8-14 19:12
& J6 A3 m# \$ z  g一直都是用凯元,自带了这个功能
! N3 {5 k* U, W% A1 M- a* S6 Q7 z( L
在开元没有看到这个功能啊
) {3 m! F1 ^# u4 \1 Q/ K7 g# j& J3 _! p% T4 {8 o* g  I% x
回复 支持 反对

使用道具 举报

发表于 昨天 16:35 | 显示全部楼层
sycfj 发表于 2024-9-7 09:36, E( I; K: Z. _- _* L  }) E: v
也就是说零件模板中要自定义属性 数量

0 s! O; C( \% R6 D4 B6 W刷个威望下附件/ e: j5 J) l; a5 F, V9 V
回复 支持 反对

使用道具 举报

发表于 昨天 16:36 | 显示全部楼层
李邈 发表于 2024-9-7 09:40% @' I: g2 [& a5 `8 h
这个宏会在每个零件体里添加了自定义属性数量这一栏,并且把数量填好了
; O( R) C* K6 P8 d, C) X- B6 ~你只要工程图去连接就行了
' G3 C' K1 m7 s( u" d& t, p  L- \
刷个威望下附件
# Z( h2 `9 x4 z' ~6 m  ~
回复 支持 反对

使用道具 举报

发表于 昨天 16:53 | 显示全部楼层
sycfj 发表于 2024-9-7 09:24
( w, S3 P: m' S7 a( E这个在工程图,装配体,零件哪个环境中使用
% o/ D+ i) {, E  ^
装配体环境中使用
# ]3 q' Y) j! N  I1 K
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

小黑屋|手机版|Archiver|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2024-11-22 23:09 , Processed in 0.060601 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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