0

SVG ファイルを CAD 図面に変換する Draft Sight/AutoCad スクリプトを実装しようとしています。

主な考え方は、ファイルを 1 行ずつ読み取り (ReadSVGData によって実行)、svg 定義をスペースで分割し (ReadHTMLItemData)、個々の HTML 属性をリストに読み取り、SVG アイテムのタイプに基づいて CAD 要素を描画することです。校長に関してはそんなに...

珍しい部分は、"id="Box_8_0"" のような Html 属性が 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>

編集

サトラジの回答に基づく部分文字列インデックスの変更

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 に答える