Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| # ============================================================ | |
| # 1. Mapping for Assessment Criteria | |
| # ============================================================ | |
| CRITERIA_MAP = { | |
| "num_bodies": { | |
| "5–10 ศพ (2 คะแนน)": 2, | |
| "11–20 ศพ (4 คะแนน)": 4, | |
| ">20 ศพขึ้นไป (6 คะแนน)": 6 | |
| }, | |
| "forensic_available": { | |
| "มีแพทย์นิติเวชในจังหวัด (2 คะแนน)": 2, | |
| "ไม่มีในจังหวัด แต่มีในระดับเขต (4 คะแนน)": 4, | |
| "ไม่มีในจังหวัด/มีในเขต แต่สัดส่วนแพทย์นิติเวช:ศพ น้อยกว่า 1:5 (6 คะแนน)": 6 | |
| }, | |
| "morgue_capacity": { | |
| "มีเพียงพอในจังหวัด (1 คะแนน)": 1, | |
| "มีน้อยกว่าจำนวนศพ (2 คะแนน)": 2, | |
| "ไม่เพียงพอแม้รวมในระดับเขต (3 คะแนน)": 3 | |
| }, | |
| "body_condition": { | |
| "สภาพศพเปลี่ยนแปลง <25% (1 คะแนน)": 1, | |
| "สภาพศพเปลี่ยนแปลง 25–50% (2 คะแนน)": 2, | |
| "สภาพศพเปลี่ยนแปลง >50% (3 คะแนน)": 3 | |
| } | |
| } | |
| # ============================================================ | |
| # 2. Image Mapping by Severity Level | |
| # ============================================================ | |
| SEVERITY_IMAGES = { | |
| "ระดับรุนแรงน้อย (Minor Severity)": "assets/minor.png", | |
| "ระดับรุนแรงปานกลาง (Moderate Severity)": "assets/moderate.png", | |
| "ระดับรุนแรงมาก (Major Severity)": "assets/severe.png" | |
| } | |
| # ============================================================ | |
| # 3. Assessment Function + Safety Check | |
| # ============================================================ | |
| def assess_mass_fatality(num_bodies_input, forensic_path_input, morgue_capacity_input, body_change_input): | |
| # --------- Check required inputs (no crash) --------- | |
| if not num_bodies_input or not forensic_path_input or not morgue_capacity_input or not body_change_input: | |
| warning = """ | |
| ⚠️ **กรุณาเลือกข้อมูลให้ครบทั้ง 4 ข้อก่อนประเมินผล** | |
| """ | |
| return warning, None, None | |
| # ----------------------------------------------------- | |
| # Normal calculation | |
| score_bodies = CRITERIA_MAP['num_bodies'][num_bodies_input] | |
| score_available = CRITERIA_MAP['forensic_available'][forensic_path_input] | |
| score_morgue = CRITERIA_MAP['morgue_capacity'][morgue_capacity_input] | |
| score_condition = CRITERIA_MAP['body_condition'][body_change_input] | |
| total_score = score_bodies + score_available + score_morgue + score_condition | |
| if total_score == 6: | |
| severity = "ระดับรุนแรงน้อย (Minor Severity)" | |
| recommendation = "สามารถบริหารจัดการในระดับอำเภอหรือจังหวัดได้" | |
| elif 7 <= total_score <= 12: | |
| severity = "ระดับรุนแรงปานกลาง (Moderate Severity)" | |
| recommendation = "ใช้ทรัพยากรจากระดับเขตบริการสุขภาพ" | |
| else: | |
| severity = "ระดับรุนแรงมาก (Major Severity)" | |
| recommendation = "ต้องใช้ทรัพยากรจากเขตอื่นหรือระดับประเทศ" | |
| image_path = SEVERITY_IMAGES.get(severity, None) | |
| markdown_text = ( | |
| f"**คะแนนรวม:** {total_score}/18\n\n" | |
| f"**ระดับความรุนแรง:** {severity}\n\n" | |
| f"**คำแนะนำ:** {recommendation}" | |
| ) | |
| return markdown_text, None, image_path | |
| # ============================================================ | |
| # 4. Prepare UI Options | |
| # ============================================================ | |
| bodies_options = list(CRITERIA_MAP['num_bodies'].keys()) | |
| path_options = list(CRITERIA_MAP['forensic_available'].keys()) | |
| morgue_options = list(CRITERIA_MAP['morgue_capacity'].keys()) | |
| change_options = list(CRITERIA_MAP['body_condition'].keys()) | |
| # ============================================================ | |
| # 5. Footer | |
| # ============================================================ | |
| APP_FOOTER = """ | |
| <div style='text-align:center; margin-top:25px; font-size:14px; color:#777;'> | |
| <hr> | |
| <p> | |
| 📘 <a href="https://drive.google.com/file/d/1D_AzqPkTaRKaw14y6lsCU4OkKJ524c03/view" target="_blank"> | |
| คู่มือการใช้งาน (Manual)</a> | |
| </p> | |
| <p>🔖 Version & License: v1.0.0 | © BH 2025 | CC BY-NC-SA 4.0</p> | |
| </div> | |
| """ | |
| # ============================================================ | |
| # 6. Build UI | |
| # ============================================================ | |
| with gr.Blocks() as demo: | |
| # Custom CSS | |
| gr.HTML(""" | |
| <style> | |
| .title-box { | |
| text-align:center; | |
| font-size:27px; | |
| font-weight:700; | |
| padding:12px; | |
| } | |
| .card { | |
| background:#f9f9f9; | |
| padding:20px; | |
| border-radius:12px; | |
| border:1px solid #ddd; | |
| margin-bottom:18px; | |
| } | |
| </style> | |
| """) | |
| gr.HTML("<div class='title-box'>🕊️ Mass Fatality Severity Assessment Tool</div>") | |
| # ---------------- Inputs ---------------- | |
| with gr.Column(elem_classes="card"): | |
| gr.Markdown("### 🔍 โปรดกรอกข้อมูล") | |
| inp_bodies = gr.Radio(bodies_options, label="1. จำนวนศพที่คาดการณ์") | |
| inp_path = gr.Radio(path_options, label="2. จำนวนแพทย์นิติเวช") | |
| inp_morgue = gr.Radio(morgue_options, label="3. จำนวนตู้เก็บศพ") | |
| inp_change = gr.Radio(change_options, label="4. การเปลี่ยนแปลงของสภาพศพ") | |
| # ---------------- Outputs ---------------- | |
| with gr.Column(elem_classes="card"): | |
| gr.Markdown("### 📊 ผลการประเมิน") | |
| out_md = gr.Markdown() | |
| out_img = gr.Image(label="ผลลัพธ์ระดับความรุนแรง", height=250) | |
| run_btn = gr.Button("ประเมินผล", variant="primary") | |
| run_btn.click( | |
| fn=assess_mass_fatality, | |
| inputs=[inp_bodies, inp_path, inp_morgue, inp_change], | |
| outputs=[out_md, out_img, out_img] # Markdown, NULL, Image | |
| ) | |
| gr.HTML(APP_FOOTER) | |
| demo.launch() | |