QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 goto3d 于 2016-6-12 14:23 编辑   u4 m( H+ w, r1 r' W# r
( v) F) c  l6 [  T
solidworks2012的材料库里,材料都分了类,如“钢、铁、塑料、橡胶”等等,如何用VBA编写宏来获取材料的这些类型呢?; I2 m- t+ W3 U: \& l* Y6 D' D
无标题.png
+ J8 ]5 s+ Z; N+ G: s
) K& I9 V/ F9 x. G* `' `请各位大神赐教,谢谢!
" l, @7 M: Y% L7 f
发表于 2016-4-19 22:55:44 | 显示全部楼层 来自: 中国香港
MaterialIdName
 楼主| 发表于 2016-4-20 20:44:50 | 显示全部楼层 来自: 中国广东
大鹿 发表于 2016-4-19 22:55
1 [* Z. D8 t& a! i. RMaterialIdName
! t' X/ ?0 [( i* }
能说详细点么?最好能给我举个例子!谢谢
发表于 2016-4-21 08:42:40 | 显示全部楼层 来自: 中国浙江嘉兴
# f/ r# P2 K* c, e, ]) ^
參考
. L# i& y; R* _2 _* N
( U$ u0 E7 g4 Y
  1. Sub main()/ A7 ^% ^4 q+ ]; m) N3 T2 C
  2. % q- S" k. U" J* T. M/ Q1 b+ w- T
  3.     Dim swApp                       As SldWorks.SldWorks, x. [' v, t8 x) ^
  4.     Dim swModel                     As SldWorks.ModelDoc2
    ( L6 Q) {- D5 f0 J
  5.     Dim swPart                      As SldWorks.PartDoc
    3 U" Q; I$ h. Q0 Q5 g, [: S9 g! B3 o' R
  6.     Dim sMatName                    As String- R5 i9 O# }6 q4 A8 D
  7.     Dim sMatDB                      As String
    / E/ u9 s3 i3 }# J
  8.     Dim bRet                        As Boolean
    1 j# Q1 N4 v$ q
  9.     5 R; `, X9 C& b& {& m/ f
  10.     Set swApp = Application.SldWorks) d; ^3 q& A3 x7 z- E
  11.     Set swModel = swApp.ActiveDoc
    0 b* [5 {: X. ^* C2 m0 K2 S8 L( o
  12.     Set swPart = swModel, w9 T6 Q( ]  C6 c: _! {9 |% C8 k
  13.     sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)% Z5 B7 I" n' z% l! j8 p! N( s
  14.     Debug.Print "File = " & swModel.GetPathName
    . V: s+ h" N2 \* R. I- Q/ ]
  15.     Debug.Print "  Material = " & sMatName & " (" & sMatDB & ")"
    ; W! B1 S# Y7 g

  16. 7 F# F' u* t- y" i
  17. End Sub
复制代码
2.png
 楼主| 发表于 2016-4-22 18:18:48 | 显示全部楼层 来自: 中国广东深圳
本帖最后由 kavenlee72 于 2016-4-22 18:19 编辑 & X- S# |& f! u- W2 \
ryouss 发表于 2016-4-21 08:42$ X3 {3 G% g2 a) B- m, G
參考
* @6 p# J, h9 w$ Z- ~0 P
GetMaterialPropertyName2获得的是材料的名称,如“红铜”,我是希望能获得“红铜”的类别,如“其它金属”“钢”“铁”等。
 楼主| 发表于 2016-4-24 22:01:56 | 显示全部楼层 来自: 中国广东
高手不露面,自己顶一下,别沉了
 楼主| 发表于 2016-4-26 21:41:23 | 显示全部楼层 来自: 中国广东深圳
难道SOLIDWORKS API 不能实现这个功能?
发表于 2016-4-27 00:17:50 | 显示全部楼层 来自: 中国北京
你用下面代码试试. @5 M* a' A8 o! K: P* a6 z
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant
/ _/ A0 B# O0 {* Q. v2 K    Set swMatDB = New MSXML2.DOMDocument
) v" b1 f: u/ r( W; B- J'    材料库所存储的路径
2 |- R! q2 k* J" c2 R    swMatDB.Load "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\chinese-simplified\sldmaterials\solidworks materials.sldmat"# @7 g; ^- r4 G0 z3 A( |
" b3 Q7 j& o+ c8 r' m4 ?. N
    Set MatList = swMatDB.getElementsByTagName("material"), j1 Q0 I* N+ i7 y6 x1 F' J
    Dim MatName() As String, Mat As Variant
$ K7 a1 z% O3 N; t. o$ {& l    ReDim MatName(MatList.Length - 1)
: ~9 ]. o$ R, S    For Mat = 0 To MatList.Length - 1
- _+ v* h5 _( t
) {& I( v, M' P  x        MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue6 |# \0 k+ R! K' V9 L
- L, O5 a7 N5 K
    Next Mat3 ^  w% A0 e, R* r

/ j, ~" _' t+ d6 \! H% ^
 楼主| 发表于 2016-4-28 22:33:37 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-27 00:175 W+ O( C7 E! Q8 i3 m5 u, O
你用下面代码试试% q/ |% H& f5 [; C  `4 H: k
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant/ |4 k4 G. ~* G7 W
    Set swMatDB = New MSXM ...
) T1 H7 O3 \! m
高手啊!; l6 ^! [5 ?& L* [! s% P& N
' w* S; Z5 }' t/ J" h* p" \
我试试, i6 d0 D: A3 |. j

0 Y: k. }6 ?! Y7 F; T! ]谢谢!% @9 z: K% f+ R- T6 z% q8 \
 楼主| 发表于 2016-4-29 12:44:56 | 显示全部楼层 来自: 中国广东
lhl2008 发表于 2016-4-27 00:176 Y6 \" a7 I! _$ @; m4 `" z2 P9 Z- d7 N1 j
你用下面代码试试& Q- |. v/ C1 ~! F& M/ X1 R
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant1 S+ r/ P& J0 w
    Set swMatDB = New MSXM ...
1 a8 ^, ^' w" V
不好意思,您这段代码在solidworks的VBA环境中运行提示“用户定义的类型未定义”,请教是什么问题?如何解决?谢谢
发表于 2016-4-29 12:54:06 | 显示全部楼层 来自: 中国河北廊坊
本帖最后由 lhl2008 于 2016-4-29 12:59 编辑 9 g, P6 k% G' U) U

! C" i3 ?+ I+ L9 b4 o% P) b* ?5 A  E6 q在引用中加入 2016-04-29_12-54-12.jpg
; L3 N. c, L4 t* w
# ^7 Z1 f+ m: G- y0 L材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
# X: F5 J. u5 d* G. W' i/ c* Y
 楼主| 发表于 2016-5-3 16:19:46 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-29 12:54( Y5 F6 b4 m+ r# P. o
在引用中加入
9 j) l- X5 X$ ^
: [! s6 s. [4 d5 Z材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
2 Y( @' a  [( p" K! r, m) @7 o
成功了,谢谢!; w' H$ o$ R% v

8 P, v8 {- @! m; W- {. R; S但不明白下面这句:( W6 ~- t+ s' l9 [  O: t/ y- J# h
Set MatList = swMatDB.getElementsByTagName("material"),括号里的“material”为什么是"material"而不是其它?5 }" x: l& `+ @- X! w, j
4 {, W& \$ O3 @  j  F9 R) j) ?
. n' [% i; b# i5 B* d; ?
下面是我编写的获取材料类别的全部代码:
  k. u3 d# D& F+ O9 b- C+ `! vSub main()
; X+ j. g: P8 e' }6 S7 T
* u1 R' b& D4 m( q6 p' P: GDim swApp                       As SldWorks.SldWorks
" ?) j2 v- s- D7 jDim swModel                   As SldWorks.ModelDoc2( A/ [5 H$ E7 N/ k
Dim swPart                       As SldWorks.PartDoc" ]4 R' K( M; I/ S. \- f
Dim dbs                             As Variant
6 o! }- ]' g2 n* \( D+ L# [Dim sMatName                As String8 |5 R  G: ~: v: c
Dim sMatDB                      As String$ h1 i6 L  B8 h- R( d6 d2 q
Dim bRet                           As Boolean
9 N. W" s5 [" E8 E6 h5 }8 M- _Dim i                                   As Long
% d$ y; F7 j/ @+ [0 v1 i* eDim matPath                    As String4 y' |' B& h9 ?7 {
Dim swMatDB                  As MSXML2.DOMDocument
1 ~! x5 u3 P2 ~1 K: IDim MatList                      As Variant
: G3 j# n+ k. R' R7 D9 z: o0 e" t2 k
4 @# |4 J3 I+ s4 t9 {/ L4 vSet swApp = Application.SldWorks* A8 D& |5 j! m
Set swModel = swApp.ActiveDoc
. G, q( k- A0 Z1 d/ sSet swPart = swModel  ]  |7 E# X5 T3 A  _  `7 |, \. U9 u
dbs = swApp.GetMaterialDatabases
  V3 H/ S) p6 _+ psMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)
: c" Z7 i. A. ]) C2 P* \For i = 0 To UBound(dbs)
1 X! ^0 I) p# i: m. B: _. T      If StrComp(LCase(Left(Right(dbs(i), Len(sMatDB) + 7), Len(sMatDB))), LCase(sMatDB)) = 0 Then, W* q/ l+ l0 n1 H5 S2 f' v8 _
           matPath = dbs(i)6 k' n# N2 D$ B* h
           GoTo MatTpye2 g4 k! Q6 l$ l2 ^
      End If
( Y6 u2 ]+ N1 d6 FNext i# p0 f6 g) ?/ m& a/ g

5 w2 ~/ B, M+ A9 u7 uMatTpye:) O9 S5 j$ H7 C- n% {* |5 q" o
Set swMatDB = New MSXML2.DOMDocument( o+ s3 L" p6 ?% j
' 材料库所存储的路径
) V6 d4 U& X/ s" \swMatDB.Load matPath
7 }2 c% ~* i, R) l" g. ySet MatList = swMatDB.getElementsByTagName("material")
4 S, Y9 O% z8 W) S. p6 X7 |Dim MatName() As String, Mat As Variant& \) O/ J/ \2 j7 d, P% }- r
ReDim MatName(MatList.Length - 1)
, P8 b0 ]7 Z5 s      For Mat = 0 To MatList.Length - 1, l5 C7 e. C. i/ c
            If MatList.Item(Mat).Attributes.Item(0).childNodes.Item(0).nodeValue = sMatName Then
( C) Z- O4 e# U# G- G3 e                 MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue, p7 V& m- S& E' |- _# i! ~" x6 P
                 GoTo Finish; s( b1 s9 v% X# i
            End If, `) C# X7 u( n2 X, t. b4 h7 @
      Next Mat
, P! |' a1 S2 N6 o3 J
7 L) U  S* K. C* t! j+ N/ h2 `Finish:
# p' [5 w( y0 y- G. w$ D5 G1 FEnd Sub
/ r; s6 U6 ?! q; e
, e) ]. b7 L2 G+ \: o如有不对,请批评指正,谢谢!
发表于 2016-5-3 17:08:14 | 显示全部楼层 来自: 中国浙江嘉兴
kavenlee72 发表于 2016-5-3 16:19
' H; N" P9 S+ l8 i1 p: {8 x4 a/ f成功了,谢谢!- z6 u, N1 g: s0 n$ _  o

( {# ~+ @2 b3 F3 d& _9 Z% A$ g# Q但不明白下面这句:

+ o( X1 ~$ O8 i# g$ u7 X2 S; `3 A2012 測試ok,謝謝分享
( f( Z4 K6 P) ]* l) d$ c: U, _8 W, [+ j
建議補加如下紅字,在 "即時運算" 欄顯示材料類別.1 Z: q9 g  o6 g; ]# c* C

9 Q( U* l2 @, P: b  a3 ]% E8 n. g+ D# `$ A. Q/ a4 Z& i- v
    MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue% t- c8 L2 E6 A! M- j- Q

7 S% k8 q: F. g' Y; p8 u                 Debug.Print "材料類別: " & MatName(Mat); B" l- @9 P$ l
' N/ f8 p: C5 f3 D( H3 q' S, i6 ^3 n
                 GoTo Finish
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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