Cara menyetel ImageDocument agar tidak kotor di dm-script

Sep 29 2020

Bagaimana cara mengatur ImageDocumentagar tidak kotor lagi di python dm-script tanpa menyimpan?


Saya memiliki kode python yang diposting di bawah ini yang dapat diwakili oleh dm-scriptkode berikut .

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

The (kode python di bawah) membuat dan menampilkan file ImageDocument. Gambar sudah disimpan. Tetapi bahkan menyimpannya langsung di DigitalMicrograph dengan modulnya sendiri, ia tidak mengenali bahwa itu disimpan. Saya dapat menautkan file secara manual (dengan menjalankan dm-scriptkode dari python) tetapi saya tidak dapat memberi tahu program bahwa gambar tidak dimodifikasi.

Ada sebuah fungsi ImageDocumentIsDirty(). Tetapi fungsi ini hanya mengembalikan apakah gambar tersebut dimodifikasi atau tidak. Saya tidak bisa mengaturnya.

Program saya membuat ruang kerja baru dan memuat lebih dari 100 gambar. Saat menutup DigitalMicrograph , ia menanyakan setiap 100 gambar apakah itu harus disimpan. Saya tidak dapat meninggalkan pengguna dengan 100 kali mengklik Tidak . Terutama karena file-file tersebut disimpan.

Jadi, bagaimana cara memberi tahu dm-script bahwa gambar sudah disimpan?

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

Jawaban

1 BmyGuest Sep 29 2020 at 19:23

perintah yang Anda cari adalah void ImageDocumentClean( ImageDocument imgDoc )

seperti dalam

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

Juga: Alasan pertama kali menjadi kotor adalah, bahwa posisi jendela disimpan sebagai bagian dari dokumen. (Hal lain, seperti tag, juga dapat diterapkan.)