Rhino.Inside.Revit Python脚本实战:从入门到精通

## 1. 环境搭建与第一个Python脚本 如果你是一名建筑师或BIM工程师,每天在Revit里处理复杂的几何形体,同时又羡慕Rhino和Grasshopper在自由造型与参数化设计上的灵活性,那么**Rhino.Inside.Revit**(简称RIR)对你来说,绝对是一个“神器”。它不是什么遥不可及的黑科技,简单说,就是让Rhino 7和它的好搭档Grasshopper,直接“住”进Revit软件里面。从此,你可以在Revit里无缝使用Rhino的建模工具和Grasshopper的视觉化编程,而Python脚本,就是打通这两个世界、实现自动化操作的“万能钥匙”。 我自己刚开始用的时候,也觉得这组合有点复杂,但实际踩过坑后发现,只要环境搭对了,后面就是一马平川。首先,你得确保电脑上已经安装了**Rhino 7**(WIP版或正式版都行)和**Revit 2018-2024**之间的任何一个版本。然后去McNeel官网下载Rhino.Inside.Revit的安装程序。安装过程基本就是一路“下一步”,完成后重启Revit,你会在“附加模块”选项卡里看到一个犀牛图标,点击它,Revit就会开始加载整个Rhino环境。第一次加载可能会花上一两分钟,耐心等一下,等Rhino和Grasshopper的工具栏出现在Revit界面里,就说明成功了。 环境好了,我们来写第一个能同时“指挥”Rhino和Revit的Python脚本。打开Revit,启动Grasshopper,从“Maths”选项卡里拖一个**Python Script**组件到画布上。双击组件打开编辑器,你会看到一段默认的脚本。先别管它,我们全部替换掉。一个能在RIR环境下工作的标准脚本模板,开头必须导入几个关键的库,这是和纯Rhino脚本最大的区别。 ```python # 1. 导入CLR,这是IronPython调用.NET库的桥梁 import clr # 2. 添加必要的.NET程序集引用 clr.AddReference('System.Core') clr.AddReference('RhinoInside.Revit') # RIR的核心API clr.AddReference('RevitAPI') # Revit API clr.AddReference('RevitAPIUI') # 3. 从这些程序集里导入我们需要的命名空间 from System import Enum, Action import rhinoscriptsyntax as rs # Rhino传统脚本语法,操作简单 import Rhino.Geometry as rg # RhinoCommon几何库,功能强大 import Grasshopper from RhinoInside.Revit import Revit, Convert from Autodesk.Revit import DB # Revit数据库操作的核心 # 4. 导入几何转换的扩展方法,这是数据互通的关键! # 有了它,Rhino的物体可以直接调用.ToXXX()方法变成Revit物体,反之亦然。 clr.ImportExtensions(Convert.Geometry) # 5. 获取当前活动的Revit文档,后续所有操作都基于它 doc = Revit.ActiveDBDocument ``` 把上面这段代码粘贴进去,点击“OK”关闭编辑器。虽然现在组件没有任何输入输出,也没干具体的事,但它的“内力”已经具备了。你可以在脚本最后加一句 `print("Hello RIR!")`,然后在Grasshopper里连接一个`Panel`组件到Python脚本的某个输出端,运行后看到打印信息,就证明你的Python脚本已经成功在Revit内部运行起来了。这个模板我建议你直接保存为一个**用户对象**(User Object)。具体操作是:在Grasshopper画布上右键点击这个Python组件,选择“Create User Object…”,给它起个名字比如“RIR_Python_Template”,保存。以后每次需要写新脚本时,直接从用户对象库里拖这个模板出来,省去了每次重复打那十几行导入语句的麻烦,效率提升非常明显。 ## 2. 核心概念:几何与数据的双向转换 在RIR的Python脚本里干活,最核心、也最让人兴奋的一点,就是**几何与数据的双向无缝转换**。你不再需要先把Rhino模型导出为SAT或DWG,再吭哧吭哧地链接或导入到Revit里,还要担心精度丢失或图层混乱。现在,一切都在内存中实时完成。理解这一点,是玩转RIR脚本的关键。 **从Revit到Rhino**:想象一下,你已经在Revit里建好了一个复杂的幕墙系统,现在想在Grasshopper里对其嵌板进行日照或风压的分析。传统流程非常繁琐,而在RIR里,只需要几行Python代码。首先,我们可以通过Revit API的`FilteredElementCollector`收集到所有的幕墙嵌板元素,然后利用RIR提供的转换器,将Revit的`Element`几何体转换为Rhino能识别的`Brep`(边界表示)或`Mesh`。 ```python # 假设输入参数“wall”是一个从Revit通过“Graphical Element”参数拾取到的墙体 import clr clr.AddReference("RhinoInside.Revit") from RhinoInside.Revit import Convert from Autodesk.Revit import DB # 获取墙体的几何图形。DB.Options()用于设置几何提取的细节级别 geo_options = DB.Options() geometry_element = wall.Geometry[geo_options] # 转换几何体:遍历所有几何实例,并将其转换为Rhino的Brep rhino_breps = [] for geo_obj in geometry_element: # 使用RIR的转换扩展方法,将Revit几何体转为Rhino Brep if hasattr(geo_obj, 'ToBrep'): rhino_brep = geo_obj.ToBrep() if rhino_brep: rhino_breps.append(rhino_brep) # 将rhino_breps列表输出,即可在Grasshopper和Rhino视窗中预览 a = rhino_breps ``` 这段代码的精髓在于 `geo_obj.ToBrep()` 这一行。`ToBrep()` 这个魔法般的方法,正是由我们之前导入的 `clr.ImportExtensions(Convert.Geometry)` 所赋予的。它属于**扩展方法**,直接“贴”在了Revit的几何对象上,让转换变得像调用原生方法一样自然。 **从Rhino到Revit**:反过来,你在Grasshopper中生成或计算出来的炫酷形体,如何一键变成Revit里的原生构件呢?最常用的方法是创建 **`DirectShape`** 元素。`DirectShape` 是Revit API中一个非常灵活的元素类型,它可以容纳任何类型的几何形体,并赋予其一个Revit类别(Category),比如“常规模型”、“家具”等,从而纳入BIM管理体系。 ```python # 假设输入参数“rhino_brep”是一个在Grasshopper中生成的Rhino Brep import clr clr.AddReference("RhinoInside.Revit") from RhinoInside.Revit import Revit, Convert from Autodesk.Revit import DB doc = Revit.ActiveDBDocument def create_directshape(revit_doc, geometry, category_name="OST_GenericModel"): """将Rhino几何体在Revit中创建为DirectShape""" # 1. 找到目标类别 category_id = DB.ElementId(DB.BuiltInCategory.OST_GenericModel) # 你可以通过名称查找自定义类别 # for cat in revit_doc.Settings.Categories: # if cat.Name == category_name: # category_id = cat.Id # 2. 创建DirectShape元素 direct_shape = DB.DirectShape.CreateElement(revit_doc, category_id) # 3. 为DirectShape设置形状。注意:需要将Rhino几何体转换为Revit的几何体列表 # 使用 .ToSolid() 或 .ToCurve() 等扩展方法进行转换 revit_geoms = [] # 假设我们的geometry是单个Brep if geometry: # 将Rhino Brep转换为Revit Solid revit_solid = geometry.ToSolid() if revit_solid: revit_geoms.append(revit_solid) if revit_geoms: direct_shape.AppendShape(revit_geoms) direct_shape.Name = "从Grasshopper创建的形体" return direct_shape # 调用函数,并准备在事务中执行 if rhino_brep: # 对Revit文档的修改必须在事务(Transaction)内进行 with DB.Transaction(doc, "创建DirectShape") as t: t.Start() new_element = create_directshape(doc, rhino_brep) t.Commit() # 将新创建的元素输出,可供后续组件使用 a = new_element ``` 这里引入了RIR脚本中另一个至关重要的概念:**事务(Transaction)**。Revit是一个严格的数据库管理系统,任何对模型数据的修改(创建、删除、修改元素)都必须包裹在一个事务中。这就像数据库的“保存点”,要么全部成功,要么全部回滚,保证了模型的完整性。上面代码中的 `with DB.Transaction(...) as t:` 是一种非常Pythonic且安全的事务写法,确保即使脚本中间出错,事务也会被正确回滚,不会让模型停留在损坏的中间状态。 ### 2.1 单位与坐标系统的隐式处理 还有一个让新手容易困惑,但RIR已经默默帮你处理好的问题:**单位**。Rhino默认使用毫米、厘米、米等公制单位,而Revit的项目单位设置则五花八门。在数据转换时,你不需要手动进行单位换算。RIR的几何转换器在背后会自动根据当前Revit项目的单位设置,对Rhino几何体的坐标和尺寸进行缩放,确保一个在Rhino中边长为1000的立方体,导入Revit后,在项目单位设置为毫米时,它依然是1000毫米的立方体。这种隐式的单位协调,极大地减少了出错的可能,让你可以更专注于设计逻辑本身。 ## 3. 实战案例:自动化创建参数化幕墙嵌板 光说不练假把式,我们来看一个结合了数据获取、几何处理和创建元素的综合案例:**根据日照分析结果,自动化生成具有不同旋转角度的幕墙遮阳板**。这个案例模拟了一个真实的工作流:从Revit获取幕墙网格,在Grasshopper中进行基于向量(模拟日照方向)的计算,最后将生成的新构件写回Revit。 **第一步:获取Revit幕墙数据**。我们在Revit里先有一面普通的幕墙。在Grasshopper中,使用 `Revit > Select > Element` 组件手动拾取这面幕墙,并连接到Python脚本的输入端 `revit_wall`。 **第二步:在Python脚本中解析幕墙网格**。我们需要获取这面幕墙上所有的网格线,以及每个网格单元的中心点。 ```python import clr clr.AddReference("System.Core") clr.AddReference("RhinoInside.Revit") clr.AddReference("RevitAPI") clr.AddReference("RevitAPIUI") from System import Enum import Rhino.Geometry as rg from RhinoInside.Revit import Revit, Convert from Autodesk.Revit import DB clr.ImportExtensions(Convert.Geometry) doc = Revit.ActiveDBDocument # 输入:revit_wall (一个Revit幕墙元素), sun_vector (一个Rhino向量,表示日照方向) if revit_wall and sun_vector: # 获取幕墙的网格系统 grid_system = revit_wall.CurtainGrid if not grid_system: ghenv.Component.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "所选元素不是幕墙或没有网格。") panel_points = [] panel_normals = [] else: panel_points = [] # 用于存储每个嵌板中心点(Rhino点) panel_normals = [] # 用于存储每个嵌板基于日照计算出的法线方向(Rhino向量) # 获取所有嵌板 panels = grid_system.GetPanelIds() for panel_id in panels: panel = doc.GetElement(panel_id) if panel: # 获取嵌板的几何边界框,以找到中心点 bbox = panel.get_BoundingBox(None) if bbox: center = (bbox.Max + bbox.Min) * 0.5 # 将Revit的XYZ点转换为Rhino的Point3d rhino_center = center.ToPoint3d() panel_points.append(rhino_center) # 简化逻辑:根据嵌板中心点到幕墙原点的向量与日照向量的叉积,计算一个旋转轴 # 实际项目中,这里可以接入更复杂的日照分析引擎结果 # 假设幕墙平面法线为Z轴(简化) base_normal = rg.Vector3d.ZAxis # 计算一个与日照方向相关的旋转轴(垂直于日照方向和基法线) rotation_axis = rg.Vector3d.CrossProduct(base_normal, sun_vector) rotation_axis.Unitize() # 根据日照向量与基法线的夹角,计算一个旋转角度(这里简化计算) import math dot = rg.Vector3d.Multiply(base_normal, sun_vector) angle = math.acos(min(max(dot, -1.0), 1.0)) * 0.5 # 取一半角度作为示例 # 旋转基法线,得到新的面板方向 rotated_normal = base_normal rotated_normal.Rotate(angle, rotation_axis) panel_normals.append(rotated_normal) # 输出:嵌板中心点和计算出的法线方向 a = panel_points b = panel_normals else: a = [] b = [] ``` **第三步:根据计算出的位置和方向,生成遮阳板几何体**。上一步输出了每个嵌板中心点和一个目标法线向量。我们可以在Grasshopper下游用另一个Python脚本,在每个点创建一个小型实体(比如一个倾斜的box),作为遮阳板。 ```python import clr import Rhino.Geometry as rg # 输入:panel_points (点列表), panel_normals (向量列表), panel_size (数值) if panel_points and panel_normals and len(panel_points) == len(panel_normals): shade_breps = [] size = panel_size for pt, normal in zip(panel_points, panel_normals): # 1. 创建一个小立方体,中心在原点 plane = rg.Plane(rg.Point3d.Origin, normal) # 让平面的X轴朝上(与世界Z轴叉乘得到),确保立方体不倾斜 x_axis = rg.Vector3d.CrossProduct(plane.ZAxis, rg.Vector3d.ZAxis) if x_axis.Length > 0.001: plane.XAxis = x_axis plane.YAxis = rg.Vector3d.CrossProduct(plane.ZAxis, plane.XAxis) else: # 如果法线几乎垂直,使用世界XY平面 plane = rg.Plane(rg.Point3d.Origin, rg.Vector3d.XAxis, rg.Vector3d.YAxis) # 2. 根据尺寸创建长方体 box = rg.Box(plane, rg.Interval(-size/2, size/2), rg.Interval(-size/2, size/2), rg.Interval(0, size*0.2)) brep = rg.Brep.CreateFromBox(box) if brep: # 3. 将立方体移动到嵌板中心点 transform = rg.Transform.Translation(pt.X, pt.Y, pt.Z) brep.Transform(transform) shade_breps.append(brep) # 输出生成的遮阳板几何体 a = shade_breps else: a = [] ``` **第四步:将生成的遮阳板几何体批量创建为Revit的“常规模型”**。这里我们使用前面提到的`DirectShape`方法,但这次要处理批量创建。为了提高效率,我们可以将所有几何体放在一个事务中创建。 ```python import clr clr.AddReference("System.Core") clr.AddReference("RhinoInside.Revit") clr.AddReference("RevitAPI") clr.AddReference("RevitAPIUI") from System.Collections.Generic import List from RhinoInside.Revit import Revit, Convert from Autodesk.Revit import DB clr.ImportExtensions(Convert.Geometry) doc = Revit.ActiveDBDocument new_elements = [] if shade_breps: with DB.Transaction(doc, "批量创建遮阳板DirectShape") as t: t.Start() try: category_id = DB.ElementId(DB.BuiltInCategory.OST_GenericModel) for i, brep in enumerate(shade_breps): # 将Rhino Brep转换为Revit Solid revit_solid = brep.ToSolid() if revit_solid: # 创建DirectShape ds = DB.DirectShape.CreateElement(doc, category_id) ds.AppendShape([revit_solid]) ds.Name = f"参数化遮阳板_{i+1:03d}" new_elements.append(ds) t.Commit() print(f"成功创建 {len(new_elements)} 个遮阳板。") except Exception as e: t.RollBack() ghenv.Component.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, f"创建失败: {e}") # 输出新创建的元素列表 a = new_elements else: a = [] ``` 通过这个案例,你可以看到,一个完整的自动化流程被拆解成几个逻辑清晰的Python脚本组件,通过Grasshopper的导线连接起来。每个组件各司其职,代码易于理解和维护。你可以随时调整日照向量的输入,或者改变遮阳板的生成规则,整个模型和Revit构件都会实时联动更新。这种动态、可探索的设计流程,正是参数化设计与BIM结合的魅力所在。 ## 4. 高级技巧:在代码中调用Grasshopper组件与错误处理 当你越来越熟练后,可能会发现有些逻辑用纯Python写起来很复杂,但Grasshopper里恰好有一个现成的组件能完美解决。难道要放弃Python吗?当然不!RIR提供了一个名为 **“Node In Code”** 的强大功能,允许你在Python脚本内部,像调用函数一样直接调用Grasshopper画布上的任何组件。这相当于你拥有了一个由无数个现成函数组成的超级武器库。 比如,你想在脚本里给创建的元素赋予一个复杂的材质,这个材质有名称、颜色、透明度、纹理等多个参数。自己用Revit API写可能要几十行代码。但如果Grasshopper里有一个 `RhinoInside_AddMaterial` 组件,你可以这样用: ```python import clr clr.AddReference("RhinoInside.Revit") from Rhino.NodeInCode import Components import System # 1. 通过组件名称查找组件 add_material_comp = Components.FindComponent("RhinoInside_AddMaterial") if add_material_comp is None: ghenv.Component.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "未找到‘添加材质’组件。") else: # 2. 像调用函数一样调用组件。Invoke方法的参数顺序对应组件输入端从上到下的顺序。 # 假设组件输入为:材质名(字符串), 是否着色(布尔值), 颜色(System.Drawing.Color) material_color = System.Drawing.Color.FromArgb(255, 100, 150, 200) # ARGB颜色 # Invoke 返回的是一个列表,包含了组件所有的输出 result_list = add_material_comp.Invoke("我的自定义蓝色材质", True, material_color) # 通常第一个输出就是创建的材质元素 if result_list and len(result_list) > 0: new_material = result_list[0] # 现在你可以将这个材质赋给之前创建的DirectShape # ... (后续代码) ``` 这个技巧极大地扩展了Python脚本的能力边界。你可以将一系列标准的、复杂的操作封装成Grasshopper电池组,然后在Python脚本里作为“子程序”调用,从而构建出高度模块化、可复用的超级脚本。 **关于错误处理**:在自动化流程中,健壮性至关重要。你的脚本可能会因为各种原因失败:用户选择了错误的元素、几何转换意外返回了`None`、Revit事务冲突等等。一个专业的脚本必须能优雅地处理这些情况,给出明确的提示,而不是让整个Grasshopper定义崩溃或让Revit卡死。除了前面用到的事务中的 `try...except` 块,在Python组件内部,我们应该充分利用 `ghenv.Component.AddRuntimeMessage` 方法向用户反馈信息。 ```python from Grasshopper.Kernel import GH_RuntimeMessageLevel as RML def validate_input(input_data, input_name): """验证输入是否有效""" if input_data is None: ghenv.Component.AddRuntimeMessage(RML.Warning, f"输入‘{input_name}’为空,请检查连接。") return False if isinstance(input_data, list) and len(input_data) == 0: ghenv.Component.AddRuntimeMessage(RML.Remark, f"输入‘{input_name}’是空列表。") return False return True # 在脚本主逻辑开始前进行验证 if not validate_input(my_walls, "墙体"): # 如果验证失败,可以提前返回或设置默认输出 a = [] return # 对于关键操作,使用更细致的异常捕获 try: some_risky_operation() except ValueError as e: ghenv.Component.AddRuntimeMessage(RML.Error, f"数值错误: {e}") a = [] except DB.ArgumentException as e: # 专门捕获Revit API的参数错误 ghenv.Component.AddRuntimeMessage(RML.Error, f"Revit API参数错误: {e.Message}") a = [] except Exception as e: # 捕获其他所有未预见的错误 ghenv.Component.AddRuntimeMessage(RML.Error, f"发生未知错误: {type(e).__name__}: {e}") a = [] ``` 良好的错误处理和信息反馈,能让你的脚本工具显得更加可靠和专业,也方便其他同事或未来的你进行调试和维护。记住,写脚本不仅仅是让机器执行任务,更是为了让人(包括你自己)能更轻松、更安全地使用它。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

Rhino5_Python_Primer.pdf

Rhino5_Python_Primer.pdf

Rhino_Python_Primer.pdf Forums: The RhinoPython community is very active and offers a wonderful resource for posting questions/answers and fi nding help on just about anything!: ...

rhino.python 教程 (英文)

rhino.python 教程 (英文)

### Rhino.Python 教程概览 #### 一、引言 《Rhino.Python 教程》是一本专为Rhino 5设计的指南,旨在帮助初学者掌握Rhino中Python编程的基础知识。该书由David Rutten撰写,最初是针对Rhino 4和VBScript编写的,...

rhino python函数中文网址.txt

rhino python函数中文网址.txt

Rhino为Python开发者提供了丰富的API支持,这些API覆盖了从基本的几何操作到高级的模型管理等各种功能。这意味着开发者可以通过调用这些API来实现几乎任何与Rhino相关的任务。 #### 灵活的脚本环境 Rhino内置了一个...

Python库 | rhino3dm-0.0.1-cp27-none-win_amd64.whl

Python库 | rhino3dm-0.0.1-cp27-none-win_amd64.whl

Rhino3DM库的出现进一步强化了Python在3D领域的应用,它使得开发者能够利用Python的灵活性来处理复杂的3D建模任务,同时享受到Rhino 3D的强大功能。 **Python库的使用** 安装".whl"文件是Python中常见的安装库的...

py-design:适用于Grasshopper,Rhino,Dynamo和pyRevit的Python工具和脚本的集合

py-design:适用于Grasshopper,Rhino,Dynamo和pyRevit的Python工具和脚本的集合

适用于Autodesk Revit的IronPython脚本环境 适用于AutodeskRevit:registered:的IronPython脚本和加载项选项卡 图书馆/助手 revitpythonwrapper 一个Revit API包装器,可帮助Python程序员编写更多的pythonic ...

python for rhino教程

python for rhino教程

而Rhino Python是指Rhino软件提供的编程接口,允许用户通过Python语言创建脚本和插件,以此来自定义和扩展软件功能。 描述部分提到本书是“详尽的教程,权威的阐释,明晰易懂”,说明该教程旨在为读者提供全面、...

Python库 | ladybug_rhino-1.0.3-py2.py3-none-any.whl

Python库 | ladybug_rhino-1.0.3-py2.py3-none-any.whl

《Python库:深入理解ladybug_rhino》 在Python的世界里,库是开发者们不可或缺的工具,它们为各种任务提供了丰富的功能和便捷的接口。今天,我们要探讨的是一份名为“ladybug_rhino”的Python库,具体版本为1.0.3...

Python库 | rhino3dm-0.0.8-cp37-cp37m-win_amd64.whl

Python库 | rhino3dm-0.0.8-cp37-cp37m-win_amd64.whl

Rhino3dm库允许Python开发者直接在Python环境中操作Rhino的数据模型,进行3D建模、渲染、分析等工作。 这个库的版本号为0.0.8,表明它是早期的一个版本。"cp37"代表它是针对Python 3.7编译的,"cp37m"表示它采用了...

基于Rhino-Python的多圈高簇绒地毯三维仿真.pdf

基于Rhino-Python的多圈高簇绒地毯三维仿真.pdf

Rhino-Python指的是在Rhino软件中嵌入了Python语言支持,让用户可以在Rhino中编写脚本,自动化重复的设计任务,提高设计效率。 3. B样条曲线的应用:文档中提到了使用B样条曲线对地毯绒圈中心线及截面曲线进行拟合...

Python库 | rhino3dm-0.8.1-cp37-cp37m-macosx_10_13_x86_64.whl

Python库 | rhino3dm-0.8.1-cp37-cp37m-macosx_10_13_x86_64.whl

5. **插件开发**:可以作为开发Rhino插件的基础,通过Python脚本扩展Rhino的功能。 总之,`rhino3dm`是Python开发者与3D设计领域交互的重要工具,提供了丰富的功能和灵活性,使得处理和操作3D数据变得更加简单高效...

Python开发的CTF实战平台源码包,含靶场题目与完整后台管理功能

Python开发的CTF实战平台源码包,含靶场题目与完整后台管理功能

一套基于Flask框架搭建的网络攻防CTF竞赛平台源代码,支持用户注册登录、题目发布与提交、实时计分排名、管理员后台配置等核心功能。平台采用MySQL存储用户信息、题目数据和解题记录,前端使用HTML/CSS/JavaScript配合Jinja2模板引擎渲染,后端逻辑由Python实现,模块划分清晰,包含auth.py(认证)、challenges.py(题目管理)、scoreboard.py(排行榜)、models.py(数据库模型)和views.py(路由处理)等关键文件。内置密码学、逆向工程等常见CTF题型目录结构,方便直接部署靶场或二次开发。配套migration脚本支持数据库版本管理,.ctfd_secret_key保障会话安全,README提供基础部署说明,适合教学演练、校内CTF比赛或安全工程师练手使用。

rhino.inside-revit:这是Rhino.Inside:registered:.Revit的开源存储库

rhino.inside-revit:这是Rhino.Inside:registered:.Revit的开源存储库

Rhino.Inside:registered:.Revit 请参阅 ,以获取有关如何使用该项目的更多信息。 下面列出的部分为想要为该项目或Wiki做出贡献的开发人员提供了有关代码库的更多信息。 概述 Rhino.Inside:registered:技术允许...

Rhino珠宝首饰设计从入门到精通.pdf

Rhino珠宝首饰设计从入门到精通.pdf

根据提供的信息,“Rhino珠宝首饰设计从入门到精通.pdf”主要涉及的是利用Rhino软件进行珠宝首饰设计的技术和方法。由于具体内容部分并没有提供实际的学习资料或教程内容,这里将基于标题和描述,围绕Rhino软件在...

Rhino.Mocks-3.6

Rhino.Mocks-3.6

Rhino.Mocks是一个广泛使用的.NET单元测试框架,其版本3.6-Build-21提供了高效且用户友好的模拟(mocking)功能。这个框架主要适用于开发者进行单元测试时,需要模拟复杂的对象交互以隔离被测试代码。在本文中,我们...

env.rhino.1.2.js

env.rhino.1.2.js

Rhino就是JavaScript引擎,它的目的就是实现Java与JavaScript的互操作性。rhino-1.7R1.jar Envjs一个纯js方式在无浏览器环境下模拟浏览器的行为。envjs-1.2.js 一般网站js中都会用到jauery,所以还用了jauery.js

rhino-1.7.14.jar下载

rhino-1.7.14.jar下载

rhino-1.7.14.jar下载

Rhino犀牛模型导出skp脚本

Rhino犀牛模型导出skp脚本

自己写的犀牛导出su脚本,简单易用,导出su模型的模块各自成组,各自拥有相对独立的原点,并自动整理乱线。解决了犀牛导出su的破面、原点过远问题。 具体使用方法: 1.在犀牛指令栏输入:RunPythonScript 2.选择...

Revit软件操作技巧-用Rhino为Revit做族.docx

Revit软件操作技巧-用Rhino为Revit做族.docx

8. 注意事项:当从 Rhino 导入到 Revit,注意插入点避免标高方向的偏移:在将 Rhino 的模型导入到 Revit 时,需要注意插入点避免标高方向的偏移。 知识点:模型导入、插入点设置、标高方向的偏移。 9. 在 Rhino 里...

T-Splines 1.41 for Rhino.part1

T-Splines 1.41 for Rhino.part1

压缩包内的文件“T-Splines 1.41 for Rhino.part1.rar”、“T-Splines 1.41 for Rhino.part2.rar”和“T-Splines 1.41 for Rhino.part3.rar”是分卷压缩文件,用于分块传输大文件。用户需要下载所有分卷并使用合适的...

rhino-1.7.7.1.jar(Rhino for java)

rhino-1.7.7.1.jar(Rhino for java)

Rhino的jar包。 Rhino 是开源的 JavaScript 引擎,是完全基于 Java 实现,几乎可以使用 JavaScript 完成 Java 所有的工作。

最新推荐最新推荐

recommend-type

含分布式电源的配电网可靠性评估研究(Matlab代码实现)

内容概要:本文聚焦于含分布式电源的配电网可靠性评估问题,基于Matlab平台实现了序贯蒙特卡洛模拟法的完整算法流程,系统性地开展了配电网在计及分布式电源接入情况下的可靠性量化分析。研究通过构建典型配电系统模型(如IEEE标准测试系统),综合考虑系统中各元件的故障率、修复时间及运行状态转移过程,采用时序抽样方法模拟系统长期运行行为,并计算关键可靠性指标(如SAIDI、SAIFI、ASAI等),从而评估分布式电源对供电可靠性的影响机制与程度。文中提供了结构清晰、模块化的Matlab代码,涵盖状态生成、故障分析、负荷削减、指标统计等核心环节,具有较强的可读性与可复现性,是电力系统可靠性研究领域的实用型技术资料。; 适合人群:电气工程、电力系统及其自动化等相关专业的研究生、科研人员及从事配电网规划、运行与管理工作的技术人员;具备电力系统分析基础知识和一定Matlab编程能力者更佳。; 使用场景及目标:①开展含分布式电源的配电网可靠性建模与仿真研究;②完成学术论文复现、课程设计、毕业设计或科研项目开发;③深入掌握序贯蒙特卡洛模拟法在复杂电力系统可靠性评估中的技术实现路径与工程应用细节。; 阅读建议:建议结合文中Matlab代码逐模块调试运行,深入理解状态抽样、时序模拟、故障遍历与可靠性指标累计的实现逻辑,同时可尝试修改系统结构或参数以观察可靠性变化趋势,进一步提升对高比例新能源接入背景下配电网运行特性的认知水平和科研实践能力。
recommend-type

ipmi接口概述 -下载即用.zip

已经博主授权,源码转载自 https://pan.quark.cn/s/c1420aa4fbe1 "IPMI接口综述与IPMB总线详解"IPMI(Intelligent Platform Management Interface)是一种用于达成服务器平台管理的智能平台管理接口,涵盖了服务器的实时监控、故障诊断、远程控制等多项管理功能。该协议立足于IPMB(Intelligent Platform Management Bus)总线,而IPMB总线是一种实现服务器平台管理模块互联的智能平台管理总线,旨在实现服务器平台管理的自动化与智能化。IPMB总线具备以下主要特性:1. 支持分布式管理架构:IPMB总线能够支持分布式管理架构,其传感器与控制器分别部署于各个管理模块上,并通过IPMB总线进行信息交互。2. 支持异步事件通报机制:IPMB总线不仅支持异步事件通报机制,还具备危机事件日志机制,多主协议允许控制器抢占总线以向事件接收器节点发送事件消息。3. 提供可扩展的平台管理框架:IPMB总线构建了一个可扩展的平台管理框架,使得新的管理信息资源能够便捷地接入平台管理总线,且不会对总线上的其他控制器产生影响。4. 多主运作模式:IPMB总线采用多主运作模式,支持分布式管理架构、异步事件通报机制以及平台扩展功能。5. 兼容非智能I2C设备:IPMB总线兼容非智能I2C设备,例如温度传感器等,可通过I2C总线获取当前的温度数据。6. 支持“Out-of-Band”访问方式:IPMB总线独立于系统的处理器与内存总线,即便在系统发生故障时也能进行访问。7. 简化系统管理布线并降低成本:IPMB总线简化了系统管理的布线复杂度,并降低了相关成本,为平台管理提供了一种高效简洁的解决方案。8. ...
recommend-type

用于确定分数阶系统(FOS)的Lyapunov指数谱,包括分数阶Lorenz系统、4D分数阶Chen系统和分数阶Duffing振荡器(Matlab代码实现)

内容概要:本文介绍了用于确定分数阶系统(FOS)Lyapunov指数谱的Matlab代码实现方法,涵盖分数阶Lorenz系统、4D分数阶Chen系统和分数阶Duffing振荡器三类典型非线性动力学系统。通过数值计算Lyapunov指数谱,能够有效分析这些分数阶系统的混沌行为与动力学稳定性,为研究复杂系统的分岔、吸引子演化及长期动态特性提供了可靠的技术手段。文档强调该资源在科研仿真中的实用性,并配套提供完整的Matlab代码支持。; 适合人群:具备一定非线性动力学、控制理论或应用数学背景,从事相关领域研究的硕士、博士研究生及科研人员。; 使用场景及目标:① 分析分数阶混沌系统的动力学特性与稳定性判据;② 利用Lyapunov指数谱识别系统中的混沌、周期与拟周期状态;③ 为分数阶控制系统设计、同步与保密通信等应用提供理论支撑与仿真验证工具; 阅读建议:建议结合非线性系统理论基础,运行并调试所提供的Matlab代码,深入理解算法实现细节,同时可通过调整系统参数与阶次开展扩展性研究,强化对分数阶系统复杂行为的理解与应用能力。
recommend-type

用于应用开发中利用云服务的声明式JavaScript库

AWS Amplify 是面向前端和移动开发者构建云赋能应用的 JavaScript 库 AWS Amplify 针对不同类别的云操作提供了声明式且易于使用的接口。AWS Amplify 可与任何基于 JavaScript 的前端工作流以及面向移动开发者的 React Native 良好配合。
recommend-type

软考全科备战资源包编程基础教程

编程语言是用于编写计算机程序的语言。不同的编程语言具有不同的特点和用途。以下是一些常见的编程语言:
recommend-type

基于PLC的机械手控制系统设计与实现

资源摘要信息:"本文主要介绍了一种基于可编程逻辑控制器(PLC)的机械手控制系统的设计与实现。该设计利用PLC的高度可靠性和灵活性,实现对机械手的精确控制,以适应现代工业生产的需求。机械手作为自动化技术的典型应用,其在工业生产中的广泛应用,不仅提高了生产效率,还在一定程度上改善了劳动环境和工人的工作条件。 首先,文章概述了自动化技术的发展背景,以及机械手在现代工业中的重要性和应用范围。接着,文章详细描述了PLC控制系统的基本原理和结构特点,指出PLC作为一种以微处理器为核心,通过编程存储器来存储和执行各种控制命令的工业控制装置,其在工业自动化领域的应用广泛。 机械手控制系统的设计主要包括以下几个方面: 1. 机械手运动控制的原理:通过PLC软件编程,控制步进电机按照预定的程序实现精确的运动轨迹,从而完成机械手的上升、下降、左右移动、加紧和放松物件等动作。 2. PLC选型和配置:根据机械手控制系统的需求,选择合适的PLC型号和配置相应的输入输出模块,以满足控制信号的输入输出要求。 3. 步进电机的工作原理及选型:步进电机作为执行元件,需要根据运动控制要求进行选型,包括电机的扭矩、转速、步距角等参数的选择。 4. 控制逻辑和程序设计:在PLC中编写控制程序,将机械手的动作逻辑转化为控制指令,通过程序实现对步进电机的精确控制。 5. 控制系统的调试和优化:通过不断调试和优化控制程序,确保机械手运动的准确性和稳定性。 文章还提到了机械手在实际应用中的优势,包括减少人力成本、提高作业效率、保证作业质量、减少人员在危险环境中的作业等。同时,也强调了机械手控制系统在工业自动化中的重要性,以及PLC在其中所起的关键作用。 在关键词部分,文章列举了"机械手"、"PLC"和"步进电机"三个关键词,反映了文章的主要研究内容和方向。整体上,本设计文档为现代工业自动化领域提供了实用的参考,并为类似机械手控制系统的设计提供了理论和技术支持。" 关键词:机械手;PLC;步进电机;自动化技术;控制系统设计;工业自动化;运动控制;PLC编程;微处理器;输入输出模块
recommend-type

避坑指南:Oracle CDB架构下PDB恢复的5个常见错误(RMAN+19c版)

# Oracle CDB架构下PDB恢复实战:5个高频错误与深度解决方案 在Oracle多租户环境中,PDB恢复操作看似简单却暗藏玄机。许多DBA在执行恢复时容易陷入一些典型陷阱,导致恢复过程异常甚至失败。本文将深入剖析这些常见问题,并提供可立即落地的解决方案。 ## 1. 控制文件与归档状态的致命疏忽 控制文件缺失或损坏是PDB恢复失败的首要原因。我曾遇到一个案例:某金融系统在恢复PDB时直接报错"ORA-00205",根本原因是忽略了CDB控制文件的恢复优先级。 **正确操作流程:** 1. 首先确认控制文件完整性: ```sql -- 检查控制文件记录 SELECT name,
recommend-type

JavaScript里怎么保证一个操作彻底做完,再开始下一个?

### JavaScript 函数顺序执行的方法 为了确保一个函数完全执行完毕之后再执行另一个函数,在 JavaScript 中有多种方式可以实现这一点。 #### 使用同步代码 如果两个函数都是同步的,则只需简单地依次调用这两个函数即可。由于 JavaScript 是单线程的,因此会按照代码编写的顺序逐行执行[^3]: ```javascript function firstFunction() { console.log('First function is executing'); } function secondFunction() { console.log
recommend-type

物流园区信息化建设:机遇、挑战与系统规划

资源摘要信息:"物流园区信息化解决方案" 物流园区信息化是适应经济发展和行业转型升级的必由之路。随着市场需求的变化和信息技术的发展,物流园区面临着诸多挑战与机遇。在未来的3至5年内,物流行业将会经历一场重大变革,物流园区必须适应这种变化,通过信息化建设来提升竞争力。 首先,物流园区面临的挑战包括收入增长放缓、成本上升、服务能力与企业需求之间的矛盾以及激烈的市场竞争。面对这些问题,物流园区需要通过信息化手段来减少费用、降低成本、提高资源利用率、扩大服务种类和规模、应对产业迁移和国际竞争,以及发挥园区的汇集效应。 物流园区的信息化建设应当遵循几个关键原则:信息化应成为利润中心而非成本中心;与实际业务模式相结合;需要系统规划和全面的解决方案,包括设备选型、技术支持和售后服务等;并且应当与企业的经营管理、业务流程等紧密结合。 基于这些原则,物流园区的信息化建设应当进行系统规划和分步实施。IToIP设计理念,即基于开放的IP协议构建IT系统,整合计算、安全、网络、存储和多媒体基础设施,并为上层应用提供开发架构和接口,已被业界广泛接受,并在多个行业的IT建设中得到应用。 物流园区信息化建设“三部曲”分为:做优、做大、做强。尽管文档中只提到了“做优”的部分,但可以推断出其他两个阶段也将涉及信息化技术的应用,以及通过信息化提升园区的整体运营效率和市场竞争力。 在具体实施信息化方案时,物流园区需要关注以下几个方面: 1. 数据管理:建立高效的数据管理系统,实现信息的实时收集、存储、处理和分析,为决策提供支持。 2. 仓储自动化:利用自动化设备和技术提升仓储作业效率,减少人工错误,加快货物流转速度。 3. 运输优化:通过信息化手段优化运输路径和调度,减少空驶和等待时间,提高车辆使用效率。 4. 资源协同:实现园区内部资源的整合,以及与外部供应链资源的协同,提升整个物流链的效率。 5. 客户服务:通过信息化提高客户服务的质量和响应速度,增加客户满意度和忠诚度。 6. 安全保障:确保信息化系统具有高可靠性和安全性,能够抵御网络攻击和数据泄露的风险。 7. 技术创新:持续关注和引入新兴信息技术,如物联网、大数据分析、云计算、人工智能等,以保持园区的竞争力。 通过上述措施,物流园区不仅能够在激烈的市场竞争中脱颖而出,而且能够向现代物流中心的目标迈进。信息化将深刻改变物流园区的运营模式,促进其持续健康发展。
recommend-type

Android13录音权限避坑指南:从零配置前台服务到通知栏显示

# Android 13录音权限全流程实战:从权限声明到前台服务完整方案 最近在开发者社区看到不少关于Android 13后台录音失效的讨论——应用切换到后台后,AudioRecorder回调数据突然全变为0,而检查日志却没有任何异常抛出。这其实是Android 13对后台行为管控升级的典型表现。去年在开发语音备忘录应用时,我也曾在这个问题上耗费两天时间排查,最终发现需要同时处理好三个关键点:运行时权限、前台服务类型声明和通知栏可视化。 ## 1. Android 13录音权限体系解析 Android的权限系统随着版本迭代越来越精细化。在Android 13上,录音功能涉及的多层权限控制