土木在线论坛 \ 建筑结构 \ 结构设计软件 \ 又又又又再一次创建Grasshopper电池

又又又又再一次创建Grasshopper电池

发布于:2021-02-01 11:42:01 来自:建筑结构/结构设计软件 0 263 [复制转发]

小编在前年 (时间过的真快) 已经介绍了如何使用Grasshopper(以下简称GH)模板搭建一个电池组件项目《 制作你的第一个grasshopper电池 》,并进行一些简单的项目配置,估摸着各位看官已经熟悉各种自定义功能电池的开发了。

不过,随着想要制作的电池的增多,每次都从项目模板创建新电池的话,会导致有许许多多的项目存在。倘若这些电池都是服务于同一个目的,将这些电池分散在不同的项目会导致不太方便管理。其次,这些电池如果使用到了一些共同的依赖项(Dependencies),还需针对每个项目重新配置一遍,十分费时费力。

同时,我们也收到了许多群里小伙伴有关于公众号文章的反馈,很多也是关于Grasshopper电池制作的问题,列如下面两个问题就是被问的比较多的问题之二:

  • 如何  在同一个项目中实现多个电池  ?

  • 从项目模板中创建的但却一直被我们忽略的 “  ...Info.cs  ” 文件到底是用来干什么的?

本文就为各位小伙伴们解答这两个问题。


如何在同一个Visual Studio项目中实现多个电池

比起直接说步骤,小编还是先来说说 我们 自己写的电池是如何被GH识别的  吧,这样可以更方便大家理解,俗话说得好,授人以鱼不如授人以渔嘛。

大家在 《 制作你的第一个grasshopper电池 》 一文中已经了解到了,每一个GH电池项目最终都会编译成为一个  DLL类库  ( 不是gha吗? 其实gha就是换了后缀名的DLL )文件。

而在调试之前,我们也在 Rhino 中通过设置命令将这个DLL类库的文件夹所在地址放入到了GH的某个设置中( GrasshopperDeveloperSettings )。再结合我们所有自定义电池都是继承自  GH_Component  类,那么GH识别电池的逻辑也就十分简单了:

  1. 在给定的文件夹中搜索类库,并动态加载

  2. 将所有是 GH_Component 子类的类使用反射(Reflect)获取

  3. 在电池被拖入画布时,使用Activator实例化对象

实际上第二点的描述不是完全准确的。准确地来说,只要是实现了GH框架中的 接口   IGH_DocumentObject  的类均会被GH获取,因此其中某些其他 直接继承  自 GH_Component 的类也会被GH在运行时认可成为电池。
但是因为从 IGH_DocumentObject 到 GH_Component    中间有许多层类继承和接口实现,较为复杂,小编就不在此处展开了。几乎95%的电池都是通过直接继承 GH_Component 类来实现的。 既然大部分时候电池都是通过继承 GH_Component 来实现,所以目前这样理解较为直观。

于是,在同一个项目中实现多个电池的思路也十分简单 ——  在项目中添加继承自  GH_Component  的类即可 (在同一个文件中添加类,亦或是添加类在一个新文件中均可)。

例如,在同一个 .cs 文件中定义  2  个继承自  GH_Component  的类即可实现在同一个文件中做出  2  个GH电池(类必须具备  public  属性):






































namespace MyGhComponents { public class MyFirstComponent : GH_Component { // 构造方法必须提供额外属性,否则GH无法成功创建电池 public MyFirstComponent() : base("First Component", "FC", "Dummy for first component", "Params", "Best Digital Crab"){} // Guid属性必须实现,https://guidgenerator.com/ 可以免费获取 // 就如同前文提到的,永远不要手动创建Guid // Like mentioned before, NEVER create Guid manually. public override Guid ComponentGuid => new Guid("********-****-****-****-********2213");  // ... 具体实现略 } public class MySecondComponent : GH_Component { // 构造方法可以使用模板中默认的(调用base方法),如同MyFirstComponent一样 // 也可以通过自定义赋值来实现,但必须保证下列属性有赋值,否则电池无法创建 // Name, NickName, Description, Category, SubCategory public MyFirstComponent() { Name = "Second Component"; NickName = "SC"; Description = "Another way of providing basic descriptive information of component"; Category = "Params"; SubCategory = "Best Digital Crab"; } public override Guid ComponentGuid => new Guid("********-****-****-****-********9981"); // ... 具体实现略 }}

运行项目,就会发现GH中出现了2个新电池。

于是我们也明白了,GH在加载的过程中,那个绿色的小框框是搁这反射 ?还特意告诉大家我正在反射获取  xxxxComponent  ...

所以更进一步的,为什么在前文配置调试环境中设置  GrasshopperDeveloperSettings  时,需要把  Memory load *.gha assemblies ...  前面的复选框去掉勾选的原因就是,我们的在调试时的断点都是在dll文件中的,如果GH把我们写好的电池类dll都读到内存中去了,dll文件上的断点就没法被触发了,自然就没法调试了。

说了这么多,相信大家也明白GH是怎么认识电池的了,也明白了我们应该做什么可以让GH认识到我们写的电池 —— 无论以什么形式,往项目中添加继承自  GH_Component  的类即可。

另外,也向大家推荐另一种方便的方式在Visual Studio里往自己的GH电池项目中添加电池类(前提是安装了GH的官方模板):

1. 在项目管理器中找到项目,点击右键,选择添加新类

2. 在弹出的窗口中其实就已经可以找到GH电池的模板了,将文件名改成自己喜欢的名字,确认添加即可



【特别提醒】 !!  千万不要手改Guid  !! 

使用Guid生成器 !! 项目模板自动生成的也可以 !!


模板中 xxxxInfo.cs 文件是做什么的

有了前文的经验,我们首先来看看这通过模板创建的 xxxxInfo.cs 文件包含了个继承自什么的类。






















namespace MyGhComponents{ public class MyFirstComponentInfo : GH_AssemblyInfo { public override string Name  { get {  // ... } } public override Bitmap Icon { get { // .... } } // .....  }}

这  GH_AssemblyInfo  是什么东西?

在.NET环境中,Assembly可以认为是一个组件,一群独立的工具拼装在一起服务于一个最终项目,即一个  DLL  。 GH_AssemblyInfo  这个类就是用来对这个DLL附带一些额外的信息,用于在某些别的地方展示。也就是说,这个类是用来对我们某一些电池组成的电池工具包做一个总说明和展示。


在哪里展示呢?

在Grasshopper中的菜单栏中找到 Help -> About,在弹出的类似于载入窗口的绿色长方形中,左上角有个特别小的黑色方块,点击它,就会出现许许多多小图标,而这个  GH_AssemblyInfo  就是为这个小图标提供图标信息和鼠标悬停信息展示。



如果GH在使用反射(Reflect)获取DLL信息时,没找到这个DLL中包含有继承自  GH_AssemblyInfo  的类,那么它就会从其他的能够被识别的类里按某个顺序挑一个类作为这个信息的提供者,但仅仅提供名字,不会包含图标。此时,上图中许许多多的绿色六边形的图标就是这些 “ 做了电池但没提供总信息 ” 的电池Assemblies的替代图标。

所以,只要你不担心其他人在点开这个About信息左上角的小黑块时看到自己做的电池套餐居然是个很丑的绿色六边形图标,你甚至可以把这个  xxxxInfo.cs  文件直接从项目中去除掉,电池依然是可以正确运行的。


好了,今天小编就为大家分享到这里了,有更多的问题的话欢迎进群讨论哦!

评论帖子
评论即可得
+1经验值
+1土木币

请先 登录,再参与讨论!

这个家伙什么也没有留下。。。

结构设计软件

返回版块

41.48 万条内容 · 170 人订阅

猜你喜欢

阅读下一篇

什么是5G CPE,5G工业级CPE的功能特点

什么是CPE?首先,它是“Customer Premise Equipment”的缩写,翻译过来就是“客户终端设备”。5G网络的出现似乎为解决光纤入户问题带来了新的解决方案。毕竟5g网络的超高速已经接近甚至超过了现有的家庭宽带网速。运营商不需要向用户拉光纤,他们只需要为家庭配备一台5G CPE设备,为家庭提供高速上网服务。因为工业5G CPE设备相当于5G工业路由器。它一方面将5G网络信号转换成WiFi信号进行传输,另一方面将WiFi网络接收到的数据转换成5G网络信号进行上传。这样,即使我们的智能手机和笔记本电脑不支持5G网络,也能体验到5G带来的高速网络。

回帖成功

经验值 +10