Revit 二次開発では中空モデルを作成し、指定されたコンポーネントで切断します

特定の API は公式ドキュメントにあり、カット キーワードはここで提供されています。Void

概要

アプリケーションシナリオ


実際のプロジェクトでは、ファミリせん断コンポーネントを作成したい場合は、中空押し出しを作成し、せん断コマンドを実行して、せん断したいモデル コンポーネントを切り出す必要があります。これは、測定値を計算するときにより広く使用されます。接続/切断コマンド、実際のプロジェクトでの接続シーケンス
、または高精度が必要なプロジェクトやオーナーが引きずって解決を拒否するプロジェクトでは、いくつかの奇妙な要件もあります。たとえば、建物の壁をせん断するこの構造梁に遭遇しました。 。

基本的なロジック

  1. まず、構造リンクモデルの構造梁のソリッドを取り出します。
  2. すべての壁を取得し、前の手順で取得した構造梁ソリッドと交差させ、交差するソリッドを取り出します。
  3. 2 番目のステップでは 2 つの方向 [ ] が生成されます。
    各 InsertSolid はファミリー
    [x] として生成され、大きな InsetSolid ジオメトリにマージされ、対応する名前がファミリー内に作成されます。
  4. 中空形状 (ここで使用した中空押し出し) を生成した後、ファミリ パラメータ (ロード時に剪断された中空) をファミリに変更します。このステップでは、インターネット上のすべての手動変更はこの機能の要件を満たすことができないため、以下に段落を入力してください。
  5. 指定した位置に配置してコンポーネント間のせん断を実行します
  6. 仕上げる

空虚な家族を作る

ファミリファイルの作成

このステップで置き換えられる実際の操作は、[ファイル] -> [新規ファイル] -> [カテゴリ] の操作です。ファミリー ドキュメントを取得した後でのみ、ドキュメント内で形状を描画したりパラメータを変更したりできます。

ここで作成したのは、メートル標準モデルのファミリーです。

var app = commandData.Application.Application;
            var rfaDoc = app
                .NewFamilyDocument(@"C:\ProgramData\Autodesk\RVT 2019\Family Templates\Chinese\公制常规模型.rft");

中空の押し出しを作成する

  1. ここで使用するコマンドは立体の交点を取得します。
 var insert = BooleanOperationsUtils
                                .ExecuteBooleanOperation(wallSolid, solid, BooleanOperationsType.Intersect);
  1. ファミリ内でソリッド ボディとして作成されるソリッドを指定する方法がないため (方法がある人は教えてください)、せん断ビームは比較的規則的であるため、上下の底面を取得して作成することができます。中空の押し出しですが、私のプロジェクトは比較的単純かもしれません。構造梁には他の形状はありません。パイプや壁の梁などのコンポーネントの開口部を取得したい場合は、2 つの側面を取得して押し出しを行う必要があります。

便宜上、ウィンドウ ファミリを直接使用して、後の統計計算を容易にすることもできますが、ウィンドウ ファミリでは斜めのストレッチや円弧の交差をカバーできないため、一時的にウィンドウ ファミリを放棄し、統一された中空ストレッチをシャーリングに使用します。

中空の押し出しを作成します。ブール値は中実か中空かを表します。

 var z =Math.Abs( face1.Evaluate(new UV(0, 0)).Z - face2.Evaluate(new UV(0, 0)).Z);
                        // 创建空心模型
                        var extrusion = rfaDoc.FamilyCreate.NewExtrusion(false, arrA, SketchPlane.Create(rfaDoc, array0[0].GetPlane()), z);

ファミリパラメータを変更する加载时剪切的空心

パラメータの位置
ここに画像の説明を挿入します

ここでは、まずファミリー内の各データが何を表しているのかを確認する必要があります。

  1. ファミリタイプ[ファミリーシンボル]は
    以下のコマンドで作成でき、作成後に材質などのパラメータを追加することができます。
rfaDoc.FamilyManager.NewType("111")

ファミリで作成した注釈をこれに接続したい場合は、次のように使用できます。

 AssociateElementParameterToFamilyParameter(
      Autodesk.Revit.DB.Parameter elementParameter,
      FamilyParameter familyParameter)

ファミリ パラメータに接続して、プロジェクト ファイル内でパラメータを変更できるようにします。
2. ファミリ パラメータ
ここでのファミリ パラメータは、上記のファミリ タイプのファミリ パラメータの一部を指しますが、変更したいパラメータは取得できません。
ここに画像の説明を挿入します

  1. オーナー ファミリ
    はターゲット値です。Revit のこのパーツの値を表します。
    ここに画像の説明を挿入します。
    ここに画像の説明を挿入します
    それを開くと、ファミリの基本カテゴリと属性値があることがわかります。ファミリ属性インターフェイスなので、その Modify 部分を取得する必要があります。ここでのブール パラメータは AsValueString を介して変更できず、1/0 に直接割り当てることができます。
var para = rfaDoc.OwnerFamily.get_Parameter(BuiltInParameter.FAMILY_ALLOW_CUT_WITH_VOIDS);
                para.Set(1);

このようにして、ファミリーの操作が完了しました。次に、ファミリーをプロジェクトにロードして、中空ファミリーの作成を完了する必要があります。

 var family = rfaDoc.LoadFamily(doc);

カット操作を実行する

Revitのカットコマンドと結合コマンドが
ここに画像の説明を挿入します
カットされる

InstanceVoidCutUtils

接続する

JoinGeometryUtils

プロジェクト全体を横断する場合、交差する壁がなく、カット ボタンを直接クリックするとエラーが報告される場合は、そのような壁をフィルタリングする必要があります。ここで、実際の操作に応じてコードを変更できます。

コード

using (Transaction trans = new Transaction(doc, "Modify"))
            {
                trans.Start();
                BiMassUntil.Until.TaskDialog(walls.Count.ToString());
                foreach (var wall in walls)
                {
                    // BiMassUntil.Until.TaskDialog(can.ToString());
                    try
                    {
                        InstanceVoidCutUtils.AddInstanceVoidCut(doc, wall, instance);
                    }
                    catch (InvalidOperationException e)
                    {
                        Console.WriteLine(e);
                        continue;
                    }

                }

                trans.Commit();
            }

おすすめ

転載: blog.csdn.net/qq_41059339/article/details/126689251