QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 goto3d 于 2016-6-12 14:23 编辑 0 V6 M3 ?& L2 h  s' ~

8 G$ _% N) B: O0 b5 Q* osolidworks2012的材料库里,材料都分了类,如“钢、铁、塑料、橡胶”等等,如何用VBA编写宏来获取材料的这些类型呢?
) p% |0 R# r4 |. `0 ^0 Q  ^ 无标题.png - p  N3 W2 A/ \1 R  t0 f
3 S- z. ]9 o, f7 f" I4 J
请各位大神赐教,谢谢!0 K6 W5 u* n- q$ `# h3 ~
发表于 2016-4-19 22:55:44 | 显示全部楼层 来自: 中国香港
MaterialIdName
 楼主| 发表于 2016-4-20 20:44:50 | 显示全部楼层 来自: 中国广东
大鹿 发表于 2016-4-19 22:557 a) {& j* U5 s$ L/ M, P9 c
MaterialIdName

5 g3 ^9 a6 H- s/ {: l2 g能说详细点么?最好能给我举个例子!谢谢
发表于 2016-4-21 08:42:40 | 显示全部楼层 来自: 中国浙江嘉兴
* j* O3 }! B9 A
參考
; H" f3 g( K& W& w# x7 z" M
* f( r  l4 `5 L3 ?8 e
  1. Sub main()4 o& k2 s3 @/ z- e: z1 Q) S. K
  2. 4 c* w# Q# D8 p7 E5 ?- c8 v) h
  3.     Dim swApp                       As SldWorks.SldWorks' @% e+ G$ v; A  `# A6 k6 j
  4.     Dim swModel                     As SldWorks.ModelDoc2
    ( w9 V$ n$ `0 ?# {6 a. X
  5.     Dim swPart                      As SldWorks.PartDoc7 i& [+ V* G8 H
  6.     Dim sMatName                    As String" X; E- z6 \, D8 d1 Z* U
  7.     Dim sMatDB                      As String
    , [: c8 W0 O, D3 A0 Z
  8.     Dim bRet                        As Boolean# A& _# {4 }2 ^  c% o/ L3 t
  9.     / r; c5 I; g! H0 M: N$ _
  10.     Set swApp = Application.SldWorks+ j4 R) x# V! b0 G! i
  11.     Set swModel = swApp.ActiveDoc* z, D9 D% R8 y$ Q: L+ O
  12.     Set swPart = swModel
    3 s- p% D8 c0 V& b( m  ?/ z. T$ T
  13.     sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)
    4 ]8 D: ]$ b- _4 _; c8 w4 i
  14.     Debug.Print "File = " & swModel.GetPathName
    # g% u6 `" q8 G5 v. G5 V/ v& E
  15.     Debug.Print "  Material = " & sMatName & " (" & sMatDB & ")"
    : `3 I5 n7 `+ I" i6 H
  16. 5 f' h+ S$ E1 Y% @$ U
  17. End Sub
复制代码
2.png
 楼主| 发表于 2016-4-22 18:18:48 | 显示全部楼层 来自: 中国广东深圳
本帖最后由 kavenlee72 于 2016-4-22 18:19 编辑 # s( J( h8 L# f2 ?1 V
ryouss 发表于 2016-4-21 08:42
4 s& K/ V' g, ?6 `3 V參考

0 @7 n" J; Z8 b; O* _5 {; ]: _GetMaterialPropertyName2获得的是材料的名称,如“红铜”,我是希望能获得“红铜”的类别,如“其它金属”“钢”“铁”等。
 楼主| 发表于 2016-4-24 22:01:56 | 显示全部楼层 来自: 中国广东
高手不露面,自己顶一下,别沉了
 楼主| 发表于 2016-4-26 21:41:23 | 显示全部楼层 来自: 中国广东深圳
难道SOLIDWORKS API 不能实现这个功能?
发表于 2016-4-27 00:17:50 | 显示全部楼层 来自: 中国北京
你用下面代码试试
4 P( n" U+ N2 H0 @2 H8 vDim swMatDB As MSXML2.DOMDocument, MatList As Variant
. W3 e7 Y4 |( `1 y: b. u0 H+ s    Set swMatDB = New MSXML2.DOMDocument3 _; c& ?  r3 X, Y5 Y( s3 A0 t
'    材料库所存储的路径
& Q9 W/ N) B* c+ U    swMatDB.Load "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\chinese-simplified\sldmaterials\solidworks materials.sldmat"
' Y2 {" ?. ^9 N& W7 S* l+ \* r- N' b$ j1 N4 J! }" v
    Set MatList = swMatDB.getElementsByTagName("material")
+ U/ ~* t  l- ?! l    Dim MatName() As String, Mat As Variant' \$ F, F& Z6 M5 u" |+ a- p. l
    ReDim MatName(MatList.Length - 1)& w' v5 ^4 a+ T* q. s7 q' T. Q
    For Mat = 0 To MatList.Length - 1
# r. L5 o. O5 A: F: |2 [- V+ b# \1 i  @$ ^
        MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue+ J* I0 K( Q# x; z5 D/ C
7 ^' x; j0 g5 s7 K$ S
    Next Mat" ]# I8 a! `5 O5 {

2 ?6 C8 i1 g; M) Y: T% Q
 楼主| 发表于 2016-4-28 22:33:37 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-27 00:175 ^* L- O7 c0 B8 ]- ]$ v8 W
你用下面代码试试
* m/ `( B$ D+ S4 g+ j/ t( VDim swMatDB As MSXML2.DOMDocument, MatList As Variant
7 u) @/ v  K0 F! V4 H    Set swMatDB = New MSXM ...

8 o/ r  a1 N; p, A5 X高手啊!
- E1 s# ^4 U( y8 o+ L+ O) o% ^! S9 b2 F. `& O+ M* }( V9 K
我试试
, c8 o, a+ C7 f& h2 h) h* S, o8 L5 g7 Z, m
谢谢!
  M0 B* B. ]1 n+ a# |. Z
 楼主| 发表于 2016-4-29 12:44:56 | 显示全部楼层 来自: 中国广东
lhl2008 发表于 2016-4-27 00:17
! C! H6 x: h$ ^4 ~你用下面代码试试& d* F8 V% k6 y# b6 \3 R
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant3 c3 }% G9 _: F$ c. Z
    Set swMatDB = New MSXM ...
2 ]- K3 N- [. e1 S
不好意思,您这段代码在solidworks的VBA环境中运行提示“用户定义的类型未定义”,请教是什么问题?如何解决?谢谢
发表于 2016-4-29 12:54:06 | 显示全部楼层 来自: 中国河北廊坊
本帖最后由 lhl2008 于 2016-4-29 12:59 编辑
: I- Z% g% U4 r6 |: k0 z4 k
' e6 u5 M" [% r5 R% U+ H5 ~在引用中加入 2016-04-29_12-54-12.jpg $ {& k7 p% {7 l1 q

0 j1 v( V% w' J; Y  Q# x/ ~; X7 @, K材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。" y$ _( [% H) ?5 l5 Z
 楼主| 发表于 2016-5-3 16:19:46 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-29 12:54' n; d7 o0 y% B' \
在引用中加入
8 x& K( R3 Z9 z3 \& ~0 M8 z$ p8 [5 T
材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。

1 {. k: _' x3 \7 f8 T% f: p2 H成功了,谢谢!
9 l2 w* B9 ?; n( c" U7 V5 q# e6 v% r/ r  W! |  L
但不明白下面这句:7 j; O  e, u: T, p
Set MatList = swMatDB.getElementsByTagName("material"),括号里的“material”为什么是"material"而不是其它?
9 K4 M; i& I! d' k
& D; x# a% _9 ~/ Y
, O2 `9 K$ M0 z+ @  S4 M7 c下面是我编写的获取材料类别的全部代码:! n$ X/ b6 P" x
Sub main()
7 G' C( `' Q1 v( \! H# x0 t
  x9 C( j; @9 G6 {+ ^4 iDim swApp                       As SldWorks.SldWorks6 A) U/ _. f8 d+ u% _& ~
Dim swModel                   As SldWorks.ModelDoc2& R. D# s% ~) }5 L* J2 M
Dim swPart                       As SldWorks.PartDoc
6 ~7 o3 V/ x: v: L3 x2 QDim dbs                             As Variant
) _8 @' A1 t, aDim sMatName                As String, i- {. j1 x7 D' k( A; t
Dim sMatDB                      As String) G% w9 ~1 `+ R2 ~; ?9 r
Dim bRet                           As Boolean: s- i) ~* v9 N1 N+ G1 w
Dim i                                   As Long
4 k' i) O, z$ P" c0 F& i; N# gDim matPath                    As String
& I) L9 C- A! E' [1 ZDim swMatDB                  As MSXML2.DOMDocument: M' v( U% r( |2 g" S
Dim MatList                      As Variant8 o- t; h; ~  D+ j6 Z
9 J; `% _  B, P8 x  }5 i2 F1 ~% a
Set swApp = Application.SldWorks) h( T- `& J/ v0 b# B
Set swModel = swApp.ActiveDoc
6 z7 E$ l, A5 L0 U" @; ?  YSet swPart = swModel
' i+ `8 ^+ X& e* _4 a. e" adbs = swApp.GetMaterialDatabases7 s( o# \; Z: L; H1 ]: K
sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)
4 b! @2 a9 t: Y5 cFor i = 0 To UBound(dbs)
" \! J, U+ `& m, k      If StrComp(LCase(Left(Right(dbs(i), Len(sMatDB) + 7), Len(sMatDB))), LCase(sMatDB)) = 0 Then
0 g' P3 R- C; M           matPath = dbs(i)
4 G3 @$ D; O6 u: Y5 h; T           GoTo MatTpye2 `! z: w: Z+ F+ l( F. V# m1 K
      End If
! u) n# d! D- j$ c) B. w9 {1 fNext i- E1 U4 {3 h" r' o

7 Z: a: k6 p' ]8 B  M( U4 U$ x" lMatTpye:
$ T1 [+ l: }2 g9 ^Set swMatDB = New MSXML2.DOMDocument; X, X7 z0 S" \" z6 o
' 材料库所存储的路径4 d5 m3 g1 O/ w5 d
swMatDB.Load matPath
: @$ ?( ?/ ]6 F0 wSet MatList = swMatDB.getElementsByTagName("material")
7 O1 t. r: N2 _* f7 P: t# j0 kDim MatName() As String, Mat As Variant
$ S& i2 L  d% j1 Y9 w7 R, YReDim MatName(MatList.Length - 1)
$ i  m( o* {# {, u9 j8 l" j      For Mat = 0 To MatList.Length - 16 ~' O8 X  Q. Z% G; ?
            If MatList.Item(Mat).Attributes.Item(0).childNodes.Item(0).nodeValue = sMatName Then. k5 X  k/ T: t" `% J
                 MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue! U% q# h9 ]6 I$ {- X# u0 m
                 GoTo Finish7 X6 ^# n* e+ j3 \
            End If
/ G) z$ \4 }& a- W      Next Mat
+ M+ s1 N7 s1 @7 b' ]! J5 b& o% f; {4 x: L8 p
Finish:0 ~3 B; L1 r, k1 f. [0 r2 w
End Sub: e/ w. J4 {3 |! t4 f: ]9 k# _

! k9 Y! X9 r' }" D7 h  s9 C! T& p5 W如有不对,请批评指正,谢谢!
发表于 2016-5-3 17:08:14 | 显示全部楼层 来自: 中国浙江嘉兴
kavenlee72 发表于 2016-5-3 16:19# U# o+ h6 Y1 {9 Q% M
成功了,谢谢!
7 Y$ D. f# R/ y! ^+ f  ]/ {2 n) Y! w; L% K
但不明白下面这句:
! A% y# l9 J) @8 y. Z3 D6 d' n
2012 測試ok,謝謝分享
' g5 ~5 a* \/ `2 W
$ v7 [" `7 Z4 H建議補加如下紅字,在 "即時運算" 欄顯示材料類別.
- z! I+ o3 v" l% J- P
. n7 p, Z- A( D# N
6 Z2 D7 e# S% A    MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
" Q/ u+ Q1 Z; ]; A2 q! n- q5 a. i* d1 v7 [
                 Debug.Print "材料類別: " & MatName(Mat)
1 z& O; f# N- d% F# I0 V9 {( v$ S" [
                 GoTo Finish
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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