jc-a
Jr. メンバー
オフライン
投稿: 16
I'm a llama!
|
|
SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態
« 投稿日: 2007/04/24 - 18:31:58 » |
|
初めて投稿いたします。
SolidWorks上にAssemblyファイルを開かずに、Configuration別に下位に付く部品の表示・非表示状態を取得する方法はありますでしょうか?
SolidWorksのAPIを使うとSolidWorks上にターゲットのファイルがオープンされてしまいます。
SolidWorks Document Manager API (SwDocumentMgr.dll) を使用すれば、CADファイルを開かずして、パーツの表示・非表示状態を取得できるのではないかと考え、HELPファイルを見ながら試行錯誤しておりますが、一向に解決できません。
Configuration:conf-α Assembly1.sldasm ├PartA.sldprt <表示> ├PartB.sldprt <非表示> └Assembly2.sldasm <表示> ├PartC.sldprt <表示> └PartD.sldprt <非表示>
Configuration:conf-β Assembly1.sldasm ├PartA.sldprt <非表示> ├PartB.sldprt <表示> └Assembly2.sldasm <表示> ├PartC.sldprt <非表示> └PartD.sldprt <表示>
上記のような構成のアセンブリにぶら下がる部品をConfiguration別に表示状態を取得
SolidWorksのAPIでは以下のようなコード(VB.NET 2003)で試してみました。 Sub main()
Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swConf As SldWorks.configuration Dim swRootComp As SldWorks.Component2 Dim bRet As Boolean Dim fullFilePath As String = "c:\temp\Assembly1.sldasm"
swApp = New SldWorks.SldWorks swModel = swApp.OpenDoc6(fullFilePath, nDocType, swOpenDocOptions_Silent, "", nErrors, nWarnings) swConf = swModel.GetActiveConfiguration swRootComp = swConf.GetRootComponent
OutputCompXform(swRootComp, 0)
End Sub
Sub OutputCompXform(swComp As SldWorks.Component2,nLevel As Long)
Dim vChild As Object Dim swChildComp As SldWorks.Component2 Dim sPadStr As String Dim swCompXform As SldWorks.MathTransform Dim vXform As Variant Dim i As Long
For i = 0 To nLevel sPadStr = sPadStr & " " Next i
swCompXform = swComp.Transform2
If Not swCompXform Is Nothing Then vXform = swCompXform.ArrayData
Debug.Print sPadStr & "Component = " & swComp.Name2 & " (" & swComp.ReferencedConfiguration & ")" Debug.Print sPadStr & " Suppr = " & swComp.IsSuppressed Debug.Print sPadStr & " Hidden = " & swComp.IsHidden(False)
End If
vChild = swComp.GetChildren
For i = 0 To UBound(vChild) swChildComp = vChild(i) OutputCompXform swChildComp, nLevel + 1 Next i
End Sub
上記のような処理を「SolidWorks Document Manager API」を使用して取得するにはどうすればよいのでしょうか? ご教授お願いいたします。
|
|
|
|
hisa
カタマリの王様!?
オフライン
投稿: 507
PANDA-Z!!
|
|
Re:SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態
« 返信 #1 投稿日: 2007/04/25 - 11:58:46 » |
|
こんにちは
↓の環境で試してみました。ウマく動いたので載せます SolidWorks2006 SP5.0 開発環境:VBA Macro
Option Explicit
Sub main()
Const swFileName As String = "C:\Assem1.SLDASM"
Dim Classfac As SwDMClassFactory Dim swDocMgr As SwDMApplication Dim swDoc As SwDocumentMgr.SwDMDocument Dim swCfgMgr As SwDocumentMgr.SwDMConfigurationMgr Dim vCfgNameArr As Variant Dim vCfgName As Variant Dim swConfig As SwDocumentMgr.SwDMConfiguration2 Dim nDocType As Long Dim nRetVal As Long
Set Classfac = CreateObject("SwDocumentMgr.SwDMClassFactory") Set swDocMgr = Classfac.GetApplication("")
If Not InStr(LCase(swFileName), "sldasm") > 0 Then Exit Sub End If nDocType = swDmDocumentAssembly Set swDoc = swDocMgr.GetDocument(swFileName, nDocType, False, nRetVal): Debug.Assert swDmDocumentOpenErrorNone = nRetVal Set swCfgMgr = swDoc.ConfigurationManager
vCfgNameArr = swCfgMgr.GetConfigurationNames For Each vCfgName In vCfgNameArr
Set swConfig = swCfgMgr.GetConfigurationByName(vCfgName) Debug.Print " " & vCfgName swCompStatus swConfig Next
End Sub
Private Sub swCompStatus(ByVal nConfig As SwDocumentMgr.SwDMConfiguration2)
Dim vCompArr As Variant Dim vComp As SwDocumentMgr.SwDMComponent Dim i As Long vCompArr = nConfig.GetComponents For i = 0 To UBound(vCompArr) Set vComp = vCompArr(i)
Debug.Print vComp.Name If vComp.IsHidden Then Debug.Print "非表示" Else Debug.Print "表示" End If If vComp.IsSuppressed Then Debug.Print "抑制" Else Debug.Print "抑制解除" End If Next i
End Sub
jc-aさんのコードにTransformがありますが、そこは省略しています。 SwDMComponent.Transform メソッドをswCompStatus内に記述して 動作することは確認したので出来ると思います。
以上、ご参考までに。
追記:[ツール]→[参照設定]swDocumentMgr 200X Type libraryのチェックをお忘れなく。
|
|
|
|
jc-a
Jr. メンバー
オフライン
投稿: 16
I'm a llama!
|
|
Re:SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態
« 返信 #2 投稿日: 2007/04/25 - 13:17:15 » |
|
hisaさん 早速の返信ありがとうございます。
こちらの環境で試したところほぼ表示・非表示について取得できることが確認できました。
ただ、私の書いたコードの Sub OutputCompXform(swComp As SldWorks.Component2,nLevel As Long)
メソッドの下のほうに記述いたしました、
vChild = swComp.GetChildren
For i = 0 To UBound(vChild) swChildComp = vChild(i) OutputCompXform swChildComp, nLevel + 1 Next i
の部分で、カレントComponent2オブジェクトの更に子情報を取得する部分も実現したく、.GetChildren プロパティと同等のことができないでしょうか?
.GetChildrenのオブジェクトを自分自身のOutputCompXformメソッドに渡し再起呼び出しすることで、SolidWorksAPIでは以下(取得結果[SolidWorksAPI]) の構成を全て取得できていますが、Document Manager API では.GetChildrenと同等の機能を提供するプロパティが用意されていないようなので、やはり取得できる範囲は取得結果[Document Manager API ]に示すとおり、1階層だけになってしまうんでしょうか?
取得結果[SolidWorksAPI] Configuration:conf-α Assembly1.sldasm ├PartA.sldprt <表示> ├PartB.sldprt <非表示> └Assembly2.sldasm <表示> ├PartC.sldprt <表示> └PartD.sldprt <非表示>
Configuration:conf-β Assembly1.sldasm ├PartA.sldprt <非表示> ├PartB.sldprt <表示> └Assembly2.sldasm <表示> ├PartC.sldprt <非表示> └PartD.sldprt <表示>
取得結果[Document Manager API ] Configuration:conf-α Assembly1.sldasm ├PartA.sldprt <表示> ├PartB.sldprt <非表示> └Assembly2.sldasm <表示>
Configuration:conf-β Assembly1.sldasm ├PartA.sldprt <非表示> ├PartB.sldprt <表示> └Assembly2.sldasm
子情報までの情報を取得しようとした場合、Assembly1に対して、処理を実行した後にその子供であるAssembly2に対してswCompStatusを実行しようとした場合、Assembly2自体に設定されているConfigurationに対しての表示・非表示情報の取得となってしまうため、この方法はNGだと思われます。
何か良い方法がありましたらご教授ください。
|
|
|
|
hisa
カタマリの王様!?
オフライン
投稿: 507
PANDA-Z!!
|
|
Re:SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態
« 返信 #3 投稿日: 2007/04/25 - 15:11:15 » |
|
ドキ…
やはりそうですよね
一応、考えてみて次のような方法にしてみました。
ComponentがAssemblyの場合、予め取得した参照先パスのSafeArray (SwDMDocument5.GetAllExternalReferences2)と構成部品の名前 (SwDMComponent.Name + ".sldasm")を照らし合わせて、マッチしたら サブアセンブリをSwDMApplication.GetDocument し構成部品を巡回する。
注意する点として、構成部品名をファイル名とリンクさせないオプション設定に しているとマッチングが出来ないので機能しません…
コードは長いのでテキストファイル添付しました
追記:コード中 swDoc とか swDoc5 とかありますが、オブジェクトの末尾の番号によってメソッドが 違う認識でコーディングしちゃってました・・・ 実際は、末尾の数字が大きいオブジェクトは小さいオブジェクトのメソッドも含むみたいでした (例:SwDMDocument5 は SwDMDocument2 に記述されているメソッドが使用できるって事です) API Helpが分かりにくかったってことで…なんて
恥ずかしいので証拠隠滅…
|
|
|
|
jc-a
Jr. メンバー
オフライン
投稿: 16
I'm a llama!
|
|
Re:SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態
« 返信 #4 投稿日: 2007/04/25 - 18:58:22 » |
|
返信ありがとうございます。 早速コードをためさせていただいております 試している中で,hisaさんの方の動作と違う動きをしていないか確認したいのですが,
>ComponentがAssemblyの場合、予め取得した参照先パスのSafeArray >(SwDMDocument5.GetAllExternalReferences2)と構成部品の名前 >(SwDMComponent.Name + ".sldasm")を照らし合わせて、マッチしたら >サブアセンブリをSwDMApplication.GetDocument し構成部品を巡回する。
>注意する点として、構成部品名をファイル名とリンクさせないオプション設定に >しているとマッチングが出来ないので機能しません…
「構成部品名をファイル名とリンクさせないオプション設定」とはSolidWorksアプリケーション(GUI)上の 「ツール」⇒「オプション」で設定するのでしょうか? それともコードのメソッドのオプションか何かで設定できるものでしょうか?
>コードは長いのでテキストファイル添付しました
助かります^^ かなり参考になりました.
コードをこちらの環境に合うように組み込みながら実行していますが.いくつか確認させてください.
1.添付ファイルの121行目 swTraverseSubAssy nvarRef(j), vComp.ConfigurationName
vComp.ConfigurationName で帰ってくる値が、こちら側だと全て「Default」で取得されてしまいます. hiroさんの環境ではカレントのコンフィグレーション名が返ってきますでしょうか? ただし、swGetCompStatus の中で出力される「nComp.ConfigurationName」以外の 「IsHidden」「IsSuppressed」についてはそれぞれの意図したコンフィグレーションに対する返却値が 戻ってきています.
2.添付ファイルの100行目 Set swSubConfig = swSubCfgMgr.GetConfigurationByName(nAssyCfg)
まずアセンブリの構成が以下のようなケース Configuration:conf-β Assembly1.sldasm ├PartA.sldprt <非表示> ├PartB.sldprt <表示> └Assembly2.sldasm <表示> ├PartC.sldprt <非表示> └PartD.sldprt <表示>
Assembly1.sldasm には「Default」と「conf-α」と「conf-β」の3つのコンフィグレーションが存在しています. Assembly2.sldasm には「Default」と「conf-γ」と「conf-θ」の3つのコンフィグレーションが存在しています. Assembly2.sldasm には「conf-α」と「conf-β」の2つのコンフィグレーションが存在しません.
上記のような構成で動作させた際,Assembly2.sldasm に,ルートコンフィグレーションを当てに行くと、 Set swSubConfig = swSubCfgMgr.GetConfigurationByName(nAssyCfg)のステートメント実行時にエラーで落ちちゃいます.
hiroさんの環境では問題Nothingでしょうか?
環境の違いによったものなんでしょうかね こちらは VB.NET2003 + SolidWorks2007 SP3.1 です
>追記:コード中 swDoc とか swDoc5 とかありますが、オブジェクトの末尾の番号によってメソッドが >違う認識でコーディングしちゃってました・・・ >実際は、末尾の数字が大きいオブジェクトは小さいオブジェクトのメソッドも含むみたいでした >(例:SwDMDocument5 は SwDMDocument2 に記述されているメソッドが使用できるって事です) >API Helpが分かりにくかったってことで…なんて
そうだったんですね・・・ 私もはじめて知りました(汗 数字の多きいものほど多機能なメソッドやプロパティが用意されているってことですね^^
|
|
|
|
hisa
カタマリの王様!?
オフライン
投稿: 507
PANDA-Z!!
|
|
Re:SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態
« 返信 #5 投稿日: 2007/04/26 - 11:32:50 » |
|
引用:「構成部品名をファイル名とリンクさせないオプション設定」とはSolidWorksアプリケーション(GUI)上の 「ツール」⇒「オプション」で設定するのでしょうか?
|
「ツール」⇒「オプション」⇒「システムオプション」⇒「外部参照」にある“ドキュメントを置き換える際〜”です。 APIでも制御出来ます。
引用:1.添付ファイルの121行目 swTraverseSubAssy nvarRef(j), vComp.ConfigurationName
vComp.ConfigurationName で帰ってくる値が、こちら側だと全て「Default」で取得されてしまいます.
|
自分の環境ではDefault以外も取得されますね… 何故でしょう
引用:2.添付ファイルの100行目 Set swSubConfig = swSubCfgMgr.GetConfigurationByName(nAssyCfg)
Set swSubConfig = swSubCfgMgr.GetConfigurationByName(nAssyCfg)のステートメント実行時にエラーで落ちちゃいます.
|
検証してみたところ、コンフィギュレーションが幾つか存在し、任意のコンフィギュレーションで構成部品を追加した場合、 他のコンフィギュレーションでvComp.ConfigurationNameが空の文字列を返しました。 その状態でswSubCfgMgr.GetConfigurationByName(nAssyCfg)を行うと、エラーが発生しました… 添付のテキスト99行〜101行に、空の文字列の場合最初のコンフィギュレーション名を設定するよう手を加えています。
また、Debug出力時のインデックス用文字列(swPadStr)の処理の仕方が、変な事になっていたのでコッソリ直してます
引用:上記のような構成で動作させた際,Assembly2.sldasm に,ルートコンフィグレーションを当てに行くと、
|
swTraverseSubAssyの引数nAssyCfgに渡しているのは、vComp.ConfigurationNameで取得した構成部品の コンフィギュレーション名なので、ルートコンフィギュレーション名とは異なります。
TOPモデルは全てのコンフィギュレーションを巡回するのに対し、構成部品はルートコンフィギュレーション下の コンフィギュレーション名のみ取得しているので、別途swTraverseSubAssyを設けて同じような処理をさせてます
|
|
|
|
jc-a
Jr. メンバー
オフライン
投稿: 16
I'm a llama!
|
|
Re:SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態
« 返信 #6 投稿日: 2007/04/26 - 17:30:38 » |
|
hisaさん レスありがとうございます。
引用:
引用:1.添付ファイルの121行目 swTraverseSubAssy nvarRef(j), vComp.ConfigurationName
vComp.ConfigurationName で帰ってくる値が、こちら側だと全て「Default」で取得されてしまいます. |
自分の環境ではDefault以外も取得されますね… 何故でしょう
|
swDM_Test.txtの121行目で取得されるコンフィグレーション名は、親アセンブリのコンフィグレーション名が返ってきますでしょうか?それともアセンブリにぶら下がる子部品のコンフィグレーション名でしょうか? こちらの環境で常に「Default」で帰ってくるというのは、子部品のコンフィグレーション名でしょうか? 私の認識として、121行目のコンフィグレーション名は部品の親に設定されているコンフィグレーション名と認識しておりましたが、意識違いでしょうか?
|
|
|
|
hisa
カタマリの王様!?
オフライン
投稿: 507
PANDA-Z!!
|
|
Re:SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態
« 返信 #7 投稿日: 2007/04/26 - 18:03:15 » |
|
引用:こちらの環境で常に「Default」で帰ってくるというのは、子部品のコンフィグレーション名でしょうか?
|
返ってくるのは子部品のコンフィギュレーション名ですね
各コンフィギュレーション名取得の大まかな手順としては、
1. アセンブリの全コンフィギュレーション名取得 (38行目:vCfgNameArr = swCfgMgr.GetConfigurationNames) 2. 手順1で取得したコンフィギュレーション名配列から一つ取り出し、TOPアセンブリのコンフィギュレーション (SwDMConfiguration2)取得 (43行目:swCfgMgr.GetConfigurationByName(vCfgName)) 3. 手順2で取得したコンフィギュレーションから所属する(TOPアセンブリ直下の)全構成部品を取得 (45行目:swConfig.GetComponents) 4. 手順3で取得した構成部品配列から一つ取り出し、TOPアセンブリで使用されている構成部品のコンフィギュレーション名取得 (65行目:nComp.ConfigurationName)
となります。
swTraverseSubAssyで渡しているvComp.ConfigurationNameは、サブアセンブリのコンフィギュレーション名です。 サブアセンブリ内の全構成部品を取得する上で、上記手順2と同じ用途で取り出しています
|
|
|
|
jc-a
Jr. メンバー
オフライン
投稿: 16
I'm a llama!
|
|
Re:SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態
« 返信 #8 投稿日: 2007/04/26 - 19:24:19 » |
|
まず、「Assembly1.sldasm」のサブアッシーとなる「Assembly2.sldasm <Default>」に以下の設定をします。
Assembly2.sldasm <Default> ├PartC.sldprt <Default> :表示 └PartD.sldprt <Default> :表示
「Assembly1.sldasm <conf-α>」を開き、サブアッシーである「Assembly2.sldasm」の「PartD.sldprt」を非表示に設定します。
Assembly1.sldasm <conf-α> ├PartA.sldprt <Default> :表示 ├PartB.sldprt <Default> :表示 └Assembly2.sldasm <Default> :表示 ├PartC.sldprt <Default> :表示 └PartD.sldprt <Default> :非表示
しかし、この設定はあくまでも「Assembly1.sldasm <conf-α>」に対しての設定であり、「Assembly2.sldasm <Default>」自体に変更は加えられないですよね。
「Assembly1.sldasm <conf-α>」の設定ではサブアッシー「Assembly2.sldasm」のコンフィグは<Default>であり、その子となる「PartD.sldprt <Default>」は「Assembly1.sldasm <conf-α>」の設定では非表示だけれど、「Assembly2.sldasm」それ自体のコンフィグ<Default>の設定では「PartD.sldprt <Default>」は表示する設定になっているという運用は有り得るのかどうかわかりませんが、そんな設定をした場合は
1.「Assembly1.sldasm」のコンフィグ<conf-α>につくサブアッシー「Assembly2.sldasm」のコンフィグは<Default>です。 2.サブアッシー「Assembly2.sldasm」のコンフィグ<Default>では「PartD.sldprt <Default>」の情報は表示です
なので、取得できる結果は Assembly1.sldasm <conf-α> ├PartA.sldprt <Default> :表示 ├PartB.sldprt <Default> :表示 └Assembly2.sldasm <Default> :表示 ├PartC.sldprt <Default> :表示 └PartD.sldprt <Default> :表示
ということですね^^
なるほど、ようやく理解できて来ました。
とても参考になりました。
hisaさん ありがとうございました。 またご教授いただけると幸いです^^
|
|
|
|
hisa
カタマリの王様!?
オフライン
投稿: 507
PANDA-Z!!
|
|
Re:SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態
« 返信 #9 投稿日: 2007/04/27 - 08:06:43 » |
|
引用:なので、取得できる結果は Assembly1.sldasm <conf-α> ├PartA.sldprt <Default> :表示 ├PartB.sldprt <Default> :表示 └Assembly2.sldasm <Default> :表示 ├PartC.sldprt <Default> :表示 └PartD.sldprt <Default> :表示
ということですね^^ |
あ・・・そういうことですね(汗 サンプルではサブアセンブリを別途呼び出していて、TOPアセンブリとの関連は無いので、 TOPアセンブリで変更した表示設定は取得出来ないですね…:-[
TOPアセンブリからサブアセンブリ内を含む全ての構成部品を取得出来れば問題なさそう ですが、探しても見つかられなかったのでとりあえずこんな形で…
ヴァージョンアップで拡張されるのを期待したいですね
|
|
|
|