Nano Hash - криптовалюты, майнинг, программирование

Путь SVG анализируется неправильно: svgpathtools, Inkscape

Я пытаюсь получить массив точек на определенном пути (это чайник). Я сделал путь и экспортировал его с помощью программ «Inkscape» и «Gimp».

Я пытаюсь проанализировать файл svg (по сути, файл XML), используя библиотеку svgpathtools и особенно функцию parse_path. Нормальное поведение parse_path состоит в том, чтобы хорошо разобрать "d-строку" SVG и создать объект Path.

Однако я получаю сообщение об ошибке:

File (...)\parser.py", line 112, in parse_path
  control1 = float(elements.pop()) + float(elements.pop()) * 1j
  ValueError: could not convert string to float: 's'

Вот первые несколько строк файла SVG:

  <path id="Sélection"
        fill="none" stroke="black" stroke-width="1"
        d="M 1381.00,143.00
           C 1382.71,149.01 1394.44,175.21 1397.93,180.00
             1400.62,183.69 1402.89,185.74 1405.83,189.00
             1405.83,189.00 1429.69,216.00 1429.69,216.00
             [...]
             1403.00,127.29 1381.00,143.00 1381.00,143.00 Z
           M 2296.00,978.00
           C 2296.00,978.00 2293.17,942.00 2293.17,942.00
             2293.17,942.00 2288.72,891.00 2288.72,891.00
             2288.72,891.00 2276.88,838.00 2276.88,838.00
             [...]
             2315.00,967.85 2296.00,978.00 2296.00,978.00 Z
           M 326.00,1040.00" />

Файл состоит из 250 строк. Это проблемная часть моего кода:

path = svgpathtools.parse_path(filepath)

А вот и полная, неотредактированная ошибка

Traceback (most recent call last):
  File "c:\Users\vikto\.vscode\extensions\ms-python.python-2019.10.44104\pythonFiles\ptvsd_launcher.py", line 43, in <module>
    main(ptvsdArgs)
  File "c:\Users\vikto\.vscode\extensions\ms-python.python-2019.10.44104\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 432, in main
    run()
  File "c:\Users\vikto\.vscode\extensions\ms-python.python-2019.10.44104\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 316, in run_file
    runpy.run_path(target, run_name='__main__')
  File "C:\Users\vikto\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "C:\Users\vikto\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "C:\Users\vikto\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "c:\Users\vikto\Desktop\Best_Dossier_ever\Python\TeapotProj\TeapotProject.py", line 34, in <module>
    path = svgpathtools.parse_path(fpath)
  File "C:\Users\vikto\AppData\Local\Programs\Python\Python37-32\lib\site-packages\svgpathtools\parser.py", line 112, in parse_path
    control1 = float(elements.pop()) + float(elements.pop()) * 1j
ValueError: could not convert string to float: 's'

Я боюсь, что ошибка может быть связана с неправильным форматированием, так как функция CubicBezier имеет параметры start, control1, control2, end все в сложном формате a + bj. Вроде здесь меньше параметров!? Будет ли это Inkscape / Gimp, который плохо его форматирует (я в этом сомневаюсь)? Или что-то другое?

Веревка будет принята с благодарностью !!

26.11.2019

  • Если файл состоит из 250 строк, создайте минимально воспроизводимый пример, удалив все, что не способствует возникновению проблемы. и вместо этого опубликуйте этот код и опубликуйте его в форме, которая действительно ломается. Атрибут пути d не обязательно должен иметь длину 1000 символов: просто удалите части, которые не вызывают эту проблему, пока у вас в основном не будет формы <svg ...><path d="m 0 0 c 10 10 20 20 30 30"/></svg>, которая все еще вызывает ошибку, которую вы видите. Кроме того, вы получаете сообщение об ошибке could not convert string to float: 's', поэтому: покажите свой код. Что ты делаешь около линии 112? 27.11.2019
  • `@Mike'Pomax'Kamermans Отличное замечание! На самом деле ошибка не дает мне, где в файле возникает ошибка, а строка 112 соответствует файлу исходного кода библиотеки... Я также был совершенно не уверен, что я должен указать в вопросе.... 27.11.2019
  • это python: обычно вы получаете огромную трассировку стека, которая проходит через все, от библиотеки до вашего собственного кода, поэтому другое дело — опубликовать реальную ошибку, а не пытаться ее отредактировать. Что касается вашего отредактированного SVG: отредактируйте его дальше. Если что-то ломается на C, то наличие 20 из них буквально не имеет значения: просто возьмите один и убедитесь, что что-то все еще ломается с помощью этой единственной инструкции M + C. Не ломается? Круто, теперь вы знаете, что не является проблемой, и можете заглянуть глубже. 27.11.2019
  • Файл svg имеет только тег заголовка svg и тег пути, состоящий из всех вызовов CubicBezier с соответствующими точками. 27.11.2019
  • Похоже, что при избавлении от всех инструкций M+C, кроме одной, дается одно и то же ValueError: could not convert string to float: 's', мне может потребоваться проанализировать только тег path, поскольку s здесь может исходить из закрывающего тега </svg> 27.11.2019

Ответы:


1

Получил ответ! Здесь проблема заключалась в том, что я разбирал весь файл SVG, а не только часть «d-строки». Чтобы получить фактическую строку:

from xml.dom import minidom
mydoc = minidom.parse(file_path)
path_tag = mydoc.getElementsByTagName("path")
d_string = path_tag[0].attributes['d'].value
Path_elements = svgpathtools.parse_path(d_string)

Здесь Path_elements — это список объектов Path, определенных кривыми CubicBezier. Что касается «меньшего количества» точек, на самом деле конец одной кривой Безье является началом другой, поэтому нет необходимости в 5 параметрах, а только в 4 и начальной точке команды «М»!

Спасибо @Mike'Pomax'Kamermans за помощь!

26.11.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..