Тип плагинов: Простой экспорт в файл

Форум для обсуждения деталей разработки программы SAS.Планета

Модераторы: vdemidov, Tolik

Тип плагинов: Простой экспорт в файл

Сообщение vdemidov » 22 июн 2010, 13:07

Почему простой, а потому, что программа сама будет скармливать тайлы в том порядке в котором захочет, то есть склейку в растр скорее всего через такой экспорт сделать не получится, а вот копирование тайлов в какой-нибудь контейнер - запросто.
Интерфейс приблизительно такой:
Код: Выделить всё
  ISimpleTileProcessor = interface
    procedure ProcessTile(APos: Tpoint; Azoom: byte; ALonLatRect: TDoubleRect; ATileSize: Cardinal; ATileBuf: Pointer);
  end;
  IExportSimpleToFile = interface
    function GetSupportedContentTypes: WideString;
    function GetFileFilters: WideString;
    function GetFileExtDefault: WideString;
    function StartExport(ASourceContentType: WideString; AFileName: WideString): ISimpleTileProcessor;
  end;

Тоесть SAS.Планета сама будет перебирать тайлы по выделению, и скармливать плагину, порядок и наличие всех тайлов не гарантируется.
PS: Добавил работу с типом содержимого тайлов.
Функция GetSupportedContentTypes возвращает список поддерживаемых плагинов типов исходных данных приблизительно в таком виде:
"image/jpeg"; "image/png"; "image/gif"; "application/vnd.google-earth.kml+xml"
Если возвращается пустая строка, значит плагин ничего не поддерживает и в списке ни для одного из источников показываться не будет.
Функция StartExport получает тип данных экспортируемого пользователем источника.
PPS: Добавил методы для получения инфы для диалога открытия файла.
GetFileExtDefault - должен возвращать расширение файла по-умолчанию.
GetFileFilters - строка с поддерживаемыми фильтрами для имен файлов. Что-то такое:
SuperIndex (*.inx)|*.inx|All files (*.*)|*.*
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1686
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 135 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение DJ VK » 19 авг 2010, 11:45

Попробую на примере простейшего архиватора.
http://www.codeproject.com/KB/files/zip_utils.aspx
потом можно будет экспериментировать с другими архиваторами

GetSupportedContentTypes возвращает список поддерживаемых плагинов типов исходных данных приблизительно в таком виде: "image/jpeg"; "image/png"; "image/gif"; "application/vnd.google-earth.kml+xml"

Как конкретно должна выглядить строка при поддержке всех типов (кавычки, разделители)?

function GetFileFilters: WideString;
function GetFileExtDefault: WideString;
- с этим все ясно. обычные настройки для SaveDialog

В целом процесс архивации примерно следующий
HZIP hz = CreateZip("simple1.zip",0);
ZipAdd(hz,"znsimple.bmp", "simple.bmp");
ZipAdd(hz,"znsimple.txt", "simple.txt");
CloseZip(hz);

Значит мы архив 1) открываем 2)скармливаем файлы 3)закрываем

procedure ProcessTile(APos: Tpoint; Azoom: byte; ALonLatRect: TDoubleRect; ATileSize: Cardinal; ATileBuf: Pointer);
function StartExport(ASourceContentType: WideString; AFileName: WideString): ISimpleTileProcessor;
это наверное где то тут.
вопросы такие
А) Как мы узнаем имя архива и путь от программы?
Б) как мы узнаем что процесс завершен?
В) Где мы имеем имена файлов для архивации? здесь я вижу только буфер и координаты

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

И это, SDK или чтото подобное есть? Ну или просто пример кода
Вставить SaveDialog, парочку edit\combobox я могу, но интересно как эти интерфейсы инициализируются в программе и происходит их вызов.

Возможно придется столкнуться с ситуацией когда формируется список файлов для архивации а потом в конце идет сама архивация. не требуется ли при этом какая индикация от плагина о том что он делает? примерно то же видно при штатном архивировании в программе - пробегает список файлов и прогресс бар надолго замирает....

И еще одна опция для эксппорта полезная - удаление файлов после экспорта. сейчас при архивации недоступна. а хочется.
Аватара пользователя
DJ VK
Гуру
 
Сообщения: 1467
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 82 раз.
Поблагодарили: 298 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение vdemidov » 19 авг 2010, 12:31

DJ VK писал(а):GetSupportedContentTypes возвращает список поддерживаемых плагинов типов исходных данных приблизительно в таком виде: "image/jpeg"; "image/png"; "image/gif"; "application/vnd.google-earth.kml+xml"Как конкретно должна выглядить строка при поддержке всех типов (кавычки, разделители)?

Ну, например, "image/*" для любых картинок, и "*" вообще для всего подряд. Думаю так нормально будет.
DJ VK писал(а):А) Как мы узнаем имя архива и путь от программы?

Имя архива передается вторым параметром в функции StartExport
DJ VK писал(а):Б) как мы узнаем что процесс завершен?

Вызов деструктора для объекта с интерфейсом ISimpleTileProcessor
DJ VK писал(а):В) Где мы имеем имена файлов для архивации? здесь я вижу только буфер и координаты

Сами придумываем, какие больше нравятся. Теоретически исходные данные могут вообще в базе данных храниться.
Кстати именно поэтому ваш процесс типа ZipAdd(hz,"znsimple.txt", "simple.txt"); некатит, ибо файлов на диске у вас нет, только область в памяти.

DJ VK писал(а):Если вопросы покажутся немного детским - скажу так, классы писать не очень люблю, но с ними все понятно, а интерфейсы вообще никогда не писал. С трудом представляю где у них конструкторы-деструкторы и в какие моменты времени что вызывается.

Все нормально. Нормальные вопросы. Просто интерфейсы никто не пишет и конструкторов у них нету. Просто класс может реализовывать какой-то интерфейс. А уж в классе все конструкторы-деструкторы вызываются стандартно. Единственная особенность, что класс в делфи желательно наследовать от TInterfacedObject и нельзя вызывать Free вручную, только обнулением ссылки на интерфейс.

DJ VK писал(а):И это, SDK или чтото подобное есть? Ну или просто пример кода

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

DJ VK писал(а):Вставить SaveDialog, парочку edit\combobox я могу, но интересно как эти интерфейсы инициализируются в программе и происходит их вызов.

В плагине не должно быть никакого UI. Максимум выдача месседж бокса. Никакого SaveDialog из плагина вызывать нельзя.

DJ VK писал(а):Возможно придется столкнуться с ситуацией когда формируется список файлов для архивации а потом в конце идет сама архивация. не требуется ли при этом какая индикация от плагина о том что он делает? примерно то же видно при штатном архивировании в программе - пробегает список файлов и прогресс бар надолго замирает....

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

DJ VK писал(а):И еще одна опция для эксппорта полезная - удаление файлов после экспорта. сейчас при архивации недоступна. а хочется.

Удаление есть отдельной операцией. Экспорт особенно при помощи плагина удалять ничего не должен.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1686
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 135 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение zed » 19 авг 2010, 12:59

vdemidov
А можно заготовку/пример модуля? С примером класса и пояснениями в какой момент времени какая функция вызывается и что она должна сделать?
Я так понимаю, StartExport - инициализация экспорта, а ProcessTile будет циклически вызываться для каждого тайла? Причём, ProcessTile - это ещё один класс, по уничтожению которого мы должны завершить наш экспорт (сохранить/уничтожить всё что надо)?
Хитрости GoogleEarth - то, чего вы не знаете о гугле
Аватара пользователя
zed
Гуру
 
Сообщения: 2888
ICQ: 357167611
Зарегистрирован: 16 авг 2008, 20:21
Откуда: Беларусь, Могилёв
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение vdemidov » 19 авг 2010, 13:15

zed писал(а):А можно заготовку/пример модуля? С примером класса и пояснениями в какой момент времени какая функция вызывается и что она должна сделать?

Ну примеров и SDK, пока готовых нет. Почему я уже описал выше.
zed писал(а):Я так понимаю, StartExport - инициализация экспорта, а ProcessTile будет циклически вызываться для каждого тайла? Причём, ProcessTile - это ещё один класс, по уничтожению которого мы должны завершить наш экспорт (сохранить/уничтожить всё что надо)?

Да все правильно. В StrartExport нужно создать новый объект с интерфейсом ISimpleTileProcessor, который должен быть готов сразу принимать данные.
ProcessTile будет циклически вызываться для каждого тайла, попдающего под заданные пользователем условия. Порядок тайлов никак не гарантируется. Может вообще разные зумы в рендомном порядке давать.
Как только все будет экспортировано, ссылка на объект будет освобождена и он сможет удалить себя закрыв файлы и тд.
Еще раз напоминаю, что крайне нежелательно выдавать что-то пользователю через GUI из плагина, так как он будет вызван в совершенно отдельном потоке. В очень далекой перспективе, может быть, даже в отдельном скрытом процессе-песочнице.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1686
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 135 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение DJ VK » 19 авг 2010, 15:29

GUi использоваться будет не в плагине а в программе для проверки его.
независимость плагина от программы конечно необходима и крайне удобна. но плагин должен получать всю информацию для него полезную.
Но вот объясни мне - если я архивирую кеш, имеющий четкую структуру в программе зачем мне придумывать свою структуру хранения - свои имена файлов, папки. Ведь в программе разделили копирование и экспорт. Может и плагины разделить? на те что работают непосредственно с картинками и те что работают именно с файлами кэша? При этом не требуется модифицировать сами изображения - просто файл копируется, переименовывается, вкладывается в однофайловый гигантский кеш или пихается в архив. - это на уровне файловой системы уже.
Последний раз редактировалось DJ VK 19 авг 2010, 15:31, всего редактировалось 1 раз.
Аватара пользователя
DJ VK
Гуру
 
Сообщения: 1467
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 82 раз.
Поблагодарили: 298 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение zed » 19 авг 2010, 15:30

Так, в нашем случае плагин - dll? Где она должна лежать, с какой версией SAS сможет работать и какую функцию должна экспортировать?
Что-то вроде:
Код: Выделить всё
function GetIExportSimpleToFile: IExportSimpleToFile;
Хитрости GoogleEarth - то, чего вы не знаете о гугле
Аватара пользователя
zed
Гуру
 
Сообщения: 2888
ICQ: 357167611
Зарегистрирован: 16 авг 2008, 20:21
Откуда: Беларусь, Могилёв
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение DJ VK » 19 авг 2010, 15:36

скорее всего исходный код плагина просто встраивается в программу, нигде о dll не сказано
Аватара пользователя
DJ VK
Гуру
 
Сообщения: 1467
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 82 раз.
Поблагодарили: 298 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение vdemidov » 19 авг 2010, 15:40

DJ VK писал(а):GUi использоваться будет не в плагине а в программе для проверки его.

Не понял о чем ты.
DJ VK писал(а):независимость плагина от программы конечно необходима и крайне удобна. но плагин должен получать всю информацию для него полезную.

Плагину не нужно получать информации больше чем ему положено. А то сегодня он захочет узнать имя файла с тайлом, а завтра решит реализовать и функцию удаления этого файла после экспорта.
DJ VK писал(а):Но вот объясни мне - если я архивирую кеш, имеющий четкую структуру в программе зачем мне придумывать свою структуру хранения - свои имена файлов, папки.

А если именно у этой карты нет этой самой четкой структуры? Если это, уже сегодня возможный, доступ к кэшу ГЕ?
DJ VK писал(а):Ведь в программе разделили копирование и экспорт. Может и плагины разделить? на те что работают непосредственно с картинками и те что работают именно с файлами кэша?
Уже разделил. И те что работают с файлами признал бесперспективным направлением, не стоящим времени на реализацию. :)
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1686
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 135 раз.

Re: Тип плагинов: Простой экспорт в файл

Сообщение vdemidov » 19 авг 2010, 15:45

zed писал(а):Так, в нашем случае плагин - dll? Где она должна лежать, с какой версией SAS сможет работать и какую функцию должна экспортировать?

А почитать viewtopic.php?f=47&t=1113 слабо?
zed писал(а):Что-то вроде:
Код: Выделить всё
function GetIExportSimpleToFile: IExportSimpleToFile;

Ну на текущем этапе, для тестирования можешь реализовать именно так. Чуть позже будет SDK, в котором нужно будет вписать только пару строк и ссылки на свои юниты. Обещаю, что сделать плагин из таких классов, когда их сможет использовать SAS.Планета, будет очень просто.
DJ VK писал(а):скорее всего исходный код плагина просто встраивается в программу, нигде о dll не сказано

Можно и встраивать, можно и dll. Просто если без dll, то использовать это можно будет чуть раньше, чем dll. Так как встроить пару юнитов будет гораздо проще, чем допилить движок плагинный и выпустить PluginSDK
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1686
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 135 раз.

След.

Вернуться в Раздел для разработчиков программы SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1