
C#: lắng nghe sự kiện lưu và mở part bằng PartCollection.AddPartSavedHandler
#C##Sự kiện1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Muốn tự ghi nhật ký mỗi lần ai đó lưu file, hay kiểm tra quy tắc đặt tên khi mở part, cần đăng ký hàm xử lý sự kiện (event handler) của PartCollection. Việc này phù hợp với DLL C# được giữ trong bộ nhớ.
C#: lắng nghe sự kiện lưu và mở part bằng…Các bước thực hiện
- Viết hàm xử lý. void OnPartSaved(BasePart part).
- Đăng ký. session.Parts.AddPartSavedHandler(new PartCollection.PartSavedHandler(OnPartSaved)).
- Giữ DLL trong bộ nhớ. GetUnloadOption trả về Explicitly hoặc AtTermination.
- Ghi nhật ký. Thời gian, tên part, người dùng.
- Hủy đăng ký. RemovePartSavedHandler khi gỡ.
Code tham khảo (C#)
using System; using System.IO; using NXOpen; public class NhatKyLuu { private static int idLuu = -1; private static int idMo = -1; private const string FileNhatKy = @"D:\NXLab_log\su_kien_part.log"; public static void Main(string[] args) { Session session = Session.GetSession(); idLuu = session.Parts.AddPartSavedHandler(new PartCollection.PartSavedHandler(KhiLuu)); idMo = session.Parts.AddPartOpenedHandler(new PartCollection.PartOpenedHandler(KhiMo)); session.ListingWindow.Open(); session.ListingWindow.WriteLine("Đã đăng ký nhật ký sự kiện part"); } private static void KhiLuu(BasePart part) { Ghi("LƯU", part); } private static void KhiMo(BasePart part) { Ghi("MỞ", part); } private static void Ghi(string loai, BasePart part) { try { Directory.CreateDirectory(Path.GetDirectoryName(FileNhatKy)); string dong = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " | " + loai + " | " + Environment.UserName + " | " + part.FullPath + Environment.NewLine; File.AppendAllText(FileNhatKy, dong); } catch (Exception) { // Không để lỗi ghi log làm hỏng thao tác của người dùng } } public static void GoDangKy() { Session session = Session.GetSession(); if (idLuu >= 0) session.Parts.RemovePartSavedHandler(idLuu); if (idMo >= 0) session.Parts.RemovePartOpenedHandler(idMo); } // Giữ DLL trong bộ nhớ cho đến khi NX kết thúc để các handler còn hoạt động public static int GetUnloadOption(string dummy) { return (int)Session.LibraryUnloadOption.AtTermination; } }Giải thích code
AddPartSavedHandlertrả về một số định danh dùng khi hủy đăng ký.AtTerminationgiữ DLL trong bộ nhớ; nếu dùngImmediately, NX gỡ DLL và handler không còn đích để gọi.- Mọi lỗi trong handler đều bị nuốt để không ảnh hưởng thao tác lưu/mở của người dùng.
Lỗi thường gặp
- Handler chạy đồng bộ trong luồng giao diện; việc nặng làm NX đứng hình.
- Dùng ổ mạng không ổn định cho file log có thể gây treo; ghi file cục bộ rồi đồng bộ sau.
Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.
Điểm: 0
Trả lời
Đăng nhập để tham gia thảo luận.