python和revit_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

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

安装,更新,卸载

自带工具使用

pyRevit工具的组成

添加自己的工具

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中还有一些高级的工具类型:

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

.linkbutton-它可以调用其他插件的功能,需要在script.py定义两个参数:

__assembly__ = '插件名'

__commandclass__ = '该命令的Class名'

比如调用RevitPythonShell的命令:

__assembly__ = 'RevitPythonShell'

__commandclass__ = 'IronPythonConsoleCommand'

编写小工具示例:

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

组织好文件夹结构。这里我使用的是.pulldown文件夹结构如下:F:\壹匹BIM工具包\WH.extension\WhiteHorse.tab\管理.panel\族.pulldown,在此文件夹下新建子文件夹复制类型.pushbutton,若想显示图标则需要放入一个icon.png文件,大小建议为32X32

复制类型.pushbutton内新建一个script.py并放置图标文件,名称为icon.png大小32X32

编写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-----

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode】104. Maximum Depth of Binary Tree

1. 题目 Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 2. 思路 递归到左、右子树的max值,1. 3. 代码 /*** Definition for a binary tree …

JS_14 执行上下文与执行上下文栈

执行上下文和执行上下文栈 变量提升和函数提升 变量提升 所用使用var定义的变量,在程序运行前会被先定义,并赋初值为underfind,保存到其执行上下文中 函数提升 在调用函数,执行函数体之前,会先执行函数定义&#xff…

shell编程-变量

1.Bash用户自定义变量 【局部变量】 【按数据存储分类】:整型、浮点型、字符串型、日期型 【变量定义】:x5,y6,z$x$y56,m$(($x$y))11 【Bash变量默认都为字符串型,等号左右不可以有空格】 【变量叠加】:x"$x"123,x${x}3…

JS_15作用域与作用域链

作用域与作用域链 作用域 类别 全局作用域函数作用域块作用域:Es6时出现,之前没有 作用域与执行上下文 区别 创建时机不同 全局作用域外,每个函数都有自己的作用域,作用域在函数创建时就创建了,而不是在调用时全局执…

多线程调用同一个对象的方法_多线程之如何创建和使用线程

一、创建线程和使用线程方式1.1 继承Thread让线程类继承自Thread类,然后重写run(),把需要多线程调用的代码放到run()中。但是需要开启线程的时候不能调用run方法,而是需要调用start()方法。/*** 本类用于演示第一种实现多线程的方式*/ class…

struts2的namespace的问题

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <inc…

JS_16闭包

闭包 什么是闭包 理解1&#xff1a;闭包是嵌套的内部函数理解2&#xff1a;闭包是包含被引用变量&#xff08;函数&#xff09;的对象 闭包产生的条件 函数嵌套子函数调用了父函数的数据父函数被调用了&#xff08;子函数不一定需要被调用&#xff0c;只需要执行函数定义即可&…

[Intel Edison开发板] 02、Edison开发板入门

一、前言 Start from the link: 开始学习的链接 上面链接是官网的教程&#xff0c;按照教程可以开发板入门&#xff1a; 其中第一步是了解开发板&#xff0c;涉及到如何组装、如何连线、一些主要的接口简单介绍等信息&#xff1b;第二步主要是介绍如何用官方提供的工具进行配置…

python apscheduler一次只有一个job_Python使用APScheduler实现定时任务过程解析

前言APScheduler是基于Quartz的一个Python定时任务框架。提供了基于日期、固定时间间隔以及crontab类型的任务&#xff0c;并且可以持久化任务。一、安装APSchedulerpip install apscheduler二、基本概念APScheduler有四大组件&#xff1a;1、触发器 triggers &#xff1a;触发…

java web service简单示例

http://www.iteye.com/topic/1135747 转载于:https://www.cnblogs.com/fycct/p/5669420.html

shell统计指定目录下所有文件类型及数量

#!/bin/bash#Synopsis:用于统计脚本当前所在目录或者用户指定目录下的所有文件类型及数量#若直接运行脚本而不接任何命令行参数,则默认会统计脚本所在目录下的文件#Date:2016/10#Author:Jian#Usage:sh fileStat.sh /path1 /path2testFile$(mktemp /tmp/testfile.XXX)#如果没有指…

python cross val score_sklearn函数:cross_val_score(交叉验证评分)

sklearn.model_selection.cross_val_score(estimator,X,yNone,*,groupsNone,scoringNone,cvNone,n_jobsNone,verbose0,fit_paramsNone,pre_dispatch2*n_jobs,error_scorenan)前面我们提到了4种分割数据集的方法&#xff0c;在分割完数据集后&#xff0c;我们训练模型&#xff0…

JS_17 ES5,ES6

ES5 严格模式 定义方法 use strict特性&#xff1a; 必须使用var定义变量存在eval作用域禁止自定义函数中的this指向window对象不能有重名属性 JSON对象 json.stringify(obj/arr):js对象转换为json对象json.parse(str):json对象转换为js对象 Object拓展 Object.create(p…

几种纯css布局的导航栏

1.垂直导航栏 页面效果 <ul class"nav"><li><a href"home.htm">Home</a></li><li><a href"about.htm">About</a></li><li><a href"services.htm">Services</a&…

python中函数的参数传递(传值还是传引用)

函数的参数传递 函数参数传递有两种方式&#xff0c;传值和传引用&#xff0c;传值只是把变量的值复制一份给了实参&#xff0c;函数内部的操作不会改变函数外部变量的值&#xff0c;而传引用传递的是外部变量的地址&#xff0c;函数内部直接操作函数外部变量的储存空间&#…

poi获取有效单元格个数_EXCEL利用SUM函数和FREQUENCY函数数组公式统计不同区间数据个数...

EXCEL函数公式大全之利用FREQUENCY函数数组公式统计不同区间数据个数。EXCEL函数与公式在工作中使用非常的频繁&#xff0c;会不会使用公式直接决定了我们的工作效率&#xff0c;今天我们来学习一下提高我们工作效率的函数FREQUENCY函数和数组公式。今天我们的例子是统计学生在…

windows安装rsync

客户端&#xff1a;cwRsync 4.0.5 Installer服务端&#xff1a;cwRsyncServer 4.0.5 Installer 安装配置Rsync服务端 1.直接双击安装包安装即可&#xff0c;在安装过程中会有要求用户输入账户密码或者使用默认。此账户是rsync服务运行的用户。 2.安装完成之后&#xff0c;进入程…

洛谷 P2735 电网 Electric Fences Label:计算几何--皮克定理

题目描述 在本题中&#xff0c;格点是指横纵坐标皆为整数的点。 为了圈养他的牛&#xff0c;农夫约翰&#xff08;Farmer John)建造了一个三角形的电网。他从原点&#xff08;0,0&#xff09;牵出一根通电的电线&#xff0c;连接格点(n,m)&#xff08;0<n<32000,0<m&l…

Python元类(type()和metaclass)

1. 元类是什么 众所周知&#xff0c;对象由类实例化而来&#xff0c;类是对象的模板&#xff0c;而python一切皆对象&#xff0c;类也是对象&#xff0c;它由元类&#xff08;type&#xff09;创建&#xff0c;所以元类是类的类&#xff0c;是类的模板 2. 创建类的另一种方法…

word文档打印 自动编码_办公室文件打印有哪些技巧 办公室文件打印技巧介绍【图文】...

办公室文件打印实用技巧三则一. 打印文件直接装订——逆序打印相信使用Word打印过长篇文档的朋友一定都清楚&#xff0c;打印完成后的装订一直是个麻烦事儿&#xff0c;因为文件由打印机打出时&#xff0c;第一页肯定会在最下面&#xff0c;装订之前总要费时费力的把纸张按顺序…