
C#
文章平均质量分 91
有关C#的编程应用
几何螃蟹
Wonder is mother of all science.
展开
-
【Grasshopper基础15】“右键菜单似乎不太对劲”
距离上一篇文章已经过去了挺久的,很长时间没有写GH基础部分的内容了,原因其一是本职工作太忙了,进度也有些落后,白天工作累成马,回家只想躺着;其二则是感觉GH基础系列基本上也介绍得差不多了,电池二次开发的一些基本操作(功能/外观)都介绍得差不多了,再加上前几期写的数据类型,这基本上就囊括了所有二次开发需要用到的内容。不过,理论知识和实践总归是有一些差距的,在优快云上还是会偶尔收到私信问一些细节问题的二开爱好者们。原创 2023-08-29 17:46:42 · 1776 阅读 · 8 评论 -
【杂谈】“CommunityToolkit.Mvvm无法自动生成Get/Set属性对”的解决方案
CommunityToolkit.Mvvm不起作用无法生成属性?一起来解决吧。原创 2023-03-14 13:48:58 · 1822 阅读 · 2 评论 -
【杂谈】一个快速的C#代码学习环境(Jupyter Notebook 中跑 C# 代码)
JupyterNotebook里执行C#代码,快速学习、测试特性原创 2022-11-11 15:00:54 · 2330 阅读 · 3 评论 -
【Grasshopper基础11】如何在GH电池上增加一个自己的按钮
作者:“咕咕咕?下一篇马上就写好了”通过上一篇【基础10】的文章,大家已经了解到一个GH电池在画布上的样式是由其背后的 GH_Attribute 类实例来决定的,而大部分的GH电池都使用了它的一个派生类 GH_ComponentAttribute 来配置电池的外观。今天我们就继续上一篇的内容,通过它来给我们的电池配置一个按钮,当我们的按钮被按下去的时候,可以切换我们今天例子中电池的工作模式。首先我们来介绍一下今天的例子,它将会是一个简单的求 某个数的平方根 的电池:public class SqrtR原创 2021-09-13 15:52:12 · 4466 阅读 · 15 评论 -
【C#杂谈】实现主线程UI在执行后台任务时不卡顿,除了await之外,还有IEnumerable了解一下?
记录一下今天用IEnumerable解决一个窗体更新的问题。这个技术也应该是Unity来实现Delay的方法吧,印象中Unity的WaitForXX系列延时函数就是返回的IEnumerable,当时还觉得这是个蛇皮操作,没想到,自己在开发中用上了… 这种灵光乍现的感觉还挺好的。剧透:这篇文章居然又扯到了 多线程 / 协程 / 异步,做前端还真就是离不开这些概念。...原创 2021-07-29 06:08:27 · 2164 阅读 · 0 评论 -
【Grasshopper进阶】在Grasshopper画布上实现动画效果
最近笔者为了能够做到对用户友好,深入地学习了一些前端的知识,等回过神来,发现已经好久没有在优快云上更过东西了… 结合最近看到的某些前端框架的底层,突然想到为什么不在Grasshopper上玩动画呢?比如电池拖出来之后,缓缓变形,然后出现一些UI的元素。本来已经做好了手动写 Timer 或者写个线程循环来操作,结果人家Grasshopper自带这些个做动画必备的东西,那就简单了,抱着试试看的态度,完成了一个好玩的动画效果。就如同文章最开始的 gif 动画一般。下面就 “简单” 介绍一下如何在Grass.原创 2021-07-07 18:12:34 · 2613 阅读 · 24 评论 -
【Grasshopper基础10】GH_Attribute简介 —— 自定义电池样式的终极后台
距离上次的【基础9】已经过去了又有差不多1个月了,工作上的事情越来越多,能抽出空来(主要是要找到“有空并且有舒适的心情来写”的时间挺难的…)的时间也变少了。笔者最近在做的工作跟Grasshopper本身也没有特别多的联系,但是对于Grasshopper的兴趣还是依然存在,这也是笔者能够一直坚持这个系列创作的最重要的原因吧,希望平日大家在设计工作之余,也能做出更多好玩有意思的东西来。好了,闲话少说,【基础1~9】基本上可以算是把GH_Component这个类能做的所有事情都囊括了进去,这其中包括了数据的类型原创 2021-04-23 16:13:17 · 4712 阅读 · 10 评论 -
【Grasshopper基础9】添加右键菜单
其实经过【基础2】~【基础6】、以及【基础8】的内容,几乎所有插件的后台数据处理流程都可以实现了(往往也是最关键的业务核心内容):从RegisterInputParam和RegisterOutputParam中注册数据的入口和出口在SolveInstance中处理及传递数据在Read和Write中进行数据的序列化与反序列化这也是为什么很多时候,目前大部分的GH教程也是大致到这个节点步骤就结束了。因为依靠这些内容,一套完整的业务逻辑可以完成,无非就是电池样子长得平平无奇一点嘛。不过,很多时候我们原创 2021-03-31 18:00:26 · 2367 阅读 · 21 评论 -
【Grasshopper进阶】Grasshopper外部调用
本文主旨是介绍“进程间通讯”在Grasshopper中的应用。常用场景:手头已经有一个程序,这个程序想控制Grasshopper画布中某些组件进行一些数据操作,这个程序是独立Rhino和Grasshopper之外运行的。从另一个程序来控制 Grasshopper 中的组件。进程之间通讯Windows平台下,进程间通讯称为“Interprocess Communications”,具体详见msdn文档,有多重实现模式,在此就不赘述了:https://docs.microsoft.com/en-us原创 2021-03-05 18:11:57 · 4732 阅读 · 15 评论 -
【C#杂谈】当Grasshopper中的C# Scriptable电池遇到LinQ,抛弃Python的理由又多了一条
LinQ的全称Language Integrated Query,是一种将数据库理念,比如常用的查找(Select)、排序(Order By)、条件过滤(Where)等延伸到一般编程中的技术路径。Grasshopper的日常使用其中也包含了大量数据传递/使用的过程,比如按一定规律生成一系列点、将一系列直线按某种条件过滤掉等。虽然Grasshopper自带的运算器可以实现这些功能,但是有时候需要拖入大量的电池来实现一个简单的过滤逻辑。比如要从一堆点里选出X坐标大于1且小于5的点,如果只使用Grasshopp原创 2021-02-25 14:03:44 · 1301 阅读 · 8 评论 -
【Grasshopper基础8】电池的序列化与反序列化 Serilization of Grasshopper Component
这篇文章的内容是介绍GH_Component中另外一对可以被 override 的函数:ReadWrite当我们在自己的电池中直接 override 时,Visual Studio会帮我们添加基类实现:public override bool Read(GH_IReader reader){ return base.Read(reader);}public override bool Write(GH_IWriter writer){ return base.Write原创 2021-02-20 03:56:23 · 3578 阅读 · 8 评论 -
【Grasshopper基础7】如何重写Grasshopper电池的预览 DrawViewportWires / DrawViewportMeshes
经过【基础1~6】的介绍,相信大家对Grasshopper电池的开发的框架已经大致了解了。无论是在电池上修改原有功能还是增加新的功能,都是通过继承自GH_Component类,再在其基础上要么override原来的默认实现,要么就是继承新的接口。在这里对前面的内容小小地总结一下:一个自定义GH电池必须实现的overrides有RegisterInputParams // 用于注册输入参数RegisterOutputParams // 用于注册输出参数SolveInstance // 用于真正实现电原创 2021-02-09 16:35:14 · 3067 阅读 · 19 评论 -
【Grasshopper基础6】输入/输出参数可变的电池 / 如何让电池支持参数增加和减少
相信大家一定在Grasshopper中见过输入或者输出参数可以自由变化的电池,例如,笔者常用的电池“Entwine”就可以在电池的输入端添加一个参数或者减少参数,用来支持更多的电池接入,如下图所示。如果我们想要在电池中实现这样的功能,应该要怎么做呢?本文包含C#语言中的“接口(interface)”的概念,如果你对接口的概念还不是特别清楚的话,可以参考更多优快云资料: 搜索 “C# 接口”MSDN官方C#文档: 接口编程指南文章最后有电池的cs源码。声明实现 IGH_VariableP原创 2021-01-27 18:41:50 · 6190 阅读 · 5 评论 -
【Grasshopper基础5】在GH里看基金? —— 简单电池项目实战
经过前面【Grasshopper基础1~4】的介绍,相信读者已经了解了如何在Visual Studio里创建电池、如何获取数据、如何传出数据。那么在了解这些原理之后,就让我们来一起实现一个小的项目,来看看一个电池从头到尾到底如何制作吧。正如标题中所述的,我们今天就来做一个 “在GH里看基金净值” 的小电池,大致就是实现一个“给定基金代码,通过网络API调用获取基金净值信息,并输出该基金的所有净值信息”。要实现这个功能,首先我们需要首先进行需求分析,然后确定实现的逻辑,最后进行代码编写和简单的测试。需原创 2021-01-24 17:32:11 · 2444 阅读 · 9 评论 -
【Grasshopper基础4】如何在同一个项目中添加多个电池
笔者在前文中已经介绍了如何使用Grasshopper(一下简称GH)模板搭建一个电池组件项目,并进行一些简单的项目配置,相信各位读者已经在进行各种自定义功能电池的开发了。不过,随着想要制作的电池的增多,每次都从项目模板创建新电池的话,会导致有许许多多的项目存在。倘若这些电池都是服务于同一个目的,将这些电池分散在不同的项目会导致不太方便管理。其次,对于这些电池如果使用到了一些共同的依赖项,还需针对每个项目重新配置一遍,十分费时费力。如何 在同一个项目中实现多个电池 ?从项目模板中创建的但却一直被我们忽略的原创 2021-01-20 15:58:03 · 4910 阅读 · 10 评论 -
【Grasshopper基础3】在SolveInstance中获取数据和传出数据
在RegisterInputParams和RegisterOutputParames中添加数据的输入端/输出端之后的下一步就是我们如何在电池的SolveInstance中拿到我们的数据并进一步处理了。我们先来看看SolveInstance方法重写(override)时的方法定义protected override void SolveInstance(IGH_DataAccess DA) { }方法的传入参数为IGH_DataAccess接口类,返回类型void。当看到返回类型是void时我们就想到原创 2021-01-13 18:47:33 · 3780 阅读 · 5 评论 -
【C#杂谈】异步与多线程的区别与联系 async / await / multithreading
关于异步与多线程,笔者在刚接触的时候一直存在诸多疑惑,甚至一度以为这俩概念是用来描述同一种技术在不同场景下的应用,进而导致对很多与它们相关的概念都一知半解,代码中的async/await关键词也是莫名其妙地在用。但是在不断地接触这类概念(因为现在的场景中异步与多线程几乎无处不在)的过程中,还是不断地修正了这种思维。代码写起来也顺手多了。所以这篇文章也是有感而发,在去年的时间里因为多线程和异步踩了不少雷,希望能够给大家做一点简单的解释和区分把。TL, DR: 请参照文章最后的例子 :)多线程是什么多原创 2021-01-06 00:24:21 · 6865 阅读 · 2 评论 -
【Grasshopper基础2】Grasshopper电池的输入和输出不是那么详的解/进一步了解Params
我们在之前已经介绍过了如何创建自己的第一个电池,其中里面提到了我们制作的大部分电池都需要至少完成下面三个部分的代码RegisterInputParamsRegisterOutputParamsSolveInstance其中 RegisterInputParams 和 RegisterOutputParams 是用来声明电池的输入和输出的两个部分,重要程度不言而喻,本文我们就来看看他们俩到底是什么。进一步认识RegisterInputParam和RegisterOutputParamsPar原创 2020-12-23 15:40:21 · 11038 阅读 · 7 评论 -
【Grasshopper进阶】强制Grasshopper电池输入/输出参数数据结构扁平化 (i.e. Flatten/拍平/展开…)
我们都知道,Grasshopper中一个很重要的概念就是数据结构,把数据输入到电池某个端口时,根据数据的结构的不同(列表/数据树),电池对数据会做出不同的响应。这也是为什么在我们在Grasshopper中进行参数化建模时,经常会使用到电池两端输入/输出参数的几个改变数据结构的选项 —— Flatten 和 Graft。我们在任何一个Grasshopper电池的输入、输出端参数上,或者是某个数据存储电池上点击鼠标右键,都会看到一个菜单弹出,里面包含了几种改变数据结构的选项。这种数据结构的快速改变的确会方原创 2020-12-17 13:32:53 · 4988 阅读 · 1 评论 -
【Grasshopper基础1】怎样制作一个Grasshopper电池 / 二次开发基础
本文旨在介绍如何使用C#编写一个Grasshopper内的Hello World电池,包括如何使用和安装Grasshopper电池模板,如何配置Visual Studio来生成.gha电池,如何配置Grasshopper以识别编译的电池,如何Debug等。后续章节会讲到如何配合多个电池、多个项目、多个Rhino/Grasshopper SDK。以下Grasshopper简称GH。如何制作一个Grasshopper电池制作Grasshopper电池的主要步骤及准备工作安装GH电池项目模板并创建一原创 2020-12-15 17:42:05 · 21668 阅读 · 21 评论 -
【Grasshopper进阶】TaskCapableComponent vs Parallel.For 该怎么选?Grasshopper多线程进阶
TaskCapableComponent vs Parallel.For 该怎么选?在Rhino6更新之后,Grasshopper加入了一个新的API —— TaskCapableComponent,使得电池对多线程有了更深度的支持。官方也早在2018年就做了文档和简单的例子,让大家能够更好的针对使用这个组件进行开发(官方例子链接)。以下Grasshopper简称GH不过官方的例子有点奇怪,为什么我算一个斐波那契数列还要多线程?这玩意儿多线程有啥意义?再进一步说,由于GH的整个画布的单线程架构,我在这原创 2020-12-09 18:48:51 · 1437 阅读 · 10 评论 -
【杂谈】关于EntityFramework(EntityFrameworkCore)的一些思考
关于EntityFramework(EntityFrameworkCore)的一些思考以下EntityFramework简称EF。Asp.net框架里里提供了一种将数据库语言直接糅合到程序语言C#中的方法:利用EF NuGet包,正确设置connection string之后可以直接以C#语言(大部分是Linq)来直接对数据库访问。这种方式省却了许多手动设置SQL语句、拼合字符串的时间,但笔者在最开始学习和尝试使用EF的时候却时常感觉到一知半解,因为EF功能强大,所以需要学习的内容特别多。YouTub原创 2020-12-08 17:44:44 · 362 阅读 · 1 评论