Как повернуть экземпляр семейства в revit

#c# #revit-api

#c# #revit-api

Вопрос:

[введите описание изображения здесь] В моей модели есть элемент обрамления, и я вычисляю края этого элемента, но элемент повернут и имеет другую ориентацию грани, например (0.4, 0.6, 0.2). Мне нужны координаты ребер элемента только в формате (x, y), но я получаю координаты как (x, y, z), где x может быть высотой, длиной или шириной. Как я могу получить координаты.

Я преобразую координаты ребер в относительную координату путем вычитания точки местоположения элемента

Я подумал, что если я смогу изменить ориентацию грани элемента на (0, 0, 1), то есть разместить его в плоскости Z, тогда все, что мне нужно сделать, это прочитать (X, y) ребра и сохранить его в списке. Если это правильный подход, пожалуйста, подскажите мне, как? Или, пожалуйста, предложите любой другой метод

     private List<XYZ> GetFacesAndEdges(Element sheet)
    {
        //Location p1 = sheet.Location;

        //FamilyInstance ins = sheet as FamilyInstance;
        //Transform tra = ins.GetTransform();
        //tra.BasisX = new XYZ(1, 0, 0);
        //tra.BasisY = new XYZ(0, 1, 0);
        //tra.BasisZ = new XYZ(0, 0, 1);

        //Location p2 = ins.Location;

        String faceInfo = "";
        List<XYZ> points = new List<XYZ>();
        Location p = sheet.Location;
        XYZ point = new XYZ();
        if (sheet?.Location is LocationPoint location)
        {
            point = location.Point;
        }

        Autodesk.Revit.DB.Options opt = new Options();
        Autodesk.Revit.DB.GeometryElement geomElem = sheet.get_Geometry(opt);
        foreach (GeometryObject geomObj in geomElem)
        {
            Solid geomSolid = geomObj as Solid;
            if (null != geomSolid)
            {
                int faces = 0;
                double totalArea = 0;

                foreach(Edge e in geomSolid.Edges)
                {
                    IList<XYZ> pointd = e.Tessellate();
                    foreach(XYZ ptr in pointd)
                    {
                        XYZ ptrXYZ = new XYZ(ptr.X - point.X , ptr.Y - point.Y, ptr.Z - point.Z);
                        points.Add(ptrXYZ);
                    }
                }
            }
        }

        return points;
    }
  

Я хочу, чтобы ребра были в относительных координатах, а также только в двумерном измерении. Пример. <(0,0);(0,4);(4,4)(4,0)> Обрамляющий квадратный элемент размером 4 * 4

Это изображение обрамляющего элемента, который имеет вырезы, а не отверстия.

Комментарии:

1. Я думаю, картинка поможет лучше объяснить, что вы имеете в виду. Просто нарисованный от руки эскиз мог бы помочь.

2. Я добавил картинку, на которой вырезаны не отверстия. Я хочу, чтобы получить относительные края этих отверстий, т. Е. Разместить рамку в плоскости xy, тогда соответствующая координата будет (из нижнего левого угла по часовой стрелке) :- (0,0) ; (0,8); (2 ,8) ; (2,6);(6,6);(6,0)

Ответ №1:

Я очень мало понимаю из того, что вы спрашиваете. Однако наиболее важным аспектом, по-видимому, является то, что у вас есть фигура в 3D-пространстве и фактически вы хотите выполнить для нее 2D-анализ. Для этого, очевидно, намного проще проанализировать и решить проблему, если вы можете сначала избавиться от лишнего измерения. Этого можно легко достичь, используя соответствующую проекцию. Когда-то давно я столкнулся с подобной задачей при анализе 3D-многоугольных областей. Поскольку у меня уже было решение для определения 2D-областей полигонов и внешних циклов, я спроектировал 3D-задачу в 2D, см. метод GetPolygonPlane в модуле CmdWallProfileArea.cs в примерах Building Coder.