pipe bị lech khung khong dung
Có hai nguyên nhân, và tôi chắc về cơ chế lỗi nhưng chưa chắc về điểm khởi phát.
1. Nguyên nhân chính: widget tự co khít khung trong khi Rot vẫn khác 0.
- Trong screen của bạn, các pipe có khung mặc định
142×22,Rot = 90/270, và các điểm nằm ở toạ độ lớn hoặc âm. Lúc import, widget vẽ điểm theo góc khung, rồi xoay quanh tâm khung đó, nên hình đúng. - Khoảng 1 giây sau, chế độ Edit thấy điểm nhỏ nhất không cách mép khung đúng
pad, nên tự co khít khung và đổiX/Y/W/H.Rotvẫn giữ nguyên, nên tâm xoay đổi theo và pipe nhảy sai chỗ. - Lần lưu sau đó ghi luôn dữ liệu sai này vào screen. Vì vậy hôm trước còn đúng, hôm sau mở lại là lệch. File
z79bạn gửi đầu tiên chính là kết quả sau lần co khít này.
2. Nguyên nhân phụ: fitFrame() chặn khung ở mép canvas nhưng không chuẩn hoá điểm.
Khi pipe vượt mép trên hoặc trái, khung bị kẹt ở Y = 0 trong khi điểm vẫn âm (-435, -610, -620). Dữ liệu lưu ra không khớp nhau. Lỗi này chỉ ảnh hưởng 3 pipe dài chạy lên mép trên.
Chưa biết: vì sao pipe lúc đầu có Rot = 90 kèm khung mặc định. Widget pipe không xử lý Rot, nên giá trị này đến từ phía hệ thống (lúc kéo pipe từ thư viện hoặc lúc import). Phần đó nằm ở PluginBox.razor hoặc scada.js, tôi chưa có mã nên chưa tìm ra. Hai bản sửa tôi gửi chặn được hậu quả (pipe nhảy), chưa chặn được việc Rot = 90 có thể xuất hiện lại.Tôi đọc file này, so sánh với file lỗi để tìm cái gì kích hoạt việc pipe tự xếp lại sau 1 giây.
Nhờ file đúng này, tôi đã tìm ra nguyên nhân thật và đã sửa. Tôi chưa chạy thử trên ScadaWeb, nên bạn cần kiểm tra lại.
Nguyên nhân (đọc từ file z78_..._pipe_defaults.zip):
- Cả 30 pipe đều có khung mặc định
142×22, trong khi các điểm lại nằm ở toạ độ rất khác (có điểm-811,-831,255...). 21 trong 30 pipe còn cóRot = 90hoặc270. - Ở giây đầu, widget vẽ đúng kiểu “điểm tính từ góc khung, rồi xoay quanh tâm khung 142×22”. Nên bạn thấy đúng.
- Khoảng 1 giây sau, chế độ Edit thấy điểm nhỏ nhất không cách mép khung đúng
pad, nên tự co khít khung. Việc này đổiX/Y/W/Hnhưng giữ nguyênRot. Tâm xoay đổi theo, nên các pipe nhảy lung tung. - File lỗi trước đó (
z79) chính là kết quả sau lần co khít này.
Hướng xoay đã xác định: tôi thử ba cách trên file đúng. Xoay thuận chiều kim đồng hồ cho số đầu ống nối với ống khác nhiều nhất (24/60, so với 11–13/60 ở hai cách còn lại), và chỉ 2 pipe tràn ngoài canvas. Vì thế chỉ cần dùng bản cw.
Hai bản sửa:
- Dữ liệu (
GOV_TBC_fixed_cw.zip): đưa phép xoay vào toạ độ điểm. Cả 30 pipe nay cóRot = 0, khung khít, điểm không âm và không bị dịch. Hình trên màn hình giữ nguyên như lúc đúng, và widget không còn lý do để tự sắp xếp lại. - Widget (
pipe.zipv2.5.1): widget đang xoay thì không còn tự co khít khung ở Edit, nên các screen cũ dạng “khung mặc định + Rot 90” cũng không bị lệch nữa. Bản này gồm cả sửa điểm âm của v2.5.0. Zip màn hình đã nhúng sẵn bản này. Nếu muốn nâng cấp riêng thì nhậppipe.ziprồi nhấn Ctrl+F5.
Cách dùng: nhập GOV_TBC_fixed_cw.zip, mở Edit, chọn thử vài pipe và để chạy khoảng 10 giây. Sau đó mở Runtime. Nếu pipe vẫn nhảy, hãy chụp ảnh và gửi tôi id pipe đó.
Có một giới hạn cần biết. Việc dò hướng xoay dựa trên số đầu ống nối nhau chứ không so với hình nền, nên chưa phải kiểm tra tuyệt đối. Tôi cũng chưa tìm ra vì sao ban đầu Rot bị đặt là 90. Nếu sau này import lại vẫn ra Rot = 90, hãy chạy fix_pipes.py với mode cw trên file đó rồi nhập lại. Lỗi Rot này nằm ở phía thư viện widget của hệ thống, gửi tôi mã PluginBox.razor hoặc scada.js nếu bạn muốn tôi tìm tiếp.
Files:
- GOV_TBC_fixed_cw.zip
- pipe.zip
- fix_pipes.py

