QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 goto3d 于 2016-6-12 14:23 编辑
& o: ^; M( ~' s" f
. y5 h3 N' x* S; K( @8 U  t/ jsolidworks2012的材料库里,材料都分了类,如“钢、铁、塑料、橡胶”等等,如何用VBA编写宏来获取材料的这些类型呢?4 m+ v( @! H# J; p; I+ C; r
无标题.png 6 ^3 j8 B6 q9 K* S3 @
; G" e1 B  I5 F  }. E, F( h
请各位大神赐教,谢谢!/ I4 g/ m) I; j) ^4 ^4 C
发表于 2016-4-19 22:55:44 | 显示全部楼层 来自: 中国香港
MaterialIdName
 楼主| 发表于 2016-4-20 20:44:50 | 显示全部楼层 来自: 中国广东
大鹿 发表于 2016-4-19 22:55
. D/ @  s6 o& D4 eMaterialIdName

/ W* f7 P2 v8 F/ j$ v6 G能说详细点么?最好能给我举个例子!谢谢
发表于 2016-4-21 08:42:40 | 显示全部楼层 来自: 中国浙江嘉兴
* L6 w9 f1 K- y0 ^. |1 L
參考# Y- u% W2 `6 c1 E8 C8 L0 }( X
4 _1 k3 M) ]: U# s' B  T7 _+ V
  1. Sub main()
    5 k( _2 u9 n) V6 T4 y" ^

  2. ) [7 u. B, h$ g/ _0 C& w2 K9 P
  3.     Dim swApp                       As SldWorks.SldWorks
    / R, K7 ^) e5 F/ {5 m$ n
  4.     Dim swModel                     As SldWorks.ModelDoc2
    ; I6 h5 e  x. Q9 s
  5.     Dim swPart                      As SldWorks.PartDoc
      S. I6 o6 U5 m: @
  6.     Dim sMatName                    As String( i6 `8 H& ]4 v& _* D
  7.     Dim sMatDB                      As String
      e& z% b# t, F/ i
  8.     Dim bRet                        As Boolean
    : u( {; m* i& M) s' k' W
  9.     $ s2 V2 J3 Z5 ?7 H' ~4 G  O
  10.     Set swApp = Application.SldWorks$ w2 f" b- t, V8 C9 m2 r- J. i
  11.     Set swModel = swApp.ActiveDoc
      e  k5 V2 E% ?0 |4 r
  12.     Set swPart = swModel, g8 e# i% n, z5 D* r) T
  13.     sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)
    " C- _; Y/ Y' R0 D: G1 U
  14.     Debug.Print "File = " & swModel.GetPathName0 @2 y$ E4 k  {- y5 d9 W
  15.     Debug.Print "  Material = " & sMatName & " (" & sMatDB & ")"
    8 j' \8 x0 z9 P; O* L& z
  16. 3 m* G& N. W5 |4 P2 |9 ~1 t4 C! L
  17. End Sub
复制代码
2.png
 楼主| 发表于 2016-4-22 18:18:48 | 显示全部楼层 来自: 中国广东深圳
本帖最后由 kavenlee72 于 2016-4-22 18:19 编辑
' m7 Z9 A( l) b
ryouss 发表于 2016-4-21 08:42) a; a/ a& L" D/ @+ C# Y) l
參考
) N8 g: j. c6 C8 u- A
GetMaterialPropertyName2获得的是材料的名称,如“红铜”,我是希望能获得“红铜”的类别,如“其它金属”“钢”“铁”等。
 楼主| 发表于 2016-4-24 22:01:56 | 显示全部楼层 来自: 中国广东
高手不露面,自己顶一下,别沉了
 楼主| 发表于 2016-4-26 21:41:23 | 显示全部楼层 来自: 中国广东深圳
难道SOLIDWORKS API 不能实现这个功能?
发表于 2016-4-27 00:17:50 | 显示全部楼层 来自: 中国北京
你用下面代码试试
' M9 g! ?3 I( L; @/ W5 Q7 [Dim swMatDB As MSXML2.DOMDocument, MatList As Variant
1 Z  f/ B1 Z8 k- U( L9 W- _    Set swMatDB = New MSXML2.DOMDocument
% a6 b$ b5 z; U+ Y5 l5 M'    材料库所存储的路径
7 }/ N; T7 V- k7 c0 P" g& ~+ ]) m    swMatDB.Load "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\chinese-simplified\sldmaterials\solidworks materials.sldmat"
- v" X3 c& i+ K! \4 E" V" W
1 H& J6 _5 ~+ C2 J; m7 [$ [    Set MatList = swMatDB.getElementsByTagName("material")4 ]/ @& p1 e0 q+ t7 r
    Dim MatName() As String, Mat As Variant
* d$ S8 B  h' _7 [, r: o! C+ C5 X    ReDim MatName(MatList.Length - 1)8 Z6 E+ f6 k3 |8 X! A0 r
    For Mat = 0 To MatList.Length - 18 E! B, Y6 m- K1 e
  M3 E" u2 W/ p9 A5 K
        MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue" C6 D! `) z9 d) @
  Z; |$ s0 y' u# o8 ^' V0 C
    Next Mat6 X4 n! M7 q- g

1 u* W5 Z7 W# M  B) H0 j
 楼主| 发表于 2016-4-28 22:33:37 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-27 00:17* Y+ k/ L( E2 G# s6 \
你用下面代码试试2 F9 _9 ?/ ?& A  T6 z$ G. Q% W' j
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant/ R8 r0 k& J6 ^# a5 u5 r9 v
    Set swMatDB = New MSXM ...

1 Y2 O, `& y  g高手啊!9 y; x+ U" W' r2 S, T; \. N; W

! O# I! B( G; f5 M+ [$ G- G0 \我试试
( J4 `0 A* y2 G, o" G9 B0 J* h- L& b/ a, G9 l$ L
谢谢!% e: E* W+ U$ w) J% M. Y6 E
 楼主| 发表于 2016-4-29 12:44:56 | 显示全部楼层 来自: 中国广东
lhl2008 发表于 2016-4-27 00:172 g, v) p% m  t$ X* U% f6 X: [* Y
你用下面代码试试9 T, J  E$ j8 Y8 C7 O2 E" [9 K
Dim swMatDB As MSXML2.DOMDocument, MatList As Variant! k; C$ l2 S$ q# n
    Set swMatDB = New MSXM ...

( ]( F: Z, E" G4 b8 M不好意思,您这段代码在solidworks的VBA环境中运行提示“用户定义的类型未定义”,请教是什么问题?如何解决?谢谢
发表于 2016-4-29 12:54:06 | 显示全部楼层 来自: 中国河北廊坊
本帖最后由 lhl2008 于 2016-4-29 12:59 编辑 $ p6 R! L+ n# H0 h# m! `5 m
6 X4 c; H+ Y! y' J; J
在引用中加入 2016-04-29_12-54-12.jpg
% k3 n2 i* S9 ]6 ?) g- j9 y! v& E$ g' ]4 U) A0 l3 U
材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
5 ?* a5 |( w/ W
 楼主| 发表于 2016-5-3 16:19:46 | 显示全部楼层 来自: 中国广东深圳
lhl2008 发表于 2016-4-29 12:542 _7 M' a, Y  l2 W
在引用中加入9 T: N( Q& {& q* H: n& s

+ G* S" `' m5 ^% P: G  q材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
! R: H9 j; u, n8 \8 I
成功了,谢谢!
  P% R8 z4 h6 r6 ?" t8 x* [7 D
9 {; K; c$ k0 c1 Y4 y但不明白下面这句:
- `- s/ c& U6 G: }Set MatList = swMatDB.getElementsByTagName("material"),括号里的“material”为什么是"material"而不是其它?# J  O2 j  g  d: K* e
" u: _1 s9 i7 G4 ^

1 Q% l5 M  u7 Z9 Q) `2 l下面是我编写的获取材料类别的全部代码:
0 w! E3 u. I% @4 RSub main()  h0 L; I6 f$ j0 o7 ~

# W: d. |0 D7 b) l) K2 qDim swApp                       As SldWorks.SldWorks! \  z+ k2 O+ {# K( q, @* a
Dim swModel                   As SldWorks.ModelDoc27 v2 S: {; C, ?6 O& |
Dim swPart                       As SldWorks.PartDoc
) j- p) R  r) B+ i4 @6 a: y3 cDim dbs                             As Variant! h+ v% [, I5 S4 Y6 c0 |
Dim sMatName                As String
4 s" }8 ]) z* p8 }  MDim sMatDB                      As String
% M" U6 F' C* d6 [Dim bRet                           As Boolean( j$ c& }. e" m6 a/ N
Dim i                                   As Long  s( [: R6 O4 f( t; l' {$ H: _. S
Dim matPath                    As String
& ^) r# K7 C$ s+ B4 k" L' VDim swMatDB                  As MSXML2.DOMDocument
' v9 g7 _0 z! R$ wDim MatList                      As Variant
+ f9 j0 W7 U: T
7 |$ D) ?4 }5 dSet swApp = Application.SldWorks3 Z$ k! c& ^  X% o5 p- R0 g
Set swModel = swApp.ActiveDoc
/ _: b( n+ _- z6 A9 \4 HSet swPart = swModel1 x( l$ y% U- f+ w3 ?3 U
dbs = swApp.GetMaterialDatabases
* W' y! ]4 x$ O+ \, |sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)* d4 S$ ~) M( y) Y6 P9 {3 x
For i = 0 To UBound(dbs)% M* Z$ ?1 ^; n7 \3 k
      If StrComp(LCase(Left(Right(dbs(i), Len(sMatDB) + 7), Len(sMatDB))), LCase(sMatDB)) = 0 Then
8 ~0 S0 Q5 r. H2 a           matPath = dbs(i)& E' k" X3 v0 Q8 h
           GoTo MatTpye
+ u: `/ d" h; a3 l0 C      End If9 i# S( `* x+ h3 E: E1 D
Next i' u1 K1 N# F: @% u- ?2 ?. Z# r

9 [0 y) a$ k9 i* r& Z# E( jMatTpye:1 F* j3 D6 ^: ]( u% l1 W
Set swMatDB = New MSXML2.DOMDocument. H8 {! G' Y) p
' 材料库所存储的路径
' w# p9 {8 p1 m% v. lswMatDB.Load matPath) X2 f6 E, x- L; c, V+ B
Set MatList = swMatDB.getElementsByTagName("material")1 W( j$ \1 d# E* F7 b- X
Dim MatName() As String, Mat As Variant
/ r# S& w- v/ F7 jReDim MatName(MatList.Length - 1). S! i8 b& b, i  h! d4 u' v, @
      For Mat = 0 To MatList.Length - 1
( C' S$ ]: n( [* L' M5 }. ]. y            If MatList.Item(Mat).Attributes.Item(0).childNodes.Item(0).nodeValue = sMatName Then
  Y, @; s! R, ~- C5 y0 p  M                 MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue: {- m* g5 B6 I. S6 J
                 GoTo Finish6 H- {5 m% j$ S& N9 q. z, X
            End If3 e  W1 O( u& ?, F- L: O
      Next Mat
( ]/ q4 ?- C0 v& M9 N
3 @" n5 H5 d6 }! ?, A& [* }: iFinish:
" r# Z7 q! h8 T) w) h4 jEnd Sub
0 j7 a" X# a5 W( R& t
3 @$ H' e  u" Z: N8 S7 u. ?) W' D如有不对,请批评指正,谢谢!
发表于 2016-5-3 17:08:14 | 显示全部楼层 来自: 中国浙江嘉兴
kavenlee72 发表于 2016-5-3 16:193 \0 b0 ?- \8 [, j
成功了,谢谢!& s: u1 |! X4 B

+ R7 l3 R! c' h& z但不明白下面这句:
+ @! ~- N8 k( g/ U: Q; `
2012 測試ok,謝謝分享
& n; Q9 f# k1 g" b* Q: Q+ r( c( H9 g
建議補加如下紅字,在 "即時運算" 欄顯示材料類別.
. p2 k0 F2 H6 K# V
0 B2 W9 i' k# [# N  T3 T1 j) `- _
' p, ]7 x9 V2 z* t& j    MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue
5 J. s0 O7 C9 L* r
# _, g$ c6 t% o' G+ v3 q9 o                 Debug.Print "材料類別: " & MatName(Mat)- J# \% }2 D) Q1 ]$ X1 V

' N8 F; L4 d8 J/ h! N- A; F                 GoTo Finish
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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