import ezdxf
from ezdxf.math import Vec2

def add_layer(doc, name, color=7):
    """添加图层并设置颜色"""
    if name not in doc.layers:
        layer = doc.layers.add(name)
        layer.color = color
    return name

def draw_rectangle(msp, layer, p1, p2, color=None):
    """绘制矩形，p1和p2为对角点坐标(Vec2)"""
    points = [
        (p1.x, p1.y),
        (p2.x, p1.y),
        (p2.x, p2.y),
        (p1.x, p2.y),
        (p1.x, p1.y)
    ]
    if color is not None:
        msp.add_lwpolyline(points, dxfattribs={'layer': layer, 'color': color})
    else:
        msp.add_lwpolyline(points, dxfattribs={'layer': layer})

def draw_text(msp, layer, text, pos, height=1.0):
    """添加文字标注"""
    msp.add_text(text, dxfattribs={'layer': layer, 'height': height}).set_pos(pos, align='MIDDLE_CENTER')

def draw_room(msp, layer, x1, y1, x2, y2, name, text_height=1.0):
    """绘制房间（矩形+文字）"""
    draw_rectangle(msp, layer, Vec2(x1, y1), Vec2(x2, y2))
    cx = (x1 + x2) / 2
    cy = (y1 + y2) / 2
    draw_text(msp, layer, name, (cx, cy), text_height)

# 创建DXF文档
doc = ezdxf.new(setup=True)
msp = doc.modelspace()

# 添加图层
layer_wall = add_layer(doc, "Walls", color=7)      # 墙体/轮廓
layer_label = add_layer(doc, "Labels", color=3)     # 文字标注
layer_grid = add_layer(doc, "Grid", color=9)        # 轴网
layer_dim = add_layer(doc, "Dimension", color=2)    # 尺寸标注
layer_furniture = add_layer(doc, "Furniture", color=4) # 家具/示意

# 建筑外轮廓（40m×40m）
building_origin = Vec2(0, 0)
building_size = Vec2(40, 40)
draw_rectangle(msp, layer_wall, building_origin, building_size)

# ========== 首层平面 (±0.00) ==========
# 主入口灰空间（西侧退让8m）
draw_rectangle(msp, layer_wall, Vec2(0, 0), Vec2(8, 40))
draw_text(msp, layer_label, "入口灰空间", (4, 20), 1.2)

# 主门厅（通高，西侧中部）
draw_room(msp, layer_wall, 8, 12, 24, 28, "主门厅\n(通高)", 1.0)

# 咖啡/休息（南侧）
draw_room(msp, layer_wall, 8, 0, 20, 12, "咖啡厅/休息", 0.9)

# 临时展厅（北侧）
draw_room(msp, layer_wall, 8, 28, 22, 40, "临时展厅", 0.9)

# 数字体验区（东侧偏南）
draw_room(msp, layer_wall, 24, 0, 40, 12, "数字体验区", 0.9)

# 黑匣子剧场（核心位置）
draw_room(msp, layer_wall, 18, 12, 40, 30, "黑匣子剧场\n(150-200座)", 1.0)

# 后台/化妆（剧场东侧）
draw_room(msp, layer_wall, 30, 30, 40, 40, "后台/化妆", 0.8)

# 卫生间（东南角）
draw_room(msp, layer_wall, 32, 0, 40, 8, "卫生间", 0.8)

# 垂直交通核（东北角：楼梯+电梯）
draw_room(msp, layer_wall, 30, 8, 40, 18, "交通核\n(楼梯/电梯)", 0.8)

# 首层标题
draw_text(msp, layer_label, "=== 首层平面图 (±0.00) ===", (20, -3), 1.5)

# ========== 二层平面 (+5.5m) ==========
# 偏移Y方向60m作为二层区域
offset_y = 60

# 剧场楼座（西侧）
draw_room(msp, layer_wall, 0+offset_y, 12+offset_y, 16+offset_y, 28+offset_y, "剧场楼座\n(80-100座)", 0.9)

# 舞蹈教室×2（南侧）
draw_room(msp, layer_wall, 16+offset_y, 0+offset_y, 28+offset_y, 10+offset_y, "舞蹈教室1\n(带把杆)", 0.8)
draw_room(msp, layer_wall, 28+offset_y, 0+offset_y, 40+offset_y, 10+offset_y, "舞蹈教室2\n(带把杆)", 0.8)

# 声乐教室×2（东侧）
draw_room(msp, layer_wall, 16+offset_y, 10+offset_y, 28+offset_y, 20+offset_y, "声乐教室1", 0.8)
draw_room(msp, layer_wall, 28+offset_y, 10+offset_y, 40+offset_y, 20+offset_y, "声乐教室2", 0.8)

# 美术教室×2（北侧）
draw_room(msp, layer_wall, 0+offset_y, 28+offset_y, 15+offset_y, 40+offset_y, "美术教室1\n(北向光)", 0.8)
draw_room(msp, layer_wall, 15+offset_y, 28+offset_y, 30+offset_y, 40+offset_y, "美术教室2\n(北向光)", 0.8)

# 开放式阅览/活动区（中部）
draw_room(msp, layer_wall, 0+offset_y, 0+offset_y, 16+offset_y, 12+offset_y, "开放式阅览\n/活动区", 0.9)

# 卫生间（东南角）
draw_room(msp, layer_wall, 30+offset_y, 20+offset_y, 40+offset_y, 28+offset_y, "卫生间", 0.8)

# 交通核（东北角）
draw_room(msp, layer_wall, 30+offset_y, 28+offset_y, 40+offset_y, 40+offset_y, "交通核", 0.8)

draw_text(msp, layer_label, "=== 二层平面图 (+5.5m) ===", (20, 57), 1.5)

# ========== 三层平面 (+11.0m) ==========
offset_y = 120

# 器乐排练室×3（西侧）
draw_room(msp, layer_wall, 0+offset_y, 0+offset_y, 13+offset_y, 12+offset_y, "器乐排练1", 0.8)
draw_room(msp, layer_wall, 0+offset_y, 12+offset_y, 13+offset_y, 24+offset_y, "器乐排练2", 0.8)
draw_room(msp, layer_wall, 0+offset_y, 24+offset_y, 13+offset_y, 36+offset_y, "器乐排练3", 0.8)

# 多功能活动室（南侧，可分可合）
draw_room(msp, layer_wall, 13+offset_y, 0+offset_y, 30+offset_y, 15+offset_y, "多功能活动室\n(可分可合)", 0.9)

# 亲子活动区（东侧）
draw_room(msp, layer_wall, 13+offset_y, 15+offset_y, 30+offset_y, 28+offset_y, "亲子活动区", 0.9)

# 管理办公区（北侧）
draw_room(msp, layer_wall, 13+offset_y, 28+offset_y, 30+offset_y, 40+offset_y, "管理办公\n+会议室", 0.9)

# 屋顶花园（南侧部分，示意）
draw_room(msp, layer_furniture, 30+offset_y, 0+offset_y, 40+offset_y, 15+offset_y, "屋顶花园", 0.8)

# 卫生间（东南角）
draw_room(msp, layer_wall, 30+offset_y, 15+offset_y, 40+offset_y, 25+offset_y, "卫生间", 0.8)

# 交通核（东北角）
draw_room(msp, layer_wall, 30+offset_y, 25+offset_y, 40+offset_y, 40+offset_y, "交通核", 0.8)

draw_text(msp, layer_label, "=== 三层平面图 (+11.0m) ===", (20, 117), 1.5)

# ========== 四层平面 (+16.5m) ==========
offset_y = 180

# 剧场设备层（西侧）
draw_room(msp, layer_wall, 0+offset_y, 0+offset_y, 20+offset_y, 20+offset_y, "剧场设备层", 0.9)

# 档案室（南侧）
draw_room(msp, layer_wall, 0+offset_y, 20+offset_y, 15+offset_y, 30+offset_y, "档案室", 0.8)

# 员工休息室（东侧）
draw_room(msp, layer_wall, 20+offset_y, 0+offset_y, 35+offset_y, 15+offset_y, "员工休息室", 0.8)

# 安保监控中心（东南角）
draw_room(msp, layer_wall, 20+offset_y, 15+offset_y, 35+offset_y, 25+offset_y, "安保监控", 0.8)

# 屋顶绿化/太阳能（剩余屋面）
draw_room(msp, layer_furniture, 0+offset_y, 30+offset_y, 40+offset_y, 40+offset_y, "屋顶绿化\n/太阳能板", 0.9)

# 交通核（东北角）
draw_room(msp, layer_wall, 35+offset_y, 25+offset_y, 40+offset_y, 40+offset_y, "交通核", 0.8)

draw_text(msp, layer_label, "=== 四层平面图 (+16.5m) ===", (20, 177), 1.5)

# ========== 地下一层 (-4.5m) 示意 ==========
offset_y = 240

# 机动车库
draw_room(msp, layer_wall, 0+offset_y, 0+offset_y, 35+offset_y, 30+offset_y, "机动车库\n(50辆)", 1.0)

# 非机动车库
draw_room(msp, layer_wall, 0+offset_y, 30+offset_y, 15+offset_y, 40+offset_y, "非机动车库\n(100辆)", 0.8)

# 设备机房
draw_room(msp, layer_wall, 15+offset_y, 30+offset_y, 30+offset_y, 40+offset_y, "设备机房\n(空调/电)", 0.8)

# 库房/垃圾处理
draw_room(msp, layer_wall, 30+offset_y, 30+offset_y, 40+offset_y, 40+offset_y, "库房/垃圾", 0.8)

# 坡道示意（东北角）
draw_text(msp, layer_label, "← 车库坡道入口", (38, 245), 0.8)

draw_text(msp, layer_label, "=== 地下一层平面图 (-4.5m) ===", (20, 237), 1.5)

# ========== 指北针 ==========
north_center = Vec2(5, -8)
msp.add_blockref("_OPEN90", north_center, dxfattribs={'layer': layer_label})
draw_text(msp, layer_label, "北", (5, -6), 0.8)

# 图框
frame_min = Vec2(-5, -15)
frame_max = Vec2(45, 260)
draw_rectangle(msp, layer_wall, frame_min, frame_max)

# 保存文件
doc.saveas("cultural_center_floorplans.dxf")
print("✅ DXF文件已生成: cultural_center_floorplans.dxf")
print("📍 包含: 地下一层、首层、二层、三层、四层平面图")
print("📐 比例: 1单位 = 1米，导入CAD后按1:100设置即可")