"""Render deterministic prescription-editor drawer references.""" from __future__ import annotations import os from pathlib import Path from types import SimpleNamespace from typing import Any os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") from PySide6.QtGui import QFont, QFontDatabase from PySide6.QtWidgets import QApplication, QWidget from doctor_workstation.ui import apply_theme from doctor_workstation.ui.dialogs import diagnosis as diagnosis_module from doctor_workstation.ui.dialogs.prescription import PrescriptionEditorDialog class VisualRepository: def list_medicines(self, **_filters: Any) -> dict[str, Any]: return {"lists": [], "count": 0} def _seed() -> dict[str, Any]: return { "diagnosis_id": 501, "appointment_id": 2501, "patient_name": "林晓岚", "phone": "13800138000", "gender": 0, "age": 34, "visit_no": "1K00002501", "prescription_date": "2026-08-11", "tongue": "舌淡红、苔薄白", "pulse": "面色少华", "pulse_condition": "脉细", "clinical_diagnosis": "气阴两虚,脾气不足", "prescription_type": "浓缩水丸", "dosage_amount": 3, "dosage_unit": "g", "dosage_bag_count": 2, "dose_count": 7, "dose_unit": "剂", "usage_days": 7, "times_per_day": 2, "usage_instruction": "早晚各一次,温水送服", "usage_time": "饭后", "usage_way": "温水送服", "dietary_taboo": ["生冷食物", "浓茶"], "usage_notes": "服药期间规律记录空腹及餐后血糖。", "aux_usage": { "dosage_amount": 2, "dosage_bag_count": 1, "times_per_day": 1, "usage_days": 7, "prescription_name": "宁心辅方", }, "doctor_name": "陈医生", "herbs": [ {"medicine_id": 11, "name": "黄芪", "dosage": 15, "formula_type": "主方"}, {"medicine_id": 12, "name": "党参", "dosage": 12, "formula_type": "主方"}, {"medicine_id": 13, "name": "白术", "dosage": 10, "formula_type": "主方"}, {"medicine_id": 14, "name": "茯苓", "dosage": 12, "formula_type": "主方"}, {"medicine_id": 15, "name": "麦冬", "dosage": 9, "formula_type": "主方"}, {"medicine_id": 16, "name": "五味子", "dosage": 6, "formula_type": "主方"}, {"medicine_id": 17, "name": "酸枣仁", "dosage": 12, "formula_type": "辅方"}, {"medicine_id": 18, "name": "远志", "dosage": 6, "formula_type": "辅方"}, ], } def _make_editor(host: QWidget) -> PrescriptionEditorDialog: editor = PrescriptionEditorDialog( VisualRepository(), _seed(), mode="add", current_user=SimpleNamespace(id=1, name="陈医生"), parent=host, ) # Diagnosis-detail callers apply their scoped sheet after construction. The # prescription surface owns its own scoped rules, so this also verifies that # real entry path rather than a renderer-only appearance. editor.setObjectName("DiagnosisPrescriptionEditor") editor.setStyleSheet(diagnosis_module.DIAGNOSIS_QSS) return editor def _settle(app: QApplication, rounds: int = 8) -> None: for _ in range(rounds): app.processEvents() def render() -> list[Path]: app = QApplication.instance() or QApplication([]) apply_theme(app) font_path = Path("C:/Windows/Fonts/msyh.ttc") if font_path.is_file(): font_id = QFontDatabase.addApplicationFont(str(font_path)) families = QFontDatabase.applicationFontFamilies(font_id) if families: app.setFont(QFont(families[0], 9)) output = Path(__file__).resolve().parents[1] / "artifacts" / "diagnosis_visual" output.mkdir(parents=True, exist_ok=True) rendered: list[Path] = [] for host_width, height in ((1440, 900), (1024, 768), (920, 780)): host = QWidget() host.resize(host_width, height) host.show() editor = _make_editor(host) editor.show() _settle(app) editor.body_scroll.verticalScrollBar().setValue(0) _settle(app, 3) width = min(PrescriptionEditorDialog.DRAWER_WIDTH, host_width) path = output / f"diagnosis_state_prescription_editor_{width}x{height}.png" if not editor.grab().save(str(path), "PNG"): raise RuntimeError(f"failed to save {path}") rendered.append(path) editor.close() host.close() _settle(app, 2) host = QWidget() host.resize(1440, 900) host.show() editor = _make_editor(host) editor.show() _settle(app) for index, state in ((1, "herbs"), (2, "usage"), (3, "signature")): editor.tabs.setCurrentIndex(index) _settle(app, 4) path = output / f"diagnosis_state_prescription_editor_{state}_1200x900.png" if not editor.grab().save(str(path), "PNG"): raise RuntimeError(f"failed to save {path}") rendered.append(path) editor.close() host.close() return rendered if __name__ == "__main__": for rendered_path in render(): print(rendered_path)