機械社區
標題: 重命名零件宏 [打印本頁]
作者: 怕瓦落地2011 時間: 2023-8-21 21:07
標題: 重命名零件宏
Solidworks 雖功能強大,但有些地方做得不盡如人意,比如三維帶工程圖重命名,就顯得十分雞肋。論壇網友steve_suich發過一個改零件同時改工程圖的宏(http://m.whclglass.com.cn/thread-1058539-1-2.html),雖然有所改進,但不是十分完美。1 D3 n* |5 ]* a8 [5 h
我在此代碼的基礎上作些優化,希望能給大家帶來幫助!5 ^; `5 m1 X) V" s: M3 k! U# t
$ X# a2 j' A3 G4 h' n) IPs:1.前置條件:打開裝配體并選擇零件3 B+ }$ W1 C) k; P$ c" e' G+ l% k; A
2.使用方法:運行宏后輸入名稱
$ i' _8 u$ `6 ^1 L1 p4 `4 ` 3.運行結果:同文件夾下生成新零件及附屬工程圖并保留原工程圖
9 [5 H. Q# w m% G* g0 L( y ]9 I/ ~! i4 R T: b+ I4 y
Dim swApp As Object
# |9 o# T# H& f Dim Part As Object. B9 L, H$ Z, ?0 k! \0 o
Dim Error As Long: R2 m1 v8 {1 {$ G; @. D! k# k q
Dim Warning As Long) c }( [* y u l' N6 z
Dim mip As String$ x3 d5 o; d7 ]1 M. c. ]
Dim Status As Boolean
# w" ~8 d' \% w2 e! B: Z7 |Dim Newpath As String
5 k- N8 W" v& S7 O. vDim mipname As String( y( N j3 C5 J% q2 K) v8 I* [
Dim vDepend() As String
8 e. }" W+ R( }( |1 n9 k; u( V$ I Sub main()
# e3 \& T7 I7 V+ o% ?' ]' q Set swApp = Application.SldWorks" Q- W1 g7 e6 V
Set Part = swApp.ActiveDoc3 L2 j# ?) _% {* Z3 }
Set swSelMgr = Part.SelectionManager3 }) h* j% C/ I4 Y% s- f4 U
Set swComp= swSelMgr.GetSelectedObjectsComponent4(1,0)7 V7 b7 \9 y N w! E
swComp.SetSuppression2 (3) / W( o# i4 }9 i" k: Z4 I9 b
Set swSelModel = swComp.GetModelDoc2! p% A4 S2 M2 d4 z6 H3 ?, E/ z
Set swSelModelext = swSelModel.Extension1 W# v- ~! D4 E/ z9 @1 y; v% [
; m( x) X# I! c6 b1 U
oldpathname = swComp.GetPathName
2 B% S( m4 s8 g% h! v
4 `) k, l3 [8 a Path = Left(oldpathname, InStrRev(oldpathname, "\")) '路徑
7 L+ V9 r& I" e2 q: K Debug.Print Path
' a! O; \* @9 w& E o" { ntype = Mid(oldpathname, InStrRev(oldpathname, ".")) '后綴 E1 t, C8 q4 w& n) v
Debug.Print ntype* D; s9 G3 z' l3 H) c) j4 v
oldfi = Mid(oldpathname, InStrRev(oldpathname, "\") + 1) '舊文件名3 ^" Q# w2 ]: l8 @% `9 E Q
Debug.Print oldfi* o* Z1 Z0 y& F& C
oldname = Left(oldfi, InStrRev(oldfi, ".") - 1)
! u3 v0 _9 D% l: B8 J mipname = InputBox("changename", "name", oldname) '新文件名9 L& C5 R4 l$ a6 i! H* A
0 o) o% v, K+ e) X8 j) i
mip = Path & mipname & ntype '新文件名帶路徑
+ {$ l& v( Y8 l6 g; H Debug.Print mip$ j. V% K, @2 Z; W
: D! {7 G5 i6 \% g# Q+ K. N
If mip <> "" Then6 e+ c, I9 x. W0 `4 H- G
Status = swSelModelext.SaveAs3(mip, 0, 512, Nothing, Nothing, Error, Warning) '更改零件文件名(替換裝配體中的原文件)
! u7 M& s; R2 L1 H: P7 w Debug.Print Status) y' g! N( G1 Y n& I; F/ p
'========================: |( B+ D0 ] _% F, [& P1 [8 r
'更改工程圖文件名
! w" [/ Y! h B( b0 z Debug.Print Path
4 T3 X" y% X0 m% ^8 Q! \! F# U: m tmpfi = Dir(Path & "*.SLDDRW") '遍歷原文件夾中的工程圖文件( L4 P4 P' }/ v3 q+ L0 {$ W
Debug.Print tmpfi
8 d! e8 c7 W7 b9 `# j; L Do Until tmpfi =Null : M7 _+ ^; t$ `! k
tmpfiname = Mid(tmpfi, InStrRev(tmpfi, "\") + 1). z: R& Q; D, A: t+ f7 l4 F
Debug.Print tmpfiname
( E( z) h: H8 z' o |+ R tmpoldname=mid(oldfi,1,instr(1,oldfi,".")-1) & ".SLDDRW"
% j) ~* B* p" R! w Debug.Print tmpoldname' J. o% y5 C5 d
If tmpfiname = tmpoldname Then '查找同名工程圖
) ~) A; x: ?; B! n" { newdrwname = Path & mipname & ".SLDDRW"
& Q+ O3 m/ ]6 v% x, A. C Debug.Print newdrwname
# `# T1 ?2 |% V/ R; N( @ olddrwname = Path & tmpfi$ B* ?, w, H5 o$ }/ l2 ?6 s
filecopy olddrwname,newdrwname '復制工程圖到新文件夾1 [0 V& N+ @2 U7 \& @. J/ X
vDepend = swApp.GetDocumentDependencies2(Path & tmpfi, False, False, False) '查找工程圖依賴
3 l; E7 a) O1 J0 A2 H5 g$ e& m Debug.Print vDepend(1)
3 A/ D3 q9 L% ]) k bl = swApp.ReplaceReferencedDocument(newdrwname, vDepend(1), mip) '替換工程圖依賴
) W% F5 T; h$ R4 Z* O) K$ c/ v% d: ]( m& r" U4 ?, x E
Debug.Print bl5 E" R" a( X$ ]2 `" v
Exit Do
. B5 f) V# c( f' j- m( l% f End If
k G, W/ x; ~& t tmpfi = Dir3 j# L9 ^9 A, j1 B# |/ s% a) U
Debug.Print tmpfi5 Z& G! Z5 I- U5 \
Loop0 {* {/ K; {3 x3 T+ s Q) f
End If
& o( a% d' F$ J9 `' d% m End Sub
: i. T4 d4 b- ~8 H+ \5 S' I/ ~" S8 D* i. k: T' q0 ^
0 | C$ `. r+ m
, N/ ^: Y# l0 Z# Y0 e2 H1 q9 n# j6 P" m
; j- \" }/ D' [ F5 k# j( `
作者: ィ心兂鎅 時間: 2023-8-22 07:09
有版本限制嗎?
作者: cc851 時間: 2023-8-22 09:57
Solidworks自帶命名,就是不能關聯工程圖一起改而已。從設計流程來說,改名在出圖之前。其實就無所謂要不要插件了。
作者: trongtrongtrong 時間: 2023-8-22 10:14
凱元工具也可以批量改名
作者: 怕瓦落地2011 時間: 2023-8-22 21:14
* C2 `$ z; T2 k
授人以魚,不如授人以漁* N& M. ]8 s6 B" b% T* v
作者: shasu 時間: 2023-8-24 16:19
謝謝版主 分享
作者: liyizheng5566 時間: 2023-11-8 16:07
復制粘貼過去代碼錯誤
作者: liyizheng5566 時間: 2023-11-8 16:08
顯示代碼錯誤 一片紅
作者: lonelysnakejj 時間: 2024-3-26 11:09
怎么拷貝好一些,復制都是亂碼
作者: Dustry 時間: 2024-4-3 13:29
運行報錯咋解決啊大佬
5 J4 U) E# b/ O5 m3 C* }
作者: Dustry 時間: 2024-4-3 14:26
& m5 G& K" Y0 oStatus = swSelModelext.SaveAs3(mip, 0, 512, Nothing, Nothing, Error, Warning) '更改零件文件名(替換裝配體中的原文件)
1 g$ W9 s- a) Q" }" t4 ^$ f! m# f對象不支持這個屬性或方法(錯誤 438)
/ }1 \' D* x9 X; Q. [
作者: peiyj 時間: 2024-4-4 12:44
運行出錯
) H* T6 V" Y/ |: M: d" z+ \
作者: 頭鐵楊 時間: 2024-5-20 14:38
好用,如果再加個刪除原圖紙就更完美了
作者: 落葉luoyi 時間: 2024-5-23 13:01
提示編譯錯誤:沒有適當的對象,方法無效
2 C0 \. b+ c! ]: g大佬,這個怎么修改啊
作者: cot 時間: 2024-6-2 21:04
感謝
作者: 小菜雞123 時間: 2024-9-3 10:13
( x. t4 q6 Q( K f7 t為什么復制了代碼,點擊了啟動,沒有反應,重新啟動也沒有反應,代碼里面紅色的,這個有關系嗎?
作者: 東海之上 時間: 2024-12-18 17:24

* t+ |, ?# Z- m6 N# l4 q# i7 [
請問下,卡到這步是什么問題呢?零件名已經更改過來了,但是工程圖沒動靜。
1 m- I8 F, q# n* m* L# {( q' I7 `
作者: 一米陽光7915 時間: 2024-12-19 13:54
要是能刪除原始模型和工程圖就更好了
作者: 大江大河-Meche 時間: 2025-6-7 17:02
' \1 a. x: Z( b' A+ M0 z* N6 |" y版本不適,不支持函數/ B* g3 a' R. P$ T+ ?! \
作者: LIULISHAN 時間: 2025-6-29 23:39
Dustry 發表于 2024-4-3 14:26
) t( ?% o. v9 Q9 `1 F' A; VStatus = swSelModelext.SaveAs3(mip, 0, 512, Nothing, Nothing, Error, Warning) '更改零件文件名(替 ...
. |: f2 Z9 h r
拿去,不用謝
) K1 b8 a$ d2 i1 e) _$ {! }1 qStatus = swSelModelext.SaveAs2(mip, 0, 512, Nothing, "", False, Error, Warning) '更改零件文件名(替換裝配體中的原文件)
4 ~, I* s! b; n- ~3 ?4 t( ?2 T `1 G5 {
) |- |' N( H5 B$ [2 n1 b
作者: TAXUSDONG 時間: 2025-6-30 08:00
) n% g3 U6 W. @6 N; O截圖,自己重新輸入一遍,也是一種學習。我以前試過復制,都是亂碼,這次準備這樣試一下。# m( b9 w6 t, t7 L1 j7 s$ J
作者: LIULISHAN 時間: 2025-7-1 22:29
$ n0 K- C# S+ _7 q- A
亂碼一般在尾部,刪掉就好
4 D6 r4 v3 C1 ~& S9 E
作者: woodygor 時間: 2025-7-4 09:51
如果選中的零件已經打開工程圖 宏命令會報錯
: w- ~5 E/ j/ Z
; b1 b- E, g% `6 L U這個bug可以解決嗎
5 d7 t1 N: I* S* w0 z6 ~; D, b0 W) _; H4 w1 o; V
% _7 {) I9 n- d% y+ O: S' r補充內容 (2025-7-10 09:13):
$ A0 L2 U" ^3 z2 A7 J8 W* U8 F還有零件沒有工程圖也會報錯。。
作者: LIULISHAN 時間: 2025-7-22 22:52
! ^7 l6 Q y9 g* G) w7 x5 d
問題出在 FileCopy olddrwname, newdrwname" J1 l* I4 J8 R" \% O
Copy、CopyFile、FileCopy的用法+ [9 L5 R' u7 V; s; {8 ~
! ]9 M6 e6 W* E0 L% u
1、Copy 方法, B) w9 ^7 ?0 b+ w( l
描述6 x4 n K( N0 l1 V) ]& Y
把一個指定的文件或文件夾從一個地方復制到另一個地方。7 a1 h& G3 P2 _9 m; k. O
語法
! E) W6 } F* j2 ]object.Copy destination[, overwrite]. j" Q2 n, d) c8 ~( l3 n. L7 T/ b
Copy 方法語法有如下幾部分:4 Q0 F( ^5 w# w3 v
部分 描述
9 B# C3 K1 ^0 X3 w: `, v. t1 Y0 ^object 必需的。始終是一個 File 或 Folder 對象的名字。0 q0 C f- ^; F# c* l
destination 必需的。文件或文件夾要復制到的接受端。不允許有通配符。
( S. ^, G- q: o) z: j1 D: r voverwrite 可選的。Boolean 值,如果該值為 True (缺?。?,則已存在的文件或文件夾將被覆蓋。如果為 False,則它們不被覆蓋。5 M1 c8 `+ y& u
說明
+ b. |/ ?( X* T3 q對一個 File 或 Folder,Copy 方法的結果和執行 FileSystemObject.CopyFile 或FileSystemObject.CopyFolder 操作的結果是一樣的,在后者中, object所引用的文件或文件夾是作為參數傳遞的。應當注意,后面的方法能夠復制多個文件或文件夾。
=============================================================================
2、CopyFile 方法
: S: ~3 Q* A5 _描述
- J3 ~: e! r3 `+ c' ~& r把一個或多個文件從一個地方復制到另一個地方。% j( z2 z' O7 W3 \
語法
2 h/ d4 k7 a8 H$ o9 c+ L( Hobject.CopyFile source, destination[, overwrite]" u, }; n ]2 _2 U, c
CopyFile 方法語法有如下幾部分:$ k' c# b% f5 G) r5 C
部分 描述: X9 g: ^6 b% c2 m$ u
object 必需的。object始終是一個 FileSystemObject 的名字。; A0 X% E, t1 u6 C# q; f8 F- y
source 必需的。指明一個或多個要被復制文件的字符串文件說明,它可以包括通配符。# T) N% T" V' T3 E1 k/ N
destination 必需的。指明 source 中的一個或多個文件要被復制到的接受端的字符串,不允許有通配符。# s- L' v+ T: v2 ?% W% v' ?) a6 n
overwrite 選項的。Boolean 值,它表示存在的文件是否被覆蓋。如果是 True,文件將被覆蓋;如果是 False,它們不被覆蓋。缺省值是 True。注意如果 destination 具有只讀屬性設置,不論 overwrite 值如何,CopyFile 都將失敗。
9 b( K0 S- Q7 K9 b* S' R& H說明/ Q9 e n5 J5 s6 O) z4 o8 L: h
通配符只能用在 source 參數的最后一個路徑部件。例如,你可以在下面請況使用通配符:% M( c3 A4 A, T2 o0 Q
FileSystemObject.CopyFile “c:\mydocuments\letters*.doc”, “c:\tempfolder\”
! i; i. B! @9 K! k但下面情況不能使用:. E1 \$ E' n; a1 o' e5 p
FileSystemObject.CopyFile “c:\mydocuments*\R1???97.xls”, “c:\tempfolder”
; V8 y$ b* {& p( C3 j! D. ?如果 source 包含通配符或 destination 以路徑分隔符(\)為結尾,則認為 destination 是一個已存在文件夾,在其中復制相匹配的文件。否則認為 destination 是一個要創建文件的名字。不論是那種情況,當復制一個文件時,可能發生三種事件。# ^- ]; `2 R z1 U! s
如果 destination 不存在,source 得到復制。這是通常的情況。4 X4 U- ~% a: k/ G/ Y$ A
如果 destination 是一個已存在的文件,則當 overwrite 值為 False 時發生一個錯誤,否則,source的復制文件將試圖覆蓋已存在文件。8 Y# f- `( k2 q+ L9 W
如果 destination 是一個目錄,發生一個錯誤。* f- a2 z9 ?# a6 m' D
如果使用通配符的 source 不能和任何文件匹配,同樣產生一個錯誤。CopyFile 方法停止在它遇到的第一個錯誤上。不要試圖回卷或撤消錯誤發生前所做的任何改變。
=============================================================================
3、FileCopy 語句" a: \ I. S; ?. Q# g; C6 Q" ^
復制一個文件。
4 B9 Q; }& B& D語法6 q. a" j# ^/ [ F' v
FileCopy source, destination9 l) s5 j4 N8 }9 G* x
FileCopy 語句的語法含有以下這些命名參數:
# _) G6 B) z# P$ d0 g8 e `' l部分 描述
, q6 ~2 Y2 V) usource 必要參數。字符串表達式,用來表示要被復制的文件名。source 可以包含目錄或文件夾、以及驅動器。) Z9 l" |- E1 p, F- e( |
destination 必要參數。字符串表達式,用來指定要復制的目地文件名。destination 可以包含目錄或文件夾、以及驅動器。
# N7 i9 D9 I% b, g: c- t說明5 a/ K( n! U! E; \. Y2 x7 u
如果想要對一個已打開的文件使用 FileCopy 語句,則會產生錯誤。
5 A# y( J0 g/ P+ V# L p0 I
/ B N2 e3 X% T) D1 l
作者: 無名水路 時間: 2025-8-24 08:18
復制都是亂碼
| 歡迎光臨 機械社區 (http://m.whclglass.com.cn/) |
Powered by Discuz! X3.5 |