gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:00:35 24 4
gpt4 key购买 nike

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

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

不寻常的部分是,每当通过 attrlis 函数将 Html 属性(如“id="Box_8_0"")发送到 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)
)

关于svg - Lisp Function 失败,尽管之前可以工作(Draft Sight、SVG 到 CAD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31178166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com