QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
goto3d 说: 版主微信号:caivin811031;还未入三维微信群的小伙伴,速度加
2022-07-04
全站
goto3d 说: 此次SW竞赛获奖名单公布如下,抱歉晚了,版主最近太忙:一等奖:塔山817;二等奖:a9041、飞鱼;三等奖:wx_dfA5IKla、xwj960414、bzlgl、hklecon;请以上各位和版主联系,领取奖金!!!
2022-03-11
查看: 3169|回复: 13
收起左侧

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

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

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

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

x
本帖最后由 goto3d 于 2016-6-12 14:23 编辑
/ m' r2 w- J% }2 o
% a9 G8 U& E+ D- Lsolidworks2012的材料库里,材料都分了类,如“钢、铁、塑料、橡胶”等等,如何用VBA编写宏来获取材料的这些类型呢?
4 G4 e& R" @, d. X+ ]0 Y' _ 无标题.png
. g9 `( o7 R3 l5 A! V0 b& a6 P# _: ^, Z/ t) Z
请各位大神赐教,谢谢!
8 Q; f2 Z. |6 D& ~" M% c
发表于 2016-4-19 22:55:44 | 显示全部楼层
MaterialIdName
 楼主| 发表于 2016-4-20 20:44:50 | 显示全部楼层
大鹿 发表于 2016-4-19 22:55- @( h; }, \3 l! T! g
MaterialIdName
1 j6 y8 G2 b, Y
能说详细点么?最好能给我举个例子!谢谢
发表于 2016-4-21 08:42:40 | 显示全部楼层
1 w6 s$ F- h: [6 M
參考
7 N' A- t3 e5 y2 i0 Q, Q
1 r5 ?& n( ?  b$ v# o" C3 ]
  1. Sub main()" z' [; a; V; k. c0 K

  2. . P8 B! _" o! m5 Z
  3.     Dim swApp                       As SldWorks.SldWorks1 Z7 J& {( R( u3 H
  4.     Dim swModel                     As SldWorks.ModelDoc2- N4 E; R9 \; y9 v: U
  5.     Dim swPart                      As SldWorks.PartDoc
    9 p7 K% c9 \$ u5 k( W1 Z
  6.     Dim sMatName                    As String
    5 d6 m4 Z$ [# y
  7.     Dim sMatDB                      As String: s6 H+ q0 D, U4 o$ T8 c+ ?
  8.     Dim bRet                        As Boolean
    2 `, _& o' {3 l' J' e
  9.     2 r+ q* _9 s7 w. u
  10.     Set swApp = Application.SldWorks
    ; B, T. D1 @! O' F: H+ ~
  11.     Set swModel = swApp.ActiveDoc
    ) n3 Q6 I# u. S/ |/ [5 T4 W
  12.     Set swPart = swModel# I3 `' e2 G6 C% S* w
  13.     sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)) f  w1 K) E* U# U; }
  14.     Debug.Print "File = " & swModel.GetPathName, f. h; C* a) M9 q7 g
  15.     Debug.Print "  Material = " & sMatName & " (" & sMatDB & ")". a$ l. v0 y2 g$ M1 G$ ~
  16. ! G* s3 r0 {2 ?% M" Y0 [6 g4 T5 ~
  17. End Sub
复制代码
2.png
 楼主| 发表于 2016-4-22 18:18:48 | 显示全部楼层
本帖最后由 kavenlee72 于 2016-4-22 18:19 编辑 6 z* o3 C# g2 H# s& {) y
ryouss 发表于 2016-4-21 08:42( R/ r7 Y, m: i1 O$ r6 A  v
參考

5 y  i3 ?3 }! \GetMaterialPropertyName2获得的是材料的名称,如“红铜”,我是希望能获得“红铜”的类别,如“其它金属”“钢”“铁”等。
 楼主| 发表于 2016-4-24 22:01:56 | 显示全部楼层
高手不露面,自己顶一下,别沉了
 楼主| 发表于 2016-4-26 21:41:23 | 显示全部楼层
难道SOLIDWORKS API 不能实现这个功能?
发表于 2016-4-27 00:17:50 | 显示全部楼层
你用下面代码试试
& T% ^" U3 _4 K) T/ {, U# [, hDim swMatDB As MSXML2.DOMDocument, MatList As Variant
+ \; j6 ~$ ~4 G7 d+ G7 W    Set swMatDB = New MSXML2.DOMDocument
5 g3 l9 t5 c6 E/ R6 f'    材料库所存储的路径7 x* k( _3 S8 K- A/ e
    swMatDB.Load "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\chinese-simplified\sldmaterials\solidworks materials.sldmat"
7 g. n# Z) ]0 z! v+ z: S$ o# g* K8 M+ z
    Set MatList = swMatDB.getElementsByTagName("material")! G" B$ O& I. _
    Dim MatName() As String, Mat As Variant
- C8 j2 E+ G8 }$ j: ~: n( Z    ReDim MatName(MatList.Length - 1)
) q) |0 \6 @  I# p8 i    For Mat = 0 To MatList.Length - 1  v' q1 k, g, l1 w; ?) @/ ]% V8 Z" o

; s+ ^. k7 i5 }. {8 U5 N3 J        MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue; [. A. O* s- u: z
2 |7 T  X0 h9 O3 Y/ L0 `4 k
    Next Mat
* }! l+ a, s% H/ Y+ }8 _6 D0 w- i: U/ z
 楼主| 发表于 2016-4-28 22:33:37 | 显示全部楼层
lhl2008 发表于 2016-4-27 00:17$ {8 Q: B3 q3 ]) Z  f
你用下面代码试试
( V: X/ a# x- }& {Dim swMatDB As MSXML2.DOMDocument, MatList As Variant
0 A  ?, _, E1 b/ ]    Set swMatDB = New MSXM ...

, }% z8 X! x. N1 }) j1 q5 D高手啊!
' ~( C$ J) b& @9 h4 s$ K
, S  ]& q, K& Y. r我试试0 J0 `6 l. r' o: A4 W* ]5 D
! }! [& g; _2 }: w* Y! w
谢谢!2 w" N4 q% W$ S7 I6 l- ~
 楼主| 发表于 2016-4-29 12:44:56 | 显示全部楼层
lhl2008 发表于 2016-4-27 00:179 H1 B$ L3 \8 b. O
你用下面代码试试
* S9 x6 C8 E- E# y, P& m. jDim swMatDB As MSXML2.DOMDocument, MatList As Variant
% A* a3 r( J5 o$ J" f    Set swMatDB = New MSXM ...
9 L5 N1 ^# I9 z( a5 D3 Z& }- U! b+ a
不好意思,您这段代码在solidworks的VBA环境中运行提示“用户定义的类型未定义”,请教是什么问题?如何解决?谢谢
发表于 2016-4-29 12:54:06 | 显示全部楼层
本帖最后由 lhl2008 于 2016-4-29 12:59 编辑 , a4 t9 Q- l$ u  H& c
/ V9 L! k+ w$ p' [* y3 {
在引用中加入 2016-04-29_12-54-12.jpg 0 e" x+ u' T* x1 K! c- V  r3 F

" h; C. Y. f/ j( b5 Q" K! W7 Y材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。$ g/ _/ a  |, q+ w
 楼主| 发表于 2016-5-3 16:19:46 | 显示全部楼层
lhl2008 发表于 2016-4-29 12:54
& v" F. O+ V$ |" u, ]. H0 b在引用中加入" q$ v0 t  N7 x4 F+ t" ]0 ^

3 Q3 h. d7 W# ]9 J: J6 V1 o材料库文件是一种XML文件,需要引入Micosoft XML类型库来操作。
1 W+ [) T4 U3 {% g" o
成功了,谢谢!
- k/ ~% ^. Z' X( Z. \0 _$ p: ^9 e( }7 ]0 c/ D/ b: k
但不明白下面这句:  l1 a8 u- E/ u4 v5 X! Z: r
Set MatList = swMatDB.getElementsByTagName("material"),括号里的“material”为什么是"material"而不是其它?( x5 i( L8 B0 D

$ |4 U- s* e4 w1 ]) Q. R  ?3 ~& a" o  D. }! N
下面是我编写的获取材料类别的全部代码:
- w  r. s' Q4 v9 c/ q! PSub main()3 ?2 C8 h6 a. b( P# R8 X

. E& j/ Y2 Q2 z1 ^  ODim swApp                       As SldWorks.SldWorks
2 s0 ~* M& g- o9 nDim swModel                   As SldWorks.ModelDoc26 U0 N, K: U9 Q! N: R
Dim swPart                       As SldWorks.PartDoc
! D0 x& g' ]7 ?8 I8 W1 b: O+ ]; pDim dbs                             As Variant+ n+ Z! X8 H9 }  E7 p0 `: h, R. ^  b2 w
Dim sMatName                As String/ T' H9 `& R- X
Dim sMatDB                      As String
2 r: X$ M1 U( ]/ l$ `Dim bRet                           As Boolean
7 T* t6 ^1 G$ e2 Y( LDim i                                   As Long* l7 o( P8 I* f* f$ z
Dim matPath                    As String
2 r4 x( |9 @* l" x" Y+ |* _, F' tDim swMatDB                  As MSXML2.DOMDocument. V+ A+ ~, X; C5 ^
Dim MatList                      As Variant
2 H, e) O- \4 [# ^! R
( r* p0 M3 v% i; b. ^6 R0 |. C- }  pSet swApp = Application.SldWorks0 S6 G! |8 F, ]% [. ?
Set swModel = swApp.ActiveDoc
! n# L/ d. y$ \9 Q& YSet swPart = swModel' \' a+ o, w; H6 V
dbs = swApp.GetMaterialDatabases6 A- A3 o% _$ _  q1 [* d- S* {
sMatName = swPart.GetMaterialPropertyName2("Default", sMatDB)
: g9 O& k% b' m; h( S! \For i = 0 To UBound(dbs)3 H% u& D: U. x3 F2 @1 ~7 n
      If StrComp(LCase(Left(Right(dbs(i), Len(sMatDB) + 7), Len(sMatDB))), LCase(sMatDB)) = 0 Then
$ Z8 G8 Z: S0 Z' z+ N4 A. Y8 |           matPath = dbs(i)
& Z( D; q% y$ v, r           GoTo MatTpye7 D; E2 @3 U% B# a7 a' p% M8 `
      End If- R* b: q$ I5 a3 t
Next i
- D: C1 U( [% W" G! b2 v" {9 L6 L+ m1 a4 S$ N  \: c# U
MatTpye:3 G# z  U% ?/ J% v; h
Set swMatDB = New MSXML2.DOMDocument
! C% t' H* `. y ' 材料库所存储的路径4 ^3 {6 c- y" B4 H, [: j0 `
swMatDB.Load matPath+ M2 i: B! k* l* w& \" \) Y' S
Set MatList = swMatDB.getElementsByTagName("material")
2 d/ [8 {) U# x4 e0 iDim MatName() As String, Mat As Variant
- c0 I+ }; z8 W2 K3 ^ReDim MatName(MatList.Length - 1)
( t% ]7 {( I7 I  z      For Mat = 0 To MatList.Length - 1$ x, Q' b# n. x5 q9 v! P$ N
            If MatList.Item(Mat).Attributes.Item(0).childNodes.Item(0).nodeValue = sMatName Then
1 t; ^/ B* {4 j7 {* [9 ?                 MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue4 O) m. A, S7 R9 b; u- X) j
                 GoTo Finish
6 l5 c' ]) h( r% ]            End If% M; H/ ]+ R  d0 N  H
      Next Mat2 v1 i- B+ I, q
1 e- p3 m& |4 V7 x/ u: w% S
Finish:- R, i! L6 @0 _1 J+ P
End Sub
+ E7 i+ N3 L2 Z& W# p7 G$ O8 ^. B
  \$ P( }" s3 U* y. h- M: w如有不对,请批评指正,谢谢!
发表于 2016-5-3 17:08:14 | 显示全部楼层
kavenlee72 发表于 2016-5-3 16:19
$ K: @" }+ e) j% V成功了,谢谢!
. V7 t; {/ D0 M5 c4 q" y
, c2 {0 [- I9 I- B& E) V8 a但不明白下面这句:
4 F( z1 e9 {7 t: {
2012 測試ok,謝謝分享
4 o" @$ g. I1 ~# p/ h6 E3 ]0 v) }8 f  p0 L; K
建議補加如下紅字,在 "即時運算" 欄顯示材料類別.
- a7 S7 F: k0 V1 M' w6 B" N' b/ W; K/ F+ V+ M
. W! k$ M1 E  S$ s' L5 ^  U8 U' H
    MatName(Mat) = MatList.Item(Mat).parentNode.Attributes.Item(0).nodeValue8 V7 H% b3 s) g0 U: o

" `' X* ], U. ?                 Debug.Print "材料類別: " & MatName(Mat)$ G) {' M1 A$ o/ {1 f9 J

, ?; e. h/ K; U% K                 GoTo Finish
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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