"""system calc utils. 1. get connectors where model_id='@model_id' and belong_type='Equipment' and mep_system_type='@system_name' 2. get path start with connector,end with triple ,cross,equipment,end """ from functools import cmp_to_key import vg import json from relations.src.system_relation import revit_const def path2edge(elements): """ Convert path to GraphtEdge :param elements: :return: """ pass def graph_arrange(graph): """ Combine Vertex that connect to virtul Vertex :param graph: :return: """ pass def connector_sort(connector1, connector2): """Use Define Sort rule""" dic = {revit_const.EQUIPMENT: 0, revit_const.COMPONENT: 1,revit_const.JoinObject:2, revit_const.OTHER: 2, revit_const.PIPE: 3, revit_const.DUCT: 4} x = dic[connector1.belong_type] y = dic[connector2.belong_type] return 1 if x > y else -1 def sort_connectors(connectors): """Sort Connector order by Equipment>EquipPart>Other>Pipe>Duct""" return sorted(connectors, key=cmp_to_key(lambda x, y: connector_sort(x, y))) def is_break_condition(element): """Path end Condition.""" res = element.type in revit_const.FACILITY return res def dic2obj(d): """Convert Dict to Object. """ top = type('new', (object,), d) seqs = tuple, list, set, frozenset for i, j in d.items(): j0 = j try: j0 = json.loads(j0) except Exception as e: pass if isinstance(j0, dict): setattr(top, i, dic2obj(j0)) elif isinstance(j0, seqs): setattr(top, i, type(j0)(dic2obj(sj) if isinstance(sj, dict) else sj for sj in j0)) else: setattr(top, i, j0) return top def sqldata2objlist(data): '''Convert Sqldata to Object list. ''' return list(map(dic2obj,data)) def list_to_dict(lis): '''Convert list to id Dict. :param lis: :return: ''' ids = [idx.id for idx in lis if idx.id] dic = dict(zip(ids, lis)) return dic def add_attr_is_used(x): """ Add is_used attribute. :param x: :return: """ x.is_used = False return x def is_xyz_equal(origin1, origin2): """ Judge the two origin are almost equal. :param origin1: :param origin2: :return: """ v1 = [origin1.X, origin1.Y, origin1.Z] v2 = [origin2.X, origin2.Y, origin2.Z] return vg.almost_equal(v1, v2, atol=1e-08) def get_specify_type_parent(vertex, type): parent = vertex try: while not isinstance(parent, type): parent = parent.parent except : parent=None return parent