首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RevitPythonShell的ExtensibleStorage

使用RevitPythonShell的ExtensibleStorage
EN

Stack Overflow用户
提问于 2020-09-12 22:01:47
回答 2查看 103关注 0票数 1

我正在尝试利用Revit API中的ExtensibleStorage。我正在尝试在ArrayField中存储数组。我认为我的错误可能是由于IronPython接口造成的,但也许有人成功地做到了这一点?我知道要设置的对象应该是一个IList,但我似乎做不出来。在IronPython文档中,数组对象用作示例。如果我尝试这样做:vl = IList[ElementId]([v.ViewId for v in views]),我得到一个Systemerror:

代码语言:javascript
复制
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
SystemError: MakeGenericType on non-generic type

这是我的代码:

代码语言:javascript
复制
from System import Guid, Array
from Autodesk.Revit.DB.ExtensibleStorage import *

guid = Guid.NewGuid()
views = revit.uidoc.GetOpenUIViews()
vl = Array[ElementId]([v.ViewId for v in views])

schemaBuilder = SchemaBuilder(guid)
schemaBuilder.SetReadAccessLevel(AccessLevel.Public)
schemaBuilder.SetWriteAccessLevel(AccessLevel.Public)
schemaBuilder.SetSchemaName('Testing')
schemaBuilder.AddArrayField('Views', ElementId)
schema = schemaBuilder.Finish()

entity = Entity(schema)
entity.Set('Views', vl)

这是我的错误消息:

代码语言:javascript
复制
Exception : Autodesk.Revit.Exceptions.InvalidOperationException: Unsupported type: Autodesk.Revit.DB.ElementId[]
   at Autodesk.Revit.DB.ExtensibleStorage.Entity.Set[FieldType](String fieldName, FieldType value, ForgeTypeId unitTypeId)
   at Autodesk.Revit.DB.ExtensibleStorage.Entity.Set[FieldType](String fieldName, FieldType value)

顺便说一句:这个运行得很好:

代码语言:javascript
复制
from System import Guid, Array
from Autodesk.Revit.DB.ExtensibleStorage import *

guid = Guid.NewGuid()
views = revit.uidoc.GetOpenUIViews()
v = views[0].ViewId

schemaBuilder = SchemaBuilder(guid)
schemaBuilder.SetReadAccessLevel(AccessLevel.Public)
schemaBuilder.SetWriteAccessLevel(AccessLevel.Public)
schemaBuilder.SetSchemaName('Testing')
schemaBuilder.AddSimpleField('Views', ElementId)
schema = schemaBuilder.Finish()

entity = Entity(schema)
entity.Set('Views', v)

要获取该值:entity.Get[ElementId]('Views')

EN

回答 2

Stack Overflow用户

发布于 2020-09-13 09:06:45

我想我在c#中的AddArrayField遇到了同样的问题,可能做错了什么,但我的快速解决方案是简单地使用AddMapField。

代码语言:javascript
复制
    FieldBuilder mapField_Child_Angle = mySchemaBuilder.AddMapField("FurnLocations_Angle", typeof(ElementId), typeof(double));
    mapField_Child_Angle.SetUnitType(UnitType.UT_Length);
票数 2
EN

Stack Overflow用户

发布于 2020-09-18 00:27:38

这对我很有效:

代码语言:javascript
复制
from System import Guid
from System.Collections.Generic import IDictionary, Dictionary
from Autodesk.Revit.DB.ExtensibleStorage import *

keyType = str
valueType = str
name = 'UserViews'
schemaBuilder = SchemaBuilder(Guid.NewGuid())
schemaBuilder.SetReadAccessLevel(AccessLevel.Public)
schemaBuilder.SetWriteAccessLevel(AccessLevel.Public)
schemaBuilder.SetSchemaName('Test')
schemaBuilder.AddMapField(name, keyType, valueType)
schema = schemaBuilder.Finish()
ent = Entity(schema)
dic = Dictionary[str, str]()
dic.Add('kyrreViews', '234234,121345,123113')
ent.Set[IDictionary[str, str]](name, dic)
val = ent.Get[IDictionary[str, str]](name)

>>> val
Dictionary[str, str]({'kyrreViews' : '234234,121345,123113'})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63861112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档