Type BomPosition4 `* Y o$ x2 _/ i; n/ q
model As SldWorks.ModelDoc2
6 J& E& C" o! _! s4 g6 B Configuration As String. @0 S" F' S' O
Quantity As Double8 w" h. Y$ ]( {* T
End Type
( \# U' V P5 d1 i6 X. O' S* g+ K' _* c; s) j
Const PRP_NAME As String = "數量"* w3 [% P$ ~ O
Const MERGE_CONFIGURATIONS As Boolean = True! Z+ d0 s6 |* }( F7 O- H9 d G
Const INCLUDE_BOM_EXCLUDED As Boolean = False6 W7 N6 P3 l' ~
6 g1 Y( e2 B" I3 c7 hDim swApp As SldWorks.SldWorks
0 y% Q6 v/ H2 Z; e6 rSub main()/ a# o! e$ o( o6 V8 t- }' u
Set swApp = Application.SldWorks- j! S9 G" A3 N7 ~8 {+ b" d6 T# U
try_:
. y2 H+ d3 U6 \1 o/ E+ O On Error GoTo catch_
4 D: |/ G" t* [& F+ P Dim swAssy As SldWorks.AssemblyDoc+ Z3 e1 S5 V: x, V( j0 y a: c- [! E
Set swAssy = swApp.ActiveDoc) _4 x% o5 z+ F4 O/ L! U
If swAssy Is Nothing Then
; k4 H5 ~" |1 X Err.Raise vbError, "", "Assembly is not opened"
U3 T2 x6 c$ J, B5 d9 B1 {3 m End If2 m; Y+ C4 b: k4 C4 D# B
swAssy.ResolveAllLightWeightComponents True
7 q( t) c9 Z% D7 ] Dim swConf As SldWorks.Configuration7 R. v) k1 F) `) _3 [! I9 ~. w* T
Set swConf = swAssy.ConfigurationManager.ActiveConfiguration
2 |" f f9 u0 j: J- z Dim bom() As BomPosition* _* @" M2 ~" w$ b* h" Z
ComposeFlatBom swConf.GetRootComponent3(True), bom% ~* I& Q4 j& }
If (Not bom) <> -1 Then' Z& j" s6 a/ R. X2 w4 ^* w- F
WriteBomQuantities bom
( q4 P2 H) V+ d9 z/ F( A End If& Y0 m: J5 y3 `
GoTo finally_
- m/ A+ m! D( W8 E [catch_:
& @: X8 v3 V4 S* Z MsgBox Err.Description, vbCritical, "Count Components"0 t; I% z2 h5 U7 C. v/ H7 t
finally_: L) B0 [ N- r4 p' \" g0 c
End Sub
4 v+ b6 h/ M7 \! {& B
! J, e2 v3 R# o5 T4 X0 f" ^Sub ComposeFlatBom(swParentComp As SldWorks.Component2, bom() As BomPosition)
( ^5 j$ M k) K1 B" t- v/ _ W Dim vComps As Variant- C6 w) z0 L, h
vComps = swParentComp.GetChildren
4 g" z, I- K- `* a9 m; x If Not IsEmpty(vComps) Then
6 ?" `7 T0 [; J$ H4 ?3 {9 T/ q Dim i As Integer j N/ H; v- x, h6 q5 ?0 @" K% W1 s
For i = 0 To UBound(vComps): _4 b7 o# j6 z! G- t0 D$ W
Dim swComp As SldWorks.Component2
, ?% n y! i6 j" \9 P9 e Set swComp = vComps(i)
/ N y1 u9 S" T0 Q6 H* Z) a4 g If swComp.GetSuppression() <> swComponentSuppressionState_e.swComponentSuppressed And (False = swComp.ExcludeFromBOM Or INCLUDE_BOM_EXCLUDED) Then
1 r' b, ~3 Y! s) t( G. Q0 I. ~ Dim swRefModel As SldWorks.ModelDoc2
# G; S: d0 x q! _+ S Set swRefModel = swComp.GetModelDoc2()+ ~. d, Z8 M( o5 _3 f- L: S
If swRefModel Is Nothing Then
+ k' Z; ]- l4 O3 L+ n Err.Raise vbError, "", swComp.GetPathName() & " model is not loaded"
% O" ^8 ^) z! c. C {; { End If
5 ]' l! K: u. @4 z Dim swRefConf As SldWorks.Configuration
7 _% [2 y: x# |7 X6 B o) C! j Set swRefConf = swRefModel.GetConfigurationByName(swComp.ReferencedConfiguration)3 q; s |% v/ p" R% I# [
Dim bomChildType As Integer+ v' j1 S. n4 E% P
bomChildType = swRefConf.ChildComponentDisplayInBOM
" ` c5 V, P! v1 y. m If bomChildType <> swChildComponentInBOMOption_e.swChildComponent_Promote Then
2 v) ]1 C$ R. `% M Dim bomPos As Integer2 L: |* X% f$ p8 W
bomPos = FindBomPosition(bom, swComp)
# @( \* z) }$ Q' Z) z2 s If bomPos = -1 Then
/ v2 y8 J: _3 Q& { If (Not bom) = -1 Then
. o5 _$ C8 R; m6 R; W! a. ]7 o; e ReDim bom(0)( k; ~+ V, F* H& f v) ?( O& k8 @
Else
9 t3 U8 U3 _% P( _3 j; _2 h) ` ReDim Preserve bom(UBound(bom) + 1)
: [. \& ?5 S0 {& v End If; @9 r* G3 F* U7 ?0 W1 L+ I
bomPos = UBound(bom)1 D( j" E1 m! J) g2 }+ U4 R2 V6 {
Dim refConfName As String
# h: ]8 W( z0 e0 t, r t If MERGE_CONFIGURATIONS Then
7 I/ c& l, N$ V" U* [ refConfName = ""
- R7 A% a; y+ K+ f$ x7 H Else
0 X2 x7 B' j. g+ U; ~ refConfName = swComp.ReferencedConfiguration
3 w5 ^, X; t# v9 P7 ^0 k9 Z End If+ s9 r6 d. ^( l
Set bom(bomPos).model = swRefModel
. b7 u" S; D5 g* X* I: }: m. [, j bom(bomPos).Configuration = refConfName+ K( ~ \1 n8 V4 F C2 X: O
bom(bomPos).Quantity = GetQuantity(swComp)5 C+ X: [6 ]& j. D0 p
Else7 }8 `* S! \+ l' p. E" p
bom(bomPos).Quantity = bom(bomPos).Quantity + GetQuantity(swComp)
0 f7 Z: i7 h0 ` End If
4 Y9 [( I1 i- J* r! R; N End If
5 V6 r# Y4 `! s If bomChildType <> swChildComponentInBOMOption_e.swChildComponent_Hide Then
* j: i/ D# q$ F) X: @) B ComposeFlatBom swComp, bom0 w8 W4 u' P' r4 j* |
End If( }$ S; X% y2 E! A
End If
9 W- d6 U% ^: R6 a5 w4 K Next
! q) b/ c! E; q+ }0 e End If
7 R; P& a4 E6 I2 k7 q7 Y- ? rEnd Sub0 H$ `4 {4 U0 a* B& b. G8 A+ S
$ J" v N0 |& Z) {/ F7 b
Function FindBomPosition(bom() As BomPosition, comp As SldWorks.Component2) As Integer
& f1 i. p- X( r FindBomPosition = -1
" K6 z. P h9 A5 s Dim i As Integer
9 h4 y) U+ t# F0 | If (Not bom) <> -1 Then
8 Y& U, D3 v8 p$ V" E Dim refConfName As String
6 r1 ^/ L+ h1 V3 R If MERGE_CONFIGURATIONS Then
7 _7 \' Q: _. r; ~# K refConfName = ""
9 q9 a% z6 B! H& }% S1 J Else' S& X4 F4 s6 d, D+ V) h
refConfName = comp.ReferencedConfiguration+ L9 B- K, s$ L% I
End If7 v" V# N M1 N- m
For i = 0 To UBound(bom)( Z* @, {1 m( N4 Z0 u
If LCase(bom(i).model.GetPathName()) = LCase(comp.GetPathName()) And LCase(bom(i).Configuration) = LCase(refConfName) Then p8 e. v* s# | r& O( t+ v9 i
FindBomPosition = i5 R" A2 x* O' `: W7 J
Exit Function9 n3 w5 r; I/ w/ m
End If
& ?5 ?1 j; p' e. K1 S Next) B, [! G( b+ T' ~
End If3 U* a- V$ T2 J# L( P+ z" D
End Function6 Y+ x u" H. [% p4 f
# n; E" l+ Q5 k5 d1 M4 I
Function GetQuantity(comp As SldWorks.Component2) As Double- [# r! e' ?# ]2 e( @
On Error GoTo err_4 f* I2 J, X1 a# v* \- K M7 y& t: ?8 D
Dim refModel As SldWorks.ModelDoc2
( |; H: c1 J# {6 z* K Set refModel = comp.GetModelDoc22 c9 b* @. k% o _
Dim qtyPrpName As String
0 H7 Y/ {3 K# g) E4 I6 u qtyPrpName = GetPropertyValue(refModel, comp.ReferencedConfiguration, "UNIT_OF_MEASURE")
& [# P7 p4 P5 T: T% w; i If qtyPrpName <> "" Then; B# z' a5 t/ F( P* |0 ` `1 m
GetQuantity = CDbl(GetPropertyValue(refModel, comp.ReferencedConfiguration, qtyPrpName))2 Z+ r) E4 Y* B& {4 J ]
Else1 l1 m5 U# m1 l" H* H% E* W
GetQuantity = 15 f# N8 g0 y8 a
End If' O R% M- A: i( T* t" [! a
Exit Function% m" n# R: Q9 k2 h2 P7 d
err_:
3 T f3 q, O+ V5 I) | Debug.Print "Failed to extract quantity of " & comp.Name2 & ": " & Err.Description) @) d" j" E6 X5 A5 }+ d" Z! w
GetQuantity = 1
! Z1 g0 i0 ~& |% CEnd Function
3 D% F, N+ i; v/ E7 R0 a: j% x
g; e% h5 w" m6 vFunction GetPropertyValue(model As SldWorks.ModelDoc2, conf As String, prpName As String) As String
0 Z( C% A7 H( u' s$ K- I Dim confSpecPrpMgr As SldWorks.CustomPropertyManager5 u* q. E' A# @1 T5 D; c
Dim genPrpMgr As SldWorks.CustomPropertyManager! S, o/ `9 F5 `1 _+ s/ ~% B
Set confSpecPrpMgr = model.Extension.CustomPropertyManager(conf)8 E. K1 Y0 m3 z# d0 E! R Y
Set genPrpMgr = model.Extension.CustomPropertyManager("")
0 r! T4 s9 O. b3 z0 | Dim prpResVal As String
6 Q: b$ V6 h, z4 J confSpecPrpMgr.Get3 prpName, False, "", prpResVal' G# u0 F3 M* v, g$ H
If prpResVal = "" Then C9 z" \1 z! |0 w
genPrpMgr.Get3 prpName, False, "", prpResVal
: m3 K1 n* f0 o; J, v H" p' F End If$ g6 _+ N, [* X( f" v+ [
GetPropertyValue = prpResVal
- t/ ]0 O8 `- V6 }End Function p: q3 ^3 T, K! s7 q1 ?$ r# W
" \; g( |% {& a$ ?6 k- s* z5 ]Sub WriteBomQuantities(bom() As BomPosition)
) E9 c# a+ y" D/ Q! h* Q7 B/ t Dim i As Integer
* P8 w! i9 Q3 c2 \+ d If (Not bom) <> -1 Then5 o \: h8 M- h, G1 @; t3 {; H: c
For i = 0 To UBound(bom)
' m9 U+ S/ ^; Q, Y& g3 j Dim refConfName As String8 c6 `6 y; ? x' _9 `& h: r; Y
Dim swRefModel As SldWorks.ModelDoc2
1 D* ?" U+ c, d* Y! \3 e. x Set swRefModel = bom(i).model7 S9 E, Y8 ~1 e+ J
If MERGE_CONFIGURATIONS Then
a# ~( v- d4 g. |4 M refConfName = ""
' V+ H: N0 `1 f$ ~; u- t Else
9 f, h4 ^, \: ^$ S1 n, }/ w refConfName = bom(i).Configuration
4 i8 U& m& n" [- x9 {: _- L If swRefModel.GetBendState() <> swSMBendState_e.swSMBendStateNone Then6 Q* j! f' H$ Q# C
Dim swConf As SldWorks.Configuration4 r( ]- Y* {' k4 C: R
Set swConf = swRefModel.GetConfigurationByName(refConfName)
# |- w' ?0 q4 M( u. n8 ? Dim vChildConfs As Variant- q: Q5 J' } D
vChildConfs = swConf.GetChildren()- z5 m9 R# @. I, X
If Not IsEmpty(vChildConfs) Then* w: E( }, _1 Y: q" t
Dim j As Integer
) z/ C1 @% W, F: G For j = 0 To UBound(vChildConfs)$ z/ Y' q# G8 X8 E
Dim swChildConf As SldWorks.Configuration3 j# {) Q! I) G, E! H! q. l
Set swChildConf = vChildConfs(j)
0 |# D. ?/ F$ w% f- o" V4 \ If swChildConf.Type = swConfigurationType_e.swConfiguration_SheetMetal Then+ d% H! v2 g. N
SetQuantity swRefModel, swChildConf.Name, bom(i).Quantity
Y$ Z1 a* P3 z; R6 U3 \% P% p End If
0 }+ [/ o S, c3 f+ x Next
% ]; s0 p+ K7 w6 B) R5 `4 k End If
6 F; h [$ c1 x End If
, M9 u6 r: \& w- g7 f7 g End If
4 V. K! l+ N4 K# H: o- y7 b1 k) q* i SetQuantity swRefModel, refConfName, bom(i).Quantity
7 E& Y; f/ f3 c% h Next
2 n" E/ d G; d2 I3 Q End If" A |7 Q2 f5 u5 C- ^0 Y# ^
End Sub0 t/ x, H' M' \4 L I- y
+ Y. V7 i" S7 S* U1 s+ e$ L0 c( W) R
Sub SetQuantity(model As SldWorks.ModelDoc2, confName As String, qty As Double)
* y+ v. B, O" j, n5 j* B Dim swCustPrpsMgr As SldWorks.CustomPropertyManager
6 [+ D4 `! o2 O1 Q- ] Set swCustPrpsMgr = model.Extension.CustomPropertyManager(confName)* B8 T$ Q( M; Z% B; T
swCustPrpsMgr.Add3 PRP_NAME, swCustomInfoType_e.swCustomInfoText, qty, swCustomPropertyAddOption_e.swCustomPropertyReplaceValue
0 n @6 W& s! Y X# d swCustPrpsMgr.Set2 PRP_NAME, qty
5 J0 W( w* o( oEnd Sub7 D2 x& W7 F! B+ a# ?! _: M
|