繁体   English   中英

C# Revit API 创建线性尺寸

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM