Как я могу обнаружить uiview активированный видовой экран

Мне нужно определить, является ли Uiview стандартным открытым представлением или это активированный видовой экран на листе. Запрос идентификатора представления uiview возвращает идентификатор активированного представления viewport. Я не нашел прямого способа обнаружить, что пользовательский интерфейс на самом деле является листом с активированным окном просмотра.

Я уже отслеживаю открытые просмотры в активированном событии просмотра для другой цели. Поэтому я решил сохранить идентификатор представления с хеш-кодом uiview для последующей проверки того, что это действительно был просмотр листа, прежде чем он стал активированным представлением. К сожалению, и я думаю, что в отличие от стандартного использования, хеш-код uiview не стабилен. Несколько запросов хеш-кода от объекта uiview возвращают разные значения.

У кого-нибудь есть способ обнаружить это состояние? Я должен быть в состоянии использовать методы на uiview еще. Таким образом, любая помощь, чтобы найти фактические дочерние окна, я хотел бы связать с объектом uiview. Представление все еще говорит "Лист: ..." в заголовке, когда представление активировано.

3 ответа

Решение
            TaskDialog mainDialog = new TaskDialog("Hello, viewport check!");
            mainDialog.MainInstruction = "Hello, viewport check!";
            mainDialog.MainContent = 
                    "Sadly Revit API doesn't automatically know if the user is in an active viewport. " 
                    + "Please click 'Yes' if your are, or 'No' if your not.";

            mainDialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink1,
                     "Yes, I am in an active viewport on a sheet.");
            mainDialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, 
                            "No, I am just in an ordinary view.");

            mainDialog.CommonButtons = TaskDialogCommonButtons.Close;
            mainDialog.DefaultButton = TaskDialogResult.Close;


            TaskDialogResult tResult = mainDialog.Show();

            bool YesOrNo = true;

            if (TaskDialogResult.CommandLink1 == tResult)
            {
                    YesOrNo = true;

            }

            else if (TaskDialogResult.CommandLink2 == tResult)
            {
                    YesOrNo = false;
            }
                           else{
            return;
               }    

Я опаздываю на вечеринку - но другой способ понять, находится ли пользователь в окне просмотра, - это исследовать Process.MainWindow заглавие. Примерно так (в RevitPythonShell):

import threading, clr
from System.Diagnostics import Process

# need winform libraries for feedback form only
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import Form, Label

app = __revit__.Application
doc = __revit__.ActiveUIDocument.Document
ui = __revit__.ActiveUIDocument

def lookAtWindow(activeView):

    # Looking for one of three conditions:
    # 1. User is on a sheet (ActiveView will be DrawingSheet)
    # 2. User is in an active ViewPort on a sheet (ActiveView will NOT be be DrawingSheet, but MainWindowTitle will contain " - [Sheet: " string)
    # 3. User is on a View (neither of the previous two conditions)

    result = False 

    if str(activeView.ViewType) == 'DrawingSheet':            
        result = 'Youre on a sheet'
    else:
        processes = list(Process.GetProcesses())
        for process in processes:
            window = process.MainWindowTitle
            if window and 'Autodesk Revit '+app.VersionName[-4:] in window and ' - [Sheet: ' in window and ' - '+doc.Title+']' in window:
                result = 'I reckon youre in a Viewport'
    if not result:
        result = 'so you must be in a '+str(activeView.ViewType) 

    form = Form()
    form.Width = 300
    form.Height = 100
    label = Label()
    label.Width = 280
    label.Height = 70
    label.Text = result
    label.Parent = form 
    form.ShowDialog()

# need to close RevitPythonShell console before checking MainWindowTitle, so run on timer
threading.Timer(1, lookAtWindow, [ui.ActiveView]).start()

__window__.Close()

Вы можете использовать метод GetSllViewports для ViewSheet, чтобы определить все области просмотра на данном листе. Используя это, вы можете собрать двунаправленную систему поиска по словарю, сопоставив любой лист со всеми окнами просмотра, которые он размещает, и наоборот. Это должно помочь решить вашу задачу. Вот пример использования:

http://thebuildingcoder.typepad.com/blog/2014/04/determining-the-size-and-location-of-viewports-on-a-sheet.html

Другие вопросы по тегам