Проблема с расположением двух и более видов на листе и ее решение
Проблема с расположением двух и более видов на листе и ее решение
Поступил вопрос от одного из разработчиков по поводу точного расположения двух видов на листе.
Вопрос: Я заметил, что иногда, когда я помещаю виды на лист, то координаты расположения этого вида слегка отличаются от заданного.
Я создал простую модель в Revit, и надстройку, которая помещает планы этажей на только что созданный лист.
Я задаю одни и те же координаты на листе для обоих видов, но почему-то верхние границы все не совпадают.
Я делаю что-то не так? Если я ошибаюсь, то как это можно исправить?
Ответ: Мы провели исследование данной ошибки и обнаружили, что действительно есть проблема в вычислении координат вида на листе.
Но есть и хорошая новость. Есть способ как обойти эту ошибку: нужно временно установить достаточно большую Область подрезки (CropBox) для видов, которые вы помещаете на лист. При этом области подрезки должны быть одинаковыми для всех видов.
Таким образом, границы видов на листе будут совершенно одинаковыми и вы легко можете их выровнять на листе.
Затем восстановите предыдущие настройки области подрезки.
Вот пример функции с жестко привязанными идентификаторами элементов, которая решает вашу задачу для двух видов в тестовом проекте, который вы предоставили.
- private void test4(Document doc)
- {
- BoundingBoxXYZ savedBox1 = null;
- BoundingBoxXYZ savedBox2 = null;
- FamilySymbol typ = doc.GetElement(
- new ElementId(143899)) as FamilySymbol;
- ViewPlan go1 = doc.GetElement(
- new ElementId(205387)) as ViewPlan;
- ViewPlan vg1 = doc.GetElement(
- new ElementId(205424)) as ViewPlan;
- // Save current crop box
- if (go1.CropBoxActive)
- savedBox1 = go1.CropBox;
- if (vg1.CropBoxActive)
- savedBox2 = vg1.CropBox;
- if (savedBox1 != null)
- {
- // Set crop box for 2nd view = 1st
- vg1.CropBox = savedBox1;
- vg1.CropBoxActive = true;
- }
- else
- {
- // Set both views to semi-random
- // but large crop box
- BoundingBoxXYZ newBox = new BoundingBoxXYZ();
- newBox.set_MinEnabled(0, true);
- newBox.set_MinEnabled(1, true);
- newBox.set_MinEnabled(2, true);
- newBox.Min = new XYZ(-2000, -2000, 0);
- newBox.set_MaxEnabled(0, true);
- newBox.set_MaxEnabled(1, true);
- newBox.set_MaxEnabled(2, true);
- newBox.Max = new XYZ(2000, 2000, 0);
- vg1.CropBox = newBox;
- go1.CropBox = newBox;
- doc.Regenerate();
- vg1.CropBoxActive = true;
- go1.CropBoxActive = true;
- }
- doc.Regenerate();
- // Create sheets and viewports
- var vSheet = ViewSheet.Create(doc, typ.Id);
- vSheet.Name = "test3";
- var location2 = new XYZ(0, 0, 0);
- var v12 = Viewport.Create(
- doc, vSheet.Id, go1.Id, location2);
- var v22 = Viewport.Create(
- doc, vSheet.Id, vg1.Id, location2);
- doc.Regenerate();
- // Align lower left - works because
- // crop boxes are same
- Outline outline1 = v12.GetBoxOutline();
- Outline outline2 = v22.GetBoxOutline();
- XYZ min1 = outline1.MinimumPoint;
- XYZ min2 = outline2.MinimumPoint;
- XYZ diffToMove = min1 - min2;
- ElementTransformUtils.MoveElement(
- doc, v22.Id, diffToMove);
- doc.Regenerate();
- // Restore view crop boxes
- if (savedBox1 == null)
- {
- go1.CropBoxActive = false;
- }
- else
- {
- go1.CropBox = savedBox1;
- go1.CropBoxActive = true;
- go1.CropBoxVisible = false;
- }
- if (savedBox2 == null)
- {
- vg1.CropBoxActive = false;
- }
- else
- {
- vg1.CropBox = savedBox2;
- vg1.CropBoxActive = true;
- vg1.CropBoxVisible = false;
- }
Сейчас виды корректно расположены на листе.
Отклик: Рад вам сообщить, что я протестировал ваше решение на парочке проектов в моем приложении и действительно теперь виды располагаются так как нужно. Спасибо!
Источник: 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