Как отобразить значение общего параметра с помощью сборщика элементов в 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
В любом случае, спасибо за любую помощь, которая была предложена. Я уверен, что это будет не последний раз, когда я публикую здесь.
С уважением, Раннин