Как отобразить значение общего параметра с помощью сборщика элементов в Revit?

Заранее спасибо за помощь. Я понятия не имею, что я делаю неправильно, и это очень расстраивает. Сначала немного предыстории...

Программа: Revit MEP 2015 IDE: VS 2013 Ultimate

Я создал файл общих параметров и добавил параметры этого файла в параметры проекта. Эти параметры были применены к трубопроводам, фитингам и трубам.

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

Заполняем:

Dim p as Parameter = Nothing
Dim VarName as String = "Parameter Name"
Dim VarVal as String = "Parameter Value"

p = elem.LookupParameter(VarName)      <-- elem is passed in to the function as an Element

If p IsNot Nothing Then
   p.Set(VarVal)
End if

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

Try
  For Each e As Element In fec.OfCategory(BuiltInCategory.OST_ConduitRun)
      sTemp = sTemp & "Name: " & P.Definition.Name & vbCrLf & "Value: " & P.AsString & vbCrLf & "Value As: " & P.AsValueString & vbCrLf & vbCrLf
      sTemp2 = sTemp2 & "Name: " & GetParamInfo(P, doc)
  Next
      MessageBox.Show(sTemp)
Catch ex As Exception
  MessageBox.Show(ex.Message)
End Try

В окне сообщения правильно отображаются все имена параметров, а для параметров Revit - значение. Параметры Shared, однако, показывают только имена параметров, значения всегда пустые. Есть ли другой способ, которым я должен идти об этом? Как ни странно, я могу видеть значения общих параметров, если я использую ссылку по выбору пользователя, например, так...

Dim uiDoc As UIDocument = app.ActiveUIDocument
Dim Sel As Selection = uiDoc.Selection
Dim pr As Reference = Nothing
Dim doc As Document = uiDoc.Document
Dim fec As New FilteredElementCollector(doc)
Dim filter As New ElementCategoryFilter(BuiltInCategory.OST_ConduitRun)
Dim sTemp As String = "", sTemp2 As String = ""
Dim elemcol As FilteredElementCollector = fec.OfCategory(BuiltInCategory.OST_ConduitRun)
Dim e As Element = Nothing, el As Element = Nothing
Dim P As Parameter


pr = Sel.PickObject(ObjectType.Element)
e = doc.GetElement(pr)

For Each P in e.Paramters 
    sTemp = sTemp & "Name: " & P.Definition.Name & vbCrLf & "Value: " & P.AsString & vbCrLf & "Value As: " & P.AsValueString & vbCrLf & vbCrLf
    sTemp2 = sTemp2 & "Name: " & GetParamInfo(P, doc)
Next
MessageBox.Show(sTemp)

С помощью описанного выше метода, когда пользователь выбирает объект напрямую, я вижу значения и имена общих параметров. Насколько они разные?

Есть ли какая-то привязка, на которую я должен смотреть, когда значение устанавливается для начала? Заранее спасибо всем за помощь.

С уважением, Глен

1 ответ

Решение

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

Я хотел опубликовать ответ здесь, на тот случай, если кто-то еще борется с тем же, так что... вы можете увидеть метод, который я использовал, чтобы попытаться прочитать параметры выше. В используемом методе теперь есть только несколько вещей, которые отличаются... 1) Набор элементов... 2) Идентификатор активного представления был добавлен в качестве параметра к FilteredElementCollector... 3) Был реализован FilteredElementIterator,

Насколько я могу сказать, что итератор делает его другим... может кто-нибудь объяснить, что он делает по-другому?

Ниже приведен метод, который на самом деле работает...

Public Sub Execute(app As UIApplication) Implements IExternalEventHandler.Execute
  Dim prompt As String = ""
  Dim uiDoc As UIDocument = app.ActiveUIDocument
  Dim doc As Document = uiDoc.Document
  Dim ElemSet As ElementSet = app.Application.Create.NewElementSet
  Dim fec As New FilteredElementCollector(doc, doc.ActiveView.Id)
  Dim fec_filter As New ElementCategoryFilter(BuiltInCategory.OST_Conduit)
  fec.WhereElementIsNotElementType()
  fec.WherePasses(fec_filter1)
  Dim fec_i As FilteredElementIterator = fec.GetElementIterator
  Dim e As Element = Nothing
  fec_i.Reset()

  Using trans As New Transaction(doc, "Reading Conduit")
    trans.Start()
    While (fec_i.MoveNext)
      e = TryCast(fec_i.Current, Element)
      ElemSet.Insert(e)
    End While

    Try
      For Each ee As Element In ElemSet
        GetElementParameterInformation(doc, ee)
      Next
    Catch ex As Exception
      TaskDialog.Show("ERROR", ex.Message.ToString)
    End Try
    trans.Commit()
  End Using
End Sub

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

С уважением, Раннин

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