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

08/08/2013

Проблема с расположением двух и более видов на листе и ее решение

Проблема с расположением двух и более видов на листе и ее решение

Поступил вопрос от одного из разработчиков по поводу точного расположения двух видов на листе.

Вопрос: Я заметил, что иногда, когда я помещаю виды на лист, то координаты расположения этого вида слегка отличаются от заданного.

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

Я задаю одни и те же координаты на листе для обоих видов, но почему-то верхние границы все не совпадают.

Я делаю что-то не так? Если я ошибаюсь, то как это можно исправить?

Ответ: Мы провели исследование данной ошибки и обнаружили, что действительно есть проблема в вычислении координат вида на листе.

Но есть и хорошая новость. Есть способ как обойти эту ошибку: нужно временно установить достаточно большую Область подрезки (CropBox) для видов, которые вы помещаете на лист. При этом области подрезки должны быть одинаковыми для всех видов.

Таким образом, границы видов на листе будут совершенно одинаковыми и вы легко можете их выровнять на листе.

Затем восстановите предыдущие настройки области подрезки.

Вот пример функции с жестко привязанными идентификаторами элементов, которая решает вашу задачу для двух видов в тестовом проекте, который вы предоставили.

Код - C#: [Выделить]
  1.  
  2.         private void test4(Document doc)
  3.         {
  4.             BoundingBoxXYZ savedBox1 = null;
  5.             BoundingBoxXYZ savedBox2 = null;
  6.  
  7.             FamilySymbol typ = doc.GetElement(
  8.                 new ElementId(143899)) as FamilySymbol;
  9.  
  10.             ViewPlan go1 = doc.GetElement(
  11.                 new ElementId(205387)) as ViewPlan;
  12.  
  13.             ViewPlan vg1 = doc.GetElement(
  14.                 new ElementId(205424)) as ViewPlan;
  15.  
  16.             // Save current crop box
  17.  
  18.             if (go1.CropBoxActive)
  19.                 savedBox1 = go1.CropBox;
  20.  
  21.             if (vg1.CropBoxActive)
  22.                 savedBox2 = vg1.CropBox;
  23.  
  24.             if (savedBox1 != null)
  25.             {
  26.                 // Set crop box for 2nd view = 1st
  27.  
  28.                 vg1.CropBox = savedBox1;
  29.                 vg1.CropBoxActive = true;
  30.             }
  31.             else
  32.             {
  33.                 // Set both views to semi-random 
  34.                 // but large crop box
  35.  
  36.                 BoundingBoxXYZ newBox = new BoundingBoxXYZ();
  37.                 newBox.set_MinEnabled(0true);
  38.                 newBox.set_MinEnabled(1true);
  39.                 newBox.set_MinEnabled(2true);
  40.                 newBox.Min = new XYZ(-2000-20000);
  41.                 newBox.set_MaxEnabled(0true);
  42.                 newBox.set_MaxEnabled(1true);
  43.                 newBox.set_MaxEnabled(2true);
  44.                 newBox.Max = new XYZ(200020000);
  45.  
  46.                 vg1.CropBox = newBox;
  47.                 go1.CropBox = newBox;
  48.                 doc.Regenerate();
  49.                 vg1.CropBoxActive = true;
  50.                 go1.CropBoxActive = true;
  51.             }
  52.  
  53.             doc.Regenerate();
  54.  
  55.             // Create sheets and viewports
  56.  
  57.             var vSheet = ViewSheet.Create(doc, typ.Id);
  58.             vSheet.Name = "test3";
  59.             var location2 = new XYZ(000);
  60.  
  61.             var v12 = Viewport.Create(
  62.                 doc, vSheet.Id, go1.Id, location2);
  63.  
  64.             var v22 = Viewport.Create(
  65.                 doc, vSheet.Id, vg1.Id, location2);
  66.  
  67.             doc.Regenerate();
  68.  
  69.             // Align lower left - works because 
  70.             // crop boxes are same
  71.  
  72.             Outline outline1 = v12.GetBoxOutline();
  73.             Outline outline2 = v22.GetBoxOutline();
  74.  
  75.             XYZ min1 = outline1.MinimumPoint;
  76.             XYZ min2 = outline2.MinimumPoint;
  77.  
  78.             XYZ diffToMove = min1 - min2;
  79.  
  80.             ElementTransformUtils.MoveElement(
  81.                 doc, v22.Id, diffToMove);
  82.  
  83.             doc.Regenerate();
  84.  
  85.             // Restore view crop boxes
  86.  
  87.             if (savedBox1 == null)
  88.             {
  89.                 go1.CropBoxActive = false;
  90.             }
  91.             else
  92.             {
  93.                 go1.CropBox = savedBox1;
  94.                 go1.CropBoxActive = true;
  95.                 go1.CropBoxVisible = false;
  96.             }
  97.  
  98.             if (savedBox2 == null)
  99.             {
  100.                 vg1.CropBoxActive = false;
  101.             }
  102.             else
  103.             {
  104.                 vg1.CropBox = savedBox2;
  105.                 vg1.CropBoxActive = true;
  106.                 vg1.CropBoxVisible = false;
  107.             }
  108.  
  109.  

Сейчас виды корректно расположены на листе.

Отклик: Рад вам сообщить, что я протестировал ваше решение на парочке проектов в моем приложении и действительно теперь виды располагаются так как нужно. Спасибо!

Источник: http://thebuildingcoder.typepad.com/blog/2013/08/setting-the-exact-view-location-on-a-sheet.html

Обсуждениеhttp://adn-cis.org/forum/index.php?topic=147.0

Опубликовано 08.08.2013