0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Revit API】選択したダクトを自動接続するアドイン

Posted at

【Revit API】選択したダクトを自動接続するアドインを作ってみた

はじめに

前回、IFCやT-fasモデルをJSON経由でRevit MEP要素に置換するアドインを作りました。直線ダクトの生成はできたものの、端点接続は不完全で、手作業で接続する必要がありました。

ビル一棟分のダクトを手動で接続するのは大変なので、今回は「選択したダクト同士を自動で接続するアドイン」に挑戦しました。


目標

  • 選択した2本以上のダクトを対象に自動でエルボ接続を作成
  • 条件
    • 最大距離1,000mm以内
    • コネクタの向きが接続可能な場合のみ接続
    • 同じMEPシステムタイプであること

実装のポイント

接続対象の選定

  • 未接続コネクタのみ抽出
  • 距離順にペアリング
  • 同じ方向や逆方向すぎる場合は除外

接続処理

  • Transaction内で NewElbowFitting を使用
  • 接続に失敗した場合はスキップ(エラーで中断しない)

成功ペアのカウント

  • TaskDialogで結果を表示

コード抜粋

// 選択されたダクトの取得
var ducts = uidoc.Selection.GetElementIds()
              .Select(id => doc.GetElement(id))
              .OfType<Duct>()
              .Where(d => d.ConnectorManager != null && d.ConnectorManager.Connectors.Size > 0)
              .ToList();

// 未接続コネクタ一覧
var connectors = ducts
    .SelectMany(d => d.ConnectorManager.Connectors.Cast<Connector>()
    .Where(c => !c.IsConnected))
    .ToList();

// 距離順ペアリスト
var pairs = connectors.SelectMany((a, i) =>
    connectors.Skip(i + 1)
    .Where(b => a.Owner.Id != b.Owner.Id)
    .Select(b => new { a, b, dist = a.Origin.DistanceTo(b.Origin) }))
    .Where(p => p.dist < maxDistance)
    .OrderBy(p => p.dist)
    .ToList();

// 接続処理
foreach (var pair in pairs)
{
    using (Transaction tx = new Transaction(doc, "Connect Ducts"))
    {
        tx.Start();
        try
        {
            var fitting = doc.Create.NewElbowFitting(pair.a, pair.b);
        }
        catch { /* 失敗は無視 */ }
        tx.Commit();
    }
}

実行例

  • 選択したダクトペアが自動で接続され、成功したペア数がポップアップで表示されます
  • 直線ダクトは安定して接続可能
  • 複雑な角度や長距離接続では失敗する場合あり

現状の課題

  • 曲がりダクトや長距離接続はまだ安定しない
  • 接続失敗時のログ出力は未対応
  • 将来的には全自動接続 + 複雑形状対応を目指す

45°の接続
スクリーンショット 2025-11-10 165345.png
スクリーンショット 2025-11-10 165410.png

90°の接続
スクリーンショット 2025-11-10 165543.png
スクリーンショット 2025-11-10 165556.png
90°だと接続できない場合があり、原因をChatGPTに聞いてみました

[ChatGPT]
90°で接続できない原因をRevit API的に考えると、いくつか可能性があるで。整理するとこんな感じや:

コネクタ方向ベクトルの角度計算

今のコードでは、接続可否を角度(AngleTo やドット積)で判定している。

90°だと「同方向でも反対方向でもない微妙な角度」と判定され、スルーされる可能性がある。

特に dot > 0 の条件で除外されるかもしれん。

内部補正の失敗

Revitの NewElbowFitting は、コネクタの方向や向きが厳密に整っていないと例外を返す。

直角だと内部の方向補正が働かず、接続失敗になる場合がある。

端点距離の許容値

現在は 1000mm 以内で接続を試みている。

直角の場合、端点間の距離が微妙に許容値を超えることがあり、ペアに入らないことがある。

MEPシステムタイプやファミリ制約

角度によっては、システムタイプやダクトサイズがフィッティング作成条件に合わず、接続できない場合がある。

💡 総合的なAI的推測:
一番大きな原因は「コネクタ方向ベクトル判定と Revit 内部の補正ロジックの微妙なズレ」によるものやと思う。角度判定や距離の許容値を少し調整すると改善する可能性が高い。


とのこと、試行錯誤して改善します。

まとめ

  • 選択ダクト自動接続アドインは「半自動化」として十分価値あり
  • 前回作成した「直線ダクト生成アドイン」と組み合わせれば、IFC→Revit MEP変換 + 接続自動化のプロセスが作れる
  • 小規模案件や試作モデルでの作業効率化には効果的
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?