Lisp Function 失败,尽管之前可以工作(Draft Sight、SVG 到 CAD)

Lisp Function fails, although working previously (Draft Sight, SVG to CAD)

我们正在尝试实施草稿 Sight/AutoCad 脚本,将 SVG 文件转换为 CAD 绘图。

主要思想是逐行读取文件(由 ReadSVGData 执行),按空格拆分 svg 定义(ReadHTMLItemData),将单个 HTML 属性读入列表并根据 SVG 项目的类型绘制 CAD 元素。关于校长就这么多了...

不寻常的部分是,每当 Html 属性,如 "id="Box_8_0"" 通过 attrlis 函数发送到 findchar 函数时,脚本失败,尽管同样的安排之前也很顺利

有人知道我的错误隐藏在哪里吗?

(defun findchar (FindChar Text) 

    (setq
        ;current location in string
        coord 1
        ;Init Return Coordinate
        ReturnCoord 0
        ;Length of Searched Item, to enable string searching
        FindCharLen (strlen FindChar)
        ;Nil Count: Requires as regular expressions like (/t) are identified as two times ascii char 9
        NilCnt 0
        ;Storage of last Char Ascii to identify regular expressions
        LastCharAsci -1
    )

    ;iterate the String and break in case of the first occurence
    (while (and (<= coord (strlen Text) ) (= ReturnCoord 0))
        ;Current Character
        (setq CurChar (substr Text coord FindCharLen))

        ;Find Searched String
        (if (= FindChar CurChar)
            (setq ReturnCoord coord)
        )

        ;Check for regular expression
        (if (and (= LastCharAsci 9) (= (ascii CurChar) 9))
            (setq NilCnt (+ NilCnt 1))
        )

        ;Update String position and String
        (setq LastCharAsci (ascii CurChar))
        (setq coord (+ coord 1))
    )
    ;return variable
    (- ReturnCoord NilCnt)
)


(defun attrlis (HTMLAttr)
    (setq Koordi 0)




    (progn
        (setq CharLoc (findchar "<" HTMLAttr))

        (princ HTMLAttr)
        (terpri)
    )

    (+ Koordi 1)
)

(defun ReadHTMLItemData(HTMLItem)

    (setq 
        coord 1
        HTMLItmBgn 1
        Attributes 0
        CurChar 0
        Dictionary 0

    )

    ;(princ HTMLItem)
    ;(terpri)
    (while (<= coord (strlen HTMLItem))

        (setq CurChar (substr HTMLItem coord 1))
        (if (or (= (ascii CurChar) 32) (= (ascii CurChar) 62))
            (progn
                (if (> (- coord HTMLItmBgn) 0)
                    (progn
                        (setq htmlattr (substr HTMLItem HTMLItmBgn (- coord HTMLItmBgn)))

                        (setq Result (attrlis htmlattr))

                        (princ Result)

                        (setq HTMLItmBgn (+ coord 1))
                    )
                )
            )
        )
        (setq coord (+ coord 1))
    )
)


(defun ReadLineContents(Line)
    (if (/= Line nil)
        (progn
            ;(princ Line)
            ;(terpri)

            (setq 

                Bgn (findchar "<" Line)
                End (findchar ">" Line)
                ItemDef (substr Line (+ Bgn (strlen "<"))  End)
            )

            (ReadHTMLItemData ItemDef)
        )
    )
)



(defun C:ReadSVGData()
    (setq SVGFile (open (getfiled "Select a file" "" "svg" 0) "r"))

    (setq Line 1)
    (while (/= Line nil)

        (setq Line (read-line SVGFile))
        (ReadLineContents Line)
    )

    (close SVGFile)

    (princ "Done")
)

正在读取以下文件:

<svg class="boxview" id="boxview" style="width:1198.56px; height:486.8004px; display:block;" viewBox="0 0 1198.56 486.8004">
<g id="BD_box">
    <rect class="box" id="Box_8_0" x="109.21" y="394.119" width="58.512" height="62.184" box="4047"></rect>
</g>
</svg>

编辑

根据 satraj 的回答更改子字符串索引

问题出在"substr" Autolisp函数的使用方式上。 substr 的起始索引总是从索引 1 开始(而不是从 0 开始)。因此必须更改您的代码,以便将起始索引初始化为 1。代码中的以下行失败。

(setq CurChar (substr HTMLItem coord 1))

(setq htmlattr (substr HTMLItem HTMLItmBgn (- coord HTMLItmBgn)))

由于 coord 和 HTMLItemBgn 变量被初始化为 0,substr 函数失败。

此外,如果要查找文本在字符串中的位置,为什么不使用“vl-string-search”函数呢?你可以去掉 findchar 函数。

一个例子:

(setq CharLoc (vl-string-search "<" HTMLAttr))

一般来说,如果你想在AutoLisp中调试失败,在你的lisp文件中添加以下函数,它会在失败的情况下打印堆栈跟踪,这将使你能够准确定位错误发生的位置。

(defun *error* (msg)
(vl-bt)
)