机械社区

标题: SW宏-零件数量自动写入自定义属性表 [打印本页]

作者: 李邈    时间: 2024-8-14 13:30
标题: SW宏-零件数量自动写入自定义属性表
本帖最后由 李邈 于 2024-8-14 13:41 编辑
: n% U  @- p3 r8 P/ O4 B* x
8 n' S6 B/ }5 I$ S9 R. i加工那边要求图纸上要有数量,我之前都是给图纸和清单的,图纸上不写数量,因为同一个零件我可能会用到不同的设备上,数量不一样,工程图忘记改的话就麻烦了。现在这边加工不习惯看清单。问了同事,之前确实出现过数量写错导致零件做多了和做少了的情况。  h8 H" k# d' p, @
和加工简单交涉无果只得乖乖写数量。
/ V+ G7 Z  @) i' `6 h( z' ^8 X4 V我想要是能在装配体里自动把数量填到零件属性表里就好了,这样每次出图前在装配体里刷一下数量,工程图里的数量链接到零件属性就行。. i' A$ `9 @, a4 u. ]8 B+ w
网上一番搜索还真找到有人写了这个功能。
1 W( R% F* Z) |: ?9 h, ?) q) @& [分享给大家
- ]% p( a/ `# s; i& m: s+ k# Q, ]  j, C/ Z3 w% G
/ C, x1 I7 T* ~( \% m

9 N6 P$ p' s: ~8 H7 ]1 I补充内容 (2024-9-7 15:24):/ Z7 ^/ s  q' R9 M
这个宏文件引用库是2024的,不是相同版本需要改下引用库。代码直接放14楼了,不会改的直接复制代码吧
作者: shengyz    时间: 2024-8-14 13:35
我都是建模时候,直接在属性表写需要多少
作者: 李邈    时间: 2024-8-14 13:35
Const PRP_NAME As String = "数量"
* A. ~8 l: L$ Y+ B* O2 Z& s4 A'双引号内是自定义属性的名称,你可以自己改成你想要的; Y4 y3 |+ U% T. H
' z6 l6 ]1 W; `2 B! S
Const MERGE_CONFIGURATIONS As Boolean = True: t% \0 j) q: L5 I' \
'True改为False的话,会把数量写到配置属性里而不是自定义属性+ k  E2 z: f. B2 ?( \+ a0 |6 Y

* z1 p, I$ J0 P  RConst INCLUDE_BOM_EXCLUDED As Boolean = False, u" S2 R8 l; y. \. g
'如果你要把封套的零件也算进去,这里改为 True
作者: 李邈    时间: 2024-8-14 13:36
shengyz 发表于 2024-8-14 13:35
# M; a2 e2 q- l% q$ D" _- c我都是建模时候,直接在属性表写需要多少

5 V7 B7 z% c+ |; V我做非标,设计完成之前不能确定零件数量
: E" [- K+ b6 Y5 ^' D
作者: 看前方    时间: 2024-8-14 19:12
一直都是用凯元,自带了这个功能
作者: sycfj    时间: 2024-9-7 09:24
这个在工程图,装配体,零件哪个环境中使用
8 K# p' W% P3 y3 m
作者: 李邈    时间: 2024-9-7 09:25
sycfj 发表于 2024-9-7 09:24
; M, p/ [8 m; U* T1 \/ x这个在工程图,装配体,零件哪个环境中使用
2 P' h; h+ s3 ]
装配体中使用4 G9 b' `. D" U/ v

作者: sycfj    时间: 2024-9-7 09:27
能详细说明怎么使用吗?我在装配体中使用这个宏以后,工程图中不会出现数量; `7 Y% Q0 D; A: J

作者: 李邈    时间: 2024-9-7 09:29
sycfj 发表于 2024-9-7 09:27
! {# K; {) b! }. V6 p# ?& }能详细说明怎么使用吗?我在装配体中使用这个宏以后,工程图中不会出现数量

" U' \( ~) c+ V你需要设置一下工程图的模板,让工程图里数量那一栏链接到零件体自定义属性里的数量4 P2 Q0 e  h: q3 c6 V( J# t0 c0 E

作者: sycfj    时间: 2024-9-7 09:36
李邈 发表于 2024-9-7 09:29$ P. r1 M( e# ~
你需要设置一下工程图的模板,让工程图里数量那一栏链接到零件体自定义属性里的数量

8 {$ ^8 g  Q1 T- h/ h也就是说零件模板中要自定义属性 数量
1 {  F4 f# f8 K4 e# W; x6 M, P3 B
作者: 李邈    时间: 2024-9-7 09:38
本帖最后由 李邈 于 2024-9-7 09:41 编辑 ' E1 c/ Q3 K: q0 w
sycfj 发表于 2024-9-7 09:27
; v* R) X8 X5 f能详细说明怎么使用吗?我在装配体中使用这个宏以后,工程图中不会出现数量

' y. n2 b0 C( N* @- X9 k5 n% rhttps://baijiahao.baidu.com/s?id=1796657905732909661&wfr=spider&for=pc- _2 z) V6 h) Y( e3 {
按照这个方法设置,他链接的是仓库 你连接数量那一栏就行了/ Z' i5 z$ r+ `6 f, ]
设置好之后,把工程图文件另存为工程图模板,删掉上面的视图,下次新建就会直接出现
6 f6 \; w) v+ u5 x( o; P- x; Y, ?以前出的工程图,用批量替换模板的工具,全部替换成新的工程图模板就好啦
' ?: }" H/ {& E
作者: 李邈    时间: 2024-9-7 09:40
sycfj 发表于 2024-9-7 09:36
) e( z' j$ G4 B也就是说零件模板中要自定义属性 数量
  Z( `! l6 O  y5 p2 r3 j( I
这个宏会在每个零件体里添加了自定义属性数量这一栏,并且把数量填好了1 X5 F+ b, S$ [( J
你只要工程图去连接就行了7 }* a: @" K' Y

作者: sycfj    时间: 2024-9-7 14:50
李邈 发表于 2024-9-7 09:25
+ y: I4 H; X. R, F& L装配体中使用

3 ?7 c1 K, y% n6 w3 T+ w还是不会用,加个微sycfj2' N0 M+ r) h/ P6 _. t, X

作者: 李邈    时间: 2024-9-7 15:22
Type BomPosition+ \( O" w6 V7 N- {
    model As SldWorks.ModelDoc2( A) M" p+ j1 d- R, F  v
    Configuration As String
( g: M( F/ r0 g4 D" e    Quantity As Double1 c) T, l- ]& @: p9 y; S% t
End Type
$ @3 ~3 Q; j: G. G2 C8 d- R
$ z: W9 ]) o6 x( ~& `7 U0 zConst PRP_NAME As String = "数量"
4 i, Z9 Z0 y' a3 x  j/ X+ AConst MERGE_CONFIGURATIONS As Boolean = True% i4 M- C! w- x
Const INCLUDE_BOM_EXCLUDED As Boolean = False/ O/ A) Z* _* y9 w# k* n8 N/ h

( k% W5 ~9 d( K' qDim swApp As SldWorks.SldWorks+ L7 J  c1 J+ ^0 |0 `$ A" x2 ~* i
Sub main()* h/ z5 v7 ]7 p& O
    Set swApp = Application.SldWorks
  B$ z/ u- m* U  t) rtry_:' t; J' z* S' U) q& V8 d4 R6 d2 a! f0 h
    On Error GoTo catch_
. s) v9 a1 u+ e: c- K4 Q7 k    Dim swAssy As SldWorks.AssemblyDoc- A5 u3 B, X, ^' G* |
    Set swAssy = swApp.ActiveDoc0 w+ {% v- J7 L, C  x% ?
    If swAssy Is Nothing Then# k% u- m7 L7 k# Y8 A+ x
        Err.Raise vbError, "", "Assembly is not opened". ?; k3 Q3 q; o; \9 e( x2 b" a. b
    End If
4 v9 Z7 n2 r0 B3 v+ J    swAssy.ResolveAllLightWeightComponents True, C6 s, R" l1 q6 k  T/ V
    Dim swConf As SldWorks.Configuration
9 E8 z' B+ g/ m4 O9 Z    Set swConf = swAssy.ConfigurationManager.ActiveConfiguration
0 R/ b9 s! J& s# s) s) U    Dim bom() As BomPosition
, \, {: E2 _% I( M4 I    ComposeFlatBom swConf.GetRootComponent3(True), bom
. z. L0 v# _" g4 h! @) P% a  @    If (Not bom) <> -1 Then. b3 {7 y. S: c
        WriteBomQuantities bom5 K" Q0 u" w' }' P4 _( y9 r
    End If
% ?* |- W9 }( a  O' ~+ H8 S    GoTo finally_7 C3 ~: v5 Y* ?4 Q* Y( t
catch_:: m2 h! C6 n9 k+ P
    MsgBox Err.Description, vbCritical, "Count Components") U7 L0 h/ k* U% {" c3 \# N
finally_:
' ], g8 A$ Y0 j. u/ P, A% E$ fEnd Sub
; Q  U6 x& i/ U1 d! Q) m4 x. M6 R) J6 k1 c3 ]9 r6 [4 }
Sub ComposeFlatBom(swParentComp As SldWorks.Component2, bom() As BomPosition)
- P) `6 M; [1 c# c( ?8 ?: f    Dim vComps As Variant! H) p1 p# o2 x0 k
    vComps = swParentComp.GetChildren' `$ q* g4 j" o+ W5 G& `7 `
    If Not IsEmpty(vComps) Then$ {5 W9 i! I$ v( i
        Dim i As Integer+ }8 T( N6 Z2 ?1 i0 G; }8 k
        For i = 0 To UBound(vComps)+ R0 V# G7 |! ]  D5 l
            Dim swComp As SldWorks.Component2' E" `) b/ e% x+ g9 V  U
            Set swComp = vComps(i)
( e: V% F! v) Z$ s* c* h            If swComp.GetSuppression() <> swComponentSuppressionState_e.swComponentSuppressed And (False = swComp.ExcludeFromBOM Or INCLUDE_BOM_EXCLUDED) Then
7 N3 q* D0 A% a! }                Dim swRefModel As SldWorks.ModelDoc2  r  b. F! y  V3 [% r1 o
                Set swRefModel = swComp.GetModelDoc2()3 ]$ X" \) I1 U- h, A- \: P
                If swRefModel Is Nothing Then
# r- Z3 i3 M7 e' T                    Err.Raise vbError, "", swComp.GetPathName() & " model is not loaded"8 {1 N5 u) u5 s: c' |6 C
                End If0 e5 S+ L( V9 X; M$ ?
                Dim swRefConf As SldWorks.Configuration* D. F- q4 p+ U$ d. Q9 Y4 x" S
                Set swRefConf = swRefModel.GetConfigurationByName(swComp.ReferencedConfiguration)
. g+ W# M8 b  W! f, B                Dim bomChildType As Integer
8 v- }  N* R9 a                bomChildType = swRefConf.ChildComponentDisplayInBOM
6 @8 w6 `1 k% }( I  Y- X" W                If bomChildType <> swChildComponentInBOMOption_e.swChildComponent_Promote Then
7 y9 {* ~' X" Q- A                    Dim bomPos As Integer" m7 J: P5 Q$ x2 g( k
                    bomPos = FindBomPosition(bom, swComp)* I* b* t/ S6 H$ [* w% s
                    If bomPos = -1 Then
% i8 P5 K: B5 K! J/ B8 y+ w                        If (Not bom) = -1 Then) F# j7 s  R9 P
                            ReDim bom(0)
' s0 l& [. l! t9 X: a                        Else
3 o' x  q  [7 m- y) e                            ReDim Preserve bom(UBound(bom) + 1)
- A9 J* f* D/ o                        End If6 s+ Q, o- G" V4 y
                        bomPos = UBound(bom)7 D; r- S! E5 ]; B. j
                        Dim refConfName As String) z/ k( O2 I! Y7 Y1 i$ n/ I
                        If MERGE_CONFIGURATIONS Then
) I9 |* U4 S9 H* _' l( g" H8 P                            refConfName = ""
9 G. g/ b) M8 x% [% @  P' u                        Else
) @  r; y: }0 E' Z! B  P                            refConfName = swComp.ReferencedConfiguration
+ ]# A* ?" n$ H( ~                        End If
8 y' _: H( ]9 z" A9 C3 L- K. x                        Set bom(bomPos).model = swRefModel
" ^. s' G2 \+ i                        bom(bomPos).Configuration = refConfName
" ]! ]7 J5 q$ A8 s6 b                        bom(bomPos).Quantity = GetQuantity(swComp)
$ n; a" U0 ?+ c7 h% s4 g                    Else4 G+ G+ B2 u" a+ I# ^2 ?1 K( j
                        bom(bomPos).Quantity = bom(bomPos).Quantity + GetQuantity(swComp)  q) D, K8 y' ^" L8 C' v$ W
                    End If
# W* X: e' B( `, i: q( a                End If- h& F& ^/ g4 r- Q  A% w) S
                If bomChildType <> swChildComponentInBOMOption_e.swChildComponent_Hide Then8 v# G" n& q$ O& l6 F
                    ComposeFlatBom swComp, bom! l8 ]( c$ R; q" d2 D
                End If
5 n0 k+ {0 R$ d/ v& Y            End If* K5 W9 K3 _6 }
        Next
) I" K/ F1 X4 w; a    End If  j: F6 k' i! m& w, q& \
End Sub
& S1 _3 ]. w7 X& o8 p& h; y8 K3 m. M5 |2 D& [( H4 {4 i8 [( p3 |& n, }
Function FindBomPosition(bom() As BomPosition, comp As SldWorks.Component2) As Integer
6 Z' A0 R) b4 y    FindBomPosition = -1
* J, `# \8 f# }    Dim i As Integer4 s9 f, i2 f" g  P6 @
    If (Not bom) <> -1 Then
% a& \- y: q7 g% i, B  n        Dim refConfName As String) A' N7 w# E$ H3 j6 c
        If MERGE_CONFIGURATIONS Then- x4 {0 d# l$ R- n% n
            refConfName = ""/ D4 N% r: ]' Q' `$ z7 S7 G
        Else
/ A! [) \  k; p5 J/ W            refConfName = comp.ReferencedConfiguration
! W( o. y* X  L8 m) G* M        End If
- }' |$ ]. v3 I7 a        For i = 0 To UBound(bom)4 E$ n& y, g$ X  t+ r
            If LCase(bom(i).model.GetPathName()) = LCase(comp.GetPathName()) And LCase(bom(i).Configuration) = LCase(refConfName) Then
, \2 A0 ?% U% J  G                FindBomPosition = i! I; G; j- c$ J% y& c& {
                Exit Function. D! Y2 p; R/ m9 |
            End If
6 z3 L& Z6 m' R5 o        Next
0 t( R8 }; i% T6 F  M    End If
8 X' u. P0 s; D: REnd Function1 x8 F4 H- e  K! U0 ^
& @9 s7 }  m! c  O! L: d
Function GetQuantity(comp As SldWorks.Component2) As Double
  m( D1 ^4 Q5 fOn Error GoTo err_$ l/ h2 a' J* V0 D+ |" {
    Dim refModel As SldWorks.ModelDoc2
- s0 u# P2 S' `% @" w8 Q    Set refModel = comp.GetModelDoc27 {# x5 [# y8 k5 y! Y
    Dim qtyPrpName As String+ ?7 C: d% m& T  C% T
    qtyPrpName = GetPropertyValue(refModel, comp.ReferencedConfiguration, "UNIT_OF_MEASURE")/ ]' w& c$ Y4 L3 ?
    If qtyPrpName <> "" Then
" j' W* `3 j! P( {) F- j        GetQuantity = CDbl(GetPropertyValue(refModel, comp.ReferencedConfiguration, qtyPrpName))
+ q9 \7 r: M& R9 s1 A1 B; M' v' ^    Else
, v: y! T  c- \0 ]1 z/ u        GetQuantity = 1
7 Z% K7 z6 s2 D& W    End If: N& O% g+ J7 o+ b. m- L
    Exit Function' c, j" T: v* X' C* o4 }
err_:
1 x; X3 Z3 f. Z3 L! {0 z    Debug.Print "Failed to extract quantity of " & comp.Name2 & ": " & Err.Description
! ~9 z2 p+ c7 j5 Y2 `0 j    GetQuantity = 1! O' U0 Q: c+ ^7 u, T
End Function
, f: y0 |3 W/ |' ^4 o6 t0 W$ a, U6 e5 H  }
Function GetPropertyValue(model As SldWorks.ModelDoc2, conf As String, prpName As String) As String! X4 J- }, d  @9 G' ~
    Dim confSpecPrpMgr As SldWorks.CustomPropertyManager) t% w$ c- q) Y& `  k" F2 j& F: H
    Dim genPrpMgr As SldWorks.CustomPropertyManager
7 j( p# c* ~' T6 z7 [( e7 l    Set confSpecPrpMgr = model.Extension.CustomPropertyManager(conf)
4 o/ ], E" s3 w3 h+ l& d    Set genPrpMgr = model.Extension.CustomPropertyManager("")
( l; @7 b( V% @* Y# K8 H0 {    Dim prpResVal As String
% j5 {  P* ^1 ]* x- L$ B+ q/ X7 X    confSpecPrpMgr.Get3 prpName, False, "", prpResVal: u# V% ~$ j% V. E
    If prpResVal = "" Then
/ S' F1 Q1 A" L+ M        genPrpMgr.Get3 prpName, False, "", prpResVal
8 a+ u) q0 b7 B, ^6 M    End If
0 |6 p) h3 j  R1 v5 {1 A" i    GetPropertyValue = prpResVal: q1 ?7 Y, z* n: l4 [9 t+ c
End Function
1 o" Q  X0 I; q7 x, w( _' j: d5 M$ u9 Q9 Z. v* z
Sub WriteBomQuantities(bom() As BomPosition)" O8 T$ j7 p1 J/ u" U
    Dim i As Integer5 V& A. e' ^/ o4 {5 x% I
    If (Not bom) <> -1 Then
% d  ?/ H* x7 P4 r9 o- a        For i = 0 To UBound(bom)9 M$ |! B8 i, v+ G8 g7 L
            Dim refConfName As String, h- C6 N9 p1 d# {" m1 c/ A6 K
            Dim swRefModel As SldWorks.ModelDoc2
* Z. y. Y% S0 a8 }% o; X            Set swRefModel = bom(i).model5 B/ M2 J: x+ Y& @1 R  c9 S
            If MERGE_CONFIGURATIONS Then( ~  m4 x3 G- @; h
                refConfName = ""
. V: @+ Q  n. s8 x# h. B- |            Else' }/ k: s% a! U  _& c% E! F
                refConfName = bom(i).Configuration# T: i. g, @  b8 x
                If swRefModel.GetBendState() <> swSMBendState_e.swSMBendStateNone Then7 l0 Q& r/ ~( E  v' }6 j
                    Dim swConf As SldWorks.Configuration
1 j2 v2 Z! _9 L; `( M                    Set swConf = swRefModel.GetConfigurationByName(refConfName)) A7 n' r6 [+ x
                    Dim vChildConfs As Variant
. ~# H, ?, Z4 Z: ?/ g/ \9 Q- \2 m                    vChildConfs = swConf.GetChildren()
: b  W! S8 l1 T                    If Not IsEmpty(vChildConfs) Then9 @8 n1 [6 Z3 S0 R+ O
                        Dim j As Integer% I, o( a+ h# S3 I; I6 i7 N3 e+ }9 u
                        For j = 0 To UBound(vChildConfs); t. s. Z0 q; o6 f9 J# \4 i: Z* _9 \
                            Dim swChildConf As SldWorks.Configuration
8 U3 p) z7 z7 Q8 K$ K                            Set swChildConf = vChildConfs(j)
% l4 Z5 j( B1 P( w! F8 ]2 j                            If swChildConf.Type = swConfigurationType_e.swConfiguration_SheetMetal Then9 q+ K! X* m# D
                                SetQuantity swRefModel, swChildConf.Name, bom(i).Quantity
& b5 i4 F% P+ f0 I+ c                            End If
; `2 q3 N7 i/ p                        Next$ k. {0 e7 H1 ]- j
                    End If
3 e4 Z" Y! {: Q3 x2 y                End If1 p& g$ B4 j/ ]& o( m' I
            End If# s4 D- ^: p2 v! |$ _, w7 m
            SetQuantity swRefModel, refConfName, bom(i).Quantity9 R& S2 N( g8 q) j- m% L( n4 e% _
        Next. \% _; Q( c, |' w8 D! H
    End If2 L9 k  s4 f+ L! J
End Sub
/ z; {0 [2 J/ I1 ]: J  [' \# P" G/ I9 K. {, T
Sub SetQuantity(model As SldWorks.ModelDoc2, confName As String, qty As Double)$ c, f. q- {- h, T3 ^$ W
    Dim swCustPrpsMgr As SldWorks.CustomPropertyManager
- l+ Q( y* Y( Y    Set swCustPrpsMgr = model.Extension.CustomPropertyManager(confName)
$ h1 E9 Y; w0 f/ c$ v" H* m    swCustPrpsMgr.Add3 PRP_NAME, swCustomInfoType_e.swCustomInfoText, qty, swCustomPropertyAddOption_e.swCustomPropertyReplaceValue' Y  S6 G9 L+ g' n/ X
    swCustPrpsMgr.Set2 PRP_NAME, qty
6 H" r  [  |6 {5 ?# S0 \" DEnd Sub
+ `1 c6 o1 X* R1 C1 H: Z2 P
作者: 我是小刘    时间: 2024-9-14 12:31
感谢楼主的分享 找了好久了
作者: 土豆土豆442    时间: 2024-10-7 16:38
楼主,能求个宏吗?不会搞7 Q3 t+ U0 J, M1 w0 f

作者: faker558    时间: 前天 16:35
看前方 发表于 2024-8-14 19:12
3 F5 i" q% [1 f% z$ ?9 ^. N一直都是用凯元,自带了这个功能
" T  ^% h* L1 Q7 {5 d4 ]" C
在开元没有看到这个功能啊" P  W4 l2 ]7 e$ u  C8 B$ ?
5 l9 J  L- j4 ~0 |& t' \4 U

作者: faker558    时间: 前天 16:35
sycfj 发表于 2024-9-7 09:36
: Z1 g0 V8 ^7 L  I' k+ L/ D也就是说零件模板中要自定义属性 数量
1 R; y& T8 i: }) i: T
刷个威望下附件
$ |9 l! d3 }5 y* [+ P* a5 m
作者: faker558    时间: 前天 16:36
李邈 发表于 2024-9-7 09:40
% u- i$ D( J$ l$ O$ Z这个宏会在每个零件体里添加了自定义属性数量这一栏,并且把数量填好了, J8 w: x# @/ x5 S( Z3 l# ]4 d" Y7 R* M
你只要工程图去连接就行了

! M+ c( R0 s1 j8 m/ H刷个威望下附件
% b1 ?0 i( {. i4 X( Y2 P
作者: faker558    时间: 前天 16:53
sycfj 发表于 2024-9-7 09:247 \7 o* d, P2 s9 `
这个在工程图,装配体,零件哪个环境中使用
: r2 r! c' E( C' d7 m% i1 l% J& N: i
装配体环境中使用# N7 W8 i5 J0 c" ?6 d

作者: 看前方    时间: 前天 19:55
faker558 发表于 2024-11-21 16:354 X( m: r8 \+ u( c# Y* j/ ?" d& J: `
在开元没有看到这个功能啊
; m0 W4 x3 u9 I2 a, }
有的呀,BOM工具里面
% B+ A1 P  W2 K1 e我这个后面自定义了一个数量的项目,这个项是写到零件属性里面的,所以加在后面跟插件的数量对比,如果不一样,就改成和插件统计的一样,这样零件属性里面就有数量了, M1 }. i0 }4 q* w

作者: faker558    时间: 前天 20:34
本帖最后由 faker558 于 2024-11-21 20:44 编辑 0 E2 Y9 s5 |0 z
看前方 发表于 2024-11-21 19:555 s1 b7 t9 ~0 U) p& h# F6 o
有的呀,BOM工具里面7 ~+ R" E/ X3 |! A
我这个后面自定义了一个数量的项目,这个项是写到零件属性里面的,所以加在后面跟 ...
, v$ |& e0 x: W* j# s
感谢楼主,找到了。但是是付费项目,我下载了你的宏文件压缩包,运行了这个宏,怎么毫无反应,零件自定义属性里也没变化,没有自动写入数量,有什么注意事项吗
作者: 李邈    时间: 昨天 08:08
土豆土豆442 发表于 2024-10-7 16:38
, `# @7 P; ?. j5 M* ~楼主,能求个宏吗?不会搞

# Q1 a1 ?- D/ Z) ]' ~' \3 }; K一楼就是
! t7 n0 A* W: `- a! x. q$ d, B
作者: 李邈    时间: 昨天 08:08
faker558 发表于 2024-11-21 16:36
6 c3 ^, I1 T  k3 L. |, c5 b1 y6 Y, x刷个威望下附件
, Z9 H8 t' {1 h2 a& C2 O0 B
就怕你威望不够,代码都给你了
3 e- l4 e8 a% l% K+ h% s0 q1 E* w
作者: 看前方    时间: 昨天 08:48
faker558 发表于 2024-11-21 20:34
$ E6 R6 h! V9 B/ t6 s感谢楼主,找到了。但是是付费项目,我下载了你的宏文件压缩包,运行了这个宏,怎么毫无反应,零件自定 ...

9 B( `; c. |; t+ s那个宏不是我写的,我没有用宏: _* @! f% Z& s# b- N: j
我截的那个图里面,前面那个总数量就是插件统计的,但是那个数量写不到零件属性里面,所以我在后面加了一个数量的项,这个项是可以链接到零件属性里面去的。然后按照插件统计的总数量手动填上去,零件数量上就有显示了. v7 |( M7 L5 H# @  \! M( L# q* X

作者: faker558    时间: 昨天 11:30
李邈 发表于 2024-11-22 08:08" C' L6 X) _  O2 w' L5 I+ `
就怕你威望不够,代码都给你了

/ ]5 h1 Y. s4 ~7 j' A楼主,我用了你那个宏,怎么属性列表里的数量没有变化
2 k) @+ D) i4 g9 g. T8 h* {
作者: faker558    时间: 昨天 11:31
李邈 发表于 2024-11-22 08:087 W1 E  v/ N& B! X& v6 e' S
就怕你威望不够,代码都给你了

+ \) O2 w* y6 J5 `) ^压缩包的我试了,复制代码也试了
作者: hdgd501    时间: 昨天 11:49
感谢楼主分享,很不错!
7 G$ k" J" S1 P3 {' n. E' H6 K楼主辛苦了!
作者: faker558    时间: 昨天 11:49
李邈 发表于 2024-11-22 08:082 [  |$ [6 k: \0 V) ]+ \. I$ i" h
就怕你威望不够,代码都给你了
7 z* p$ i* h/ {: R
十分感谢楼主,可以用了,我的SW版本是2020,把库改成2020就可以用了,十分感谢
' |' l& W$ I+ ^9 z% d- v/ Y/ x
作者: faker558    时间: 昨天 11:58
我用手机助手写了一个宏程序,不知道为什么用不了,语法错误,楼主可以帮忙看看吗0 P" A  p) W- i5 B2 j( z& L
以下是一个用于SolidWorks(SW)的向装配体里面写入零件总数量的宏的示例。此宏使用VBA(Visual Basic for Applications)编写,可以在SolidWorks的宏环境中运行。请按照以下步骤操作:5 C& @; Q. j2 L# P

1 P8 p+ h7 R8 L1. 打开SolidWorks并启用宏环境4:
" d. m: g/ }8 F8 D确保你的SolidWorks已经安装了VBA宏支持。
  w3 C2 O) _6 e& D- q( q. Y打开SolidWorks,并启用宏录制和运行功能(通常在“工具”或“选项”菜单中可以找到)。3 r- y+ Q; j6 {7 P$ |7 \
2. 编写宏代码:1 S9 g; j! q- x  t7 o0 r
 
4 c7 N" a6 a1 eDim swApp As SldWorks.SldWorks
3 w+ g! I' i, a/ l. U8 LDim swAssy As SldWorks.AssemblyDoc% g$ y6 I$ a8 e: ~; c. x$ Z0 M4 O# @
Dim swComp As SldWorks.Component2
9 R0 G! \  i5 h- MDim vComps As Variant
( Y8 `3 v8 ^7 BDim i As Long, totalQty As Long, H- t' ~8 `1 H7 P2 G8 H& w
Dim customPropMgr As SldWorks.CustomPropertyManager1 A  A  w5 z" g" P
Dim customPropName As String- b; x+ Q7 @" o( }& R
" U/ F6 _. Y+ y5 T' S4 S
' 初始化SolidWorks应用程序对象5 I3 C% ]- O% R
Set swApp = Application.SldWorks
  m( ?; y" P$ f( m" z
3 Z8 ?' N/ Q' M# \$ a' 获取当前活动的装配体文档0 Y7 _0 ^% i  j5 a' p) C
Set swAssy = swApp.ActiveDoc
3 L0 g3 M- D6 D! u0 ?& y
) E% a& f0 r$ V6 i7 X4 x* b' 检查是否为装配体文档
7 N7 E* q) N9 W$ _5 m+ C9 _8 ZIf swAssy Is Nothing Or swAssy.GetType <> swDocASSEMBLY Then6 a1 N7 R# D( c0 c* g( S
    MsgBox "请打开一个装配体文档。", vbExclamation$ C( k1 G2 W- D1 }' Z1 ~, O) `
    Exit Sub
: j( `% r" [8 xEnd If
, B  O0 u2 g) S$ j- r* g7 R: L
- l3 z9 Q% f* W% i/ P' 初始化零件总数量
8 x3 k$ b6 m. [; {! S& OtotalQty = 0
0 `4 o2 A- F4 S
$ J' E0 F5 O+ F; N# A  B  _$ z' 自定义属性名称,用于存储零件总数量
# \+ {& _# w- t; q; mcustomPropName = "TotalQty"9 B' `! y# h1 S8 |8 q( j2 e

: H% M+ d' [0 }: ~) `' 遍历装配体中的所有组件
! i+ d; k  T3 r8 GWith swAssy.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)( p/ [3 c, l+ M) r/ i
    Set vComps = .GetChildren
- w0 M5 y4 ^/ R- M9 g. r( u    If Not IsEmpty(vComps) Then
: |9 Q$ Y4 L1 P        For i = 0 To UBound(vComps)# G. k/ T( f$ w* F* B
            Set swComp = vComps(i); {' S7 J8 y7 f
- s2 Q: r3 ^9 k2 A. i
            ' 检查组件是否被抑制,如果没有被抑制,则计入总数! x# K; [. [7 V8 Z- f
            If swComp.GetSuppression() = swComponentSuppression_e.swComponentNotSuppressed Then* ^$ v" C( X( w& d9 Y; U
                ' 如果组件是零件,则数量加1
0 w! ]' u1 l! p& O                If swComp.GetType = swDocPART Then
0 l& f  d( t0 ~8 W                    totalQty = totalQty + 1
% R( }# V, T/ e, a  i/ B2 t                ElseIf swComp.GetType = swDocASSEMBLY Then& O+ h4 |8 R. T( \4 |- b8 f, t* ^
                    ' 如果组件是子装配体,则递归计算子装配体中的零件数量3 _- z. z" f; \: K
                    ' 这里为了简化示例,不递归计算子装配体中的零件数量! _) J( a; Z8 Q1 q
                    ' 你可以根据需要添加递归函数来处理子装配体
# i( L( Z' q" V# _8 a                End If. y* l, A: I# H6 E( P# I! E
            End If% t8 D( l, w: Y# J
        Next i  k8 m7 X2 P& K- }: c$ W& j
    End If. ]/ M- x+ ~* c8 w9 u2 y3 o2 k' U
End 5 b: ]. p( V) ]) r& Y6 B
With0 g. a. k" ~+ o% N3 X) R4 o, D) Z: @
' 创建或更新自定义属性以存储零件总数量0 K6 @, ~3 T0 _! e) ]+ k
Set customPropMgr = swAssy.Extension.CustomPropertyManager("")6 B, O1 T6 D# g6 @
customPropMgr.Add2 customPropName, "系统", CStr(totalQty), swCustomPropertyInfo_e.swCustomPropText9 ^+ l8 e8 l" e/ A, }
' 注意:如果属性已存在,Add2 方法会更新其值,而不是创建新属性。: V# i  o8 Z( M
' 如果你想要确保属性总是被更新(即使值没有变化),可以使用Set2方法代替Add2。
- h0 k5 q! \8 {7 k2 s7 g
9 \+ [2 m! i/ c: c' 清理对象9 A, b  z% C. D# i; B
Set swComp = Nothing) K9 l' d, [" Y. v
Set swAssy = Nothing
' G8 P% o1 s; g( h3 pSet swApp = Nothing
6 w, w$ Q* \0 U" P  k1 t0 q' W) `/ o; N5 o6 Y  D; g! G
' 提示用户操作完成
# ^  X, |7 X7 U- Y% mMsgBox "零件总数量已写入到自定义属性 """ & customPropName & """ 中,总数为:" & totalQty, vbInformation
. Y& m" c! h! H' l. V/ A * E- Q& j. `/ ~% S* X3 `
3. 运行宏4:2 M$ E/ f2 g7 Y' R: I! x4 d
在SolidWorks中,打开一个装配体文档。
* ~5 @& q' l- j7 h+ y0 ]; C- D* ]通过宏管理器(通常在“工具”菜单下)找到并运行你编写的宏。) ~8 ?& |0 @* ?" S( h6 Q
4. 验证结果:% f, P9 u7 j9 J
运行宏后,你应该会在装配体的自定义属性中找到一个名为“TotalQty”的属性,其值应该等于装配体中零件的总数量。
- f' k. Z! j8 P* M! l" N**注意事项 **:
$ h5 ]% l. J& w6 I- H% H4 N1 x$ V此宏仅计算装配体中的顶层零件数量,不包括子装配体中的零件数量。如果你需要计算包括子装配体在内的所有零件数量,你需要添加递归函数来处理子装配体。% \: f' k& `3 |, v' e, g+ Y
在运行宏之前,请确保你的SolidWorks文档没有未保存的更改,以防宏运行过程中发生意外导致数据丢失。; p  F6 ~& B+ f5 O% J& \& n
宏代码中的错误处理部分可以根据你的需求进行扩展和完善,以提高宏的健壮性和可靠性。
作者: 李邈    时间: 1 小时前
faker558 发表于 2024-11-22 11:58
# ~0 i& L& m! \1 {, d我用手机助手写了一个宏程序,不知道为什么用不了,语法错误,楼主可以帮忙看看吗
& ^  B; `5 n: i以下是一个用于SolidWor ...

( \  P% e6 i. W7 i不是哥们,你这个怎么连main函数都没有
6 ?3 M1 Z  q. W6 P




欢迎光临 机械社区 (http://www.cmiw.cn/) Powered by Discuz! X3.4