Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: shss от 06-09-2016, 09:30:25

Название: Поворот стены относительно центра
Отправлено: shss от 06-09-2016, 09:30:25
Добрый день!
Написал функцию поворота стены:
Код - C# [Выбрать]
  1.  Location position = wall.Location as Location;
  2. if (null != position) {
  3. XYZ axisStart = new XYZ(sp.X, sp.Y, 0);
  4. XYZ axisEnd = new XYZ(sp.X, sp.Y, 1);
  5. Line axis = Line.CreateBound(axisStart, axisEnd);
  6. position.Rotate(axis, a);
  7. }
  8.  
Но поворот происходит относительно начальной точки стены.
Есть ли возможность произвести поворот относительно серединной точки линии стены?
Название: Re: Поворот стены относительно центра
Отправлено: shss от 06-09-2016, 10:05:39
Не дождался ответа:)
Решил сделать не красиво, но эффективно:
Код - C# [Выбрать]
  1. Location position = wall.Location as Location;
  2. if (null != position) {
  3.    XYZ axisStart = new XYZ(sp.X, sp.Y, 0);
  4.    XYZ axisEnd = new XYZ(sp.X, sp.Y, 1);
  5.    Line axis = Line.CreateBound(axisStart, axisEnd);
  6.    position.Rotate(axis, a/2);
  7. }
  8. position = wall.Location as Location;
  9. if (null != position) {
  10.    XYZ axisStart = new XYZ(ep.X, ep.Y, 0);
  11.    XYZ axisEnd = new XYZ(ep.X, ep.Y, 1);
  12.    Line axis = Line.CreateBound(axisEnd, axisStart);
  13.     position.Rotate(axis, -a / 2);
  14. }
  15.  
Название: Re: Поворот стены относительно центра
Отправлено: Виктор Чекалин от 06-09-2016, 12:17:17
Сергей, собственно мысль верная. При повороте нужно задать линию, относительно которой происходит вращение. Центральную линию можно получить из геометрии стены на сколько я помню. Но твое решение тоже работает, если не брать во внимание тот факт, что центральная линия не всегда является центром стены.
Кстати откуда берутся координаты sp и ep? не из BoundingBox? В этом случае можно столкнуться с неожиданным поведением для повернутой относительно XY стены, как описано тут (http://adn-cis.org/forum/index.php?topic=7309.0)/

Да, и еще. Обрати внимание на класс ElementTransformUtils, а именно на ElementTransformUtils.Rotate. Он, конечно фактически сделает то же самое, но более универсальный.
Название: Re: Поворот стены относительно центра
Отправлено: shss от 06-09-2016, 21:28:33
Да, Виктор, верно центральная линия не всегда через центр стены проходит, но для вычисления типа центровой линии (Location line) я использую толщину стены и направление рисования стены (Curve), sp и ep - это и есть начало и конец LocationCurve стены и стараюсь обходить BoundingBox  в свое время знатно помучался с ним.