CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2023 开发者帮助

命令-s (AutoLISP)

2024-5-18 18:53| 发布者: admin| 查看: 91| 评论: 0|原作者: admin|来自: AutoCAD

命令-s (AutoLISP)

执行 AutoCAD 命令和提供的输入

支持的平台:Windows 和 Mac OS

签名

(command-s [cmdname [arguments ...]])
cmd名称

类型:字符串

要执行的命令的名称。

参数

类型:整数、实数、字符串或列表

要提供给正在执行的命令的命令输入。

命令函数的参数可以是字符串、实数、整数或点,如所执行命令的提示序列所预期的那样。空字符串 (“”) 等效于在键盘上按 Enter。

返回值

类型:

nil当命令在提供的参数上执行完毕时,由函数返回。当函数未能成功完成时,将返回 An。*error*

言论

有关详细信息,请参阅本主题后面的部分。

例子

以下示例演示如何执行 AutoCAD CIRCLE 命令并创建直径为 2.75 的圆。

Command: (command-s "._circle" "5,4" "_d" 2.75)
nil

下面的示例演示如何提示用户输入圆的中心点。

Command: (setq cPt (getpoint "\nSpecify center point: "))
(5.0 4.0 0.0)

Command: (command-s "._circle" cPt "_d" 2.75)
nil

以下是使用 command-s 函数提示用户输入的无效用法。

Command: (command-s "._circle" (getpoint "\nSpecify center point: ") "_d" 2.75)

与函数的区别Command

该函数是该函数的一个变体,它对命令令牌内容有一些限制,但比命令快,并且由于内部逻辑差异,可以在处理程序中使用。command-scommand*error*

命令令牌是提供给函数的单个参数。这可以是字符串、实数、整数、点、实体名称、列表等。以下示例显示了 AutoCAD LINE 命令和三个命令标记:command-s

(command-s "._line" "0,0" "5,7" "")

“-s”后缀代表所提供命令令牌的“子例程”执行。在此表单中,AutoCAD 直接从 AutoLISP 调用,在与主文档命令处理器不同的临时命令处理器中处理提供的命令标记,然后返回,从而终止临时命令处理器。正在执行的命令必须在同一函数中启动和完成。command-s

相比之下,该函数仍然是所提供命令令牌的“协程”执行,其中 AutoLISP 一次计算一个令牌,将结果发送到 AutoCAD,然后返回以允许 AutoCAD 处理该令牌。然后,AutoCAD 会回调 AutoLISP,AutoLISP 会恢复对正在进行的表达式的评估。在此逻辑流程中,后续标记表达式可以查询 AutoCAD 以获取先前标记处理的结果并加以使用。command

总之,命令令牌处理的“协程”风格在功能上更强大,但在运行时可以使用它的时间受到限制。命令令牌处理的“子例程”样式可以在更广泛的上下文中使用,但会提前处理所有命令令牌,并且实际执行是非交互式的。对于同一组命令令牌,函数要快得多。command-s

已知注意事项

使用该功能时,必须考虑以下几点:command-s

  • 在单个 command-s 表达式中馈送的令牌流必须表示完整的命令及其输入。当命令令牌全部处理完毕时,正在进行的任何命令都将被取消。以下内容对该函数无效:command-s
    (command-s "._line")
    (command-s "2,2" "12.25,9" "")
  • 所有命令令牌在移交给AutoCAD执行之前都会进行评估。相反,该函数实际上执行每个命令标记评估,然后将结果提供给 AutoCAD,AutoCAD 在处理下一个命令标记之前对其进行处理。command
  • 不得使用“暂停”命令标记。可以使用与图形区域或命令窗互的表达式,但在 AutoCAD 接收并处理其中任何一个表达式之前,将全部进行处理。

    以下内容对该函数无效:command-s

    (command-s "._line" "0,0" PAUSE "")
谨慎:尽管该函数与该函数类似,但如果输入 AutoLISP 表达式时已在进行 AutoCAD 命令,则使用 U 或 UNDO 回滚系统状态时应小心谨慎。在这种情况下,运行撤消的结果可能会导致正在进行的命令失败,甚至导致AutoCAD崩溃。command-scommand

*error*处理器

如果 *error* 处理程序使用该函数,请考虑使用以下方法更新定义自定义处理程序的方式:command*error*

  • command-s 替换 *error* 处理程序中的命令

    对于需要恢复程序的先前状态并执行一些批处理命令的典型处理程序情况,可以替换 .处理程序是从与往常相同的上下文中调用的。*error* (command-s <...>)(command <...>)*error*

    下面演示了使用该函数的基于处理程序:*error*command-s

    (defun my_err(s)
      (prompt "\nERROR: mycmd failed or was cancelled")
      (setvar "clayer" old_clayer)
      (command-s "._undo" "_e")
      (setq *error* mv_oer)
    )
    
    (defun c:mycmd ()
      (setq old_err *error*
            *error* my_err
            old_clayer (getvar "clayer")
      )
    
      (setq insPt (getpoint "\nSpecify text insertion: "))
    
      (if (/= insPt nil)
        (progn
          (command-s "._undo" "_be")
          (command-s "._-layer" "_m" "Text" "_C" "3" "" "")
          (command-s "._-text" insPt "" "0" "Sample Text")
          (command-s "._undo" "_e")
        )
      )
    
      (setvar "clayer" old_clayer)
      (setq *error* mv_oer)
     (princ)
    )
  • *error* 处理程序中保留命令函数的使用

    如果使用该函数不可行,则仍然可以使用该函数,但代价是无法访问处理时通常位于 AutoLISP 调用堆栈上的任何本地符号。command-scommand*error*

    下面概述了继续在处理程序中使用该函数所需的内容。command*error*

    • 使用自定义处理程序重写符号时,调用该函数以通知 AutoLISP 错误处理将与后续函数一起使用。*error**error**push-error-using-command*command
      注意:每当 AutoLISP 表达式计算开始时,AutoLISP 引擎都会假定处理程序中不允许该函数。command*error*
    • 如果处理程序引用 AutoLISP 程序失败或取消时 AutoLISP 堆栈上的本地符号,则必须删除这些引用,或使引用的符号成为全局符号。*error*

      AutoLISP 调用堆栈上的所有本地符号都会被推到范围之外,因为 AutoLISP 赋值器在进入处理程序之前会重置。*error*

    现在,可以在处理程序中使用该函数。command*error*

    但是,如果您的程序实际上在其操作过程中推送和弹出错误处理程序,或者可以在调用其他未知 AutoLISP 逻辑时调用 AutoLISP 逻辑,则可能需要执行更多步骤。

    • 还原旧的错误处理程序时,还要调用该函数以撤消对 or 函数的任何调用的效果。*pop-error-mode**push-error-using-command**push-error-using-stack*
    • 如果您的逻辑嵌套了处理程序的推送和弹出,并且处理程序已设置为通过调用来使用命令函数,而嵌套处理程序不会使用它,则可以通过在设置为当前处理程序的同一点调用来提供对 AutoLISP 堆栈上本地定义的符号的访问。如果完成此操作,则还必须在还原旧处理程序后调用。*error**error**push-error-using-command**push-error-using-stack**error**pop-error-mode**error*

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1   苏公网安备32011402011833)

GMT+8, 2024-12-15 22:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部