7月份参加了一个比赛,小组做了一个建筑生成类的产品,需要用到Rhino+Grasshopper平台进行开发。由于小组来自不同专业:土建类、通信、计算机等,短时间熟悉Rhino不切实际。但完全脱离它,图形的输入与输出又困难重重。
在拓展思路的技术预研阶段,了解到了Rhino Compute Sevice这种通过云端或者搭建本地Web服务器来从普通的开发环境中调用rhino的图形库,并且可以读取、输入、输出ghx(grasshopper支持utf-8的文件格式。)
考虑到中文互联网几乎没有对其介绍与应用,笔者当个搬运工,讲解如何搭建环境以及如何调用库函数等步骤。
Rhino Compute针对研发人员的云端存取几何计算机,简单来说可以借助其在一般开发环境中调用Rhino的图形库函数,无需在Rhino里通过IronPython里编写(太多Python常用库无法import)。
官方网址: https://www.rhino3d.com/compute
Compute 是一个实验项目,允许通过 REST API 访问 McNeel 云计算服务中的 Rhino 几何图形库。Compute 是基于 Rhino Inside™ 技术的,运行于在线 Web 服务器当中。
Compute 可以看做是 Rhino3dm 项目的附加几何延伸。
Compute 潜在用途:
* 通过基于 REST API 的云端服务进行几何运算。
* 在 Rhino 外部调用 2400+ RhinoCommon API 。
* 访问无法在 OpenNurbs 库中调用的附加 RhinoCommon 函数,包括:
* 最近点计算
* 相交计算
* 曲面细分 (网格划分)
* 插值运算
* 布尔运算
* 面积与质量属性计算
* 其他各种各样的几何计算
* 客户端函数库可以使用独立的 C#(.NET)、Python、JavaScript 等语言。
* 运行在本地的 Compute 服务器可以用作私有计算实例或并行计算农场节点。
Rhino Compute目前支持C#/ Python/ JavaScript,本文将以Python为例。
pip install rhino3dm
pip install compute-rhino3d
3.1 rhino3dm.py- 是Rhino3dm库的一部分。这是OpenNurbs的Python封装,其中包含读取和写入Rhino Geometry Objects的功能。
3.2 compute - rhino3d.py- 是一个封装包,用于添加RhinoCommon中可用的类,它无法通过rhino3dm.py获得。Compute-rhino3d通过调用McNeel Cloud Compute服务器以实现这些功能。它处理所有授权和JSON数据转换。
import rhino3dm
import compute_rhino3d
compute_rhino3d.Util.authToken = auth_token
auth_token =''
在不搭建本地服务器的情况下,需要需要申请秘钥请求访问Rhino Compute的服务器,在大陆特殊的网络情况下,通常会很慢。
申请网址:https://www.rhino3d.com/compute/login(可能需梯子)
3.3 一个简单的案例:
import rhino3dm
import random
compute_rhino3d.Util.authToken = "" #申请访问云服务器秘钥
model = rhino3dm.File3dm()
for i in range(20):
pt=rhino3dm.Point3d(random(uniform(-10,10,0)
model.Objects.AddPoint(pt)
model.Write('point.3dm', 5) #保存文件
搭建本地服务器可以加快Rhino3dm库的运行速度,并且可以调用非常多Grashopper的SDK。
但前提是安装rhino 7 WIP才可以继续,安装7的方法不在此赘述。
首先安装Compute文件,链接如下:
Compute安装文件
解压,打开文件夹中compute.frontend.exe文件,然后win搜索PowerShell,配置URL保留。将端口80用于HTTP,将端口443用于HTTPS。
依次输入回车:
netsh http add urlacl url="http://+:80/" user="Everyone"
netsh http add urlacl url="http://+:8081 user="Everyone"
netsh http add urlacl url="https://+:443/" user="Everyone"
https://github.com/mcneel/compute.rhino3d/blob/master/docs/environment_variables.md
在exe打开的状态下,
在浏览器中输入 http://127.0.0.1:8081/version 确定是否安装成功。
环境变量
Python中调用本地Web服务器:
import compute_rhino3d
compute_rhino3d.Util.url = "http://127.0.0.1:8081/"
在导入grasshopper文件中,需要对import与outport进行定义:
将imput的电池group并且命名为 RH_IN:Your_Filename,
output则为RH_OUT:Your_Filename,并将文件另存为**“.ghx”**格式。
即如图所示:
在Python中则需要调用服务器、对ghx文件解码以及传递输入输出的数据。
import rhino3dm
import requests
import base64
import json
import compute_rhino3d
import compute_rhino3d.Curve
import os
import compute_rhino3d.Util
import compute_rhino3d.Brep
import math
compute_rhino3d.Util.url = "http://127.0.0.1:8081/"
post_url = compute_rhino3d.Util.url + "grasshopper"
gh_data = open("./XXXX.ghx", mode="r", encoding="utf-8-sig").read()
data_bytes = gh_data.encode("utf-8")
encoded = base64.b64encode(data_bytes)
decoded = encoded.decode("utf-8") #加载并解析ghx文件
data = {
"algo": decoded,
"pointer": None, #无指针
"values": [
{
"ParamName": "RH_IN:Curve", #自己定义的输入名称
"InnerTree": {
"{0;}": [
{
"type": "System.Integer", #数据类型
"data": "14" #数据
}
]
}
},
]
}
response = requests.post(post_url, json=data)
print(response.content) #检查是否通畅
res = response.content.decode("utf-8")
res = json.loads(res)
values = res["values"]
model = rhino3dm.File3dm()
for val in values:
paramName = val["ParamName"]
InnerTree = val["InnerTree"]
for key, innerVals in InnerTree.items():
print(key)
for innerVal in innerVals:
data = json.loads(innerVal["data"])
site_pt = rhino3dm.CommonObject.Decode(data)
model.Objects.Add(site_pt)
model.Write("./results.3dm", 5)
这样即可加载grasshopper文件并在Python中传递数据。