机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 李邈

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

[复制链接]
 楼主| 发表于 2024-9-7 09:38:50 | 显示全部楼层
本帖最后由 李邈 于 2024-9-7 09:41 编辑 9 A/ L' P$ h, n  `6 W. I
sycfj 发表于 2024-9-7 09:27; F6 C: Y. f! P7 E
能详细说明怎么使用吗?我在装配体中使用这个宏以后,工程图中不会出现数量
; Z+ f8 o$ U# z" g% y9 U1 x
https://baijiahao.baidu.com/s?id=1796657905732909661&wfr=spider&for=pc
0 Q5 t, x% [3 `4 c按照这个方法设置,他链接的是仓库 你连接数量那一栏就行了% C4 m7 J& a' _9 R0 a( G
设置好之后,把工程图文件另存为工程图模板,删掉上面的视图,下次新建就会直接出现6 K6 c# L! S, N
以前出的工程图,用批量替换模板的工具,全部替换成新的工程图模板就好啦2 a0 x) L' n5 y) `: d& b; P+ v
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-9-7 09:40:02 | 显示全部楼层
sycfj 发表于 2024-9-7 09:36
$ L; p. W. p+ N2 e/ \/ |8 d也就是说零件模板中要自定义属性 数量

* Y) p1 ]" R/ O4 w3 x6 }这个宏会在每个零件体里添加了自定义属性数量这一栏,并且把数量填好了6 L1 g+ x$ m# m
你只要工程图去连接就行了( O# L8 Y  U5 Z! C$ z& h
回复 支持 反对

使用道具 举报

发表于 2024-9-7 14:50:39 | 显示全部楼层
李邈 发表于 2024-9-7 09:259 h& m& }/ }+ [: J$ Q! v
装配体中使用
; [% J) h0 G7 A1 ?5 e' Y/ S+ T8 }
还是不会用,加个微sycfj2
. J% T! X: J* J

点评

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

使用道具 举报

 楼主| 发表于 2024-9-7 15:22:48 | 显示全部楼层
Type BomPosition
9 L* M9 `2 F+ Y+ p! i, [6 z0 H/ y    model As SldWorks.ModelDoc2
' G$ Z0 a) d5 J4 g2 P$ B    Configuration As String
* h3 i0 }% u6 i7 Z# {  E7 i: d    Quantity As Double" |3 X$ N8 M7 [& H) ^# l  S" V
End Type, F& n* L% l$ S' {1 B/ V
! r' P3 C' u9 `! ?- k
Const PRP_NAME As String = "数量": R" H* J/ H( j/ i0 I( H
Const MERGE_CONFIGURATIONS As Boolean = True1 W4 [$ J! z* r5 c3 z. Y
Const INCLUDE_BOM_EXCLUDED As Boolean = False
: b* `2 Z' W6 f% s8 S2 O% Z! _' M6 C: ^7 ]5 M' A
Dim swApp As SldWorks.SldWorks2 m# I7 _% E6 l; ?# D& V# Y" V
Sub main()) _) T) k$ E% B5 Z* q
    Set swApp = Application.SldWorks
1 ^; J! ~2 y/ @, o2 ~try_:
# \6 b/ h7 f: u( N' @! O    On Error GoTo catch_
3 P/ z5 ^8 {' f, e9 O    Dim swAssy As SldWorks.AssemblyDoc6 z& {6 v' `; {- s' ?2 B6 I# f) [
    Set swAssy = swApp.ActiveDoc
, K1 V( D, U% N# \) q5 o7 @    If swAssy Is Nothing Then5 X" G' f4 W4 H, O% ?, C
        Err.Raise vbError, "", "Assembly is not opened"; z8 |, q2 u% Y- k6 W) h1 e- s
    End If
9 C0 {/ a4 N- I% x    swAssy.ResolveAllLightWeightComponents True& l* C8 g: o6 N1 u
    Dim swConf As SldWorks.Configuration
# l5 E$ }! w# A1 O2 B; c5 B    Set swConf = swAssy.ConfigurationManager.ActiveConfiguration
6 |# L# @2 D( Q1 o. ?    Dim bom() As BomPosition9 c- I) G$ u0 X( ~
    ComposeFlatBom swConf.GetRootComponent3(True), bom
1 g& d$ G- y% A    If (Not bom) <> -1 Then! q- O, E  F) O  }. A
        WriteBomQuantities bom
" `# W: y( I+ k, L    End If
. [# f! \7 D$ v& I1 X" ~* w    GoTo finally_$ T0 ~$ {. h2 r: H7 c7 C
catch_:
. J2 [: ?8 d3 P    MsgBox Err.Description, vbCritical, "Count Components"& `. P; I* j; i+ B
finally_:8 n, y1 X9 b3 t# K* `. ?( G% q/ w
End Sub  a. v# i, S2 ~, s& _9 h
0 O; Y$ ^1 K: }& K& ]
Sub ComposeFlatBom(swParentComp As SldWorks.Component2, bom() As BomPosition)+ F& I, P  W5 k9 N+ E
    Dim vComps As Variant
% X3 m  }1 ?% x% o$ H: P' M7 S' U    vComps = swParentComp.GetChildren* D' F+ N1 h& H$ e5 i9 `5 `
    If Not IsEmpty(vComps) Then
; A: S! E! p: M6 h2 E: E. k        Dim i As Integer' F' G- P7 ?. u) X; T
        For i = 0 To UBound(vComps)7 P2 H2 F3 c, X- `2 e( n4 w6 [
            Dim swComp As SldWorks.Component21 B9 z' o& {$ h/ _
            Set swComp = vComps(i)
! c& g3 b( O5 B$ L            If swComp.GetSuppression() <> swComponentSuppressionState_e.swComponentSuppressed And (False = swComp.ExcludeFromBOM Or INCLUDE_BOM_EXCLUDED) Then# x. }- @% q- t, V" O
                Dim swRefModel As SldWorks.ModelDoc2
4 y. n+ ~- M1 M: i% S                Set swRefModel = swComp.GetModelDoc2()4 H; {/ }( R5 ^/ l  U
                If swRefModel Is Nothing Then
+ u8 L5 }% m# o, Q0 L                    Err.Raise vbError, "", swComp.GetPathName() & " model is not loaded". M# H9 U8 R0 O# q9 C1 {. D$ I
                End If
; T) A# }9 p% Y0 E3 C                Dim swRefConf As SldWorks.Configuration
0 R" Y2 K) C/ K  a% `3 A: z                Set swRefConf = swRefModel.GetConfigurationByName(swComp.ReferencedConfiguration)
* i# r; M( q$ l* P  K! V: U- k9 A                Dim bomChildType As Integer
4 k& E4 I4 v3 o% d2 U3 Z  ~                bomChildType = swRefConf.ChildComponentDisplayInBOM4 w& y; s& r2 q' Y! v5 |
                If bomChildType <> swChildComponentInBOMOption_e.swChildComponent_Promote Then
! u8 ]4 r9 O0 D; V# t                    Dim bomPos As Integer
( v$ p2 G5 B2 }2 l                    bomPos = FindBomPosition(bom, swComp)3 O3 J* @  y8 `- |. y' c! s
                    If bomPos = -1 Then
, h! f! t; r" q1 _3 z5 n                        If (Not bom) = -1 Then% W: g& }5 w$ k: }* e- E. p+ V& g
                            ReDim bom(0)
& f5 n6 @. b( c1 b# C3 l  D                        Else
) w0 \' s; B( D3 h# ]                            ReDim Preserve bom(UBound(bom) + 1)5 b- }  Y" P% N
                        End If9 @4 B5 K' G6 F. {' m' \, i
                        bomPos = UBound(bom)9 v( _' K& K9 a0 H. k  v! ]
                        Dim refConfName As String
0 H0 f, S  V* D1 a' ]; Z( I                        If MERGE_CONFIGURATIONS Then" Z( e' z# c8 b, c" D
                            refConfName = ""( `1 ]* Y+ d8 O4 `' h
                        Else
3 l0 D! {# p+ d5 O* T5 d) i$ D+ J0 R, i0 q                            refConfName = swComp.ReferencedConfiguration
5 d3 {( [3 c, k2 x5 o4 _                        End If, z3 @; V0 k9 }2 d8 z$ M" F
                        Set bom(bomPos).model = swRefModel
* t- a( t( `" e0 e  {) T% ?                        bom(bomPos).Configuration = refConfName
- [0 I* {* Z, _4 _                        bom(bomPos).Quantity = GetQuantity(swComp)& w% A/ {9 |& @5 D8 k
                    Else" i6 _2 \  j6 y: E+ K4 o; c4 L
                        bom(bomPos).Quantity = bom(bomPos).Quantity + GetQuantity(swComp)
7 D# `/ u: _* e9 A# M                    End If$ o9 u# b' v6 P( H0 c! e$ W+ q; [
                End If9 a- ?2 [9 g8 B: @7 y  d
                If bomChildType <> swChildComponentInBOMOption_e.swChildComponent_Hide Then
2 R$ k* y$ _! S: g  j1 @8 ^" s3 U                    ComposeFlatBom swComp, bom
; H. _2 u* R' z! X7 z! Z3 n                End If
2 e" ^! t9 r+ T, N: X# m7 R" H            End If
8 H7 w" O( u: y% I/ h  s* ^        Next
6 Y/ U' W# E$ R6 I3 k; w( O% t    End If
! t0 W* g) f) g5 K! qEnd Sub
$ J6 [5 ]$ `$ o( l" p5 K1 m( D. l2 x& r% Q. Y: t* {: x0 K
Function FindBomPosition(bom() As BomPosition, comp As SldWorks.Component2) As Integer: A' d9 V7 V2 ^2 p
    FindBomPosition = -1
6 e. n6 j6 F* e9 o' T! C! {    Dim i As Integer5 D6 c$ i5 Z/ M7 ^1 t
    If (Not bom) <> -1 Then
0 Q8 |$ N2 Z  P: H; y9 ^        Dim refConfName As String
5 A% f3 {9 P" o9 _. ?3 C& @        If MERGE_CONFIGURATIONS Then
  _6 |* F; }6 Z. U1 O1 l8 y% x            refConfName = ""
5 K% W1 @3 I# p+ e( U5 `5 V2 f& Q* u        Else$ ?/ A: ^* M0 {& d5 @0 d3 q% {5 K
            refConfName = comp.ReferencedConfiguration- }3 q5 O- Z" O( O  j
        End If9 t9 v5 F0 |7 z4 i9 G/ S6 d% N" N# \
        For i = 0 To UBound(bom)
7 P' y" \/ }6 o% k/ a            If LCase(bom(i).model.GetPathName()) = LCase(comp.GetPathName()) And LCase(bom(i).Configuration) = LCase(refConfName) Then
6 e; n3 l# C5 U! X6 W6 Y/ G5 a                FindBomPosition = i* S. o1 L+ a% l* |% H
                Exit Function5 O! P" m  g- z" r8 y+ M- m
            End If
  {+ x1 @* N# S6 `+ k! b1 ^" w5 G        Next9 z. ]% {: }" A8 Z  t
    End If
9 ^* a# R, n' {End Function- `2 r' P# s4 c/ D

! Z9 G; z! i: wFunction GetQuantity(comp As SldWorks.Component2) As Double
6 o  p- g3 I4 F6 s" g8 tOn Error GoTo err_( g. j) g* c- g/ M. V' Z) d( x* `9 T9 D# w
    Dim refModel As SldWorks.ModelDoc2
' h* Y# v+ r% |) ^( P$ n  x1 P    Set refModel = comp.GetModelDoc2
4 r" n7 F# t5 K1 U% M0 F0 Q: f    Dim qtyPrpName As String% o/ h* |0 l6 n
    qtyPrpName = GetPropertyValue(refModel, comp.ReferencedConfiguration, "UNIT_OF_MEASURE")0 P4 m! U& a. K6 K
    If qtyPrpName <> "" Then
, R9 _  q, s8 N6 g% k# ]7 h& V        GetQuantity = CDbl(GetPropertyValue(refModel, comp.ReferencedConfiguration, qtyPrpName))% }4 {9 F+ b" u5 |% h
    Else8 s& K/ H" P( s1 H5 ]
        GetQuantity = 1. [$ _% Z7 _0 \# o0 t
    End If# q4 y2 G; m7 V& ^
    Exit Function
+ v: D6 @5 y  t9 g4 o, Jerr_:) \0 I0 b# b2 n% P
    Debug.Print "Failed to extract quantity of " & comp.Name2 & ": " & Err.Description1 f2 h/ C: S) P
    GetQuantity = 1
/ r, B+ W2 M5 S1 {0 sEnd Function
- U% {( @; I( W# ^& g2 {$ }% `5 c/ o1 @
Function GetPropertyValue(model As SldWorks.ModelDoc2, conf As String, prpName As String) As String( D  Z. B- r- q% @4 E/ C, F, F; \4 P( r
    Dim confSpecPrpMgr As SldWorks.CustomPropertyManager
/ z. P8 g% _$ k$ K4 z# |9 K    Dim genPrpMgr As SldWorks.CustomPropertyManager% y# y; c8 L: L) {1 Y3 j# a6 o
    Set confSpecPrpMgr = model.Extension.CustomPropertyManager(conf)& q; y9 q) A9 M3 P6 \1 g
    Set genPrpMgr = model.Extension.CustomPropertyManager("")9 Q/ M& R2 H" G' o$ f/ Q
    Dim prpResVal As String
' @& p; e3 i5 n# b9 I) i    confSpecPrpMgr.Get3 prpName, False, "", prpResVal
+ u8 Z5 Y0 {) J( v1 H6 P3 O    If prpResVal = "" Then
* B- [5 S! b& z% h        genPrpMgr.Get3 prpName, False, "", prpResVal5 ]* G" w6 j) b; O1 y6 y% |5 B$ Y4 q( ?  @
    End If
; i7 z( s+ Z) X7 X+ N, f* j    GetPropertyValue = prpResVal
# h' y8 b4 x% q9 iEnd Function& O; ^( z4 u8 }

1 K: y1 O" U+ Y* [5 QSub WriteBomQuantities(bom() As BomPosition)* \% h: p% p$ E6 }" ^, p
    Dim i As Integer
; R# c- K1 `+ B$ P, {3 Z    If (Not bom) <> -1 Then
- ]9 N: g! N# B7 R        For i = 0 To UBound(bom)3 k# v' n3 R$ G+ D! b: }
            Dim refConfName As String
4 u8 Y6 Z0 L1 w& r            Dim swRefModel As SldWorks.ModelDoc2
& o& U) O/ [  D  c! D% {' g            Set swRefModel = bom(i).model
6 i) ]4 j" ^6 ~5 L4 a            If MERGE_CONFIGURATIONS Then" D3 j8 v! F: c) P# ?: O0 J
                refConfName = ""
! q6 H- `6 x7 ]9 ?! v% R' U            Else
6 H$ S$ h) ~1 [+ R. Z8 T  y% q* v) J                refConfName = bom(i).Configuration
; g8 p; x, o4 Q4 V$ \                If swRefModel.GetBendState() <> swSMBendState_e.swSMBendStateNone Then
' D: _) _+ u5 N: q! _6 k                    Dim swConf As SldWorks.Configuration
4 R2 [1 o' e) {' e4 y                    Set swConf = swRefModel.GetConfigurationByName(refConfName)
$ @" r1 |3 `' L9 E$ I                    Dim vChildConfs As Variant
, G: {3 P- x3 c. f# p8 S                    vChildConfs = swConf.GetChildren()
) e3 e! G( d- k7 [0 ~4 H2 u                    If Not IsEmpty(vChildConfs) Then% l0 p% @8 X; A1 {' u
                        Dim j As Integer
- _. t. q' `, w# r                        For j = 0 To UBound(vChildConfs)* z& I# m' p+ _# E
                            Dim swChildConf As SldWorks.Configuration" U9 Y. m9 m- i4 d
                            Set swChildConf = vChildConfs(j)4 Y) E5 m. P0 t9 x4 ?& E3 t6 Y
                            If swChildConf.Type = swConfigurationType_e.swConfiguration_SheetMetal Then
4 ?9 V1 v) i) [) y% o                                SetQuantity swRefModel, swChildConf.Name, bom(i).Quantity
: e' M5 f! E5 W. ?! s* O. f                            End If
& ]* n, |, P6 O: o% x) Z7 U- a* K                        Next
- T6 ]$ Q! _0 D$ B$ U  T                    End If
6 J) E5 A5 h: [' E. H7 N                End If1 U" G! J; J0 E$ Y: L6 G2 N; A
            End If
+ c4 t0 R8 `9 h            SetQuantity swRefModel, refConfName, bom(i).Quantity1 k( H- C( A' d5 P. I- l
        Next
8 e& F$ R# w6 C) W$ K/ p    End If- P7 x% J6 G% D: @3 c" q! d
End Sub5 y2 Y3 J& [6 Z
$ @  g) d( E* J3 n2 F6 N; S7 z% `
Sub SetQuantity(model As SldWorks.ModelDoc2, confName As String, qty As Double)3 a6 H7 Y* M, Q  X* [# x7 ~- l& }/ l
    Dim swCustPrpsMgr As SldWorks.CustomPropertyManager' V+ q9 V7 ]3 [1 P2 x& j
    Set swCustPrpsMgr = model.Extension.CustomPropertyManager(confName)
) n3 e: o. x1 b: A    swCustPrpsMgr.Add3 PRP_NAME, swCustomInfoType_e.swCustomInfoText, qty, swCustomPropertyAddOption_e.swCustomPropertyReplaceValue$ s6 E; s; R, W
    swCustPrpsMgr.Set2 PRP_NAME, qty! Z/ _' e* M7 i* y
End Sub
) B3 F) @3 @7 I* i: _
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2024-10-7 16:38:14 | 显示全部楼层
楼主,能求个宏吗?不会搞6 y; n' M6 Z$ U. R5 P4 L5 E9 D5 p
回复 支持 反对

使用道具 举报

发表于 2024-11-21 16:35:10 | 显示全部楼层
看前方 发表于 2024-8-14 19:128 m8 f% W$ J$ Y
一直都是用凯元,自带了这个功能

4 t+ K1 H$ V# e" z, v) e3 J2 V5 U在开元没有看到这个功能啊
; `9 T% b0 e( q" V, S0 e7 ]3 Q) O, v5 {# h
回复 支持 反对

使用道具 举报

发表于 2024-11-21 16:35:50 | 显示全部楼层
sycfj 发表于 2024-9-7 09:36
1 _$ c' J; g7 T2 ~也就是说零件模板中要自定义属性 数量

6 j( g; S; L3 ~1 g3 g刷个威望下附件
# U/ u  A  X; r- {1 A
回复 支持 反对

使用道具 举报

发表于 2024-11-21 16:36:08 | 显示全部楼层
李邈 发表于 2024-9-7 09:40  W& G: B5 p5 v/ V" l( Z& k7 h
这个宏会在每个零件体里添加了自定义属性数量这一栏,并且把数量填好了
/ W' X( c, J; {+ z3 Q你只要工程图去连接就行了
3 m# k- e7 E# H# l' \# x; ^
刷个威望下附件
3 m3 G! W# Q1 g" \6 ^2 [. s
回复 支持 反对

使用道具 举报

发表于 2024-11-21 16:53:04 | 显示全部楼层
sycfj 发表于 2024-9-7 09:248 t' F7 ~! z4 T' {: g- x
这个在工程图,装配体,零件哪个环境中使用
" g) ?) H4 R# W2 ]: {" h6 w
装配体环境中使用
$ o0 L/ U! r" l  b" r7 X
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-4 20:17 , Processed in 0.062139 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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