×

工业设计互动平台

手机短信,快捷登录

微信登录,快人一步

QQ登录

只需一步,快速开始

继续为GH开发学习打鸡血--

发布于 2014-11-29 2 点赞 3 评论 11192 浏览

碰到了一个有关Offset失败的问题的,链接如下,
http://www.xuexiniu.com/forum.php?mod=viewthread&tid=80753&page=1#pid1241077
仍然我们从代码的角度,解析此电池为何出现这种怪异的现象(发问的人用
Offset 电池偏移一个面,不同的值,有些成功,有些不成功。)里面的面确实有点问题,但是这并非问题的本质,如果面有问题为啥有些值可以,有些值不可以?
刚学gh三天,你就碰到了一个Bug--
你把偏移值设置到3672,然后将第三个参数输入False你就会发现,偏移其实是成功的,如下图


不成功的实际上是Retrim
将T设置为True实际上是偏移后,再修剪。而修剪的UV data来自于原始面。
这个电池实际上有两步,一步偏移,一步修剪。相当于下面的连线

我们看下后台代码:

我们发现,修剪面其实用到了这个函数data Brep.CreateTrimmedSurface(destination .Face,  surfaceSource )
上面的Retrim电池实际上后天用的也是这个函数。
我们来具体看下这个函数,为啥有的成功了,有的不成功。
4.png

这个函数的解释如下
Constructs a Brep using the trimming information of a brep face and a surface. Surface must be roughly the same shape and in the same location as the trimming brep face.
这里面提到,用作UVdata的Surface必须Roughly 和修剪的面是同样的形状,并且在同样的位置。那么究竟要有多么的Roughly,这里面并没有说。好把,这个意思是这个函数可能不成功,下面的返回结果人家就说了,要么返回成功的面,要么返回Null。OK,分析到这里面其实你得到一个Null并不足以为怪。
Parameters
trimSourceBrepFace which contains trimmingSource brep.surfaceSourceSurface that trims of BrepFace will be applied to.
Return ValueA brep with the shape of surfaceSource and the trims of trimSource or null on failure.
但是问题终究要解决,这里面我们找到了问题所在,那么就从这个提供UV 修剪data的Surface入手,可能我们的原始Surface跟偏移后的Brep不是很Roughly相同形状,相同位置。我们就直接用另外的面来作为Retrim的输入面,试一试,如下图,我们将偏移成功的面作为修剪面提供给Retrim电池,就发现修剪成功了。

5.png


好吧,姑且这样解决。
但是好奇心总是让人想探究到底,为啥这个函数可能失败?我们是否能够修复它呢?我们继续跟随代码前进--
这个函数里面的核心语句如下:
  Dim ptr As IntPtr = UnsafeNativeMethods.RHC_RhinoRetrimSurface( pConstBrepFace ,  pConstSurface )
碰到了UnsafeNativeMethods,这个玩意不止一次挡在真实底层代码前面,我们继续看下去发现
<DllImport("rhcommon_c", CallingConvention:=CallingConvention.Cdecl)> _Friend Shared Function RHC_RhinoRebuildCurve(ByVal pCurve As IntPtr, ByVal pCount As Integer, ByVal degree As Integer, <MarshalAs(UnmanagedType.U1)> ByVal keepTangents As Boolean) As IntPtrEnd Function

    这个函数实际上被封装了rhcommon_c这个dll里面,而这个dll不用看,一猜便知是用C++写的。到此结束吧,因为C++代码是非托管代码,任何人都无法使用类似Reflector这样的工具实现查看源码的目的。顶多我们只能得到汇编代码,而从汇编代码读懂这样的函数,本人的水平还没达到这个程度。
    其实很久很久以前我就研究过Rh里面的UV切割,找遍了所有的函数,发现实现UV切割的只有简单的矩形区间比如(U0~U1,V0~V1)这样的区间切割。但是我们往往需要的是一个形状很奇怪的区间,比如几根线围成的一个区间,这样的区间目前rh里面的函数或者电池还无法表达。我们只能使用Retrim或者Srfsplit这样的电池来实现这样的切割。但是前者不是很稳定,后者很慢,都不很理想。我们目前可以取出任意区间的线段,但是不能取出任意区间的曲面。我找遍了所有的函数,发现Retrim底层实际上是个入口,但是又被C++的封装挡在了门外。Rhino很多核心的代码都是保护起来的,只有更高层次的人才能查看,了解。
   我们知道,我们了解的东西的多少,跟我们的水平有很大关系。站的有多高,你看的就有多远。
   不懂Rhino的人群,怎么能知道Grasshopper如此的好用,上至天文,下至地理,天体力学,地理测绘,人机交互,机器人仿真,磁场模拟.....
   不懂代码的人顶多也只能熟练的掌握电池的语言,实现某个专业上的精彩运用,但是永远不可能突破软件的限制,人家写什么你只能用什么。
   懂脚本代码,不懂gha开发的人也只能写写代码实现更强大的功能,但是遇到对电池gui的操作时,也只能望洋兴叹,无从下手。
   懂GHA开发,但是不懂IL操作的人会发现学习起来很困难,因为资料太少了。他永远不会想到,Food上面的所有插件,其实就是资料,托管代码的世界里面就如同开源一样。
   懂IL不懂C汇编的人,面对上面的问题也只能就此止步...
   现在自己问一句,你处于什么层次呢?那么你知道的多少就确定了。
   路漫漫其修远兮,吾将上下而求索!面对网络中浩瀚的知识库,我曾不止一次发出如此感慨,感慨自己就好比寄蜉蝣于天地,渺沧海之一粟--
0.jpg
扫一扫,关注此微信公共号,学习gh必备。

6.png

Solution.gh

5.99 KB, 下载次数: 35

 [充值]

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩回复

文明上网理性发言、请文明用语

hehaiming929 | 实习生 | 发表于 2016-6-20 22:19:09
确实
0 回复

举报

youcall91 | 实习生 | 发表于 2019-7-16 09:58:45
6666666666666666大佬
0 回复

举报

youcall91 | 实习生 | 发表于 2019-7-16 10:03:04
所以最后的结论就是……
0 回复

举报