NCF参数化建筑论坛

标题: 经典的vb代码应用与分析 [打印本页]

作者: wangjunxiong    时间: 2012-7-3 17:58
标题: 经典的vb代码应用与分析
本帖最后由 wangjunxiong 于 2012-7-3 18:04 编辑

首先,给出 大川 哥的一个帖子连接:http://bbs.ncf-china.com/forum.php?mod=viewthread&tid=3956
这个帖子是对动画渲染的探讨。
我们看看下面这个电池:
[attach]29364[/attach]
希望您能耐心看大川的说明,并且能成功地运作这个电池!
那么,我们开始研究这个vb里面的代码:
[attach]29365[/attach]

Private Sub RunScript(ByVal position As On3dPoint, ByVal target As On3dPoint, ByVal picture_number As Object, ByVal render_open As Object, ByVal dir As Object)
    'code by 王大川 (
http://alwayswdc.com)
    '署名-非商业性使用-相同方式共享 3.0
http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh
    'point as single graft, don't flatten or in a list.
    '点作为单个graft数据传入,不能作为数个点组同时传入
    If render_open = True Then
      Dim filename As String = dir & picture_number & ".bmp"     ’(定义图片名称和格式,建议把.bmp改为.jpg)
      Dim x As String = CStr(position.x)  
      Dim y As String = CStr(position.y)
      Dim z As String = CStr(position.z)
      Dim a As String = CStr(target.x)
      Dim b As String = CStr(target.y)
      Dim c As String = CStr(target.z)           
‘(这几步都是抽取点坐标数据)
      app.RunScript("-_ViewportProperties" & chr(32) & "c" & chr(32) & x & "," & y & "," & z & chr(32) & a & "," & b & "," & c & chr(32) & "CANCEL")                      ‘(相当于在犀牛中运行 _ViewportProperties 命令,并输入相应的坐标数据)
      app.RunScript("-_Render")        ‘(相当于在犀牛中运行 _Render  命令,并输入相应的坐标数据)
      app.RunScript("-_SaveRenderWindowAs " & Chr(34) & filename & Chr(34))       ‘(保存图片
      app.RunScript("-_CloseRenderWindow")       ‘(关闭 Render 窗口  
    Else
    End If
  End Sub


上面的代码,主要是调用了app.runscript()函数 ,vb里的注解是这样的:
[attach]29909[/attach]
而 chr(32)是返回ASCII代码值,具体 ASCII 是什么,请大伙百度,或查查vb的书籍。
这里 chr(32)相当于敲击一次 键盘空格 。下图是一小部分ASCII代码值:

[attach]29976[/attach]

app.RunScript("-_ViewportProperties" & chr(32) & "c" & chr(32) & x & "," & y & "," & z & chr(32) & a & "," & b & "," & c & chr(32) & "CANCEL")  
这句的过程就是:在犀牛命令行中键入  -_ViewportProperties  ;然后按一次 键盘空格 ;接着键入 C   ;然后按一次 键盘空格 ;接着键入 xyz 坐标值 ;然后按一次 键盘空格 ;接着键入 xyz 坐标值 ;然后按一次 键盘空格 ;最后按一次 取消键。
这个过程其实就手工输入过程,但需要注意的是输入的命令前需要带“-_”,你可以尝试不带这个,观察会发生什么事情。
其它几个命令的原理是一样的。但请注意这个地方:app.RunScript("-_SaveRenderWindowAs " & Chr(34) & filename & Chr(34))   "-_SaveRenderWindowAs “  的s后面是有个空格的,即 s与" 之间有一个空格!这个非常重要,我的理解是停顿。因为有些命令必须要加一个空格后才能执行后面的可选项。
如果您还是有些朦胧,我建议你在犀牛里手工多试几次。


这个 app.RunScript 可调用犀牛里的全部命令,那么我们是不是可以好好利用这个东西来做一些重复性的东西!
在做工程的时候,往往需要技术员做很多重复枯燥的工作。就拿做幕墙加工举个例子:
深圳机场T3航站楼,其幕墙面积超过20万平方米,其外装饰采用3.0厚铝单板,估计有10万块,在檐口部位是一个自由曲面造型,所以这部分的铝板也是自由扭曲的,为了能生产所以需要按一定的要求对每个曲面展开。我们是利用了一个可以展开的插件,但这个插件展开后都是固定在坐标原点,所以需要展开一件然后移动到一个地方再做下一件。这时就可以把 app.RunScript  派上场了 !通过结合使用,发现其妙无穷也! (说明:我们只拿到犀牛模型,分割并不是按uv分的)

[attach]30365[/attach]

[attach]30461[/attach]




再看看 烟灰哥 的脑花制作视频:http://bbs.ncf-china.com/forum.php?mod=viewthread&tid=10206

引用:

另外这个动画不再使用slider自带的animation,因为有kangaroo的引入,需要和timer一同使用,所以以前的动画代码也有些修改,每帧的画面由Rhino的命令-_ViewCaptureToFile通过RunScript调用而输出,这个命令无法输出GH对象的图像,只能每帧bake到rhino中,输出之后删除,再进入下一帧的工作。不过Rhino对象比GH对象看上去顺眼多了


也就是说,这个电池可加入一段 "bake"  代码和"delete" 代码 ,"bake"  代码从网上可以找到,"delete" 代码可直接通过RunScript调用 。
下面的是一个我找到的比较好的 c#  bake 代码:
private void RunScript(GeometryBase obj, string name, string layer, Color color, bool activate, ref object A)
  {
    if(obj == null) return;
    if(activate){
      //Make new attribute
      Rhino.DocObjects.ObjectAttributes att = new Rhino.DocObjects.ObjectAttributes();
      Guid o_id = default(Guid);
      //Set object name
      if(name != null && Rhino.DocObjects.Layer.IsValidName(name) == true)
      {
        att.Name = name;
      }
      //Set layer
      if(layer != null && Rhino.DocObjects.Layer.IsValidName(layer) == true){
        //Get the current layer index
        Rhino.DocObjects.Tables.LayerTable layerTable = doc.Layers;
        int layerIndex = layerTable.Find(layer, true);
        if(layerIndex == -1){ //This layer does not exist, we add it
          //make new layer
          Rhino.DocObjects.Layer myLayer = new Rhino.DocObjects.Layer();
          myLayer.Name = layer;
          //Add the layer to the layer table
          layerIndex = layerTable.Add(myLayer);
          if( layerIndex > -1 ){ //We manged to add layer!
            att.LayerIndex = layerIndex;
            __out.Add("Added new layer to the document at position " + layerIndex + " named " + layer + ". ");
          }else{
            __out.Add("Layer did not add. Try cleaning up your layers."); //This never happened to me.
          }
        }else{
          att.LayerIndex = layerIndex;
          __out.Add("Added to existing layer " + layerIndex + " named " + layer + ". ");
        }
      }
      //Set color
      if(color != null)
      {
        att.ColorSource = Rhino.DocObjects.ObjectColorSource.ColorFromObject;
        att.ObjectColor = color;
        att.PlotColorSource = Rhino.DocObjects.ObjectPlotColorSource.PlotColorFromObject;
        att.PlotColor = color;
      }
      //Bake to the right type of object
      switch (obj.ObjectType)
      {
        case Rhino.DocObjects.ObjectType.Brep:
          o_id = doc.Objects.AddBrep((Brep) obj, att);
          break;
        case Rhino.DocObjects.ObjectType.Mesh:
          o_id = doc.Objects.AddMesh((Mesh) obj, att);
          break;
        case Rhino.DocObjects.ObjectType.Point:
          o_id = doc.Objects.AddPoint(((Rhino.Geometry.Point) obj).Location, att);
          break;
        case Rhino.DocObjects.ObjectType.Curve:
          o_id = doc.Objects.AddCurve((Curve) obj, att);
          break;
        default:
          Print("I'm not sure what kind of geometry is coming in the input. Try turning it into a Point, Curve, Mesh, or Brep before the input.");
          return;
      }
      __out.Add("Added " + obj.GetType().Name);
    } else {
      Print("Inactive");
    }
  }
  //<Custom additional code>
  //</Custom additional code>
}


可以把这些代码换成vb代码,之前我已经尝试过,确定是可行的,可惜我没有保留。
因为新的vb和旧的vb是不通用的,所以在新的vb中需这样调用:RhinoApp.RunScript(script As String,echo as boolean)

根据这思路,我也山寨了一个脑花:http://bbs.ncf-china.com/forum.php?mod=viewthread&tid=10327


非常喜欢:RhinoApp.RunScript(script As String,echo as boolean) !!



作者: zhiaixu2010    时间: 2012-7-3 23:49
学vb,c+,java中
作者: wjjican    时间: 2012-7-4 08:57
强烈支持,谢谢分享
作者: xielanmin    时间: 2012-7-4 15:42
强烈支持,脚本这么强大的。。
作者: realforce    时间: 2012-7-8 14:42
谢谢分享。。。
作者: ping88    时间: 2012-8-8 19:02
也在学vb,c+,java中,但不知道什么学,希望多指教。
作者: ememery    时间: 2012-11-25 14:41
厉害厉害厉害厉害厉害厉害厉害:)
作者: 提线木偶    时间: 2012-11-29 23:50
到处留名,到时来学
作者: dreamer-lfb    时间: 2013-6-7 12:19
楼主厉害,谢谢分享

作者: 月之眼    时间: 2013-6-8 00:46
感谢分享     




欢迎光临 NCF参数化建筑论坛 (http://ncf-china.com/) Powered by Discuz! X3.2