点群クライアント

点群クライアント

点群クライアント API は、Revit 内の点群インスタンスの読み取りおよび修正をサポートします。点群インスタンスによって供給される点は、点群エンジンから取得しています。これは Revit の内蔵エンジン、またはアプリケーションとしてロードされたサードパーティのエンジンのいずれかとなります。クライアント点群 API アプリケーションでは、エンジンの保存方法や点を Revit で使用する方法の詳細を考慮する必要がなくなります。代わりに、Client API を使用して点群の作成、プロパティの操作、指定されたフィルタの一致が見つかった点の読み取りに使用できます。

点群に関するメイン クラスは次のとおりです。

点群を作成する

Revit ドキュメントに新しい点群を作成するには、PointCloudType を作成し、これを使用して PointCloudInstance を作成します。 静的な PointCloudType.Create()メソッドが、サードパーティによって Revit を使用して登録された場合は、このメソッドにはエンジン識別子が必要であり、サポートされているファイル タイプの場合は、このメソッドには点群ファイルの拡張子が必要です。非ファイル ベースのエンジンの場合は、ファイル名または識別文字列も必要です。次の例では、PCG ファイルを使用して Revit ドキュメントで点群を作成します。

コード領域: rcsrcs ファイルから点群を作成

private PointCloudInstance CreatePointCloud(Document doc)
{
    PointCloudType type = PointCloudType.Create(doc, "rcs", "c:\\32_cafeteria.rcs");
    return (PointCloudInstance.Create(doc, type.Id, Transform.Identity));
}

図: 32_cafeteria.rcs からの点群

点群の点にアクセスする

点群の点にアクセスするには、2 つの方法があります。

  1. IEnumerable<CloudPoint> インタフェースを使用して、PointCollection の戻り値から結果として得られた点を直接反復する
  2. ポインタを集合の点ストレージに取得し、安全でないインタフェースのメモリの点に直接アクセスする

どちらの方法でも、PointCloudInstance から点の集合にアクセスする最初のステップは、メソッドを使用することです。

  • PointCloudInstance.GetPoints(PointCloudFilter filter, double averageDistance, int numPoints)

Revit および点群エンジンによって使用された検索アルゴリズムの結果として、要求されたとおりの点の数が返されない場合があることに注意してください。

2 番目のオプションはポインタを直接処理しますが、大量の点のバッファを移動するときのパフォーマンスが改善されることがあります。ただし、このオプションは C#、および C + + /CLI からのみ使用できます。

次の 2 つの例では、これらの 2 つのメソッドのいずれかを使用して、点群の一部を反復する方法を示しています。

コード領域: 反復で点群の点を読み取る

private void GetPointCloudDataByIteration(PointCloudInstance pcInstance, PointCloudFilter pointCloudFilter)
{
    // read points by iteration
    double averageDistance = 0.001;
    PointCollection points = pcInstance.GetPoints(pointCloudFilter, averageDistance, 10000); // Get points.  Number of points is determined by the needs of the client
    foreach (CloudPoint point in points)
    {
        // Process each point
        System.Drawing.Color color = System.Drawing.ColorTranslator.FromWin32(point.Color);
        String pointDescription = String.Format("({0}, {1}, {2}, {3}", point.X, point.Y, point.Z, color.ToString());
    }
}

コード領域: ポインタで点群の点を読み取る

public unsafe void GetPointCloudDataByPointer(PointCloudInstance pcInstance, PointCloudFilter pointCloudFilter)
{
    double averageDistance = 0.001;
    PointCollection points = pcInstance.GetPoints(pointCloudFilter, averageDistance, 10000);
    CloudPoint* pointBuffer = (CloudPoint*)points.GetPointBufferPointer().ToPointer();
    int totalCount = points.Count;
    for (int numberOfPoints = 0; numberOfPoints < totalCount; numberOfPoints++)
    {
        CloudPoint point = *(pointBuffer + numberOfPoints);
        // Process each point
        System.Drawing.Color color = System.Drawing.ColorTranslator.FromWin32(point.Color);
        String pointDescription = String.Format("({0}, {1}, {2}, {3}", point.X, point.Y, point.Z, color.ToString());
    }
}

フィルタ

フィルタは、点の読み取り時に検索される体積を制限したり、点群の表示を決定するために使用します。PointCloudFilter は、平面境界の集合に基づいて作成できます。フィルタは、平面の法線の正の方向で示され、点が各入力平面の正側にあるかどうかを確認します。したがって、このフィルタは暗黙的に体積を定義します。これはすべての平面に対応する正の半スペースの交点です。この体積は閉じる必要はありませんが、常に凸状になります。

フィルタを割り当てることで、点群の表示をコントロールできます。

  • PointCloudInstance.SetSelectionFilter()

フィルタされた点の表示は、プロパティの値に基づいています。

  • PointCloudInstance.FilterAction

[None]に設定されている場合は、選択フィルタは無視されます。[Highlight]に設定されている場合は、フィルタを通過する点がハイライト表示されます。[Isolate]に設定されている場合は、フィルタを通過する点が表示されます。

次の例では、境界ボックスに基づいて、点群の点のサブセットをハイライト表示します。

コード領域: ポインタで点群の点を読み取る

// Filter will match 1/8 of the overall point cloud
// Use the bounding box (filter coordinates are in the coordinates of the model)
BoundingBoxXYZ boundingBox = pointCloudInstance.get_BoundingBox(null);
List<Plane> planes = new List<Plane>();
XYZ midpoint = (boundingBox.Min + boundingBox.Max) / 2.0;

// X boundaries
planes.Add(app.Create.NewPlane(XYZ.BasisX, boundingBox.Min));
planes.Add(app.Create.NewPlane(-XYZ.BasisX, midpoint));

// Y boundaries
planes.Add(app.Create.NewPlane(XYZ.BasisY, boundingBox.Min));
planes.Add(app.Create.NewPlane(-XYZ.BasisY, midpoint));

// Z boundaries
planes.Add(app.Create.NewPlane(XYZ.BasisZ, boundingBox.Min));
planes.Add(app.Create.NewPlane(-XYZ.BasisZ, midpoint));

// Create filter
PointCloudFilter filter = PointCloudFilterFactory.CreateMultiPlaneFilter(planes);
pointCloudInstance.FilterAction = SelectionFilterAction.Highlight;

これは、上記のサンプルが小さな配管点群で実行された場合の結果です。

図: 選択フィルタを使用した点群

画面で長方形の領域を指定できる汎用 2 クリック エディタを起動する Selection.PickBox()メソッドは、結果として得られる、フィルタの平面境界を生成する PickedBox を使用することで、PointCloudFilter とともに使用できます。

スキャン

.rcp ファイルには複数のスキャンが含まれます。 メソッド PointCloudInstance.GetScans() は、PointCloudInstance の各スキャンの表示の設定、および固定色の優先を個別に設定するのに使用できるスキャン名の一覧を返します。PointCloudInstance.ContainsScan() は、指定されたスキャン名が点群インスタンスに含まれるかどうかを示し、PointCloudInstance.GetScanOrigin() はモデル座標の指定されたスキャンの原点を返します。

優先

指定したビューに割り当てられている点群優先設定は、Revit API を使用して修正することができます。これらの設定は、Revit UI の[表示/グラフィックスの上書き]タスク ペインの[点群]タブにある設定に対応しています。優先を点群インスタンス全体、またはそのインスタンスの特定のスキャンに適用できます。優先オプションには、点群インスタンスのスキャンの設定表示、固定色、または平面図、法線、強度に基づく色付きグラデーションへの設定が含まれます。プロパティ PointCloudInstance.SupportsOverrides は、優先設定(.rcp または .rcs ファイルに基づいた群)をサポートする点群を識別します。

次のクラスは、点群の優先設定に含まれます。

  • PointCloudOverrides - PointCloudOverrideSettings for a PointCloudInstance の取得または設定に使用します。
  • PointCloudOverrideSettings - 表示、カラー モード、または PointCloudInstance の PointCloudColorSettings、またはスキャンのいずれかの取得または設定に使用します。
  • PointCloudColorSettings - 特定のカラー モードの特定の色を PointCloudInstance 要素、またはスキャンのいずれかに割り当てるために使用します。PointCloudColorMode が[NoOverride]または[Normals]の場合は適用しません。