C#Revit API创建线性标注
我试图在视图部分的元素左端和右端之间创建尺寸标注,如图所示 我使用下面的代码通过迭代实体来获取面引用C#Revit API创建线性标注,c#,dimension,revit-api,C#,Dimension,Revit Api,我试图在视图部分的元素左端和右端之间创建尺寸标注,如图所示 我使用下面的代码通过迭代实体来获取面引用 public static Reference ReferenciaPlanoIzquierdoElementoEnVista(View vista, Element elem) { // Crea la referencia a devolver Reference referencia = null; // Crea la variable distancia
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;
}
公共静态引用引用PlanoizquierDoelementoEnvista(视图视景,元素元素)
{
//一个移交者
Reference-referencea=null;
//可变距离
双距离a=double.MinValue;
//在维斯塔的izquierda庄园,你可以找到一个向量
XYZ vistaiquierda=-vista.RightDirection.Normalize();
//对几何图形的分析
选项选项=新选项();
//目标参考活动
opcion.computerreferences=true;
//基本要素几何图形代表图
GeometryElement geolem=elem.get_Geometry(opcion);
//雷科雷·托多斯·拉斯吉奥梅塔斯·普里米提瓦斯
foreach(GeometryObject geoObje in geoElem)
{
//原始城堡酒店
GeometryInstance geoInst=geoObje作为GeometryInstance;
//验证是否存在任何海洋现象
if(geoInst!=null&&geoInst.IsElementGeometry)
{
//首先是代表性的几何
geolem=geoInst.GetInstanceGeometry();
打破
}
}
//请记住,这是几何图形的一部分
foreach(geoElem.OfType()中的固体solido,其中(sol=>sol!=null))
{
//雷科雷·托达斯·拉斯卡拉斯·德尔·索里多酒店
foreach(面用单面卡拉表示)
{
//查里卡卡卡诺海努拉酒店
如果(卡拉!=null)
{
//punto护墙板上的三维立体画框
XYZ puntoMedio=钝角puntomediocara(cara);
//平托护墙板上的垂直向量集合
XYZ normal=ObtenerVectorNormalCara(cara).Normalize();
//确认正常的海况和海景
if(normal.CrossProduct(vistaIzquierda.iszerolegth()&&normal.IsAlmostEqualTo(vistaIzquierda))
{
//维斯塔矢量导航设备设备中心的距离
双距离a卡拉=Math.Abs(距离a勒门托卡拉(vista,elem,cara));
//海洋市长
如果(距离A>距离A)
{
//阿西尼亚-拉努瓦距离
距离=距离;
//拉卡拉参考酒店
referencea=cara.Reference;
}
}
}
}
}
返回参考;
}
这段代码用于创建维度
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;
}
public静态维度CrearCotaHorizontalAbajoParaElemento(System.Windows.Forms.ComboBox组合,列表estilocatas,
文档文档、视图视景、元素元素)
{
//etiqueta seleccionada酒店
DimensionType dimType=estilosCotas.FirstOrDefault(eti=>eti.Name==combo.SelectedItem.ToString());
//参考书
ReferenceArray Arrelogref=新的ReferenceArray();
//在维斯塔的德雷查庄园,你可以找到一个向量
XYZ vistaDerecha=vista.RightDirection.Normalize();
//这是一个很好的选择
BoundingBoxXYZ bb=elem.get_BoundingBox(vista);
//阿格雷加平面参考酒店
ArregloRef.Append(参考平面图、平面图、元素图);
ArregloRef.Append(referenceaplanoderechoelementovista(vista,elem));
//科德纳达斯酒店
XYZ x1=新的XYZ(bb.Min.X,bb.Min.Y,bb.Min.Z);
XYZ x2=x1.添加(vistaDerecha);
//颞线
Line linea=Line.CreateBound(x1,x2);
//科塔时间酒店
维度cota=doc.Create.NewDimension(vista、linea、Arregoref、dimType);
//这是一个很好的选择
boundingboxyz bbCota=cota.get_BoundingBox(vista);
//阿尔图拉纺织厂
双zCota=数学绝对值(bbCota.Min.Z-cota.LeaderEndPosition.Z);
//穆伊夫·拉科塔·哈西亚·阿巴乔
ElementTransformUtils.MoveElement(doc,cota.Id,新的XYZ(0,0,-zCota));
返回cota;
}
我引用了杰里米·塔米克的帖子,他谈到了两种获得推荐的方法。我选择了第一种方法,即迭代
但后来他扔给我一张海报,说参考资料不正确,应该去掉尺寸
在代码中,您正在检索符号几何体。您可能需要使用实例几何体,如上的Building Coder文章所述。感谢您的及时回复Jeremy。我将“GetSymbolGeometry”方法更改为“GetInstanceGeometry”,如building Coder论坛中所述,并在选项中添加了“includeNovisibleObjects=true”属性。但它总是抛出相同的错误。通过用户界面手动实现,并使用RevitLookup在数据库中分析结果。然后,实现API代码以生成相同的结果: