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代码以生成相同的结果: