grid_check.md 2.6 KB

一个建筑内的多楼层轴网冲突检查

前置条件

模型有轴网数据

处理逻辑

1. 查询出参与检查的所有模型(指定建筑文件夹下的所有已经处理完的模型 + 指定要被检查的模型)
2. 查询出 1 中参与检查模型的轴网数据
3. 将所有模型的轴网分组
    分组逻辑:
        1. 在对两个模型的轴网时, 只对比他们具有相同名字的轴网, 如果相同名字轴网的location表达的是同一条直线, 则认为轴网一致, 否则认为不一致
        2. 只有轴网一致的模型才能分在一个分组内
        3. 所有模型分完组后, 如果有两个或以上的分组, 则认为轴网不一致, 有冲突
        返回结果中有分组id表示模型所处分组, 从0开始.

函数

源码
CREATE OR REPLACE FUNCTION "revit_calc"."check_grid_valid"("project_id" varchar, "folder_id" varchar, "model_id" varchar)
  RETURNS TABLE("id" varchar, "floor_name" varchar, "project_id" varchar, "folder_id" varchar, "fid" varchar, "accept_time" timestamptz, "version" int4, "note" text, "user_id" varchar, "user_name" varchar, "log" jsonb, "url" text, "md5" varchar, "status" int2, "group_id" int4, "plan_name" varchar) AS $BODY$
    from relations.src.grid.check_grid import check_grid_upright


    involved_model_sql = "select * from revit.model_floor_file_func('" + project_id + "') where folder_id = '"+ folder_id +"' and ( status in (4) or  fid = '" + model_id + "')"
    grid_sql = "select * from revit.grid where model_id = "

    involved_model = plpy.execute(involved_model_sql)
    grid_data = dict()
    for item in involved_model:
        current_grid_sql = grid_sql + '\'{model_id}\''.format(model_id=item.get('fid'))
        single_model_grid = plpy.execute(current_grid_sql)
        grid_data[item.get('fid')] = single_model_grid
    result = check_grid_upright(involved_model, grid_data)
    return involved_model
$BODY$
  LANGUAGE plpython3u VOLATILE
  COST 100
  ROWS 1000

输入

1. project_id : 项目id
2. folder_id : 建筑文件夹id
3. model_id : 模型id

返回结果

id : 楼层id
floor_name : 楼层名
project_id : 项目id
folder_id : 楼层所属建筑文件夹id
fid : 模型id
accept_time : 模型接受时间
version : 模型版本
note : 备注
user_id : 上传模型的用户id
user_name : 用户名
log : 日志
url : 模型下载地址
md5 : 模型文件md5
status : 模型当前状态
group_id : 模型所处分组
plan_name : 平面图名称