0

我们正在尝试实现一个 Draft 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的回答

4

1 回答 1

1

问题在于“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)
)
于 2015-07-05T06:16:50.540 回答