Как повернуть семейный экземпляр в ревит - PullRequest
0 голосов
/ 03 апреля 2019

[введите описание изображения здесь] В моей модели есть элемент кадрирования, и я рассчитываю края этого элемента, но элемент поворачивается и имеет разную ориентацию лица для ex (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;
    }

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

Это изображение элемента кадрированияКоторый имеет порезы, а не отверстия.

1 Ответ

0 голосов
/ 04 апреля 2019

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

...