×

工业设计互动平台

手机短信,快捷登录

微信登录,快人一步

QQ登录

只需一步,快速开始

再谈GHA开发的重要性

发布于 2014-11-19 5 点赞 19 评论 14389 浏览

    一大清早看到两则新闻,一个是“英国5岁男童成为世界上最年轻的微软认证电脑专家”,一个是“多名成人冲进小学殴打老师,称不许欺负小少爷”。
我想很多时候我们是输在了起跑线上,中国可能出现年轻的微软MVP认证专家吗?很难,有钱人家都宠着自己的孩子,没钱人家都忙着挣钱没时间管理孩子,再说我们上一代真正懂IT技术的有多少?所以我们输在了起跑线上,这世界上有“点石成金”之术,但是没人在我们很小的时候告诉我们,没人在我们很小的时候就教我们,我们并非不聪明,只是错过了太多。
    "悟自往之不鉴,知来者之可追!“
     我们很多人都知道,在软件的世界里面,代码可以解决一切问题,但是为什么不去学习?
     太忙了?
     不懂英文?
     不知道如何入门?
      年纪太大了?
      ......
      这些都是借口,也许我们没有领略编程的奥秘,也许只是我们太懒惰。
      我的师傅刚来公司根本不懂编程,四年的时间,每天晚上到半夜甚至凌晨几点睡觉学习Lsp,四年后成为了公司的Lsp大师,有的时候别人月薪几万不是白来的。你懂的人家也懂,你不懂的人家也懂,你只能拿设计经验去拼,而很多设计经验技巧方法,在IT的世界中不堪一击。有个搞幕墙的老师傅,跟我讲这样提料提料如何方便,然后我写了几行代码,瞬间做出同样的事情,他惊呆了。他说你要是早来几年就好了,能解决我们很多问题。
       好吧,废话不说了,我们再看一个例子,链接如下
http://www.xuexiniu.com/thread-80291-1-1.html
这是论坛上的朋友发的一个问题,基本上无人问津,实际上这个问题已经超出了新手问题的范围。
这里面主要涉及了一个Curve.Spline.Catenary电池,很多人都很奇怪,为啥多段线的方向突然变了?都知道变了,但是都不知道为什么,如果你不懂代码,这是一个无法解决的问题。
这里我们只找出方向改变一根线来研究一下(源文件见附件),
02.png
01.png
我们看到,本来我们是一根Pt1到pt2的线,但是现在方向反了,究竟是为什么?
同样的点,我们将点移动一下,移动到X负半轴
03.png
用cat获取的线奇迹般的正确了,实际上到此为止,你已经得到了结论,这个电池有bug,或者在某些电脑上有bug.
我们来看一下里面代码吧,这个代码比较复杂,涉及了各种矩阵变幻





  1. Private Function SolveCatenary(ByVal A As Point3d, ByVal B As Point3d, ByVal G As Vector3d, ByVal length As Double) As Polyline
  2.     Dim b As Point3d = A
  3.     Dim a As Point3d = B
  4.     Dim transform As Transform = Transform.Translation(-A.X, -A.Y, -A.Z)
  5.     Dim xform As Transform = (Transform.Rotation(G, -Vector3d.ZAxis, Point3d.Origin) * transform)
  6.     A.Transform(xform)
  7.     B.Transform(xform)
  8.     If (B.X < 0) Then
  9.         If GH_Document.IsEscapeKeyDown Then
  10.             Return Nothing
  11.         End If
  12.         Return Me.SolveCatenary(a, b, G, length)
  13.     End If
  14.     Dim startDirection As New Vector3d((B.X - A.X), (B.Y - A.Y), 0)
  15.     Dim transform4 As Transform = Transform.Rotation(startDirection, Vector3d.XAxis, Point3d.Origin)
  16.     Dim identity As Transform = Transform.Identity
  17.     If (startDirection.Length < 10) Then
  18.         Dim scaleFactor As Double = (10 / startDirection.Length)
  19.         identity = Transform.Scale(Point3d.Origin, scaleFactor)
  20.         length = (length * scaleFactor)
  21.     End If
  22.     Dim transform6 As Transform = (identity * transform4)
  23.     A.Transform(transform6)
  24.     B.Transform(transform6)
  25.     Dim transform7 As Transform = (transform6 * xform)
  26.     Dim inverseTransform As Transform = Transform.Identity
  27.     If Not transform7.TryGetInverse(inverseTransform) Then
  28.         Me.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Transformation into Catenary solver coordinates failed.")
  29.         Return Nothing
  30.     End If
  31.     A.DistanceTo(B)
  32.     If (Math.Abs(CDbl((A.X - B.X))) < (0.01 * GH_Component.DocumentTolerance)) Then
  33.         Dim polyline As Polyline = Me.SimpleChain(A, B, G, length)
  34.         polyline.Transform(inverseTransform)
  35.         Return polyline
  36.     End If
  37.     Dim num2 As Integer = 50
  38.     num2 = Math.Min(num2, 100)
  39.     Try
  40.         Dim delegate2 As CatenaryDelegate = Me.Catenary(A.X, A.Z, B.X, B.Z, length, (0.1 * GH_Component.DocumentTolerance))
  41.         If (delegate2 Is Nothing) Then
  42.             Dim polyline2 As Polyline = Me.SimpleChain(A, B, G, length)
  43.             polyline2.Transform(inverseTransform)
  44.             Return polyline2
  45.         End If
  46.         Dim collection As Point3d() = New Point3d(num2  - 1) {}
  47.         Dim num3 As Double = ((B.X - A.X) / CDbl((num2 - 1)))
  48.         Dim x As Double = A.X
  49.         Dim i As Integer
  50.         For i = 0 To num2 - 1
  51.             collection(i) = New Point3d(x, A.Y, delegate2.Invoke(x))
  52.             x = (x + num3)
  53.         Next i
  54.         Dim polyline3 As New Polyline(collection)
  55.         polyline3.Transform(inverseTransform)
  56.         Dim pointd3 As Point3d = polyline3.Item(0)
  57.         Dim pointd4 As Point3d = polyline3.Item(0)
  58.         If (pointd3.DistanceTo(A) > pointd4.DistanceTo(B)) Then
  59.             polyline3.Reverse
  60.         End If
  61.         Return polyline3
  62.     Catch exception As Exception
  63.         Me.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, exception.Message)
  64.         Return Nothing
  65.     End Try


复制代码
里面有很多内容,反汇编得到的代码也比较乱,我么找出重点看到
  If (pointd3.DistanceTo(A) > pointd4.DistanceTo(B)) Then
            polyline3.Reverse

        End If
这个地方有个翻转的操作.我们再来看看Polyline3是怎么得到的
  1.   Dim collection As Point3d() = New Point3d(num2  - 1) {}
  2.         Dim num3 As Double = ((B.X - A.X) / CDbl((num2 - 1)))
  3.         Dim x As Double = A.X
  4.         Dim i As Integer
  5.         For i = 0 To num2 - 1
  6.             collection(i) = New Point3d(x, A.Y, delegate2.Invoke(x))
  7.             x = (x + num3)
  8.         Next i
  9.         Dim polyline3 As New Polyline(collection)
  10.         polyline3.Transform(inverseTransform)
复制代码

经过一系列转换后的点A,B(就是我们输入的点)已经不再原来位置了,如下图
04.png

程序中通过转换后的pt1,pt2的到了Polyline3然后Polyline3进行了一次矩阵转换回到了原来的位置。
但是在判断这个翻转的时候
  If (pointd3.DistanceTo(A) > pointd4.DistanceTo(B)) Then
            polyline3.Reverse
End If
这里的A和B也就是Pt1,Pt2本来应该是原始的A,B,作者却错用了转换后的Pt1,Pt2,这样肯定会出问题啦。
实际上这也是我们写代码中经常遇到到的一个bug,就是某个变量操作了很多次后,我们还以为它没变化,当成以前的来用。
通过首行代码
Dim b As Point3d = A
    Dim a As Point3d = B
我们不难发现,作者实际上已经储存了原始的点,在判断翻转的时候,我们只需要使用a,b即可(在C#中区分大小写,VB中不区分,这里可见Reflector反编译器对于VB代码的反编译也有bug)
可能是作者手误,偏偏写成了大小A,B。
原因查完了,我们可以直接动手修改代码了,如何修改我就不说了,说的太多容易被封号呀。我的官方论坛账号和SEG插件都还在封锁状态,这段时间又比较忙,好蛋疼。
    在官方论坛上面,我给他们发现的bug不下于数百个,上面讨论的很多问题都是前无古人的,但是偏偏被Jessson封掉了,让任何人都看不到帖子,我倒是不在乎,那些问题我都解决了,但是你让后来者碰到同样问题的人麻烦了,这是在惩罚谁?
下面附件中的Curve.gha中修复了这个bug,替换掉自带的Curve.gha即可使用,路径"C:\Program Files\Common Files\McNeel\Rhinoceros\5.0\Plug-ins\Grasshopper (b45a29b1-4343-4035-989e-044e8580d9cf)\0.9.76.0\Components\Curve.gha"(每个人的电脑可能不一样,自己找一下)
替换后效果

05.png
精彩分享:
欢迎传播此微信号:SecondEffectGroup

Curve.gha

706 KB, 下载次数: 261

 [充值]

unnamed 2.gh

13.2 KB, 下载次数: 83

 [充值]

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

本版积分规则

精彩回复

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

imyas | 实习生 | 发表于 2014-11-19 16:11:33
轻轻地顶一下,学习学习
0 回复

举报

左手21年 | 设计师 | 发表于 2014-11-19 16:16:42
群主犀利!!
0 回复

举报

筑梦NARUTO | 设计师 | 发表于 2014-11-19 16:30:50
楼主的源码使用的啥打开的grasshopper.dll啊?或者楼主讲下如何获得源码啊。。感谢
0 回复

举报

huaxiamengqing | 设计助理 | 发表于 2014-11-19 17:42:37
refletor可以查看net源码
0 回复

举报

筑梦NARUTO · 发表于 2014-11-19 19:06 点评

楼主可以以这个源码为例讲讲找的步骤吗。。。我感觉里面比较难找啊。。。比rhinocommon sdk里面找东西还复杂,谢啦

筑梦NARUTO | 设计师 | 发表于 2014-11-19 19:06:12
huaxiamengqing 发表于 2014-11-19 17:42
refletor可以查看net源码

楼主可以以这个源码为例讲讲找的步骤吗。。。我感觉里面比较难找啊。。。比rhinocommon sdk里面找东西还复杂,谢啦
0 回复

举报

huaxiamengqing · 发表于 2014-11-19 21:41 点评

当然比较难,如果你要Crack一个dll,那么对代码的认知,必须凌驾于作者之上,起码和他差不多。

huaxiamengqing | 设计助理 | 发表于 2014-11-19 21:41:48
筑梦NARUTO 发表于 2014-11-19 19:06
楼主可以以这个源码为例讲讲找的步骤吗。。。我感觉里面比较难找啊。。。比rhinocommon sdk里面找东西还 ...

当然比较难,如果你要Crack一个dll,那么对代码的认知,必须凌驾于作者之上,起码和他差不多。
0 回复

举报

yayely | 设计助理 | 发表于 2014-11-19 21:50:49
当我遇上这个问题时,用新手的各种手段去研究都没结果,此时我已意识到这个问题一定是远超入门级水平了,谢谢楼主的解答。
0 回复

举报

半醉earth | 实习生 | 发表于 2014-11-21 10:37:32
编程确实是神奇的东西,闲暇时花时间研究....编程确实是神奇的东西,闲暇时花时间研究....
0 回复

举报

IDEO007 | 实习生 | 发表于 2014-11-27 11:17:25
说的好。做产品设计几年,不谈经验,就谈创新。同样一个常见塑料壳,加工工艺也许大家都懂,喷油、电镀、磨砂、抛光等等。但是缺少的正是表面纹理。有规律或者奇特或者增加手感的纹理都需要那软件去完成。

买书学这个插件也是这个原因,但是到现在没到学到及边,呵呵[s:188]
0 回复

举报

ff182 | 实习生 | 发表于 2014-12-1 09:37:23
看到了深一步的研究,还有点小激动呢
0 回复

举报

hskcool | 设计师 | 发表于 2014-12-1 13:43:32
本帖最后由 hskcool 于 2014-12-1 14:11 编辑

请问梦清大神,Transform*Transform 是不是矩阵乘法运算?得到的结果是两个transform的合作用吗?
identity * transform4= QQ截图20141201135757.png 得到的就是合变换吗?


貌似乘的前后顺序也有讲究。
0 回复

举报

huaxiamengqing · 发表于 2014-12-1 18:12 点评

是的,你理解的是正确的

huaxiamengqing | 设计助理 | 发表于 2014-12-1 18:12:58
hskcool 发表于 2014-12-1 13:43
请问梦清大神,Transform*Transform 是不是矩阵乘法运算?得到的结果是两个transform的合作用吗?
identity ...

是的,你理解的是正确的
0 回复

举报

liuchuanyiyou | 实习生 | 发表于 2015-1-12 22:50:11
谢谢楼主~~~在某群里问了好久也没人回答我这个新手问题,不是没大神,就是懒得回答,他们也懒得说是软件BUG。希望还是像你这样的人多一点。
附我的问题链接:http://www.xuexiniu.com/forum.ph ... p;extra=#pid1274777
0 回复

举报

林夕是宝宝 | 实习生 | 发表于 2015-4-1 18:26:28
昨天我在学教程的时候刚好遇到 了整个问题,幸好有人提醒我来看了这个帖子,多谢楼主,楼主真棒![s:183]
0 回复

举报

jellyzzh | 实习生 | 发表于 2015-4-4 21:49:20
真是 这问题整了一天了都~
0 回复

举报

liulufu | 设计助理 | 发表于 2015-4-23 14:59:57
本帖最后由 liulufu 于 2015-4-23 15:02 编辑

请教下各位高手,在GH里我想将点的名字做成标签,使之在犀牛里可视,怎么提取点的名字作为字符。我在DP里带有标签的,不过导不出来!在犀牛里重新加一遍。
0 回复

举报

zhashilong | 设计助理 | 发表于 2016-12-27 18:51:33
牛啊,刚刚遇到同样的问题
0 回复

举报

guokuiliangfen | 实习生 | 发表于 2017-12-13 16:29:30
顶你
0 回复

举报

勒布朗詹木木 | 实习生 | 发表于 2018-4-23 13:23:20
又是代码的问题,太难了太难了
0 回复

举报