SOLIDWORKS

SOLIDWORKS マクロ (SW VBA Macro) を使って、アセンブリ内の「部品表から除外」設定部品を一括して設定解除した話

※この記事は、「SOLIDWORKS API を使って、表示方向を整える作業をマクロで自動化した話」の続きです。この記事から読み始めた方は、前の記事をお読みください。

※とにかく結論を知りたいかたは、「出来上がったもの」へ飛んでください。

部品表に関する、あれこれ

ここ1年ほどで、SBOM(Software Bill of Materials:ソフトウェア部品表)のことを目にする・耳にすることが多くなりました。2023年7月には、経済産業省から「ソフトウェア管理に向けた SBOM (Software Bill of Materials) の導入に関する手引」の策定に関するニュースリリースが発表されていました。ソフトウェアのセキュリティ確保にともなって、こうした管理手法が話題になっているところです。このサイトをご覧になっている方の場合は、SBOM の方が馴染みが深いのかもしれません。

BOM (Bill of Materials:部品表)自体は、製造業では以前から有り「或る製品を製造するのに必要な部品や資材を、表形式やツリー形式に記したもの」として認識されています。設計時に定義する E-BOM とか、生産時に部品手配で使用する M-BOM など、用途により幾つかあります。

BOM(部品表)とは?基礎知識や種類、メリットと事例も解説|ITトレンド

機械設計用のソフトウェアでは、部品を幾つか組み合わせたまとまり「アセンブリ」の中で、材料を加工して製作する部品、購入品を買って取り付ける部品、締結に用いるねじ類など、さまざまなものを配置して、装置の全体像を作り上げていきます。また、こうして配置したものを、表形式やツリー形式に一括出力することで、部品表を作成できます。

この記事の背景

アセンブリ内で配置した「ねじ類」の取扱いが、この記事には大きく関わっています。

具体的に言うと、「SOLIDWORKS アセンブリ内に配置したねじ類を、部品表に載せない目的で『部品表から除外』と設定したが後になってから部品表に載せるように方針が変更になった 或いは ねじ類注文のための目安を知りたくなった ので、一つひとつ『部品表から除外』を解除することになった」という場合を想定しています。

とにかく結論を知りたいかたは、「出来上がったもの」へ飛んでください。

ねじ類を アセンブリ内で・部品表内でどう扱うか

「ねじ類をアセンブリ内で・部品表内でどう扱うか」について、考え方は各社それぞれだと思います。また、案件ごとに扱いが異なる例もあるかもしれません。

ねじ類をアセンブリ内にきちんと配置すれば、ねじの種類・長さ・数量が分かり、部品表にも載るので注文手配をする際に見通しが立って、大変分かりやすいです。一方で、ソフトウェアの描画に時間がかかって動作が遅くなることもあり得ますし、設計者が選定したものよりも組立担当者が現場判断で選んだもののほうが結果的に良い場合もあります。

また、「種類・長さが特徴的なので、社内在庫として持っていないものだけを特筆して、アセンブリ内・部品表内に表示させる」というやり方もあるでしょう。

SOLIDWORKS の構成部品プロパティ『部品表から除外』

SOLIDWORKS では、構成部品プロパティを使って、部品またはサブアセンブリを『部品表から除外』にチェックを入れると、「アセンブリ内に存在するが、部品表に表示されない構成部品」として取り扱うことが出来ます。これをねじ類に設定すると、「見えているし有るけれど、部品表に表示されない」状態になり、条件次第では具合が良い状態になります。

下の図の例では、M12×50 の六角穴付ボルトが締結に使われていますが、『部品表から除外』としているので部品表には表示されません。

部品表から除外を設定した、ねじ

ただし、これがひとたび「やっぱり『部品表から除外』を全部解除して、部品表に載せたい」とか「ねじ類を注文する時の目安が知りたいから、『部品表から除外』を解除して、種類・数量を知りたい」とかいった話になると、この『部品表から除外』のチェックを全部外していかなければなりません。これは、やってみれば分かりますが、なかなか手間がかかります。ねじ類のような細かな部品になると、作業の抜け・漏れにもつながりかねません。

この記事で伝えたいこと

  • この記事で扱っているのは、アセンブリ内に含まれる全ての各アセンブリ・各モデルについて『部品表から除外』のチェックを外す内容
    • SOLIDWORKS API Macro(マクロファイル)で記述した
    • 上書き保存すると、『部品表から除外』した状況で保存されるので、注意が必要

実現したいことを整理する

今回実現したいことを、前提条件から整理して考えました。

前提条件

  • 作成するマクロ機能は、アセンブリファイルを開いている際に実行する
  • アセンブリ内に、同じファイル名のサブアセンブリやモデルが複数ある(パターン配置以外で、複数置かれているものもある)
  • 『部品表から除外』と設定されているものが、幾つか(或いは膨大に)ある

実現したいこと

  • アセンブリ内の全てのサブアセンブリ・モデルについて、「『部品表から除外』の設定を全て解除する作業」を自動で実行する
    • ユーザーフォームは、今回使わない
    • マクロの実行は、エディタを介さず ツール(T) → マクロ(M) → 実行…(U) から行う
    • 実行前の状態を保存しない(実行前にどの構成部品が『部品表から除外』が設定してあったかは、記録しない)

出来上がったもの

以下のコードを書いて実行すると、「部品表から除外」を一括して解除することができます。

Option Explicit

Sub main()
    
    Dim swApp As SldWorks.SldWorks
    Dim swDoc As SldWorks.ModelDoc2
    Dim swADoc As SldWorks.AssemblyDoc
    Dim swFeatMgr As SldWorks.FeatureManager
    Dim varComp As Variant

    Set swApp = Application.SldWorks
    Set swDoc = swApp.ActiveDoc
    Set swADoc = swDoc
    Set swFeatMgr = swDoc.FeatureManager
    
    ' 現在開いているアセンブリドキュメント内の全てのコンポーネントを取得する
    varComp = swADoc.GetComponents(False)
    
    ' 参照しているコンポーネントのインデックスを示す
    Dim SearchIndex As Long
    
    ' 全てのコンポーネントの最初のインデックスから最後のインデックスまで、
    ' 順にコンポーネントを取得する
    For SearchIndex = LBound(varComp) To UBound(varComp)
    
        ' インデックスを基に、コンポーネントを指定する
        Dim swComp As SldWorks.Component2
        Set swComp = varComp(SearchIndex)
        
        ' コンポーネントで設定されている「部品表から除外」のチェックを外す
        swComp.ExcludeFromBOM = False
        
    Next SearchIndex
    
    ' フィーチャーツリーを更新する
    swFeatMgr.UpdateFeatureTree
    
    varComp = Empty

    MsgBox ("終了しました")
End Sub

GetComponents() で全てのコンポーネント取得して、それを For…Next ステートメントで先頭の要素 (LBound() で取得する)から終わりの要素(UBound() で取得する)まで順に扱う、という流れは前の記事と同じです。

IComponent2 インタフェースのメンバーの中に、ExcludeFromBOM プロパティがあります。これが、「部品表から除外」に関わるプロパティです。チェックが入っていれば True、チェックを外してあれば False です。今回は、全てのコンポーネントについてチェックを外すので、False に設定しています。

また、ExcludeFromBOM プロパティのヘルプ備考欄を読むと「FeatureManager デザインツリーを更新するには、IFeatureManager::UpdateFeatureTree を呼びましょう」と書いてあるので、そちらも併せて実行しています。

短い記述で、思っていた以上にいろいろできそうなので、SOLIDWORKS API の記事を今後も不定期で投稿していこうと思います。