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)
)
我们正在尝试实施草稿 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)
)