【问题标题】:AutoLisp 2021 processing regex differently to 2019AutoLisp 2021 处理正则表达式与 2019 不同
【发布时间】:2020-09-12 17:38:04
【问题描述】:

我们有一个函数,通过输入粘贴反应器调用来处理绘图中的一些文本。我们从 2019 年迁移的脚本中使用 Autodesk 2021 得到了不同的结果,我无法弄清楚为什么会有差异。脚本如下:

;; GDD parser to remove unnecessary info from the paste to prepare for processing
;; Modified Lee mac's unformat function - removes formatting from a string
(defun GDD:removeinfo ( rgx str )
(if
    (null
        (vl-catch-all-error-p
            (setq str
                (apply
                   '(lambda nil
                        (vlax-put-property rgx 'global     actrue)
                        (vlax-put-property rgx 'multiline  actrue)
                        (vlax-put-property rgx 'ignorecase acfalse) 
                        (foreach pair
                           '(
                                ("\\032"     . "\\\\\\\\")
                                ("\n"        . "\\\\P")
                                ("$1"       . "\\\\(\\\\[ACcFfHKkLlOopQTW])|\\\\[ACcFfHKkLlOopQTW][^\\\\;]*;|\\\\;[ACcFfKkHLlOopQTW]")
                                ("$1$2/$3"  . "([^\\\\])\\\\S([^;]*)[/#\\^]([^;]*);")
                                ("$1$2"     . "\\\\(\\\\S)|[\\\\](})|}")
                                ("$1"       . "[\\\\]({)|{")
                                ("\\$1$2$3" . "(\\\\[ACcFfHKkLlOoPpQSTW])|({)|(})")
                                ("\\\\"     . "\032")
                                ;; Added from LMs original quickunformat
                                (""     . "(?:.*\\n)*Const\\s+.*\\n")
                                (""     . "\\w\\w\\d?\\s+\\d+\\s\\d+-\\d+-\\d+")
                                (""     . "^\\s+\\n")
                            )
                            (vlax-put-property rgx 'pattern (cdr pair))
                            (setq str (vlax-invoke rgx 'replace str (car pair)))
                        )
                    ) nil
                )
            )
        )
    )
    str
    (prompt (strcat "\nError: " (vl-catch-all-error-message str)))
)
)

粘贴的输入字符串是:

Ranford Rd, Perth WA, Australia
Clear Markers

-3773641.56683170, 12902093.08140300 | 0, 01 feature(s) selected on 1 layer(s)1:
2256.9944
979.35 x 559.54 m

Attribute   Value
SUBTYPE ROUTE
ATTRIBUTE   
TLS_ID              15006025041
Date                30-06-1997
Length              231.0
Shared              NO
Const               MULTI-CONDUIT
                AA     P100  312F   -       SMOF    FNPEHJC/STDCNVL F CNVL 4701:CNVL AD-CNVL AE/1-312
                             312F   -       SMOF    FNPEHJ/STD CNVL F HILN 4602:CNVL AE-CNVL BW/1-312
                             120F   -       SMOF    FNPEHJ/STD CNVL F BATA 1001:CNVL AE-CNVL CR/1-120
                             24F    -       SMOF    FNPEHJ     CNVL F CNVL 1001:CNVL AD-CNVL AE/1-24
                             12F    -       SMOF    FNPEHJC/STDCNVL F BATA 1001:CNVL DL-CNVL HX/1-12
                AB     P100  200    0.40    CPFUT   MB      CNVL CA1:B1901-2100
AA                  15038127628 30-06-1997
AB                  15038127629 30-06-1997

函数中的输出(for str)应该是:

                AA     P100  312F   -       SMOF    FNPEHJC/STDCNVL F CNVL 4701:CNVL AD-CNVL AE/1-312
                             312F   -       SMOF    FNPEHJ/STD CNVL F HILN 4602:CNVL AE-CNVL BW/1-312
                             120F   -       SMOF    FNPEHJ/STD CNVL F BATA 1001:CNVL AE-CNVL CR/1-120
                             24F    -       SMOF    FNPEHJ     CNVL F CNVL 1001:CNVL AD-CNVL AE/1-24
                             12F    -       SMOF    FNPEHJC/STDCNVL F BATA 1001:CNVL DL-CNVL HX/1-12
                AB     P100  200    0.40    CPFUT   MB      CNVL CA1:B1901-2100

但是,当我们在 Autodesk 2021 中使用相同输入处理此函数时,输出(对于 str)为:

Ranford Rd, Perth WA, Australia

看起来函数错误或在它接收并退出的第一个换行符处返回,尽管在调试器中我可以看到正在处理的正则表达式对。我不知道为什么新版本有什么不同?非常感谢您的帮助。

【问题讨论】:

  • 这可能是在黑暗中拍摄,但请尝试在设置 LISPSYS=0 并重新启动 AutoCAD 2021 后运行它。
  • @LeeMac Spot 是个好主意并修复了它。我使用 Visual Studio Code (VSCODE) 作为我的调试器,因为它更易于使用并且似乎比 VLIDE 效果更好,尤其是在附加进程时(对于像我这样的新手)。我注意到在查看 Autodesk 的此注册表设置的解释时,vscode 使用 Unicode 而 vlide 没有,因此这将导致迁移正则表达式程序出现问题,我相信我不会是唯一一个。您能否写一个答案,我可以接受。再次感谢。

标签: autodesk autolisp


【解决方案1】:

这是由于 AutoCAD 2021 中引入了新的 AutoLISP Unicode 字符支持,同时引入了 VS Code 作为主要 AutoLISP 编辑器。

要恢复 AutoCAD 2020 及更早版本的行为,您可以将新的 LISPSYS 系统变量设置为 0

LISPSYS(系统变量)

控制默认 AutoLISP 开发环境和编辑器 使用 VLISP 命令启动。


0

Visual LISP IDE (VLIDE) 被设置为默认编辑器,但是 AutoLISP 函数不完全支持 Unicode 字符。 AutoLISP 源 (LSP) 文件在保存和编译时使用 ASCII (MBCS) 字符集。注意:此设置会导致 AutoCAD 2020 及更早版本的行为,并且仅在 Windows 上受支持。


1

Visual Studio (VS) Code 设置为默认编辑器和 AutoLISP 函数完全支持 Unicode 字符。 AutoLISP 源 (LSP) 文件在保存时使用 VS Code 中的编码集,在编译时使用 Unicode 字符集。


2

Visual Studio (VS) Code 设置为默认编辑器和 AutoLISP 函数完全支持 Unicode 字符。 AutoLISP 源 (LSP) 文件在保存时使用 VS Code 中的编码集,在编译时使用 ASCII (MBCS) 字符集。

【讨论】:

  • 我也尝试了 LISPSYS=2 以查看是否可以同时拥有 - vscode 和 ascii 字符,但它不起作用。如果 Autodesk 可以选择允许使用 vscode IDE 进行 ascii 处理,那就太好了。或者,看看我们是否可以改进这些例程以正确处理 Unicode。
  • 尝试 LISPSYS=2 并将有问题的 AutoLISP 代码编译为优化的 FAS - 根据文档,这应该会产生您想要的结果。
猜你喜欢
  • 2021-11-09
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2019-04-29
  • 2011-09-14
相关资源
最近更新 更多