【发布时间】:2017-04-14 21:57:02
【问题描述】:
AutoCAD 有一种通过其 API 更改系统变量的绝妙方法
Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable(字符串,对象)
字符串是系统变量名——在我的例子中是“WIPEOUTFRAME”
对象就是设置——我想把它设置为0。
我已经将该方法用于其他系统变量并且它有效,但不是这个。
相反,我在运行时收到 eInvalidInput 错误。
我已经验证了 WIPEOUTFRAME 是正确的(我可以通过 autoCAD 中的命令行进行设置)并且我验证了该值为 0。
我还使用了 GetSystemVariable(string) 方法,该方法将设置作为对象返回,以验证程序是否理解 WIPEOUTFRAME,并且它可以返回值 0。确实如此。另外,我已经确认了它返回的对象类型:INT16。
我还将 GetSystemVariable 返回的对象传递给 SetSystemVariable 并且它有效!即使我确保 WIPEOUTFRAME 的值为 0。这是我唯一一次让该方法起作用。但当然,我想将值从 1 更改为 0,因此虽然它确认该方法可以工作,但传递相同的对象并不能帮助我更改值。
我尝试将值 0 作为对象、int16 对象、简单的 0、作为字符串等传递给参数...没有成功。
这可能是 API 中的错误,或者谁能告诉我我缺少什么?
【问题讨论】:
-
我使用另一个 C# 语言的 CAD,它有一个奇怪的 COM 接口。我最终编写了蛮力测试来弄清楚所有未记录的功能是如何工作的。您可能会尝试使用其他数字类型甚至只是字符串“0”(即使它看起来是一个 int16),尝试设置它多次(可能在尝试之间有延迟)等。在少数情况下,我找到了让事情变得毫无意义的方法;但是,它们可以可靠地重现,所以我创建了一个围绕 COM 接口的包装类,并做了那些奇怪的事情。
-
在少数情况下,我无法弄清楚如何设置变量的值——系统就是不让我这样做。但是,我确实想出了如何将任意代码写入“计算器”块中,以便我可以随时运行模拟;所以,我在模拟的正确位置制作了一些计算器块,然后我将它们的代码重写为一系列变量赋值命令。绝对是一个 hack,但它允许我更改变量值。
-
您可能还需要满足其他条件,例如它可能不允许您在模拟运行时更改值(不确定这是否是您正在使用的特定包中的有效概念),或者该变量可能只是实际存储它的另一个位置的别名。
-
感谢@Nat 的cmets。正如我所提到的,这是进程内代码,我尝试了很多类型,但都没有奏效。然而——虽然没有模拟,但有代码必须接受和提交的事务。我尝试过使用交易,但没有成功。既然我已经获得了所需的确切类型 (Int16),您就启发了我再试一次。它现在起作用了!!!为了启发我的解决方案 +++