sys_block.md 6.0 KB

管网系统设备分块

前置条件

  1. 项目下的模型文件已上传;
  2. 所有管网已正确连接;
  3. 相邻层立管开放端口坐标位置相等(距离差值不能超过0.01)
  4. (非强制)通过模型检查:连接件检查、系统类型名称检查、管网及相关设备检查、管段检查

处理方式

  1. 获取所有当前项目project_id下的的有模型文件models; 表:revit.model_folder、revit.model_floor、revit.model_file
  2. 遍历models,获取model层的系统图systemGraphs;
    1. 获取model下且domain、systemName符合条件的connector,connectors,表:revit.connector
    2. 获取model下所有的设备、部件、其它、风管、水管,表:revit.equipment、revit.component、revit.other、revit.pipe、revit.duct
    3. 获取model层的系统图数据,存在systemGraphs中。
  3. 获取systemGraphs中所有的开放立管,按开放立管对连接的系统图systemGraphs进行合并;
  4. 删除本项目下project_id、指定系统类型systemName,指定域domain,所有数据,表revit_calc.connected_block
  5. 将合并后的数据存入数据库,表:revit_calc.connected_block。

函数

create or replace function public.sys_block(project_id character varying,building_id character varying,system_name character varying,domain character varying) returns boolean
as
$$
from relations.src.system_relation import systemutils, graph_model

def get_models(project_id,building_id):
  sql ="select " \
		"id,name,local_id,local_name,sequence_id,model_id,building_id,project_id " \
		"from floor " \
		"where project_id=$1 " \
		"and ($2 is null or building_id=$2) " \
		"order by sequence_id desc"
  join_plan=plpy.prepare(sql,["text","text"])
  data=join_plan.execute([project_id,building_id])
  models=systemutils.sqldata2objlist(data)
  return models

def get_connectors(model_id, system_name, domain):
  sql = "SELECT * FROM revit.connector where model_id=$1 and mep_system_type=$2 and domain=$3"
  join_plan=plpy.prepare(sql,["text","text","text"])
  data=join_plan.execute([model_id, system_name, domain])
  floor_connectors=systemutils.sqldata2objlist(data)
  return floor_connectors
def get_elements(model_id):
  floor_elements=[]
  sql="select * from revit.equipment where model_id=$1"
  join_plan=plpy.prepare(sql,["text"])
  data=join_plan.execute([model_id])
  floor_elements.extend(systemutils.sqldata2objlist(data))

  sql="select * from revit.component where model_id=$1"
  join_plan=plpy.prepare(sql,["text"])
  data=join_plan.execute([model_id])
  floor_elements.extend(systemutils.sqldata2objlist(data))

  sql="select * from revit.other where model_id=$1"
  join_plan=plpy.prepare(sql,["text"])
  data=join_plan.execute([model_id])
  floor_elements.extend(systemutils.sqldata2objlist(data))

  sql="select * from revit.join_object where model_id=$1"
  join_plan=plpy.prepare(sql,["text"])
  data=join_plan.execute([model_id])
  floor_elements.extend(systemutils.sqldata2objlist(data))

  sql="select * from revit.pipe where model_id=$1"
  join_plan=plpy.prepare(sql,["text"])
  data=join_plan.execute([model_id])
  floor_elements.extend(systemutils.sqldata2objlist(data))

  sql="select * from revit.duct where model_id=$1"
  join_plan=plpy.prepare(sql,["text"])
  data=join_plan.execute([model_id])
  floor_elements.extend(systemutils.sqldata2objlist(data))
  return floor_elements
def delete_block_data(project_id,building_id,system_name,domain):
  sql="delete from revit_calc.connected_block " \
		  "where project_id=$1"\
		  "and mep_system_type=$2" \
		  "and domain=$3" \
		  "and ($4 is null or building_id=$4)"
  join_plan=plpy.prepare(sql,["text","text","text","text"])
  join_plan.execute([project_id,system_name,domain,building_id])
def save_edge_data(edge,block_id,system_name,domain,building_id):
  vertex1=edge.start_vertex
  vertex2=edge.end_vertex
  c1=vertex1.system_data
  c2=vertex2.system_data
  floor1 = vertex1.get_parent_floor()
  floor2 = vertex2.get_parent_floor()
  model1= floor1.model
  model2 = floor2.model
  sql="insert into revit_calc.connected_block" \
    "(id1,type1,model_id1,id2,type2,model_id2,block_id,project_id,mep_system_type,domain,building_id) values " \
    "($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11)"
  join_plan=plpy.prepare(sql,["text","text","text","text","text","text","text","text","text","text","text"])
  join_plan.execute([c1.id,c1.type,model1.model_id,c2.id,c2.type,model2.model_id,block_id,model1.project_id,floor1.system_name,floor1.domain,building_id])

try:
  # 将下面对数据库的操作作为一个事务, 出异常则自动rollback
  with plpy.subtransaction():
    models=get_models(project_id,building_id)
    floorgraphs=[]
    for model in models:
      floor_connectors=get_connectors(model.model_id, system_name, domain)
      floor_elements=get_elements(model.model_id)
      g= graph_model.FloorGraph(model, system_name, domain,floor_connectors,floor_elements)
      g.get_floor_graphs()
      floorgraphs.append(g)
    projectgraph= graph_model.combine_systemgraph(project_id,floorgraphs)

    delete_block_data(project_id,building_id, system_name, domain)
    block_id=0
    for g in projectgraph.groupedsystemgraphs:
      for s in g.systemgraphs:
        for e in s.system_edges:
          save_edge_data(e, block_id,system_name,domain,building_id)
      for e in g.connectedges:
        save_edge_data(e,block_id,system_name,domain,building_id)
      block_id+=1
except Exception as e:
    plpy.warning(e)
    return False
else:
    return True
$$
LANGUAGE 'plpython3u' VOLATILE;

select public.sys_block('Pj1101010015','Bd11010100153c05821ed8fd11e9b8f2d79d0a5b4bf6','冷冻水供水管','DomainPiping')

输入

1. 项目id
2. 需要计算的building_id,如果没有提供时请传入null,不能传""
3. 需要计算的系统名称
4. 需要计算的管道系统类型,枚举(水管或风管):DomainPiping,DomainHvac

返回结果

True    成功
False   失败

结果展示

原模型图 抽象后的图 确定完流向的图