Como definir um ImageDocument para não ser sujo no dm-script

Sep 29 2020

Como faço para definir um ImageDocumentpara não ser mais sujo em python dm-script sem salvar?


Eu tenho o código python postado abaixo, que pode ser representado pelo dm-scriptcódigo a seguir .

String file_path = GetApplicationDirectory(0, 1).PathConcatenate("test-image.dm4");
Image img := realimage("test", 4, 64, 64);

ImageDocument doc = img.ImageGetOrCreateImageDocument();
doc.ImageDocumentSaveToFile("Gatan Format", file_path);
doc.ImageDocumentShowAtRect(100, 100, 164, 164);

O (código python abaixo) cria e mostra um ImageDocument. A imagem já está salva. Mas mesmo salvando-o diretamente no DigitalMicrograph com seu próprio módulo, ele não reconhece que está salvo. Posso vincular o arquivo manualmente (executando o dm-scriptcódigo do python), mas não posso dizer ao programa que as imagens não foram modificadas.

Existe uma função ImageDocumentIsDirty(). Mas esta função só retorna se a imagem foi modificada ou não. Eu não posso definir isso.

Meu programa cria um novo espaço de trabalho e carrega mais de 100 imagens. Ao fechar o DigitalMicrograph , ele pergunta para cada uma das 100 imagens se ela deve ser salva. Não posso deixar o usuário 100 vezes clicando em Não . Principalmente porque os arquivos são salvos.

Então, como posso dizer ao dm-script que a imagem já foi salva?

try:
    import DigitalMicrograph as DM
    import numpy as np
    import execdmscript
    import os

    name = "Test image"
    file_path = os.path.join(os.getcwd(), "test-image.dm4")
    
    # create image
    image_data = np.random.random((64, 64))
    image = DM.CreateImage(image_data)
    image.SetName(name)
    
    # create, save and show image document
    image_doc = image.GetOrCreateImageDocument()
    image_doc.SetName(name)
    image_doc.SaveToFile("Gatan Format", file_path)
    print("Saving image to", file_path)
    image_doc.ShowAtRect(100, 100, 164, 164)
    
    # link the image to the file
    dmscript = "\n".join((
        "for(number i = CountImageDocuments() - 1; i >= 0; i--){",
            "ImageDocument img_doc = GetImageDocument(i);",
            "if(img_doc.ImageDocumentGetName() == name){",
                "img_doc.ImageDocumentSetCurrentFile(path);",
                "break;",
            "}",
        "}"
    ))

    svars = {
        "name": image_doc.GetName(),
        "path": file_path
    }

    with execdmscript.exec_dmscript(dmscript, setvars=svars):
        pass
except Exception as e:
    print("{}: ".format(e.__class__.__name__), e)
    import traceback
    traceback.print_exc()

Respostas

1 BmyGuest Sep 29 2020 at 19:23

o comando que você está procurando é void ImageDocumentClean( ImageDocument imgDoc )

como em

image img := realimage("test",4,100,100)
img.ShowImage()
imageDocument doc = img.ImageGetOrCreateImageDocument()

Result("\n Dirty? " + doc.ImageDocumentIsDirty())
doc.ImageDocumentClean()
Result("\n Dirty? " + doc.ImageDocumentIsDirty())

Além disso: A razão pela qual ele fica sujo em primeiro lugar é que as posições das janelas são armazenadas como parte do documento. (Outras coisas, como tags, também podem ser aplicadas.)