【C#杂谈】当Grasshopper中的C# Scriptable电池遇到LinQ,抛弃Python的理由又多了一条

本文介绍了LinQ技术,它将数据库理念延伸到一般编程。对比了Python和C#在处理数据操作时的表现,指出C#使用Linq可变得很酷。详细讲解了Linq的匿名函数、Select、Where、OrderBy等方法,还强调了Linq语法可连起来使用,让数据流逻辑更清晰。

LinQ的全称Language Integrated Query,是一种将数据库理念,比如常用的查找(Select)、排序(Order By)、条件过滤(Where)等延伸到一般编程中的技术路径。

Grasshopper的日常使用其中也包含了大量数据传递/使用的过程,比如按一定规律生成一系列点、将一系列直线按某种条件过滤掉等。虽然Grasshopper自带的运算器可以实现这些功能,但是有时候需要拖入大量的电池来实现一个简单的过滤逻辑。比如要从一堆点里选出X坐标大于1且小于5的点,如果只使用Grasshopper自带的电池,就需要用到下列的电池组

在这里插入图片描述

这时候Python就能派上大用场了:使用Python电池,一行就搞定了

	a = [pt for pt in x if pt.X > 1 and pt.X < 5]

在这里插入图片描述
虽然,C# Scriptable电池也能做得到这一点…… 但是这代码量可能就得多一点了

	var list = new List<Point3d>();
    foreach (var item in x)
      if (item.X > 1 && item.X < 5)
        list.Add(item);
    A = list;

在这里插入图片描述
所以,很多时候,对于这类纯粹的数据操作(不涉及到几何运算、复杂对象操作)而言,Python往往获得了更多的人的青睐 —— 既能少写代码,又能让代码看起来更酷,列表生成式的逻辑表达也十分清楚。

反观C#的代码,foreach循环套一个if条件判断,代码量比Python多,看起来也平平无奇,没有亮点嘛。


但是,C#真的如此吗?


加上System.Linq命名空间,C#也能变得很酷:

using System.Linq;
// ... ...
 A = x.Where(pt => pt.X > 1 && pt.X < 5);

在这里插入图片描述

下面是过滤处理100,000个数据点时,各个代码的效率对比,作为对照组,下面两个电池不做过滤,直接原路输出数据,作为对照。

在这里插入图片描述
Python的对照组居然比过滤后需要的时间更多?这是因为Python电池在运行时需要把来自Grasshopper内置的对象转换成为Python对象之后,才能在Python电池里处理,然后在输出时又要转回Grasshopper的对象,这需要对象被转换两次。因为过滤后的点的数量会变少,所以转换对象数量变少了,电池的运行时间就会变短。

Grasshopper本身就是C#写的,所以C# Scriptable电池在使用过程中不存在类似于Python一样的对象转换的过程,因此直接将点的列表原封不动地传出所需要的时间更少。



using System.Linq;

哪里能用Linq?

System.Linq命名空间里包含了对IEnumerable接口的一系列的扩展方法,只要对象遵循IEnumerable接口(你能想到的所有的存储多个对象的存储结构都会遵循这个接口,比如ListArrayDictionaryStackQueue、……),都能直接使用Linq。

换句话说,无论哪都能用Linq,只要你想。

匿名函数

匿名函数又叫Lambda函数,语法为

在Tekla Structures 18.1中,通过GrasshopperC#脚本创建折梁结构需要结合Grasshopper与Tekla Structures API进行数据交互。以下是一个完整的实现思路和示例代码,帮助用户在Tekla中创建一个自定义的折梁结构。 ### 创建折梁的逻辑流程 1. **获取点集**:利用Grasshopper输入组件或Tekla的Picker工具获取个点,这些点将用于定义折梁的轮廓。 2. **构建折梁对象**:使用Tekla Structures API创建`PolyBeam`对象,并为其设置几何属性(如截面、材质等)。 3. **提交模型更改**:完成创建后,调用`CommitChanges()`方法将新创建的折梁提交到Tekla模型中。 ### 示例代码 ```csharp using Tekla.Structures.Model; using Tekla.Structures.Geometry3d; using Tekla.Structures; using System.Collections; public class CreatePolyBeam { public static void Run() { // 初始化模型和用户选择工具 Model model = new Model(); Picker picker = new Picker(); // 提示用户选择个点以定义折梁轮廓 ArrayList pickedPoints = picker.PickPoints(Picker.PickPointEnum.PICK_POLYGON, "选择折梁轮廓点"); ArrayList contourPoints = new ArrayList(); // 将选中的点转换为ContourPoint对象 foreach (Point point in pickedPoints) { ContourPoint contourPoint = new ContourPoint(point, new Chamfer()); contourPoints.Add(contourPoint); } // 创建折梁对象并设置属性 PolyBeam polyBeam = new PolyBeam(); polyBeam.Contour.ContourPoints = contourPoints; polyBeam.Profile.ProfileString = "HN300*150*6.5*9"; // 设置截面规格 polyBeam.Material.MaterialString = "Q235B"; // 设置材料 polyBeam.Class = "11"; // 设置构件类别 // 插入折梁到模型中 polyBeam.Insert(); model.CommitChanges(); // 提交更改到模型 } } ``` ### 关键代码说明 - `Picker`类允许用户在Tekla界面中手动选择点,这些点将作为折梁的顶点。 - `ContourPoint`类表示折梁轮廓上的每个点,并可以附加倒角信息。 - `Profile.ProfileString`用于指定截面类型,例如“HN300*150*6.5*9”代表H型钢的具体尺寸。 - `Material.MaterialString`定义了钢材的材质,例如“Q235B”是一种常用的碳素结构钢。 - `polyBeam.Insert()`方法将折梁插入到当前模型中,随后调用`model.CommitChanges()`确保更改生效[^4]。 ### 数据流整合 在Grasshopper中,可以通过输入参数传递点坐标,而不是直接使用`Picker`类让用户手动选择点。这样可以在Rhino/Grasshopper环境中预先定义点集,再通过C#脚本传递给Tekla Structures,从而实现自动化的折梁生成。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值