Чуть меньше года назад я писал о своей программке оцифровки графиков
ImageGraph2Txt v. 0.04. Вот сейчас появилась версия 0.2. Основной функционал остался без изменений - загрузить картинку, обрезать, обозначить оси и отметить точки, и программа сохранит в текстовый файл пары "X-Y" в тех единицах, что отмечены по осям.
Главное отличие новой версии - она стала более дружественной к пользователям. Моя главная гордость - это undo/redo на неограниченное число шагов, причем вся история изменений сохраняется в файл проекта. Открыв его много времени спустя и вообще на другом компьютере, можно по-прежнему отменить сколько угодно действий. Я вообще не знаю других программ, где такое было бы реализовано. Ну и еще много чего:
- Появились кнопки undo/redo и история изменений. Работает на неограниченное число шагов назад и вперед. Отменять можно все действия, кроме "новый проект" и "открыть проект" - если текущий не был сохранен, он будет утерян. И только на этих операциях, если можно потерять данные, задается вопрос - хотите ли продолжить.
- Вся история изменений сохраняется в файле проекта. То есть, можно закрыть программу, потом позже загрузить проект и команды undo/redo будут по-прежнему работать, хоть до самого первого действия - загрузки изображения. В настройках можно и отключить сохранение вместе с undo, места они, конечно занимают. Но надо сказать, не очень много. Команда "добавить точку" хранит только 2 координаты - куда она была добавлена. "Обрезать картинку" - прожорливее, она внутри себя сохраняет все "обрезки", но центральную область не хранит - а зачем? Для сохранения любых картинок используется формат png (для графиков это, пожалуй, оптимально), но ВСЕ данные хранятся ровно в одном файле. По умолчанию он текстовый, но можно выбрать бинарный - он занимает примерно в 2 раза меньше памяти.
- При закрытии программы она не задает никаких вопросов, закрывается и все. Зато при последующем открытии она открывается в точности с того же места - помнит все действия (их можно отменить), выбранный инструмент и даже, если в данный момент вы отмечали область для обрезки - он отобразит рамочку этой области. Единственное, что сейчас не запоминается - это текущий масштаб, хотя и это сделать несложно. Не знаю только, надо ли?
Тут вообще есть одна тонкость - если одновременно запущено несколько копий программы, то каждая, закрываясь, будет сохранять свои данные в один и тот же файл, current_project.txt в папке программы, затирая предыдущие данные, которые там были. Как сделать иначе - я пока не придумал. Довольно разумная идея была такая: если было открыто несколько копий, каждая сохранит свое состояние под своим именем, а при последующем запуске откроются сразу все. Но тогда, если мы их снова по одной закроем и потом однажды запустим - снова откроются все! Как вариант - для лишних окон делаем "новый проект", и пустое место она не сохранит - незачем. И в следующий раз не откроется лишнее окно. Но как-то немножко странно это. Но с другой стороны, наконец-то кнопка "новый проект" станет востребована!
А хочется что-то придумать: ведь далеко не всегда программу закрывает сам пользователь и далеко не всегда у него есть время обдумать, что куда сохранить. Бывает - надо срочно компьютер выключить, а столько всего открыто, и каждая программа начинает задавать мильон вопросов при закрытии... Поэтому сама идея закрываться молча мне нравится, надо только довести ее до ума.
- Минимум лишних вопросов и закрашивание серым ненужных на данный момент кнопочек. Если мы только открыли программу, не работает кнопка "новый проект" (он и так новый) и "сохранить" (сохранить нечего). Если мы что-то сделали и сохранили, "сохранить" снова посереет. Сделаем undo, потом передумаем и снова redo - "сохранить" опять посереет, потому что ровным счетом ничего не изменилось! При сохраненном проекте можно с чистой совестью создать новый или открыть - раз все сохранено, никаких вопросов программа не задаст, откроет и все. Но если уж вопрос был задан - значит, по делу!
- Полная независимость различных инструментов. Первые версии работали как wizard, по шагам. Сначала - загрузим откуда-нибудь картинку и слегка ее обрежем. Потом - выделим оси и отметим точки на них. И лишь потом отметим точки, после чего сохраним. Возвращаться к предыдущему шагу можно было, но только рискуя потерять/исказить данные шага текущего. То есть, при обрезании картинки и оси, и точки данных переставали совпадать с рисунком, поскольку сохраняли те же координаты в пикселях.
Теперь же действия можно делать в любом порядке - все будет пересчитано как надо.
- Масштабирование и прокрутка. Вовсю используется колесико мыши. Просто его вращение - это прокрутка вверх-вниз. С шифтом: влево-вправо. С Ctrl: увеличение/уменьшение. Ну и конечно, есть полосы прокрутки и меню масштаба.
- Удобный "фотошоповский" инструмент crop: сначала выделяем рамочку, после чего можем произвольно ее подвигать (подводя мышку к краю рамочки с нужной стороны), и только после этого нажатием на центральную область - обрезаем края. А щелчок вне рамки снимает выделение.
Конечно, это стрельба из пушки по воробьям, такую простую, в сущности, программу снабжать столь мощным интерфейсом. Просто эта программка очень удобна в качестве "подопытного кролика", на которой я учусь писать довольно сложные прикладные программы. С одной стороны, она еще довольно проста, чтобы с непривычки не запутаться. Но уже нетривиальная, в ней паттерны проектирования и возня со структурами данных, инкапсуляцией, наследованием и пр. не вырождается в бессмысленные foo.bar().
Я очень надеюсь, что весьма приличный кусок кода отсюда смогу использую в дальнейшем в других своих программах - все, что касается сериализации структур данных (когда дерево объектов с кучей дополнительных связей между собой "разворачивается" в текстовый документ, а впоследствии может быть построено вновь автоматически), абстрактных команд и инструментов, undo/redo, и прочего.
И отчасти поэтому буду очень рад, если эту программу кто-нибудь потестит)
Установки программа не требует, запускается с одного голого .exe-шника, скачать его можно
здесь (500 кБайт), а вот
ее исходники.