QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 goto3d 于 2016-6-12 14:23 编辑
, D9 Q: e9 ]% @" }1 g! C( }
5 S) ]; a" D: P9 i0 b' msolidworks2012的材料库里,材料都分了类,如“钢、铁、塑料、橡胶”等等,如何用VBA编写宏来获取材料的这些类型呢?
' R. w4 n$ m" I) U. g 无标题.png 4 h/ c$ E# z# ]0 c3 j8 @0 V

0 p' J5 H% |+ Z1 }- W1 M请各位大神赐教,谢谢!
. r8 C/ i" E' T/ t
发表于 2016-4-19 22:55:44 | 显示全部楼层 来自: 中国香港
MaterialIdName
 楼主| 发表于 2016-4-20 20:44:50 | 显示全部楼层 来自: 中国广东
大鹿 发表于 2016-4-19 22:55, i( ]) v$ G7 }; L: V  e+ I+ `
MaterialIdName

# U: H2 G- ~( C- J2 Z能说详细点么?最好能给我举个例子!谢谢
发表于 2016-4-21 08:42:40 | 显示全部楼层 来自: 中国浙江嘉兴

! b" t; A1 @7 x/ A7 G參考/ r7 i5 p3 ^  d/ Z5 }
" c+ r% A- H6 ]* Q* X" W9 f0 _
  1. Sub main()9 i, Q3 ]3 [$ f+ B
  2. - Q2 B* w* {1 p2 x* O
  3.     Dim swApp                       As SldWorks.SldWorks
    ( O6 j9 T/ v" g$ V9 p8 Q
  4.     Dim swModel                     As SldWorks.ModelDoc2
    , C! y: r, f) ]# k* I& N  I
  5.     Dim swPart                      As SldWorks.PartDoc8 w; }$ A" z( h# A* j
  6.     Dim sMatName                    As String/ B# H: G9 P3 j# X: |
  7.     Dim sMatDB                      As String; g8 `, u+ T. w
  8.     Dim bRet                        As Boolean
    ! J0 q/ W/ n3 ~' B2 D; f7 ^
  9.    
    " b  t: ~9 K- J$ G* }
  10.     Set swApp = Application.SldWorks
    6 U3 [) ?5 j( _' R4 Q
  11.     Set swModel = swApp.ActiveDoc  H: _, e- H% _& d9 o) x! o
  12.     Set swPart = swModel
    . R% i7 Y  H" Q" y$ p
  13.     sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)! Y2 U2 ^* s# a8 A5 S; N8 h
  14.     Debug.Print "File = " & swModel.GetPathName. z, v# d% [2 I7 S
  15.     Debug.Print "  Material = " & sMatName & " (" & sMatDB & ")"* `  C& X8 s) _' a1 O6 I. t6 {
  16. 5 b$ J* G6 u8 \( D% i, g* k
  17. End Sub
复制代码
2.png
 楼主| 发表于 2016-4-22 18:18:48 | 显示全部楼层 来自: 中国广东深圳
本帖最后由 kavenlee72 于 2016-4-22 18:19 编辑 " n* U" [7 @% ]1 I
ryouss 发表于 2016-4-21 08:42) J5 Y) [! T" Z: H
參考
8 {+ k5 J: ~4 u; x5 A
GetMaterialPropertyName2获得的是材料的名称,如“红铜”,我是希望能获得“红铜”的类别,如“其它金属”“钢”“铁”等。
 楼主| 发表于 2016-4-24 22:01:56 | 显示全部楼层 来自: 中国广东
高手不露面,自己顶一下,别沉了
 楼主| 发表于 2016-4-26 21:41:23 | 显示全部楼层 来自: 中国广东深圳
难道SOLIDWORKS API 不能实现这个功能?
发表于 2016-4-27 00:17:50 | 显示全部楼层 来自: 中国北京
你用下面代码试试2 o8 r5 T" V/ y  k- r
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant" m% M& a4 [7 l4 U& Q
    Set swMatDB = New MSXML2.DOMDocument
: e3 A" P% N6 S7 V) S$ M'    材料库所存储的路径
: n+ s0 n) J. {1 S" Q2 Z! F    swMatDB.Load "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\chinese-simplified\sldmaterials\solidworks materials.sldmat"7 e* y! i" D' @

/ M6 }# v" L- ]; c, M* R    Set MatList = swMatDB.getElementsByTagName("material")
) e" H' Q: T, h* G, M% C    Dim MatName() As String, Mat As Variant
# e9 P2 x: d, r3 R2 x    ReDim MatName(MatList.Length - 1)
; l$ l5 ?6 `+ p0 i! [0 r/ \, z    For Mat = 0 To MatList.Length - 1
$ o! D4 U3 y* b9 R7 Y) m# M% o. j" F3 g- f# B5 l+ N; s
        MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue7 W' O9 j4 ~) A. ]9 ^) ^
- }9 ?" |6 v2 {$ L3 S, j
    Next Mat0 l7 f8 s* [! @+ z% U# B2 _

. P0 E+ M* {4 o$ L( Z- J4 d  J
 楼主| 发表于 2016-4-28 22:33:37 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-27 00:17+ u- y6 U( F+ u( e" `- N3 T) I( F
你用下面代码试试
( W: z$ M2 c1 h, V. VDim swMatDB As MSXML2.DOMDocument, MatList As Variant
2 I. b2 K2 J9 @8 G: N5 b    Set swMatDB = New MSXM ...
9 S' O2 |9 l$ B3 u
高手啊!" C) s2 ]- V& y. e0 d+ _
# O9 @  q  `4 q2 A7 v, b6 q
我试试
( w4 b& y' `; q
% m4 c; }3 u+ j, B) V" S/ }谢谢!
3 \! M- |5 K9 B: m
 楼主| 发表于 2016-4-29 12:44:56 | 显示全部楼层 来自: 中国广东
lhl2008 发表于 2016-4-27 00:17
/ q/ k* a$ \* z1 ~( L% y你用下面代码试试- j, d# h% s/ Z3 ?# _
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant$ h. |1 S* [; i3 M) @$ R1 Y
    Set swMatDB = New MSXM ...
# v# E& A) m  E% w* ?1 N
不好意思,您这段代码在solidworks的VBA环境中运行提示“用户定义的类型未定义”,请教是什么问题?如何解决?谢谢
发表于 2016-4-29 12:54:06 | 显示全部楼层 来自: 中国河北廊坊
本帖最后由 lhl2008 于 2016-4-29 12:59 编辑
) x7 F) Z5 r# t9 |" r" @+ Z& d" n. V7 D& E
在引用中加入 2016-04-29_12-54-12.jpg 1 R% f- I- b5 K4 u1 |( l5 _

; L' m: K6 T3 a8 l# H材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
4 R0 u- r  r$ j0 Y+ N- o- _
 楼主| 发表于 2016-5-3 16:19:46 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-29 12:54) i4 h+ r0 x. {
在引用中加入- Y% ^$ i& u- r0 b' x3 y6 b  K8 `. r- x

% A2 n1 A1 O3 d2 B5 E* I# h5 W材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。

7 S" p2 d  H) A$ B- ^成功了,谢谢!' Y! A" ?- o% I

% R, \. q0 F( N' y$ M+ g4 I- m. N: s- q但不明白下面这句:+ O/ z3 `# |( r/ [0 I; T
Set MatList = swMatDB.getElementsByTagName("material"),括号里的“material”为什么是"material"而不是其它?
  C) u0 s; g. X8 T# s3 p' Z1 q, O, C8 B' P, S+ a
! f, {" Z; J0 \" r& N% z7 x- o
下面是我编写的获取材料类别的全部代码:: x) W% y  w9 E/ X  S4 {4 _
Sub main()
: T+ v2 ~2 y/ j+ ^9 K: Q+ Y0 W+ @) }! [) N# `4 D1 T
Dim swApp                       As SldWorks.SldWorks
$ Y1 _9 n& S1 ^1 ?; U  Z& [. B: BDim swModel                   As SldWorks.ModelDoc2
, C: g$ j& c& f% WDim swPart                       As SldWorks.PartDoc0 D6 C, b: {! Y' C& _3 l
Dim dbs                             As Variant$ o- s, R8 g# X- g/ {; O: T
Dim sMatName                As String
2 ?9 `$ H! _1 V& }, U1 u( R1 r: ~Dim sMatDB                      As String
, W, C3 u8 O5 Q; d6 oDim bRet                           As Boolean  m9 s0 x+ a: I
Dim i                                   As Long
1 t  F9 ?8 b  uDim matPath                    As String; w4 `" P$ @; ]1 S) W$ j2 ^
Dim swMatDB                  As MSXML2.DOMDocument- M% U) S! f+ G& C
Dim MatList                      As Variant
/ ]! z# _; I5 M" B( Y+ U: d8 O& o; p3 X! c& q; ^
Set swApp = Application.SldWorks
( b; v! ?/ p, `/ r: i: y: MSet swModel = swApp.ActiveDoc5 p, X! n8 B) S
Set swPart = swModel
! M+ H' X* E- p+ wdbs = swApp.GetMaterialDatabases4 d) F) k0 f2 w* ?2 j! b( F! Q$ ]
sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)8 N7 {$ i9 n3 _. @3 m* C8 k
For i = 0 To UBound(dbs)6 K! V' C7 \0 ]: J* ~
      If StrComp(LCase(Left(Right(dbs(i), Len(sMatDB) + 7), Len(sMatDB))), LCase(sMatDB)) = 0 Then
  S8 I- X; s0 F; o8 Y+ \  U           matPath = dbs(i)
& B. v% w/ i; b  A4 }           GoTo MatTpye1 P9 j7 o) s, e( a+ q
      End If& ]& F( E3 C3 F* j9 B0 d1 @4 Y
Next i
6 D2 s/ M- B# w) @
  Z9 O8 W1 G  i  H) OMatTpye:% E# r5 ~/ Y9 z  \7 i
Set swMatDB = New MSXML2.DOMDocument
* H$ K4 m  C. S  D) R$ F; P6 i0 B: B ' 材料库所存储的路径
+ T( M" N5 W0 M) qswMatDB.Load matPath, I  q# G5 }: v9 G) h" }
Set MatList = swMatDB.getElementsByTagName("material")4 C4 Z/ G' n  {1 F# J& {4 U) E
Dim MatName() As String, Mat As Variant
9 e; c. k" D6 j; m3 I. Y8 c  W$ B" JReDim MatName(MatList.Length - 1)
' J# |4 ~' N  j" B, q1 I* z; S4 U      For Mat = 0 To MatList.Length - 1- L" o" L# Z9 u9 C6 C
            If MatList.Item(Mat).Attributes.Item(0).childNodes.Item(0).nodeValue = sMatName Then3 s* w- s; P# o  O) G" |4 E0 r+ t- \) Q
                 MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue. `3 `) A5 j* G7 Q  u/ q/ W( |/ f. j
                 GoTo Finish
4 @$ H" X. J2 M0 b            End If$ ?! W7 z6 L8 O' H9 d$ J6 j
      Next Mat
. o4 A& \- L. q! {8 j2 E( m, i/ x' x6 \/ l0 H8 ]$ R3 m3 D
Finish:
. }' Z/ f4 x' a/ t& jEnd Sub
' @4 R: `. o/ H6 c2 g* g0 Q( }7 ~. y3 t  |
如有不对,请批评指正,谢谢!
发表于 2016-5-3 17:08:14 | 显示全部楼层 来自: 中国浙江嘉兴
kavenlee72 发表于 2016-5-3 16:19% z2 T7 Y+ v' _7 k$ W1 U
成功了,谢谢!
1 X  N: b  D2 o  Y, k( n4 @
* j$ b7 {" U1 G- H# g但不明白下面这句:

$ T9 N4 N% W" j8 k2012 測試ok,謝謝分享7 h" t- p0 }# ?8 u0 A

) y% v* R# r& i! n+ F建議補加如下紅字,在 "即時運算" 欄顯示材料類別.% P2 e  |' R- e
8 m, @) X+ [& V9 k2 ^/ r

. v' d/ P; c" z% y8 ?    MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
3 `4 U6 F/ @+ E7 z, Y, D  d4 l- U2 A( K6 t+ _
                 Debug.Print "材料類別: " & MatName(Mat)3 i8 P8 Y9 u- G1 b3 l+ S1 o( T
8 w3 F, x; \6 f& N/ A% {8 ?4 N
                 GoTo Finish
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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