QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 goto3d 于 2016-6-12 14:23 编辑 & ^2 |, d9 i- o, s, Q) X
9 t" }# D8 \- F* Q
solidworks2012的材料库里,材料都分了类,如“钢、铁、塑料、橡胶”等等,如何用VBA编写宏来获取材料的这些类型呢?
) Z3 H  H/ u0 R' v* Y5 @ 无标题.png " m4 [3 p7 }7 s

4 O; Q) b7 n6 Z6 n) g+ D请各位大神赐教,谢谢!- }! ^2 d0 j  u1 P7 \
发表于 2016-4-19 22:55:44 | 显示全部楼层 来自: 中国香港
MaterialIdName
 楼主| 发表于 2016-4-20 20:44:50 | 显示全部楼层 来自: 中国广东
大鹿 发表于 2016-4-19 22:55
' t$ K5 A; `" t. m; s, t1 l2 c" tMaterialIdName
1 A0 s# |% j* \9 g3 n# K
能说详细点么?最好能给我举个例子!谢谢
发表于 2016-4-21 08:42:40 | 显示全部楼层 来自: 中国浙江嘉兴
  y. L- R9 y* b5 i. S$ [8 a; \; w! r
參考( k- _2 s1 y7 S2 a# p$ I
* R1 |* S' h" L7 ^, z* H9 G
  1. Sub main()
    / M8 l  h' s  ?  E
  2. , T" s+ V6 O3 l5 c4 X
  3.     Dim swApp                       As SldWorks.SldWorks
    1 i- T( p1 s3 S- |/ R  j
  4.     Dim swModel                     As SldWorks.ModelDoc2
    : e7 d; J6 G* Z. P7 k; U
  5.     Dim swPart                      As SldWorks.PartDoc4 Y( D9 T0 W% L7 ~" I
  6.     Dim sMatName                    As String
    8 ~) b0 j3 I" X6 e" C3 A
  7.     Dim sMatDB                      As String5 B+ \% h. ~1 ?/ B) [" E9 H5 _
  8.     Dim bRet                        As Boolean/ i) X% t! M" k- n9 A
  9.    
    # J! \% L% }* s$ c3 @. _) ~; {3 u5 U
  10.     Set swApp = Application.SldWorks
    " L; ]* P0 O* w
  11.     Set swModel = swApp.ActiveDoc
    / K: E5 I3 S7 o) _  L
  12.     Set swPart = swModel
    % I3 m- B4 U+ d9 V/ U7 y" d
  13.     sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)8 K5 \* A3 U# F. R
  14.     Debug.Print "File = " & swModel.GetPathName* s0 `) h: H% ^- m4 F' E
  15.     Debug.Print "  Material = " & sMatName & " (" & sMatDB & ")": G5 B1 Y- o* o# b
  16. : m; p- m3 }( a$ g. X$ @
  17. End Sub
复制代码
2.png
 楼主| 发表于 2016-4-22 18:18:48 | 显示全部楼层 来自: 中国广东深圳
本帖最后由 kavenlee72 于 2016-4-22 18:19 编辑 7 l% y% l' q' i4 R3 F4 {1 Y; `4 A
ryouss 发表于 2016-4-21 08:42
9 m5 a8 u, J* E0 t  @4 C參考
- Q9 k! ~" G, q6 N  V- u
GetMaterialPropertyName2获得的是材料的名称,如“红铜”,我是希望能获得“红铜”的类别,如“其它金属”“钢”“铁”等。
 楼主| 发表于 2016-4-24 22:01:56 | 显示全部楼层 来自: 中国广东
高手不露面,自己顶一下,别沉了
 楼主| 发表于 2016-4-26 21:41:23 | 显示全部楼层 来自: 中国广东深圳
难道SOLIDWORKS API 不能实现这个功能?
发表于 2016-4-27 00:17:50 | 显示全部楼层 来自: 中国北京
你用下面代码试试  J3 V+ N" L2 E& P9 E& J) G. J( A
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant
6 U6 f$ q3 T6 {    Set swMatDB = New MSXML2.DOMDocument" T3 y4 B! W. N" @
'    材料库所存储的路径3 X8 a3 q5 {$ k0 @1 z1 \" E
    swMatDB.Load "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\chinese-simplified\sldmaterials\solidworks materials.sldmat"8 n2 u7 O: i1 N0 o6 S. B# t
' F- T) T+ l) Z# @; ^# r4 ?
    Set MatList = swMatDB.getElementsByTagName("material")
) R/ m# E% Q) T8 \    Dim MatName() As String, Mat As Variant
  d6 d# _+ V8 y. _    ReDim MatName(MatList.Length - 1)$ S. R4 ?  X5 R9 P0 C  p
    For Mat = 0 To MatList.Length - 1' U  _/ t) |7 i$ k

( C7 ~# ]' j% F. Q, j: T* N% l        MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue& o( j( d6 N! O, E) F5 a/ G4 j5 v
2 u) D  P! i* {
    Next Mat
/ x2 i* y0 Q3 \& ~
, H; a) X1 ?% ]5 S* I/ i& {
 楼主| 发表于 2016-4-28 22:33:37 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-27 00:17
3 l& }' v! k( k7 D- N0 m. Z你用下面代码试试$ p3 }8 D+ m( ~3 ~" k# A
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant
; @4 Y  v& B5 E2 Q; d9 Y    Set swMatDB = New MSXM ...

8 r1 x/ K4 J+ k; T6 ]高手啊!2 K8 R9 ?$ K% H6 ]# B* g% F7 @
  z, P! {& k! X, V/ E
我试试- V- {9 n( z. h( G8 v+ Z6 X+ A& e9 n

2 u9 T: g& c/ c% f9 S$ t8 V+ j9 \谢谢!
; d9 F/ Q7 T7 `$ y- Q! M$ U
 楼主| 发表于 2016-4-29 12:44:56 | 显示全部楼层 来自: 中国广东
lhl2008 发表于 2016-4-27 00:17
, b) G# k, E/ r  L0 o9 l你用下面代码试试
5 C' u2 m8 Y3 p% W; R# S( V! iDim swMatDB As MSXML2.DOMDocument, MatList As Variant! ?9 P, K) j. B: q: G
    Set swMatDB = New MSXM ...
! z( c. c8 S3 x+ ?( {% z) \
不好意思,您这段代码在solidworks的VBA环境中运行提示“用户定义的类型未定义”,请教是什么问题?如何解决?谢谢
发表于 2016-4-29 12:54:06 | 显示全部楼层 来自: 中国河北廊坊
本帖最后由 lhl2008 于 2016-4-29 12:59 编辑 % W7 z) L2 ?+ I! b
& h& x5 P  c5 N3 z9 o
在引用中加入 2016-04-29_12-54-12.jpg
) F" x$ g: N) J7 H
  X  t! l8 X. c' P材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
1 m: F- U' k7 e
 楼主| 发表于 2016-5-3 16:19:46 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-29 12:54
0 R6 q" N5 P+ i4 O3 q. t( a在引用中加入# A9 `/ h1 ], \  ~0 {" V

4 r' ]. n+ m3 r7 Q9 F8 [材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
8 W6 S9 N7 K/ B% ]
成功了,谢谢!1 Q" k# ]4 K) Y8 f3 v  u8 e
1 K1 p( D1 s0 }; N& `
但不明白下面这句:
5 @% k4 M* {; z4 x$ g+ \Set MatList = swMatDB.getElementsByTagName("material"),括号里的“material”为什么是"material"而不是其它?, C# k# G# U, b. l0 r
! X7 f5 m( U1 e% F6 {

! N5 c) T' Y) L下面是我编写的获取材料类别的全部代码:: v- \* _, T% b5 U/ i4 _
Sub main()- b: m1 U/ }/ i" a0 I7 J, @5 g
2 Y1 b* o- G& K8 @7 L; M0 i4 A
Dim swApp                       As SldWorks.SldWorks8 S3 J8 ?4 \. {/ y; Q7 S2 t
Dim swModel                   As SldWorks.ModelDoc28 {" G0 I- S+ ^8 V! F# @
Dim swPart                       As SldWorks.PartDoc7 r4 W( U2 n& n2 p
Dim dbs                             As Variant
/ q7 z- o1 \. c6 G6 B* F$ T7 x7 H0 g5 UDim sMatName                As String7 l4 Z9 t0 U7 o) E
Dim sMatDB                      As String
5 ^' a7 M8 w9 ^% uDim bRet                           As Boolean
1 r  C) [" a* d* wDim i                                   As Long; s, U; A# ?0 \3 W- E6 V
Dim matPath                    As String
; F% H, G/ Y: b0 \- GDim swMatDB                  As MSXML2.DOMDocument
4 G5 }6 S/ K& f" W, ]: f# QDim MatList                      As Variant- j+ z5 i5 W" v& \( `: O

* ]; P" D6 R, m5 ]3 @: v/ G4 |* gSet swApp = Application.SldWorks1 _* l, U( g( s9 z1 S# _& ?
Set swModel = swApp.ActiveDoc1 N; y+ w% b8 Z
Set swPart = swModel- w% B' L/ i: I1 b: l
dbs = swApp.GetMaterialDatabases
6 b! o! ^' W9 n: ]5 `sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)$ c' @+ W1 P8 f8 D3 O
For i = 0 To UBound(dbs)+ o  ~+ Y% @, M  e5 W; k3 [
      If StrComp(LCase(Left(Right(dbs(i), Len(sMatDB) + 7), Len(sMatDB))), LCase(sMatDB)) = 0 Then
% {/ V# b0 N+ O7 T3 K           matPath = dbs(i)
- J7 Q; \( W  G. m) R           GoTo MatTpye
$ l/ B% p6 T0 ]6 M  O      End If2 v, k+ r( `# q% [
Next i
& e7 ?+ ?8 N5 {* o2 n, T# e* n8 c- v2 ^) i- K1 @" Z$ z
MatTpye:
% M; L* u  ]+ D1 E; nSet swMatDB = New MSXML2.DOMDocument
9 x; q! C9 ^  Y1 @/ L ' 材料库所存储的路径
$ J6 i% s! X( _2 k% XswMatDB.Load matPath
1 q1 e& t* x0 Q# XSet MatList = swMatDB.getElementsByTagName("material")* Z2 N  v) E2 F( H0 s
Dim MatName() As String, Mat As Variant
& v7 R- Z, {, V& \ReDim MatName(MatList.Length - 1)
+ B4 N$ S, b5 i6 L. f      For Mat = 0 To MatList.Length - 1- N3 c4 {9 j' w# ?7 z# x
            If MatList.Item(Mat).Attributes.Item(0).childNodes.Item(0).nodeValue = sMatName Then
5 `! D% D$ v( |/ G6 y                 MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue) E: ~% t" d' i; N" V2 Y; O
                 GoTo Finish4 f$ D4 B# u% n: t* R
            End If
: Q/ y; S0 Q& J; l      Next Mat
2 V) r  @$ b# e7 A) f, w- R8 t, F4 I
Finish:) ^9 d9 ^$ y1 {$ B* r' _9 X* ~) j
End Sub
- v" m/ ]  j5 P5 m  Z) Z# l
2 M6 x" A5 I0 E* y0 X6 w1 U如有不对,请批评指正,谢谢!
发表于 2016-5-3 17:08:14 | 显示全部楼层 来自: 中国浙江嘉兴
kavenlee72 发表于 2016-5-3 16:19
; e) _( Y+ A4 A6 F5 j: Q$ ]& s成功了,谢谢!+ Z: ~+ U: M6 [, G9 V; E$ j

1 K9 M! ^# n6 O& [5 d但不明白下面这句:
9 b. y/ Q! F) `8 b( W' D
2012 測試ok,謝謝分享
# N$ H! u& J% i; z! e9 O
  G& f3 Z3 ^/ Y$ @! t! `6 m建議補加如下紅字,在 "即時運算" 欄顯示材料類別.
8 K4 t8 t, ?! @. c2 {; [6 k* Q0 T6 F* d9 L/ u

2 s$ x7 M2 p# e  M2 k" C& G    MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
' [% f; c/ E8 o* |4 J; V
8 y8 L& @1 {4 c5 `, ?1 q                 Debug.Print "材料類別: " & MatName(Mat)
- \" E1 @2 @, `. a" a$ A
: V' n  X6 B% M) T% H                 GoTo Finish
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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