Revit API - C# - Как установить заголовок просмотра на видовом экране - PullRequest
0 голосов
/ 06 мая 2020

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

Я могу разместить область просмотра на листе и загрузить семейство заголовков представлений в проект, но я не могу назначить загруженный заголовок представления для области просмотра. Кому-нибудь повезло с этим?

Вот несколько фотографий того, что я пытаюсь сделать:

1) Вид помещается на лист. не проблема View is placed on the sheet. not a problem

2) Редактировать тип представления и изменять заголовок вида используйте «Заголовок вида w лист» enter image description here

3) Измените строку расширения показа на "да" enter image description here

4) сделайте так, чтобы она выглядела так. enter image description here

Вот некоторые источники, на которые я смотрел: https://thebuildingcoder.typepad.com/blog/2013/01/changing-viewport-type.html <- показывает, как изменить тип области просмотра на уже созданный. </p>

https://forums.autodesk.com/t5/revit-api-forum/move-title-of-a-viewport/td-p/5598602 <- показывает, как переместить заголовок вида </p>

************** ОБНОВЛЕНИЕ ***** *****************

Я думал, что у меня он работает безупречно, но нет.

При первом нажатии кнопки все работает кроме не выставлен параметр "Заголовок". По-прежнему отображается <none>.

Повторное нажатие на кнопку отправляет мне ошибку InternalDefinition при создании области просмотра.

Если я установил Title вручную для загруженного семейства заголовков представления, примените изменения, сбросьте его обратно to <none>, применить изменения, А ЗАТЕМ нажать кнопку. Оно работает. это почти похоже на то, что семейство не распознается как законный вариант заголовка, пока я не применю изменения.

вот мой код:

// Get an available title block from document
            FilteredElementCollector colTitleBlocks = new FilteredElementCollector(doc);
            colTitleBlocks.OfClass(typeof(FamilySymbol));
            colTitleBlocks.OfCategory(BuiltInCategory.OST_TitleBlocks);


            // Get available viewPlans block from document
            FilteredElementCollector collectorViewPlans = new FilteredElementCollector(doc);
            collectorViewPlans.OfClass(typeof(ViewPlan));
            List<ViewPlan> viewPlansList = collectorViewPlans.Cast<ViewPlan>().ToList();

            // grab first as example
            ViewPlan duplicatedPlan = viewPlansList[0];


            // grab viewport labels
            FilteredElementCollector colViewTitles = new FilteredElementCollector(doc);
            colViewTitles.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_ViewportLabel);

            String colViewTitleFamilyName = null;
            Element colViewTitleFamilyName2 = null;
            ElementId viewTitleIdCommand = null;

using (Transaction t = new Transaction(doc))
            {

                //try
                //{

                t.Start("Create a new ViewSheet");

                // check if any title blocks are loaded. if not, load familly
                if (colTitleBlocks != null)
                {
                    LoadTitleBlocks loadFamily = new LoadTitleBlocks();
                    loadFamily.loadFamily(commandData);
                }
                FamilySymbol firstSheet = colTitleBlocks.FirstElement() as FamilySymbol;


                // Create a sheet view Block
                ViewSheet viewSheet = ViewSheet.Create(doc, firstSheet.Id);
                if (viewSheet == null)
                {
                    throw new Exception("Failed to create new ViewSheet.");
                }
                // End of Create a sheet view Block


                // begin duplication
                ElementId duplicatedPlan2Copy = duplicatedPlan.Duplicate(ViewDuplicateOption.Duplicate);

                // Add passed in view onto the center of the sheet
                UV location = new UV((viewSheet.Outline.Max.U - viewSheet.Outline.Min.U) / 2,
                                        (viewSheet.Outline.Max.V - viewSheet.Outline.Min.V) / 2);


                try
                {
                    // Create Viewport
                    newViewPort = Viewport.Create(doc, viewSheet.Id, duplicatedPlan2Copy, new XYZ(location.U, location.V, 0));
                }
                catch (Exception)
                {

                    throw;
                }

                newViewPort.LookupParameter("View Scale").Set(24);
                bool newViewportTypeParameterShowLabel = doc.GetElement(newViewPort.GetTypeId()).get_Parameter(BuiltInParameter.VIEWPORT_ATTR_SHOW_LABEL).Set(1);


if (colViewTitles.Count() > 0)
                {
                    viewTitleIdCommand = colViewTitles.FirstElementId();
                    colViewTitleFamilyName = colViewTitles.FirstElement().ToString();
                    Debug.Print("Count greater than 0. colViewTitleFamilyName: " + colViewTitleFamilyName + " Id: " + viewTitleIdCommand);

                }
                else if (colViewTitles.Count() == 0)
                {
                    LoadViewTitle loadViewTitle = new LoadViewTitle();
                    loadViewTitle.loadFamily(commandData);
                    viewTitleIdCommand = loadViewTitle.viewTitleId;
                    colViewTitleFamilyName = doc.GetElement(loadViewTitle.viewTitleId).Name;
                    colViewTitleFamilyName2 = doc.GetElement(loadViewTitle.viewTitleId) as Family;
                    //Family colViewTitleFamilyName3 = colViewTitleFamilyName2.
                    Debug.Print("Count is 0. colViewTitleFamilyName: " + colViewTitleFamilyName + " Id: " + viewTitleIdCommand);
                }
                doc.GetElement(newViewPort.GetTypeId()).get_Parameter(BuiltInParameter.VIEWPORT_ATTR_LABEL_TAG).Set(viewTitleIdCommand);


Ответы [ 2 ]

1 голос
/ 09 мая 2020

Я смог получить то, что хотел, используя эти две строки кода:

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

bool newViewportTypeParameterShowLabel = doc.GetElement(newViewPortTypeId).get_Parameter(BuiltInParameter.VIEWPORT_ATTR_SHOW_LABEL).Set(1);

****Solved*****
I needed to use a filtered element collector to find the elementId of my TitleView family instead of using the elementId from my `loadFamily` class. A peculiar error. 


bool elementType = doc.GetElement(newViewPortTypeId).get_Parameter(BuiltInParameter.VIEWPORT_ATTR_LABEL_TAG).Set(viewTitleIdCommand);

1 голос
/ 07 мая 2020

Вот недавнее объяснение Доступ к данным блока заголовка , которое должно помочь.

...