# -*- coding: utf-8 -*-
__author__ = 'TUMCIVIL'
__version__ = '1.0.0'
__title__ = ' Add Elevation Columns'
__doc__ = """Created by : TUMCIVIL TEAM
Version : 2.0.0 
Update : วันที่ 03-03-2025
_________________________________________________________________
รายการ :
หาค่าระดับโค่นและยอดเสาทั้งหมดใน Model
_________________________________________________________________
ข้อจำกัดการใช้งาน :
1.ไม่สามารถใช้กับคเสาที่ Slope ได้
2.ไม่สามารถใช้กับเสาที่สร้างจาก Model In-Place ได้
3.ให้สร้าง Parameter เป็น Project Parameters ดังนี้ 
    3.1 ชื่อ Base EL Column แบบ Shared parameter เลือก Discipline 
        เป็น Common เลือก Data Type เป็น Text เลือก Group 
        parameter under เป็น Other(หรือตามความต้องการของผู้ใช้) 
        เลือก Instance ,Values are aligned per group type
        เลือก Categories เป็น Columns และ Structural Columns
    3.2 ชื่อ Top EL Column และ Location ใส่ข้อมูลเหมือน 3.1 ทั้งหมด
4.เมื่อใช้คำสั่ง Add Elevation Columns แล้ว ค่าระดับโค่นเสา,ยอดเสา และ 
    ตำแหน่งของเสา (Location) จะมีข้อมูลใส่ใน Parameter ในข้อ 3
    ปรากฏขึ้นที่ Properties ในหัวข้อ Other เมื่อเลือกเสาใดๆ

         
_________________________________________________________________
วิธีการใช้ :
1.ไม่มี


 """
# for timing -------------------------------------------------------------------
import pyrevit.coreutils as cor
from pyrevit.coreutils import Timer
timer = Timer()
# ------------------------------------------------------------------------------
import sys
import csv
import codecs
import os.path as op
from collections import defaultdict

from pyrevit import PyRevitException
from pyrevit import forms
from pyrevit import coreutils
from pyrevit import revit, DB, HOST_APP
from pyrevit import script
import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
import Autodesk.Revit.DB as DB
from Autodesk.Revit.DB.Structure import *
import re

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

doc = __revit__.ActiveUIDocument.Document
uidoc = __revit__.ActiveUIDocument

def checkParameter(parameter):
    storageType = parameter.StorageType
    if (storageType.ToString() == "ElementId"):
        value = parameter.AsValueString()
    return value

# def levels():
#     levels = DB.FilteredElementCollector(doc).OfCategory(DB.BuiltInCategory.OST_Levels) \
#         .WhereElementIsNotElementType() \
#         .ToElements()
#     # print("levels = {}".format(levels))
#     l = len(levels)
#     # print("l = {}".format(l))
#     # out3 = []
#     for e3 in levels:
#         p3 =[]
#         name = e3.get_Parameter(BuiltInParameter.DATUM_TEXT).AsString()
#         # name = e3.LookupParameter("Name").AsString()
#         eleLev = e3.get_Parameter(BuiltInParameter.LEVEL_ELEV).AsDouble()
#         # eleLev = e3.LookupParameter("Elevation").AsDouble()
#         p3.append(name)
#         p3.append(eleLev)
#         # print("levels = {} , {}".format(name,eleLev))

#         out3.append(p3)
    # for i in out3:
    # print("out3 = {}".format(out3))

def columns():
    columns = DB.FilteredElementCollector(doc).OfCategory(DB.BuiltInCategory.OST_StructuralColumns) \
        .WhereElementIsNotElementType() \
        .ToElements()
    levels_model = levels()
    for e in columns:
        p2 = []
        # for j in e.Parameters:
        #     if j.IsShared and j.Definition.Name == "Name Tags":
        #         nameTags = e.get_Parameter(j.GUID).AsString()
        # typeName = e.get_Parameter(BuiltInParameter.ELEM_TYPE_PARAM)
        # value = checkParameter(typeName)

        levels_column = get_levels_columns(levels_model,e)
        Top_elevation = levels_column[1]
        Bottom_elevation = levels_column[0]

        # print("Top_elevation = {}".format(Top_elevation))
        # print("Bottom_elevation = {}".format(Bottom_elevation))

        eleBaseConvert = convert_internal_units(Bottom_elevation, False,units='mm')
        # eleBaseConvert = UnitUtils.ConvertFromInternalUnits(Bottom_elevation,UnitTypeId.Millimeters)
        if eleBaseConvert >= 0:
            eleBaseCombine = "+"+str(round(eleBaseConvert)).replace(".0","")
            # eleBaseCombine = "EL.+"+str(round(eleBaseConvert)).replace(".0","")
        elif eleBaseConvert < 0:
            eleBaseCombine = str(round(eleBaseConvert)).replace(".0","")
            # eleBaseCombine = "EL."+str(round(eleBaseConvert)).replace(".0","")

        eleTopConvert = convert_internal_units(Top_elevation, False,units='mm')
        # eleTopConvert = UnitUtils.ConvertFromInternalUnits(Top_elevation,UnitTypeId.Millimeters)
        if eleTopConvert >= 0:
            eleTopCombine = "+"+str(round(eleTopConvert)).replace(".0","")
            # eleTopCombine = "EL.+"+str(round(eleTopConvert)).replace(".0","")
        elif eleTopConvert < 0:
            eleTopCombine = str(round(eleTopConvert)).replace(".0","")
            # eleTopCombine = "EL."+str(round(eleTopConvert)).replace(".0","")

        
        colLoMark = e.get_Parameter(BuiltInParameter.COLUMN_LOCATION_MARK).AsString()
        if colLoMark == "":
            colLoMark = "-"

        if eleBaseCombine != None and eleTopCombine != None:
            # print("loCombine = {}".format(loCombine))
            if Top_elevation > Bottom_elevation:
                loCombine = "[(EL."+eleBaseCombine+")"+"-(EL."+eleTopCombine+")];["+colLoMark+"]"
                q10 = eleBaseCombine
                q11 = eleTopCombine

                t = Transaction(doc, 'change parameter')
                t.Start()
                try:
                    e.LookupParameter("Base EL Column").Set(q10)
                    e.LookupParameter("Top EL Column").Set(q11)
                    e.LookupParameter("Location").Set(loCombine)
                except:
                    # TaskDialog.Show('error', 'error message')
                    pass
                t.Commit()
            
            elif Top_elevation < Bottom_elevation:
                loCombine = "[(EL."+eleTopCombine+")"+"-(EL."+eleBaseCombine+")];["+colLoMark+"]"
                q10 = eleBaseCombine
                q11 = eleTopCombine

                t = Transaction(doc, 'change parameter')
                t.Start()
                try:
                    e.LookupParameter("Base EL Column").Set(q11)
                    e.LookupParameter("Top EL Column").Set(q10)
                    e.LookupParameter("Location").Set(loCombine)
                except:
                    # TaskDialog.Show('error', 'error message')
                    pass
                t.Commit()




if __name__ == "__main__":
    out2 = []
    out3 = []
    levels()
    columns()

# for timing -------------------------------------------------------------------
print("====" * 20)
print("ADD ELEVATION DATA COLUMNS COMPLETELY !")
endtime = timer.get_time()
print("Time been used = {} sec.".format(endtime))
currentDate = cor.current_date()
currentTime = cor.current_time()
print ("Date : {} ; {}".format(currentDate,currentTime))
print ("Credited by : {}".format(__author__))
print("====" * 20)
# ------------------------------------------------------------------------------