jtoverka 发表于 2019-9-20 10:11:38

创建编程对象

每次我(在谷歌上)搜索这个,我都会得到“如何创建线条对象”或类似的东西。我不想制作AutoCAD对象。我想从C#NET中定义的类创建对象。从LISP中,我想使用vlax创建对象或类似的东西来创建对象。此外,将vlax put属性、vlax get属性和vlax invoke方法用于此对象(或其他等效对象)。
**** Hidden Message *****

MickD 发表于 2019-9-20 19:23:44

这是一个起点: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类。

jtoverka 发表于 2019-9-28 10:49:49

因此,我的最终目标是将这些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中的对象执行此操作,根据您的描述,似乎我无法对对象执行此任务。

jtoverka 发表于 2019-9-28 10:55:55


使用列表。

jtoverka 发表于 2019-9-28 11:04:59


使用列表。这对我的应用程序不起作用。我无法更改AutoDesk编写的代码。

jtoverka 发表于 2019-9-28 11:10:02


使用列表。

这不适用于我的应用程序。我无法更改 AutoDesk 编写的代码。

您不必这样做,只需在调用本机函数之前进行预处理。

jtoverka 发表于 2019-9-28 11:19:49


使用列表

这不适用于我的应用程序。我无法更改AutoDesk编写的代码

您不必这样做,只需在调用本机函数之前进行预处理即可

我希望更清楚,您是在谈论使用AutoLISP还是.NET
假设.NET,你的意思是我应该:
1获取结果缓冲区并遍历每个参数
2将每个参数放入列表
3返回列表?

jtoverka 发表于 2019-9-28 11:25:53


我说的是口齿不清。虽然您可以执行上面的1..3,并且其中有许多实用程序,但我认为克服“不带可选参数的LISP函数”是过分的。

MickD 发表于 2019-9-28 11:41:49


我说的是LISP。虽然你可以做上面的1..3,并且其中对很多事情都有实用性,但我认为克服“不接受可选参数的LISP函数”是过分的。

使用列表。

在我的应用程序中仍然无法做到这一点。如果没有允许可选参数的函数,我无法预处理此数据。
例如:
(done_dialog )

这个函数有两种组合。我无法在AutoLISP中创建函数来替换done_dialog。我无法使用 AutoLISP 来实现此时间段。您无法预处理此数据并将其放入列表中,因为用于预处理此数据的函数是固定数量的参数。
必须对此应用程序使用 .NET 才能创建允许可选参数的函数。这将允许执行像done_dialog这样的函数,并将其写入文本文件。
我相信有一种方法可以结合使用AutoLISP和.NET。

jtoverka 发表于 2019-9-28 11:52:42

问题就在这里。给我看一个调用done_dialog的预处理的例子。
对不起,我仍然不相信。
我希望您将我在此的参与理解为试图澄清和帮助。
页: [1] 2
查看完整版本: 创建编程对象