版本繁多的 Python

Python 有基于不同的实现方式,有多个版本,比如 CPythonJythonRPythonIronPython 等等。

不过,一般我们口中所说的 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]]density10,求出其结果。

接下来使用 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 中的 PolylineNumberSlider 来完成这项计算:

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的封锁相关推荐

  1. 手游 自建服务器,英灵神殿自己搭建服务器怎么弄

    英灵神殿是一款冒险生存类游戏,在英灵神殿游戏中小伙伴要自己搭建服务器才能玩,那么要怎么搭建,有什么技巧吗?接下来和小编一起来看看吧! Valheim英灵神殿服务器搭建技巧 第一步:SteamCMD和安 ...

  2. 使用服务器虚拟机写代码好处,服务器虚拟化的好处

    在服务器虚拟化出现之前,企业需要处理其数据中心环境中服务器消耗过多资源的问题,处理计算能力未得到充分使用的问题,处理能源费用不断飙升的问题,处理手动流程的问题,以及处理总体效率低下和系统不灵活的问题. ...

  3. vista服务器系统,Vista系统搭建服务器 - Apache - 数安时代(GDCA)SSL证书官网

    (提示:本文的主要方法同样适用于Windows XP/2000) 自从转入Vista后,主要就是不停的尝试,看看这个被微软吹嘘的"伟大而神奇"的操作系统到底如何,一直也没做什么正事 ...

  4. 服务器运行环境怎么搭建,服务器运行环境怎么快速搭建?

    图/文:迷神 这个主要分2类,window系统还是linux系统,另外就是什么编程语言的运行环境,每个基本上还不同的. 以常用的编程语言php为例: window系统推荐:phpStudy v8.0 ...

  5. 如何搭建服务器 无线传输,iOS 本地搭建服务器使用http传送(wifi快传)

    1.使用第三方的框架:CocoaHTTPServer 2.调用代码,我的百度网盘 _httpserver = [[HTTPServer alloc] init]; [_httpserver setTy ...

  6. 三行代码搭建一个全能书籍系统(wiki)

    简介 开源免费的书籍系统.风格类似掘金,支持 markdown 和富文本编辑器.支持导出 pdf,用户权限等设置.非常适合组织内部或小团体文献管理,用户需注册才能查看. 美图欣赏 编辑页面,可以切换为 ...

  7. tgp饥荒搭建服务器证书,饥荒tgp搭建服务器证书不存在怎么办 联机服务器证书不存在解决...

    满意答案 [cpp] view plain copy #pragma once #include "D3Vector.h" #include #include class Came ...

  8. 宝塔服务器环境好不好_服务器环境怎么搭建?(宝塔环境搭建教程)

    大家好,欢迎来到西安蓝蜻蜓网络讲坛,上期我们讲的是怎样购买服务器,很多小伙伴都知道了购买服务器的方式方法,那么购买服务器后需要怎么搭建服务器环境呢?那么今天,我们就来讲述下服务器环境怎么搭建? 以宝塔 ...

  9. 云端服务器跑python代码,断开后台运行

    先跑到Xshell官网下载一个好用的SSH工具,推荐用:Xshell 下载网址:XSHELL - NetSarang Websitehttps://www.xshell.com/zh/xshell/ ...

最新文章

  1. 算法设计与分析——回溯法——装载问题
  2. 写代码抽取代码的技巧
  3. 细数SkyEye异构仿真的5大特色
  4. python n个list如何组成矩阵_学完Python,我决定熬夜整理这篇总结...
  5. 移动互联网新协议 GTP 中被曝多个高危漏洞,影响4G和5G 用户
  6. 小米路由3刷华硕潘多拉固件教程及软件相关
  7. PowerBuilder制作纸牌游戏
  8. 卢旺达饭店插曲--Million Voices
  9. android系统密码设置功能,手机锁屏设置!安卓手机锁屏密码设置技巧?
  10. 利用注册表更改文件默认打开方式及图标
  11. 【面试记录】1.给定一个由正数,负数和0组成的整数数组,将所有为0的元素,挪到数组末尾。2.给定任意一个自然数,获取它重新排列后,下一个比它大的自然数。(Leetcode 031 下一个排列)
  12. python如何开发网站_如何用Python写一个小网站?
  13. 找回密码功能实现步骤
  14. RINEX 3.02 版本导航文件格式说明
  15. 达梦数据库SQL学习
  16. KNN算法和sklearn中的KNN算法
  17. HUAWEI MateBook Fn 功能键/热键切换、设置方法
  18. 揭秘封包辅zhu外G:利用系统发包函数,定位功能Call(一)
  19. 豆瓣电影的API接口,马克一下
  20. 快速上手Xilinx DDR3 IP核(3)----把MIG IP核封装成一个FIFO(上)(Native接口)

热门文章

  1. 【C++】朝花夕拾——表达式树
  2. ajax跨域,json,jsonp
  3. HDOJ-1999 不可摸数
  4. 超过 40 款很有用而且很新的 jQuery 插件
  5. Python程序打包成.exe文件(弹窗恶搞小程序附源码)
  6. RGB转换cv::Mat
  7. Ubuntu18.04取消VIM自动备份文件
  8. FFmpeg4.0.2 over版本av_register_all()流程(二十九)
  9. 虚拟机里ubuntu扩容主分区/dev/sda1
  10. 一张图让你搞懂DES与RSA混合加密技术