杰瑞科技汇

Python与grasshopper

下面我将从几个方面详细解释 Python 与 Grasshopper 的关系、如何结合使用以及它们的优势。

Python与grasshopper-图1
(图片来源网络,侵删)

核心关系:Python 是 Grasshopper 的“超级引擎”

可以把 Grasshopper 想象成一个可视化的“乐高搭建平台”,你通过拖拽组件(就像乐高积木)来快速搭建和迭代设计逻辑,这非常直观,但也有一些限制:

  • 复杂逻辑处理:对于复杂的算法、循环、条件判断,用纯组件搭建会非常臃肿且难以管理。
  • 外部数据交互:处理文本文件、数据库、API 调用等,Grasshopper 组件力不从心。
  • 性能瓶颈:某些复杂的计算(如大规模数据处理、物理模拟)在 Grasshopper 中可能会很慢。
  • 自定义功能:无法创建 Grasshopper 原生没有的、高度定制化的功能。

Python 的出现完美地解决了这些问题。

你可以把 Python 看作是 Grasshopper 的一个“超级组件”或“外部脚本引擎”,它允许你:

  • 编写自定义逻辑:使用 Python 强大的编程语言能力来处理复杂任务。
  • 访问底层数据:直接读写 Grasshopper 中的几何数据、参数和列表。
  • 调用外部库:利用 Python 丰富的第三方库生态系统(如 NumPy, Pandas, Scipy, TensorFlow 等)。
  • 实现高性能计算:Python 在处理数据和执行算法方面通常比 Grasshopper 的原生组件更快。

如何在 Grasshopper 中使用 Python?

主要有两种方式,它们针对不同的使用场景。

Python与grasshopper-图2
(图片来源网络,侵删)

使用 Python Script 组件(最常用、最直接)

这是最简单、最直接的方式,就像在 Grasshopper 画布上添加一个普通组件一样。

操作步骤:

  1. 安装 Python:确保你的电脑上安装了 Python,推荐从 Python 官网 下载并安装,最好将 Python 添加到系统环境变量 PATH 中。
  2. 在 Grasshopper 中添加组件:在 Grasshopper 的组件面板中找到 Math -> Script -> Python Script,并将其拖到画布上。
  3. 编写代码:双击 Python Script 组件,会弹出一个代码编辑器窗口,你可以在这里编写 Python 代码。
  4. 连接数据Python Script 组件有几个输入和输出端口。
    • 输入:你可以将 Grasshopper 中的数据(如点、线、数字、列表等)连接到输入端口,Grasshopper 会自动将这些数据转换为 Python 中的相应对象(列表、数字等)。
    • 输出:在 Python 代码中,你需要定义一个或多个变量,并将最终结果赋值给这些变量,这些变量会自动显示在 Python Script 组件的输出端口,你可以像使用普通组件一样连接它们。

简单示例:计算点列表的平均值

  1. 在 Rhino 中创建一些点,然后用 Panel 组件查看它们的 GUID 列表。

    Python与grasshopper-图3
    (图片来源网络,侵删)
  2. 将这个 GUID 列表连接到 Python Script 组件的一个输入端口(x)。

  3. Python Script 组件的代码编辑器中输入以下代码:

    # Grasshopper 会将输入的 GUID 列表转换为一个 Python 列表
    # 我们需要将这些 GUID 转换为实际的 Point3d 对象
    # 输入 x 是一个包含点 GUID 的列表
    # 我们使用 rhinoscriptsyntax 库来操作 Rhino 对象
    import rhinoscriptsyntax as rs
    # 检查输入是否为空
    if not x:
        # 如果没有输入,则输出一个空列表
        a = []
    else:
        # 创建一个空列表来存储点对象
        points = []
        # 遍历输入的每个 GUID
        for guid in x:
            # 根据 GUID 获取点对象
            point = rs.AddPoint(guid)
            if point:
                points.append(point)
        # 计算所有点的 X, Y, Z 坐标的平均值
        if points:
            avg_x = sum(p.X for p in points) / len(points)
            avg_y = sum(p.Y for p in points) / len(points)
            avg_z = sum(p.Z for p in points) / len(points)
            # 创建平均点
            avg_point = rs.CreatePoint(avg_x, avg_y, avg_z)
            # 将结果赋值给输出端口 'a'
            a = avg_point
        else:
            a = []
    # 注意:输出变量 a 必须在代码最后被定义
    # 输出 a 会是一个 Point3d 对象
  4. 运行后,Python Script 组件的输出端口 a 就会计算出所有输入点的平均值,并可以在 Rhino 中显示出来。


使用 GHPython 组件(功能更强大、更灵活)

GHPython 是一个由第三方开发者(主要是 Giulio Piacentino)创建的、功能更全面的 Python 组件,它现在是大多数计算设计师的首选。

Python Script 组件相比,GHPython 的优势:

  • 更好的调试:内置了更友好的错误提示和调试信息。
  • 更灵活的 I/O:可以轻松创建多个输入和输出端口,并且可以给端口命名。
  • 更完整的 Rhino/Grasshopper API:提供了更全面的接口来与 Grasshopper 文档、组件等进行交互。
  • 异步支持:支持异步计算,这对于长时间运行的任务(如生成、模拟)非常有用,可以避免 Grasshopper 卡死。

GHPython 的核心对象:

GHPython 中,有几个全局对象让你与 Grasshopper 无缝交互:

  • x:一个字典,包含了所有连接到输入端口的数据。
  • a:一个列表,包含了所有要从输出端口发送出去的数据,你只需要将结果 append 到这个列表里。
  • ghenv:一个对象,包含了关于 Grasshopper 环境(如文档、组件路径等)的信息。
  • rhinoscriptsyntax (as rs) 和 Rhino (as rhino):可以直接调用,无需额外导入。

简单示例:使用 GHPython 实现相同功能

  1. 添加 GHPython 组件到画布。

  2. 右键点击组件的输入端,可以添加、删除和重命名输入端口,我们将一个输入端口命名为 points_g

  3. 将点列表连接到 points_g 端口。

  4. 双击 GHPython 组件,输入以下代码:

    # GHPython 示例:计算点列表的平均值
    # 输入数据在字典 x 中,通过端口名 'points_g' 访问
    input_points_guids = x['points_g']
    import rhinoscriptsyntax as rs
    if not input_points_guids:
        # 如果没有输入,将 None 添加到输出列表 a
        a.append(None)
    else:
        points = []
        for guid in input_points_guids:
            point = rs.AddPoint(guid)
            if point:
                points.append(point)
        if points:
            avg_x = sum(p.X for p in points) / len(points)
            avg_y = sum(p.Y for p in points) / len(points)
            avg_z = sum(p.Z for p in points) / len(points)
            avg_point = rs.CreatePoint(avg_x, avg_y, avg_z)
            # 将结果添加到输出列表 a
            a.append(avg_point)
        else:
            a.append(None)

Python + Grasshopper 的典型应用场景

  1. 数据驱动的生成设计

    • 从 Excel、CSV、数据库甚至网页 API 读取大量数据(如城市信息、环境数据、人口统计数据)。
    • 使用 Python 的 Pandas 库进行数据清洗、转换和分析。
    • 将处理后的数据作为参数输入到 Grasshopper 的生成逻辑中,生成与数据高度相关的形态。
  2. 复杂算法与逻辑实现

    • 机器学习/AI:使用 scikit-learnTensorFlow 训练模型,预测设计性能或生成设计变体。
    • 物理模拟:虽然有一些 Grasshopper 插件,但使用 Python 调用更底层的模拟库可以实现更定制化的效果。
    • 路径规划与优化:实现如旅行商问题、遗传算法等复杂优化算法。
  3. 几何操作与自定义节点

    • 当 Grasshopper 的原生几何组件无法满足需求时,可以用 Python 编写自己的几何处理函数。
    • 编写一个函数来生成特定的分形结构、进行复杂的布尔运算或实现独特的曲面细分逻辑。
  4. 文本处理与自动化报告

    自动生成分析报告,将 Grasshopper 中的计算结果(如面积、体积、日照分析数据)格式化为文本,并写入 Word 或 PDF 文件。


总结与建议

特性 Grasshopper (仅组件) Python + Grasshopper
易用性 极高,可视化,无需编程基础 较低,需要 Python 编程知识
灵活性 较低,受限于现有组件 极高,可以实现任何逻辑
性能 中等,对于简单任务很快 ,尤其适合数据处理和复杂计算
生态系统 依赖 Grasshopper 和 Rhino 插件 极其丰富,可调用全球 Python 库
学习曲线 平缓 陡峭

给你的建议:

  • 如果你是初学者:先精通 Grasshopper 组件,理解计算设计的基本逻辑,当你发现某个任务用组件搭建非常困难或性能很差时,再开始学习 Python。
  • 如果你是程序员或想深入学习Python Script / GHPython 是你进入 Grasshopper 世界的最佳桥梁,从简单的脚本开始,逐步掌握如何与 Rhino 和 Grasshopper 的数据结构交互。
  • 最佳实践“混合模式” 是最强大的工作流。
    • 用 Grasshopper 组件快速搭建原型、处理简单的几何逻辑和可视化流程。
    • 用 Python 脚本处理“黑箱”部分,即那些复杂、计算密集或需要外部数据的任务。
    • 将 Python 脚本封装成一个自定义组件,保持整个 Grasshopper 定义的美观和可读性。

Python 为 Grasshopper 打开了一扇通往更广阔世界的大门,让它从一个单纯的几何建模工具,升级为一个功能强大的、可编程的、与全球科技生态相连的设计平台,掌握 Python 与 Grasshopper 的结合,是现代计算设计师的核心竞争力之一。

分享:
扫描分享到社交APP
上一篇
下一篇