AutoCAD/IJCAD/ZWCADの互換CAD同時開発環境構築方法

# はじめに

- AutoCAD .NET APIを使ったカスタマイズ方法のトレーニングは

  [AutoCAD Developer Center](https://www.autodesk.com/developer-network/platform-technologies/autocad)

  に教材があるのでこちらを見れば基本的にはひととおり作業ができるようになります。

- ここでは、少し毛色の違うカスタマイズ、**「互換CAD同時開発」** について書きます。

# 前提

- 以下、下記が実施済みであるつもりで書いています。
  - Visual Studio 2019がインストールされている（コミュニティ版でOK）
  - AutoCAD 2021 ObjectARXがインストールされている
  - AutoCAD 2021 .NET API Wizardsがインストールされている
  - AutoCAD 2021がインストールされている
  - IJCAD 2020 STD/PROがインストールされている
  - ZWCAD 2020がインストールされている
  - （IJCAD/ZWCADはどちらかが入っていればOK）

# プロジェクトの作成

- まずはWizardsを使ってプロジェクトを作成します。

- 「AutoCAD 2021 CSharp plug-in」を選択、[次へ]ボタン

  ![新規プロジェクト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/1ca487c9-e818-3f20-e65e-e72e9d3ea867.png)

- プロジェクト名を入力し、[次へ]ボタン

  ![プロジェクトの構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/1a6f0eec-60ee-39bc-24bb-50d0bc4f0c50.png)


- オプションの選択
  - 上側のパスは、ObjectARXのINCフォルダーを指します。ここに入っているDLLを参照するようです。
  - 下側のパスはAutoCADのインストールパスを指します。これはデバッグモードで実行する場合にAutoCADを自動実行させるためです。
  - 後のチェックは必要なら入れます。今は不要です。
  - [OK]ボタンで次へ進みます。

  ![AutoCAD .NET Wizard Configurator](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/2f40b6d0-d736-a610-7f95-4c9f22d1ee88.png)


- ソリューションが作成されます。

  ![ソリューションツリー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/0d290c58-6c8e-8755-0530-a5db0d71b2c4.png)


- [MyCommands.cs]を見ると、お約束「Hello World」が作成されているのが確認できます。

  ![Hello world](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/8d3c3eb1-8135-d8be-682f-9df283984790.png)


- 申し訳ありませんが、各コードをじっくり解説するつもりはありません。
- コードを詳しく知りたいのであれば、最初に書いたリンクからトレーニング教材をダウンロードして見てください。

# AutoCADコード

- AutoCADのコードだと示すため、条件付きコンパイルシンボルに「ACAD」を入力します。
- ソリューションを右クリックして、プロパティを開く

  ![プロパティ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/e6cd5add-9182-04dd-96db-4fef9df7f335.png)


- プロパティが開いたら、「ビルド」を選択「条件付きコンパイルシンボル」に「ACAD」を入力

  ![プロパティ2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/5c16f80b-3404-9a29-e9f0-c158bfe68005.png)


- 同じく「ビルド」で「出力」に「ACAD」を追記

  ![ビルド](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/8bb67fbb-541c-bf65-ccf1-aa110b04624c.png)


- すべて保存し、Visual Studioを閉じます。

# プロジェクト・ソリューションファイルのコピー

- プロジェクトフォルダーを開きます。
  
  ![フォルダ構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/7ed31365-738e-4489-5152-3fb06c030494.png)


- フォルダー[TranAcad01]を開きます。

  ![TranAcad01]
(https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/cbdd623e-a440-847d-7235-6cab5a1221d2.png)


- [TranAcad01.csproj]ファイルを2度コピーし、

    | ファイル名        | 内容      |
    | ----------------- | --------- |
    | TranAcad01.csproj | AutoCAD用 |
    | TranIJ01.csproj   | IJCAD用   |
    | TranZW01.csproj   | ZWCAD用   |

  と改名します。

  ![改名後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/f7411e10-781d-8b17-e1ba-2ed657faf315.png)

- ひとつ上のフォルダーに戻りソリューションファイルを同じようにコピーします。

  ![改名後2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/f04aca34-cb78-7800-b3cc-11701aee7ef4.png)


- 各ソリューションファイルをメモ帳で開き、記述を変更します。

- IJCAD用（TranIJ01.sln）

```csharp

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30804.86
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TranIJ01", "TranAcad01\TranIJ01.csproj", "{79677DF9-AFAF-4F69-86FA-759BC7630EC6}"
EndProject
{以後略}
```

- ZWCAD用（TranZW01.sln）

```csharp

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30804.86
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TranZW01", "TranAcad01\TranZW01.csproj", "{79677DF9-AFAF-4F69-86FA-759BC7630EC6}"
EndProject
{以後略}
```

# IJCAD用の操作

- ```TranIJ01.sln```を開くと、ツリーが変化しています。

  ![ij01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/2272d9d2-0220-5752-8775-126e4e91cbd1.png)

- プロパティで「アプリケーション」のアセンブリ名を「TranACAD01」を「TranIJ01」に変更してください。
- 「規定の名前空間」まで変更すると、いろいろと面倒（Namespaceの記述が）なのでそちらは放置します。

  ![IJ12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/fb8be267-153f-b20a-d888-174b4e2f0c45.png)

- 「ビルド」で「条件付きコンパイルシンボル」に「ACAD」を「IJCAD」に変更してください。

  ![ij02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/2429ce0a-d834-092e-d9d0-eefac07d1346.png)

- 「ビルド」の「出力」もIJCAD用のフォルダーを指定します。
- DebugおよびReleaseでそれぞれ指定しておきます。

  ![ij13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/1302ddaf-01b8-9018-5475-0c0a25973356.png)

- 参照を変更します。

- ソリューションエクスプローラーで「参照」を展開
- AutoCADの参照である、「AcCoreMgd」「AcDbMgd」「AcMgd」を削除します。

  ![参照削除](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/eccd4134-7e56-671f-6739-e768eeb1d5e2.png)


  ![削除確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/9277ae8b-5672-5061-fddd-83152d6dd62f.png)


- 参照を右クリックし、[参照の追加]を選択

  ![参照の追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/88b01884-84a1-b154-8da4-8cabcc33f034.png)


- 参照マネージャーが起動したら、「参照」を選択の上、[参照]ボタンで、IJCADインストールフォルダーから
  [gmap.dll]と[gmdb.dll]を選択し、参照マネージャーを閉じます。

  ![参照マネージャー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/15606eaf-9af6-60d8-3b79-c944a01fc2ea.png)


- [gmap.dll]と[gmdb.dll]をプロパティを編集し、「ローカルにコピー」を「False」にしてください。

  ![ローカルコピーの無効化](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/a50aca0f-4ab1-3086-1338-77a50fdb603a.png)


## コードの変更

- ```myPlugin.cs``` ファイルを開きます。

  - 参照が変わり、AutoCADではないのでエラーでコードが赤くなっています。

  ![エラーリンク](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/5392fbab-3116-eb37-ea7c-5ff2cf1d75dc.png)


  - 現在の```using``` 文のエラーになっているところをACADシンボル時のコンパイルとして書き換えます。

```csharp
#if ACAD
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
#endif
```
  - IJCADの参照を追記します。

```csharp
#if ACAD
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
#elif IJCAD
using GrxCAD.Runtime;
#endif
```

  - エラーが止まります。

![IJコード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/28bc4322-b5aa-1bc7-2db5-82580982edb2.png)

- ```myCommands.cs``` を開いて同じように変更します。

```csharp
#if ACAD
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
#elif IJCAD
using GrxCAD.ApplicationServices;
using GrxCAD.DatabaseServices;
using GrxCAD.EditorInput;
using GrxCAD.Runtime;
#endif
using System;
```

- 以上でIJCAD用のコンパイルとしてはできるようになります。

- プロジェクトをすべて保存して終了してください。

# ZWCAD用の操作


- ```TranZW01.sln```を開くと、ツリーが変化しています。

![ツリーが変化](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/6a757621-37e9-2118-bbf2-3195a496e0cd.png)

- プロパティで「アプリケーション」のアセンブリ名を「TranACAD01」を「TranZW01」に変更してください。
- 「規定の名前空間」まで変更すると、いろいろと面倒（Namespaceの記述が）なのでそちらは放置します。

![アセンブリ名の変更](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/d9556261-de8a-b8c3-e5ab-e75ef0aea71f.png)

- 「ビルド」の「条件付きコンパイルシンボル」に「ACAD」を「ZWCAD」に変更してください。

![シンボル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/614c9f91-4fa1-4140-8c06-2b92a945980e.png)


- 「ビルド」の「出力」もZWCAD用のフォルダーを指定します。
- DebugおよびReleaseでそれぞれ指定しておきます。

![出力](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/d4cea592-4260-6198-d7e0-d73010a940a9.png)


- 参照を変更します。

- ソリューションエクスプローラーで「参照」を展開
- AutoCADの参照である、「AcCoreMgd」「AcDbMgd」「AcMgd」を削除します。

  ![参照削除](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/419a8a11-10ec-299f-7064-0ecf79661e42.png)

  ![削除確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/1bbbd23c-2299-90d4-f5fa-745885877bab.png)


- 参照を右クリックし、[参照の追加]を選択

  ![参照の追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/a1a366aa-aae7-b4c6-3701-ce674736e981.png)


- 参照マネージャーが起動したら、「参照」を選択の上、[参照]ボタンで、ZWCADインストールフォルダーから
  [ZwDatabaseMgd.dll]と[ZwManaged.dll]を選択し、参照マネージャーを閉じます。

  ![参照マネージャー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/58a116a0-42c5-f8e5-05e6-30b604056794.png)


- [ZwDatabaseMgd.dll]と[ZwManaged.dll]をプロパティを編集し、「ローカルにコピー」を「False」にしてください。

  ![ローカルコピーの無効化](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426989/c846c931-1351-41d7-a830-4d545937f3fa.png)

## コードの変更

```myPlugin.cs``` ファイルを開きます。

- 現在の```using```文のエラーになっているところをACADシンボル時のコンパイルとして書き換えます。

```csharp
#if ACAD
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
#elif IJCAD
using GrxCAD.Runtime;
#elif ZWCAD
using ZwSoft.ZwCAD.Runtime;
#endif
```

- ```myCommands.cs``` ファイルを開きます。

- 同じ手順でZWCADの記述を追記します。

```csharp
#if ACAD
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
#elif IJCAD
using GrxCAD.ApplicationServices;
using GrxCAD.DatabaseServices;
using GrxCAD.EditorInput;
using GrxCAD.Runtime;
#elif ZWCAD
using ZwSoft.ZwCAD.ApplicationServices;
using ZwSoft.ZwCAD.DatabaseServices;
using ZwSoft.ZwCAD.EditorInput;
using ZwSoft.ZwCAD.Runtime;
#endif
```

- 以上でZWCAD用のコンパイルとしてはできるようになります。

# まとめ

- いかがでしょうか？
- 今回はHello Worldのみの互換コードなので変更は最低限で済みます。
- 本来はもっとIJ用、ZW用とそれぞれ書き換える部分が出てきます。
  それらをきちんと把握するためにプログラムを実行して、動かないところを見つけてそれぞれ用に動くように変更してください。

以上です。