1

.clj ファイルをロードし、AutoCAD 内で関数を使用できるようにする、C# でセットアップされた非常に単純な clojure インタープリターがあります。これはうまく機能しますが、1 つの優れたマスター ファイルを使用するのではなく、ソース ファイルを「モジュール化」できるように、もう少し構造を設定したいと思います (これが現在動作させる唯一の方法です)。 .

スクリプト内で import、use、require load、load-file などのさまざまな方法を試し、C# スクリプト コードに複数のファイルをロードすることも試しましたが、ロード時に必要な他のファイルを参照するメイン スクリプトを 1 つ用意したいと思います。通訳者。

これは、現在メイン ファイルをロードするために使用している C# スニペットです。

    Editor ed = _AcAp.Application.DocumentManager.MdiActiveDocument.Editor;
    clojure.lang.Compiler.loadFile(AppEntry.AppPath + "..\\Scripts\\main.clj");
    PromptResult res = ed.GetString("Enter a clojure command: ");
    // res should have the user entered command to invoke:
    var foo = clojure.lang.RT.var("main", res.StringResult);
    object o = foo.invoke();

実行時にロードしたい 2 つのファイルの例を次に示します。メイン ファイルは他のすべてのファイルを参照します。

(ns main) ;; the main file that gets loaded into interpreter

(import 
    '(Teigha.DatabaseServices Line)
    '(Teigha.Geometry Point3d)
    '(dbtools add-to-db)) ;; my other 'script' file I would like imported for use

(defn add-line 
    []
    (let [ line (Line. (Point3d. 20.0 20.0 0.0) (Point3d. 200.0 50.0 0.0))]
         ;; call an external script file method
         (add-to-db line))) 

現在、メインファイルと同じフォルダーにありますが、ある段階でこれらをサブフォルダーに整理したいと考えています。

(ns dbtools) ;; helper file/module

(import 
    '(Teigha.DatabaseServices Database SymbolUtilityServices 
                Transaction BlockTable BlockTableRecord OpenMode)
    '(Bricscad.ApplicationServices Application))

(defn add-to-db
    "Adds an AcDbEntity to ModelSpace of the current database
    Returns the ObjectId of the Entity added to the db."
    [entity]
    (let [ db (.. Application DocumentManager MdiActiveDocument Database)]
        (with-open [tr (.. db TransactionManager StartTransaction)]
            (let [  bt (.GetObject tr (.BlockTableId db) OpenMode/ForWrite)
                    btr(.GetObject tr (. SymbolUtilityServices GetBlockModelSpaceId db) OpenMode/ForWrite)]
                (let [id (.AppendEntity btr entity)]
                    (doto tr
                        (.AddNewlyCreatedDBObject entity true)
                        (.Commit))
                        id)))))

これについて最善の方法についてのガイダンスはありますか?ありがとう。

編集:メインファイルに次の変更を加えて作業していますが、これを行うためのより良い方法、たとえば、main.cljファイルフォルダーと一致するようにロードパスを設定する方法についてはまだオープンです。参照用に変更されたファイルは次のとおりです。

(ns main) ;; the main file that gets loaded into interpreter

(load-file "C:\\path\\to\\dbtools.clj")
(require '[dbtools :as tools])

(import 
    '(Teigha.DatabaseServices Line)
    '(Teigha.Geometry Point3d))

(defn add-line []
    (let [ line (Line. (Point3d. 20.0 20.0 0.0) (Point3d. 200.0 50.0 0.0))]
         ;; call an external script file method
         (tools/add-to-db line)))
4

1 に答える 1