显示纯服务器_BBT三行代码搭建服务器,让Dynamo跳出IronPython的封锁
Python 有基于不同的实现方式,有多个版本,比如 CPython
、 Jython
、 RPython
与 IronPython
等等。
不过,一般我们口中所说的 Python
,都是默认代指的标准版 CPython
,其基于 C语言
实现,能够兼容诸多 CAPI
,这些 CAPI
几乎无所不能,运行速度极快,于是大神们便通过这些 CAPI
,为 CPython
创造了一个又一个牛逼哄哄的武器 -- 第三方库,这些武器能够把 Python
武装起来,最终让 Python
成了编程世界中一个无比强大的存在。
没有第三方库的 Python
,就像失去了武器的武者,要他干活,就像要他肉身搏坦克。想最大化的发挥出 Python
的威力,你需要尽量科学合理的使用 Python
世界中那些拥有巨大价值的库。
先天残疾的 IronPython
Windows平台
下诸多的设计软件,比如 Grasshopper 与 Dynamo,它们内置的 Python 都是 IronPython
。
IronPython
虽然也有 Python 之名,但其底层是基于 .NET
平台实现的,与基于 C语言
的 原生Python
有天壤之别。IronPython 从一出生就注定了无法使用大神们通过 CAPI
创造的强大武器。
无法使用大神的库,从某种极端的意义上来说,与 CPython 相比,IronPython 就是个只能用肉身搏坦克的先天残疾。
想要让手上的 Python 发出最大的威力,使用那些属于 Python 的利器,你就需要绕过 IronPython 的封锁,奔向 CPython 的自由世界。
MVP
想在 Dynamo 中直接装 CPython?这是不现实的,不然就不会有 IronPython 这样折衷的存在了。
此路不通,换个思路。
我曾在教程「Dynamo 场地有限元分析」中提到过 MVP(Model-View-Present)
模式,简单来说就是让计算与显示,互不干涉,完全分离(为了简化介绍,此句并非 100% 标准):
你不需要管我是怎么算了,你给我数据,我给你结果就行了
即 -- 把参数发给 计算者
, 计算者
返回你结果。
有点迷?
最简单的,你日常浏览网页就是一个这样的过程(学习关键词 Socket)。
你在浏览器中输入了一串网页地址(URL,其中包含参数),你按下回车,浏览器就把包含了参数的 URL 发给了网站的服务器,网站服务器再经过海量的计算(再海量,其计算时间都远小于1s),把计算的结果返回给你,这就形成了你日常看到的网页。
比如你在 Bing 中搜索 「ArchiPython」,你的浏览器中的那一条 URL 中,就蕴含了大量需要完成本次搜索的参数,服务器计算了你提供的这些参数之后,才把所有本次运算的结果 -- 「含有ArchiPython的条目」返回给你。
想要用 CPython?你大可以模仿这种方式 -- 没错,我就是要你在 Dynamo 中,像访问网页一样使用 Cpython。
搭建一个使用 CPython 的本地服务器,接收 Dynamo 发来的含有参数的 URL,服务器计算出结果,再把计算的结果发回 Dynamo。都不用 Dynamo 中的电池做任何计算,让 Dynamo 成为一个纯显示端的存在。
Warning
以下需要有一定的计算机基础,本文对于纯建筑从业者与 BIMER 难度过大,望各位酌情阅读,取其精华,待到日后需要用的时候,可再将本文用作参考。
如果对技术细节无兴趣,请直接跳到意义部分。
搭建服务器
你只需要几行代码,就能使用 flask库
,在 CPython 中搭建本地服务器:
from flask import Flask
__author__ = 'Vctcn93'
__publisher__ = 'ArchiPython'
app = Flast(__name__)
if __name__ == '__main__':
app.run()
这就是一个服务器,运行这个文件,你就开启了服务器。
你可以在这个服务器中实现一些功能,比如测试是否成功链接:
from flask import Flask
__author__ = 'Vctcn93'
__publisher__ = 'ArchiPython'
app = Flask(__name__)
@app.route('/connect')
def connect():
return '连接成功!'
if __name__ == '__main__':
app.run()
通过设置的 connect函数
,你可以在浏览器中测试是否链接成功,如果连接成功,网页上就会显示出 连接成功
四个字。
值得注意的是,服务器只能返回字符串(Return a string),如果你想将计算结果用于 Dynamo 中,还需要对服务器返回的数据进行加工,以确保其类型的正确。
同样,你也可以让服务器根据你所输入的参数,来计算出的结果,在脚本中添加一个 add
函数,让他求参数 a
和 参数 b
的和:
from flask import Flask, request
__author__ = 'Vctcn93'
__publisher__ = 'ArchiPython'
app = Flask(__name__)
@app.route('/connect')
def connect():
return '连接成功!'
@app.route('/add')
def add():
# 拿到 URL 中的参数
a = request.args.get('a')
b = request.args.get('b')
# 将他们还原成数字
a, b = eval(a), eval(b)
# 计算
result = a + b
# 只能返回字符串
return str(result)
if __name__ == '__main__':
app.run()
使用 add 函数
:
如上,一条满足服务器计算的 URL,需要满足如下公式:
服务器地址 + 函数名称 + ? +
参数1
=值 + & +参数2
=值 + & +参数3
=值 + & + ...
与服务器只能返回 String 的特性一样,你通过request get
到的参数也全是字符。
恭喜你,你现在已经成功突破了 Dynamo 的封锁!
基于以上代码,你就可以在这个 CPython
环境的服务器下,使用各种 Python
强大武器了,包括但不仅限于 Numpy,pandas等等。
在 Dynamo 中像在浏览器里一般发送接请求,就可以获得使用 CPython 计算的结果了!
在 Dynamo 中发请求:
由于 Dynamo
中的 Python 是 IronPython
,所以其发送请求的方式是使用的 .NET
的库,与 CPython 有非常大的不同,这边送上 DynamoPythonScript
中实现的代码,不对细节作过多的涉猎:
# 启用 Python 支持和加载 DesignScript 库
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
# 该节点的输入内容将存储为 IN 变量中的一个列表。
dataEnteringNode = IN
# 将代码放在该行下面
# IronPython 库的环境变量,一般在这个位置
import sys
sys.path.append('C:/Program Files (x86)/IronPython 2.7/Lib')
from System.Net import WebRequest
from System.IO import StreamReader
from System.Text import Encoding
__author__ = 'Vctcn93'
__publisher__ = 'ArchiPython'
# 服务器地址
url = r'http://127.0.0.1:5000/'
# 可在在此处对 URL 进行编辑,使其支持参数
# 发送请求
request = WebRequest.Create(url)
# 获取计算的结果
response = request.GetResponse()
result = StreamReader(response.GetResponseStream()).ReadToEnd()
# 将输出内容指定给 OUT 变量。
OUT = result
开启服务器后,你只需要对那个 URL 做一定的修改,Dynamo 就能发送请求,收到结果了。
案例
在 CPython 中有一个使用 CAPI 开发的几何库,称为 shapely
,它功能强大,运算速度极快,是目前 Python 世界中非常流行的几何库之一。绕开了 IronPython 的封锁后,你就可以通过服务器,使用 shapely 做相关的几何运算。
其运算速度一般比 Dynamo 自带电池快 1000 倍以上。
任务设计
设计一个函数,通过一条多段线(polyline)与精度(density),返回一个均分的点矩阵(matrix),写成代码如下:
def create_grid(polyline: List[list], deisty: float): -> List(list)
pass
代码
根据这个要求,你就可以开始搭建自己的服务器了,功能代码如下
import numpy as np
from flask import Flask, request
from shapely.geometry import Polygon, Point
__author__ = 'Vctcn93'
__publisher__ = 'ArchiPython'
app = Flask(__name__)
@app.route('/connect')
def connect():
return '连接成功!'
@app.route('/add')
def add():
# 拿到 URL 中的参数
a = request.args.get('a')
b = request.args.get('b')
# 将他们还原成数字
a, b = eval(a), eval(b)
# 计算
result = a + b
# 只能返回字符串
return str(result)
@app.route('/create_grid')
def create_grid():
# 获得polyline参数
polyline = request.args.get('polyline')
print(polyline)
# 获得density
density = request.args.get('density')
# 还原他们的类型
polyline, density = eval(polyline), eval(density)
# 获得图形信息
polygon = Polygon(polyline)
bbox = polygon.bounds
start_coords = bbox[:-2]
width = bbox[2] - bbox[0]
height = bbox[3] - bbox[1]
round_x = round(width / density)
round_y = round(height / density)
# 定义基本矢量
vector_right = np.array([density, 0])
vector_up = np.array([0, density])
vector_point_start = np.array(start_coords)
# 获得原始点矩阵
matrix = list()
for x in range(round_x):
for y in range(round_y):
vector_point = vector_point_start + vector_right * x + vector_up * y
point = Point(vector_point)
# 同时做判断,如果点在范围内
if polygon.contains(point):
matrix.append(point)
# 将结果输出为字符
result = [
list(p.coords)[0] for p in matrix
]
return str(result)
if __name__ == '__main__':
app.run()
在 Console 中运行这个脚本,然后你就可以在浏览器中输入参数来测试结果:
输入一个
polyline
,其几何为[[0,0],[100,0],[100,100],[0,100]]
,density
为10
,求出其结果。
接下来使用 Dynamo 完成本次请求,并获得结果:
# 启用 Python 支持和加载 DesignScript 库
—
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
# 该节点的输入内容将存储为 IN 变量中的一个列表。
dataEnteringNode = IN
# 将代码放在该行下面
# IronPython 库的环境变量,一般在这个位置
import sys
sys.path.append('C:/Program Files (x86)/IronPython 2.7/Lib')
from System.Net import WebRequest
from System.IO import StreamReader
from System.Text import Encoding
__author__ = 'Vctcn93'
__publisher__ = 'ArchiPython'
# 服务器地址
url = http://127.0.0.1:5000/
url += 'creaet_grid?'
url += 'polyline=[[0,0],[100,0],[100,100],[0,100]]&'
url += 'density=10'
# 发送请求
request = WebRequest.Create(url)
# 获取计算的结果
response = request.GetResponse()
result = StreamReader(response.GetResponseStream()).ReadToEnd()
# 将结果处理为一个个的点:
points = [Point.ByCoordinates(*coords) for coords in eval(result)]
# 将输出内容指定给 OUT 变量。
OUT = points
真正实现 0 节点运算,仅靠服务器本身完成复杂的功能,Dynamo 在整个链条中,仅仅起到了显示的作用。
复杂一点
当然,你也可以使用 Dynamo
中的 Polyline
与 NumberSlider
来完成这项计算:
1. 在 Revit 中绘制一条红线
2. 将红线导入 Dynamo 中,设置 number slider,让 Density 参数可调
3. 修改部分代码,让链接地址随参数变化而变化
4. 此时,你便会得到一个响应速度极快的,使用 CPython 实时计算的点矩阵
意义
从表面上来看,这只是一个搭建服务器使用原生 Python 的方法,对于纯建筑人员来说,或许有些许难度,而对于程序员而言,这或许并不是什么很厉害的功能。
但是,这篇教程的意义,远不止搭建个服务器这么简单,而是我认为,这是未来几年极有可能的工作方式。
在这个案例之中,原本在传统工作流中起到计算作用的 Dynamo,完全沦为了显示结果的存在,所有的计算,都在我搭建的本地服务器完成了,我这次仅仅只是引入了少量矢量库,未来极有可能会引入计算机神经引擎(举例子),众所周知,Dynamo 也好,Revit 也好,他们目前都是不支持的。
可是如果我能在任意软件使用自己开发的功能,我又何须要被他们的功能,他们的API锁死我自己的生产力?软件如果能做,则软件做;软件如果不能做,那么整个系统都可能会被时代抛弃掉!
5G时代将要来临了,人类的数据传输效率又将进入一个新的台阶,我相信云计算,一定会成为未来的主流。建筑师只需要把设计参数发送给云端,云端就能返回给你算好的结果,不再需要担心各种技术上的细枝末节的日子,将要来临了。未来他们在云上使用各种神奇的技术,也不足为奇。今天只是 Dynamo 成了我的显示端,但其实我可以用任何东西作为我的显示端,发展过于缓慢的技术,只有被淘汰的唯一命运,今天人人还趋之若鹜的技术新贵,明天就有可能被扫入历史的垃圾堆里。
这便是我不止一次的在多个场合呼吁,不要局限在软件层面,更不要被任何软件锁死的原因。
因为把别人的轮子玩得滚瓜烂熟,远不如自己掌握核心科技。
关注公众号 archipython,做一名会编程的建筑师。
Be a Architect Powered By Python
显示纯服务器_BBT三行代码搭建服务器,让Dynamo跳出IronPython的封锁相关推荐
- 手游 自建服务器,英灵神殿自己搭建服务器怎么弄
英灵神殿是一款冒险生存类游戏,在英灵神殿游戏中小伙伴要自己搭建服务器才能玩,那么要怎么搭建,有什么技巧吗?接下来和小编一起来看看吧! Valheim英灵神殿服务器搭建技巧 第一步:SteamCMD和安 ...
- 使用服务器虚拟机写代码好处,服务器虚拟化的好处
在服务器虚拟化出现之前,企业需要处理其数据中心环境中服务器消耗过多资源的问题,处理计算能力未得到充分使用的问题,处理能源费用不断飙升的问题,处理手动流程的问题,以及处理总体效率低下和系统不灵活的问题. ...
- vista服务器系统,Vista系统搭建服务器 - Apache - 数安时代(GDCA)SSL证书官网
(提示:本文的主要方法同样适用于Windows XP/2000) 自从转入Vista后,主要就是不停的尝试,看看这个被微软吹嘘的"伟大而神奇"的操作系统到底如何,一直也没做什么正事 ...
- 服务器运行环境怎么搭建,服务器运行环境怎么快速搭建?
图/文:迷神 这个主要分2类,window系统还是linux系统,另外就是什么编程语言的运行环境,每个基本上还不同的. 以常用的编程语言php为例: window系统推荐:phpStudy v8.0 ...
- 如何搭建服务器 无线传输,iOS 本地搭建服务器使用http传送(wifi快传)
1.使用第三方的框架:CocoaHTTPServer 2.调用代码,我的百度网盘 _httpserver = [[HTTPServer alloc] init]; [_httpserver setTy ...
- 三行代码搭建一个全能书籍系统(wiki)
简介 开源免费的书籍系统.风格类似掘金,支持 markdown 和富文本编辑器.支持导出 pdf,用户权限等设置.非常适合组织内部或小团体文献管理,用户需注册才能查看. 美图欣赏 编辑页面,可以切换为 ...
- tgp饥荒搭建服务器证书,饥荒tgp搭建服务器证书不存在怎么办 联机服务器证书不存在解决...
满意答案 [cpp] view plain copy #pragma once #include "D3Vector.h" #include #include class Came ...
- 宝塔服务器环境好不好_服务器环境怎么搭建?(宝塔环境搭建教程)
大家好,欢迎来到西安蓝蜻蜓网络讲坛,上期我们讲的是怎样购买服务器,很多小伙伴都知道了购买服务器的方式方法,那么购买服务器后需要怎么搭建服务器环境呢?那么今天,我们就来讲述下服务器环境怎么搭建? 以宝塔 ...
- 云端服务器跑python代码,断开后台运行
先跑到Xshell官网下载一个好用的SSH工具,推荐用:Xshell 下载网址:XSHELL - NetSarang Websitehttps://www.xshell.com/zh/xshell/ ...
最新文章
- 算法设计与分析——回溯法——装载问题
- 写代码抽取代码的技巧
- 细数SkyEye异构仿真的5大特色
- python n个list如何组成矩阵_学完Python,我决定熬夜整理这篇总结...
- 移动互联网新协议 GTP 中被曝多个高危漏洞,影响4G和5G 用户
- 小米路由3刷华硕潘多拉固件教程及软件相关
- PowerBuilder制作纸牌游戏
- 卢旺达饭店插曲--Million Voices
- android系统密码设置功能,手机锁屏设置!安卓手机锁屏密码设置技巧?
- 利用注册表更改文件默认打开方式及图标
- 【面试记录】1.给定一个由正数,负数和0组成的整数数组,将所有为0的元素,挪到数组末尾。2.给定任意一个自然数,获取它重新排列后,下一个比它大的自然数。(Leetcode 031 下一个排列)
- python如何开发网站_如何用Python写一个小网站?
- 找回密码功能实现步骤
- RINEX 3.02 版本导航文件格式说明
- 达梦数据库SQL学习
- KNN算法和sklearn中的KNN算法
- HUAWEI MateBook Fn 功能键/热键切换、设置方法
- 揭秘封包辅zhu外G:利用系统发包函数,定位功能Call(一)
- 豆瓣电影的API接口,马克一下
- 快速上手Xilinx DDR3 IP核(3)----把MIG IP核封装成一个FIFO(上)(Native接口)
热门文章
- 【C++】朝花夕拾——表达式树
- ajax跨域,json,jsonp
- HDOJ-1999 不可摸数
- 超过 40 款很有用而且很新的 jQuery 插件
- Python程序打包成.exe文件(弹窗恶搞小程序附源码)
- RGB转换cv::Mat
- Ubuntu18.04取消VIM自动备份文件
- FFmpeg4.0.2 over版本av_register_all()流程(二十九)
- 虚拟机里ubuntu扩容主分区/dev/sda1
- 一张图让你搞懂DES与RSA混合加密技术