Jak ustawić ImageDocument, aby nie był brudny w dm-script

Sep 29 2020

Jak ustawić, aby ImageDocumentnie był już brudny w pythonie dm-script bez zapisywania?


Mam zamieszczony poniżej kod Pythona, który można przedstawić za pomocą następującego dm-scriptkodu.

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

(Kod Pythona poniżej) tworzy i wyświetla plik ImageDocument. Obraz jest już zapisany. Ale nawet zapisując go bezpośrednio w DigitalMicrograph z własnym modułem, nie rozpoznaje, że jest zapisany. Mogę połączyć plik ręcznie (wykonując dm-scriptkod z Pythona), ale nie mogę powiedzieć programowi, że obrazy nie są modyfikowane.

Jest funkcja ImageDocumentIsDirty(). Ale ta funkcja zwraca tylko to, czy obraz jest zmodyfikowany, czy nie. Nie mogę tego ustawić.

Mój program tworzy nowy obszar roboczy i ładuje ponad 100 obrazów. Podczas zamykania DigitalMicrograph pyta o każdy ze 100 obrazów, czy powinien zostać zapisany. Nie mogę zostawić użytkownika po kliknięciu 100 razy Nie . Zwłaszcza, że ​​pliki są zapisywane.

Jak więc mam powiedzieć dm-script, że obraz jest już zapisany?

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

Odpowiedzi

1 BmyGuest Sep 29 2020 at 19:23

polecenie, którego szukasz, to void ImageDocumentClean( ImageDocument imgDoc )

jak w

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

Ponadto: Przyczyną zabrudzenia jest przede wszystkim to, że pozycje okien są zapisywane jako część dokumentu. (Mogą też obowiązywać inne rzeczy, takie jak tagi).