import ezdxf

# Criar arquivo DXF em milímetros para corte CNC / Plotter / Impressão 1:1
doc = ezdxf.new(dxfversion="R2010", setup=True)
msp = doc.modelspace()

# Definir Layers e Cores
doc.layers.add("CORTE_CASCO", color=1)      # Vermelho = Linha de corte
doc.layers.add("CORTE_CABINE", color=5)     # Azul = Linha de corte cabine
doc.layers.add("ENTALHES", color=7)         # Branco = Encaixes de longarinas/quilha
doc.layers.add("CENTRO_NIVEL", color=3)     # Verde = Linha de Centro (CL) e Linha d'Água (WL)
doc.layers.add("TEXTO_MEDIDAS", color=2)    # Amarelo = Anotações e nomes

# Dados das 9 Balizas (dimensões em mm)
# (nome, half_w_top, depth, chine_h, deck_h)
stations = [
    ("B0_ESPELHO_POPA", 380, 500, 150, 850),
    ("B1_PRACA_MAQUINAS", 400, 540, 180, 850),
    ("B2_PORAO_RE", 410, 550, 200, 850),
    ("B3_PORAO_VANTE", 410, 550, 200, 850),
    ("B4_MEIA_NAU", 410, 550, 200, 850),
    ("B5_ACOMODACOES", 400, 520, 220, 880),
    ("B6_CABINE_VANTE", 360, 480, 250, 900),
    ("B7_TRANSICAO_PROA", 280, 400, 280, 920),
    ("B8_PROA_WAVE_PIERCING", 140, 250, 300, 950),
]

# Disposição das balizas no espaço DXF (grid 3x3) com espaçamento de 1200 mm
for idx, (name, half_w, d, chine_h, deck_h) in enumerate(stations):
    col = idx % 3
    row = idx // 3
    cx = col * 1200.0
    cy = - row * 1800.0

    chine_y = -d + chine_h
    chine_w = half_w * 0.92

    # Contorno de Corte do Molde (Polilinha fechada)
    pts = [
        (cx - half_w, cy + deck_h),
        (cx + half_w, cy + deck_h),
        (cx + chine_w, cy + chine_y),
        (cx, cy - d),
        (cx - chine_w, cy + chine_y),
        (cx - half_w, cy + deck_h)
    ]
    msp.add_lwpolyline(pts, dxfattribs={"layer": "CORTE_CASCO", "closed": True})

    # Linha de Centro (CL) e Linha d'Água (WL)
    msp.add_line((cx, cy - d - 100), (cx, cy + deck_h + 100), dxfattribs={"layer": "CENTRO_NIVEL"})
    msp.add_line((cx - half_w - 80, cy), (cx + half_w + 80, cy), dxfattribs={"layer": "CENTRO_NIVEL"})

    # Entalhe central da quilha (60 x 60 mm)
    k_pts = [
        (cx - 30, cy - d),
        (cx + 30, cy - d),
        (cx + 30, cy - d + 60),
        (cx - 30, cy - d + 60),
        (cx - 30, cy - d)
    ]
    msp.add_lwpolyline(k_pts, dxfattribs={"layer": "ENTALHES", "closed": True})

    # Entalhes das longarinas no chine (40 x 40 mm)
    # Direita
    msp.add_lwpolyline([
        (cx + chine_w - 20, cy + chine_y - 20),
        (cx + chine_w + 20, cy + chine_y - 20),
        (cx + chine_w + 20, cy + chine_y + 20),
        (cx + chine_w - 20, cy + chine_y + 20),
        (cx + chine_w - 20, cy + chine_y - 20)
    ], dxfattribs={"layer": "ENTALHES", "closed": True})

    # Esquerda
    msp.add_lwpolyline([
        (cx - chine_w - 20, cy + chine_y - 20),
        (cx - chine_w + 20, cy + chine_y - 20),
        (cx - chine_w + 20, cy + chine_y + 20),
        (cx - chine_w - 20, cy + chine_y + 20),
        (cx - chine_w - 20, cy + chine_y - 20)
    ], dxfattribs={"layer": "ENTALHES", "closed": True})

    # Textos de identificação
    msp.add_text(f"{name}", dxfattribs={"layer": "TEXTO_MEDIDAS", "height": 35}).set_placement((cx, cy + deck_h + 30), align=ezdxf.enums.TextEntityAlignment.CENTER)
    msp.add_text(f"Largura: {2*half_w:.0f} mm | Altura: {d+deck_h:.0f} mm", dxfattribs={"layer": "TEXTO_MEDIDAS", "height": 22}).set_placement((cx, cy - d - 60), align=ezdxf.enums.TextEntityAlignment.CENTER)

# ---------------------------------------------------------
# PEÇAS DA CABINE CENTRAL (DXF 1:1)
# ---------------------------------------------------------
cab_y = - 3 * 1800.0

# 1. Para-brisa Frontal
cx1 = 0.0
p_front = [
    (cx1 - 900, cab_y),
    (cx1 + 900, cab_y),
    (cx1 + 750, cab_y + 850),
    (cx1 - 750, cab_y + 850),
    (cx1 - 900, cab_y)
]
msp.add_lwpolyline(p_front, dxfattribs={"layer": "CORTE_CABINE", "closed": True})
msp.add_text("CABINE_PARA-BRISA_FRONTAL (1x)", dxfattribs={"layer": "TEXTO_MEDIDAS", "height": 35}).set_placement((cx1, cab_y + 900), align=ezdxf.enums.TextEntityAlignment.CENTER)

# Recortes das janelas frontais
msp.add_lwpolyline([(cx1 - 800, cab_y + 100), (cx1 - 50, cab_y + 100), (cx1 - 50, cab_y + 750), (cx1 - 680, cab_y + 750), (cx1 - 800, cab_y + 100)], dxfattribs={"layer": "CORTE_CABINE", "closed": True})
msp.add_lwpolyline([(cx1 + 50, cab_y + 100), (cx1 + 800, cab_y + 100), (cx1 + 680, cab_y + 750), (cx1 + 50, cab_y + 750), (cx1 + 50, cab_y + 100)], dxfattribs={"layer": "CORTE_CABINE", "closed": True})

# 2. Lateral da Cabine (2x)
cx2 = 1800.0
p_lat = [
    (cx2, cab_y),
    (cx2 + 2600, cab_y),
    (cx2 + 2100, cab_y + 950),
    (cx2, cab_y + 950),
    (cx2, cab_y)
]
msp.add_lwpolyline(p_lat, dxfattribs={"layer": "CORTE_CABINE", "closed": True})
msp.add_text("CABINE_LATERAL (Cortar 2x: Boreste e Bombordo)", dxfattribs={"layer": "TEXTO_MEDIDAS", "height": 35}).set_placement((cx2 + 1300, cab_y + 1000), align=ezdxf.enums.TextEntityAlignment.CENTER)

# Salvar arquivo DXF
dxf_path = "/home/magdalena/eee/alunos/alberico-de-carvalho-santiago/Gabaritos_Corte_1para1_Powercat_8_5m.dxf"
doc.saveas(dxf_path)
print(f"DXF gerado com sucesso em {dxf_path}")
