Как исключить определенные изображения из автосохранения в Gatan Digital Micrograph (GMS) в DM-script

#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
    }
}