QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 goto3d 于 2016-6-12 14:23 编辑
5 x, |6 E( G1 i0 c! {+ C1 y2 n2 k- C. |; |, n# M& Y/ M: a
solidworks2012的材料库里,材料都分了类,如“钢、铁、塑料、橡胶”等等,如何用VBA编写宏来获取材料的这些类型呢?; I0 J& M8 Z9 U; t8 `/ v* Z
无标题.png
5 k" Y$ a; r9 r" p& r" l  a/ v  ~% [6 p4 P5 O' B
请各位大神赐教,谢谢!
6 n3 f" o- e# ^6 ?
发表于 2016-4-19 22:55:44 | 显示全部楼层 来自: 中国香港
MaterialIdName
 楼主| 发表于 2016-4-20 20:44:50 | 显示全部楼层 来自: 中国广东
大鹿 发表于 2016-4-19 22:55
. `  o; K4 i) XMaterialIdName
7 @2 x4 c, C0 L' ?: |9 e: H- a
能说详细点么?最好能给我举个例子!谢谢
发表于 2016-4-21 08:42:40 | 显示全部楼层 来自: 中国浙江嘉兴
9 G  ]; K( r) v& |2 d
參考
# Y$ p( R* _, U; \, W
# C- p7 A. G, f) @1 l2 \! u
  1. Sub main()
    : V% `8 i: D9 o9 Z8 i& m
  2. ! g& F; h# k4 P
  3.     Dim swApp                       As SldWorks.SldWorks
    / q! N* i6 B8 [& N. i
  4.     Dim swModel                     As SldWorks.ModelDoc2
    : L0 ^* y" r" k+ y. r4 b
  5.     Dim swPart                      As SldWorks.PartDoc! m! Q( h! Q; W" M  x
  6.     Dim sMatName                    As String
    ! a$ {8 Y% Q) V1 J8 ^  E6 Z% K' B
  7.     Dim sMatDB                      As String
    2 w: @8 J  G5 z$ ^
  8.     Dim bRet                        As Boolean
    . p) W% g) C( T9 E; {
  9.     6 ]9 N2 ?* o. g  w
  10.     Set swApp = Application.SldWorks
    ( L8 G$ c3 d6 M# t( A1 [
  11.     Set swModel = swApp.ActiveDoc
    ' A1 b! {2 y1 G+ m2 h
  12.     Set swPart = swModel
    * P$ K7 m( P! L# J+ Y
  13.     sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)9 {4 A. q/ {( D: i( w
  14.     Debug.Print "File = " & swModel.GetPathName( O" ^! X' |. T1 n' T
  15.     Debug.Print "  Material = " & sMatName & " (" & sMatDB & ")"
    8 s% o) v" B2 d/ a( X2 Y

  16. ' `: W' r& K2 @3 h, c* P8 T* {
  17. End Sub
复制代码
2.png
 楼主| 发表于 2016-4-22 18:18:48 | 显示全部楼层 来自: 中国广东深圳
本帖最后由 kavenlee72 于 2016-4-22 18:19 编辑
$ |9 V' X6 t, r: I& P
ryouss 发表于 2016-4-21 08:42
5 G9 j7 l' D6 b/ t9 ]+ B參考
! q: [( w( R3 s% K  Y
GetMaterialPropertyName2获得的是材料的名称,如“红铜”,我是希望能获得“红铜”的类别,如“其它金属”“钢”“铁”等。
 楼主| 发表于 2016-4-24 22:01:56 | 显示全部楼层 来自: 中国广东
高手不露面,自己顶一下,别沉了
 楼主| 发表于 2016-4-26 21:41:23 | 显示全部楼层 来自: 中国广东深圳
难道SOLIDWORKS API 不能实现这个功能?
发表于 2016-4-27 00:17:50 | 显示全部楼层 来自: 中国北京
你用下面代码试试5 t. l9 ~) ~6 k+ ]1 z
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant) O- o" P+ @5 R8 Z) w- e
    Set swMatDB = New MSXML2.DOMDocument4 L3 J7 P, a8 d3 t  W5 z
'    材料库所存储的路径7 `/ }, D6 W) w/ }# X( G* u
    swMatDB.Load "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\chinese-simplified\sldmaterials\solidworks materials.sldmat"4 t" B5 N# d0 U* ?5 h

$ v# x; r4 b# C! v0 G2 Z    Set MatList = swMatDB.getElementsByTagName("material")
1 [8 Z0 p; Z4 a0 J. z    Dim MatName() As String, Mat As Variant
6 h6 \  }( ^& Z) ]) z% g( V+ b( a    ReDim MatName(MatList.Length - 1)
- M* v, y4 i+ t2 R" m" ?/ v+ ~    For Mat = 0 To MatList.Length - 1
+ ^# g! ]2 \7 b; Z+ j$ t& {6 C$ l* S6 V' ^
        MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
* k+ _# u0 `% u7 ?, F  H2 w4 B7 Y; z' v1 g4 H( N$ C/ i' n4 L
    Next Mat8 c0 a& e# H3 s. W/ W
8 q; _( i* |, j+ n2 x# ?
 楼主| 发表于 2016-4-28 22:33:37 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-27 00:17
: `+ W7 w1 W* v你用下面代码试试' v2 F& F8 D* C' b, Y' G( \8 o
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant" ?" Q$ |- N8 d5 B% v
    Set swMatDB = New MSXM ...

) Q2 D' c! Z0 J7 `- K+ {/ a. {高手啊!2 ~4 o$ E% p5 h1 U& v% f  n' r: B
- \$ ~" l9 |& q$ T7 C8 E" x
我试试
, w" V) z; |6 z* ~
8 D8 D/ C5 e7 U4 R谢谢!
2 w  y, b5 q* O' i) b2 z$ [
 楼主| 发表于 2016-4-29 12:44:56 | 显示全部楼层 来自: 中国广东
lhl2008 发表于 2016-4-27 00:17
6 D7 c3 J! Q( ^2 O/ q4 J你用下面代码试试
3 T/ w5 x6 @- N8 D4 n3 B3 F- @. W& nDim swMatDB As MSXML2.DOMDocument, MatList As Variant- T$ P: m% n3 I" H4 i
    Set swMatDB = New MSXM ...

. N/ q$ t# w0 i0 Y& A1 H8 C' Z不好意思,您这段代码在solidworks的VBA环境中运行提示“用户定义的类型未定义”,请教是什么问题?如何解决?谢谢
发表于 2016-4-29 12:54:06 | 显示全部楼层 来自: 中国河北廊坊
本帖最后由 lhl2008 于 2016-4-29 12:59 编辑
& P( V, ]. t6 Y* Q& g& c9 o3 A
' V* w9 B6 q7 ~: r4 a& N& J0 B) \7 R在引用中加入 2016-04-29_12-54-12.jpg 7 X& Q" X1 ~- G4 v9 A" @* p0 _" c
  L7 ]+ \3 L: v7 ~
材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。; K1 J5 m) o; H8 y) C7 O1 z
 楼主| 发表于 2016-5-3 16:19:46 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-29 12:541 g; H  y+ e$ Y% l& {
在引用中加入
4 O1 c  w% E" _2 N+ l' o4 z+ S
3 b0 t7 a3 p; d0 Q8 ^, x; m& H: C材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。

% n6 W4 N5 V+ j6 W5 R* t8 W9 D成功了,谢谢!
& G$ [  W' d: k; L  z5 `+ @& b, M% G$ Y; d" P
但不明白下面这句:
; C* Z5 p8 O# N0 MSet MatList = swMatDB.getElementsByTagName("material"),括号里的“material”为什么是"material"而不是其它?
% I1 e( ~+ k5 x$ v) E7 \' g6 X, l" v* ~

# d1 E2 w4 Q& }3 Y$ ~/ _下面是我编写的获取材料类别的全部代码:0 }. h6 G. X! z1 [% b& n5 o$ h1 V
Sub main()
) b/ o! @1 c  L! g3 j" \$ C) I+ I6 i3 n) F
Dim swApp                       As SldWorks.SldWorks
7 t6 W5 m0 J1 Z. x1 d) YDim swModel                   As SldWorks.ModelDoc2
4 H- M) l- u2 @6 P( {: zDim swPart                       As SldWorks.PartDoc
8 I2 ?; a0 H8 g4 d7 P& ~+ ]Dim dbs                             As Variant
+ p5 d1 x& v  k1 qDim sMatName                As String! y+ k+ a5 q9 o
Dim sMatDB                      As String, z. T+ A) w  s4 ?- S1 x
Dim bRet                           As Boolean
& Q! z! M9 I* k; B8 rDim i                                   As Long' d: s# \$ p5 c! v# V% I
Dim matPath                    As String+ ]% Y3 N" a; v% T. w
Dim swMatDB                  As MSXML2.DOMDocument0 w: _1 e% k8 X; u
Dim MatList                      As Variant5 U8 `( j1 _9 b$ L7 ~4 z7 r7 n  S
/ m+ m( {4 a/ }6 l
Set swApp = Application.SldWorks
: X5 H8 O2 o  W# B- f. B" G! USet swModel = swApp.ActiveDoc
) w7 W1 i$ s# @; |Set swPart = swModel
8 l1 y" t- |& x+ n8 U) pdbs = swApp.GetMaterialDatabases
) t( o! L9 h, w+ u  ?) esMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)
5 j9 {) n3 E/ e& F- MFor i = 0 To UBound(dbs)3 b7 W: P# E# w0 h
      If StrComp(LCase(Left(Right(dbs(i), Len(sMatDB) + 7), Len(sMatDB))), LCase(sMatDB)) = 0 Then
6 k- s1 ^2 n; r           matPath = dbs(i)# Y3 d! S7 \" u" O- D8 z) V
           GoTo MatTpye! S$ K$ {) a' M( W$ {2 D& c6 g
      End If5 Q) X6 G$ q; n* }6 C" }
Next i
9 P7 w+ Q0 \# [9 ~& c. ~0 C1 C# o+ U# Q6 _1 |! V4 Z
MatTpye:
4 T. h4 i* i0 [Set swMatDB = New MSXML2.DOMDocument
0 Q. x& {: [4 V1 U4 S8 W; B$ S: G1 @ ' 材料库所存储的路径
! F! [8 Z9 J9 h, LswMatDB.Load matPath# T0 \4 F% a! e  e8 Q5 |3 O: Q  A
Set MatList = swMatDB.getElementsByTagName("material")
9 _7 C( w1 C" I, d$ R$ UDim MatName() As String, Mat As Variant
( T- F+ s* J$ Q% k. Z+ MReDim MatName(MatList.Length - 1)
9 o; ?7 T% M% n8 `( r2 Q1 ~( A      For Mat = 0 To MatList.Length - 1, J$ p6 T8 n' [2 _& h8 P6 u
            If MatList.Item(Mat).Attributes.Item(0).childNodes.Item(0).nodeValue = sMatName Then
' g" a+ i1 f" w                 MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue! c+ k" w3 {4 ^( ^2 k
                 GoTo Finish& ]& w# b/ j3 b2 _$ T  v% E1 S
            End If
3 I1 {; P7 S( T0 D# ?7 {6 @      Next Mat1 o' e. D$ q" S9 t5 r! @

4 m5 I1 \* _9 ?) ]8 y8 [1 dFinish:
" ?+ }8 P) @% S; jEnd Sub+ j0 M( E9 `, y
' v% C$ @" U7 w6 v! V
如有不对,请批评指正,谢谢!
发表于 2016-5-3 17:08:14 | 显示全部楼层 来自: 中国浙江嘉兴
kavenlee72 发表于 2016-5-3 16:19' ?" m7 s& T5 m/ |
成功了,谢谢!
/ M3 h  T$ s7 R3 }; b3 q: N" O1 h  u8 f4 r1 T
但不明白下面这句:

, F$ @- g  A: d! x, S5 H$ F2012 測試ok,謝謝分享
  C- |+ |' u% k$ j$ {$ D3 o& e% M' b3 B4 u, S. u' a3 q) U( I8 ~& q
建議補加如下紅字,在 "即時運算" 欄顯示材料類別.- e# }: N, @7 r6 e
& ]( E/ Z( m: g( Q% b/ ?" q" ^
2 D0 A- n" \: n0 Q: \% d
    MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
% |0 }3 Y7 X5 `! s; E0 z/ ]% X1 R9 f, }4 n. g8 [( \7 |
                 Debug.Print "材料類別: " & MatName(Mat)0 N# N+ C9 P0 U

) u; Q8 ]- {$ w" F; O                 GoTo Finish
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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