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

16/11/2015

Редактирование элемента в группе

Вопрос: У меня есть проблемка с редактированием параметра элемента, находящегося в группе, которая находится в нескольких местах проекта. Revit пишет вот такое сообщение:

 

В пользовательском интерфейсе для того, чтобы отредактировать параметр, я бы сначала выделил группу, нажал «Редактировать группу», сделал изменения в группе и нажал «Готово». Я конечно могу разгруппировать элементы, сделать изменения, затем сгруппировать их заново, с помощью API, но в этом случае я получу дублирующийся группы с различными названиями.

Ответ: К сожалению, тот способ что вы описали – единственный на текущий момент. Необходимо разгруппировать группу, перед тем как делать изменения элемента в ней. В файле Getting Started with the Revit API.docx из Revit SDK в вопросах и ответах есть вот такая информация:

Вопрос: При экспорте модели, содержащей группу, во внешнее приложение, пользователь получает ошибку и экспорт прекращается:

Группы можно изменять только в режиме работы с группами. Для внесения изменений во все экземпляры группы используйте команду "Редактировать группу". Опция "Разгруппировать" позволяет вносить изменения в экземпляры группы после их разгруппирования.

Ответ: Текущая версия API не позволяет изменять элементы в группе. Вы можете программно разгрупировать, сделать изменения, заново сгруппировать и затем переместить другие экземпляры из старой группы в новую группу, чтобы получить тот же самый эффект.

 

Кстати, на эту тему есть несколько дискуссий, затрагивающий другие аспекты данной проблемы.

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

Можете предоставить пример перемещения элемента в группе, но без отображения диалога?

Ответ: Единственный способ изменить элементы в группе – это разгруппировать группу.

Но элемент в группе может быть действительно изменен, если существуют только один экземпляр данной группы. При этом отображается сообщение:

Группа изменена вне режима редактирования групп. Изменение допускается, поскольку имеется только один экземпляр типа.

Избавиться от диалога можно следующими способами:

  • С помощью обработки события DialogBoxShowing
  • С помощью API по обработке ошибок
  • Если и это не поможет, то можно попробовать Windows API для определения момента, когда этот диалог отображается и сымитировать нажатие кнопки Пропустить

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

Ответ: В моем случае в проекте используется только один экземпляр группы. Вариант с API по обработке ошибок выглядит подходящим.

Вот такое сообщение я получаю:

 

Вот такой код я использовал, для избавления от диалогового окна с помощью реализации интерфейса IFailuresPreprocessor. Я удалил все лишнее и оставил лишь то, что относится непосредственно к диалоговому окну:

Код - VB.NET: [Выделить]
  1. Public Function Execute( _
  2.   ByVal commandData As ExternalCommandData, _
  3.   ByRef message As String, _
  4.   ByVal elements As ElementSet) _
  5.   As Result Implements IExternalCommand.Execute
  6.  
  7.   Dim trans As Transaction = Nothing
  8.   Dim ebRes As Boolean
  9.  
  10.   Try
  11.     Dim ret As Result = Nothing
  12.  
  13.     Dim app As Application _
  14.       = commandData.Application.Application
  15.  
  16.     Dim uidoc As UIDocument = app.ActiveUIDocument
  17.     Dim doc As Document = uidoc.Document
  18.  
  19.     Dim es As ElementSet = uidoc.Selection.Elements
  20.  
  21.     trans = New Transaction(doc, "MyCommand")
  22.     trans.Start()
  23.  
  24.     Dim fhOpt As FailureHandlingOptions _
  25.       = trans.GetFailureHandlingOptions()
  26.  
  27.     fhOpt.SetFailuresPreprocessor(New clsWallInfoFailure)
  28.  
  29.     trans.SetFailureHandlingOptions(fhOpt)
  30.  
  31.     ebRes = ChangeParametersAndSoOn(app, uidoc, doc, es)
  32.  
  33.     If ebRes = True Then
  34.       trans.Commit()
  35.     Else
  36.       trans.RollBack()
  37.     End If
  38.  
  39.   Catch ex As Exception
  40.     trans.RollBack()
  41.   Finally
  42.     trans.Dispose()
  43.   End Try
  44. End Function
  45.  
  46. Public Class clsWallInfoFailure
  47.   Implements IFailuresPreprocessor
  48.  
  49.   Public Function PreprocessFailures( _
  50.     ByVal failuresAccessor As FailuresAccessor) _
  51.     As FailureProcessingResult _
  52.     Implements IFailuresPreprocessor.PreprocessFailures
  53.  
  54.     Dim deleteWarning As Boolean
  55.  
  56.     Try
  57.       Dim flist As List(Of FailureMessageAccessor) _
  58.         = failuresAccessor.GetFailureMessages
  59.  
  60.       For Each f As FailureMessageAccessor In flist
  61.  
  62.         Dim fDefId As FailureDefinitionId = f.GetFailureDefinitionId
  63.  
  64.         Select Case fDefId
  65.           Case BuiltInFailures.GroupFailures.AtomViolationWhenOnePlaceInstance
  66.             deleteWarning = True
  67.         End Select
  68.  
  69.         If deleteWarning = True Then
  70.           failuresAccessor.DeleteWarning(f)
  71.         End If
  72.       Next
  73.  
  74.     Catch ex As Exception
  75.  
  76.     End Try
  77.   End Function
  78. End Class

Источник: http://thebuildingcoder.typepad.com/blog/2010/08/editing-elements-inside-groups.html

Автор перевода: Виктор Чекалин

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

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