Функция Lisp не работает, хотя раньше работала (Draft Sight, SVG в CAD)

Мы пытаемся реализовать сценарий Draft Sight/AutoCad, который преобразует файл SVG в чертеж САПР.

Основная идея состоит в том, чтобы прочитать файл построчно (выполняется с помощью ReadSVGData), разделить определения svg пробелами (ReadHTMLItemData), прочитать отдельные атрибуты HTML в список и на основе типа элемента SVG нарисовать элемент САПР. Так много о директоре...

Необычная часть заключается в том, что всякий раз, когда атрибуты Html, такие как «id = «Box_8_0»», отправляются в функцию findchar с помощью функции attrlis, сценарий терпит неудачу, хотя такая же договоренность работала задолго до

Кто-нибудь подскажет, где скрыта моя ошибка?

(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>

ИЗМЕНИТЬ

Изменение индекса подстроки на основе ответа Сатраджа


person hsc    schedule 02.07.2015    source источник
comment
сценарий терпит неудачу, не могли бы вы быть немного более точным?   -  person Daniel Jour    schedule 03.07.2015
comment
скрипт не работает, означает, что DraftSight полностью зависает, и, кроме его закрытия, других вариантов не остается   -  person hsc    schedule 06.07.2015


Ответы (1)


Проблема заключается в том, как используется функция Autolisp "substr". Начальный индекс 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)
)
person satraj    schedule 05.07.2015
comment
Спасибо за ошибку инициализации. Я изменил добавленное теперь условие, проверяющее наличие разницы между координатой и переменной HTMLItmBgn. Проблема со сбоем сценария остается всякий раз, когда вызов (setq CharLoc (findchar "<" HTMLAttr)) в attrlis завершается с ошибкой. Когда findchar не вызывается, вывод работает нормально. Ссылка на vl-комментарии полностью корректна, но проблема в том, что скрипт поддерживается и в DraftSight, поэтому все эти приятные команды недоступны - person hsc; 06.07.2015