QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 goto3d 于 2016-6-12 14:23 编辑
* L3 I1 r+ M8 h* f7 W; ~8 Z1 w; ]2 s7 \/ c( O
solidworks2012的材料库里,材料都分了类,如“钢、铁、塑料、橡胶”等等,如何用VBA编写宏来获取材料的这些类型呢?* @* T8 S5 ?3 p/ Y4 J
无标题.png $ Q9 R+ a$ y" H8 `
' {- C3 j/ g2 ~  I3 W
请各位大神赐教,谢谢!
! I, g/ f! I. g7 K
发表于 2016-4-19 22:55:44 | 显示全部楼层 来自: 中国香港
MaterialIdName
 楼主| 发表于 2016-4-20 20:44:50 | 显示全部楼层 来自: 中国广东
大鹿 发表于 2016-4-19 22:55
% j' @4 C: I. BMaterialIdName

7 I* C  e8 s1 W6 x8 T6 r% ?- Y能说详细点么?最好能给我举个例子!谢谢
发表于 2016-4-21 08:42:40 | 显示全部楼层 来自: 中国浙江嘉兴

! \% m+ C+ e3 M! N  ^3 v7 \參考, q! F8 B' Y: C% j8 ]/ z7 r
' B( \6 J4 _# g1 o4 f; j1 V9 Z/ c
  1. Sub main()
    / M0 C3 ^$ ^8 e# \# {& I
  2. ; t. W/ @5 L0 I- P% o/ A
  3.     Dim swApp                       As SldWorks.SldWorks0 I" ?" k8 ?0 V
  4.     Dim swModel                     As SldWorks.ModelDoc2  O% ~! I. k8 \  H7 Z% S
  5.     Dim swPart                      As SldWorks.PartDoc
    0 _, y, w6 e% {6 @* j, k3 U' z
  6.     Dim sMatName                    As String
    / q/ e2 t/ Y4 w6 b; N4 g
  7.     Dim sMatDB                      As String
    - R/ K0 h. p. N, {- g# ~1 G
  8.     Dim bRet                        As Boolean
    1 U$ z- K) U! d& C; V+ r, }) L' ~
  9.     + k! ]* `$ u. S0 O" t& _+ [
  10.     Set swApp = Application.SldWorks
    # p0 N$ d+ `" O. N, L/ G
  11.     Set swModel = swApp.ActiveDoc/ I0 I1 a5 e3 c" A2 J5 S
  12.     Set swPart = swModel7 r, I6 Z6 b7 r& W) `: B
  13.     sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)
    & m8 S/ w; f; @0 A7 m
  14.     Debug.Print "File = " & swModel.GetPathName
    3 v: M0 U3 r& D% Y  ?
  15.     Debug.Print "  Material = " & sMatName & " (" & sMatDB & ")") M/ M! F4 ~% b4 q  |
  16. " Q( f1 ]1 r& N5 E5 t* ?- B2 y. p
  17. End Sub
复制代码
2.png
 楼主| 发表于 2016-4-22 18:18:48 | 显示全部楼层 来自: 中国广东深圳
本帖最后由 kavenlee72 于 2016-4-22 18:19 编辑 / V9 x+ Y) d5 r
ryouss 发表于 2016-4-21 08:42
' G1 Q% o$ I! N8 G& T4 j# M參考

3 a" k' ]+ e1 d$ r. v! E5 p5 bGetMaterialPropertyName2获得的是材料的名称,如“红铜”,我是希望能获得“红铜”的类别,如“其它金属”“钢”“铁”等。
 楼主| 发表于 2016-4-24 22:01:56 | 显示全部楼层 来自: 中国广东
高手不露面,自己顶一下,别沉了
 楼主| 发表于 2016-4-26 21:41:23 | 显示全部楼层 来自: 中国广东深圳
难道SOLIDWORKS API 不能实现这个功能?
发表于 2016-4-27 00:17:50 | 显示全部楼层 来自: 中国北京
你用下面代码试试' P& k1 x9 z( L  j
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant2 ]8 ^  p$ O1 J; }
    Set swMatDB = New MSXML2.DOMDocument
1 I- X5 [$ G: D4 h2 b0 w'    材料库所存储的路径8 X2 B6 ~4 E1 y3 d7 E
    swMatDB.Load "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\chinese-simplified\sldmaterials\solidworks materials.sldmat"
! S2 B' t. w8 P( E. h) \( d" X/ f8 m3 I0 ^1 U& I" ^
    Set MatList = swMatDB.getElementsByTagName("material")
- Q2 f- v" m) ?% X& E" H% M    Dim MatName() As String, Mat As Variant
2 M- n$ Q' [6 a4 }    ReDim MatName(MatList.Length - 1)
2 ?$ G1 k0 p. b) s, T    For Mat = 0 To MatList.Length - 1
5 [1 `3 Z7 K0 h7 i. n2 u/ D/ o
# U! c$ U4 {( J4 G        MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
; i/ }. n+ W2 u: U/ ?9 ]8 B7 ~
) e4 P  s! o. }8 ~" }+ z8 ~, S    Next Mat; O0 _0 V6 H7 g
: c/ e# Y' g# f) x4 ?0 [  Y
 楼主| 发表于 2016-4-28 22:33:37 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-27 00:17
0 Q" b) R2 A( F) T8 x你用下面代码试试
4 d. F- T+ Q3 e# a' K9 RDim swMatDB As MSXML2.DOMDocument, MatList As Variant
/ |0 j7 t. z( Y, z$ y    Set swMatDB = New MSXM ...

" v* V$ G/ w0 j: O高手啊!
9 C: n# N- Y8 _  @
0 ?/ p, m" X- r/ J9 e  m  `我试试
! R3 ?4 q5 {5 E
8 @, l& n! K: Z& r$ S. }谢谢!
) R% O- t# H; J6 u/ u
 楼主| 发表于 2016-4-29 12:44:56 | 显示全部楼层 来自: 中国广东
lhl2008 发表于 2016-4-27 00:17
& J; e; d: `. c. [你用下面代码试试
; e4 c1 v5 S) F3 Q) \Dim swMatDB As MSXML2.DOMDocument, MatList As Variant- V$ E- ?+ }6 c2 V
    Set swMatDB = New MSXM ...

. D, `) [% @( F# ~3 q  |不好意思,您这段代码在solidworks的VBA环境中运行提示“用户定义的类型未定义”,请教是什么问题?如何解决?谢谢
发表于 2016-4-29 12:54:06 | 显示全部楼层 来自: 中国河北廊坊
本帖最后由 lhl2008 于 2016-4-29 12:59 编辑 9 E/ V9 h& P# Q) V4 j( p6 D
+ q3 L6 s8 S0 ~- N6 V
在引用中加入 2016-04-29_12-54-12.jpg
' k7 N: E# [, |% E8 ]7 l
! v2 p7 s, [9 ~! ?4 Q& D2 |材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
/ y2 M0 B- I* W% v8 v. `( S
 楼主| 发表于 2016-5-3 16:19:46 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-29 12:549 l/ F% z. @$ B9 K
在引用中加入/ A/ a9 S* G1 u2 ^% N& \' ?

* v! }3 p& d4 N) E  V* T6 |材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
5 v* T( X- e8 E& Q- o$ w
成功了,谢谢!
2 B4 n" z6 g5 e3 n) d' ]# T
+ v  L& [* E: T* j  d* Z" _但不明白下面这句:) ~7 p1 }$ Q" ^! R5 p: e* }
Set MatList = swMatDB.getElementsByTagName("material"),括号里的“material”为什么是"material"而不是其它?# ?" K- M) g1 V0 w0 L8 p" z

+ c: |2 p1 }+ O: K6 O/ B5 M' g/ h+ P: a
下面是我编写的获取材料类别的全部代码:- s: P  o# t0 }. X
Sub main()/ i, j7 B: V0 w, ]* H

$ v; a  ]- z6 j% ODim swApp                       As SldWorks.SldWorks
& {; u& L$ p* i5 |) tDim swModel                   As SldWorks.ModelDoc2
: k; P5 j, Z- W/ Z! S' ]2 qDim swPart                       As SldWorks.PartDoc
7 j. U4 }" |& M+ P7 h0 ?/ {Dim dbs                             As Variant
3 D& ]: ?! c& P: t( }" EDim sMatName                As String" G% m+ v# p: p7 L8 D
Dim sMatDB                      As String$ d) v  [5 g5 n$ J
Dim bRet                           As Boolean' S! E9 a) V! t5 k9 [4 ^
Dim i                                   As Long
" `4 b; @: x5 W9 P3 pDim matPath                    As String
% y! t( X1 o! G% rDim swMatDB                  As MSXML2.DOMDocument9 Y0 N) S  d; n, d$ H1 U/ l0 V
Dim MatList                      As Variant
& S0 h9 D; A9 Q- q9 |( ~% t2 O' X) K  \  _1 Y" q7 k: H& r
Set swApp = Application.SldWorks
& d0 _9 Q. T- \) C. ISet swModel = swApp.ActiveDoc7 s! T' h( d8 \* p. A* t+ ?
Set swPart = swModel) o8 C. M, T0 q5 W2 i& A9 K5 l
dbs = swApp.GetMaterialDatabases
: T" ~5 h5 }: ?! f& msMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)) }4 c* v; V4 B
For i = 0 To UBound(dbs)$ S9 J: \9 \' i# E
      If StrComp(LCase(Left(Right(dbs(i), Len(sMatDB) + 7), Len(sMatDB))), LCase(sMatDB)) = 0 Then6 t. z$ u/ h/ v/ M
           matPath = dbs(i)
% |5 N! m5 K6 B2 L! |& L           GoTo MatTpye1 N, I5 ~7 j% Z& |9 ^+ \7 ?
      End If
+ _) m; h- z! J0 b3 P) cNext i
0 J5 _0 o" y6 q* p  _
" z% d* @( P0 `$ E, KMatTpye:
; Z% p: b; m  I  r  t8 X2 v+ ZSet swMatDB = New MSXML2.DOMDocument1 N! X. D: a: Q6 L3 Y4 r: f: W
' 材料库所存储的路径
: J! n" v4 U2 x6 [. UswMatDB.Load matPath) P$ F* ]) q( N! D$ H7 |
Set MatList = swMatDB.getElementsByTagName("material")
4 b+ r( I& [# u9 k8 }! j, ~4 @1 v4 uDim MatName() As String, Mat As Variant+ N2 U4 M( x. m; _, m! N  L
ReDim MatName(MatList.Length - 1)) }" Y, l1 {$ p: i' b  j" @- T  z5 l
      For Mat = 0 To MatList.Length - 1. N3 T" W% e2 E' @
            If MatList.Item(Mat).Attributes.Item(0).childNodes.Item(0).nodeValue = sMatName Then
/ g; p: T( M! F                 MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue7 b# Y" s  P+ J6 S
                 GoTo Finish# C2 w5 r0 Q% \
            End If- M- R1 p5 l2 h* k% y
      Next Mat2 y! d$ ?1 l) m& C% Z

; @2 K/ C1 N; N2 YFinish:) J  l+ E$ h1 g* ^) R% E0 v( y
End Sub
2 K% ]3 B! t! _& m8 X  ~
4 ~, |7 {/ z/ j& c/ a如有不对,请批评指正,谢谢!
发表于 2016-5-3 17:08:14 | 显示全部楼层 来自: 中国浙江嘉兴
kavenlee72 发表于 2016-5-3 16:196 G+ Y' r1 s2 S: \1 }
成功了,谢谢!* v  n( s: m$ ?, w, |+ W1 P

% k! n* f) G+ L2 U5 ?$ M' ]2 _5 e但不明白下面这句:

4 P# K) ?( l# _- y9 {2012 測試ok,謝謝分享9 D  r% q- w$ `- Q9 R" g# B

8 v0 g0 F& Y2 A建議補加如下紅字,在 "即時運算" 欄顯示材料類別.
, [# L4 W* x9 E' B& {0 ]: C' G( s9 C) B, g4 V+ p/ Q% g' ~- Y

8 o: S* n$ V8 q0 \5 p8 Q# N    MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
' o# y& x8 E9 T) Q& [( u" f
8 [! z# h/ e: r2 l5 _                 Debug.Print "材料類別: " & MatName(Mat)0 b4 I( j* L, `8 o, d5 H

: z* m- ^3 p1 m5 G: \" i- x                 GoTo Finish
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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