首页/技术分享

Dynamo运行时添加一个进度条

发布于:2021-06-30 11:45:13
6200人 分享

本文来自“BIM的乐趣”的“九哥BIMer”

你好,我是九哥~

今天呢,我们来玩个不一样的,给我们的Dynamo程序,添加一个进度条,如下图所示:

01.gif

本次教程不详细讲解这个如何实现的了,给大家一个用Python写好的窗体,你只需要在自己的程序里直接调用即可使用,然后我会在接下来的几篇文章中,给大家讲解一下如何在Dynamo中使用WindowsForm绘制窗体。

本次教程,就给大家介绍下,如何将这个进度条加入到自己的程序中,虽然并不是特别准确的显示程序进度,但是也能有个大概提示。

首先,新建一个PythonScript节点,把我提供的代码复制进去作为模块使用。

附件下载:

Dynamo运行时添加一个进度条.zip

文章开始的动图,是通过1到10000的计数,简单实现了一个进度条,代码如下:


#示例代码:

importsys

importclr

importSystem

clr.AddReference('ProtoGeometry')

fromAutodesk.DesignScript.Geometryimport*

 

ProgressBarUtils=IN[0]

pgb=ProgressBarUtils()

lstProcessing=list(range(10000))

out=[]

withpgb.MyProgressBroadcaster(len(lstProcessing),"BIM的乐趣")asbroadcaster:

foriinlstProcessing:

#你自己程序的核心代码

#

#通过EventHook增加进度条

broadcaster.onChange.next_p()

OUT=out


这里的进度条是通过模块里写好的一个计数器实现的,我们直接通过broadcaster.onChange.next_p()方法与你自己的程序挂钩,来增加进度条显示。

接下来我们用一个简单的小例子介绍要具体用法,我们简单创建一系列点,然后在指定点出放置族:

02.gif

如上所示,我们在指定点处放置族,套用了上面的示例代码,融合了在指定点处放置族的代码,可以实现一个简单的带进度条的程序,代码如下:

03.png

import sys

import clr

import System

 

clr.AddReference("RevitServices")

clr.AddReference("RevitNodes")

import RevitServices

from RevitServices.Persistence import DocumentManager

from RevitServices.Transactions import TransactionManager

doc =  DocumentManager.Instance.CurrentDBDocument

 

import Revit

clr.ImportExtensions(Revit.Elements)

clr.ImportExtensions(Revit.GeometryConversion)

 

clr.AddReference("RevitAPI")

from Autodesk.Revit.DB import *

 

famType = UnwrapElement(IN[0])

pts = IN[1]

if not isinstance(pts, list):

  pts = UnwrapElement([pts])

else:

  pts = UnwrapElement(pts)

 

ProgressBarUtils = IN[2]

pgb = ProgressBarUtils()

 

elems = []

elemlist = []

with pgb.MyProgressBroadcaster(len(pts), "种树进度条") as broadcaster:

  TransactionManager.Instance.EnsureInTransaction(doc)

  for pt in pts:

    #你自己的程序操作逻辑

    if famType.IsActive == False:

      famType.Activate()

    elems = doc.Create.NewFamilyInstance(pt.ToRevitType(), famType, Structure.StructuralType.NonStructural)

    elemlist.append(elems.ToDSType(True))

    #通过EventHook增加进度条

    broadcaster.onChange.next_p()

  TransactionManager.Instance.TransactionTaskDone()

 

OUT = elemlist

转载请注明来源本文地址:https://www.tuituisoft/blog/4552.html

上一篇:

Revit应用和删除填充图案

下一篇:

Revit石材幕墙建模解决方案——“材质分割”(一)