無料積算ソフトとRevitをMCPサーバで連携させる
了解。無料(フリー/オープンソース)積算系とRevitを“間にMCPサーバ”でつないで自動化するなら、現実的で保守しやすい選択肢は主にこの2ルートです。
推奨ルート(どちらも無料)
1. IFC → IfcOpenShell/BlenderBIM系 QTO → 原価表マッピング(CSV)
RevitからIFCを書き出し
MCPがIf cOpenShell(Python)やBlenderBIMのQTO機能で数量(面積・体積・長さ・個数など)をCSV化
MCPが**単価表(CSV)**と突き合わせて見積明細を生成(CSV/Excel)
→ すべて無料で閉じられる構成。IfcOpenShellはIFC2x3/IFC4系列に対応し、QTO(Quantity Set/IfcElementQuantity)のAPIや例が公開済み。BlenderBIM側にも数量計算・QTO更新の運用知見が多数あります。
2. IFC → FreeCAD BIMのスケジュール(数量表) → CSV
Revit→IFC
MCPがFreeCAD(CLI/ヘッドレス)で数量表(Schedule)を生成→CSV出力
→ FreeCADはBIMワークベンチで数量表・属性・スプレッドシート連携が豊富。
> 2D図面から面積拾いをしたいだけならEasyPDFTakeoff等のフリー系もあるが、BIM(IFC)と直結はないので「Revit→IFC→自動積算」の一貫自動化には①/②が向きます。
---
アーキテクチャ(MCPが“自動化のハブ”)
Revit Add-in(IFC自動出力)
└→ 共有フォルダ/S3 へIFC保存
└→ MCPサーバがIFC検知(ウォッチャ)
├─ IfcOpenShell/BlenderBIM で QTO CSV生成
├─ 単価表CSV とJOIN(原価・歩掛・端数処理)
├─ 見積CSV/Excelを生成、監査ログ保存
└─ Webhook/メール/Teams等で通知
Revit側は“IFC出力を人手にしない”(外部コマンドAdd-inで規定プロファイル一発書き出し)
**数量の“正”**はIFC → QTO(IfcElementQuantity/QuantitySet)で統一し、モデル側で属性を整備
MCPは再試行キュー、ログ、単価改定のバージョン管理を担当
---
MCPサーバ(Python)最小サンプル
> IfcOpenShellで要素ごとの数量を集計し、単価表と突合して見積CSVを出力する例(骨子)。
# pip install ifcopenshell pandas
import ifcopenshell, pandas as pd, os, time
UNIT_COST_CSV = r"/srv/cost/unit_prices.csv" # columns: class, material(optional), unit, unit_price
OUT_DIR = r"/srv/cost/out"
def qto_from_ifc(ifc_path: str) -> pd.DataFrame:
model = ifcopenshell.open(ifc_path)
rows = []
# 代表的カテゴリを対象にする例
targets = ["IfcWall","IfcSlab","IfcBeam","IfcColumn","IfcDoor","IfcWindow","IfcCovering","IfcStair"]
for t in targets:
for e in model.by_type(t):
# 既存のQuantitySetを読む or 必要なら計算して付与(環境によりBlenderBIM側のQTO更新を先に実行)
qsets = ifcopenshell.util.element.get_psets(e, psets_only=False, qtos_only=True)
q = qsets.get("BaseQuantities", {}) # NetVolume/NetArea/Length/Count等が入ることが多い
rows.append({
"guid": e.GlobalId,
"ifc_class": t,
"name": getattr(e, "Name", ""),
"NetVolume": q.get("NetVolume"),
"NetArea": q.get("NetArea"),
"Length": q.get("Length"),
"Count": 1
})
return pd.DataFrame(rows)
def estimate(df_qto: pd.DataFrame) -> pd.DataFrame:
price = pd.read_csv(UNIT_COST_CSV) # class, unit, unit_price
# 単位ごとに優先数量を選ぶ例
def pick_qty(row, unit):
return {
"m3": row.get("NetVolume") or 0,
"m2": row.get("NetArea") or 0,
"m": row.get("Length") or 0,
"pcs": row.get("Count") or 0
}.get(unit, 0)
out_rows = []
for _, r in df_qto.iterrows():
for _, p in price[price["class"]==r["ifc_class"]].iterrows():
qty = pick_qty(r, p["unit"])
cost = qty * p["unit_price"]
if qty > 0:
out_rows.append({
"ifc_guid": r["guid"], "class": r["ifc_class"], "name": r["name"],
"unit": p["unit"], "qty": qty, "unit_price": p["unit_price"], "cost": cost
})
return pd.DataFrame(out_rows)
def run(ifc_path: str) -> str:
df_qto = qto_from_ifc(ifc_path)
df_est = estimate(df_qto)
ts = time.strftime("%Y%m%d_%H%M%S")
os.makedirs(OUT_DIR, exist_ok=True)
out = os.path.join(OUT_DIR, f"estimate_{ts}.csv")
df_est.to_csv(out, index=False)
return out
if __name__ == "__main__":
print(run(r"/srv/inbox/model.ifc"))
IfcOpenShellのAPI/コード例は公式ドキュメントにまとまっています。数量セット(QTO)の追加・編集関数も提供されています。
BlenderBIM側の運用では、数量計算を明示的に実行(例:UIやスクリプトでQTO更新)する必要がある旨の知見があります。
---
Revit側(IFC自動出力の要点)
プロジェクト標準のIFCエクスポート設定(座標系/プロパティセット/小数点・単位)をテンプレ化
外部コマンドAdd-inで保存先・命名規則・バージョンタグを自動付与
MCPへREST通知 or 共有フォルダ監視で検知
> FreeCADルートを使う場合は、FreeCADのBIM/Spreadsheetワークベンチでスケジュールを作成→CSV書き出しをCLIで回すだけでも動きます。
---
単価表(CSV)運用のコツ
列例:class, material, spec, unit, unit_price, waste_ratio
端数処理・歩掛を式列で管理(後続でExcel化してもOK)
品目マスターのリビジョンをMCPがGitや日付でバージョン管理
---
まず決めること(最短で動かすための初期設定)
1. どのQTOを正とするか:IFCのBaseQuantitiesを使う/BlenderBIMで計算して書き戻す/FreeCAD側で拾う
2. 単位・丸め:m²/m³/m/個の優先順位と端数ルール
3. 品目マップ:IfcClass→標準品目コードの対応表
4. 通知とログ:成功/失敗のSlack・メール通知、見積CSVの保存先
---
追加で用意できます
Revit Add-inの完成テンプレ(.addin含む)
MCPの監視+キュー+通知を備えた実運用用サーバスクリプト
BlenderBIMヘッドレス用のQTO更新スクリプト、またはFreeCAD CLIでのスケジュールCSV出力スクリプト
どのルート(IfcOpenShell/BlenderBIM or FreeCAD)で行きますか? 既存の単価表フォーマット(CSV/Excel)があれば、それに合わせてサンプルをこちらで即整えます。
コメント
コメントを投稿