Ошибка при создании арматурных стержней из кривых
Ошибка при создании арматурных стержней из кривых
Мы знаем, что создать арматуру можно с помощью нескольких перегруженных методов. Одним из них является метод CreateFromCurves:
- public static Rebar CreateFromCurves(
- Document doc, RebarStyle style, RebarBarType barType,
- RebarHookType startHook, RebarHookType endHook, Element host,
- XYZ norm, IList<Curve> curves,
- RebarHookOrientation startHookOrient,
- RebarHookOrientation endHookOrient,
- bool useExistingShapeIfPossible, bool createNewShape);
Давайте подробнее разберем аргументы norm и curves:
- norm . Type: XYZ. Нормаль к плоскости, на которой лежит арматура.
- curves. Type: IList<Curve>. Массив кривых, который определяет фигуру арматуры. Кривые должны принадлежать плоскости, определяемую нормалью и исходной точкой. Отгибы и отводы не должны включаться в этот массив.
Файл справки RevitAPI.chm говорит нам о том, что поверхность и кривые должны быть перпендикулярны нормали.
Клиент хочет создать два арматурных стрежня. Поверхность и кривые действительно перпендикулярны, и первый стержень создается без проблем. А вот создание второго стержня падает с ошибкой InvalidOperationException: Невозможно создать фигуру арматурного стержня с заданными кривыми (Unable to create a RebarShape based on the given curves).
- RebarBarType bartype = new FilteredElementCollector(RevitDoc)
- .OfClass(typeof(RebarBarType))
- .FirstOrDefault(t => t.Name == "8 HPB300") as RebarBarType;
- Curve
- curve = Line.CreateBound(
- new XYZ(5.656152019023, 43.5912980314625, -10.0065608637852),
- new XYZ(5.65615201724766, 43.5912980188303, 7.70997373826235));
- curves.Add(curve);
- curve = Line.CreateBound(
- new XYZ(5.65615201724766, 43.5912980188303, 7.70997373826235),
- new XYZ(5.65615201724766, 45.2478392340832, 7.70997373826235));
- curves.Add(curve);
- curve = Line.CreateBound(
- new XYZ(5.65615201724766, 45.2478392340832, 7.70997373826235),
- new XYZ(5.656152019023, 45.2478392467154, -10.0065608637852));
- curves.Add(curve);
- // Первый стержень создается без проблем!
- Rebar.CreateFromCurves(RevitDoc, RebarStyle.Standard, bartype, null,
- null, ele, nml, curves, RebarHookOrientation.Left,
- RebarHookOrientation.Left, false, true);
- // Проблемный арматурный стержень
- List<Curve> curves2 = new List<Curve>();
- curve = Line.CreateBound(
- new XYZ(6.22700217574493, 43.5110702844365, -10.0065608637852),
- new XYZ(6.22700217219427, 43.5110702591722, 7.70997373826235));
- curves2.Add(curve);
- curve = Line.CreateBound(
- new XYZ(6.22700217219427, 43.5110702591722, 7.70997373826235),
- new XYZ(6.22700217219427, 45.1676114744251, 7.70997373826235));
- curves2.Add(curve);
- curve = Line.CreateBound(
- new XYZ(6.22700217219427, 45.1676114744251, 7.70997373826235),
- new XYZ(6.22700217574493, 45.1676114996894, -10.0065608637852));
- curves2.Add(curve);
- //InvalidOperationException – выбрасывается исключение
- // => Unable to create a RebarShape based on the given curves
- Rebar.CreateFromCurves(RevitDoc, RebarStyle.Standard, bartype, null,
- null, ele, nml, curves2, RebarHookOrientation.Left,
- RebarHookOrientation.Left, false, true);
Код создания второго стержня выглядит практически идентичным созданию первого стержня, за исключение координат точек, но почему он выбрасывает исключение, тогда как первый стержень создается без ошибок?
Мой коллега Grzegorz говорит:
Алгоритм создания фигуры достаточно сложен. В основном проблема может возникнуть для фигур, которые определены сегментами, располагающимися под прямым углом. Они должны быть определены очень точно (различные цифры на 7 или 8 месте после запятой, могут вызвать исключение). Наилучшим решением будет округление всех координат до 6 цифры после запятой.
Я изменил код таким образом, и проблема исчезла:
- curve = Line.CreateBound(
- XYZ(6.22700217574493, 43.5110702844365, -10.0065608637852),
- XYZ(6.22700217219427, 43.5110702591722, 7.70997373826235));
- curves2.Add(curve);
- curve = Line.CreateBound(
- XYZ(6.22700217219427, 43.5110702591722, 7.70997373826235),
- XYZ(6.22700217219427, 45.1676114744251, 7.70997373826235));
- curves2.Add(curve);
- curve = Line.CreateBound(
- XYZ(6.22700217219427, 45.1676114744251, 7.70997373826235),
- XYZ(6.22700217574493, 45.1676114996894, -10.0065608637852));
- curves2.Add(curve);
- ....
- private XYZ XYZ(double x, double y, double z)
- {
- return new XYZ(
- Math.Round(x, 6), Math.Round(y, 6), Math.Round(z, 6));
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=1752
Опубликовано 30.12.2014