SolidWorks API Community

Unofficial User Site

トピック: アクティブでない部品のプロパティを参照

アクティブでない部品のプロパティを参照 7 年 1 ヶ月 前 #66

  • ry.itoh
  • ry.itoh さんのアバター
  • オフライン
  • フレッシュボーダー
  • 投稿数: 1
  • カルマ: 0
はじめまして、itohと申します。

最近SolidWorks APIを勉強し始めまして、こちらのサイトを利用させていただいております。

早速ですが、SolidWorks では部品と図面をリンクさせると部品側のプロパティを参照して
図面側に自動入力させることができると思うのですが、
同様に部品側のプロパティ情報を参照して図面名称を決定、保存するマクロを作る場合、どのようなコードを用いれば実現できますでしょうか?

現状、アクティブな部品については、こちらのサンプルコードから以下のような
ものを使ってプロパティ内の目的の値を探しています。

アクティブドキュメントを取得:
Set swModel = swApp.ActiveDoc

アクティブドキュメントのプロパティ内を検索:
If vPropNames(i) = "REV" Then

実際に作りたいのは下記のようなマクロになります。
例)
部品側プロパティ:品名 AAA、REV 00
⇒対応する図面をPDFで出力
 ⇒保存する図面名称を自動決定:00_AAA.pdf

以上、なかなかうまく伝えられませんがご確認お願いします。
ゲストの書き込みは許可されていません。

アクティブでない部品のプロパティを参照 7 年 1 ヶ月 前 #67

  • hisa
  • hisa さんのアバター
  • オフライン
  • 管理者
  • 投稿数: 12
  • 感謝を受け取りました 7
  • カルマ: 0
ry.itohさん、はじめまして :)

解釈があっているか分かりませんが、回答します :P
「アクティブでない部品のプロパティ」を取得するとなると、PDMかDocument ManagerのAPIを利用することと成ると思います。
ただ、PDF出力は見たところDocument Manage APIに機能は無いため、PDMのAPIかSolidWorks本体で図面を開いてPDF出力をする他なさそうです… :ohmy:

APIヘルプを参考にしたサンプルのコードを提示しますので、試してみて下さい ;)
※sLicenseKey , sSearchPath , sTargetFileName は、適宜指定の上実行してください。
 SolidWorks Document Managerのライセンスキーは、販売代理店から入手可能です。
Option Explicit

Const sLicenseKey As String = "" ' SolidWorks Document Managerのライセンスキー
Const sSearchPath As String = "" ' 検索するフォルダ
Const sTargetFileName As String = "" ' 対象のファイル

Sub main()

    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swExportPdfData As SldWorks.ExportPdfData
    Dim dmClassFact As SwDMClassFactory
    Dim dmDocMgr As SwDMApplication4
    Dim dmDoc As SwDMDocument20
    Dim nRetVal As SwDmDocumentOpenError
    Dim dmSearchOpt As SwDMSearchOption
    Dim sSavePath As String
    Dim sSaveFileName As String
    Dim sPropVal As String
    Dim vRet As Variant
    Dim bRet As Boolean
    Dim lErrors As Long
    Dim lWarnings As Long
    Dim i As Long

    ' SolidWorks接続
    Set swApp = Application.SldWorks
    
    ' SolidWorks Document Managerの各種準備
    Set dmClassFact = CreateObject("SwDocumentMgr.SwDMClassFactory.1")
    Set dmDocMgr = dmClassFact.GetApplication(sLicenseKey)
    Set dmSearchOpt = dmDocMgr.GetSearchOptionObject
    ' 検索先パスを追加
    dmSearchOpt.AddSearchPath (sSearchPath)
    
    ' ターゲットファイル(sTargetFileName)のドキュメントを取得
    Set dmDoc = dmDocMgr.GetDocument(sTargetFileName, GetDocType(sTargetFileName), True, nRetVal)
    ' 取得できなかったら終了
    If dmDoc Is Nothing Then Exit Sub
    
    ' ターゲットファイルのプロパティからファイル名を生成
    sPropVal = dmDoc.GetCustomPropertyValues("REV", swDmCustomInfoNumber, "")
    sSaveFileName = sPropVal
    sPropVal = dmDoc.GetCustomPropertyValues("品名", swDmCustomInfoNumber, "")
    sSaveFileName = sSaveFileName & "_" & sPropVal & ".PDF"
    
    ' WhereUsedメソッドでターゲットファイルを参照しているドキュメントを検索
    vRet = dmDoc.WhereUsed(dmSearchOpt)

    ' 参照しているドキュメントが見つかればPDF作成
    ' (Document ManagerではPDF出力できないので、SolidWorks本体で出力)
    If Not IsEmpty(vRet) Then
        For i = 0 To UBound(vRet)
            ' 参照しているファイルが図面か確認
            If GetDocType(vRet(i)) = swDmDocumentDrawing Then
                ' SolidWorksで図面を開く
                Set swDraw = swApp.OpenDoc6(vRet(i), swDocDRAWING, swOpenDocOptions_Silent, "", lErrors, lWarnings)
                ' PDF出力準備
                Set swExportPdfData = swApp.GetExportFileData(1)
                bRet = swExportPdfData.SetSheets(swExportData_ExportSpecifiedSheets, swDraw.GetSheetNames)
                ' 参照している図面の保存フォルダを取得
                sSavePath = Left(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "\"))
                ' PDF保存
                bRet = swDraw.Extension.SaveAs(sSavePath & "\" & sSaveFileName, 0, 0, swExportPdfData, lErrors, lWarnings)
                ' 図面ファイルを閉じる
                swApp.CloseDoc swDraw.GetPathName
            End If
        Next
    End If
    
End Sub

' ファイル名の拡張子からドキュメントタイプを取得する処理
Private Function GetDocType(ByVal sPath As String) As SwDmDocumentType
    
    Dim nDocType As SwDmDocumentType
    
    nDocType = SwDmDocumentType.swDmDocumentUnknown
    
    Select Case Right(UCase(sPath), 6)
    
    Case "SLDPRT"
        nDocType = SwDmDocumentType.swDmDocumentPart
    Case "SLDASM"
        nDocType = SwDmDocumentType.swDmDocumentAssembly
    Case "SLDDRW"
        nDocType = SwDmDocumentType.swDmDocumentDrawing
    End Select

    GetDocType = nDocType
    
End Function
ゲストの書き込みは許可されていません。

アクティブでない部品のプロパティを参照 7 年 1 ヶ月 前 #68

  • hisa
  • hisa さんのアバター
  • オフライン
  • 管理者
  • 投稿数: 12
  • 感謝を受け取りました 7
  • カルマ: 0
一点、忘れておりました…

サンプルコードを実行する上で、下記ライブラリ参照を追加してください。
SwDocumentManager 20XX Type Library
(20XXはバージョンによって異なります)
ゲストの書き込みは許可されていません。

アクティブでない部品のプロパティを参照 7 年 1 ヶ月 前 #69

  • hisa
  • hisa さんのアバター
  • オフライン
  • 管理者
  • 投稿数: 12
  • 感謝を受け取りました 7
  • カルマ: 0
こんにちは :)

読み返した結果、もう一つの解釈で回答してみます :P

図面は開いていて、その図面が参照している(アクティブで無い)モデルのプロパティを取得する場合の処理です。

ポイントは、swSheet.CustomPropertyViewでどのビューがシートのプロパティとして使われているかを知るところですね。
(基本は、ひとつの図面またはシートで参照するモデルは一つかと思いますが、複数の場合もあり得ます)
試してみたところ、意図的に変えない限りはswSheet.CustomPropertyViewの結果は"デフォルト"となってしまうので、デフォルトの場合は最初のビュー(vView(0))としてビュー名を置き換えて対象のビューを特定する必要がありました。
対象のビューが分かってしまえば、vView(i).ReferencedDocument と vView(i).ReferencedConfigurationで参照しているモデルとコンフィギュレーション名が取得できます。

ご参考まで ;)
Option Explicit

Sub main()

    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swRefDoc As SldWorks.ModelDoc2
    Dim swExportPdfData As SldWorks.ExportPdfData
    Dim sSavePath As String
    Dim sSaveFileName As String
    Dim sView As String
    Dim sConfig As String
    Dim sPropVal As String
    Dim vView As Variant
    Dim bRet As Boolean
    Dim lErrors As Long
    Dim lWarnings As Long
    Dim i As Long

    ' SolidWorks接続
    Set swApp = Application.SldWorks
    
    ' アクティブドキュメントを取得
    Set swModel = swApp.ActiveDoc
    ' 取得できなかったら終了
    If swModel Is Nothing Then Exit Sub
    
    ' ドキュメントが図面か確認
    If swModel.GetType = swDocDRAWING Then
        ' アクティブドキュメントをDrawingDocオブジェクトとして格納
        Set swDraw = swModel
        ' 現在のSheetを取得
        Set swSheet = swDraw.GetCurrentSheet
        ' シートのユーザー定義情報を設定するのに使うビュー名を取得
        sView = swSheet.CustomPropertyView
        ' 図面の最初のビューを取得
        vView = swSheet.GetViews
        ' ビューがあるか確認
        If Not IsEmpty(vView) Then
            ' swSheet.CustomPropertyViewの結果が"デフォルト"なら、最初のビュー名を設定
            If sView = "デフォルト" Then
                sView = vView(0).Name
            End If
            For i = 0 To UBound(vView)
                If vView(i).Name = sView Then
                    ' 参照しているドキュメントを取得
                    Set swRefDoc = vView(i).ReferencedDocument
                    ' 参照しているコンフィギュレーション名を取得
                    sConfig = vView(i).ReferencedConfiguration
                    ' ターゲットファイルのプロパティからファイル名を生成
                    sPropVal = swRefDoc.GetCustomInfoValue(sConfig, "REV")
                    sSaveFileName = sPropVal
                    sPropVal = swRefDoc.GetCustomInfoValue(sConfig, "品名")
                    sSaveFileName = sSaveFileName & "_" & sPropVal & ".PDF"
                    ' PDF出力準備
                    Set swExportPdfData = swApp.GetExportFileData(1)
                    bRet = swExportPdfData.SetSheets(swExportData_ExportSpecifiedSheets, swDraw.GetSheetNames)
                    ' 参照している図面の保存フォルダを取得
                    sSavePath = Left(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "\"))
                    ' PDF保存
                    bRet = swDraw.Extension.SaveAs(sSavePath & "\" & sSaveFileName, 0, 0, swExportPdfData, lErrors, lWarnings)
                    Exit For
                End If
            Next i
        End If
    End If
    
End Sub
最終編集: 7 年 1 ヶ月 前 : hisa.
ゲストの書き込みは許可されていません。
ページ作成時間: 0.054 秒
現在地: Home フォーラム SolidWorks API FAQ SolidWorks API FAQ アクティブでない部品のプロパティを参照