|
@@ -0,0 +1,145 @@
|
|
|
+管网系统设备分块
|
|
|
+## 前置条件
|
|
|
+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
|
|
|
+4. 将合并后的数据存入数据库,表: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 失败
|
|
|
+
|
|
|
+## 结果展示
|
|
|
+
|
|
|
+
|
|
|
+
|