Cómo configurar un ImageDocument para que no esté sucio en dm-script

Sep 29 2020

¿Cómo configuro una ImageDocumentpara que no se ensucie más en python dm-script sin guardar?


Tengo el código de Python publicado a continuación, que se puede representar con el siguiente dm-scriptcódigo.

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);

El (código de Python a continuación) crea y muestra un archivo ImageDocument. La imagen ya está guardada. Pero incluso guardándolo directamente en DigitalMicrograph con su propio módulo no reconoce que está guardado. Puedo vincular el archivo manualmente (ejecutando dm-scriptcódigo desde Python) pero no puedo decirle al programa que las imágenes no están modificadas.

Hay una función ImageDocumentIsDirty(). Pero esta función solo devuelve si la imagen está modificada o no. No puedo configurarlo.

Mi programa crea un nuevo espacio de trabajo y carga más de 100 imágenes. Al cerrar DigitalMicrograph , pregunta por cada una de las 100 imágenes si debe guardarse. No puedo dejar al usuario 100 veces haciendo clic n . Especialmente porque los archivos se guardan.

Entonces, ¿cómo le digo a dm-script que la imagen ya está guardada?

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()

Respuestas

1 BmyGuest Sep 29 2020 at 19:23

el comando que estás buscando es void ImageDocumentClean( ImageDocument imgDoc )

como en

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())

Además: la razón por la que se ensucia en primer lugar es que las posiciones de las ventanas se almacenan como parte del documento. (También podrían aplicarse otras cosas, como etiquetas).