QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 goto3d 于 2016-6-12 14:23 编辑
: L, [" p( C# s9 d" b& p* S9 q/ s: U1 T
solidworks2012的材料库里,材料都分了类,如“钢、铁、塑料、橡胶”等等,如何用VBA编写宏来获取材料的这些类型呢?/ g9 x" m3 Q! T: ?) G$ S: Z) `$ S
无标题.png   }2 n/ N) F: m% w

) t+ w, ]9 ~( y4 a8 M3 |请各位大神赐教,谢谢!
  c1 f* p) S- U( X6 P9 Q. o
发表于 2016-4-19 22:55:44 | 显示全部楼层 来自: 中国香港
MaterialIdName
 楼主| 发表于 2016-4-20 20:44:50 | 显示全部楼层 来自: 中国广东
大鹿 发表于 2016-4-19 22:55. Q( o$ t; R  p
MaterialIdName

+ h& v$ D. C5 O+ P. Y8 W, k0 @能说详细点么?最好能给我举个例子!谢谢
发表于 2016-4-21 08:42:40 | 显示全部楼层 来自: 中国浙江嘉兴

4 q* r$ X- i! E/ a參考
" e" u6 `* \9 f+ g& V/ E5 Q5 I" e- A9 p8 @
  1. Sub main()
    6 M/ Y- ~# u  ?7 ^8 p2 Y: w* Q

  2.   N3 @) P: e* w) U! e6 o
  3.     Dim swApp                       As SldWorks.SldWorks$ k$ h1 e- N" l  {
  4.     Dim swModel                     As SldWorks.ModelDoc2
    1 c* W9 P; k/ R1 L1 v# [
  5.     Dim swPart                      As SldWorks.PartDoc
    ; i2 C8 N' j* N6 ?. ^; s
  6.     Dim sMatName                    As String
    & k& y3 T$ L# O( C
  7.     Dim sMatDB                      As String
    ; D! W9 }! `  Y2 d6 S' I  k
  8.     Dim bRet                        As Boolean
    1 v" e( N" {2 e: ]; E; m
  9.     & k) B' n+ P( r  z
  10.     Set swApp = Application.SldWorks
    : o$ Q) F4 w# N! |) n* t
  11.     Set swModel = swApp.ActiveDoc
    6 u+ ~% V+ J% S3 O3 b0 w
  12.     Set swPart = swModel6 I  r3 s4 x* [7 j. K; m6 V3 ^
  13.     sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)- _) Y% ^3 K3 |7 p! C
  14.     Debug.Print "File = " & swModel.GetPathName( f7 N4 G, ~& V8 M
  15.     Debug.Print "  Material = " & sMatName & " (" & sMatDB & ")"
    8 T/ L6 y) |6 f9 \% n2 `
  16. " G! Z8 K' b2 r
  17. End Sub
复制代码
2.png
 楼主| 发表于 2016-4-22 18:18:48 | 显示全部楼层 来自: 中国广东深圳
本帖最后由 kavenlee72 于 2016-4-22 18:19 编辑 * q) o# D/ U( p; `4 a$ ]. b8 m2 A- i4 _
ryouss 发表于 2016-4-21 08:42
  i+ R" {" U; p7 w$ `* n參考
& {; c; c: l% l8 m  j( ], D
GetMaterialPropertyName2获得的是材料的名称,如“红铜”,我是希望能获得“红铜”的类别,如“其它金属”“钢”“铁”等。
 楼主| 发表于 2016-4-24 22:01:56 | 显示全部楼层 来自: 中国广东
高手不露面,自己顶一下,别沉了
 楼主| 发表于 2016-4-26 21:41:23 | 显示全部楼层 来自: 中国广东深圳
难道SOLIDWORKS API 不能实现这个功能?
发表于 2016-4-27 00:17:50 | 显示全部楼层 来自: 中国北京
你用下面代码试试
2 ^" X! u5 {3 ?+ ]8 T  B, f( EDim swMatDB As MSXML2.DOMDocument, MatList As Variant  y: M3 o* Y- a+ c; s. k/ D" {: Z* z5 T
    Set swMatDB = New MSXML2.DOMDocument8 {- }$ h$ f& S4 i6 I
'    材料库所存储的路径
- K* q0 z& Z- I6 R) a4 m    swMatDB.Load "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\chinese-simplified\sldmaterials\solidworks materials.sldmat"
. I8 \0 P( j0 E
5 b9 ?2 R' Y! q( h* s4 a    Set MatList = swMatDB.getElementsByTagName("material"), S  K; F3 C& }. X: C2 J1 T
    Dim MatName() As String, Mat As Variant
: X0 R, G( V: G. _    ReDim MatName(MatList.Length - 1)
7 n0 W8 I! _( K6 r; I# c, X    For Mat = 0 To MatList.Length - 1( a0 ^1 S4 j0 H5 `: B& ]% V

0 f* K: N: Q: S& q8 H        MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue9 t; i7 x* ~+ D- C' f, X

) m+ [; h& \) u1 {3 o    Next Mat: T2 v) @" Q1 k8 i3 p5 t; e8 t

+ s8 H+ X, m4 z8 W1 E
 楼主| 发表于 2016-4-28 22:33:37 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-27 00:17
8 `3 v$ j1 o* H# Z: u6 i) |6 q你用下面代码试试  w  y7 h! @8 n& X2 k6 T' l! V
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant
% l8 V0 _! M( u9 s( l4 p/ R    Set swMatDB = New MSXM ...

5 C* o6 i6 v9 t  M' r5 N* }2 k- O高手啊!$ W# q% F) a( c7 D4 w: m
. Q( p+ x& X+ ^" n1 M& y3 b
我试试
7 P% Z8 S! b7 ?% S
2 v1 N, `7 Z: b$ }谢谢!0 M( U1 ?9 z: \
 楼主| 发表于 2016-4-29 12:44:56 | 显示全部楼层 来自: 中国广东
lhl2008 发表于 2016-4-27 00:17  Y  W# W. H" }4 {0 l2 m# x
你用下面代码试试( k4 b7 p1 W) e# m; b9 G
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant) r. W5 T6 I" o3 I& ]# z& w
    Set swMatDB = New MSXM ...
$ ?! H! Y  P, r: S
不好意思,您这段代码在solidworks的VBA环境中运行提示“用户定义的类型未定义”,请教是什么问题?如何解决?谢谢
发表于 2016-4-29 12:54:06 | 显示全部楼层 来自: 中国河北廊坊
本帖最后由 lhl2008 于 2016-4-29 12:59 编辑 . V# C! ?  t0 h
! t0 s4 M* f* T5 V5 _
在引用中加入 2016-04-29_12-54-12.jpg
; Z7 b7 [* g6 h# A* P7 {% b/ {1 }
' E, B& _7 _3 E% a+ a材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。# }! U+ N: V6 [9 W& I- `: }8 K$ Q5 l
 楼主| 发表于 2016-5-3 16:19:46 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-29 12:54& L- q, Q3 _% C  u, R0 J7 |
在引用中加入
+ v/ I+ r+ W- g) e% \5 @( W( S
! }4 ?3 D2 k6 o: {/ F! _材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。

& w' j) |( ^: L, c$ r' s# ]9 {成功了,谢谢!
) u" |& `& Y/ }/ y8 k
6 ?. |" Q7 i6 d1 ]" V0 H: v* W* V" G但不明白下面这句:
! N- z% I9 i. q+ h, X+ ]Set MatList = swMatDB.getElementsByTagName("material"),括号里的“material”为什么是"material"而不是其它?$ P' Z! y8 B# F; t, X: E, r
+ I- `! [& `& @! w9 M  c
5 s/ x8 L* R8 ?& a
下面是我编写的获取材料类别的全部代码:8 h0 k6 d4 V# e% }5 ?& x( Z3 W! ?
Sub main()
7 D* g" N9 |! S; T" }8 C8 y; p) E2 _. d
Dim swApp                       As SldWorks.SldWorks
' O6 O% q6 q3 ~% H3 j2 LDim swModel                   As SldWorks.ModelDoc2
2 P; e, J8 `# M: GDim swPart                       As SldWorks.PartDoc% z5 w- E: c$ M
Dim dbs                             As Variant1 {  q' G" e) N; t* P% l
Dim sMatName                As String4 E" @' g1 x, ~
Dim sMatDB                      As String
" ^& T0 N+ y( t; o$ FDim bRet                           As Boolean
9 C, Y' ]! Q( B' A5 ADim i                                   As Long+ w; r) B+ U& F- V1 [1 L! l2 q
Dim matPath                    As String# Y4 L2 S* K  [
Dim swMatDB                  As MSXML2.DOMDocument9 Y7 ^0 ], |4 M2 k- i: Q0 p
Dim MatList                      As Variant) R7 U' j4 I5 y2 }* ^

2 q0 E- P& b& P8 m4 h% t8 |Set swApp = Application.SldWorks0 c# y8 G/ g# H2 X% E& r
Set swModel = swApp.ActiveDoc
/ m4 D  s" U3 ~) C( j  SSet swPart = swModel
2 A5 U+ N: ~/ f2 j" Y+ i: A2 q8 Rdbs = swApp.GetMaterialDatabases! L' j) B8 `, B3 `
sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)$ F/ {" H1 I2 b: N+ t
For i = 0 To UBound(dbs), r, c! z" j% F6 \3 p! Q
      If StrComp(LCase(Left(Right(dbs(i), Len(sMatDB) + 7), Len(sMatDB))), LCase(sMatDB)) = 0 Then
, q% ]7 `" T5 G( ~" h+ J9 @           matPath = dbs(i): K3 l' U$ C! M  X
           GoTo MatTpye
" Q6 t; a7 P. F9 P, Q      End If- `8 c5 M% X8 ^4 W; E6 R
Next i* b' L* Y* k+ H: Y
$ H2 E( ?: l5 s/ ~! ?# q
MatTpye:
6 C% ^$ T. W  ~2 m. Q# ]Set swMatDB = New MSXML2.DOMDocument
' C/ p; s7 ?+ P/ y. ?3 a$ ~ ' 材料库所存储的路径
  A9 e) t7 z! hswMatDB.Load matPath! b0 k2 A9 J7 o9 l) a1 ]/ U) k
Set MatList = swMatDB.getElementsByTagName("material")
. B$ x# Y; ?7 p0 gDim MatName() As String, Mat As Variant
2 }- s! t0 A1 B/ _, r) lReDim MatName(MatList.Length - 1)
# m0 z) U0 _7 f      For Mat = 0 To MatList.Length - 1
2 Y# Y. M' I3 y% ?9 I7 b            If MatList.Item(Mat).Attributes.Item(0).childNodes.Item(0).nodeValue = sMatName Then( i8 \* x. u6 q! u) {
                 MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
" Z# E: z% _3 q8 l0 H6 h4 Y- H                 GoTo Finish7 F6 }" f8 D* q& _1 J
            End If
) P0 o! P) y0 I3 X; o' v5 N4 X+ R& j) W      Next Mat
! n; a, ?2 B. J/ o1 S; |! _
& ?8 z. q; q% b! c% fFinish:
  v+ ~' H9 k/ k- @9 g4 O7 tEnd Sub+ z$ Y$ p2 A& F  F

. |/ y. O- L+ n- v$ C! U- d5 t如有不对,请批评指正,谢谢!
发表于 2016-5-3 17:08:14 | 显示全部楼层 来自: 中国浙江嘉兴
kavenlee72 发表于 2016-5-3 16:19- Z3 d4 E; O: W
成功了,谢谢!
5 D5 a0 p9 z2 F+ d) L& }
' f5 h( \- ?2 l( K4 e$ H但不明白下面这句:
+ q; T2 G* Y9 ~0 O1 r& I
2012 測試ok,謝謝分享
! [- V2 g" j, D* ~" x; S8 }- S: T/ u! G. }; O3 ^% u1 E
建議補加如下紅字,在 "即時運算" 欄顯示材料類別.
6 M% U+ j4 o6 w+ L' g% {, q6 K( d5 g, ?
3 D" U" f8 x  D, u
    MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue- M; q5 B- l8 C& |

, |( J  {6 K3 D3 ~                 Debug.Print "材料類別: " & MatName(Mat)/ z9 j) P4 V2 N

+ f% ]; ^( K" u7 F$ _4 Y  g                 GoTo Finish
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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