Редактирование элемента в группе
Вопрос: У меня есть проблемка с редактированием параметра элемента, находящегося в группе, которая находится в нескольких местах проекта. Revit пишет вот такое сообщение:
В пользовательском интерфейсе для того, чтобы отредактировать параметр, я бы сначала выделил группу, нажал «Редактировать группу», сделал изменения в группе и нажал «Готово». Я конечно могу разгруппировать элементы, сделать изменения, затем сгруппировать их заново, с помощью API, но в этом случае я получу дублирующийся группы с различными названиями.
Ответ: К сожалению, тот способ что вы описали – единственный на текущий момент. Необходимо разгруппировать группу, перед тем как делать изменения элемента в ней. В файле Getting Started with the Revit API.docx из Revit SDK в вопросах и ответах есть вот такая информация:
Вопрос: При экспорте модели, содержащей группу, во внешнее приложение, пользователь получает ошибку и экспорт прекращается:
Группы можно изменять только в режиме работы с группами. Для внесения изменений во все экземпляры группы используйте команду "Редактировать группу". Опция "Разгруппировать" позволяет вносить изменения в экземпляры группы после их разгруппирования.
Ответ: Текущая версия API не позволяет изменять элементы в группе. Вы можете программно разгрупировать, сделать изменения, заново сгруппировать и затем переместить другие экземпляры из старой группы в новую группу, чтобы получить тот же самый эффект.
Кстати, на эту тему есть несколько дискуссий, затрагивающий другие аспекты данной проблемы.
Вопрос: Я пытаюсь повернуть и передвинуть элементы внутри группы, но не могу это сделать. На самом деле проблема даже не в том, как повернуть или передвинуть элементы, сколько избавится от проблемы отображения диалогового окна, которое отображается при изменении чего-либо в группе.
Можете предоставить пример перемещения элемента в группе, но без отображения диалога?
Ответ: Единственный способ изменить элементы в группе – это разгруппировать группу.
Но элемент в группе может быть действительно изменен, если существуют только один экземпляр данной группы. При этом отображается сообщение:
Группа изменена вне режима редактирования групп. Изменение допускается, поскольку имеется только один экземпляр типа.
Избавиться от диалога можно следующими способами:
- С помощью обработки события DialogBoxShowing
- С помощью API по обработке ошибок
- Если и это не поможет, то можно попробовать Windows API для определения момента, когда этот диалог отображается и сымитировать нажатие кнопки Пропустить
Однако нужно помнить, что метод сработает, только если в проекте существует только один экземпляр группы. В противном случае редактирование не будет осуществлено.
Ответ: В моем случае в проекте используется только один экземпляр группы. Вариант с API по обработке ошибок выглядит подходящим.
Вот такое сообщение я получаю:
Вот такой код я использовал, для избавления от диалогового окна с помощью реализации интерфейса IFailuresPreprocessor. Я удалил все лишнее и оставил лишь то, что относится непосредственно к диалоговому окну:
- Public Function Execute( _
- ByVal commandData As ExternalCommandData, _
- ByRef message As String, _
- ByVal elements As ElementSet) _
- As Result Implements IExternalCommand.Execute
- Dim trans As Transaction = Nothing
- Dim ebRes As Boolean
- Try
- Dim ret As Result = Nothing
- Dim app As Application _
- = commandData.Application.Application
- Dim uidoc As UIDocument = app.ActiveUIDocument
- Dim doc As Document = uidoc.Document
- Dim es As ElementSet = uidoc.Selection.Elements
- trans = New Transaction(doc, "MyCommand")
- trans.Start()
- Dim fhOpt As FailureHandlingOptions _
- = trans.GetFailureHandlingOptions()
- fhOpt.SetFailuresPreprocessor(New clsWallInfoFailure)
- trans.SetFailureHandlingOptions(fhOpt)
- ebRes = ChangeParametersAndSoOn(app, uidoc, doc, es)
- If ebRes = True Then
- trans.Commit()
- Else
- trans.RollBack()
- End If
- Catch ex As Exception
- trans.RollBack()
- Finally
- trans.Dispose()
- End Try
- End Function
- Public Class clsWallInfoFailure
- Implements IFailuresPreprocessor
- Public Function PreprocessFailures( _
- ByVal failuresAccessor As FailuresAccessor) _
- As FailureProcessingResult _
- Implements IFailuresPreprocessor.PreprocessFailures
- Dim deleteWarning As Boolean
- Try
- Dim flist As List(Of FailureMessageAccessor) _
- = failuresAccessor.GetFailureMessages
- For Each f As FailureMessageAccessor In flist
- Dim fDefId As FailureDefinitionId = f.GetFailureDefinitionId
- Select Case fDefId
- Case BuiltInFailures.GroupFailures.AtomViolationWhenOnePlaceInstance
- deleteWarning = True
- End Select
- If deleteWarning = True Then
- failuresAccessor.DeleteWarning(f)
- End If
- Next
- Catch ex As Exception
- End Try
- End Function
- End Class
Источник: http://thebuildingcoder.typepad.com/blog/2010/08/editing-elements-inside-groups.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=3205
Опубликовано 15.11.2015