クロスプラットフォーム AutoLISP コード

誕生から 42 年を経過した AutoCAD は、現在では Windows 版Mac 版Web 版といったさまざまなプラットフォームで利用することが出来ます。一方、もともと MS-Dos 版として登場して発展してきた Windows 版 AutoCAD には、AutoLISPObjectARXActiveX オートメーション(COM API).NET APIJavaScript API が用意されていて、多彩なカスタマイズに対応することが可能になっています。

最近では、AutoCAD との差別化のために API 機能を搭載していなかった AutoCAD LT でも、2024 バージョン以降、AutoLISP が利用出来るようになっています。(日本では既に AutoCAD LT の新規販売を終了しています)

AutoCADのスクリプトファイルを選択してロードする画面。上部にはAutoCADのメインメニューが表示され、スクリプトファイル選択のためのダイアログボックスが開いている。

AutoCAD Web:AutoLISP 機能 でご案内のとおり、AutoCAD Web でも AutoLISP を利用出来るようになっています。

そして、多彩な環境を持つ AutoCAD で共通して動作させることが出来る API を考えると、AutoLISP が該当する API になります。

ただ、AutoLISP の場合でも、API が利用するテクノロジの違いを意識する必要があります。過去に オートデスク製品の API が利用するテクノロジ のブログ記事で、AutoCAD をはじめとした主要なオートデスクのデスクトップ製品 API が、どのようなテクノロジを利用しているかご紹介したことがありますが、クロスプラットフォームで動作する AutoLISP を考えたとき、テクノロジによって動作しないプログラムが出てしまいます。(vla- などの関数を使用する ActiveX オートメーション(COM)を使った AutoLISP プログラムです。

簡単な例を見てみましょう。次の AutoLISP プログラムは、選択したオブジェクト色を TrueColor 色に設定するプログラムです。次の ChangeColor_List コマンドはリスト操作を利用しています。また、ChangeColor_ActiveX コマンドは ActiveX オートメーション(COM)を利用しています。

(defun trueColor-make (r g b /) 
  (+ (lsh (fix r) 16) 
     (lsh (fix g) 8)
     (fix b)
  )
)
(defun C:ChangeColor_List (/) 
  (setq ename (entsel "nオブジェクトを選択:"))
  (setq datalist (entget (car ename)))
  (setq oldcolor (assoc 420 datalist))
  (setq newcolor (cons 420 (trueColor-make 130 100 255)))
  (if (= oldcolor nil) 
    (setq newlist (append datalist (list newcolor)))
    (setq newlist (subst newcolor oldcolor datalist))
  )
  (entmod newlist)
  (princ)
)
(vl-load-com)
(defun C:ChangeColor_ActiveX (/) 
  (setq acadObj (vlax-get-acad-object))
  (setq docObj (vla-get-ActiveDocument acadObj))
  (setq utilObj (vla-get-utility docObj))
  (vla-getentity utilObj 'returnObj 'pt "nオブジェクトを選択:")
  (setq colorObj (vla-get-Truecolor returnObj))
  ;(setq colorObj (vlax-create-object "AutoCAD.AcCmColor.25"))
  (vla-SetRGB colorObj 130 100 255)
  (vla-put-TrueColor returnObj colorObj)
  (princ)
)

このコマンドのうち、ActiveX オートメーション(COM)テクノロジは Windows でしか利用出来ないため、クロス プラットフォームで動作するのは、リスト操作でオブジェクト色を変更する ChangeColor_List コマンドのみになります。

上記のプログラムを含んだ AutoLISP ファイルを ChColor.lsp のファイル名で保存、 AutoCAD Mac にロードしても、ChangeColor_ActiveX コマンドAutoComplete(入力候補の表示)機能にを認識させて実行することが出来ません。

AutoCAD 2025のインターフェースが表示されており、コマンド入力欄には "CHAN" と入力されている。左側にはツールバーがあり、図面のモデルが描かれている。

同じく、AutoCAD Web でも ChangeColor_ActiveX コマンドは認識させて、実行することは出来ません。

AutoCAD Webのインターフェースのスクリーンショット。左側にはLISPファイルのリストが表示され、下部には'CHANGE_COLOR_LIST'コマンドの入力欄が見えている。

Windows 版の AutoCAD の場合には、ChColor.lsp をロードさせると、ChangeColor_List コマンドChangeColor_ActiveX コマンドの両方を認識します。

AutoCAD 2025のインターフェース表示、コマンド入力ボックスに表示されたコマンド候補。

なお、AutoCAD Mac(Mac 版 AutoCAD )には Windows 版と同じく ObjectARX でビルドした .arx ファイルをロードして実行することが出来ますが、アンマネージ C++ を採用する ObjectARX は SDK とビルドしたバイナリ(.arx ファイル)がプラットフォーム依存になるため、Windows 版 AutoCAD 用に用意した .arx を Mac 版 AutoCAD にロード・実行することは出来ません。その逆も同様です。

また、ObjectARX と .NET API (Windows 版のみ)には、AutoLISP 関数を作成する機能が与えられていますが、ビルドした .arx や .dll ファイルは、ビルドしたプラットフォーム版の AutoCAD でしかロード出来ません。このため、そのような API で定義された AutoLISP 関数を使用する AutoLISP プログラムも、クロス プラットフォームで利用することは出来ません。

AutoLISP をクロス プラットフォームで利用する場合には、DXF グループコードを使用してリスト操作、オブジェクト作成・編集するようなプログラムが必要になります。

By Toshiaki Isezaki

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading