C#でSWマクロ

なぜVBAじゃだめなのか?

前回 Python 
今回はC#です。

Solidworksの中で使えるVBAじゃなくて,他の言語に手を出したくなるのは,
そもそもVBAに不満があるからなんですが,

その不満の一つがコード補完です。

image

 

これが理想,Visual Studio 2022 上のC#の動作です。

自分でつけた変数名も,ライブラリ(上の例だとExtensionとかSelectById2とか)も補完してくれます。
VBAだと,自分で作った変数名を補完してくれません。
またPython(win32comライブラリ経由)では,ライブラリ側の補完ができません。

ということで,理想通りに補完してくれる C#でもマクロを作ってみた体験談です。

VBAの代わりにC#を使う話がないのはなぜか?

"C# Solidworks API"とかでweb検索すると,アドインの開発関連記事がヒットして,
「VBAの代わりにC#を使う」ような話がでてきません。

むしろPythonを使う話のほうが出てくるくらい。なぜ?

やってみたぼくの予想は「ややこしいから」なんですが,
とはいえVBA使うよりは気がのるなとおもいました。

ポイントは,テンプレートとか使わず「コンソールアプリ」として作ることです。

余談: 実は過去ぼくがこのサイトに書いたブログ(http://swjug.org/blog/view/29615/)で,山本さんや辻さんが「テンプレート使わずにできる」と教えてくれてたんですが,当時のぼくは全く理解できておらずアドイン開発コースに突っ込んでいってました。いま同じ場所に戻ってきて,8年経ってとうとう理解しました。山本さん辻さんありがとうございます。

ざっくり手順

1. [Visual Studio](https://visualstudio.microsoft.com/ja/vs/whatsnew/) をダウンロード/インストール
Community Edition, .NET デスクトップ開発

2. C# Console APP で新規プロジェクトをつくる

3. ツリーで,dependencies(依存関係)を右クリックから「COM参照の追加」
→sldworks で検索すると,「sldworks type library」が出てくるのでチェックをつける
※solidworks で検索すると出てくる 「SOLIDWORKS20** Constant type library」もつけておくと便利。

image

これで準備完了。
あとは公式ヘルプのExample(たとえばこれ)をコピペすると動きます。

OneStepPlanesの移植してみた感想

とりあえず動きました。ソースコードはこちら

やってみた感想は,「ぼくのような趣味プログラマには,ほんのちょっと敷居が高い」でした。

Python のときは,テキトウに書いたら動いた!
という感想だったんですが,今回はすんなりはいきませんでした。

ポイント

  • 初期化されてない変数使用を許してくれない
    if文で条件分岐して,そのうち片方だけで初期化(値の設定)をする変数がありました。
    もう片方の条件の時はプログラム終了するので,値の設定は必要なく,そのため初期化してないんですけど,C#のコンパイラは許してくれず「初期化されてない変数」エラーでコンパイル通してくれません。
  • nullもすんなり設定させてくれない
    とりあえず初期化するとなると,nullを入れるしかないんですが,nullはnullで特別な扱いを求められます。ここで理不尽を感じる。
  • コンパイル通らないと実行できない
    VBAやPythonだととりあえずエラーが出るところまでは進んでくれるので,途中までは状況確認できるのですが,C#の場合コンパイル通らないとそもそも実行できないので進んでる感じがない。

というわけで,ぼくのような設計者が,自分の環境で動けばいいだけのオレオレコードを書くにはちょっと敷居が高いな,という感想でした。

とはいえそのままgit commitもできるし,少なくともある程度気合(?)を入れて作るマクロであれば,VBAで書くよりはやる気になるなと思いました。

コメント

コメント表示順: リミット: オートロード:
  • 西田将也 709 日前

    山本さん新谷さんコメントありがとうございます。

    Constant type library も忘れないうちに追記しておきました。

    初期化は,
    文字列だったら空文字とか,数字なら0とか.0とかいれとくんですけど,
    IRefPlaneとりあえず入れとけと言われると困る・・・
    というか,自分の脳内で把握できる規模のコード(しか書かないので)だと,
    冗長だなーと,感じてしまいますね。まあその態度がバグを生み出すんでしょうけど。笑

  • 新谷淳 710 日前

    C# は私もちょっとだけ触ってみたい言語です。ちなみに私の楽器はB♭

    > 初期化されてない変数使用を許してくれない

    私も初期化しなくても取りあえず動く言語(PHPやJavascript)をよく使いますが、少し複雑なプログラムになると予想しない値が入ってしまうことがあるので、最近は必ず変数を初期化するよう注意しています。

    最初は面倒くさいですが、新しい変数を使う前に初期化することになれてしまえばなんてことないですし、探すのに苦労するバグが減ると思えばかえって楽になるはず。

    初期化されてない変数使用を許してくれない

  • 山本誠 711 日前

    西田さん、お久しぶりです!

    『ざっくり手順』の3のところで"SOLIDWORKS20** Constant type library"も追加しておくと良いですよ。
    SwConst.swDocumentTypes_e.swDocPART などもインテリセンスで対応してくれます。
    と言うより、参照追加してないと 1 とかを直接入力する感じになります。

    私はもっぱらVB.Net派なのでC#での細かな説明はできないのですが、
    言語仕様の違いだけだと思うので『ポイント』に書いてあることは同じです。
    でも、もう慣れちゃったので気にならない(/・・)/

    ちなみに、Visual Studio CodeだとPythonのコード補完機能を動かせるかもしれないです。