So stellen Sie ein ImageDocument so ein, dass es in dm-script nicht schmutzig ist

Sep 29 2020

Wie setze ich ein ImageDocument, um in Python dm-script nicht mehr schmutzig zu sein, ohne es zu speichern?


Ich habe den Python-Code unten veröffentlicht, der durch den folgenden dm-scriptCode dargestellt werden kann.

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

Der (Python-Code unten) erstellt und zeigt eine ImageDocument. Das Bild ist bereits gespeichert. Aber selbst wenn es direkt in DigitalMicrograph mit einem eigenen Modul gespeichert wird, erkennt es nicht, dass es gespeichert ist. Ich kann die Datei manuell verknüpfen (indem dm-scriptich Code aus Python ausführe ), aber ich kann dem Programm nicht mitteilen, dass die Bilder nicht geändert werden.

Es gibt eine Funktion ImageDocumentIsDirty(). Diese Funktion gibt jedoch nur zurück, ob das Bild geändert wurde oder nicht. Ich kann es nicht einstellen.

Mein Programm erstellt einen neuen Arbeitsbereich und lädt mehr als 100 Bilder. Beim Schließen von DigitalMicrograph werden Sie nach jedem der 100 Bilder gefragt, ob es gespeichert werden soll. Ich kann den Benutzer nicht mit 100-maligem Klicken auf Nein verlassen . Vor allem, weil die Dateien gespeichert sind.

Wie kann ich dm-script mitteilen, dass das Bild bereits gespeichert ist?

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

Antworten

1 BmyGuest Sep 29 2020 at 19:23

Der Befehl, den Sie suchen, ist void ImageDocumentClean( ImageDocument imgDoc )

wie in

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

Außerdem: Der Grund, warum es an erster Stelle schmutzig wird, ist, dass Fensterpositionen als Teil des Dokuments gespeichert werden. (Andere Dinge, wie Tags, könnten ebenfalls zutreffen.)