#dm-script
#dm-script
Вопрос:
Я пытаюсь имитировать функцию автосохранения в GMS v3, чтобы я мог использовать в версиях 1 и 2. Сначала я хотел бы признать, что основная часть сценария взята из книги доктора Бернхарда Шаффера «Как писать сценарий… Руководство по написанию сценариев для цифровых микрофотографий «. Я немного изменил его, чтобы любое новое изображение, записанное камерой, можно было автоматически сохранить в файл. Однако я столкнулся с некоторыми проблемами, потому что, если я решу щелкнуть изображение в режиме реального времени и переместить изображение или использовать live-fft, изображение live view или изображение FFT также будут сохранены. Одна из идей, которые у меня есть, — использовать информацию о группе тегов, такую как «Получение: Параметры: имя набора параметров», потому что для live view или live-FFT это будет либо в режиме поиска, либо в режиме фокусировки. Другая идея — использовать идентификатор документа, например iDocID = idoc.ImageDocumentGETID() для определения идентификатора живого изображения. Однако тогда я понятия не имею, как использовать эту информацию, чтобы исключить их из автосохранения. Кто-нибудь может указать мне, как я могу продолжить работу с этим сценарием? Ниже приведен сценарий
Class PeriodicAutoSave : Object
{
Number output
PeriodicAutoSave(Object self) Result("n Object ID" self.ScriptObjectGetID() " created.")
~PeriodicAutoSave(Object self) Result("n Object ID" self.ScriptObjectGetID() " destroyed")
Void Init2(Object self, Number op)
output=op
Void AutoSave_SaveAll(Object self)
{
String path, name, targettype, targettype1, area, mag, mode, search, result1
ImageDocument idoc
Number nr_idoc, count, index_i, index, iDocID, iDocID_search
path = "c:\path\"
name = "test"
targettype=="Gatan Format (*.dm4)"
targettype1 = "dm4"
If (output) Result("n AutoSave...")
nr_idoc = CountImageDocuments()
For (count = 1; count<nr_idoc; count )
{
idoc = GetImageDocument(count) //imagedocument
index = 1 // user decide the index to start with
index_i= nr_idoc - index
If (idoc.ImageDocumentIsDirty())
{
idoc = getfrontimagedocument()
iDocID = idoc.ImageDocumentGetID()
TagGroup tg = ImageGetTagGroup(idoc.ImageDocumentGetImage(0)) // cannot declare an 'img' for this line as it will prompt an error?
tg.TagGroupGetTagAsString("Microscope Info:Formatted Indicated Mag", mag)
Try{
{
idoc.ImageDocumentSavetoFile( "Gatan Format", path index_i "-" name "-" mag ".dm4")
idoc.ImageDocumentSetName(index_i "-" name "-" mag ".dm4")
idoc.ImageDocumentClean()
}
If (Output) Result("nt saving: " idoc.ImageDocumentGetCurrentFile())
}
Catch{
Result("n image cannot be saved at the moment:" GetExceptionString())
Break
}
Result(" Continue autosave...")
}
}
}
}
Void LaunchAutoSave()
{
Object obj = Alloc(PeriodicAutoSave)
obj.Init2(2)
Number task_id = obj.AddMainThreadPeriodicTask("AutoSave_SaveALL",6)
//Sleep(10)
while(!shiftdown()) 1==2
RemoveMainThreadTask(task_id)
}
LaunchAutoSave()
Ответ №1:
большое вам спасибо за ваши указания! Я пробовал, и это очень хорошо работает с моим сценарием. поскольку ‘TagGroupDoesTagExist’ относится только к группе тегов, я внес дополнительные изменения, чтобы включить теги, которые я хочу отфильтровать, например «Поиск» или «Фокус», и, похоже, работает хорошо. Сценарий, который я изменил на ваши существующие, выглядит следующим образом :
If (idoc.ImageDocumentIsDirty())
{
//now find out what is a filter condition and skip if it is true
skip = 0
TagGroup tg = idoc.ImageDocumentGetImage(0).ImageGetTagGroup()
tg.TagGroupGetTagAsString("Microscope Info:Formatted Indicated Mag", mag)
tg.TagGroupGetTagAsString("Acquisition:Parameters:Parameter Set Name", mode)
skip = tg.TagGroupDoesTagExist("Acquisition:Parameters:Parameter Set Name")
if(skip amp;amp; (mode == "Search" || mode== "Focus")) continue
Ответ №2:
Ваша идея фильтрации хороша, но в вашем цикле for есть что-то странное.
в
nr_idoc = CountImageDocuments()
For (count = 1; count<nr_idoc; count )
{
idoc = GetImageDocument(count) //imagedocument
вы перебираете все открытые в данный момент документы imageDocuments (кроме первого !?) и получить их по одному, но затем в
If (idoc.ImageDocumentIsDirty())
{
idoc = getfrontimagedocument()
на самом деле вы каждый раз получаете самый передний (выбранный) документ. Зачем вы это делаете?
Почему бы не пойти с:
number nr_idoc = CountImageDocuments()
for (number count = 0; count<nr_idoc; count )
{
imagedocument idoc = GetImageDocument(count)
If (idoc.ImageDocumentIsDirty())
{
// now find out what is a filter condition and skip if it is true
number skip = 0
TagGroup tg = idoc.ImageDocumentGetImage(0).ImageGetTagGroup()
skip = tg.TagGroupDoesTagExist("Microscope Info:Formatted Indicated Mag")
if (skip) continue
// do saving
}
}