2015-07-02 17 views
0

我們正在嘗試實施一個Draft Sight/AutoCad腳本,它將SVG文件轉換爲CAD圖形。Lisp函數失敗,雖然以前工作(Draft Sight,SVG to 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的回答

+0

「腳本失敗」你能更精確一點嗎? –

+0

「腳本失敗」,表示DraftSight完全掛起,除了關閉它之外,沒有其他選項可供使用 – hsc

回答

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) 
) 
+0

感謝您的初始化錯誤。我已經改變了現在添加了一個條件,檢查coord和HTMLItmBgn變量之間是否存在差異。腳本失敗的問題仍然存在無論何時在attrlis中調用'(setq CharLoc(findchar「<」HTMLAttr))'失敗。當不調用findchar時,輸出正常工作。對「vl-」註釋的引用是完全正確的,但問題是腳本也支持在DraftSight中工作,因此所有這些漂亮的命令都不可用 – hsc

相關問題