QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3852|回复: 13
收起左侧

[已解决] 如何用VBA编写宏来获取材料的类型?

[复制链接]
发表于 2016-4-19 21:20:13 | 显示全部楼层 |阅读模式 来自: 中国浙江温州
安装
主题分类用于问题归类:

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 goto3d 于 2016-6-12 14:23 编辑 / f2 q3 u  p6 [
0 o6 P; K& K9 T
solidworks2012的材料库里,材料都分了类,如“钢、铁、塑料、橡胶”等等,如何用VBA编写宏来获取材料的这些类型呢?
, b9 ~! q' X5 I5 N8 T6 M+ Y- d 无标题.png
. N5 G- n3 u# M6 E/ Z* U% {0 a- ~2 h4 \: Q5 _3 J
请各位大神赐教,谢谢!4 z! z+ Q. I, u2 v+ f% S6 Y
发表于 2016-4-19 22:55:44 | 显示全部楼层 来自: 中国香港
MaterialIdName
 楼主| 发表于 2016-4-20 20:44:50 | 显示全部楼层 来自: 中国广东
大鹿 发表于 2016-4-19 22:55" f$ H; m+ \- J/ Y3 |0 ^5 Y
MaterialIdName
( b# G8 ~3 b, Z' P* ^3 }1 h8 H% G
能说详细点么?最好能给我举个例子!谢谢
发表于 2016-4-21 08:42:40 | 显示全部楼层 来自: 中国浙江嘉兴

2 k) [" x% B" J參考
% j8 J$ D6 b: H; W# q, u: Z, q+ w& a# ^8 x2 G8 W
  1. Sub main()1 R2 j8 {; [: h) Q, O5 m+ I% B
  2. ) l- d" g9 T2 j* B6 q( t) N
  3.     Dim swApp                       As SldWorks.SldWorks
    8 l& U; a: ]4 v( U" _" C) r& I
  4.     Dim swModel                     As SldWorks.ModelDoc2; c1 r# U9 Q: r3 g6 Z# J
  5.     Dim swPart                      As SldWorks.PartDoc
    . \* b* z& O4 u
  6.     Dim sMatName                    As String
    & E: [$ V  b2 d# L& C
  7.     Dim sMatDB                      As String
    4 N/ J1 `! X0 I" u# Z$ M, W2 ^
  8.     Dim bRet                        As Boolean
    ! ~' c/ E' m; E# ~
  9.     6 R  `3 v5 [$ x" Z- r- M
  10.     Set swApp = Application.SldWorks
    1 ^4 E( t7 _! U, E
  11.     Set swModel = swApp.ActiveDoc
    - x- f6 L7 A' t  S1 p) W5 U8 l" r9 A
  12.     Set swPart = swModel2 e: x6 u" s& e# ~9 f% S
  13.     sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)  P- S- H3 y' P' \- z1 x2 n
  14.     Debug.Print "File = " & swModel.GetPathName
    - m( s" V0 r5 c$ X2 G, Z/ |1 n
  15.     Debug.Print "  Material = " & sMatName & " (" & sMatDB & ")"
    " {' {. ?; |: T; [+ c
  16. ( ?+ q3 W0 o0 b5 h4 z# ~$ ^
  17. End Sub
复制代码
2.png
 楼主| 发表于 2016-4-22 18:18:48 | 显示全部楼层 来自: 中国广东深圳
本帖最后由 kavenlee72 于 2016-4-22 18:19 编辑   K# }6 Z$ o" x% ?! S
ryouss 发表于 2016-4-21 08:42! v, ?/ m1 j, E/ c2 o4 K
參考
6 q! g! z( t3 Z7 d- z
GetMaterialPropertyName2获得的是材料的名称,如“红铜”,我是希望能获得“红铜”的类别,如“其它金属”“钢”“铁”等。
 楼主| 发表于 2016-4-24 22:01:56 | 显示全部楼层 来自: 中国广东
高手不露面,自己顶一下,别沉了
 楼主| 发表于 2016-4-26 21:41:23 | 显示全部楼层 来自: 中国广东深圳
难道SOLIDWORKS API 不能实现这个功能?
发表于 2016-4-27 00:17:50 | 显示全部楼层 来自: 中国北京
你用下面代码试试
  H% ~( B# Y$ U1 u6 J5 ODim swMatDB As MSXML2.DOMDocument, MatList As Variant
1 @7 u7 E" ~8 n    Set swMatDB = New MSXML2.DOMDocument
3 R: `! n- _2 d2 _) r/ B, \'    材料库所存储的路径$ W9 q. e. @3 q
    swMatDB.Load "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\chinese-simplified\sldmaterials\solidworks materials.sldmat"; T- C$ ]4 Z' }% e

. `4 b* D8 e8 P1 ~+ E7 G9 e& l    Set MatList = swMatDB.getElementsByTagName("material")
, A) M$ M6 g5 z6 L& c    Dim MatName() As String, Mat As Variant+ K7 A, D; Z, Z# K  H. N# c1 f
    ReDim MatName(MatList.Length - 1)
. J  w/ A6 @0 e0 p3 J    For Mat = 0 To MatList.Length - 1- ]) h# T. V8 S% U* n0 z

3 c/ V& B/ O+ }+ `+ C        MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue; @6 o$ E" R2 G1 i

' u5 X, A' _. T5 c/ Q    Next Mat
) P+ j& j8 d- U; d; Z0 _9 U: m* Z4 ^/ k2 {6 ]8 @8 l0 T$ K
 楼主| 发表于 2016-4-28 22:33:37 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-27 00:17! I& J; G2 r4 ?$ v: R1 n; Z
你用下面代码试试
0 |. U3 M# `3 v1 @/ cDim swMatDB As MSXML2.DOMDocument, MatList As Variant
! r% A$ V8 ]& r    Set swMatDB = New MSXM ...
, {$ I2 D- F( H+ d" y2 p9 S0 g: \
高手啊!; v' |3 X3 u! q1 x2 ?1 t5 I

6 T, H9 u5 W$ y! c9 d我试试
0 a* g" q3 h( E+ \3 ~3 R' f# ~: {! z4 Q2 @6 |6 J/ N' \0 D3 Z: v
谢谢!. O) ?+ l4 q; L+ O/ K
 楼主| 发表于 2016-4-29 12:44:56 | 显示全部楼层 来自: 中国广东
lhl2008 发表于 2016-4-27 00:17. o! F1 U9 h" t2 s8 I* }
你用下面代码试试# Y0 R4 y8 a+ \. T9 D7 G$ a2 e: G" `8 @
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant+ D" r) b. f- b& z( r6 _
    Set swMatDB = New MSXM ...

" h. h: G* k& E$ P8 I不好意思,您这段代码在solidworks的VBA环境中运行提示“用户定义的类型未定义”,请教是什么问题?如何解决?谢谢
发表于 2016-4-29 12:54:06 | 显示全部楼层 来自: 中国河北廊坊
本帖最后由 lhl2008 于 2016-4-29 12:59 编辑 3 f# G2 z# ?. e6 N* y

$ R" @( M6 i4 R9 k) W在引用中加入 2016-04-29_12-54-12.jpg
5 N! Y" h3 j* }" [' R8 y+ t5 T6 d/ g2 f4 t' z" d/ W
材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。% R7 Y% e& b. i3 X* P" A* k% A8 p
 楼主| 发表于 2016-5-3 16:19:46 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-29 12:546 E% u+ K9 s- p- }
在引用中加入  N( ^6 M6 m& g4 r

& e% c3 C# Z! L5 d/ Q' Q材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
2 m& A$ s  W  X3 e8 F
成功了,谢谢!
# J( Y6 C1 W$ |8 ~' D- ^% l/ ]( }/ k" W! n7 v2 C
但不明白下面这句:1 s8 n' _% p0 _  R1 ~# C3 i
Set MatList = swMatDB.getElementsByTagName("material"),括号里的“material”为什么是"material"而不是其它?
1 i. a8 T6 k$ F" v: C9 k2 I) k2 Q2 ?! m8 ]$ I2 a

0 y6 j' p" p3 f1 g, X) q; z下面是我编写的获取材料类别的全部代码:
' e. b9 T- Q: W9 {  |2 NSub main()
# Q7 H$ A& M% K* C% N! h) x- T  A( H
Dim swApp                       As SldWorks.SldWorks6 w% p+ e; Q8 h, d$ ]
Dim swModel                   As SldWorks.ModelDoc2
0 a6 L& }3 k/ t8 y! J# M2 Z: T# rDim swPart                       As SldWorks.PartDoc7 V- R" A" L3 x9 n; i$ H
Dim dbs                             As Variant2 Q5 W; i4 O0 ]1 r+ V
Dim sMatName                As String
* A+ s+ o# J; O; R5 q+ M- o, MDim sMatDB                      As String
# g- _3 e& O9 C5 F2 m( Q) HDim bRet                           As Boolean; }( t/ G  }4 P
Dim i                                   As Long
7 T4 C# j! E# f$ O8 T/ @. rDim matPath                    As String
8 c0 _  N2 K. t! u4 j5 d" _Dim swMatDB                  As MSXML2.DOMDocument
8 i9 I2 F* o- A4 e+ RDim MatList                      As Variant
' Z- ~- L; L. [5 W) P6 ?
" O* o6 `7 B) R: k% HSet swApp = Application.SldWorks
/ N& O5 d4 u( H7 S3 K7 vSet swModel = swApp.ActiveDoc4 V  U4 y5 d! L! Z0 e
Set swPart = swModel
, G! }* i" Q3 odbs = swApp.GetMaterialDatabases
/ I  [4 G/ r% L+ U0 C2 d( psMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)
, W5 o0 C  e/ n6 Q- u1 K/ D4 iFor i = 0 To UBound(dbs)6 `8 \' K; K+ ?, ]) w
      If StrComp(LCase(Left(Right(dbs(i), Len(sMatDB) + 7), Len(sMatDB))), LCase(sMatDB)) = 0 Then
& s& |( ]& b# n/ _) l& A& H           matPath = dbs(i)
4 {5 T# v! U5 j/ j: v$ O5 s           GoTo MatTpye
3 d+ @( [' c$ U% O      End If2 i$ ?) K- h5 w  E) \
Next i; l! t- B* S/ P1 h, k5 D& J  ^
4 A. u0 `# Q3 s8 `% I4 h
MatTpye:' r4 Q  x  q/ V4 p0 C
Set swMatDB = New MSXML2.DOMDocument9 B6 {9 h0 ]# g8 `  W
' 材料库所存储的路径
% V& N  {# r8 ~: I: }swMatDB.Load matPath7 K5 n2 Z6 y% R0 F7 [8 M( C
Set MatList = swMatDB.getElementsByTagName("material")
. P5 E! a! R5 IDim MatName() As String, Mat As Variant
8 T, E$ A3 F  m7 H  RReDim MatName(MatList.Length - 1)( A0 s9 ^: O" t# Y
      For Mat = 0 To MatList.Length - 1
5 x+ |& r! O+ e6 g: K3 g+ @            If MatList.Item(Mat).Attributes.Item(0).childNodes.Item(0).nodeValue = sMatName Then% J, c3 S/ `+ E
                 MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue3 k/ W( }  E# ?" R
                 GoTo Finish7 t/ `" a) Y. Z5 }: C7 u
            End If% {6 J4 ]. e  i$ u
      Next Mat; n8 l3 i: z+ [9 R. P+ h! V( k

: N' o# [: B) V( K* YFinish:
" Z; K7 l8 C0 a* w. j& y* BEnd Sub' L, Q  p- Z6 v6 P! i( \! I% R5 J" |

5 E9 o3 C2 E# C! |& T如有不对,请批评指正,谢谢!
发表于 2016-5-3 17:08:14 | 显示全部楼层 来自: 中国浙江嘉兴
kavenlee72 发表于 2016-5-3 16:191 Q3 y2 g5 z2 W" ~! l- w$ E
成功了,谢谢!0 T4 D( B: d( g) a

* O- l- b1 O6 {  ^, s+ T但不明白下面这句:

+ x2 O$ n( m5 N  V2012 測試ok,謝謝分享
/ w2 G, z: e4 ?' h$ Y
& v2 Z6 B4 F+ E% S" D' Y建議補加如下紅字,在 "即時運算" 欄顯示材料類別.
  N0 H9 D0 O) s8 w7 {% D# X: z4 U/ @; @3 e0 z! G- {
8 N  z- j$ K; n  e
    MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
$ f5 ]. ^4 E9 E" J, f8 c' d: `+ v  F& U/ L' H/ ]2 q: k% \
                 Debug.Print "材料類別: " & MatName(Mat); c4 Q* ^( E( S+ h+ N. F2 C1 [

* F+ ?5 ^6 f4 G& Z# l: u                 GoTo Finish
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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