土木在线论坛 \ BIM技术 \ BIM专业软件 \ Dynamo添加UI不可编辑参数

Dynamo添加UI不可编辑参数

发布于:2023-05-10 09:39:10 来自:BIM技术/BIM专业软件 [复制转发]


        最近有小伙伴咨询,如何在添加参数以后,用户只能看不能编辑?

        这块吧,说起来难,实际上呢也可能不难,为啥呢,因为添加共享参数的节点很多,我们只需要找一个合适的,改改代码就成,这样就很简单了。

        首先,我们常见的添加共享参数的节点,长的都差不多:

         可以看到,他们共有的,一般是参数名称、参数组、参数类型、参数分组方式、实例or类型、族类别等等,其中也会有一些不一样的输入端,这是为什么呢?

        这里,用到的第一个API知识是ExternalDefinitionCreationOptions,一个用于创建新的共享参数的定义选项,包括名称、类型、可见性、GUID和是否可修改等,如下图:

        其中UserModifiable属性,就是用来标识参数是否可以在UI中编辑的。

         可以看到,这个是可get可set的属性,我们直接设置即可。

         基于此呢,我们可以自己写一个函数,或者改改别人的节点,如下:










#参数创建选项def GetCreationOptions(Name,Type,visible,userModifiable): #名称和类型 options = ExternalDefinitionCreationOptions(Name, Type) #False为只读 options.UserModifiable = userModifiable #True为课件 options.Visible = visible return options

        修改后,我们就可以创建一个共享参数试下,可以看到,这个参数被灰置了,用户在Revit中是不能直接编辑的。如果想要修改参数值,需要通过Dynamo或者编程的方式来修改。

         创建共享参数的节点,逻辑比较复杂,我这里就不详细讲了,小伙伴们可以自己尝试下,这里我就附上完整截图和修改后的代码,供小伙伴们测试。

        完整代码如下:





































































































































import clrclr.AddReference('ProtoGeometry')from Autodesk.DesignScript.Geometry import *
clr.AddReference("RevitServices")import RevitServicesfrom RevitServices.Persistence import DocumentManagerfrom RevitServices.Transactions import TransactionManager
clr.AddReference("RevitAPI")import Autodeskfrom Autodesk.Revit.DB import *
doc = DocumentManager.Instance.CurrentDBDocumentuiapp = DocumentManager.Instance.CurrentUIApplicationapp = uiapp.Application
from System.Collections.Generic import *
clr.AddReference("RevitNodes")import Revitclr.ImportExtensions(Revit.Elements)import System
_paramName = IN[0]_groupName = IN[1]_paramType = IN[2]_visible = IN[3]_category = IN[4]_paramGroup = IN[5]_instance = IN[6]_userModifiable = IN[7]
#参数创建选项def GetCreationOptions(Name,Type,visible,userModifiable): #名称和类型 options = ExternalDefinitionCreationOptions(Name, Type) #False为只读 options.UserModifiable = userModifiable #True为课件 options.Visible = visible return options
#ParTypes转换ParTypes = System.Enum.GetValues(ParameterType)for i in ParTypes: if str(i) == str(_paramType): _paramType = i break
#Group转换groups = System.Enum.GetValues(BuiltInParameterGroup)groupsname = list()for b in groups: if str(b) == str(_paramGroup): _paramGroup = b break

def ParamBindingExists(_doc, _paramName, _paramType): map = doc.ParameterBindings iterator = map.ForwardIterator() iterator.Reset() while iterator.MoveNext(): if iterator.Key != None and iterator.Key.Name == _paramName and iterator.Key.ParameterType == _paramType: paramExists = True break else: paramExists = False return paramExists
def RemoveParamBinding(_doc, _paramName, _paramType): map = doc.ParameterBindings iterator = map.ForwardIterator() iterator.Reset() while iterator.MoveNext(): if iterator.Key != None and iterator.Key.Name == _paramName and iterator.Key.ParameterType == _paramType: definition = iterator.Key break message = None if definition != None: map.Remove(definition) message = "成功" return message
def addParam(doc, _paramName, _visible, _instance, _groupName, _paramGroup): message = None if ParamBindingExists(doc, _paramName, _paramType): if not RemoveParamBinding(doc, _paramName, _paramType) == "成功": message = "参数绑定未成功移除" else: message = None group = file.Groups.get_Item(_groupName) if group == None: group = file.Groups.Create(_groupName) if group.Definitions.Contains(group.Definitions.Item[_paramName]): _def = group.Definitions.Item[_paramName] else: _def = group.Definitions.Create(GetCreationOptions(_paramName, _paramType,_visible,_userModifiable)) param = doc.ParameterBindings.Insert(_def, bind, _paramGroup) return message
TransactionManager.Instance.EnsureInTransaction(doc)
try: file = app.OpenSharedParameterFile()except: message = "没有找到共享参数文件" pass
builtInCategory = System.Enum.ToObject(BuiltInCategory, _category.Id)cats = app.Create.NewCategorySet()cats.Insert(doc.Settings.Categories.get_Item(builtInCategory))if _instance: bind = app.Create.NewInstanceBinding(cats)else: bind = app.Create.NewTypeBinding(cats)
if isinstance(_paramName, list): for i, j, k in zip(_paramName, _visible, _instance): message = addParam(doc, i, j, k, _groupName, _paramGroup)else: message = addParam(doc, _paramName, _visible, _instance, _groupName, _paramGroup)
TransactionManager.Instance.TransactionTaskDone()
if message == None: OUT = "成功"else: OUT = message

        最后呢,我们可以再用Dynamo设置下参数值试试,效果如下:

全部回复(0 )

只看楼主 我来说两句抢沙发
这个家伙什么也没有留下。。。

BIM专业软件

返回版块

9072 条内容 · 253 人订阅

猜你喜欢

阅读下一篇

Revit楼板:建筑楼板和结构楼板区别和垫层生成

  一、Revit中建筑楼板和结构楼板的区别   Revit中,在我们做项目时楼板是最常见的结构之一,几乎每次都需要使用它。分为建筑楼板和结构楼板,是不是有很多小伙伴就很好奇,为什么分为两种楼板,那么他们是什么时候使用的呢?之间又有何区别?   第一个区别:创建结构楼板会添加跨方向符号,为什么要添加跨方向符号呢?因为我们在结构楼板中创建钢筋保护层时要添加跨方向符号。   第二个区别:属性的不同

回帖成功

经验值 +10