AutoCADカスタマイズの移植

 

AutoCADメニューの移植

AutoCADには、以下の3種類にメニューがあります。
  • mnu
  • cui (AutoCAD2006以降からサポート)
  • cuix (AutoCAD2010以降からサポート)
Bricscadでサポートしているメニューは以下の2種類になります。
  • mnu
  • cui
cui については、Bricscad でそのままロードすることができます。
mnu については、注意が必要です。

mnuファイルの移植時のポイント


■ プルダウンメニュー ■
AutoCADでは、以下のようにサブメニューセクションラベルの行にメニューバータイトルを記述できます。

   ***POP1
   **FILE       [ファイル(&F)]
   ID_New       [新規作成(&N)...\tCtrl+N]^C^C_new

Bricscadでは、サブメニューセクションラベルはメニューバータイトルと別の行にしなければなりません。

   ***POP1
   **FILE
            [ファイル(&F)]
   ID_New       [新規作成(&N)...\tCtrl+N]^C^C_new

■ プルダウンメニュー ■
メニュー定義キーワードについて
ツールバーセクションは次のように記述します。

   ***TOOLBARS
   **TOOLS1
   TAG1 [Toolbar ("ツールバー名", 方向, 表示, X 値, Y 値, 行数)]
   TAG2 [Button ("ボタン名", ID 小, ID 大)]マクロ
   TAG3 [Flyout ("フライアウト名", ID 小, ID 大, アイコン, エイリアス)]マクロ
   TAG4 [Control (要素)]

AutoCADは定義キーワードに、TOOLBAR / BUTTON / FLYOUT / CONTROL というように大文字で記述してもエラーになりません。
Bricscadは Toolbar / Button / Flyout / Control と記述しないとメニューのロード時にエラーが発生します。


フライアウトの記述について
AutoCADはフライアウトのエイリアスが別のメニューファイルであってもボタンイメージが表示されますが、Bricscadは同じメニューファイルの必要があります。

例えば、以下のようなツールバーおよびフライアウトの記述がある場合
AutoCADでは、メニューグループ名が同じであれば、[**TB_ID_LINES]部の記述と
[**TB_ID_CLINES]部の記述が別々のメニューファイルになってもボタンイメージは表示される。
Bricscadでは、リンクが取れず、ボタンイメージが表示されなくなる。
 
**TB_ID_LINES
                [_Toolbar("線", _RIGHT, _SHOW, 1, 1, 1)]
ID_CSTM_LINE              [_Button("線", ICON_LINE, ICON_24_LINE)]^C^CCSTM_LINE;
ID_CSTM_CLINE            [_Flyout("色線", ICON_RLINE, ICON_RLINE, _OTHERICON, CUSTOM.TB_ID_CLINES)]
**TB_ID_CLINES
                [_Toolbar("色線", _FLOATING, _HIDE, 90, 190, 1)]
ID_CLINES_RED            [_Button("赤", ICON_RLINE, ICON_RLINE)]^C^CCSTM_LINE_RED;
ID_CLINES_BLUE          [_Button("青", ICON_BLINE, ICON_BLINE)]^C^CCSTM_LINE_BLUE;
ID_CLINES_GREEN        [_Button("緑", ICON_GLINE, ICON_GLINE)]^C^CCSTM_LINE_GREEN;


■ メニューマクロ ■
マクロの記述について

AutoCADでは行末に + を記述して複数行に渡ったマクロ記述ができますが、Bricscadはマクロを一行で記述しなければいけません。

例えば、以下のようなコマンド[OPEN_STAND_DWG]を実行するメニューの場合

   ***MENUGROUP=CUSTOM
   ***POP1
   **CUSTOM_FILES
                   [プロジェクト(&P)]
   ID_OPEN_STAND_DWG  [開く(&O)]^C^C$M=._FILEDIA;1;._CMDDIA;1;+
                                  OPEN_STAND_DWG;._REDRAW;._FILEDIA;$(GETVAR,FILEDIA)

AutoCADでは、実行できますが、Bricscadの場合

   コマンドを認識できません "+". 再度実行してください。

というメッセージが表示され、コマンド[OPEN_STAND_DWG]は実行されません。

コマンドの循環処理について
AutoCADではコマンドの前に * を付けるとコマンド循環できますが、Bricscadはユーザ入力のポーズがかからないため使用することができません。

例えば、AutoCADのメニューには、[作成]-[点]-[複数点] というコマンドがあります。このコマンドはメニューの記述は以下のようになっています。
   ID_PointMult [複数点(&P)]*^C^C_point

このコマンドの記述を Bricscad メニューに適応すると、座標を指示することなく、コマンド[_point]が実行され、他の入力を受け付けない状態になってしまいます。
 

AutoLISPの移植

LISP は AutoLISP との互換性が高く、プログラムのソースコードについては、多くの場合、そのまま利用することができます。
サポートされていない部分もありますので、移植時には結果を必ず確認してください。

移植時のポイント


■ ファイル形式 ■
ソースコードについて互換性は高く、ソースファイル(拡張子[lsp])についてはそのままロードできます。
高速ロード用の最適化された拡張子[fas]ファイル(バイナリ)やVLアプリケーションの拡張子[vlx]ファイルについては互換性がなく、ロードしても使うことはできません。

■ 関数
LISPでは、AutoLISPの持つ関数(vl関数を含む)の中でダミーとして提供し、実質サポートされていない関数もあります。
また、サポートしている関数でも、結果が異なるものがあります。必ず実行してみて、機能や結果について確認してください。

文字列操作関連の関数
(strlen) などの文字列を扱う関数について、LISP では文字数のカウント方法がAutoLISPとは異なっています。文字数を扱う処理をしている部分について、改良が必要です。
AutoLISPでは、ひらがなや漢字など全角文字の場合は、1文字を 「2」とカウントしますが、LISPでは「1」 とカウントします。

例えば、
文字列 "ABCDE" を (strlen)関数に引き渡すと、LISPでもAutoLISPでも 「5」 を返します。
文字列 "あいう" を (strlen)関数に引き渡すと、AutoLISPは 「6」 を返すのに対し、LISPは 「3」 を返します。
このように AutoLISPは文字数をバイト数として扱いますが、LISPは文字数を文字の個数として扱います。

■ システム変数
BricsCADでは、AutoCADの持つシステム変数の中でサポートしていないものがあります。
また、サポートはしているが、AutoCADでは読み書きできるが、BricsCADでは読み込み専用になっているものもあります。
(setvar)関数や(getvar)関数を使っている部分について、システム変数の有無などを確認してください。

例えば、
システム変数[DTextEd](AutoCAD2010以降)はサポートしていません。
システム変数[SDI]は、Bricscadでは読み込み専用のシステム変数となり、常に [0] を返します。

■ 環境変数
BricsCADでは、AutoCADの持つシステム変数の中でサポートしていないものがあります。
(getenv)関数を使っている部分について、環境変数の有無などを確認してください。

例えば、
環境変数[PrinterConfigDir]はサポートしていません。

■ コマンド ■
BricsCADでは、AutoCADの持つコマンドの中でサポートしていないものがあります。

また、サポートはしているが、AutoCADとは引数やオプションが異なるものもあります。
(command)関数を使っている部分について、コマンドの有無などを確認してください。
例えば、
コマンド[SaveAs]では、テンプレートとして保存するためのオプション[T]や標準仕様として保存するためのオプション[S]はサポートしていません。

open コマンド、quit コマンド<     AutoCAD では、 LISP では図面を開く方法として open コマンドを使いますが、使い方として2つの方法があります。

    1. システム変数[SDI] を [1] にして、 open コマンドを実行する。
    2. スクリプトファイルを生成して、script コマンドを実行して図面を開く。

1. の場合、BricsCAdではそのまま open コマンドが実行できますので、システム変数[SDI]を変更する必要はありません。
システム変数[SDI]の値が [0] のときに、open コマンドが使えない警告をするプログラムの場合は変更が必要です。

2.の場合、AutoCADのスクリプトファイルでは、以下のように書くことがあります。

   quit
   y
   open
   C:\temp\sample1.dwg

AutoCADの場合、quit コマンドの後に処理が続く場合は、AutoCADは終了せず、スクリプトの次のコマンドを実行しますが、BricsCAD の場合は、BricsCADが終了してしまい、次のコマンドに進みません。
図面を閉じる処理を入れる場合は、以下のように記述してください。

   close
   n
   open
   C:\temp\sample1.dwg

  

AutoCAD VBAの移植

BricsCAD VBA は AutoCAD VBA との互換性が高く、プログラムについては、そのまま利用することができます。
サポートされていない部分もありますので、移植時には結果を必ず確認してください。

移植時のポイント


■ VBAバージョン ■
使用するCADによって使用できるVBAのバージョンが違うので注意が必要です。
VBAバージョンが違うと、コードの修正が必要になる場合があります。
 
CADバージョン VBAバージョン
AutoCAD 2010 (32bit) VBA 6
AutoCAD 2016 (32bit) VBA 7
BricsCAD V16 (32bit) VBA 6
BricsCAD V17 (32bit) VBA 7.1
BricsCAD V17 (64bit) VBA 7.1
※例えば、AutoCAD 2010 で使用していたVBAをBricsCADに移植する際には VBA 6 → VBA 7.1 とバージョンが変わるので修正が必要になる場合があります。


■ ファイル形式■
AutoCAD VBAマクロファイルは拡張子[DVB]のファイルになります。
BricsCAD VBAはこの拡張子[DVB]ファイルをそのままロードし、利用することができます。
AutoCAD VBAマクロファイルをロードするとコマンドラインに以下のようなメッセージが表示されます。

   プロジェクト 'C:\***\***.dvb' は、他のバージョンか別のアプリケーションで作成されたものです。
   このプロジェクトリファレンスを更新します。

このメッセージが表示されたとき、BricsCAD VBAの統合環境のオプションの「変数の宣言を強制する」にチェックを入れていると、ThisDrawing オブジェクトのマクロに Option Explicit 宣言を追加します。
Option Explicit が既に宣言されている場合、または、ThisDrawing オブジェクトのマクロにコードが記述されている場合、マクロ実行時にコンパイルエラーとなります。
 
VBA12

BricsCAD VBAの統合環境のオプションの「変数の宣言を強制する」にチェックを入れている場合、ThisDrawingオブジェクトのマクロを確認してください。

■ オブジェクト、メソッド、関数■
オブジェクト、メソッド、関数について、AutoCAD VBAマクロと同じ名前になっていますので、変更する必要はありません。
ただし、オブジェクトの型宣言が AutoCad.AcadPolyline のようにアプリケーション名をつけて宣言している場合は、変更が必要となります。
AcadPolyline のようにオブジェクト名のみの宣言としてください。

オブジェクト、メソッド、関数 などサポートされていないものを使っている場合はコンパイルエラーになります。
そのときは、同等の結果が得られる別の方法を考える必要があります。

メソッド、関数の使い方によっては、実行時エラーが起こる場合があります。また、予期して、エラー処理を入れ、適切に処理している場合もあります。
AutoCAD VBAでは、実行時エラーとなるものが、BricsCAD VBA では、エラーにならない場合があります。
エラー処理についても、予期する処理をしているか確認してください。

例えば、
システム変数[CLAYER]に、存在しない画層名を設定した場合、AutoCAD VBAでは実行時エラーを返します。
それを予期し、以下のようなコードを作成した場合、AutoCAD VBAでは、画層[Z0] を作成しますが、Bricscad VBAでは実行時エラーとならないため、画層[Z0]は作成されません。

   On Error Resume Next
   Call ThisDrawing.SetVariable("CLAYER", "Z0")
   If Err.Number <> 0 Then
      Dim layerObj As AcadLayer
      Set layerObj = ThisDrawing.Layers.Add("Z0")
      Call ThisDrawing.SetVariable("CLAYER", "Z0")
   End If
   Err.Clear
   On Error GoTo 0

■ システム変数■
BricsCADでは、AutoCADの持つシステム変数の中でサポートしていないものがあります。
また、サポートはしているが、AutoCADでは読み書きできるが、BricsCADでは読み込み専用になっているものもあります。
SetVariableメソッドやGetVariableメソッドなどを使っている部分について、システム変数の有無などを確認してください。

例えば、
システム変数[DTextEd](AutoCAD2010以降)はサポートしていません。
システム変数[SDI]は、BricsCADでは読み込み専用のシステム変数となり、常に [0] を返します。

■ コマンド■
BricsCADでは、AutoCADの持つコマンドの中でサポートしていないものがあります。
また、サポートはしているが、AutoCADとは引数やオプションが異なるものもあります。
SendCommandメソッドを使っている部分について、コマンドの有無などを確認してください。

例えば、
コマンド[SaveAs]では、テンプレートとして保存するためのオプション[T]や標準仕様として保存するためのオプション[S]はサポートしていません。

  

Object ARXの移植

BRX は ObjectARX のソースコードとの互換性が高く、多くの場合そのまま利用することができます。
BricsCAD V16用のBRXのプロジェクトの場合、コンパイラは VS2013 (Visual C++ 12) を使うため、移植対象は ObjectARX 2015 ~ となります。
BricsCAD V15用のBRXのプロジェクトの場合、コンパイラは VS2010 (Visual C++ 10) を使うため、移植対象は ObjectARX 2013 ~ 2014 となります。

移植時のポイント


■ プロジェクトの参照先設定■
BRXでは、ヘッダーファイル、ライブラリの参照先を変更することで、 ObjectARX のプログラムプロジェクトをそのまま利用することができます。 以下は BRX SDK を プログラムプロジェクトから見て、..\..\..\..\ の相対フォルダに展開したときの各参照先の変更方法となります。

ヘッダーファイルの参照先の変更
プロパティの[構成プロパティ]-[C++]-[全般]-[追加のインクルード ディレクトリ]での設定を変更する。
32bit および 64bit とプラットフォーム別のヘッダーファイルとプラットフォーム共通のヘッダーファイルがあることに注意する。
001



ライブラリ参照先の変更
プロパティの[構成プロパティ]-[リンク]-[全般]-[追加のライブラリ ディレクトリ]での設定を変更を変更する。
32bit および 64bit とプラットフォーム別のライブラリファイルがあることに注意する。
002


■ コンパイルエラー、リンクエラー■
BRX では、 ObjectARX のクラスや関数をサポートしていないものがあるため、ビルド時にコンパイルエラーやリンクエラーになったクラスや関数があります。
この場合、同等の結果が得られる別の方法を考える必要があります。

■ 移行対象外のObjectARXプロジェクトについて■
ObjectARX2015~2016で作成されたプロジェクトは VS2013(VC12) でビルドされているため、BricsCAD V16 用のプロジェクトとして移植することができます。
ObjectARX2013~2014で作成されたプロジェクトは VS2010(VC10) でビルドされているため、BricsCAD V15 用のプロジェクトとして移植することができます。
異なる Visual C++ のバージョンで作成されたプロジェクトの場合、そのまま使うことはできません。
BRX として移植する場合は、該当する VisualStudio 用のプロジェクトを作成し、ソースコードをマージするようにしてください。
ObjectARX のプロジェクトが作成できない場合は、BricsCADのインストールフォルダの API\brx brxSample フォルダにサンプルソース(プロジェクト含む)ありますので、これを参考にプロジェクトを作成してください。
ObjectARX2006 以前のARXプログラムでは、ANSI対応のソースコードになっています。BRX はUNICDODE対応のソースコードになりますので、文字定数や変数、関数は、UNICODE対応に変更してください。

■ システム変数■
BricsCADでは、AutoCADの持つシステム変数の中でサポートしていないものがあります。
また、サポートはしているが、AutoCADでは読み書きできるが、BricsCADでは読み込み専用になっているものもあります。
acedSetVar()関数やacedGetVar()関数などを使っている部分について、システム変数の有無などを確認してください。

例えば、
システム変数[DTextEd](AutoCAD2010以降)はサポートしていません。
システム変数[SDI]は、BricsCADでは読み込み専用のシステム変数となり、常に [0] を返します。

■ コマンド■
BricsCADでは、AutoCADの持つコマンドの中でサポートしていないものがあります。
また、サポートはしているが、AutoCADとは引数やオプションが異なるものもあります。
acedCommand()関数やacedCmd()関数、sendStringToExecute()関数を使っている部分について、コマンドの有無などを確認してください。

例えば、
コマンド[SaveAs]では、テンプレートとして保存するためのオプション[T]や標準仕様として保存するためのオプション[S]はサポートしていません。
 

AutoCAD.NET APIの移植

BricsCAD .NET API は AutoCAD .NET API のソースコードとの互換性が高く、多くの場合そのまま利用することができます。

移植時のポイント


■ .NET Framework について■
BricsCAD V17,V16 での 対応 .NET Framework は Version 4.5.1 となります。
BricsCAD V15 での 対応 .NET Framework は Version 4.0 となります。
移行される .NET API のプロジェクトが .NET Framework の古いバージョンを使っている場合、正しいバージョンに変更してください。
開発環境に .NET Framework Version 4の該当バージョンが入っていない場合は、
以下よりダウンロードすることができます。

>>.NET Framework  ダウンロード

■ 参照ファイルの変更■
ricsCAD .NET API では、AutoCAD .NET API のプログラムプロジェクトをそのまま利用することができます。
ただし、.NETランタイムライブラリの参照モジュールは変更する必要があります。
AutoCAD .NET API では、 acmgd.dll,acdbmgd.dll または acmgd.dll,acdbmgd.dll,accoremgd.dll を参照しています。
BricsCAD .NET API では BrxMgd.dll, TD_Mgd.dll を参照します。
これらのファイルは BricsCAD のインストールフォルダにあります。
以下は Visual Studio 2010(Visual Basic) の画面になります。
dotNET001


参照ファイルのプロパティについて、BricsCADのライブラリおよびその他のファイルについても「ローカルにコピーする」設定を False としてください。
また、「特定のバージョン」設定についても False にしておきましょう。
dotNET003.pngdotNET002.png


■ ソースコードの変更■
Bricscad .NET API では、ライブラリに定義されている要素が異なるため、要素(クラスや型など)を変更する必要があります。
変更箇所は以下のとおりです。
 
  • 名前空間または要素のインポート宣言
  • 変数の型

名前空間および要素のインポート宣言について、Visual Basic では Import ステートメント、C# では using ディレクティブ と呼ばれる部分です。
ここで宣言されている AutoCADの宣言は削除し、BricsCAD のものを宣言してください。
以下は Visual Basic での記述です。

削除
   Imports Autodesk.AutoCAD.Runtime
   Imports Autodesk.AutoCAD.ApplicationServices
   Imports Autodesk.AutoCAD.DatabaseServices
   Imports Autodesk.AutoCAD.Geometry
   Imports Autodesk.AutoCAD.EditorInput

追加
   Imports Teigha.Runtime
   Imports Teigha.DatabaseServices
   Imports Teigha.Geometry
   Imports Bricscad.Runtime
   Imports Bricscad.ApplicationServices
   Imports Bricscad.EditorInput

変数の型について、以下のように先頭から型(クラス)名を含めて宣言しているものがあります。

   Dim SS As Autodesk.AutoCAD.EditorInput.SelectionSet

取り込む要素を変更しているので、型(クラス)名を変更してください。

   Dim SS As BricsCAD.EditorInput.SelectionSet

.NET対応ObjectARXと共通に使う場合は、親クラスなどの不要な宣言は削除してください。
   Dim SS As SelectionSet


■ AutoCAD .NET API のソースを一本化して運用する場合■
AutoCAD .NET API と BricsCAD .NET API のソースを一本化し、それぞれのCADでコマンドを作成する場合は、以下の手順となります。
 
  • AutoCAD .NET API のプロジェクトファイルを別名でコピーする。
  • dotNET004

     
  • コピーしたプロジェクトはAutoCAD .NET APIと同じソリューションに取り込みましょう。
    dotNET004-1.png
     
  • BricsCAD .NET API のプロジェクトについては、上記の「参照ファイルの変更」をする。また、必要に応じて、.NET Framework のバージョンも変更する。
    dotNET004-1.png
 
  • BricsCAD .NET API のプロジェクトのビルド出力パスは AutoCAD .NET API のものと重複しないよう Release/Debug とも変更する。

  • dotNET006
 
  • BricsCAD .NET API のプロジェクトには以下のようなカスタム定数を追加しておく。

  • dotNET007
 
  • ソースについて、先の追加したカスタム定数にて以下のように条件コンパイルされるようヘッダー部分を修正する。

  • dotNET007
 
  • 変数などの宣言については、親クラスなど削除する。


■ コンパイルエラー、リンクエラー■
BricsCAD .NET API では、 AutoCAD .NET API のManaged クラスや関数をサポートしていないものがあるため、ビルド時にコンパイルエラーやリンクエラーになったクラスや関数があります。
この場合、同等の結果が得られる別の方法を考える必要があります。

■ システム変数■
BricsCADでは、AutoCADの持つテム変数の中でサポートしていないものがあります。
また、サポートはしているが、AutoCADでは読み書きできるが、BricsCADでは読み込み専用になっているものもあります。
Application.SetSystemVariable()関数やApplication.GetSystemVariable()関数などを使っている部分について、システム変数の有無などを確認してください。
例えば、
システム変数[DTextEd](AutoCAD2010以降)はサポートしていません。
システム変数[SDI]は、Bricscadでは読み込み専用のシステム変数となり、常に [0] を返します。

■ コマンド■
BricsCADでは、AutoCADの持つコマンドの中でサポートしていないものがあります。
また、サポートはしているが、AutoCADとは引数やオプションが異なるものもあります。
DocumentクラスのSendStringToExecute()関数などを使っている部分について、コマンドの有無などを確認してください。

例えば、
コマンド[SaveAs]では、テンプレートとして保存するためのオプション[T]や標準仕様として保存するためのオプション[S]はサポートしていません。

ページトップ