# -*- coding: utf-8 -*-

__author__ = 'TUMCIVIL'
__version__ = '2.0.0'
__title__ = 'เซ็ตระดับท้องผนัง\nเท่าท้องผนัง'
__doc__ = """Created by : TUMCIVIL TEAM
Version : 2.0.0
Update : วันที่ 03-03-2025
_________________________________________________________________
รายการ :
เซ็ตระดับท้องผนังให้เท่าท้องผนัง แต่ระดับหลังผนังคงเดิม
_________________________________________________________________
ข้อจำกัดการใช้งาน :
1.ไม่สามารถใช้กับผนังที่ Slope ได้
2.ไม่สามารถใช้กับผนังที่สร้างจาก Model In-Place ได้
3.ระดับหลังผนังที่ต้องการเซ็ตต้องสูงกว่าระดับท้องผนังหลัก
_________________________________________________________________
วิธีการใช้ :
1. เลือกผนังหลัก
2. เลือกผนังที่ต้องการเช็ตระดับได้ไม่มีที่สิ้นสุด
3. ต้องการออกกด 'Esc'
 """

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> IMPORTS
from pyrevit import forms, revit
from Autodesk.Revit.DB import (BuiltInParameter)

# >>>>>>>>>> CUSTOM IMPORTS
from Snippets._convert_units import convert_internal_units
from Snippets._level import levels,get_levels_walls
from Snippets._level import *
from Snippets._selection import pick_wall

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> VARIABLES
doc   = __revit__.ActiveUIDocument.Document
uidoc = __revit__.ActiveUIDocument
app   = __revit__.Application

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> MAIN
if __name__ == '__main__':
    levels_model = levels()

    #>>>>>>>>>> SELECT MAIN WALL
    try: Selected_wall = pick_wall(uidoc)
    except: forms.alert("Script is canceled.",exitscript=True,title="Script Canceled.")

    Main_levels_wall = get_levels_walls(levels_model,Selected_wall)
    Main_Top_elevation = Main_levels_wall[1]
    Main_Bottom_elevation = Main_levels_wall[0]

    # print("Main_Top_elevation = {}".format(convert_internal_units(Main_Top_elevation, False, units='mm')))
    # print("Main_Bottom_elevation = {}".format(convert_internal_units(Main_Bottom_elevation, False, units='mm')))

    

    #>>>>>>>>>> BASE
    Main_Base_Containt  = Selected_wall.get_Parameter(BuiltInParameter.WALL_BASE_CONSTRAINT).AsElementId()
    Main_Base_Offset    = Selected_wall.get_Parameter(BuiltInParameter.WALL_BASE_OFFSET).AsDouble()

    #>>>>>>>>>> TOP
    Main_Top_Constraint     = Selected_wall.get_Parameter(BuiltInParameter.WALL_HEIGHT_TYPE)
    Main_Top_Constraint_Id  = Selected_wall.get_Parameter(BuiltInParameter.WALL_HEIGHT_TYPE).AsElementId()
    Main_is_unconnected     = str(Main_Top_Constraint_Id) == "-1"  # True = Unconnected / False = Up to Level


    #>>>>>>>>>> LOOP: SELECT MATCH WALL
    with forms.WarningBar(title="Pick Wall to match base constrains:", handle_esc=True):
        while True:

            #>>>>>>>>>> PICK WALL
            try:    Match_wall = pick_wall(uidoc)
            except: break
            if not Match_wall: break
            Match_levels_wall = get_levels_walls(levels_model,Match_wall)
            Match_Top_elevation = Match_levels_wall[1]
            Match_Bottom_elevation = Match_levels_wall[0]

            # print("Match_Top_elevation = {}".format(convert_internal_units(Match_Top_elevation, False, units='mm')))
            # print("Match_Bottom_elevation = {}".format(convert_internal_units(Match_Bottom_elevation, False, units='mm')))

            # หาค่าระดับ Top ของผนังที่ต้องการเซ็ตค่า เพื่อปรับระดับให้คงเดิม
            for i in levels_model:
                if Match_Top_elevation < i[1] and i == levels_model[0] :
                    Match_Top_Level_value =i[1]
                    Match_Top_Level =i[2]
                elif Match_Top_elevation >= i[1] :
                    Match_Top_Level_value =i[1]
                    Match_Top_Level =i[2]
            match_top_offset = Match_Top_elevation-Match_Top_Level_value
            # print("match_top_offset = {}".format(convert_internal_units(match_top_offset, False, units='mm')))

            #>>>>>>>>>> SET PARAMETERS
            if Match_Top_elevation > Main_Bottom_elevation:
                with revit.Transaction("Wall"):
                    Match_wall.get_Parameter(BuiltInParameter.WALL_BASE_OFFSET).Set(Main_Base_Offset)
                    Match_wall.get_Parameter(BuiltInParameter.WALL_BASE_CONSTRAINT).Set(Main_Base_Containt)
                    Match_wall.get_Parameter(BuiltInParameter.WALL_HEIGHT_TYPE).Set(Match_Top_Level)
                    Match_wall.get_Parameter(BuiltInParameter.WALL_TOP_OFFSET).Set(match_top_offset)
            else:
                forms.alert("ระดับหลังผนังที่ต้องการเซ็ต\nต้องสูงกว่าระดับท้องผนังหลัก",exitscript=False,title="Script Canceled.")
                pass
