[英]C# Revit API Create linear dimension
我正在尝试在视图部分中的元素的左端和右端之间创建一个维度,如图所示。
我正在使用以下代码通过迭代实体来获取面的参考。
public static Reference ReferenciaPlanoIzquierdoElementoEnVista(View vista, Element elem)
{
// Crea la referencia a devolver
Reference referencia = null;
// Crea la variable distancia
double distancia = double.MinValue;
// Obtiene el vector unitario que apunta hacia la izquierda de la vista
XYZ vistaIzquierda = -vista.RightDirection.Normalize();
// Crea las preferencias para analizar la geometría
Options opcion = new Options();
// Activa el cálculo de referencias a objetos
opcion.ComputeReferences = true;
// Crea una representación geométrica del elemento
GeometryElement geoElem = elem.get_Geometry(opcion);
// Recorre todos las geometrías primitivas
foreach (GeometryObject geoObje in geoElem)
{
// Castea la primitiva
GeometryInstance geoInst = geoObje as GeometryInstance;
// Verifica que esa geometría no sea nula
if (geoInst != null && geoInst.IsElementGeometry)
{
// Asigna la geometría primitiva a la representación geométrica
geoElem = geoInst.GetInstanceGeometry();
break;
}
}
// Recorre todos los solidos de la geometría
foreach (Solid solido in geoElem.OfType<Solid>().Where<Solid>(sol => sol != null))
{
// Recorre todas las caras del solido
foreach (Face cara in solido.Faces)
{
// Verifica que la cara no sea nula
if (cara != null)
{
// Obtiene las coordenadas 3D de la cara en un punto dado
XYZ puntoMedio = ObtenerPuntoMedioCara(cara);
// Obtiene el vector unitario normal de la cara en un punto dado
XYZ normal = ObtenerVectorNormalCara(cara).Normalize();
// Verifica que la normal sea paralela a la vista derecha
if (normal.CrossProduct(vistaIzquierda).IsZeroLength() && normal.IsAlmostEqualTo(vistaIzquierda))
{
// Distancia del punto medio de la cara al baricentro del elemento en el sentido del vector derecha de la vista
double distanciaACara = Math.Abs(DistanciaBaricentroElementoACara(vista, elem, cara));
// Verifica que la distancia sea mayor
if (distanciaACara > distancia)
{
// Asigna la nueva distancia
distancia = distanciaACara;
// Asigna la referencia de la cara
referencia = cara.Reference;
}
}
}
}
}
return referencia;
}
和这个代码来创建一个维度。
public static Dimension CrearCotaHorizontalAbajoParaElemento(System.Windows.Forms.ComboBox combo, List<DimensionType> estilosCotas,
Document doc, View vista, Element elem)
{
// Obtiene el DimensionType de la etiqueta seleccionada
DimensionType dimType = estilosCotas.FirstOrDefault(eti => eti.Name == combo.SelectedItem.ToString());
// Crea un arreglo con las referencias
ReferenceArray ArregloRef = new ReferenceArray();
// Obtiene el vector unitario que apunta hacia la derecha de la vista
XYZ vistaDerecha = vista.RightDirection.Normalize();
// Crea una caja de sección del elemento
BoundingBoxXYZ bb = elem.get_BoundingBox(vista);
// Agrega las referencias del plano
ArregloRef.Append(ReferenciaPlanoIzquierdoElementoEnVista(vista, elem));
ArregloRef.Append(ReferenciaPlanoDerechoElementoEnVista(vista, elem));
// Crea las coordenadas de la linea
XYZ x1 = new XYZ(bb.Min.X, bb.Min.Y, bb.Min.Z);
XYZ x2 = x1.Add(vistaDerecha);
// Crea la linea temporal
Line linea = Line.CreateBound(x1, x2);
// Crea la cota temporal
Dimension cota = doc.Create.NewDimension(vista, linea, ArregloRef, dimType);
// Crea una caja de sección del elemento
BoundingBoxXYZ bbCota = cota.get_BoundingBox(vista);
// Obtiene la altura del texto
double zCota = Math.Abs(bbCota.Min.Z - cota.LeaderEndPosition.Z);
// Mueve la cota hacia abajo
ElementTransformUtils.MoveElement(doc, cota.Id, new XYZ(0, 0, -zCota));
return cota;
}
我借鉴了 Jeremy Tammik 的帖子,他谈到了获得推荐的两种方法。 我选择了迭代的第一种方式。
https://thebuildingcoder.typepad.com/blog/2011/02/dimension-walls-by-iterating-faces.html https://thebuildingcoder.typepad.com/blog/2011/02/dimension-walls-using-findreferencesbydirection .html
但随后他向我扔了一张海报,说参考文献不正确,应该删除尺寸。
在您的代码中,您正在检索符号几何。 您可能需要改用实例几何体,如关于符号与实例几何体的引用的建筑编码器文章中所述。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.