Generate Quantity Take-Off (QTO) reports from BIM/CAD data. Extract volumes, areas, counts by category. Group elements, apply calculation rules, and create cost estimates automatically."
基于DDC方法论(第3.2章),本技能可自动从BIM/CAD数据中提取和分组工程量。QTO是建筑行业成本估算、进度规划和项目策划的基础。
参考书籍: Quantity Take-Off и автоматическое создание смет / QTO与自动估算
QTO工程量清单:按属性分组数据,可自动从BIM模型中提取体积和数量用于成本计算。
— DDC书籍,第3.2章
QTO流程是5D BIM的核心:
python
import pandas as pd
qto.toexcel(qtoreport.xlsx)
python
import pandas as pd
def generateqto(df, groupby=Category):
按指定列分组生成工程量清单
参数:
df: 包含BIM构件的DataFrame
group_by: 分组依据的列
返回:
QTO汇总DataFrame
# 根据可用列定义聚合方式
agg_dict = {}
if Volume in df.columns:
agg_dict[Volume] = sum
if Area in df.columns:
agg_dict[Area] = sum
if Length in df.columns:
agg_dict[Length] = sum
if Count in df.columns:
agg_dict[Count] = sum
else:
agg_dict[ElementId] = count
qto = df.groupby(groupby).agg(aggdict)
if ElementId in agg_dict:
qto = qto.rename(columns={ElementId: Count})
return qto.round(2)
python
def generatemultilevel_qto(df):
按多个层级分组生成QTO
qto = df.groupby([Level, Category, Material]).agg({
Volume: [sum, count],
Area: sum
}).round(2)
# 展平列名
qto.columns = [Volumem3, ElementCount, Area_m2]
# 添加百分比
qto[VolumePct] = (qto[Volumem3] /
qto[Volume_m3].sum() * 100).round(1)
return qto.sortvalues(Volumem3, ascending=False)
python
def generateqtopivot(df, values=Volume, index=Level, columns=Category):
生成数据透视表形式的QTO
pivot = pd.pivot_table(
df,
values=values,
index=index,
columns=columns,
aggfunc=sum,
fill_value=0,
margins=True,
margins_name=TOTAL
).round(2)
return pivot
python
def calculatecostfromqto(qtodf, pricesdf, quantitycol=Volume):
通过将单价应用于数量来计算成本
参数:
qto_df: 包含数量的QTO DataFrame
prices_df: 包含类别和单价的DataFrame
quantity_col: 包含数量的列
# 合并价格
result = qtodf.resetindex().merge(
prices_df, on=Category, how=left
)
# 计算成本
result[TotalCost] = result[quantitycol] * result[Unit_Price]
result[CostPct] = (result[TotalCost] /
result[Total_Cost].sum() * 100).round(1)
# 汇总
grandtotal = result[TotalCost].sum()
print(f总计: ${grand_total:,.2f})
return result
python
def applyexcelrules(df, rules_path):
应用Excel文件中定义的计算规则
Excel格式:
| Category | Formula_Type | Factor | Unit |
| Wall | volume | 1.05 | m³ |
| Floor | area | 1.10 | m² |
rules = pd.readexcel(rulespath)
results = []
for _, rule in rules.iterrows():
category = rule[Category]
formulatype = rule[FormulaType]
factor = rule[Factor]
category_data = df[df[Category] == category].copy()
if formula_type == volume:
categorydata[Quantity] = categorydata[Volume] * factor
elif formula_type == area:
categorydata[Quantity] = categorydata[Area] * factor
elif formula_type == length:
categorydata[Quantity] = categorydata[Length] * factor
elif formula_type == count:
categorydata[Quantity] = categorydata.groupby(Category).ngroup() + 1
category_data[Unit] = rule[Unit]
results.append(category_data)
return pd.concat(results, ignore_index=True)
python
def processrevitexport(csv_path):
处理标准Revit明细表导出
df = pd.readcsv(csvpath)
# 标准化列名
column_mapping = {
Family and Type: Type,
Volume: Volume,
Area: Area,
Count: Count,
Level: Level,
Category: Category
}
df = df.rename(columns={
k: v for k, v in column_mapping.items()
if k in df.columns
})
# 将体积从立方英尺转换为立方米(如果需要)
if Volume in df.columns:
# Revit默认以立方英尺导出
df[Volume_m3] = df[Volume] * 0.0283168
return df
python
def extractqtofromifc(ifcpath):
从IFC文件中提取工程量
ifc = ifcopenshell.open(ifc_path)
elements = []
for element in ifc.by_type(IfcBuildingElement):
# 获取属性
props = {
GlobalId: element.GlobalId,
Name: element.Name,
Type: element.is_a(),
Material: None,
Volume: None,
Area: None
}
# 从属性集中提取工程量
for definition in element.IsDefinedBy:
if definition.is_a(IfcRelDefinesByProperties):
pset = definition.RelatingPropertyDefinition
if pset.is_a(IfcElementQuantity):
for qty in pset.Quantities:
if qty.is_a(IfcQuantityVolume):
props[Volume] =
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 qto-report-1776344351 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 qto-report-1776344351 技能
skillhub install qto-report-1776344351
文件大小: 5.95 KB | 发布时间: 2026-4-17 16:06