Форум программистов, компьютерный форум, киберфорум
Наши страницы
Комментарии
Войти
Регистрация
Восстановить пароль
"Орешек знаний тверд, Но все же мы не привыкли отступать..." (с)
  1. Старый комментарий
    Аватар для ashsvis
    Шаг 6 (графический векторный редактор). Изменение формы фигуры путём перетаскивания узловых маркеров

    Выложено на github.com

    Версия редактора из этой категории выложена по адресу: https://github.com/ashsvis/SimpleVectorGraphicsEditor

    И далее поддерживаться не будет, ибо нарабатывается более крутая и правильная версия в теме:
    http://www.cyberforum.ru/windows-forms/thread2352217.html#post13063894
    Запись от ashsvis размещена 16.11.2018 в 19:30 ashsvis вне форума
  2. Старый комментарий
    Запись от ashsvis размещена 16.11.2018 в 05:29 ashsvis вне форума
    Обновил(-а) ashsvis 16.11.2018 в 06:57 (Добавил ссылку на тему)
  3. Старый комментарий
    Аватар для Storm23
    Шаг 8 (Рефакторинг ГВР) Версия 0.2
    Гм... ну если кратко, то все фигня
    Кажется даже стало хуже, чем предыдущая версия.
    Куча ненужных классов, куча непонятных интерфейсов. Класс Figure это вообще феерия
    Бесконечные
    C#
    1
    2
    3
    
    if (marker is BottomMiddleSizeMarker) ... else
    if (marker is BottomRightSizeMarker) ... else
    if (marker is MiddleLeftSizeMarker) ... else
    что однозначно свидетельствует о неправильной модели классов. Брр....
    Вы очень спешите писать код. Сначала нужно разработать простую и гибкую модель. И потом уже писать все остальное. У вас же свалка.
    В общем мне даже лень это все разбирать. Тут работать и работать.
    Если есть желание разобраться с архитектурой - создайте тему на форуме. Формат блога тут не очень подходит.
    Запись от Storm23 размещена 15.11.2018 в 21:05 Storm23 вне форума
  4. Старый комментарий
    Аватар для ashsvis
    Шаг 6 (графический векторный редактор). Изменение формы фигуры путём перетаскивания узловых маркеров
    Спасибо за совет. Про гитхаб слышал, но никогда не пользовался. Буду двигаться в этом направлении...
    Запись от ashsvis размещена 15.11.2018 в 06:49 ashsvis вне форума
  5. Старый комментарий
    Аватар для Usaga
    Шаг 6 (графический векторный редактор). Изменение формы фигуры путём перетаскивания узловых маркеров
    GITHUB удобен вам, ибо это как никак, VCS. И пользователям удобен, ибо можно Issues заводить с багами, а так же следить за развитием проекта.
    Запись от Usaga размещена 15.11.2018 в 06:38 Usaga вне форума
  6. Старый комментарий
    Аватар для Storm23
    Шаг 6 (графический векторный редактор). Изменение формы фигуры путём перетаскивания узловых маркеров
    Цитата:
    а гитхаб зачем
    Во-первых, можно читать исходник не качая весь проект, что удобно.
    Во-вторых, можно указать строку кода непосредственно ссылкой.
    Ну и в-третьих, можно выкатывать обновления. Как вам так и другим.
    Запись от Storm23 размещена 14.11.2018 в 21:06 Storm23 вне форума
  7. Старый комментарий
    Аватар для ashsvis
    Шаг 6 (графический векторный редактор). Изменение формы фигуры путём перетаскивания узловых маркеров
    netBool, "шедевр" в процессе разработки, а гитхаб зачем?, тут обновления и получите, если таковые будут.
    Запись от ashsvis размещена 14.11.2018 в 17:52 ashsvis вне форума
  8. Старый комментарий
    Запись от netBool размещена 14.11.2018 в 16:33 netBool вне форума
  9. Старый комментарий
    Аватар для Storm23
    Шаг 7 (графический векторный редактор) Версия 0.1
    Цитата:
    undo/redo (без команд) - дайте ссылочку, где посмотреть по-подробнее.
    Паттерн команда. Также здесь.
    Цитата:
    Нужен только необходимый функционал. А "мясо" нарастает со временем.
    Дело в том, что у вас нельзя нарастить мясо. Модель не позволяет. Посмотрите как у вас отрисовка происходит:
    C#
    1
    2
    3
    4
    
                    if (kind == DrawingKind.Polygon)
                        graphics.DrawPolygon(pen, points); // рисование контура
                    else
                        graphics.DrawLines(pen, points);
    И таких фрагментов по программе раскидано десяток. Если, допустим, вы добавите отрисовку окружностей, вы во всех местах будете писать такой паровоз:
    C#
    1
    2
    3
    4
    5
    6
    7
    
                    if (kind == DrawingKind.Polygon)
                        graphics.DrawPolygon(pen, points); // рисование контура
                    else
                    if (kind == DrawingKind.Circle)
                        graphics.DrawEllipse(pen, ...); // рисование окружности
                    else
                        graphics.DrawLines(pen, points);
    Во всех тринадцати местах?

    Я потому особо и не критиковал предыдущий код, потому что его придется почти полностью переписать, как только вы решите нарастить функционал. Поэтому текущий код все равно в мусорку уйдет, и рассматривать его нет смысла.
    Ну а если ограничится рисованием только прямоугольников, то можно наверное оставить как есть... И так сойдет

    Цитата:
    Главное, чтобы это было кому-то нужным.
    Исходите из аксиомы, что это никому не нужно
    Я таких статей тут десяток накропал, отдача - почти нулевая.
    Этот форум для студентов-двоечников. Максимум что они сделают - это скачают ваш проект и сдадут как лабу. Это все.
    Запись от Storm23 размещена 13.11.2018 в 21:19 Storm23 вне форума
    Обновил(-а) Storm23 13.11.2018 в 21:23
  10. Старый комментарий
    Аватар для ashsvis
    Шаг 7 (графический векторный редактор) Версия 0.1
    undo/redo (без команд) - дайте ссылочку, где посмотреть по-подробнее.
    функционал очень бедный - у меня нет цели "переплюнуть" векторные редакторы на рынке. Нужен только необходимый функционал. А "мясо" нарастает со временем. Главное, чтобы это было кому-то нужным.
    Даже нет окружности - да не успел я пока, надо перенести из проектов...

    О переносе маркеров в фигуры. - если переносим маркеры, то и рисовать себя фигура должна сама. Я так думаю.
    Цитата:
    добавить элементарный набор фигур
    Сделаю.
    Запись от ashsvis размещена 13.11.2018 в 20:36 ashsvis вне форума
  11. Старый комментарий
    Аватар для Storm23
    Шаг 7 (графический векторный редактор) Версия 0.1
    Работает нормально (плюс-минус), но вот техническая реализация - не очень.
    Много повторяющегося кода, примитивное undo/redo (без команд), объектная модель рассыпется как только нужно будет добавить больше функционала. А функционал очень бедный. Даже нет окружности, не говоря уже о более сложном.

    Цитата:
    дополнять код редактора всякими инструментами
    Сначала бы неплохо было бы добавить элементарный набор фигур, хотя бы уровня Paint.
    Запись от Storm23 размещена 13.11.2018 в 20:23 Storm23 вне форума
  12. Старый комментарий
    Аватар для ashsvis
    Шаг 7 (графический векторный редактор) Версия 0.1

    Как думаете?

    Есть предложение код классов поместить в dll, а код формы в UserControl и тоже в dll. Так будет удобнее таскать из проекта в проект...
    Запись от ashsvis размещена 13.11.2018 в 14:28 ashsvis вне форума
  13. Старый комментарий
    Аватар для ashsvis
    Шаг 6 (графический векторный редактор). Изменение формы фигуры путём перетаскивания узловых маркеров
    Storm23,
    1. Согласен, типов маркеров должно быть больше и к этом я буду приходить, конечно.
    Цитата:
    много кода в интерфейсе
    Цель моих статей не только в том, чтобы показать другим, как решал проблему я, но и получить опыт общения от более
    опытных коллег. Приложение фактически строится наряду с написанием статей, несколько обгоняя их (дня на три).
    Конечно используются два - три проекта из "ящика стола". Поэтому код для выкладки ещё "сыроват" для выкладки.
    Постараюсь выложить в следующей статье.

    И ещё я таким образом хочу привести в порядок программный код по этой теме. На самом деле я получаю большой кайф
    от всего этого процесса в целом.
    Запись от ashsvis размещена 12.11.2018 в 21:13 ashsvis вне форума
  14. Старый комментарий
    Аватар для Storm23
    Шаг 6 (графический векторный редактор). Изменение формы фигуры путём перетаскивания узловых маркеров
    ashsvis,
    1) Маркер должен быть отдельным объектом. Вот эти все индексы, отрицательные индексы - это все фтопку. Должен быть просто список маркеров. Индексы с непонятной семантикой - зачем??
    2) Удаление и добавление точек в фигуру - должны быть внутренними методами фигур. Ибо инкапсуляция. И вообще у вас очень много кода в интерфейсе. Это нехорошо.

    Ну и вообще все это по-другому нужно было бы делать. Маркеры должны давать сами фигуры. Потому что только они знают какие маркеры для них нужны, и как реагировать на передвижение маркеров.
    Например, квадрат можно тянуть только за правый нижний маркер, потому что квадрат нельзя растягивать по ширине или высоте. Круг например, нет смысла вращать, поэтому круг бы не возвращал маркер вращения (впрочем его у вас и так нет, да и круга тоже).
    Добавление и удаление точек тоже не имеет смысла, если это квадрат или окружность. И так далее.
    Смысл в том, что только сама фигура знает как должны работать маркеры для нее. Интерфейс же должен только получать список маркеров от фигуры и возвращать в фигуру передвижение маркеров.

    Да, и еще. Чисто методологически. Если вы пишите о коде, нужно выкладывать этот код. Я имею ввиду проект целиком, в котором можно поковыряться, посмотреть, потестить, подумать. Это же не лекция по абстрактным наукам. Здесь нужно пробовать руками. Иначе все это не имеет смысла.
    Запись от Storm23 размещена 12.11.2018 в 20:42 Storm23 вне форума
    Обновил(-а) Storm23 12.11.2018 в 20:46
  15. Старый комментарий
    Аватар для ashsvis
    Шаг третий (графический векторный редактор). Тестовая расстановка фигур
    Цитата:
    А окружности в вашем редакторе рисовать нельзя?
    Если окружность представить как правильный выпуклый многоугольник с достаточным количеством вершин, то можно.
    Если добавить поддержку кривых Безье, то окружность можно задавать шестью точками (где-то видел примерчик).
    Запись от ashsvis размещена 09.11.2018 в 21:56 ashsvis вне форума
  16. Старый комментарий
    Аватар для Storm23
    Шаг третий (графический векторный редактор). Тестовая расстановка фигур
    А окружности в вашем редакторе рисовать нельзя?
    Запись от Storm23 размещена 09.11.2018 в 21:41 Storm23 вне форума
  17. Старый комментарий
    Аватар для ashsvis
    Шаг второй (работа над ошибками)
    Цитата:
    Stroke и Fill ... ничего не делают. Они не нужны
    Ну это сейчас они ничего не делают, а когда потребуется применить более "мощные" настройки, например, для кисти.
    Ведь благодаря упрощению я уже потерял часть функционала с градиентной заливкой. Для градиентной кисти используется
    другой класс, не SolidBrush, а в объекте Fill я мог бы их совместить.
    Цитата:
    что это за извращение с Onebuff?
    Мдя, смотрится довольно коряво, это мой метод попадания курсора на тонкую линию...

    Да, будем исправлять. Большое спасибо за критический взгляд со стороны! Это поможет мне сделать продукт качественнее.
    Запись от ashsvis размещена 08.11.2018 в 18:36 ashsvis вне форума
    Обновил(-а) ashsvis 08.11.2018 в 18:38
  18. Старый комментарий
    Аватар для Storm23
    Шаг второй (работа над ошибками)
    Ну и видно, что Stroke и Fill просто переприсваивают свойства для Pen и Brush. То есть ничего не делают. Они не нужны.

    И что это за извращение с Onebuff? Это вообще зачем?
    У GraphicsPath (который кстати я предлагал сделать внешним свойством и рисовать именно его, а не поточечно) есть метод IsOutlibeVisible который может проверять как точки лежащие внутри замкнутой фигуры, так и точки находящиеся на границе фигуры или линии.


    Да и еще, зачем же свойства называть GetPen? Это просто Pen.
    Это методы должны быть с глаголом, а свойства - не обязательно.


    А вообще, заметьте, вы сделали три класса. Но они почти ничего не делают. Вот увидите, после рефакторинга, все что останется от ваших классов будет что-то типа:
    C#
    1
    2
    3
    4
    5
    
    abstract class Polygon
    {
        public List<PointF> Points {get;}
        public abstract GraphicsPath {get;}
    }
    И все. Потому что это реально что делают ваши классы - хранят точки. Они больше ничего не делают, и не нужно им так много кода.
    А вы пишите уже третью статью. Хотя могли просто написать четыре строчки выше и пойти дальше.
    KISS
    Запись от Storm23 размещена 08.11.2018 в 18:19 Storm23 вне форума
    Обновил(-а) Storm23 08.11.2018 в 18:28
  19. Старый комментарий
    Аватар для Storm23
    Шаг второй (продолжение). Спутники базового класса.
    По поводу пунктов 1, 2, 6 и возможно 3:
    Все дело в том, что вы завязываетесь на пользовательский интерфейс.
    При разработке базисного движка нужно сосредоточится на функционале движка. Вы же думаете не о движке, а о том как вы сделаете GUI. А это неправильно. Модель не должна зависеть от интерфейса. Если что-то плохо ложится на интерфейс, это проблемы интерфейса, а не движка. Значит нужно будет разработать адаптеры для связки вашего UI и движка. Но засовывать явно интерфейсные вещи в движок - неправильно.

    3) Не то что бы устарело, но я бы использовал либо сериализацию, либо struct. Почему? Потому что вы забудете в Assign присвоить какое-то поле, и при клонировании будет неуловимый баг.

    5) Обратите внимание, что хранение точек (или любого графического контента вообще) и отрисовка - это разные задачи. И из принципа единственной ответственности, лучше разнести этот функционал по разным классам.
    Запись от Storm23 размещена 08.11.2018 в 03:14 Storm23 вне форума
  20. Старый комментарий
    Аватар для ashsvis
    Шаг второй (продолжение). Спутники базового класса.
    Спасибо за комментарий. Попытаюсь объяснить, что мною двигало, когда создавал такие классы:
    1) Я предполагал (вернее существует некое приложение, где это выполнено), что настройка свойств для
    рисования будет происходит в отдельных формах. Своя форма для Stroke и своя для Fill. Формы эти общие для
    любого объекта от класса Drawing.
    Форма "Свойства линии фигуры"
    Форма "Свойства фона фигуры"
    Поэтому я посчитал, что нужны классы - оболочки над Pen и Bush.
    2) Такие методы появились от попытки соединить несколько настроек в единый список, и поскольку, первые два места
    настройки заливки были заняты под "Прозрачный" и "Сплошной", то стили с градиентами занимают 4 места, а далее -
    стили со штриховкой. Отсюда эта ужасная волшебная цифра 2.
    3) Да, мне нужен был метод, который тупо копирует все поля класса, и без всякой сериализации (это устарело?)
    4) Согласен, буду дорабатывать.
    5) Это тоже надо осмыслить. Дайте время. По поводу названия, Polygon я хотел использовать как имя класса наследника
    для замкнутых фигур. Хотя фигуру можно как замкнуть, так и разомкнуть, превратив её в линию. Вообщем, Drawing наверное
    не совсем удачное название, но точно не Polygon.
    6) Да, не место, но индекс так сильно связан с этим списком стилей и не охота его потерять. Да, нужно это править.
    Запись от ashsvis размещена 07.11.2018 в 19:15 ashsvis вне форума
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru