# -*- coding: utf-8 -*-
__author__ = 'TUMCIVIL'
__version__ = '2.0.0'
__title__ = ' Add Piles Coordinates (Units = Meters)'
__doc__ = """Created by : TUMCIVIL TEAM
Version : 2.0.0 
Update : วันที่ 03-03-2025
_________________________________________________________________
รายการ :
หาค่าพิกัดศูนย์กลางเสาเข็ม (Center Coordinate of Pile) 
Cooridinate Base แบบ Survey Point ใน Model
_________________________________________________________________
ข้อจำกัดการใช้งาน :
1.จะได้ค่าพิกัดในหน่วยเมตร (Units = Meters) เท่านั้น
2.ให้สร้าง Parameter เป็น Project Parameters ดังนี้ 
    2.1 ชื่อ N แบบ Shared parameter เลือก Discipline 
        เป็น Common เลือก Data Type เป็น Number เลือก Group 
        parameter under เป็น Other(หรือตามความต้องการของผู้ใช้) 
        เลือก Instance ,Values are aligned per group type
        เลือก Categories เป็น Structural Foundations
    2.2 ชื่อ E ใส่ข้อมูลเหมือน 2.1 ทั้งหมด
    2.3 ชื่อ Pile No.แบบ Shared parameter เลือก Discipline 
        เป็น Common เลือก Data Type เป็น Text เลือก Group 
        parameter under เป็น Other(หรือตามความต้องการของผู้ใช้) 
        เลือก Instance ,Values are aligned per group type
        เลือก Categories เป็น Structural Foundations
3.การสร้าง Family ของเสาเข็ม จำเป็นต้องใช้ชื่อของ Name Type ของ 
    Family ให้มีคำว่า Pile นำหน้าเท่านั้น เช่น Pile Square - 0.30x0.30
    และ Family นี้ Categories ต้องเป็น Structural Foundations เท่านั้น


_________________________________________________________________
วิธีการใช้ :
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


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))
    for e3 in levels:
        p3 =[]
        name = e3.get_Parameter(BuiltInParameter.DATUM_TEXT).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)

def remove_none_digit(s):
    t = ""
    for c in s:
        if c.isdigit():
            t += c
    return t

def NE():
    foundations = DB.FilteredElementCollector(doc).OfCategory(DB.BuiltInCategory.OST_StructuralFoundation) \
        .WhereElementIsNotElementType() \
        .ToElements()

    if len(foundations)!= 0:
        familyType = []
        # out = []
        for e in foundations:
                p2 = []
                id = e.Id
                name1 = e.Name
                family2 = e.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM)
                value2 = checkParameter(family2)
                if value2 != "Wall Foundation" and value2 != "Foundation Slab" and bool(re.match("Pile", name1)) == True:
                    coor = e.Location.Point
                    xsc = round(UnitUtils.ConvertFromInternalUnits(doc.ActiveProjectLocation.GetProjectPosition(coor)
                            .NorthSouth,UnitTypeId.Meters),4)
                    ysc = round(UnitUtils.ConvertFromInternalUnits(doc.ActiveProjectLocation.GetProjectPosition(coor)
                            .EastWest,UnitTypeId.Meters),4)
                    for j in e.Parameters:
                        if j.IsShared and j.Definition.Name == "Pile No.":
                            pileNo = e.get_Parameter(j.GUID).AsString()


                    t = Transaction(doc, 'change parameter')
                    t.Start()
                    try:
                        e.LookupParameter("N").Set(xsc)
                    except:
                        pass
                    try:
                        e.LookupParameter("E").Set(ysc)
                    except:
                        pass
                    t.Commit()

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

# for timing -------------------------------------------------------------------
print("====" * 20)
print("ADD COORDINATED PILES 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)
# ------------------------------------------------------------------------------