仕事のカタマリにようこそ!  [ ログイン | ユーザ登録 ]
フォーラムから検索

機械用3D-CAD SolidWorks非公認のユーザサイトです
 
 
Web katamari.org
仕事のカタマリ
ホーム リンク集 ダウンロード フォーラム(掲示板) FAQ お問い合わせ









フォーラムニュース: 質問、相談カテゴリに「SolidWorks操作方法」に関するフォーラムを追加しました。(2003/11/27)
いらっしゃい、 ゲストさん. まずはこちら→ ログイン または 登録. 2024/05/21 - 02:56:42
ホーム ヘルプ 検索 ログイン 登録

仕事のカタマリ 掲示板  |  SolidWorks一般  |  SolidWorksのカスタマイズ (議長: webmaster)  |  トピック: SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態 前のトピック 次のトピック
ページ: [1] Page Bottom 返信 返信のお知らせ Print 
   著者  トピック: SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態  (閲覧数 8120 回)
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!!

プロファイルを見る WWW
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!!

プロファイルを見る WWW
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が分かりにくかったってことで…なんて

恥ずかしいので証拠隠滅…
 swDM_Test.txt
議長に報告する   記録済み
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!!

プロファイルを見る WWW
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を設けて同じような処理をさせてます
 swDM_Test2.txt
議長に報告する   記録済み
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!!

プロファイルを見る WWW
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!!

プロファイルを見る WWW
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アセンブリからサブアセンブリ内を含む全ての構成部品を取得出来れば問題なさそう
ですが、探しても見つかられなかったのでとりあえずこんな形で… 

ヴァージョンアップで拡張されるのを期待したいですね
議長に報告する   記録済み
ページ: [1] Page Top 返信 返信のお知らせ Print 
仕事のカタマリ 掲示板  |  SolidWorks一般  |  SolidWorksのカスタマイズ (議長: webmaster)  |  トピック: SolidWorks Document Manager API を使ってAssembly配下につく部品の表示・非表示状態 前のトピック 次のトピック
ジャンプします: