Dynamo添加UI不可编辑参数

Hello大家好!我是九哥~

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

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

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

可以看到,他们共有的,一般是参数名称、参数组、参数类型、参数分组方式、实例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或者编程的方式来修改。

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

完整代码如下:

python 复制代码
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application

from System.Collections.Generic import *

clr.AddReference("RevitNodes")
import Revit
clr.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设置下参数值试试,效果如下:

好了,今天的分享就到这里了,小伙伴们快去尝试吧~

相关推荐
火白学安全9 分钟前
《Python红队攻防脚本零基础编写:入门篇(一)》
python·安全·web安全·网络安全·系统安全
梦想的初衷~40 分钟前
Python驱动的无人机多光谱-点云融合技术在生态三维建模与碳储量、生物量、LULC估算中的全流程实战
python·无人机·遥感·多光谱
一晌小贪欢1 小时前
Python爬虫第3课:BeautifulSoup解析HTML与数据提取
爬虫·python·网络爬虫·beautifulsoup·python爬虫·python3·requests
好家伙VCC1 小时前
**发散创新:渗透测试方法的深度探索与实践**随着网络安全形势日益严峻,渗透测试作为评估系统安全的
java·python·安全·web安全·系统安全
机器学习之心1 小时前
一个基于无干扰增量容量(IC)和差分电压(DV)分析的锂离子电池健康状态(SOH)与剩余寿命(RUL)预测的Python实现
python
Bellafu6667 小时前
selenium常用的等待有哪些?
python·selenium·测试工具
小白学大数据8 小时前
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
爬虫·python·ajax
2401_841495649 小时前
【计算机视觉】基于复杂环境下的车牌识别
人工智能·python·算法·计算机视觉·去噪·车牌识别·字符识别
Adorable老犀牛9 小时前
阿里云-ECS实例信息统计并发送统计报告到企业微信
python·阿里云·云计算·企业微信
倔强青铜三10 小时前
苦练Python第66天:文件操作终极武器!shutil模块完全指南
人工智能·python·面试