QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 goto3d 于 2016-6-12 14:23 编辑
  L' h" z, n2 L, j
, ^1 ^/ O/ f7 ?, {' vsolidworks2012的材料库里,材料都分了类,如“钢、铁、塑料、橡胶”等等,如何用VBA编写宏来获取材料的这些类型呢?5 g- A* j( m4 o; x% R* V
无标题.png 2 }# H1 d' V( N% M# w* Z# M  U) t
0 g1 }# O; f: D. Q. W: ]& c
请各位大神赐教,谢谢!  Z4 Q3 D) d% T2 }
发表于 2016-4-19 22:55:44 | 显示全部楼层 来自: 中国香港
MaterialIdName
 楼主| 发表于 2016-4-20 20:44:50 | 显示全部楼层 来自: 中国广东
大鹿 发表于 2016-4-19 22:55
: C' X% c" r+ J. m- v# i% x6 oMaterialIdName
$ y2 Q  _" K3 @7 A; e3 J6 K9 Z
能说详细点么?最好能给我举个例子!谢谢
发表于 2016-4-21 08:42:40 | 显示全部楼层 来自: 中国浙江嘉兴

. g: ]0 \5 Q8 f& u: A+ Q+ H0 |參考) K4 D5 \" D2 K! Q2 `
% N4 `5 f: {% W4 l1 [2 u
  1. Sub main()
    3 r* a, z+ b7 m( t( y

  2. ( d/ w& b( q0 P. X) O& ?
  3.     Dim swApp                       As SldWorks.SldWorks
    1 S0 L  N/ j# P/ S* @2 [3 Q
  4.     Dim swModel                     As SldWorks.ModelDoc2
    ( S" ^! }( r. D1 D1 k9 \1 Y
  5.     Dim swPart                      As SldWorks.PartDoc) Z5 I% `  K! a
  6.     Dim sMatName                    As String
    3 I1 s) M! A0 h
  7.     Dim sMatDB                      As String: T3 \* m- c9 M% R
  8.     Dim bRet                        As Boolean( @4 V( t$ o% j* q  O6 `# T
  9.    
    ( ~) c* d0 r7 v3 f$ A. l3 r% E- X
  10.     Set swApp = Application.SldWorks0 b+ _, K4 f$ w  c7 K4 _* v
  11.     Set swModel = swApp.ActiveDoc
    " _* x$ r2 u/ |# w
  12.     Set swPart = swModel" ]# W& @( `$ l& W- k& p% g$ v& z
  13.     sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)
    + |3 D) W% G* e1 W4 n
  14.     Debug.Print "File = " & swModel.GetPathName
    $ Q, C4 Z6 S* H; @! b/ L1 ?4 ^
  15.     Debug.Print "  Material = " & sMatName & " (" & sMatDB & ")"- l" }% f9 n5 ~$ T3 Z
  16. 6 E1 E; U9 }8 H5 Q5 I1 t5 f- D% c6 E
  17. End Sub
复制代码
2.png
 楼主| 发表于 2016-4-22 18:18:48 | 显示全部楼层 来自: 中国广东深圳
本帖最后由 kavenlee72 于 2016-4-22 18:19 编辑
( r; x' \. f! i1 p' ^- E$ D
ryouss 发表于 2016-4-21 08:42
$ D1 ]  C7 m1 @' U4 t參考
% @+ M) h- t4 t, N! Z/ \4 d; f
GetMaterialPropertyName2获得的是材料的名称,如“红铜”,我是希望能获得“红铜”的类别,如“其它金属”“钢”“铁”等。
 楼主| 发表于 2016-4-24 22:01:56 | 显示全部楼层 来自: 中国广东
高手不露面,自己顶一下,别沉了
 楼主| 发表于 2016-4-26 21:41:23 | 显示全部楼层 来自: 中国广东深圳
难道SOLIDWORKS API 不能实现这个功能?
发表于 2016-4-27 00:17:50 | 显示全部楼层 来自: 中国北京
你用下面代码试试
- W9 E- J! \, z% fDim swMatDB As MSXML2.DOMDocument, MatList As Variant
6 s4 x0 k7 d8 [# _    Set swMatDB = New MSXML2.DOMDocument! y. E7 S( t6 E
'    材料库所存储的路径
* b  C/ J! h8 Q' I    swMatDB.Load "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\chinese-simplified\sldmaterials\solidworks materials.sldmat"% j) c$ ^1 }& }" v" v+ ]

) L! O3 O+ E/ E    Set MatList = swMatDB.getElementsByTagName("material")
1 q0 D  [  e4 J( V    Dim MatName() As String, Mat As Variant9 D! r) b/ x# ]; z2 B& D: n5 g& X
    ReDim MatName(MatList.Length - 1)
- V, g" \3 E7 e% e: r) U! T    For Mat = 0 To MatList.Length - 1
" ~) T0 @; P" w7 g; c
6 c; x. k& Z% j7 o+ R' t        MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue; F9 X4 \: B  g& i

4 e1 a. ?- [' U- Z  e" W* Z6 B    Next Mat, n& p3 D1 @; A( _$ s8 ~! l, h
" @8 W( @1 z8 {( }4 F+ {
 楼主| 发表于 2016-4-28 22:33:37 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-27 00:17
  A& s6 d6 v$ b, I" y你用下面代码试试6 d  A& W. i" y3 O$ ?9 s' ]) d* {
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant
0 L' V# k) A3 ~# j2 Z9 d    Set swMatDB = New MSXM ...
' O/ V- `  v. l8 X' w
高手啊!6 b) d( X( ~$ l1 t- V$ a- Z  B
9 E' L. R- [* u) s: k  L! B, }
我试试
& _5 z* A0 |( n0 \/ r3 }7 a! A  R/ E
谢谢!
7 ]$ u& ^  @' f
 楼主| 发表于 2016-4-29 12:44:56 | 显示全部楼层 来自: 中国广东
lhl2008 发表于 2016-4-27 00:17
: l3 q  {2 g" Z# q0 H1 F9 N你用下面代码试试
3 u" {$ h* J" f; I" A, pDim swMatDB As MSXML2.DOMDocument, MatList As Variant3 j1 J( M6 |* F) x  w
    Set swMatDB = New MSXM ...

+ L- d5 a+ j+ u* E; f7 b3 O2 |不好意思,您这段代码在solidworks的VBA环境中运行提示“用户定义的类型未定义”,请教是什么问题?如何解决?谢谢
发表于 2016-4-29 12:54:06 | 显示全部楼层 来自: 中国河北廊坊
本帖最后由 lhl2008 于 2016-4-29 12:59 编辑
6 v" t5 I1 A, S
& C: @9 `4 X2 l; d+ ~1 v在引用中加入 2016-04-29_12-54-12.jpg 0 L9 k$ l4 t0 Z/ Y

1 U9 Z- h9 z* C材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
- C9 I  O0 J. Q( |# j- {
 楼主| 发表于 2016-5-3 16:19:46 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-29 12:54
1 v" A# t* C5 s  Z, b  S$ O在引用中加入
: Z) F! U! \. Y0 P4 u% f. t% [- S
材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。

: ?+ u6 T% V$ C9 R. W" b) d成功了,谢谢!: R* k% W" h5 O" C/ V2 U& N4 G4 Z4 S

+ w' ]! }# I/ ~( e1 z" G7 w但不明白下面这句:
7 f0 ~2 H* [) Q2 X3 h. YSet MatList = swMatDB.getElementsByTagName("material"),括号里的“material”为什么是"material"而不是其它?
3 l, _+ \* T- x
' J; \! d* F* S) {4 w
. P, Y* g5 z# G6 {5 P, l  W. k$ ~下面是我编写的获取材料类别的全部代码:* d5 Y# y3 C/ {4 W' i. t' m1 z# F5 k! m
Sub main()
9 f5 c# _3 Q; e8 y/ ?# y1 ~( A' W0 b
Dim swApp                       As SldWorks.SldWorks
$ a& Y7 S, z  ^; ]) w  ^3 eDim swModel                   As SldWorks.ModelDoc2
8 i+ I8 H% C* p! K! O' X$ PDim swPart                       As SldWorks.PartDoc6 m4 h7 H  N+ p7 J* N, w
Dim dbs                             As Variant0 x, t' C2 b' c! M6 W4 t
Dim sMatName                As String
" {" \7 b  w+ y% r4 y7 {( }( V. IDim sMatDB                      As String' H/ }+ {- Z2 a4 L: }0 U
Dim bRet                           As Boolean; T0 b" p) R! z5 e% B$ n6 T% i
Dim i                                   As Long% j. y6 t0 m" `& g& L
Dim matPath                    As String2 B$ i' C# c( X
Dim swMatDB                  As MSXML2.DOMDocument
# w3 ^% Y( [* y  uDim MatList                      As Variant: e' H* h- q/ Q, Y) y- u: p' J! T0 Z

; m9 n3 k3 Z' k9 r# U) V8 gSet swApp = Application.SldWorks
& Q6 N) m9 T6 `) a  g1 gSet swModel = swApp.ActiveDoc
7 ]; r- P" ^7 _: J' ySet swPart = swModel
* g" G% G7 T: l0 O  udbs = swApp.GetMaterialDatabases- i$ D9 k+ C! ~- D( |  f0 }. F
sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)) z* v( f+ b  K2 n/ |% y' i
For i = 0 To UBound(dbs)1 h% c( ~2 [7 u. o
      If StrComp(LCase(Left(Right(dbs(i), Len(sMatDB) + 7), Len(sMatDB))), LCase(sMatDB)) = 0 Then5 k2 U- n- \8 z
           matPath = dbs(i). V8 G( _4 s3 r' }% e3 k0 f# n
           GoTo MatTpye
& K, p8 u# C  I& B      End If4 @& p4 ?! I* @8 l
Next i
4 m( A$ Y# }3 o  L& F$ H7 k4 L) u) ~+ g
MatTpye:$ V/ {# T8 B5 f( ^/ _: `
Set swMatDB = New MSXML2.DOMDocument
2 Z/ c! C0 ~  Z% d$ [ ' 材料库所存储的路径
' h; [2 c% @# z1 ^1 K! NswMatDB.Load matPath" I" K  @5 @0 X) ?
Set MatList = swMatDB.getElementsByTagName("material")
' t/ E9 o# M6 l9 ]* Z0 z: }  P9 NDim MatName() As String, Mat As Variant
, h" b2 z7 n, M6 ~' `9 GReDim MatName(MatList.Length - 1)
" o; x) C2 A' _, F8 |      For Mat = 0 To MatList.Length - 1
: D7 [/ r0 ^* X3 F: Z            If MatList.Item(Mat).Attributes.Item(0).childNodes.Item(0).nodeValue = sMatName Then
% @* u* D4 B1 K& O5 c% I                 MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue) y+ v# O& m8 ^/ }2 X
                 GoTo Finish9 R' V4 ?  {/ N/ P) D
            End If2 z' g8 @5 C6 Q) X, B
      Next Mat2 q+ c3 D/ Z# K, B1 F8 h
4 ?' {; D9 J/ N  X# }+ U; I
Finish:
6 ?8 D' P: p  j6 L4 k( s$ QEnd Sub* b  k4 Y: F' B$ j; ?

/ \9 k! }  [# ~% u9 H7 Z/ Q2 h* A如有不对,请批评指正,谢谢!
发表于 2016-5-3 17:08:14 | 显示全部楼层 来自: 中国浙江嘉兴
kavenlee72 发表于 2016-5-3 16:19' z$ {2 t! G# v  G# V9 o
成功了,谢谢!
" @4 K& a( u( W( Y& l
+ y" Y: m# \+ j2 U8 r# w但不明白下面这句:

, ^+ P6 W! e) S  C4 |& M2012 測試ok,謝謝分享, \9 U; D$ l+ b# j" \

" }" u; e5 k0 ~8 k1 s. h建議補加如下紅字,在 "即時運算" 欄顯示材料類別.
0 g$ M. j( ]: r* ^6 e0 f& b( S+ d+ S) B( p: y

1 q- l  F5 }2 D9 Y5 ?) {( B" W    MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
  d9 Q$ B' V' J) T
% W  V6 g; o) S3 i                 Debug.Print "材料類別: " & MatName(Mat)! J: p% h9 ~7 N* G0 m
6 O% {. r( w& C* h0 ]
                 GoTo Finish
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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