创建编程对象
每次我(在谷歌上)搜索这个,我都会得到“如何创建线条对象”或类似的东西。我不想制作AutoCAD对象。我想从C#NET中定义的类创建对象。从LISP中,我想使用vlax创建对象或类似的东西来创建对象。此外,将vlax put属性、vlax get属性和vlax invoke方法用于此对象(或其他等效对象)。**** Hidden Message ***** 这是一个起点:https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-NET/files/GUID-3B2760FE-A0DC-4229-AEBE-5CC83290BA95-htm.html
要从.net创建/使用“对象”(即类),需要向.net传递结果缓冲区,该结果缓冲区保存用于创建对象或使用函数的参数数据。您还可以通过结果缓冲区传回数据
例如,在C#中有一个创建对象的lisp方法,通过调用lisp方法并在结果缓冲区中传递构造函数参数,从lisp创建对象。当在C#中调用该函数时,您将解压结果缓冲区并使用这些参数创建对象。您可以通过返回的结果缓冲区传回句柄或对象id,以便您可以访问其他函数的新对象
vlax-Lisp函数用于ActiveX(即COM),如果要使用这些函数,需要为COM构建/包装.net类。
因此,我的最终目标是将这些AutoLISP函数转换为.NET:
(vl-load-com)
(setq CUSTOM_FNAM (strcat "C:/Users/" (getvar 'loginname) "/Desktop/Action_tile.lsp"))
(defun *error* (msg)
(princ "Error: ")
(princ msg)
(princ)
)
(defun readFunctionPrint (str / JO_file)
(if
(and
CUSTOM_FNAM
(setq JO_file (f_open CUSTOM_FNAM "a"))
)
(progn
(princ str JO_file)
(f_close JO_file)
)
)
)
(if (not f_close)
(progn
(setq f_close close)
(and (not f_open) (setq f_open open))
(setq close
(lambda (file / JO_file)
(if
(and
CUSTOM_FNAM
(setq JO_file (f_open CUSTOM_FNAM "a"))
)
(progn
(princ (strcat "(close " (vl-prin1-to-string file) ")") JO_file)
(princ "\n" JO_file)
(f_close JO_file)
)
)
(f_close file)
)
)
)
)
(if (not f_open)
(progn
(setq f_open open)
(and (not f_close) (setq f_close close))
(setq open
(lambda (key action / JO_file)
(if
(and
CUSTOM_FNAM
(setq JO_file (f_open CUSTOM_FNAM "a"))
)
(progn
(princ (strcat "(open " (vl-prin1-to-string key)) JO_file)
(princ " " JO_file)
(princ (strcat (vl-prin1-to-string action) ")") JO_file)
(princ "\n" JO_file)
(f_close JO_file)
)
)
(f_open key action)
)
)
)
)
(if (not f_action_tile)
(progn
(setq f_action_tile action_tile)
(setq action_tile
(lambda (key action / JO_file)
(if
(and
CUSTOM_FNAM
(setq JO_file (f_open CUSTOM_FNAM "a"))
)
(progn
(princ (strcat "(action_tile " (vl-prin1-to-string key)) JO_file)
(princ "\n\t" JO_file)
(princ (strcat (vl-prin1-to-string action) "\n)") JO_file)
(princ "\n" JO_file)
(f_close JO_file)
)
)
(f_action_tile key (strcat action "(readFunctionPrint (strcat \"(set_tile " key " $value) ; \" $value \"\n\"))"))
)
)
)
)
此代码将读取使用AutoLISP的对话框中的所有代码
AutoLISP的问题在于无法为函数创建可选参数。在.NET中,您可以这样做,这就是我在这里要做的。然而,我不熟悉C#。NET与AutoCAD进行交互,因此我正在努力。我需要找到一种方法,将函数名、参数及其执行后的结果导出为文本文件中的注释
我想要一种方法,可以简单地将函数作为参数提供给.NET函数。以匿名函数作为返回。此匿名函数将存储在原始函数的符号中。此函数将调用原始函数并将数据导出到文件
我正在尝试对.NET中的对象执行此操作,根据您的描述,似乎我无法对对象执行此任务。
使用列表。
使用列表。这对我的应用程序不起作用。我无法更改AutoDesk编写的代码。
使用列表。
这不适用于我的应用程序。我无法更改 AutoDesk 编写的代码。
您不必这样做,只需在调用本机函数之前进行预处理。
使用列表
这不适用于我的应用程序。我无法更改AutoDesk编写的代码
您不必这样做,只需在调用本机函数之前进行预处理即可
我希望更清楚,您是在谈论使用AutoLISP还是.NET
假设.NET,你的意思是我应该:
1获取结果缓冲区并遍历每个参数
2将每个参数放入列表
3返回列表?
我说的是口齿不清。虽然您可以执行上面的1..3,并且其中有许多实用程序,但我认为克服“不带可选参数的LISP函数”是过分的。
我说的是LISP。虽然你可以做上面的1..3,并且其中对很多事情都有实用性,但我认为克服“不接受可选参数的LISP函数”是过分的。
使用列表。
在我的应用程序中仍然无法做到这一点。如果没有允许可选参数的函数,我无法预处理此数据。
例如:
(done_dialog )
这个函数有两种组合。我无法在AutoLISP中创建函数来替换done_dialog。我无法使用 AutoLISP 来实现此时间段。您无法预处理此数据并将其放入列表中,因为用于预处理此数据的函数是固定数量的参数。
必须对此应用程序使用 .NET 才能创建允许可选参数的函数。这将允许执行像done_dialog这样的函数,并将其写入文本文件。
我相信有一种方法可以结合使用AutoLISP和.NET。 问题就在这里。给我看一个调用done_dialog的预处理的例子。
对不起,我仍然不相信。
我希望您将我在此的参与理解为试图澄清和帮助。
页:
[1]
2