amarao (amarao_san) wrote,
amarao
amarao_san

Categories:

ура, покрыл

Я, кажется, покрыл все кейсы для getPath (прямые, кривые двух видов, круги, эллипсы, что-попало-для-дискретизации, fill). В свете этого я понял, что ошибался с моделью для класса path (M - move - это первый глагол для любой формы, которая не вырождается в другие теги (circle)).

Теперь надо понять, как это аккуратно закодить. С линией было всё просто - первая точка, M, дальше линии (L). А вот эллипс задаётся, например, двумя дугами (arc), которые тоже начинаются с M.

В класс "path" я заложил идею, что он сам знает, кто там 'M', а кто 'L'. Это сильно упрощает циклы в остальном коде, которым не надо теперь отдельно обрабатывать первую точку. Но у нас есть 'A' и прочие сложности....

Пожалуй, я оставлю этот принцип. add_line_point надо будет вызывать всегда в начале (для задачи 'M'), даже для дуг и кривых. Первая line_point (я правильно назвал это 'line point'?) становится 'M', остальные превращаются в 'L'.

... Второй вариант: add_line_point -> add_point(type, value), либо набор add_line_point, add_quardatic_point, add_arc_point, add_smooth_quadratic, etc. Первая точка всегда превращается в 'M' вне зависимости от типа.

.. Второй момент: есть места, где мне передают пачку точек. Может быть, я всегда буду принимать в класс список, а если кому-то надо передать одно значение - пусть [] его? Или добавить магии с автоопределением?

Пока что буду переписывать на add_?_points, видимо. Автодетект - вопрос открытый.

Отдельные две боли для меня:
1) Возврат круга как - в принципе, это же проблема getPath, а не Path. Ну будет у меня класс circle. Делать ли там общий класс над ними - вопрос открытый, ибо целиком libsvg я писать не собираюсь. И у меня батхёртит от отсутствия алгебраических типов в питоне. return -> Either(Circle, Path), ну круто же....

2) Кусок кода с определением "старая версия библиотеки". Буду химичить на тестах. Сейчас эта ветка вообще не может работать, потому что я случайно не добавил нужный импорт при переносе из Draft.py в getSVG.py.

UPD: В процессе борьбы за clarity, всё стало просто. Каждый метод называется по спекам (moveto, lineto, elliptical_arc, smooth_quadratic_bezier_curveto), у каждого своя конвенция по аргументам, но все они пишут в общий self.data. Поддерживается суммирование путей. Чуть-чуть сахара - первый lineto конвертируется в moveto автоматически. На выходе из контекстного менеджера проверяется, что есть moveto.

Вот код класса. За вычетом "pass" кусков, я открыт к предложениям.

https://github.com/amarao/FreeCAD/blob/3905d8974186aba43c90f429baa46a3fb8c1ad20/src/Mod/Draft/getSVG.py#L12
Tags: freecad, рефакторинг
Subscribe

  • План действий

    AAA при логине ведёт себя по разному в зависимости от того A это или AAAA.

  • Админский гольф

    Вам выдали шелл на сервер, на котором кто-то удалил все симлинки (т.е. файлы типа "симлинк"). Ваша задача починить сервер. Починенным сервер…

  • продолжая leetcode

    Первый раз я ощутил Силу. Задача - roman numerals, с обещанием, что на входе нет мусора. pub fn roman_to_int(s: String) -> i32 { let mut acc =…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 4 comments