Revit API開発者向けのベクトルジオメトリ





XYZクラスは、RevitAPIの座標を表します。 また、座標を扱っているため、ベクトルジオメトリの基本を考慮する必要があります。 ベクトルの加算と減算の2つのアクションのみで、多くの有用な作業を実行できます。



まず、 ここで XYZクラスの仕様を理解することをお勧めします。 ベクターとはウィキペディアで読むことができます。



モデル空間のRevitAPIのクラスXYZはベクトルとして表すことができ、その開始点はプロジェクトのゼロポイントまたはベースポイント(X = 0、Y = 0、Z = 0)にあり、ベクトルの終了点は座標が示すポイントにあります。 XYZ(-44.6464513504241、82.7973662674829、33.0782338854701)。 すべての座標値はフィート単位です。 XYZクラスには、ベクターに固有のメソッドがあります。これについては以下で説明します。



Revitの詳細ラインの例のベクトルを考えてみましょう。 基点をAとしてマークします。次に、ラインの最初のポイント(リードを開始した)はBになり、ラインの最後のポイントはCになります。したがって、ベクトルABとBCを取得します。







Revit APIは、行の最初のポイントと最後のポイントにアクセスするためのメソッドを提供します。



Reference r = uiapp.ActiveUIDocument.Selection.PickObject(ObjectType.Element)

Element line = doc.GetElement(r.ElementId);

XYZ vectorAB = (line.Location as LocationCurve).Curve.GetEndPoint(0);

XYZ vectorAC = (line.Location as LocationCurve).Curve.GetEndPoint(1);

TaskDialog.Show("", vectorAB.ToString() + "\n" + vectorAC);








詳細線をベクトルとして使用するには、太陽ベクトルが必要です。 太陽のライン詳細ベクトルを取得するには、ベクトルの減算を使用します。

BC = AC-AB







この式では、ACベクトルの終わりはACベクトルの終わりになります(違いの最初の数字は終わりです)。 ベクトルABの終わりはBCベクトルの始まりになります(差の2番目の数字が始まりです)。



XYZ vectorBC = vectorAC - vectorAB;







明細行ベクトルができたので、多くの興味深いことができます。 たとえば、2倍の長さの線のコピーを作成したり、詳細線の中央を見つけることができます。



XYZ vectorBC_1 = vectorBC * (-2) // B

XYZ vectorBC_2 = vectorBC * 2; //

XYZ vectorBC_05 = vectorBC * .5 //

//

Line line = Line.CreateBound(vectorAB, vectorBC_2); // , XYZ -

doc.Create.NewDetailCurve(doc.ActiveView, line);








次に、ベクトルの追加を検討します。



ベクトルの追加は、既知のポイントから特定の距離にオブジェクトを配置する必要がある場合に非常に便利です。 そのためには、そのような点の座標と正規化されたベクトル(または単位ベクトル)を使用する必要があります。 正規化されたベクトルまたは単位ベクトルは、長さが1のベクトルです。 詳細はこちら



既存のラインから2000 mmの距離で右に水平に配置されたラインの複製を作成します。 これを行うには、最初にグラフィカルに必要な結果を表示します。 まず、平行四辺形の規則に従って必要な座標を見つけます。 新しい詳細線の座標は、次のように定義されます。

AF = AC + AF; AD = AB + BD;



画像



ベクトルCFおよびBDの代わりに、平行四辺形の規則に従って、計算が非常に簡単なベクトルAXを使用できます。 Revit APIが提供する正規化されたベクトルを使用します-これはXYZ.BasisXです。 このベクトルの長さは1に等しく、すべての基本ベクトルと同様に、原点に配置されます。 したがって、ミリメートルをフィートに変換することを忘れずに、2000mmを掛けます。



XYZ vectorAX = XYZ.BasisX * (2000 / 304.8);

// AF AD

XYZ vectorAF = vectorAC + vectorAX;

XYZ vectorAD = vectorAB + vectorAX;








見つかったベクトルvectorAFおよびvectorADは、新しい詳細ラインを構築するための正確な座標です。

たとえば、詳細ラインをポイントCまたはBに向かって1000 mm延長する方法を見てみましょう。



//

XYZ directionToC = vectorBC.Normalize();

XYZ newC = vectorAC + (directionToC * (1000 / 304.8));

//

XYZ vectorCB = vectorAB - vectorAC;

XYZ directionToB = vectorCB.Normalize();

XYZ newB = vectorAB + (directionToB * (1000 / 304.8));








XYZクラスのNormalizeメソッドに関するいくつかの言葉。 Normalizeは、正規化されたベクトルBCまたはCBを返します。 つまり、ベクトルBCまたはCBであり、1に等しい長さに短縮され、方向を維持して原点に配置されます。



Revit用のプログラムを開発するときの3次元の世界の魅力的な旅には、既知の座標を持つ基準点と、 正規化された(単一の)ベクトルおよび距離の形式のモーションポインターのみが必要ですポインターと距離の積 、およびそれらに追加され参照点は、新しい座標を提供します。 Revitプロジェクトスペースは、多くの要素から取得できるポインタでいっぱいになっています。 上記の例のように、ポインターを計算できます。



3次元の世界を快適に旅するためには、線または表面の法線とベクトルのスカラー積に関する知識を身に付ける必要があります。 線の交差点に関する情報、およびRevitの一般的なケース、特別なケース- セグメント交差点に関する情報を取得する必要があります。



以下に、Revitのマクロリストを示します。選択した詳細線を右に2000mmシフトし、両方向に1000mm延長します。



Revit Cのマクロを表示#
/*

;* Created by SharpDevelop.

* User: Akunets Aleksandr, www.bim3d.ru

* Date: 27.08.2017

* Time: 20:37

*

* To change this template use Tools | Options | Coding | Edit Standard Headers.

*/

using System;

using Autodesk.Revit.UI;

using Autodesk.Revit.DB;

using Autodesk.Revit.UI.Selection;

using System.Collections.Generic;

using System.Linq;



namespace Vector

{

[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]

[Autodesk.Revit.DB.Macros.AddInId("17333FA7-9C10-4B4E-A179-7B56E33FC6B3")]

public partial class ThisApplication

{

private void Module_Startup(object sender, EventArgs e)

{



}



private void Module_Shutdown(object sender, EventArgs e)

{



}



public void Vector() {



UIDocument uidoc = this.ActiveUIDocument;



Document doc = uidoc.Document; //



Selection selection = uidoc.Selection;



Reference r = selection.PickObject(ObjectType.Element, " "); //



Element line = doc.GetElement(r.ElementId); //



XYZ vectorAB = (line.Location as LocationCurve).Curve.GetEndPoint(0); //



XYZ vectorAC = (line.Location as LocationCurve).Curve.GetEndPoint(1); //



XYZ vectorBC = vectorAC - vectorAB; // ,



XYZ vectorAX = XYZ.BasisX * (2000 / 304.8); // 2000 ( 2000 )



XYZ vectorAF = vectorAC + vectorAX; // ()



XYZ vectorAD = vectorAB + vectorAX; // ()



XYZ directionToC = vectorBC.Normalize(); // ( ) ,

//



XYZ newC = vectorAF + (directionToC * (1000 / 304.8)); // ()



//

XYZ vectorCB = vectorAB - vectorAC; // , BC



XYZ directionToB = vectorCB.Normalize(); // ( ) B,

//



XYZ newB = vectorAD + (directionToB * (1000 / 304.8)); // ()



Transaction t = new Transaction(doc, "Create Detail Line");

{

t.Start();



Line geomLine = Line.CreateBound(newB, newC);



DetailLine detailline = doc.Create.NewDetailCurve(doc.ActiveView, geomLine ) as DetailLine;



t.Commit();

}

}



#region Revit Macros generated code

private void InternalStartup()

{

this.Startup += new System.EventHandler(Module_Startup);

this.Shutdown += new System.EventHandler(Module_Shutdown);

}

#endregion

}

}











All Articles