本帖最后由 huaxiamengqing 于 2014-11-3 13:13 编辑
在国内搞gha开发的人很少,很多人都劝我说国内没市场,搞了没什么意义,自己用就行了。 但我却不这样认为,学习软件如果你不搞到底层,你就是学了个皮毛,可悲的是,很多认为这些皮毛就是精通了,就够用了,就可以自称大神。在国内的确是这样,因为大部分人都只理解到这个程度,相比更大大部分人不懂当然可以称之为大神--,这正验证了我喜欢的一句话“不是无知,是对无知的无知才是知的死亡!"。 实际上何止是Grasshopper,我就拿大家都熟悉的CAD说事,能到开发层面的设计人员有多少?或许你说明经论坛里面很多,但是就我的认知范围内,我们进入国内500强的大公司真正懂CAD开发的人不到5%。或许你在笑,哈哈,正好我都用不上CAD这些东西。但是你总要用到Excel,Word吧,懂VBA开发的,数据库开发的财务人员有多少我不清楚,但是我知道我们的财务总监是懂的。 在这个大学生遍地的年代,在这个大部分人还在用CAD勤勤恳恳画图,自觉对比以前多么方便的年代,如果我们懂一种开发语言,那该是有多么大的优势啊! 或许你不以为然,但国外已经将编程用到了很多领域,而我们很多领域的技术专家却什么都不懂....举个例子论坛里面的DanielJin还是个大四的学生就创办了自己的gh网站,开设了500多人的QQ群,这对于一个大四的学生来说是很难得的,我很困惑,因为中国式的教育教出来的不应该是这样的学生,我问他为何有如此高的认知度,他说他在国外留学过两年,发现很多人都在用。一语道破,真希望国内多出现点这样的人。很多NCF的代码大神,都在国外留学过。到这里还看不明白吗?如果你不懂代码,那么就跟着人家屁股后走吧,今天一个同事问我,gh电池的精度是否为犀牛本身的精度,我说不一定,人家怎么写你怎么用。我们今天来探讨一下,下图的切割精度,看看后台究竟是如何写的。 目测上图,一个BrepBrep相交线电池,和一个SolidBoolean电池以及TrimSolid电池出现了矛盾,图中明显相交线和切割边缘没有重合(很多人猜是精度问题,但这里是显示问题,下面代码将说明精度没有任何问题)。 我们先来看看SolidBoolean电池的精度, 电池里面有这样一段代码:
- Dim collection As Brep() =Brep.CreateBooleanDifference(New Brep() { brep }, New Brep() { cutter },GH_Component.DocumentTolerance)
- If ((collection Is Nothing) OrElse (collection.Length = 0)) Then
- list.Add(brep)
- Else
- list.AddRange(collection)
- End If
复制代码
我们可以看到布尔用到的精度为 GH_Component. DocumentTolerance这个东西我们用脚本代码,就是脚本电池可以访问的姑且叫他精度DT吧, 再看一下Trim Solid电池
- Dim intersectionTolerance As Double =GH_Component.DocumentTolerance
- Dim data As New List(Of Brep) From { destination }
- Dim brep2 As Brep
- For Each brep2 In list2
- If (Not brep2 Is Nothing) Then
- Dim list3 As New List(Of Brep)
- Dim brep3 As Brep
- For Each brep3 In data
- Dim brepArray As Brep() = brep3.Split(brep2, intersectionTolerance)
- If ((brepArray Is Nothing) OrElse (brepArray.Length = 0)) Then
- list3.Add(brep3)
- Else
- Dim brep4 As Brep
- For Each brep4 In brepArray
- If Not Me.IsInside(brep4, brep2, intersectionTolerance) Then
- list3.Add(brep4)
- End If
- Next
- End If
- Next
- data = list3
- End If
- Next
复制代码
精度同样是DT.
然后我们看一下BrepBrep相交线的代码 - If Not Intersection.BrepBrep(destination, brep2,GH_Component.DocumentTolerance, intersectionCurves, intersectionPoints) Then
- MyBase.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Intersectionfailed")
- Else
- If ((Not intersectionCurves Is Nothing) AndAlso (intersectionCurves.Length >0)) Then
- Dim data As Curve() = Curve.JoinCurves(intersectionCurves, (0.5 *GH_Component.DocumentTolerance))
- If ((Not data Is Nothing) AndAlso (data.Length > 0)) Then
- DA.SetDataList(0, data)
- Else
- DA.SetDataList(0, intersectionCurves)
- End If
- Else
- DA.SetDataList(0, Nothing)
- End If
- DA.SetDataList(1, intersectionPoints)
- End If
复制代码
我们发现,相交用的精度也是DT Intersection.BrepBrep(destination,brep2, GH_Component.DocumentTolerance, intersectionCurves, intersectionPoints) 接下来我们看 Dim data As Curve() =Curve.JoinCurves(intersectionCurves, (0.5 * GH_Component.DocumentTolerance)) 获取相交线组合0.5*DT,我们知道,精度越小越好,所以这里作者别具用心的将精度用了0.5倍,保证组合的线不会出问题。假设我们的DT=1mm那么上面的相交切割都不会出现1mm一下的线,那么组合的时候使用0.5mm的精度就可以完全不出现误差了。 我们继续看这个精度到底是什么精度,继续深入看代码,发现精度原来来自当前文档。 - <DebuggerStepThrough> _
- Protected Shared Function DocumentTolerance() As Double
- Return RhinoDoc.ActiveDoc.ModelAbsoluteTolerance
- End Function
复制代码
当前文档的模型绝对精度。如下图和犀牛文档对应的位置 “单位”的意思就是你所建模型的默认单位,这里是mm,如果有些东西切割爆红,你可以在这里设置成1e-9试试,如果可以,说明里面有小于这个单位的物件。
很多人只会使用软件,这里作者如果出现一个错误,导致我们在使用的时候出现bug,那么我们这些使用者就束手无策了。希望国内更多的人加入开发的行列,作为一个创造者,而非照本宣科的使用者。 0.jpg (53.88 KB, 下载次数: 0)
下载附件 保存到相册 设为封面
2014-10-10 00:10 上传
群号为:82367748
-----------------------------------------------------------------------------------------------
|
是的,是Jon Mirtschin,他是澳大利亚人,人很不错,有什么问题都会帮忙解决,之前跟他聊了很IFC方面的东西。仰慕国外各位大牛对建筑软件行业的推进,我一定要努力多为中国在这方面的发展做一些贡献。
举报