Dynamo设置明细表字段格式——保留小数位数
含蓄的显示器
2023年01月29日 09:30:27
只看楼主

        今天简单分享一个API的用法,就是设置明细表的中字段的字段格式。         本次呢,主要介绍下如何通过Dynamo设置长度、面积等几种字段的格式,设置小数位数的显示,如下图:


        今天简单分享一个API的用法,就是设置明细表的中字段的字段格式。

        本次呢,主要介绍下如何通过Dynamo设置长度、面积等几种字段的格式,设置小数位数的显示,如下图:

        当然了,Revit本身支持直接插入文件中的明细表,当作样板传递也很方便,不过呢,我硬是给自己加了个需求,就是自动创建明细表,然后把格式都设置好了,记得之前在有劳里介绍过如何设置字段计算总数。

 

        好了,回归正题,我们本次设置的是明细表中格式选项卡下的字段格式,只有能设置的字段,选中后,该按钮才会亮显,当然这些不是我们本次的关注点,本次只是选择一个字段后,来进行设置。

         常规情况下,我们点开一个字段的条件格式后,会看到勾选着“使用项目设置”选项,这个时候呢,我们是改不了小数位数的选项的,所以这个就是我们第一步要处理的。

        接下来我们要开始翻阅API手册,第一个要知道的是如何找到明细表,在Revit中,明细表也是作为视图存在的,所以需要所有“ViewSchedule”才能找到明细表视图,如下图:

        然后翻到属性位置,找到“ViewSchedule.Definition” ,这个主要是明细表中字段的定义:

        进入“ScheduleDefinition”类下面,能看到详细介绍:

        为了找到每个字段的ID,我们可以在 “ScheduleDefinition”类下面找到“GetFieldId”方法,通过此方法,我们可以写个自定义函数,拿到每个字段的ID。










#读取明细表字段definit = schedules.Definition#获取字段的总数countParameters = definit.GetFieldCount()#遍历输入的名称列表for i in range(countParameters):    #遍历每一个字段 field = definit.GetField(i) Parname = field.ColumnHeading # 明细表的列表头

        如此这般之后,我们就能根据我们输入的明细表和字段名称,拿到字段的ID了,之后就可以进入本次文章的正题了,设置字段格式。

        继续搜索“ScheduleField”,查看其属性和方法,有很多都是本次要用到的,其中,最主要的就是“SetFormatOptions”,用来设置字段的格式:

        接下来要做的,就都是围绕“FormatOptions”来的,我接着点进去,就能看到:

        注意看下面的备注,“UseDefault”属性,就是我最上面截图所说的“使用项目设置”,如果为True就是启用,如果为False就是可以自定义。

        那么接下来,我们首先就是要构造一个“FormatOptions”函数,然后先将“UseDefault”属性设置为False。





#新建一个格式选项formatOpts = FormatOptions()#不适用默认设置formatOpts.UseDefault = False


        然后呢,就是要设置“单位”,这里比较麻烦,不同的字段格式,这里要设置的单位是不一样的,比如我要设置是个长度的字段,那么单位里需要选择长度单位,如下图:

        如果是面积,如下图:

        我就不一一举例了,小伙伴们可以依次点开看看,我们先以长度为例,那么我们需要先判断字段的单位是什么?需要获取下“UnitType”属性,如果为“UT_Length”,就是我们要的长度。如果为“UT_Number”(这里我是添加的共享参数:面积格式),就是我们要的面积。

        如果确定是长度参数了,我们就可以设置要显示的单位格式了,例如我需要长度单位是毫米,就可以重新设置下:


formatOpts.DisplayUnits = DisplayUnitType.DUT_MILLIMETERS

        具体单位类型,可以再查阅下“DisplayUnitType”枚举有哪些。 其他单位格式类似。

         最后,就是设置你需要的小数位数了,比较简单,就是一个double值,直接赋予即可:


formatOpts.Accuracy = 0.1

        FormatOptions配置好以后,最后赋予给字段即可:


field.SetFormatOptions(formatOpts)

        最后附上以长度格式的字段为例的完整代码,其他格式的通过if判断下,单独处理即可,就不再赘述了。

















































# Copyright(c) 2023, 九哥BIMerimport clrclr.AddReference("RevitAPI")import Autodeskfrom Autodesk.Revit.DB import *
clr.AddReference("RevitNodes")import Revitclr.ImportExtensions(Revit.Elements)from Revit.Elements import *clr.ImportExtensions(Revit.GeometryConversion)clr.ImportExtensions(Revit.GeometryReferences)
clr.AddReference("RevitServices")import RevitServicesfrom RevitServices.Persistence import DocumentManagerfrom RevitServices.Transactions import TransactionManager
def tolist(x): if hasattr(x,'__iter__'): return x else : return [x]
doc = DocumentManager.Instance.CurrentDBDocumentuidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocumentuiapp = DocumentManager.Instance.CurrentUIApplicationapp = uiapp.Applicationview = doc.ActiveView  schedules = UnwrapElement(IN[0])name = tolist(IN[1])
TransactionManager.Instance.EnsureInTransaction(doc)for colName in name: definit = schedules.Definition  countParameters = definit.GetFieldCount()    for i in range(countParameters): field = definit.GetField(i) Parname = field.ColumnHeading if Parname == colName: if field.UnitType == UnitType.UT_Length: formatOpts = FormatOptions() formatOpts.UseDefault = False formatOpts.DisplayUnits = DisplayUnitType.DUT_MILLIMETERS formatOpts.Accuracy = 0.1        field.SetFormatOptions(formatOpts)TransactionManager.Instance.TransactionTaskDone()
OUT = schedules

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

如果你有好的想法和建议,欢迎分享哦~





 

免费打赏

相关推荐

APP内打开