QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 goto3d 于 2016-6-12 14:23 编辑 1 }4 v, u; l; T- C( K6 x" G; c' o
# ]0 _; I0 G3 z, ~; o, t; m5 q" v
solidworks2012的材料库里,材料都分了类,如“钢、铁、塑料、橡胶”等等,如何用VBA编写宏来获取材料的这些类型呢?
3 Z( r" _' g' X3 Z5 w 无标题.png - t  Z' R8 ?  c" o4 Y' y7 v

$ d! S4 x4 Y4 w$ I! O! {1 }请各位大神赐教,谢谢!: p  h6 d/ n* _$ r+ v' P* A
发表于 2016-4-19 22:55:44 | 显示全部楼层 来自: 中国香港
MaterialIdName
 楼主| 发表于 2016-4-20 20:44:50 | 显示全部楼层 来自: 中国广东
大鹿 发表于 2016-4-19 22:55
' p, b/ ^( d8 m/ T& U* ~8 E. }MaterialIdName
5 N. D: Y* g( z" L. M
能说详细点么?最好能给我举个例子!谢谢
发表于 2016-4-21 08:42:40 | 显示全部楼层 来自: 中国浙江嘉兴
" K0 w! w% w9 w- S9 N1 x
參考
+ Z9 l! j1 Y( [, P! k! p  b& e# W5 m4 X4 j
  1. Sub main()0 O3 I9 l2 v* L2 T

  2. $ y! \% P0 b% g2 i4 t; Y/ _6 S
  3.     Dim swApp                       As SldWorks.SldWorks1 {8 V( S2 h( [& G& i
  4.     Dim swModel                     As SldWorks.ModelDoc2
    1 P4 J. d2 ^# Z2 h7 V
  5.     Dim swPart                      As SldWorks.PartDoc/ B2 d) `: n$ ]' G
  6.     Dim sMatName                    As String
    : D2 X  Y5 W4 _+ X
  7.     Dim sMatDB                      As String+ r' H0 X. b; Z& m$ F7 X1 _
  8.     Dim bRet                        As Boolean
    + T& e# T7 a0 G3 u! M" ?
  9.    
    2 P( e4 r, t+ k$ y) d
  10.     Set swApp = Application.SldWorks
      E; i3 t& Q& q: Z6 U
  11.     Set swModel = swApp.ActiveDoc. F% i# O4 n2 }! l, ]- ^
  12.     Set swPart = swModel" U& C. {- C$ m
  13.     sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)
    - n0 ~5 \3 W3 ~, C( g  H9 J
  14.     Debug.Print "File = " & swModel.GetPathName! a- e% f: y$ r" n* e- \
  15.     Debug.Print "  Material = " & sMatName & " (" & sMatDB & ")"
    0 X; F# p) c; Q+ g: H
  16. 3 _8 C1 d- Y7 ]# s
  17. End Sub
复制代码
2.png
 楼主| 发表于 2016-4-22 18:18:48 | 显示全部楼层 来自: 中国广东深圳
本帖最后由 kavenlee72 于 2016-4-22 18:19 编辑 # N0 K: y, `! \! t8 L  U
ryouss 发表于 2016-4-21 08:424 d7 F" [; K! e0 n
參考

$ v/ f1 |0 q% o# V! q' f) p5 B- IGetMaterialPropertyName2获得的是材料的名称,如“红铜”,我是希望能获得“红铜”的类别,如“其它金属”“钢”“铁”等。
 楼主| 发表于 2016-4-24 22:01:56 | 显示全部楼层 来自: 中国广东
高手不露面,自己顶一下,别沉了
 楼主| 发表于 2016-4-26 21:41:23 | 显示全部楼层 来自: 中国广东深圳
难道SOLIDWORKS API 不能实现这个功能?
发表于 2016-4-27 00:17:50 | 显示全部楼层 来自: 中国北京
你用下面代码试试* i' y( M2 M6 F/ F0 w
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant
0 a$ z# _5 {. {! k  Z    Set swMatDB = New MSXML2.DOMDocument
/ l3 F7 Q7 L" l5 p9 ]" r- n2 g  d: Y'    材料库所存储的路径* g; U) H! O/ H* I* {
    swMatDB.Load "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\chinese-simplified\sldmaterials\solidworks materials.sldmat"
8 G. R- w4 C7 S' W, G/ R. \5 `$ x4 i6 v( u" s; @" `. C
    Set MatList = swMatDB.getElementsByTagName("material")
' [& ~' W$ W7 }    Dim MatName() As String, Mat As Variant6 k& V4 e8 S0 T' O  y% X3 Y
    ReDim MatName(MatList.Length - 1)0 g" J3 n5 r) x! I, l2 ^2 c, M
    For Mat = 0 To MatList.Length - 1; [3 F, A! v& T2 H7 r

7 v% S0 q; Y! y& y. x        MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue$ k- x6 `' C% P2 X& d

; y' `+ [9 t) y5 ]    Next Mat, R) o  G! U5 B1 j

( x8 `4 f7 q+ S) A
 楼主| 发表于 2016-4-28 22:33:37 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-27 00:17  ~$ t; f0 Z6 n6 }
你用下面代码试试
2 j2 o9 v' U% e/ \* P' k! [Dim swMatDB As MSXML2.DOMDocument, MatList As Variant
, u$ u! M% H4 h2 o( R9 x    Set swMatDB = New MSXM ...
" ~$ G( ^7 a# w3 N# ]6 i* V
高手啊!+ [4 y. `- J$ b* P/ N' I8 y/ I

9 j& K" U( @) J1 s5 v我试试! `+ @3 t  q- z3 C0 F+ n  a
. u# X5 o1 ~: h
谢谢!, h: \0 G+ [* L$ ^* n7 ]" V5 @
 楼主| 发表于 2016-4-29 12:44:56 | 显示全部楼层 来自: 中国广东
lhl2008 发表于 2016-4-27 00:17
5 y3 e# N3 `/ \9 `% X2 S你用下面代码试试
* f, U, B) M, b3 B3 W. ^. y3 u/ b" |Dim swMatDB As MSXML2.DOMDocument, MatList As Variant9 ?  N/ |, P9 X  {
    Set swMatDB = New MSXM ...

* P9 c( u8 l3 Y' r) _8 y不好意思,您这段代码在solidworks的VBA环境中运行提示“用户定义的类型未定义”,请教是什么问题?如何解决?谢谢
发表于 2016-4-29 12:54:06 | 显示全部楼层 来自: 中国河北廊坊
本帖最后由 lhl2008 于 2016-4-29 12:59 编辑 # p# Y2 Y3 R6 H  ?9 A. c2 w$ ~9 |; O' U
1 m+ A- ]. n* W+ S* o
在引用中加入 2016-04-29_12-54-12.jpg ; {; e. ?' G% d! Y$ K0 i9 }, z

, }4 R% m  U( \4 @' j4 K材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
2 }6 Z/ @* f# }# m' ]4 w, x; G5 N
 楼主| 发表于 2016-5-3 16:19:46 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-29 12:54
5 O  |) K6 I/ E/ z9 s: }1 j  a在引用中加入
: I' X) I. q/ i0 M" H, y
1 Y: @% Y* `' f# E+ ]6 ~( x材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。

$ N/ t# W/ Y4 R$ u7 j, m成功了,谢谢!
/ i2 u! H) Q, |
/ J, n( S" q" g! w- K但不明白下面这句:2 L# l  {& e: U4 E9 E) A8 k1 e" m8 D
Set MatList = swMatDB.getElementsByTagName("material"),括号里的“material”为什么是"material"而不是其它?
0 b8 s% R- A' s& Q$ L+ V- ]* W4 Y
; f5 g  b" A, z
) k+ W7 N& ]7 ?" H) A下面是我编写的获取材料类别的全部代码:- T  R6 z5 A, s% S& A# r* b
Sub main()
9 q, ]/ H7 I% w" z/ z: Z) v; O" E+ @: j5 R
Dim swApp                       As SldWorks.SldWorks
' ]$ P& y' Z- o6 q% M2 V( }Dim swModel                   As SldWorks.ModelDoc21 M9 l2 S" B" `7 r# J
Dim swPart                       As SldWorks.PartDoc: }) s% N4 b7 N( b
Dim dbs                             As Variant& |( B6 g2 K+ `9 Y' N
Dim sMatName                As String
; {) `) R$ X3 Z2 b: E- I# ?* X& VDim sMatDB                      As String
( P# o+ w1 O1 v/ R) D4 `, DDim bRet                           As Boolean2 I. u+ ?" a/ |$ Z8 T, @8 x. }( R
Dim i                                   As Long. y, d6 [1 ^* d) {3 O+ u
Dim matPath                    As String! ^$ N  X" N3 W+ D7 ^
Dim swMatDB                  As MSXML2.DOMDocument& f8 P% e  O# |3 Q1 q+ Z
Dim MatList                      As Variant
6 _; D& u, R* T- a- m5 e& `7 [, @% e0 |3 m* ~0 y
Set swApp = Application.SldWorks" T$ d1 x( T( ?6 h% ~) Z
Set swModel = swApp.ActiveDoc
, V( n0 E+ q. _' mSet swPart = swModel
1 B- Y8 J6 b- \) o/ ?dbs = swApp.GetMaterialDatabases
5 y2 g( P# I5 @# C) I$ J4 i2 W! fsMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)
7 p1 r. m+ L+ A* w8 R. s2 d" d( iFor i = 0 To UBound(dbs)
! i* L  V, n5 _' d! F' v      If StrComp(LCase(Left(Right(dbs(i), Len(sMatDB) + 7), Len(sMatDB))), LCase(sMatDB)) = 0 Then7 `$ G% c6 \$ ^
           matPath = dbs(i)
" z) n0 M% }3 L. Q/ i" q1 K           GoTo MatTpye+ p+ C, s  d2 h! ~4 |& d! X+ R" F
      End If' p, u6 o$ k3 O3 q& ?
Next i5 ]$ [  c7 B2 a. u

1 G: O7 N7 f% `3 D( ZMatTpye:
  O! f  |% H' D" nSet swMatDB = New MSXML2.DOMDocument
! K( }3 X/ v$ [( ?. ]7 T ' 材料库所存储的路径
; O1 F5 w! {: i& E5 s5 gswMatDB.Load matPath  [# L, B: L( Y! Q) @
Set MatList = swMatDB.getElementsByTagName("material")0 m. c3 l$ Y, [# D3 [6 ?& ]
Dim MatName() As String, Mat As Variant+ B0 a) K! E5 Z: O
ReDim MatName(MatList.Length - 1)
# r! ~. }, f# o6 N4 G      For Mat = 0 To MatList.Length - 1/ w" o# y! _; B" t
            If MatList.Item(Mat).Attributes.Item(0).childNodes.Item(0).nodeValue = sMatName Then' Q$ r2 J9 X; F* f. |1 d8 J  j
                 MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
* d. m9 E" N) g2 o2 j                 GoTo Finish& O) ]* c* q* o
            End If0 \2 }6 p. @5 o4 i+ r. ~' n) R; n
      Next Mat  ^: p- N1 m4 r: M
- ~3 L+ I/ k$ d: R, u# k; c
Finish:2 Y1 l: j' ]7 P3 P% m5 M
End Sub$ q* T2 e+ O8 m6 W; i( {
( a/ |( N6 K; F. H) H0 H
如有不对,请批评指正,谢谢!
发表于 2016-5-3 17:08:14 | 显示全部楼层 来自: 中国浙江嘉兴
kavenlee72 发表于 2016-5-3 16:19$ [6 j% q& n8 F: Z, Z
成功了,谢谢!
  a  ^5 Z3 Y2 `4 U8 q) j3 ^8 z& U9 a) g, T( M, F
但不明白下面这句:
# M; v5 t$ y2 d2 K
2012 測試ok,謝謝分享4 D) I6 L# P8 `7 A. j* {

, U/ V2 j. R: H( p3 q建議補加如下紅字,在 "即時運算" 欄顯示材料類別.
! `  o4 Y( t& S$ \( m& y( l% R0 h' c3 y. P, h" M

; }  s8 `8 T' Z" q    MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
8 K$ s) R5 }- x- P! m. S( z/ R% S# F# u) ^; Q1 }; C% S, w
                 Debug.Print "材料類別: " & MatName(Mat)6 u: U% Z$ A& t; v1 q
, N9 k: P& t) N
                 GoTo Finish
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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