Ví dụ này cho thấy cách tiện ích mở rộng có thể lưu trạng thái của nó trong tệp phiên Chimera. Tệp phiên là mã Python được Chimera thực thi để khôi phục thông tin trạng thái. Mô-đun SimpleSession lưu trạng thái Chimera cốt lõi như các phân tử đã mở và cài đặt máy ảnh. Sau đó, nó gọi trình kích hoạt SAVE_SESSION mà tiện ích mở rộng có thể nhận để lưu trạng thái của chúng
Ví dụ SessionSaveVí dụ. py
Mã bên dưới lưu các biến trạng thái "some_path" và "some_number" trong tệp phiên khi mục nhập menu Lưu phiên được sử dụng
some_path = '/home/smith/tralala.data' some_number = 3 def restoreState[path, number]: global some_path, some_number some_path = path some_number = number def saveSession[trigger, x, file]: restoring_code = \ """ def restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState[%s,%s] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample'] """ state = [repr[some_path], repr[some_number]] file.write[restoring_code % state] import chimera import SimpleSession chimera.triggers.addHandler[SimpleSession.SAVE_SESSION, saveSession, None]
Dòng cuối cùng đăng ký thủ tục saveSession sẽ được gọi khi trình kích hoạt SAVE_SESSION được gọi. Điều này xảy ra khi người dùng lưu phiên từ menu tệp Chimera. Quy trình saveSession ghi mã Python vào tệp phiên sẽ khôi phục trạng thái của các biến toàn cục some_path và some_number
Cấu trúc dữ liệu lớn
Nếu bạn cần lưu các cấu trúc dữ liệu có
def restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']3 sẽ dài hàng trăm hoặc hàng nghìn ký tự, bạn nên sử dụng hàm
def restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']4 của SimpleSession để thay thế, hàm này sẽ chèn các dòng mới theo định kỳ. Phiên kết quả có cơ hội tốt hơn để người dùng có thể chỉnh sửa và chuyển qua các chương trình gửi thư khác nhau mà không bị hỏng
Định dạng tệp phiên
Đây là mã được ghi vào tệp phiên theo ví dụ trên
def restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']
Mã được viết bởi các phần mở rộng khác sẽ xuất hiện trước và sau mã này. Hàm restoreSessionSaveExample được xác định để loại bỏ các tên bổ sung khỏi không gian tên chung của tệp phiên. Điều này là để tránh xung đột tên. Quy trình restoreSessionSaveExample được gọi trong câu lệnh try để nếu xảy ra lỗi, nó sẽ không ngăn mã sau này trong tệp phiên được gọi. Quy trình báo cáoRestoreError được xác định ở đầu tệp phiên bởi SimpleSession
Lưu dữ liệu phức tạp
Mô-đun SessionUtil giúp viết và đọc dữ liệu trạng thái cho các tiện ích mở rộng có nhiều trạng thái. Nó có thể chuyển đổi các thể hiện của lớp thành từ điển để chúng có thể được ghi vào một tệp. Điều này tương tự như mô-đun pickle tiêu chuẩn của Python nhưng cung cấp đầu ra có định dạng dễ đọc hơn cho con người. Nó có thể xử lý một cây cấu trúc dữ liệu. Nhìn vào mã mở rộng ScaleBar để xem cách sử dụng SessionUtil
Khôi phục tham chiếu đến dữ liệu phân tử
Bạn có thể lưu các tham chiếu đến các phân tử, dư lượng, nguyên tử, liên kết, liên kết giả, mô hình VRML và bề mặt MSMS bằng cách gọi hàmdef restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']5 của SimpleSession với mục cần lưu làm đối số duy nhất. Sau đó,
def restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']3 của giá trị trả về có thể được ghi vào tệp phiên. Trong quá trình khôi phục, giá trị ID phiên đã viết phải được cung cấp cho hàm
def restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']7 của SimpleSession, hàm này sẽ trả về mục dữ liệu phân tử tương ứng
Thuộc tính phân tử tùy chỉnh
Nếu bạn thêm các thuộc tính không chuẩn vào Phân tử/Dư lượng/Liên kết/Nguyên tử mà bạn muốn giữ nguyên trong các phiên khôi phục, hãy sử dụng hàmdef restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']8 của SimpleSession, e. g,.
import chimera from SimpleSession import registerAttribute registerAttribute[chimera.Molecule, "qsarVal"]Lưu ý rằng công cụ Xác định thuộc tính tự động thực hiện việc đăng ký này, do đó, chỉ các thuộc tính mà bạn thêm trực tiếp từ mã Python của riêng mình mới cần được đăng ký như trên. Ngoài ra, chỉ các thuộc tính có giá trị có thể khôi phục được từ
def restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']3 của chúng mới có thể được lưu theo cơ chế này, vì vậy các giá trị thuộc loại C++ [Atoms, MaterialColors, v.v. ] không thể được bảo quản theo cách này
Khôi phục và tham khảo các mô hình đặc biệt
Không thể định vị các mô hình phi phân tử bằng cơ chế
def restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']5/
def restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']7. Thay vào đó, SimpleSession có một từ điển
import chimera from SimpleSession import registerAttribute registerAttribute[chimera.Molecule, "qsarVal"]2 có thể được sử dụng để ánh xạ giữa bộ id/subid cho mô hình đã lưu và mô hình được khôi phục thực tế. Vì vậy, trong quá trình lưu phiên, bạn sẽ lưu bộ dữ liệu từ một mô hình có mã như
refToSave = [model.id, model.subid]
Các giá trị trong
import chimera from SimpleSession import registerAttribute registerAttribute[chimera.Molecule, "qsarVal"]2 thực sự là danh sách các mô hình có các giá trị id/subid cụ thể đó, vì nhiều mô hình có thể có cùng id/subid [e. g. một phân tử và bề mặt của nó]. Vì vậy, nếu bạn đang khôi phục một mô hình đặc biệt và muốn cập nhật
import chimera from SimpleSession import registerAttribute registerAttribute[chimera.Molecule, "qsarVal"]2, bạn sẽ sử dụng mã như thế này
import SimpleSession SimpleSession.modelMap.setdefault[refToSave, []].append[restoredModel]
Hãy nhớ rằng id/subid của mô hình đã lưu có thể không giống với mô hình đã khôi phục, đặc biệt nếu các phiên đang được hợp nhất. Khóa được sử dụng bởi
import chimera from SimpleSession import registerAttribute registerAttribute[chimera.Molecule, "qsarVal"]2 luôn là id/subid của mô hình đã lưu
Nếu bạn đang cố gắng đề cập đến một mô hình phi phân tử bằng cách sử dụng
import chimera from SimpleSession import registerAttribute registerAttribute[chimera.Molecule, "qsarVal"]2 và mô hình phi phân tử đó thuộc loại X, bạn sẽ sử dụng mã như thế này
import SimpleSession restoredModel = filter[lambda m: isinstance[m, X], SimpleSession.modelMap[refToSave]][0]
Hợp nhất phiên
Nếu bạn đang khôi phục các mô hình của riêng mình, bạn nên cố gắng khôi phục chúng về id/subid ban đầu nếu có thể để các tập lệnh, v.v. sẽ tiếp tục hoạt động trong các lần lưu phiên. Trong trường hợp các phiên được hợp nhất, tất nhiên điều này có thể có vấn đề. SimpleSession có một biếnimport chimera from SimpleSession import registerAttribute registerAttribute[chimera.Molecule, "qsarVal"]7 [i. e.
import chimera from SimpleSession import registerAttribute registerAttribute[chimera.Molecule, "qsarVal"]8] nên được thêm vào id mô hình của bạn để tránh xung đột trong quá trình hợp nhất phiên.
import chimera from SimpleSession import registerAttribute registerAttribute[chimera.Molecule, "qsarVal"]7 bằng 0 trong quá trình khôi phục phiên không hợp nhất
Mô hình phân tử/VRML đặc biệt
Một số tiện ích mở rộng có thể tạo các phiên bản Phân tử hoặc VRML của riêng chúng cần được khôi phục bởi chính tiện ích mở rộng đó thay vì lưu/khôi phục tự động cho Phân tử/VRML do SimpleSession cung cấp. Để ngăn SimpleSession cố lưu phiên bản, hãy sử dụng hàm
refToSave = [model.id, model.subid]0 sau khi phiên bản đã được tạo, như thế này
import SimpleSession SimpleSession.noAutoRestore[instance]
Tiện ích mở rộng của bạn chịu trách nhiệm khôi phục tất cả các khía cạnh của phiên bản, bao gồm cả trạng thái lựa chọn
Khôi phục sau mô hình
Nếu khôi phục mã chỉ nên được gọi sau khi tất cả các mô hình đã được khôi phục thì SimpleSession. registerafterModelsCB thói quen nên được sử dụng
def afterModelsRestoredCB[arg]: # do some state restoration now that models have been created import SimpleSession SimpleSession.registerAfterModelsCB[afterModelsRestoredCB, arg]
Có thể bỏ qua 'arg' trong cả chức năng đăng ký và chức năng gọi lại
Tiết kiệm màu sắc
Tương tự như
refToSave = [model.id, model.subid]1 đối với dữ liệu phân tử, có hàm
refToSave = [model.id, model.subid]2 trả về một giá trị mà
def restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']3 có thể được lưu vào tệp phiên. Trong quá trình khôi phục, giá trị đó có thể được cung cấp cho hàm
refToSave = [model.id, model.subid]4 của SimpleSession để lấy lại đối tượng Màu
Đóng phiên
Mục Đóng phiên trong menu tệp Chimera có nghĩa là đặt lại trạng thái của Chimera, dỡ bỏ tất cả dữ liệu hiện được tải. Tiện ích mở rộng có thể đặt lại trạng thái khi phiên đóng bằng cách xử lý trình kích hoạt CLOSE_SESSION như minh họa bên dưới
def closeSession[trigger, a1, a2]: default_path = '/default/path' default_number = 1 restoreState[default_path, default_number] import chimera chimera.triggers.addHandler[chimera.CLOSE_SESSION, closeSession, None]
Thay đổi hành vi trong quá trình khôi phục phiên
Nếu tiện ích mở rộng cần hoạt động khác trong quá trình khôi phục phiên so với các thời điểm khác [e. g. phản ứng khác với các mô hình mới được mở], thì nó có thể đăng ký trình kích hoạt BEGIN_RESTORE_SESSION và END_RESTORE_SESSION, theo cách tương tự như trình kích hoạt CLOSE_SESSION trong phần trước
Chạy ví dụ
Để thử ví dụ, hãy lưu các đoạn mã màu đỏ ở trên dưới dạng tệp SessionSaveExample. py. Sử dụng giao diện Yêu thích/Tùy chọn/Công cụ/Vị trí của Chimera để thêm thư mục nơi bạn đã đặt tệp vào đường dẫn tìm kiếm tiện ích mở rộng. Hiển thị cửa sổ trình bao Python bằng cách sử dụng mục menu Công cụ/Lập trình/IDLE và nhập lệnh sau
>>> import SessionSaveExample
Bây giờ hãy lưu phiên với File/Save Session As. mục menu và xem tệp phiên trong trình chỉnh sửa. Bạn sẽ có thể tìm thấy mã restoreSessionSaveExample trong tệp. Giá trị hiện tại của biến some_path có thể được kiểm tra như sau
def restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']0
Bây giờ hãy đóng phiên bằng mục nhập menu Tệp/Đóng phiên và thấy rằng biến some_path đã được đặt lại về giá trị mặc định
def restoreSessionSaveExample[]: import SessionSaveExample SessionSaveExample.restoreState['/home/smith/tralala.data','3'] try: restoreSessionSaveExample[] except: reportRestoreError['Error restoring SessionSaveExample']1
Bây giờ hãy tải lại phiên với mục menu Tệp/Mở phiên và thấy rằng biến some_path đã được khôi phục