找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 李邈

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

[复制链接]
 楼主| 发表于 2024-9-7 09:38:50 | 显示全部楼层
本帖最后由 李邈 于 2024-9-7 09:41 编辑
3 `) P/ s4 x3 C, u) H- {+ z# P$ q
sycfj 发表于 2024-9-7 09:27$ M2 s7 W, V6 \. R$ j7 \+ W' K
能详细说明怎么使用吗?我在装配体中使用这个宏以后,工程图中不会出现数量

+ X: X/ ]) O# J: Hhttps://baijiahao.baidu.com/s?id=1796657905732909661&wfr=spider&for=pc
$ q: X! o, K& y按照这个方法设置,他链接的是仓库 你连接数量那一栏就行了
7 t" H: v, @* S设置好之后,把工程图文件另存为工程图模板,删掉上面的视图,下次新建就会直接出现* \: X( i# j& E/ {3 `! C1 F
以前出的工程图,用批量替换模板的工具,全部替换成新的工程图模板就好啦
3 L1 a* n8 C. U4 I9 `( a2 H4 s
 楼主| 发表于 2024-9-7 09:40:02 | 显示全部楼层
sycfj 发表于 2024-9-7 09:36! A& p6 n# G' s% G5 F) @
也就是说零件模板中要自定义属性 数量

3 ^$ g0 w& u' P, \6 T这个宏会在每个零件体里添加了自定义属性数量这一栏,并且把数量填好了7 O3 ^0 I/ }9 T! a
你只要工程图去连接就行了! J4 i0 U8 o+ F: G
发表于 2024-9-7 14:50:39 | 显示全部楼层
李邈 发表于 2024-9-7 09:25
% r; y1 {) h1 A" u1 W( w" s$ V& r& H, t, H装配体中使用
7 a: n& ~* a+ @" @: E
还是不会用,加个微sycfj27 K- j4 p) l2 c  Y- j

点评

加了  发表于 2024-9-7 14:51
 楼主| 发表于 2024-9-7 15:22:48 | 显示全部楼层
Type BomPosition
- e4 q6 N" t; v    model As SldWorks.ModelDoc2, h' k: t' I& [* q
    Configuration As String
5 i/ Y$ N- r: R- t! x. ^6 B    Quantity As Double% L/ n, A- ?; M( s
End Type
! n# `$ ]* J7 `  p' S* \% P0 w+ o& o1 T
. P; n2 ]. f0 g- e: @) aConst PRP_NAME As String = "数量"
% {9 C) o' f! UConst MERGE_CONFIGURATIONS As Boolean = True% ^$ e: M8 `" ^( }3 M+ W1 F2 [
Const INCLUDE_BOM_EXCLUDED As Boolean = False% h$ y3 }4 m3 P5 e; h

* c  k( Q/ f# R+ M  d( ODim swApp As SldWorks.SldWorks) u4 b# d% r; @/ \4 W+ W$ u
Sub main()) x: `* Q1 ]# y" l4 l0 X+ t3 C
    Set swApp = Application.SldWorks' B, u) l! ]3 G6 _
try_:
( Y( r4 @- c) y8 C    On Error GoTo catch_
# T- c7 J6 _% a: s; r, n% S    Dim swAssy As SldWorks.AssemblyDoc! `  h; T+ S3 a6 J
    Set swAssy = swApp.ActiveDoc
* g8 s7 {+ @/ B/ x    If swAssy Is Nothing Then
" O: c! _% V% S, b. D2 E( N& G        Err.Raise vbError, "", "Assembly is not opened"
9 R$ E' ], s0 d$ W1 o) f. e    End If
0 H/ i* ?$ u$ m& f! g" m, P5 x    swAssy.ResolveAllLightWeightComponents True
# E  k8 V$ K, I* _, A) d# l6 k    Dim swConf As SldWorks.Configuration
+ o; K& I: D- t; z" F    Set swConf = swAssy.ConfigurationManager.ActiveConfiguration
) f7 ?: N0 s2 ?+ A3 V' X    Dim bom() As BomPosition
+ K! D4 Z, @, Y    ComposeFlatBom swConf.GetRootComponent3(True), bom
+ {& A( ~/ W2 N5 K6 i& f( E; ]    If (Not bom) <> -1 Then
3 M: a7 l- U7 o7 H) _4 c8 L        WriteBomQuantities bom& {* M% G8 d2 }8 |3 |) Q
    End If
, p! ]6 z; j! |5 R( g# Y" T  E    GoTo finally_6 k+ y+ r2 @) s; P/ w: x+ M+ q
catch_:; i* Y; r) k, L
    MsgBox Err.Description, vbCritical, "Count Components"1 V: A( R: \5 Y& j! H& W( T
finally_:
1 E$ f! q* m; A- ^% u) g) hEnd Sub: e" t; o3 _- V$ {2 a2 p, S2 ^
0 E2 n- P5 x* Q. d7 {5 q
Sub ComposeFlatBom(swParentComp As SldWorks.Component2, bom() As BomPosition)
8 |  b1 N8 `, H  d( o7 o; U* A    Dim vComps As Variant4 U' l6 |" Y. X! }4 m
    vComps = swParentComp.GetChildren8 w1 ]1 S* K4 @4 {# W, Y  T
    If Not IsEmpty(vComps) Then
7 r' Z. c6 g- \: p4 ^! O6 C        Dim i As Integer
  G" F# D3 N% S+ e" z$ U9 o: F$ i        For i = 0 To UBound(vComps)
3 r3 T8 g. {- w9 m' j3 i            Dim swComp As SldWorks.Component2
0 [1 Y' |7 R( Q: U- W: P1 K- y' W            Set swComp = vComps(i)
, `0 k0 n  @1 R, f" v/ i            If swComp.GetSuppression() <> swComponentSuppressionState_e.swComponentSuppressed And (False = swComp.ExcludeFromBOM Or INCLUDE_BOM_EXCLUDED) Then
$ h; w0 W+ {' |7 Z' R- R5 R# ~                Dim swRefModel As SldWorks.ModelDoc22 x+ Y1 T/ t4 |6 N) O8 J/ b/ _* u
                Set swRefModel = swComp.GetModelDoc2()4 I# [" z% |2 ^5 P7 c6 V; K; W
                If swRefModel Is Nothing Then" r8 \2 |5 n/ r
                    Err.Raise vbError, "", swComp.GetPathName() & " model is not loaded"* Q( U2 x, G( Y) u/ l  A# S/ t
                End If
! ~' ^/ h& q1 w/ m                Dim swRefConf As SldWorks.Configuration, M. D) I5 y- S$ y# z% U7 d
                Set swRefConf = swRefModel.GetConfigurationByName(swComp.ReferencedConfiguration)6 ?" ~8 T! k1 W) U' K
                Dim bomChildType As Integer8 D+ M3 K, ~0 p4 }
                bomChildType = swRefConf.ChildComponentDisplayInBOM2 K3 R% g' e' t2 Y$ R
                If bomChildType <> swChildComponentInBOMOption_e.swChildComponent_Promote Then
3 \  ^3 O( X7 K! m                    Dim bomPos As Integer
* g4 G2 T, D: f# J                    bomPos = FindBomPosition(bom, swComp)9 Y! L3 x' ^/ k6 M3 V) f1 C8 H
                    If bomPos = -1 Then7 d. j% ?+ _& \" p* E, i) r
                        If (Not bom) = -1 Then, P+ g- }4 W" R- G2 I
                            ReDim bom(0)& R$ S8 m0 L  |& T4 z% N# I( W, g
                        Else
+ x) o+ f  S% J; F5 o+ O- F                            ReDim Preserve bom(UBound(bom) + 1)
. L7 p% @' Y9 E9 P# i& k                        End If
& Y: P/ m0 a  ~2 d, q( H                        bomPos = UBound(bom)
6 _2 A1 L& ], h$ u$ g                        Dim refConfName As String
9 {, T; A1 I' C) }8 d3 x( H                        If MERGE_CONFIGURATIONS Then- g  N* L2 f0 b& l5 Q* f3 t6 n
                            refConfName = ""
7 [7 x) r( g! T* N  m) N" d! K                        Else
- M( _6 M. p: Q, ~  \3 g                            refConfName = swComp.ReferencedConfiguration/ A0 ~& i( l- S4 B% N. d
                        End If2 {/ j5 h0 n5 D) x" O& L% b$ e" @
                        Set bom(bomPos).model = swRefModel
! L* y  y& ^, ?- g) d1 ]3 Z( r4 r1 I                        bom(bomPos).Configuration = refConfName( o! p: ~; L" W) {- `
                        bom(bomPos).Quantity = GetQuantity(swComp)/ @1 l& e: |. L7 w# b3 }  a
                    Else0 }1 u* K. r" O1 ~5 Y
                        bom(bomPos).Quantity = bom(bomPos).Quantity + GetQuantity(swComp)
6 h$ S2 R: n1 o* c1 @( H! F( q                    End If
$ W! ^# G* s8 i1 g1 H                End If  q/ V! Y  f& ?$ h
                If bomChildType <> swChildComponentInBOMOption_e.swChildComponent_Hide Then5 i5 P, J8 F2 j/ H- l+ ~) L
                    ComposeFlatBom swComp, bom: [$ w9 q" e6 \* w: ]5 h7 _
                End If; N6 v3 X, c; k; M9 o2 b9 }
            End If/ x" K2 _8 H8 w4 T) Z
        Next
7 D$ [. ^; b* E* j, ^# |; y    End If
/ |- V1 R( j3 Y# e7 @, D% E7 T% kEnd Sub
) y" E3 o$ L; A  ^8 V# K2 n; q- S' f0 Q" r, ?) e4 m
Function FindBomPosition(bom() As BomPosition, comp As SldWorks.Component2) As Integer6 G2 E; u, N1 j2 H7 `! V% o/ F
    FindBomPosition = -1% D$ ^, I& C" b; ^' s- N
    Dim i As Integer- O. I; v: \! X/ m6 l
    If (Not bom) <> -1 Then
2 i: t) d$ P6 D3 g( F9 M        Dim refConfName As String+ [! c  }+ h7 C5 @  d& C: g
        If MERGE_CONFIGURATIONS Then& L5 H* v( O+ E4 X% U
            refConfName = ""5 M5 w1 Y# r9 B' {- @* O7 z
        Else+ q# B* T' f6 \( U
            refConfName = comp.ReferencedConfiguration
7 c( d3 f3 H% @        End If
9 I6 D0 V- i8 \! m4 L& I        For i = 0 To UBound(bom)/ \6 ^( D( W( l. \
            If LCase(bom(i).model.GetPathName()) = LCase(comp.GetPathName()) And LCase(bom(i).Configuration) = LCase(refConfName) Then
& h: I8 y: C5 C4 D, f& j                FindBomPosition = i6 i! i* K( Y5 u8 n  w
                Exit Function4 l4 `- K4 b/ `9 S) `2 b7 J) H7 g% P
            End If
$ E6 h% ?& g9 ~0 f        Next, F0 b3 X& v& u! k2 D& C5 R. {# C! e
    End If
0 {: T; g" b5 c6 E$ uEnd Function
4 T7 _: O3 n3 X) S/ X* \- j- @9 w; d  t5 N. g0 S
Function GetQuantity(comp As SldWorks.Component2) As Double
4 O: A& o, l5 H" k% HOn Error GoTo err_
* q/ o3 ^4 F$ s' H+ \3 c    Dim refModel As SldWorks.ModelDoc2
( L( L: e2 |% O1 f    Set refModel = comp.GetModelDoc2
" r0 j+ f; \* e! A0 ~. A% W    Dim qtyPrpName As String6 d3 H) g7 h% O1 Z/ |
    qtyPrpName = GetPropertyValue(refModel, comp.ReferencedConfiguration, "UNIT_OF_MEASURE")
, t, r/ }8 I" q* q: }- G! P- J    If qtyPrpName <> "" Then
) f8 I2 e: C; n        GetQuantity = CDbl(GetPropertyValue(refModel, comp.ReferencedConfiguration, qtyPrpName))( k+ A7 U3 B: E& i$ L- T$ q2 }
    Else& U, w- Z- q+ a# o) M* h+ t
        GetQuantity = 1) T' {& T# t& Y. a# v/ g  E* {+ e* B
    End If; N0 c; f" m! S0 m8 o
    Exit Function" B) s7 [& l  J" @) J+ o$ A- R
err_:6 s  o# D( D8 A2 T, R2 W! T- D
    Debug.Print "Failed to extract quantity of " & comp.Name2 & ": " & Err.Description
7 s" O# P/ w  B& L: r    GetQuantity = 1- Z5 t, N4 N1 c' \( ]
End Function. v' @/ J$ B$ _& J" b
  r9 e4 K) n6 E( T/ }
Function GetPropertyValue(model As SldWorks.ModelDoc2, conf As String, prpName As String) As String' O  E8 k2 h  K1 g5 U$ w
    Dim confSpecPrpMgr As SldWorks.CustomPropertyManager# C  ?/ J2 h7 V
    Dim genPrpMgr As SldWorks.CustomPropertyManager- R; l$ l( C8 [
    Set confSpecPrpMgr = model.Extension.CustomPropertyManager(conf)
# x: [" ~7 c$ V! l' N! |    Set genPrpMgr = model.Extension.CustomPropertyManager("")" E$ k' ]0 h  q. q( J' w" f
    Dim prpResVal As String
+ n0 h' `$ f+ E    confSpecPrpMgr.Get3 prpName, False, "", prpResVal+ f9 w2 f" |' X  _5 j+ D: V9 t+ M
    If prpResVal = "" Then- [- H+ [, _  \& L
        genPrpMgr.Get3 prpName, False, "", prpResVal
( @! P, S9 v' L6 Q, `( V1 E. o    End If0 ^% i9 q" q; t( p
    GetPropertyValue = prpResVal. F8 U: w9 Z: e
End Function
6 \" Y- L( y$ t6 T2 h
+ h7 M, }* Y/ ]( wSub WriteBomQuantities(bom() As BomPosition)* \! T0 S! G; F- J; A& R% h5 k; G
    Dim i As Integer
- X) z2 k2 ~: P4 Y2 P    If (Not bom) <> -1 Then
) M7 X; H$ x* V; N  n        For i = 0 To UBound(bom)4 j+ m( Y) F: W# I  ?0 N
            Dim refConfName As String
& G  T" {6 L* x9 c- b( m/ K            Dim swRefModel As SldWorks.ModelDoc21 s- F- i. R+ y5 |
            Set swRefModel = bom(i).model
6 R3 C6 j+ z5 }: Q+ z% c8 h& l            If MERGE_CONFIGURATIONS Then
- e: T. O* }, a* F                refConfName = ""
% o' I, o9 X0 f            Else1 C8 x" F  I$ ^8 w, Z6 j, |7 e
                refConfName = bom(i).Configuration
: }5 O5 `$ `9 W2 h                If swRefModel.GetBendState() <> swSMBendState_e.swSMBendStateNone Then" b% U! g) x* f  A- G+ P
                    Dim swConf As SldWorks.Configuration, j8 ?7 x- o8 T% a1 G
                    Set swConf = swRefModel.GetConfigurationByName(refConfName)6 W* Z4 P- g! G, U" \$ J. `' b
                    Dim vChildConfs As Variant, {  r' @3 l6 \- B, u7 t1 F2 |
                    vChildConfs = swConf.GetChildren()
0 O' w8 S) S/ e! a% O5 Y( K5 I1 X                    If Not IsEmpty(vChildConfs) Then
! ~: K& f; i9 S( d" z5 M1 f                        Dim j As Integer
& T3 P% p. H) D8 q8 B& z, g" G3 g                        For j = 0 To UBound(vChildConfs): q: e0 H/ \' E, N
                            Dim swChildConf As SldWorks.Configuration4 x# G$ S  s; s
                            Set swChildConf = vChildConfs(j)
! r' L( l. f( v; D) V( t, y+ L                            If swChildConf.Type = swConfigurationType_e.swConfiguration_SheetMetal Then
5 i! f+ s+ v% m0 d4 W& b8 V4 K                                SetQuantity swRefModel, swChildConf.Name, bom(i).Quantity
: a; v  W* u- F9 C% J7 P$ }                            End If
5 G* P0 q- E2 y; Q: G5 ]$ y9 o                        Next
5 Z6 R' [' Y/ ~# z: o( m# I                    End If( t+ [! s" Q5 D1 A
                End If1 u  A9 a/ S( [7 A  l& q
            End If
5 z" Q( P7 _7 a) X+ F            SetQuantity swRefModel, refConfName, bom(i).Quantity
6 Q; e: L! I9 i; J. |        Next7 a3 {. Q( X# c# W$ L
    End If
5 r  Y" `( f; EEnd Sub
4 g5 w9 I" S1 h* I3 T! M9 q. L2 V* ~' J
Sub SetQuantity(model As SldWorks.ModelDoc2, confName As String, qty As Double), g0 ?. X: V, O0 b* a; b' o- ~7 H( ^
    Dim swCustPrpsMgr As SldWorks.CustomPropertyManager1 K/ D3 `( j6 i9 `4 y& R! b
    Set swCustPrpsMgr = model.Extension.CustomPropertyManager(confName)$ v3 g. S; c+ u' ?8 c, u) [& b
    swCustPrpsMgr.Add3 PRP_NAME, swCustomInfoType_e.swCustomInfoText, qty, swCustomPropertyAddOption_e.swCustomPropertyReplaceValue
& ]" n8 I8 R, c+ Q. B4 W    swCustPrpsMgr.Set2 PRP_NAME, qty
# A4 v( e! E* I  W7 ^) M" qEnd Sub
4 z2 w/ w- l# h* f+ v  x% W. r
发表于 2024-9-14 12:31:09 | 显示全部楼层
感谢楼主的分享 找了好久了
发表于 2024-10-7 16:38:14 | 显示全部楼层
楼主,能求个宏吗?不会搞
, `/ i! x8 |2 C, V6 W" s1 j+ ?1 b
发表于 2024-11-21 16:35:10 | 显示全部楼层
看前方 发表于 2024-8-14 19:12% W6 w  n/ A1 I' H, p& m- D1 s
一直都是用凯元,自带了这个功能

" C. S. y- d& a; \" Y7 u9 G在开元没有看到这个功能啊8 \' u( V: G* y0 i  ]
0 o" X5 ^) g% e! G; \
发表于 2024-11-21 16:35:50 | 显示全部楼层
sycfj 发表于 2024-9-7 09:36% l- {5 z- R/ C% S0 z* U
也就是说零件模板中要自定义属性 数量
5 [4 N7 q! D# r& R: h
刷个威望下附件
+ X' o' e; d+ i2 a" U
发表于 2024-11-21 16:36:08 | 显示全部楼层
李邈 发表于 2024-9-7 09:403 v+ r: N$ B( o
这个宏会在每个零件体里添加了自定义属性数量这一栏,并且把数量填好了
$ F' V9 l$ }0 a( T8 x你只要工程图去连接就行了

) E$ E& B7 }8 n* v刷个威望下附件+ C* f$ {" i, E( T
发表于 2024-11-21 16:53:04 | 显示全部楼层
sycfj 发表于 2024-9-7 09:24& Q& ~* T# t8 y
这个在工程图,装配体,零件哪个环境中使用

: k% I' J4 I/ i! B1 O" z装配体环境中使用
. s3 D1 O: V  J1 y6 s
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-7-31 20:33 , Processed in 0.070341 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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