# 为 Dynamo For Revit 开发

## 在 `GeometryPrimitiveConverter.cs` 中使用方法

DynamoRevit 代码库中的 [GeometryPrimitiveConverter](https://github.com/DynamoDS/DynamoRevit/blob/master/src/Libraries/RevitNodes/GeometryConversion/GeometryPrimitiveConverter.cs) 类提供了各种方法用于在 Revit 几何类型和 Dynamo 几何类型之间进行转换。在与 Revit 模型交互的 Dynamo 脚本中处理几何图形时，这些方法非常有用。

### 方法类别

`GeometryPrimitiveConverter.cs` 中的方法可以分为四大类：

1. **Proto 到 Revit 类型**：将 Dynamo (Proto) 类型转换为 Revit 类型的方法。
2. **Revit 到 Proto 类型**：将 Revit 类型转换为 Dynamo (Proto) 类型的方法。
3. **度数和弧度**：在度数和弧度之间转换的方法。
4. **X 和 UZ**：用于获取垂直向量的方法。

### 原型到 Revit 类型

#### ToRevitBoundingBox

从 Dynamo 坐标系和两个定义点（最小值和最大值）创建 Revit BoundingBoxXYZ。

`public static Autodesk.Revit.DB.BoundingBoxXYZ ToRevitBoundingBox( Autodesk.DesignScript.Geometry.CoordinateSystem cs, Autodesk.DesignScript.Geometry.Point minPoint, Autodesk.DesignScript.Geometry.Point maxPoint, bool convertUnits = true)`

#### ToRevitType (BoundingBox)

将 Dynamo BoundingBox 转换为 Revit BoundingBoxXYZ。

convertUnits 标志（默认为 true）确定坐标是否应从 Dynamo 的单位系统转换为 Revit 的内部单位。

`public static Autodesk.Revit.DB.BoundingBoxXYZ ToRevitType(this Autodesk.DesignScript.Geometry.BoundingBox bb, bool convertUnits = true)`

#### ToRevitType （点）

将 Dynamo 点转换为 Revit XYZ。

convertUnits 标志（默认为 true）在必要时转换坐标。

`public static Autodesk.Revit.DB.XYZ ToRevitType(this Autodesk.DesignScript.Geometry.Point pt, bool convertUnits = true)`

#### ToRevitType （向量）

将 Dynamo 向量转换为 Revit XYZ。

请注意，convertUnits 标志默认为 false，因为向量表示方向和大小，而这通常不需要单位转换。转换可能会影响向量的方向和长度。

`public static Autodesk.Revit.DB.XYZ ToRevitType(this Vector vec, bool convertUnits = false)`

#### ToXyz（点）

将 Dynamo 点转换为 Revit XYZ。

`public static Autodesk.Revit.DB.XYZ ToXyz(this Autodesk.DesignScript.Geometry.Point pt, bool convertUnits = true)`

#### ToXyz（向量）

将 Dynamo 向量转换为 Revit XYZ。

请注意，convertUnits 标志默认为 false，因为向量表示方向和大小，而这通常不需要单位转换。转换可能会影响向量的方向和长度。

`public static Autodesk.Revit.DB.XYZ ToXyz(this Vector vec, bool convertUnits = false)`

#### ToTransform

将 Dynamo CoordinateSystem 转换为 Revit 变换。

`public static Autodesk.Revit.DB.Transform ToTransform(this CoordinateSystem cs, bool convertUnits = true)`

#### ToPlane

将 Dynamo 平面转换为 Revit 平面。

`public static Autodesk.Revit.DB.Plane ToPlane(this Autodesk.DesignScript.Geometry.Plane plane, bool convertUnits = true)`

#### ToXyzs（点）

将 Dynamo 点对象集合转换为 Revit XYZ 集合。

返回 XYZ 列表。`public static List<XYZ> ToXyzs(this List<Autodesk.DesignScript.Geometry.Point> list, bool convertUnits = true)`

返回 XYZ 阵列。`public static XYZ[] ToXyzs(this Autodesk.DesignScript.Geometry.Point[] list, bool convertUnits = true)`

#### ToXyzs（向量）

将 Dynamo 矢量对象的阵列转换为 Revit XYZ 矢量阵列。

`public static XYZ[] ToXyzs(this Autodesk.DesignScript.Geometry.Vector[] list, bool convertUnits = false)`

#### ToDoubleArray

将双精度值的阵列转换为 Revit 的 DoubleArray。

`public static DoubleArray ToDoubleArray(this double[] list)`

#### ToUv

将二维阵列 (double\[]\[])（其中每个内部阵列表示一对值（U 和 V））转换为 Revit UV 对象阵列。

`internal static Autodesk.Revit.DB.UV[] ToUvs(this double[][] uvArr)`

#### ToDSUvs

将二维阵列 (double\[]\[])（其中每个内部阵列表示一对值（U 和 V））转换为 Dynamo UV 对象阵列。

`internal static Autodesk.DesignScript.Geometry.UV[] ToDSUvs(this double[][] uvArr)`

#### 使用原型到 Revit 类型的示例

此示例显示了一种快捷方法，用于使用 .ToXyz（点）方法将 Dynamo Point.ByCoordinates 转换为 Revit XYZ。

![将 Dynamo Point.ByCoordinates 转换为 Revit XYZ](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-chs/11_developer_primer/3_developing_for_dynamo/Images/dynamo-point-to-revit-xyz.png)

```
# Load the Python Standard and DesignScript Libraries
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Revit API
from Autodesk.Revit.DB import *

# Revit Geometry Conversion Library
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

# Input: Dynamo Point
dyn_point = IN[0]

# Convert to Revit XYZ
revit_point = dyn_point.ToXyz()

# Output
OUT = revit_point

```

### Revit 到原型类型

#### ToProtoType (BoundingBox)

将 Revit BoundingBoxXYZ 转换为 Dynamo BoundingBox。

`public static Autodesk.DesignScript.Geometry.BoundingBox ToProtoType(this Autodesk.Revit.DB.BoundingBoxXYZ xyz, bool convertUnits = true)`

#### ToPoint (XYZ)

将 Revit XYZ 转换为 Dynamo 点。

`public static Autodesk.DesignScript.Geometry.Point ToPoint(this XYZ xyz, bool convertUnits = true)`

#### ToProtoType（点）

将 Revit 点转换为 Dynamo 点。

`public static Autodesk.DesignScript.Geometry.Point ToProtoType(this Autodesk.Revit.DB.Point point, bool convertUnits = true)`

#### ToVector (XYZ)

将 Revit XYZ 转换为 Dynamo 向量。

`public static Vector ToVector(this XYZ xyz, bool convertUnits = false)`

#### ToProtoType (UV)

将 Revit UV 转换为 Dynamo UV。

`public static Autodesk.DesignScript.Geometry.UV ToProtoType(this Autodesk.Revit.DB.UV uv)`

#### ToPlane (Revit Plane)

将 Revit 平面转换为 Dynamo 平面。

`public static Autodesk.DesignScript.Geometry.Plane ToPlane(this Autodesk.Revit.DB.Plane plane, bool convertUnits = true)`

#### ToCoordinateSystem

将 Revit 变换转换为 Dynamo CoordinateSystem。

`public static CoordinateSystem ToCoordinateSystem(this Transform t, bool convertUnits = true)`

#### ToPoints

将 Revit XYZ 点列表转换为 Dynamo 点列表。

`public static List<Autodesk.DesignScript.Geometry.Point> ToPoints(this List<XYZ> list, bool convertUnits = true)`

#### 使用 Revit 到原型类型的示例

此示例显示了一种快捷方法，用于使用 .ToPoint (XYZ) 方法将 Revit XYZ 转换为 Dynamo 点。

![将 Revit XYZ 转换为 Dynamo Point.ByCoordinates](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-chs/11_developer_primer/3_developing_for_dynamo/Images/revit-xyz-to-dynamo-point.png)

```
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Revit API
from Autodesk.Revit.DB import *

# Revit Geometry Conversion Library
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

# Input: Dynamo Point
dyn_point = IN[0]

# Convert to Revit XYZ
revit_point = dyn_point.ToPoint()

# Output
OUT = revit_point
```

### 度和弧度

#### ToRadians

将度转换为弧度。

`public static double ToRadians(this double degrees) { return degrees * Math.PI / 180.0; }`

#### ToDegrees

将弧度转换为度。

`public static double ToDegrees(this double degrees) { return degrees * 180.0 / Math.PI; }`

#### 度和弧度的使用示例

此示例显示了一种快捷方法，用于使用 .ToRadians 方法从度转换为弧度。

![将度转换为弧度](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-chs/11_developer_primer/3_developing_for_dynamo/Images/degrees-to-radians.png)

```
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Revit API
from Autodesk.Revit.DB import *

# Revit Geometry Conversion Library
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

# Input: Measure Angle
degree_angle = IN[0]

# Convert to Radians
radian_angle = Revit.GeometryConversion.GeometryPrimitiveConverter.ToRadians(degree_angle)

# Output
OUT = radian_angle
```

### X 和 UZ

#### GetPerpendicular (XYZ)

此方法返回给定 `XYZ` 向量的垂直 `XYZ` 向量。

`public static XYZ GetPerpendicular(this XYZ xyz)`

#### GetPerpendicular (Vector)

此方法返回给定 Dynamo `Vector` 的垂直 Dynamo `Vector`。

`public static Vector GetPerpendicular(this Vector vector)`

#### X 和 UZ 的使用示例

此示例显示了一种快捷方法，用于使用 .GetPerpendicular 方法获取输入向量的垂直向量。

![获取垂直向量](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-chs/11_developer_primer/3_developing_for_dynamo/Images/get-perpendicular-vector.png)

```
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Revit API
from Autodesk.Revit.DB import *

# Revit Geometry Conversion Library
import Revit
clr.ImportExtensions(Revit.GeometryConversion)

# Input Dynamo Vector
input_vector = IN[0]

# Get perpendicular vector using GetPerpendicular
perpendicular_vector = Revit.GeometryConversion.GeometryPrimitiveConverter.GetPerpendicular(input_vector)

# Output the perpendicular vector
OUT = perpendicular_vector

```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://primer2.dynamobim.org/zh-cn/1_developer_primer_intro/3_developing_for_dynamo/12-developing-for-dynamo-for-revit.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
