我在C#中设置了一个非常简单的clojure解释器,它可以加载.clj文件并使这些函数可以在AutoCAD中使用。这很有效,但我想用更多的结构来设置它,这样我就可以进行模块化。源文件,而不是一个伟大的主文件(这是我目前唯一的工作方式)。
我已尝试过各种方法,例如在脚本中导入,使用,需要加载和加载文件,以及在C#脚本代码中加载多个文件,但我宁愿有一个主要脚本参考&# 39;加载到解释器中时需要的其他文件。
以下是我目前用于加载主文件的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)))
答案 0 :(得分:0)
对于Excel-REPL,我定义了以下辅助函数。
(import System.Environment)
(require '[clojure.string :as string])
(defn get-load-path []
(set (string/split (Environment/GetEnvironmentVariable "CLOJURE_LOAD_PATH") #";")))
(defn set-load-path! [s]
(let [
new-path (apply str (interpose ";" s))
]
(Environment/SetEnvironmentVariable "CLOJURE_LOAD_PATH" new-path)
new-path))
然后我可以简单地更新加载路径
(set-load-path! (conj (get-load-path) "path/to/clojure/source/files"))
之后我可以在clj文件中要求,ClojureCLR知道在哪里找到它们。