教程 | Rhino Compute Sevice介绍及环境搭建

Rhino Compute Sevice

1. 前言

7月份参加了一个比赛,小组做了一个建筑生成类的产品,需要用到Rhino+Grasshopper平台进行开发。由于小组来自不同专业:土建类、通信、计算机等,短时间熟悉Rhino不切实际。但完全脱离它,图形的输入与输出又困难重重。
在拓展思路的技术预研阶段,了解到了Rhino Compute Sevice这种通过云端或者搭建本地Web服务器来从普通的开发环境中调用rhino的图形库,并且可以读取、输入、输出ghx(grasshopper支持utf-8的文件格式。)
考虑到中文互联网几乎没有对其介绍与应用,笔者当个搬运工,讲解如何搭建环境以及如何调用库函数等步骤。

2. 简介

2.1 官方定义

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 服务器可以用作私有计算实例或并行计算农场节点。

3. 安装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)   #保存文件

4. 搭建本地Server服务器

搭建本地服务器可以加快Rhino3dm库的运行速度,并且可以调用非常多Grashopper的SDK。
但前提是安装rhino 7 WIP才可以继续,安装7的方法不在此赘述。
首先安装Compute文件,链接如下:

Compute安装文件

解压,打开文件夹中compute.frontend.exe文件,然后win搜索PowerShell,配置URL保留。将端口80用于HTTP,将端口443用于HTTPS。
教程 | Rhino Compute Sevice介绍及环境搭建_第1张图片

依次输入回车:

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/"

5. 加载Grasshopper文件

在导入grasshopper文件中,需要对import与outport进行定义:
将imput的电池group并且命名为 RH_IN:Your_Filename
output则为RH_OUT:Your_Filename,并将文件另存为**“.ghx”**格式。
即如图所示:
教程 | Rhino Compute Sevice介绍及环境搭建_第2张图片
在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中传递数据。

你可能感兴趣的:(rhino,python)