pepper
新人さん
オフライン
投稿: 10
I'm a llama!
|
|
フィーチャーツリーの材料設定
« 投稿日: 2008/09/03 - 09:19:14 » |
|
いつもお世話になっております。
Excelで ・A1にパートファイル名 ・A2に材料名 が入力されているシートがあるときに
A1セルのパートファイルを開いて、 A2セルと同じ名前の材料がフィーチャーツリーの材料にあった場合、 フィーチャーツリーでその材料を設定するマクロを 作りたいと考えています。
ファイルを開くことはできましたが、 セルの文字列と登録されている材料を比較して設定する方法が わかりません。 どなたか分かる方がいらっしゃいましたらお知恵をお借し下さい。 よろしくお願いします。
|
|
|
|
hisa
カタマリの王様!?
オフライン
投稿: 507
PANDA-Z!!
|
|
Re:フィーチャーツリーの材料設定
« 返信 #1 投稿日: 2008/09/03 - 10:04:43 » |
|
お早う御座います、hisaです
材料取得及び設定は、
取得:MaterialName = PartDoc.GetMaterialPropertyName2 (ConfigName, Database)
設定:PartDoc.SetMaterialPropertyName2 (ConfigName, Database, MaterialName)
となります。
流れとしては、 1.GetMaterialPropertyName2でMaterialNameを取得 2.セルの材料名と比較 3.一致すれば、SetMaterialPropertyName2で設定 という具合かと思います。
上記のMaterialNameが材料名(例:炭素鋼(普通))です。 デフォルトのコンフィギュレーションの場合はConfigNameは空の文字列となります。 設定の場合のDataBaseは、デフォルトのSolidWorks材料(solidworks materials.sldmat)を 使用する場合、空の文字列でOKです。 そうでない場合は、材料データベースのフルパスを指定します。
詳しくはヘルプを参照してみて下さい
|
|
|
|
pepper
新人さん
オフライン
投稿: 10
I'm a llama!
|
|
Re:フィーチャーツリーの材料設定
« 返信 #2 投稿日: 2008/09/03 - 18:39:19 » |
|
hisa様
早速ご回答いただきありがとうございます。 ヘルプを参照して取り組んでみます。
|
|
|
|
pepper
新人さん
オフライン
投稿: 10
I'm a llama!
|
|
Re:フィーチャーツリーの材料設定
« 返信 #3 投稿日: 2008/10/01 - 21:40:06 » |
|
いつもお世話になっております。
先日、hisa様に材料取得及び設定の方法を教えていただきました。 その節はお世話になりました。
その後、ヘルプを参照しつつ取り組んで参りましたが、 フィーチャーツリー上の材料がうまく変わらずに悩んでおります。 どうにも解決策がわからないので、再度相談させていただければと思います。
症状は、サンプルのマクロを動かすと以下1〜4の状態になります。 そのため、そのまま上書き保存すると(そのようなマクロを加えると)、 材料は”材料<未指定>”で保存されます。 材料を変更して上書き保存するようにしたいのですが、どの様にすればよいのでしょうか。 不足の点等、ご指摘いただければ助かります。
---サンプルマクロ適用後の状態--- 1.フィーチャーツリーでは材料が変わっておらず、”材料<未指定>”となっている。 2.”材料<未指定>”を右クリックして”材料編集”を選ぶと設定したかった材料(SS400)になっている。 3.なにもせずに”キャンセル”するとフィーチャーツリーの材料が「SS400」に変わっている。 4.”キャンセル”ではなく”OK”としてもフィーチャーツリーの材料が「SS400」に変わっている。
以下のサンプルはSolidWorks上でマクロを記録してすぐ停止し、 記述を3行加えただけのものです。 Dim myPart As PartDoc Set myPart = Part myPart.SetMaterialPropertyName2 "default", "material.sldmat", "SS400"
---サンプル--- ----------------------------------------------------------- Dim swApp As Object Dim Part As Object Dim myPart As PartDoc
Dim SelMgr As Object Dim boolstatus As Boolean Dim longstatus As Long, longwarnings As Long Dim Feature As Object Sub main() Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc Set myPart = Part Set SelMgr = Part.SelectionManager swApp.ActiveDoc.ActiveView.FrameState = 1
myPart.SetMaterialPropertyName2 "default", "material.sldmat", "SS400"
End Sub -----------------------------------------------------------
よろしくお願いします。
|
|
|
|
pepper
新人さん
オフライン
投稿: 10
I'm a llama!
|
|
Re:フィーチャーツリーの材料設定
« 返信 #4 投稿日: 2008/10/01 - 21:56:39 » |
|
追加ですみません。
材料データベースについてですが、 SetMaterialPropertyName2で指定するDatabaseは システムオプションであらかじめパスを設定しておかなければいけないようなのですが、 このシステムオプションをマクロで設定することはできるのでしょうか。 たしかオプションはsendkeyの方法でないと操作できなかったと記憶しています。
設定:PartDoc.SetMaterialPropertyName2 (ConfigName, Database, MaterialName)
どなたかわかる方がいらっしゃればご教授いただきたくお願い申し上げます。
|
|
|
|
Makoron
カタマリの王様!?
オフライン
投稿: 1277
SW2011SP5.0
|
|
Re:フィーチャーツリーの材料設定
« 返信 #5 投稿日: 2008/10/02 - 09:11:07 » |
|
Makoronです。
少し調べてみました。 pepperさんのサンプルでテストすると同じ結果になりましたが、 myPart.SetMaterialPropertyName2 "default", "material.sldmat", "SS400" の "default" を "デフォルト"又は""(Null)にしてあげると、上手くいきました。
他のメソッドでも、コンフィギュレーションの値をNULLにすると、アクティブなコンフィギュレーションに対して行うと言うような動きをする物があります。
今回のpepperさんのマクロでも、"デフォルト"のようにコンフィギュレーション名を指定するより、NULLを指定した方が良いかもしれませんね。
もし、複数のコンフィギュレーションに対応したい場合であれば、先にコンフィギュレーション名を指定する処理を入れるといいと思います。
|
|
|
|
pepper
新人さん
オフライン
投稿: 10
I'm a llama!
|
|
Re:フィーチャーツリーの材料設定
« 返信 #6 投稿日: 2008/10/02 - 09:42:25 » |
|
Makaron様ありがとうございます。
おかげさまで材料変更できました! ありがとうございます。涙が出そうです。。。
冷静になって改めて読むと、 hisa様の返信にも同様のことが書いてありました。 申し訳ありません。 >デフォルトのコンフィギュレーションの場合はConfigNameは空の文字列となります。
ヘルプのExampleに"default"と記述されており、 その通りに記述してできなかったので、頭が凝り固まっていました。 本当にありがとうございます。
|
|
|
|
hisa
カタマリの王様!?
オフライン
投稿: 507
PANDA-Z!!
|
|
Re:フィーチャーツリーの材料設定
« 返信 #7 投稿日: 2008/10/02 - 12:01:54 » |
|
hisaです
じっくり読み返していたら、ミス回答が…
引用:A1セルのパートファイルを開いて、 A2セルと同じ名前の材料がフィーチャーツリーの材料にあった場合、 フィーチャーツリーでその材料を設定するマクロを 作りたいと考えています。 |
よく考えたら、材料データベース内でマッチした材料が見つかったら材料を設定するということですよね。
引用:1.GetMaterialPropertyName2でMaterialNameを取得 2.セルの材料名と比較 3.一致すれば、SetMaterialPropertyName2で設定 という具合かと思います。 |
1.でパートから材料名取得って…割り当てられていないのに比較してマッチしたら設定とか、 意味不明でしたね
解決しているかもしれませんが、材料データベースの材料名取得に関して以下に示します。
Sub main()
Dim swApp As SldWorks.SldWorks Dim swMtrlDBPath As Variant Dim xDoc As New DOMDocument Dim xElmnt As IXMLDOMElement Dim xNode As IXMLDOMNodeList Dim xChldnode As IXMLDOMNodeList Dim xAttribute As IXMLDOMAttribute Dim node As IXMLDOMNode Dim i, j As Integer Set swApp = Application.SldWorks swMtrlDBPath = swApp.GetMaterialDatabases
'sldmat(XML)読み込み xDoc.async = False xDoc.Load (swMtrlDBPath(0)) '例としてデータベースの1番目(Index0)を読み込み '要素取り出し Set xElmnt = xDoc.documentElement
'トップノード取り出し Set xNode = xElmnt.childNodes
'子のノード巡回 For i = 0 To xNode.Length - 1 Set xChldnode = xNode.Item(i).childNodes Debug.Print xNode.Item(i).Attributes(0).Text For j = 0 To xChldnode.Length - 1 Set node = xChldnode.Item(j) If node.nodeName = "material" Then Set xAttribute = node.Attributes(0) '材料名は1番目の属性なのでIndex0指定 Debug.Print " " & node.nodeName & " = " & xAttribute.Value 'Valueの値を比較対象とすれば良い End If Next j Next i End Sub
材料データベースはXML形式で書かれているので、XMLとして読み込んで値を取り出します。 (結果はDebug.printで出力しています) xAttribute.Valueの値を、Excelのセルと比較すればpepperさんのやりたいことは出来るのではと思います
<注意> XML関連のオブジェクトを扱うには、参照設定で"Microsoft XML, vX.X"を参照する必要があります。
ご参考まで。
<12:22 追記>
引用:デフォルトのコンフィギュレーションの場合はConfigNameは空の文字列となります。 |
実はこれもミス回答… 厳密には、Makoronさんの仰るとおりアクティブなコンフィギュレーションです
更に更に、
引用:システムオプションをマクロで設定することはできるのでしょうか。 |
については、 SldWorks.SetUserPreference〜Value (〜は、設定する値によってそれぞれ)で設定できます。 材料データベースのパス設定を例に挙げれば、 SldWorks.SetUserPreferenceStringValue swFileLocationsMaterialDatabases, DataBase名 となります。
|
|
|
|
pepper
新人さん
オフライン
投稿: 10
I'm a llama!
|
|
Re:フィーチャーツリーの材料設定
« 返信 #8 投稿日: 2008/10/02 - 21:32:51 » |
|
hisa様ありがとうございます。
XMLの読み込みは高度ですね。勉強します。 私は単純にExcelシートにXMLを読み込んで 文字列を比較していました。
また、システムオプションの設定についても 現在のデータベース名を取得して 指定のデータベースがなかったら、 設定するようにしたいと考えています。
ありがとうございました。
|
|
|
|