2010年1月25日月曜日

.NET(基本)(2)(AutoCAD 2010)

サンプル プログラムの解析
では、使用したサンプル プログラムは具体的に何を行っているのか内容を見ていきましょう。


ここであらためてサンプル プログラムは以下のとおりです。
--------------------------------------------------
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry
Public Class Class1
_
Public Sub AngleFromXAxis()
Dim pt1 As Point2d = New Point2d(2, 5)
Dim pt2 As Point2d = New Point2d(5, 2)

Application.ShowAlertDialog("Angle from XAxis: " & _
pt1.GetVectorTo(pt2).Angle.ToString())
End Sub
End Class

--------------------------------------------------

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry

まずは、これからですが、これは何なんでしょう?

そこで、Google で Imports について探してみたところ http://msdn.microsoft.com/ja-jp/library/7f38zh8x.aspx にこんな記述がありました。


現在のプロジェクトに定義された、または参照されているプロジェクトとアセンブリに定義された名前空間またはプログラミング要素をインポートします。
なので、AutoCAD の名前空間ってやつを読み込んでいみたいです。

続いて、Autodesk.AutoCAD.ApplicationServices などについて Google で探したところ、ちょっと古い(AutoCAD 2008 のころのもの?)ですが、http://images.autodesk.com/apac_japan_main/files/api_customizetechnic.pdf を見つけました。でも、基本的に AutoCAD 2010 も同じでしょうと勝手に都合のいいように考えることにしました。


この中の 30 ページに、こんな記述を見つけました。



AutoCAD マネージクラスライブラリの名前空間
Autodesk.AutoCAD.GraphicsInterface : ベクトル描画機構関連
Autodesk.AutoCAD.PlottingServices : 印刷サービス関連
Autodesk.AutoCAD.Windows : ユーザインタフェース関連
Autodesk.AutoCAD.EditorInput : 選択、入力等ユーザ対話関連
Autodesk.AutoCAD.Runtime : 例外処理など基本機能関連
Autodesk.AutoCAD.Geometry : 幾何演算関連
Autodesk.AutoCAD.DatabaseServices : グラフィカル、非グラフィカルオブジェクト等図面データベース関連
これからいくと、2 行目、3 行目で「例外処理など基本機能関連」と「幾何演算関連」の名前空間をインポートしてるってことですね。詳しいことはわかりませんが、このサンプル プログラムではこれらの名前空間を読み込んでおく必要があるみたいです。(プログラムに詳しい人からすれば、基本中の基本で、当たり前のことなんでしょうね、きっと。。。)

1 行目の Autodesk.AutoCAD.ApplicationServices についての記述はありませんが、名前から見てきっと必ずいるものなんでしょうね、と勝手に理解することにします。(これ以上考えてもわからないので。。。)
いろいろサンプル ファイルを見てみても、Autodesk.AutoCAD.ApplicationServices と Autodesk.AutoCAD.Runtime は必ずインポートしてるみたいです。



_ AutoCAD .NET デベロッパガイド(acad_mdg.zip)の「AutoCAD .NET API の基礎 > コマンドと AutoLISP 関数の定義 > コマンドの定義」に記述がありました。

コマンドの定義を行っているようです。
AngleFromXAxis というコマンドを新たに作りますよってことです。


Dim pt1 As Point2d = New Point2d(2, 5)
Dim pt2 As Point2d = New Point2d(5, 2)

pt1 と pt2 に 2 次元の座標値を割り当ててるようです。


Application.ShowAlertDialog("Angle from XAxis: " & _
pt1.GetVectorTo(pt2).Angle.ToString())

http://www.autodesk.com/objectarx の「License & Download」から「ObjectARX for AutoCAD 2010 (32-bit and 64-bit)」(ObjectARX_2010_Win_64_and_32Bit.exe)を入手しました。


ObjectARX_2010_Win_64_and_32Bit.exe を実行すると C:\ObjectARX 2010\docs フォルダに arxmgd.chm(ObjectARX for AutoCAD 2010 : Managed Class Reference Guide) というファイルがあって、Application.ShowAlertDialog について以下の記述があったので、きっとこれでしょう。


Shows the alert dialog with the specified message.
※ ここで気がついたのですが、arxmgd.chmで、Autodesk.AutoCAD.ApplicationServices Namespace の下に Application.ShowAlertDialog Method に関する記述があるので、「Imports Autodesk.AutoCAD.ApplicationServices」の記述が必要だったんですね、きっと。

pt1.GetVectorTo(pt2).Angle.ToString() に関しては、きっと、p1 から p2 までのベクトルの角度を文字列にしているみたいです。(まだ理屈をちゃんと理解してませんが、そのうち分かる時が来ると勝手に思ってます。)


なので、pt1 から pt2 方向へのベクトルの角度を文字列にしているみたいです。


pt1 は 2,5、pt2 は 5,2 なので、角度は 315° です。

この AngleFromXAxis コマンドを実行すると、上記のように表示されていますが、この値はラジアンだと思います。(180 × 5.49778714378214 ÷ π = 315 ですね。)

2010年1月23日土曜日

.NET(基本)(AutoCAD 2010)

オートデスク社の Webサイト(Microsoft Visual Basic for Applications Module FAQ)に以下の記述があります。
What is the status of VBA support in the AutoCAD 2010 product line?
Autodesk has begun the transition of VB customization from VBA to .NET technology. This transition will occur over a few years. During this time, Autodesk will provide documentation and other assistance to help our customers and developers migrate from VBA to this new automation technology.
オートデスク社は VBA から .NET への移行を始めているということのようです。

管理人は、AutoLISP でカスタマイズを行ったことはありますが、その他の言語でのカスタマイズは行ったことがありません。
AutoLISP はずっと昔からある古い言語なので、新しいカスタマイズにチャレンジしようかと思っています。

そこで、VBA は .NET に移行されるということのようなので、.NET をいちからやってみようと思います。きっと、分からない事だらけで、なかなか進まないと思いますが、地道にコツコツやっていこうかと思います。

とりあえず管理人がやってみたことをそのまま書くだけですので、あくまでも参考ということで見てください。(初心者なので間違いや勘違いがあると思いますので。。。)

環境の準備
まずは、環境の準備から始めようと思いますが、いったい何が必要なのでしょうね???(なにぶん初心者なので。。。)

とりあえず、オートデスク社の Web サイトの ここ に「AutoCAD .NET デベロッパガイド(日本語) 」(acad_mdg.zip)があるので、これをダウンロードして解凍した acad_mdg.chm を C:\Program Files\AutoCAD 2010\Help フォルダに置いて、中を見てみました。
※ Help フォルダに置かないと、ちゃんと内容を表示できないので注意!!
まずは、acad_mdg.chm でこんな記述を見つけました。
Microsoft Visual Studio には複数のバージョンおよびエディションがあります。AutoCAD 2010 対応の .NET API を使用するには、次を使用する必要があります。
・ Microsoft Visual Studio 2008 Service Pack 1
・ Microsoft .NET Framework 3.5 Service Pack 1
管理人の OS は、Windows 7 なので .NET Framework 3.5.1 が元からはいっているので、Microsoft .NET Framework 3.5 Service Pack 1 は気にしなくていいでしょう。(他の OS の場合も、AutoCAD 2010 と一緒にインストールされますから気にしなくていいでしょう。)

Microsoft Visual Studio 2008 Service Pack 1 に関しては、無償版で Microsoft Visual Studio 2008 Express Edition というものがあるようなので、これにしましょう。(有償版の方がいいようですが、初心者としてはやっぱり無償版がいいです。)

そこで、http://www.microsoft.com/japan/msdn/vstudio/express/ から Microsoft Visual Studio 2008 Express Edition を入手してインストールを開始したところ、以下の画面になりました。

どれを選べばいいんでしょうね???
とりあえず、Visual Basic 2008 をインストールしてみました。

では、さっそく Visual Basic 2008 を起動してみました。
で、このあとどうすればいいんでしょう???

参照の追加(AcDbMgd.dll、AcMgd.dll、AcCui.dll)
何が何だかわからないので、とりあえず手探りで [ファイル]-[新しいプロジェクト] を選択したあと、クラス ライブラリを選択して、test01 というプロジェクト名にして OK ボタンをクリックしました。
acad_mdg.chm にこんな記述を発見しました。
AutoCAD .NET API の DLL ファイルのうち、主に次の 3 つを頻繁に使用します。
・ AcDbMgd.dll: 図面ファイル内のオブジェクトの操作に使用します。
・ AcMgd.dll: AutoCAD アプリケーションの操作に使用します。
・ AcCui.dll: カスタマイズ ファイルの操作に使用します。
ということで、[プロジェクト]-[参照の追加] で、[参照] タブを選択して上記の 3 つの dll ファイルを選択して OK ボタンをクリックしました。
サンプル プログラムを元にして DLL ファイルを作成
で、まずはサンプルを探してやってみようと思い、acad_mdg.chm を探してこんなコードを見つけました。

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry

<CommandMethod("AngleFromXAxis")> _
Public Sub AngleFromXAxis()
Dim pt1 As Point2d = New Point2d(2, 5)
Dim pt2 As Point2d = New Point2d(5, 2)

Application.ShowAlertDialog("Angle from XAxis: " & _
pt1.GetVectorTo(pt2).Angle.ToString())
End Sub

ということで、さっそくカット&ペーストです。
Class1.vb にまるごとカット&ペーストしてみましたが、「<CommandMethod("AngleFromXAxis")> _」と「Public Sub AngleFromXAxis()」に波線が入って、「名前空間のステートメントが無効です。」というエラーになってしまいました。
Class1.vb には元々以下の内容があったので、消しちゃいけないんですね、きっと。

Public Class Class1

End Class

ということで、この記述は残して、こんな感じにしました。

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry
Public Class Class1
    <CommandMethod("AngleFromXAxis")> _
    Public Sub AngleFromXAxis()
        Dim pt1 As Point2d = New Point2d(2, 5)
        Dim pt2 As Point2d = New Point2d(5, 2)

        Application.ShowAlertDialog("Angle from XAxis: " & _
        pt1.GetVectorTo(pt2).Angle.ToString())
    End Sub
End Class

今度は、エラーなしです。

で、[ファイル]-[すべて保存] を選択して、test01 という名前で保存です。

そうすると、C:\Users\acadvideo\Documents\Visual Studio 2008\Projects\test01\test01\bin\Debug フォルダに test01.dll というファイルが出来ました。
これをロードすればいいんですねきっと。

AutoCAD で実行
test01.dll ができたので、さっそく AutoCAD で実行です。

まずは、AutoCAD を起動して、NETLOAD[.NET アプリケーション ロード] コマンドを実行です。
さっきできた test01.dll を選択して、[開く] ボタンをクリックしてロードです。

<CommandMethod("AngleFromXAxis")> _」という記述があったので、AngleFromXAxis と入力すると、作成したコマンド(AngleFromXAxis)が実行されて、 こんな AutoCAD メッセージが表示されました!!
なんとかコマンドを作れてよかったです!!

2010年1月22日金曜日

getpoint、getint、getreal、getstring 関数(AutoCAD 2010)

プログラムを作成するときに、ユーザに座標値、整数値、実数値、文字列を入力させたいことがあると思います。そんな時に、これらの関数を使用します。

使用例
(getpoint "\n場所を指定:")
コマンドラインに「場所を指定:」と表示され、その後クリックした(あるいは 入力した)座標値が返されます。

そのため、例えば、(setq pt1 (getpoint "\n場所を指定:")) と入力すると、ユーザがクリックした座標値が、変数 pt1 に割り当てられます。

「\n」は改行を行うことを意味していて、「場所を指定:」の前にあるのは、「場所を指定:」の前に不要な文字が入らないようにするためです。
この一行のみを実行するときは、「\n」があってもなくてもいいのですが、実際に lsp ファイルを作成して自分で作成したコマンドを実行するようになってくると、「\n」がないと前の行の返り値が「場所を指定:」の前に表示されてくるというようなことが起きてくると思います。

(getint "\n数値を入力:")
コマンド ラインに「数値を入力:」と表示され、入力された整数が返されます。

(getreal "\n数値を入力:")
コマンド ラインに「数値を入力:」と表示され、入力された値が実数として返されます。

(getstring "\n文字列を入力:")
コマンド ラインに「文字列を入力:」と表示され、入力した内容が文字列として返されます。

2010年1月21日木曜日

setq 関数(AutoCAD 2010)

変数に値を設定する関数です。

使用例
(setq a 100)
変数 a に整数 100 が割り当てられます。
(setq a 100.0)
変数 a に実数 100.0 が割り当てられます。
(setq a "100")
変数 a に文字列 100 が割り当てられます。
(setq a 100 b 100.0 c "100")
変数 a に整数 100、変数 b に実数 100.0、変数 c に文字列 100 が割り当てられます。

command 関数(AutoCAD 2010)

AutoCAD のコマンドを実行する関数です。

使用例
(command "_.LINE" "0,0" "100,100" "")
LINE[線分] コマンドが実行され、0,0 から 100,100 に線分が描かれます。


このように、コマンドを実行するときに入力する内容を、"" で囲って順番に入れていけばコマンドを実効できます。
コマンド実行中に Enter を押すような場合は、"" と入力します。

コマンド名の前に「_.」を入れていますが、通常これを入れるもののようです。

「_」は英語でのコマンド入力を示しているようです。
例えば、フランス語版の AutoCAD では、STRETCH コマンドは ETIRER コマンドを実行するようになっているようです。つまり、同じコマンドでも、異なる言語版の AutoCAD では、コマンド名が異なることがあるようです。
日本語版は、コマンド名は英語版とすべて同じなので「_」をつけます。
普通みなさんは日本語版の AutoCAD で使用すると思うので、「_」をつけなくても問題なく動作しますが、フランス語などの AutoCAD で「_」をつけないと動かないことがあるのではないかと思います。(フランス語版の環境がないので、確認したことはありませんが。。。)

「.」は、AutoCAD のオリジナルのコマンドであることを示しています。
AutoCAD では、カスタマイズで元からあるコマンドに新しいコマンドを割り当てることができます。
例えば、UNDEFINE[コマンド定義解除] コマンドで、LINE コマンドを無効にすることができます。その後、自分で新たに LINE コマンドを作成して、独自の LINE コマンドを実行することができるようになります。
そのようなカスタマイズが実行された環境であっても、「.」をコマンドの前につけることで、カスタマイズされたコマンドではなく、AutoCAD が元から持っているコマンドを実行することができます。