【问题标题】:AutoCAD .net API (in process) WIPOUTFRAME system variableAutoCAD .net API(处理中) WIPOUFRAME 系统变量
【发布时间】: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),您就启发了我再试一次。它现在起作用了!!!为了启发我的解决方案 +++

标签: c# object autocad


【解决方案1】:

已解决——如果不锁定应用程序并创建事务,API 将不会接受输入。

【讨论】:

    猜你喜欢
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多