pyRevit系列教程1

有没有人和我一样,想要自己写一些小功能来用(zhuang)用(bi),但苦于C#太难学了,不得不作罢。
话说感受过Python的美好,怎么能忍受C#的大括号!毕竟

人生苦短,我用Python!

好吧,我承认是我智商不够才学不好C#的~

那么,问题来了,如果想要强行zhuangbi怎么办?记得以前给大家推荐过一款可以在Revit中使用Python写代码的东西叫RevitPythonShell 今天再推荐一款叫pyRevit的插件。姑娘的室内BIM公众号之前介绍过,并且介绍了pyRevit中的一个小工具的使用:创建填充图案。点我查看!

什么是pyRevit

pyRevit is an IronPython script library for Revit. However, it is not really written as an example library. It is a working set of tools fully written in IronPython that explores the power of scripting for Revit and also adds some cool functionality.

有人会说,上面一串英文是什么鬼,那是pyRevit作者介绍pyRevit的一段,翻译过来大致是说:

pyRevit 是为Revit写的IronPython脚本库。然而它并不仅仅是作为一个示例的库。同时他还包含一系列完全使用IronPython写的工具,使用这些工具可以发掘在Revit中编写脚本的力量,同时pyRevit还添加了一些很酷的功能。

点我查看pyRevit博客
使用它你可以编写自己的小插件并加入到pyRevit中,这样pyRevit会自动为你的工具添加按钮还有图标到Revit工具栏中,像下图这样,当然你得按照pyRevit要求的格式。

pyRevit

pyRevit有youtube频道,作者录了一系列关于pyRevit的使用教程,包含pyRevit中带的所有工具的使用方法,以及其他一些基础知识,正在持续更新中,我之前已经把目前有的所有视频下载下来并共享了,我会持续关注并下载,有兴趣的同学可以进 壹匹BIM 的群下载:580176296


如何使用pyRevit

接下来我会就以下几点来讲解:

  1. 安装,更新,卸载
  2. 自带工具使用
  3. pyRevit工具的组成
  4. 添加自己的工具

1.安装,更新,卸载

安装:

  • 自动安装:

    • 下载安装包(地址
    • 双击安装包pyRevitSetup.exe,程序会自动下载所需文件,并自动添加到Revit中,重启Revit即可看到。
      因为自动安装是在线安装,实际上安装包只是一个下载器,由于众所周知的原因, 下载速度会很慢,只要耐心等待即可
  • 手动安装:

    • 到github下载压缩包(地址)单击右侧中部的绿色按钮Clone or download然后点击Download ZIP将压缩包下载到本地电脑
    • 然后解压进入release文件夹右键install_addin.bat文件以管理员身份运行

    • 还有一种下载的方式,首先下载GitKraken
    • 安装完GitKraken后运行,选择File>Clone Repo在弹出窗口单击右侧Browse按钮选择要克隆的文件夹地址(也就是你要下载存放的文件夹),URL填入https://github.com/eirannejad/pyRevit
    • 单击Clone the repo!
    • 安装同上面方法

更新:

  • 如果安装的时候是自动安装,可再次运行安装文件覆盖安装
  • 手动从GitHub安装的话,到release文件夹下运行upgrade.bat
  • 使用GitKraken下载安装的话,可进入GitKraken软件更新,关于GitKraken如何使用请查看相关文档,在此不表。
  • 在pyRevit中点击Update更新
    update

卸载

  • 像其他软件一样卸载,进入控制面板操作
  • 进入release文件夹下运行uninstall_addin.bat

3.pyRevit工具的组成

一个pyRevit工具的是由Python模块自定义代码组成
Python模块分为普通的IronPython模块和和Revit相关的模块,普通的IronPython模块存放在pylib文件夹内,Revit相关模块存放在pyrevitlib下,比如我之前推荐过的RevirPythonWrapper现在也是pyRevit的内置模块,它也在这个文件夹下。当然你也可以把你想用的模块添加到这两个文件夹下。
自定义代码是指你自己写的python脚本,按照一定格式组织起来的一个文件夹,通过它pyRevit可以自动为你在Revit中生成按钮,点击按钮就会执行你写的代码。


4.添加自己的工具

每个pyRevit小工具是一个固定格式的文件夹,包含.py代码文件和一个icon.png图标文件组成。
你可以通过查看pyRevit自带的工具来学习如何写自己的工具,自带的工具在pyRevit安装路径下的extensions文件夹下,或者你可以通过在Revit中按住shift然后鼠标左键点击任意一个pyRevit中的工具图标,即可打开当前工具的路径。

想要添加自己的工具,分为两步:

  • 建立工具包文件夹,并添加到pyRevit中,尽量放到其他路径而不是放在pyRevit文件夹中。
    • 切换到pyRevit面板下
    • 单击最左侧pyRevit在弹出的面板点击Settings
    • Custom user extension folders下单击Add folder按钮添加路径。
      文件夹
  • 按指定格式组织文件夹及编写脚本。

编写工具

一个工具包的文件夹层级应为下面这样:


文件层级
  • 标签名称.tab,此为标签文件夹,标签名称为Revit中显示的标签名称。此文件夹下可包含多个.panel文件夹。如上图的pyRevit.tab
  • 面板名称.panel,此为面板文件夹,面板名称为下方显示的面板名称。如上图的Drawing Set.panel
  • 工具包名称.工具包类型,此为最后一个层级目录,pyRevit会将此转换为包含一组工具的按钮显示,工具包类型有pulldown.splitbutton.splitpushbutton.splitpushbutton等。如上图的Print.pulldown
  • 工具名称.工具类型,此为工具的核心,即此工具的核心代码所在的文件夹,如上图的Print Linked Sheets.pushbutton

一个命令或者工具所在文件夹是以以下格式命名:命令名称.命令类型
像下面这样:

工具命名

最常见的类型就是.pushbutton

工具包文件夹的组成

工具包文件夹可包含不同类型的工具文件夹,但以下几个是通用的:

  • icon.png,图标文件,显示在Revit中的图标。
  • lib,改包内所有工具可使用的Python模块文件夹,我们之前说过模块可以放到pyRevit中的一些文件夹,这里也可以放到此文件夹中,只需要新建一个lib子文件夹即可。
  • _layout,这是个文本文件,在里面可定义该组工具在Revit中的显示顺序。

下面是一个_layout文件示例:

PushButton A
PushButton B
PullDown A
---
PullDown B
Stack3 A
>>>
PushButton C
PullDown C

其中---表示创建分割线,你也可以使用超过三个的-
>>>表示在次符号后所有的工均隐藏,即点击面板名称右侧下拉小三角才会显示。当然也可以使用超过三个的>

.pushbutton文件夹的组成

Match命令文件夹组成:


MATH组成
  • 每个命令文件夹中必须包含使用Python或者C#编写的脚本或叫代码文件。
    • script.py或者script.cs,这是用Python编写或者C#的脚本,也就是你的工具核心代码,当单击Revit中图标后将会执行此文件中的代码。
    • icon.png,此为图标文件,显示在Revit中,无此文件则不显示图标。
    • config.py,此为设置文件,当按住shift点击按钮后会运行此文件,如果有此文件,则pyRevit会在相应的按钮边显示大黑点,具体可查看pyRevit中带的Match工具。
    • lib,此为Python模块所在的文件夹,只有当前工具可访问。
类型 可包含类型
.tab .panel
.panel 除了.panel.tab
.pulldown 仅工具类型,如.pushbutton
.splitbutton 仅工具类型,如.pushbutton
.splitpushbutton 仅工具类型,如.pushbutton
.stack2 工具、.pulldown,.splitbutton,.splitpushbutton
.stack3 同上

下面是pyRevit的所有文件夹类型:

类型 可包含类型
.tab .panel
.panel 除了.panel.tab
.pulldown 仅工具类型,如.pushbutton
.splitbutton 仅工具类型,如.pushbutton
.splitpushbutton 仅工具类型,如.pushbutton
.stack2 工具、.pulldown,.splitbutton,.splitpushbutton
.stack3 同上

pyRevit中还有一些高级的工具类型:

  1. .smartbutton-它也包含script.py,其中需定义一个固定名称的函数__selfinit__,该函数定义的作用是:在启动的时候,先自动执行此函数,让此按钮进行初始化一些条件(比如根据状态设置图标)__selfinit__函数运行成功必须返回True失败必须返回False,如果返回False或者该函数运行出错,那么pyRevit则不会创建此按钮。
  2. .linkbutton-它可以调用其他插件的功能,需要在script.py定义两个参数:
__assembly__ = '插件名'
__commandclass__ = '该命令的Class名'

比如调用RevitPythonShell的命令:

__assembly__ = 'RevitPythonShell'
__commandclass__ = 'IronPythonConsoleCommand'

编写小工具示例:

下面我们将通过一个简单的小工具来演示如何编写并添加到Revit中。该工具可以复制选择元素的族类型。效果如下图:


  1. 组织好文件夹结构。这里我使用的是.pulldown文件夹结构如下:F:\壹匹BIM工具包\WH.extension\WhiteHorse.tab\管理.panel\族.pulldown,在此文件夹下新建子文件夹复制类型.pushbutton,若想显示图标则需要放入一个icon.png文件,大小建议为32X32
  2. 复制类型.pushbutton内新建一个script.py并放置图标文件,名称为icon.png大小32X32
  3. 编写script.py内的代码,本例的代码如下:
# coding:utf-8

# __doc__的作用是显示工具说明
__doc__ = '复制选定元素的类型'
# __author__是作者
__author__ = '白马'

# 从RevitPythonWrapper导入需要的模块
from rpw import db, revit, ui, DB

# 定义一个函数
def copy(element):
    pre_name = element.Name
    type_id = element.GetTypeId()
    name = ui.forms.TextInput("壹匹BIM", pre_name+'-副本', "请输入名称:")
    with db.Transaction('复制类型') as t:
        DB.ElementType.Duplicate(revit.doc.GetElement(type_id),name)

# 如果在Revit中预先选择了元素则获取选择的元素
element = ui.Selection().elements
# 判断是否选择了元素
if element:
    # 如果选择的元素为一个,则执行复制操作,否则警告
    if len(element) == 1:
        copy(element[0])
    else:
        ui.forms.Alert("只可选择一个元素","警告")
else:# 如果没选择元素则让用户选择
    picker = ui.Pick()
    try:
        ui.forms.Alert("接下来请选择元素","提示")
        element = picker.pick_element("选择要复制类型的元素").get_element()
        copy(element)
    except:# 如果用户未选择元素则弹窗警告
        ui.forms.Alert("未选择元素","警告")

还差最后一步,到pyRevit中点击左侧的Reload按钮,然后就会在Revit中看到你的工具了,是不是很简单。
-----END-----

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,028评论 25 707
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,245评论 9 467
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,389评论 0 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • (献给四月的最后一个夜晚) 清风4/30 谁的歌声如燕翩飞 在初夏的枝桠 和月光的清辉之间 行走千年 谁在月色里编...
    田园清风阅读 208评论 0 0