nabbla (nabbla1) wrote,
nabbla
nabbla1

Category:

Древовидный undo: баги и фичи

Хвалился коллегам, какую штуку я забабахал с параллельными вселенными и сразу же словил визит-эффект: сначала одному показывал и на каком-то моменте программа выгрузилась с ошибкой, потом как будто бы исправил, стал хвастаться второму коллеге и снова вывалилась, почти на том же месте.

Сейчас старые ошибки исправлены и добавлены еще некоторые "навороты":
- ничего не делающие "информационные" команды. Они добавляются, например, при сохранении проекта или экспорта данных из него, но хочу сделать возможность добавлять их самим пользователем, чтобы потом можно было легко переходить по ключевым точкам.



К сожалению, до сих пор не знаю, как поступать, если мы откатились на много шагов назад и нажали "сохранить". В дерево будет добавлена запись "сохранено такого-то числа", но она создаст новую ветвь, хотя мы прошлое никоим образом не меняли. Может, лучше будет вставить ее между двумя соседними или новую ветвь сразу же сомкнуть назад, чтобы какой бы ветвью мы не шли, попадали бы туда же.

- При выполнении любого действия сначала проверяется - может быть, на одной из ветвей вслед за текущим состоянием следовало в точности такое же действие? Если так, вместо ветвления и добавления новой команды попросту выполняется переход на один шаг по нужной ветви. Довольно частая ситуация, кстати. Скажем, нажали Ctrl-V, испугались, отменили (Ctrl-Z), потом решили - а пусть будет и снова нажали Ctrl-V. Если содержание буфера обмена с тех пор не поменялось, то на деле будет выполнено Redo, а иначе на ровном месте пошло бы ветвление. Функция, сравнивающая две команды, называется EqualByAnyOtherName, т.е игнорируется имя команды, ссылки next,prev и branch, флаги ActiveBranch и TurnLeft. Остальные данные, передаваемые при сериализации, должны совпадать один-в-один.

Конкретные команды могут иметь свою реализацию EqualsByAnyOtherName, поскольку сериализация может быть довольно долгой. У меня команда загрузки изображения выполняет сначала сравнение размеров картинок, а потом сравнение строк попиксельно, благо, строка занимает последовательные ячейки памяти. Сериализация с ужатием каждой картинки в png работала гораздо медленнее.

До сих пор удивляюсь, как оно заработало практически с первого раза.

Еще любопытные плюшки в этой библиотеке:
- сохранили проект, кнопка "сохранить" стала неактивной. Отменили несколько действий или перешли на другую ветвь - она стала активной. Вернулись в исходную точку - снова "погасла", помнит!
- точно так же, если в дереве истории нет ничего, кроме корня ("ветвь создана такого-то числа, в такое-то время"), то не работет кнопка "новый проект". А зачем, если он и так новый;
- если проект сохраняется под другим именем, появляется запись в истории "сохранено как %filename%", а если предыдущее сохранение в данной ветви было под тем же именем, то просто "сохранено";
- вообще, в любой записи с указанием даты и времени, дата лишь в том случае указывается, если она поменялась с прошлого раза, иначе пишется только время.

На очереди "умное сохранение" с возможностью произвести слияние несколько проектов, и на этом можно будет остановиться, изобретать svn я не хочу.


Эх, как чешутся руки применить все это безобразие, написав свой собственный симулятор электронных схем, с "платоновскими элементами" и гальваническими развязками. То есть, анализ каждой схемы начинается с разбора упрощенной схемы, где элементы заменены идеальными: диоды совсем не проводят в одну сторону и проводят в другую без падения напряжения, операционники имеют бесконечное входное сопротивление и нулевое выходное, и т.д. Если такая идеальная схема имеет "патологии" - висящие в воздухе выводы, короткое замыкание или выброс напряжения - программа уже "выругается". А моделировала бы реальные диоды с обратным током, включенные как защитные в ОУ на полевых транзисторах, молчала бы как партизан! С другой стороны, если несколько цепей полностью развязаны друг от друга, моя программа с чистой совестью покажет напряжение между любыми двумя точками первой цепи, между любыми двумя точками второй цепи, а вот между точкой первой цепи и точкой второй - укажет неопределенность, ибо развязаны. Все Spice-симуляторы такого в принципе не умеют, у них от любой точки должен быть путь на GND, иначе либо выругается, либо посадит виртуальное сопротивление, отчего ответ может получиться каким угодно!

Я даже придумал, как назову такую программу: New, Yet Another Circuit Analisys Tool (NYAnCAT). Эх, мечтать не вредно!

Кстати, в пятницу Дональду Кнуту исполнилось 76 лет! Пожелаем ему дописать "Искусство Программирования" и процветания!
Tags: imagegraph2txt, древовидный undo, математика, моделирование, программки
Subscribe

  • Я создал монстра!

    Вот нормальная счастливая пара разъёмов ОНЦ-БС-1-10/14-Р12-2-В и ОНЦ-БС-1-10/14-В1-2-В: У розетки кроме основного выступа, отмечающего "верх",…

  • Нахождение двух самых отдалённых точек

    Пока компьютер долго и упорно мучал симуляцию, я пытался написать на ассемблере алгоритм захвата на ближней дистанции. А сейчас на этом коде можно…

  • Слишком общительный счётчик

    Вчера я чуть поторопился отсинтезировать проект,параметры не поменял: RomWidth = 8 вместо 7, RamWidth = 9 вместо 8, и ещё EnableByteAccess=1, чтобы…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 14 comments

  • Я создал монстра!

    Вот нормальная счастливая пара разъёмов ОНЦ-БС-1-10/14-Р12-2-В и ОНЦ-БС-1-10/14-В1-2-В: У розетки кроме основного выступа, отмечающего "верх",…

  • Нахождение двух самых отдалённых точек

    Пока компьютер долго и упорно мучал симуляцию, я пытался написать на ассемблере алгоритм захвата на ближней дистанции. А сейчас на этом коде можно…

  • Слишком общительный счётчик

    Вчера я чуть поторопился отсинтезировать проект,параметры не поменял: RomWidth = 8 вместо 7, RamWidth = 9 вместо 8, и ещё EnableByteAccess=1, чтобы…