jxing 5 سال پیش
والد
کامیت
25f7af75c6
2فایلهای تغییر یافته به همراه179 افزوده شده و 183 حذف شده
  1. 173 165
      src/affected_space/function.py
  2. 6 18
      src/affected_space/test.py

+ 173 - 165
src/affected_space/function.py

@@ -1,183 +1,191 @@
 # floor_id 是revit的楼层id
 
-CREATE OR REPLACE FUNCTION rel_affected_space(project_id character varying, floor_id character varying) RETURNS boolean AS
+CREATE OR REPLACE FUNCTION rel_affected_space(floor_id character varying) RETURNS boolean AS
 $$
 from relations.src.affected_space.affected_space import get_affected_spaced
 from shapely.geometry import Polygon
 import json
 
-# try:
-# 获取当前楼层绑定的数据中心楼层的id
-floor_plan = plpy.prepare("SELECT current_model_id, bind_floor_ids FROM revit.model_floor where id = $1", ["text"])
-floor_data = floor_plan.execute([floor_id])
-if len(floor_data) != 1:
-    plpy.info("no floor")
-    return True
-floor_arr = json.loads(floor_data[0]['bind_floor_ids'])
-if len(floor_arr) == 0:
-    plpy.info("no binding floor")
-    return True
-floor_str = ""
-for fl in floor_arr:
-    floor_str = (floor_str + fl + ',')
-floor_str = floor_str.strip(',')
-plpy.info(floor_str)
-# 获取当前模型和前一个版本的模型id
-model_plan = plpy.prepare("select id from revit.model_file where model_floor_id = $1 and removed = false and status = 4 and version is not null order by version desc", ["text"])
-model_data = model_plan.execute([floor_id], 2)
-if len(model_data) != 2:
-    plpy.info("no previous model")
-    return True
-sql_str = "select rel.floor_id, rel.space_id, sp.outline from r_sp_in_fl rel left join zone_space_base sp on rel.space_id = sp.id where rel.floor_id in (" + floor_str + ")"
-# 查询出来的跟模型可能相关的所有业务空间
-space_data = plpy.execute(sql_str)
-if len(space_data) == 0:
-    plpy.info("no space relation under binding floor")
-    return True
-plpy.info(space_data)
-plpy.info(len(space_data))
-# 获取新模型的元空间
-new_ispace_plan = plpy.prepare("select source_id, outline where model_id = $1", ["text"])
-new_ispace_data = new_ispace_plan.execute([model_data[0]['id']])
-
-# 获取旧模型的所有元空间
-prev_ispace_plan = plpy.prepare("select source_id, outline where model_id = $1", ["text"])
-prev_ispace_data = prev_ispace_plan.execute([model_data[1]['id']])
-
-affected_space_ids = get_affected_spaced(space_data, new_ispace_data, prev_ispace_data)
-
-plpy.info(affected_space_ids)
-for space_id in affected_space_ids:
-    space_plan = plpy.prepare("update zone_space_base set state = 1 where id = $1", ["text"])
-    space_plan.execute([space_id])
-
-return True
-# except Exception as e:
-#     plpy.info(e)
-#     return False
-$$
-LANGUAGE 'plpython3u' VOLATILE;
-
-space_outline_json_map = dict()
-result_arr = []
-# 每个楼层的每个业务空间分别和别的楼层的每个业务空间判断is_vertically_overlap
-# 将结果是true的两个业务空间保存起来
-for building_id, floor_map in row_map.items():
-    for floor_id, type_map in floor_map.items():
-        for object_type, row_arr in type_map.items():
-            # 要被对比的楼层
-            for other_floor_id in floor_map.keys():
-                if other_floor_id == floor_id:
-                    continue
-                other_type_map = floor_map.get(other_floor_id)
-                if object_type not in other_type_map:
-                    continue
-                other_row_arr = other_type_map.get(object_type)
-                for row in row_arr:
-                    for other_row in other_row_arr:
-                        space_id = row['space_id']
-                        other_space_id = other_row['space_id']
-                        if space_id == other_space_id:
-                            continue
-                        if space_id not in space_outline_json_map:
-                            outline_json = json.loads(row['outline'])
-                            space_outline_json_map[space_id] = outline_json
-                        if other_space_id not in space_outline_json_map:
-                            other_outline_json = json.loads(other_row['outline'])
-                            space_outline_json_map[other_space_id] = other_outline_json
-                        outline = space_outline_json_map[space_id]
-                        other_outline = space_outline_json_map[other_space_id]
-                        if is_vertically_overlap(outline, other_outline):
-                            single_result = []
-                            single_result.append(space_id)
-                            single_result.append(other_space_id)
-                            single_result.append(object_type)
-                            result_arr.append(single_result)
-if len(result_arr) == 0:
-    return True
-# 删除旧业务空间的垂直交通关系(自动计算的), 添加新关系
-# 将下面对数据库的操作作为一个事务, 出异常则自动rollback
-with plpy.subtransaction():
-    del_plan = plpy.prepare("delete from r_sp_vertical_sp where project_id = $1 and sign = 2", ["text"])
-    del_plan.execute([project_id])
-    for single_result in result_arr:
-        del_manual_plan = plpy.prepare(
-            "delete from r_sp_vertical_sp where (space_id = $1 and space_other_id = $2) or (space_other_id = $1 and space_id = $2)",
-            ["text", "text"])
-        del_manual_plan.execute([single_result[0], single_result[1]])
-        insert_plan = plpy.prepare(
-            "insert into r_sp_vertical_sp(space_id, space_other_id, project_id, sign, object_type) values($1, $2, $3, 2, $4)",
-            ["text", "text", "text", "text"])
-        insert_plan.execute([single_result[0], single_result[1], project_id, single_result[2]])
-
-
-
-
-
+try:
+    # 获取当前楼层绑定的数据中心楼层的id
+    floor_plan = plpy.prepare("SELECT id FROM public.floor where model_id = $1", ["text"])
+    floor_data = floor_plan.execute([floor_id])
+    floor_arr = []
+    for fl_row in floor_data:
+        floor_arr.append(fl_row['id'])
 
+    if len(floor_arr) == 0:
+        plpy.info("no binding floor")
+        return True
+    floor_str = ""
+    for fl in floor_arr:
+        floor_str = (floor_str + "'" + fl + "',")
+    floor_str = floor_str.strip(',')
+    plpy.info(floor_str)
+    # 获取当前模型和前一个版本的模型id
+    model_plan = plpy.prepare("select id from revit.model_file where model_floor_id = $1 and removed = false and status = 4 and version is not null order by version desc", ["text"])
+    model_data = model_plan.execute([floor_id], 2)
+    if len(model_data) != 2:
+        plpy.info("no previous model")
+        return True
+    sql_str = "select rel.floor_id, rel.space_id, sp.outline from r_sp_in_fl rel left join zone_space_base sp on rel.space_id = sp.id where rel.floor_id in (" + floor_str + ")"
+    # 查询出来的跟模型可能相关的所有业务空间
+    space_data = plpy.execute(sql_str)
+    if len(space_data) == 0:
+        plpy.info("no space relation under binding floor")
+        return True
+    plpy.info('space data count : {0}'.format(len(space_data)))
+    # 获取新模型的元空间
+    new_ispace_plan = plpy.prepare("select source_id, outline from revit.space where model_id = $1", ["text"])
+    new_ispace_data = new_ispace_plan.execute([model_data[0]['id']])
+    plpy.info('new_ispace_data count : {0}'.format(len(new_ispace_data)))
+    # 获取旧模型的所有元空间
+    prev_ispace_plan = plpy.prepare("select source_id, outline from revit.space where model_id = $1", ["text"])
+    prev_ispace_data = prev_ispace_plan.execute([model_data[1]['id']])
+    plpy.info('prev_ispace_data count : {0}'.format(len(prev_ispace_data)))
+    if len(prev_ispace_data) == 0:
+        plpy.info("no prev ispace data")
+        return True
 
+    affected_space_ids = get_affected_spaced(space_data, new_ispace_data, prev_ispace_data)
 
 
 
-# 获取Polygon对象
-def get_polygon(single_poly):
-    poly_len = len(single_poly)
-    poly = []
-    for i in range(poly_len):
-        pair = single_poly[i]
-        poly.append((pair["X"], pair["Y"]))
-    return Polygon(poly)
+    plpy.info('affected_space_ids count : {0}'.format(len(affected_space_ids)))
+    for space_id in affected_space_ids:
+        space_plan = plpy.prepare("update zone_space_base set state = 1 where id = $1", ["text"])
+        space_plan.execute([space_id])
 
-# 在polygon1包含polygon2的时候, 检测是否polygon1内的空洞也包含polygon2
-def is_include(polygon1, poly2):
-    length1 = len(polygon1)
-    for i in range(1, length1):
-        poly1 = get_polygon(polygon1[i])
-        if poly1.overlaps(poly2):
-            return True
-        if poly1.equals(poly2) or poly1.contains(poly2):
-            return False
     return True
-
-def is_sub_outline_overlap(polygon1, polygon2):
-    poly1 = get_polygon(polygon1[0])
-    poly2 = get_polygon(polygon2[0])
-    if poly1.overlaps(poly2) or poly1.equals(poly2):
-        return True
-    if poly1.contains(poly2) or poly1.equals(poly2):
-        return is_include(polygon1, poly2)
-    if poly2.contains(poly1) or poly2.equals(poly1):
-        return is_include(polygon2, poly1)
+except Exception as e:
+    plpy.info(e)
     return False
+$$
+LANGUAGE 'plpython3u' VOLATILE;
 
-# 是否垂直方向上面积有重叠
-def is_vertically_overlap(polygon1, polygon2):
-    length1 = len(polygon1)
-    length2 = len(polygon2)
-    if length1 == 0 or length2 == 0:
-        return False
 
-    for i in range(length1):
-        for j in range(length2):
-            if is_sub_outline_overlap(polygon1[i], polygon2[j]):
-                return True
-    return False
 
-# building -> floor -> object_type -> [space_id]
-def compose_dict(zone_data):
-    building_map = dict()
-    for row in zone_data:
-        building_id = row['building_id']
-        floor_id = row['floor_id']
-        object_type = row['object_type']
-        if building_id not in building_map:
-            building_map[building_id] = dict()
-        floor_map = building_map[building_id]
-        if floor_id not in floor_map:
-            floor_map[floor_id] = dict()
-        type_map = floor_map[floor_id]
-        if object_type not in type_map:
-            type_map[object_type] = []
-        arr = type_map[object_type]
-        arr.append(row)
-    return building_map
+#
+# space_outline_json_map = dict()
+# result_arr = []
+# # 每个楼层的每个业务空间分别和别的楼层的每个业务空间判断is_vertically_overlap
+# # 将结果是true的两个业务空间保存起来
+# for building_id, floor_map in row_map.items():
+#     for floor_id, type_map in floor_map.items():
+#         for object_type, row_arr in type_map.items():
+#             # 要被对比的楼层
+#             for other_floor_id in floor_map.keys():
+#                 if other_floor_id == floor_id:
+#                     continue
+#                 other_type_map = floor_map.get(other_floor_id)
+#                 if object_type not in other_type_map:
+#                     continue
+#                 other_row_arr = other_type_map.get(object_type)
+#                 for row in row_arr:
+#                     for other_row in other_row_arr:
+#                         space_id = row['space_id']
+#                         other_space_id = other_row['space_id']
+#                         if space_id == other_space_id:
+#                             continue
+#                         if space_id not in space_outline_json_map:
+#                             outline_json = json.loads(row['outline'])
+#                             space_outline_json_map[space_id] = outline_json
+#                         if other_space_id not in space_outline_json_map:
+#                             other_outline_json = json.loads(other_row['outline'])
+#                             space_outline_json_map[other_space_id] = other_outline_json
+#                         outline = space_outline_json_map[space_id]
+#                         other_outline = space_outline_json_map[other_space_id]
+#                         if is_vertically_overlap(outline, other_outline):
+#                             single_result = []
+#                             single_result.append(space_id)
+#                             single_result.append(other_space_id)
+#                             single_result.append(object_type)
+#                             result_arr.append(single_result)
+# if len(result_arr) == 0:
+#     return True
+# # 删除旧业务空间的垂直交通关系(自动计算的), 添加新关系
+# # 将下面对数据库的操作作为一个事务, 出异常则自动rollback
+# with plpy.subtransaction():
+#     del_plan = plpy.prepare("delete from r_sp_vertical_sp where project_id = $1 and sign = 2", ["text"])
+#     del_plan.execute([project_id])
+#     for single_result in result_arr:
+#         del_manual_plan = plpy.prepare(
+#             "delete from r_sp_vertical_sp where (space_id = $1 and space_other_id = $2) or (space_other_id = $1 and space_id = $2)",
+#             ["text", "text"])
+#         del_manual_plan.execute([single_result[0], single_result[1]])
+#         insert_plan = plpy.prepare(
+#             "insert into r_sp_vertical_sp(space_id, space_other_id, project_id, sign, object_type) values($1, $2, $3, 2, $4)",
+#             ["text", "text", "text", "text"])
+#         insert_plan.execute([single_result[0], single_result[1], project_id, single_result[2]])
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+# # 获取Polygon对象
+# def get_polygon(single_poly):
+#     poly_len = len(single_poly)
+#     poly = []
+#     for i in range(poly_len):
+#         pair = single_poly[i]
+#         poly.append((pair["X"], pair["Y"]))
+#     return Polygon(poly)
+#
+# # 在polygon1包含polygon2的时候, 检测是否polygon1内的空洞也包含polygon2
+# def is_include(polygon1, poly2):
+#     length1 = len(polygon1)
+#     for i in range(1, length1):
+#         poly1 = get_polygon(polygon1[i])
+#         if poly1.overlaps(poly2):
+#             return True
+#         if poly1.equals(poly2) or poly1.contains(poly2):
+#             return False
+#     return True
+#
+# def is_sub_outline_overlap(polygon1, polygon2):
+#     poly1 = get_polygon(polygon1[0])
+#     poly2 = get_polygon(polygon2[0])
+#     if poly1.overlaps(poly2) or poly1.equals(poly2):
+#         return True
+#     if poly1.contains(poly2) or poly1.equals(poly2):
+#         return is_include(polygon1, poly2)
+#     if poly2.contains(poly1) or poly2.equals(poly1):
+#         return is_include(polygon2, poly1)
+#     return False
+#
+# # 是否垂直方向上面积有重叠
+# def is_vertically_overlap(polygon1, polygon2):
+#     length1 = len(polygon1)
+#     length2 = len(polygon2)
+#     if length1 == 0 or length2 == 0:
+#         return False
+#
+#     for i in range(length1):
+#         for j in range(length2):
+#             if is_sub_outline_overlap(polygon1[i], polygon2[j]):
+#                 return True
+#     return False
+#
+# # building -> floor -> object_type -> [space_id]
+# def compose_dict(zone_data):
+#     building_map = dict()
+#     for row in zone_data:
+#         building_id = row['building_id']
+#         floor_id = row['floor_id']
+#         object_type = row['object_type']
+#         if building_id not in building_map:
+#             building_map[building_id] = dict()
+#         floor_map = building_map[building_id]
+#         if floor_id not in floor_map:
+#             floor_map[floor_id] = dict()
+#         type_map = floor_map[floor_id]
+#         if object_type not in type_map:
+#             type_map[object_type] = []
+#         arr = type_map[object_type]
+#         arr.append(row)
+#     return building_map

+ 6 - 18
src/affected_space/test.py

@@ -19,11 +19,6 @@ model_keys = [
     'id'
 ]
 
-floor_keys = [
-    'current_model_id',
-    'bind_floor_ids'
-]
-
 ispace_keys = [
     'source_id',
     'outline'
@@ -84,28 +79,21 @@ if __name__ == '__main__':
     # print(poly1.almost_equals(poly2, -10))
     # print(poly1.almost_equals(poly2, 2))
     # print(poly1.almost_equals(poly2, 0.0001))
-
-    floor_str = "SELECT current_model_id, bind_floor_ids FROM revit.model_floor where id = '7893fe0c6cd511ea83548fd73aa29e85'"
+    floor_id = '7893fe0c6cd511ea83548fd73aa29e85'
+    floor_str = "SELECT id FROM public.floor where model_id = '{0}'".format(floor_id)
 
     floor_data = get_data(floor_str)
 
-    floor_list = [dict(zip(floor_keys, item)) for item in floor_data]
+    floor_list = [dict(zip(model_keys, item)) for item in floor_data]
 
     if len(floor_list) == 0:
-        print("no floor")
-        sys.exit(0)
-    print(type(floor_list[0]['bind_floor_ids']))
-    strs = str(floor_list[0]['bind_floor_ids']).replace('\'', '"')
-    print(strs)
-    floor_arr = json.loads(strs)
-    if len(floor_arr) == 0:
         print("no binding floor")
         sys.exit(0)
     floor_str = ""
-    for fl in floor_arr:
-        floor_str = (floor_str + "'" + fl + "',")
+    for fl in floor_list:
+        floor_str = (floor_str + "'" + fl.get('id') + "',")
     floor_str = floor_str.strip(',')
-    model_str = "select id from revit.model_file where model_floor_id = '7893fe0c6cd511ea83548fd73aa29e85' and removed = false and status = 4 and version is not null order by version desc limit 2"
+    model_str = "select id from revit.model_file where model_floor_id = '{0}' and removed = false and status = 4 and version is not null order by version desc limit 2".format(floor_id)
     model_data = get_data(model_str)
     model_list = [dict(zip(model_keys, item)) for item in model_data]