请问关于scriptcontext的帮助文档哪里可以找到?

我看到有人说在settings\lib\scriptcontext.py这里,但是我打开看了一下里面,并没有多少内容。

# A Rhino GetPoint that performs some custom dynamic drawing
import Rhino
import System.Drawing.Color
import scriptcontext

def CustomArc3Point():
    # Color to use when drawing dynamic lines
    line_color = System.Drawing.Color.FromArgb(255,0,0)
    arc_color = System.Drawing.Color.FromArgb(150,0,50)

    rc, pt_start = Rhino.Input.RhinoGet.GetPoint("Start point of arc", False)
    if( rc!=Rhino.Commands.Result.Success ): return
    rc, pt_end = Rhino.Input.RhinoGet.GetPoint("End point of arc", False)
    if( rc!=Rhino.Commands.Result.Success ): return

    # This is a function that is called whenever the GetPoint's
    # DynamicDraw event occurs
    def GetPointDynamicDrawFunc( sender, args ):
        #draw a line from the first picked point to the current mouse point
        args.Display.DrawLine(pt_start, args.CurrentPoint, line_color, 2)
        #draw a line from the second picked point to the current mouse point
        args.Display.DrawLine(pt_end, args.CurrentPoint, line_color, 2)
        #draw an arc through these three points
        arc = Rhino.Geometry.Arc(pt_start, args.CurrentPoint, pt_end)
        args.Display.DrawArc(arc, arc_color, 1)

    # Create an instance of a GetPoint class and add a delegate
    # for the DynamicDraw event
    gp = Rhino.Input.Custom.GetPoint()
    gp.DynamicDraw += GetPointDynamicDrawFunc
    gp.Get()
    if( gp.CommandResult() == Rhino.Commands.Result.Success ):
        pt = gp.Point()
        arc = Rhino.Geometry.Arc(pt_start,pt,pt_end)
        **scriptcontext.doc.Objects.AddArc(arc)**
**        scriptcontext.doc.Views.Redraw()**


if( __name__ == "__main__" ):
    CustomArc3Point()

关于 **scriptcontext.doc.Objects.AddArc(arc)**这里不大明白,看提示的帮助信息似乎和https://developer.rhino3d.com/api/RhinoCommon/html/M_Rhino_DocObjects_Tables_ObjectTable_AddArc.htm这个比较接近。

我有几个疑问:
1 可否把scriptcontext理解为使用的就是RhinoCommand,只不过是在python里用
2 看一些案例文件引用创建物件等操作时候,rhinoscriptsyntax也有,scriptcontext也有,Rhino也有都是在python里import进来的,这几个库有什么区别?
3 Rhino Python编辑器中的rhinoscriptsyntax子目录只有这几个,而且点击也没有反映,不过如果在编辑器中输入 “ . "的话会看到还有很多模块才对,这些模块在哪里可以看到呢?
图片

1 个赞

最常用的就是 scriptcontext.doc 其实就是 Rhino.RhinoDoc.ActiveDoc,表示的就是当前打开的 Rhino 文档,rhinoscriptsytax 的函数通常产生的都是 guid,有时候需要从把几何体和 guid 进行转换,就可以用的到,直接用 RhinoCommon 也可以。

rhinoscriptsytax 就是把 RhinoCommon 封装成简单易懂的函数了。

功能说明和范例看这里:

rhinoscriptsyntax (rhino3d.com)

这里有很多年前翻译的中文版文档:

RhinoPython (rhino3d.asia)

scriptcontext是没有帮助文档的,但是你可以去settings\lib\scriptcontext.py看到源代码。

这里说说我个人的理解吧,scriptcontext可以简单理解为打包了RhinoCommon中RhinoDoc的一些常用方法和打包了一些python的常用方法。
比如第一个scriptcontext.doc,可以用Rhino.RhinoDoc.ActiveDoc中的方法替代。
比如 scriptcontext.escape_test(),开发者提供了一个检查“ESC”键按下退出程序的方法
再比如scriptcontext.sticky,开发者提供了一个字典,方便在程序的几个脚本里去传递数据。

其他的几个方法基本上就没咋用过了。

感谢回复。

抱歉关于

Rhino Python编辑器中的rhinoscriptsyntax子目录只有这几个,而且点击也没有反映,不过如果在编辑器中输入 “ . "的话会看到还有很多模块才对,这些模块在哪里可以看到呢?

这里是我打错了,我想问得是scriptcontext。 :cold_sweat:

关于**scriptcontext.doc.Objects.AddArc(arc)**这里,看还可以用scriptcontext来创建,而且这个函数我也找不到在哪,就没明白什么情况。从编辑器里看scriptcontext下只有doc ID sticky 三个,而且没有下一级了,有点费解。

我在网上看到意思是创建的图形有的存储在rhino doc 中 有的在 ghdoc 中,有的存在内存里,rhinocommand创建物件,同时返回的也是实际的物件,rhinoscriptsyntax创建物件但是返回的物件的ID,scriptcontext是否可以理解为其实是rhinocommand有限的doc下函数的引用?

这样的话代码看起来有点奇怪,在GH中用的话相当于是 Rhino.RhinoDoc.ActiveDoc = Rhino.RhinoDoc.ActiveDoc?
还是说scriptcontext是指的当前运行代码的位置,如果在gh中用scriptcontext.doc.Objects时候是返回的是在当前运行的doc中创建像rhinocommand一样的实际物件而非ID?

我也是找到了这个文件,然后我看最主要的就是最后的,用于传递到rhino,但是调用方法我找不到,而且我找到的这个示例文件中用的函数在编辑器内看不到,代码里也没有,但是如果手动输入的话的确可以看到有,就很费解

你直接查RhinoDoc就可以查到的。比如前面两个事件。
1

我的理解是开发者为了让用户方便使用,直接把RhinoDoc中常用的方法封装成了 scriptcontext,所以你也完全可以不使用scriptcontext,直接用RhinoDoc也行。
比如你上面的例子


import Rhino
import System.Drawing.Color
import Rhino.RhinoDoc as rr

def CustomArc3Point():
    line_color = System.Drawing.Color.FromArgb(255,0,0)
    arc_color = System.Drawing.Color.FromArgb(150,0,50)

    rc, pt_start = Rhino.Input.RhinoGet.GetPoint("Start point of arc", False)
    if( rc!=Rhino.Commands.Result.Success ): return
    rc, pt_end = Rhino.Input.RhinoGet.GetPoint("End point of arc", False)
    if( rc!=Rhino.Commands.Result.Success ): return


    def GetPointDynamicDrawFunc( sender, args ):
        args.Display.DrawLine(pt_start, args.CurrentPoint, line_color, 2)
        args.Display.DrawLine(pt_end, args.CurrentPoint, line_color, 2)
        arc = Rhino.Geometry.Arc(pt_start, args.CurrentPoint, pt_end)
        args.Display.DrawArc(arc, arc_color, 1)

    gp = Rhino.Input.Custom.GetPoint()
    gp.DynamicDraw += GetPointDynamicDrawFunc
    gp.Get()
    if( gp.CommandResult() == Rhino.Commands.Result.Success ):
        pt = gp.Point()
        arc = Rhino.Geometry.Arc(pt_start,pt,pt_end)
        rr.ActiveDoc.Objects.AddArc(arc)
        rr.ActiveDoc.Views.Redraw()


if( __name__ == "__main__" ):
    CustomArc3Point()

完全可以把最后两句改成这样。

你也可以拿一个你不理解的例子来讨论一下。

1 个赞

scriptcontext.doc 里面保存的是一个 RhinoDoc 类的实例,是当前 Rhino 所操作的 3dm 文档对应的 RhinoDoc 这个 Class 的实例,所以要看文档应该看这里:

RhinoDoc Class (rhino3d.com)

GHpython 里 scriptcontext.doc 是个属性变量,默认值是 ghdoc 这个变量里保存的 RhinoDoc Class 子类的实例,有需要的时候可以改成 Rhino.RhinoDoc.ActiveDoc,因为 Rhino.RhinoDoc.ActiveDoc 也是 RhinoDoc 类的一个实例,表示当前 Rhino 打开文档的实例。怎么能理解成 Rhino.RhinoDoc.ActiveDoc = Rhino.RhinoDoc.ActiveDoc 呢?

也就是说

# 可以
scriptcontext.doc = ghdoc
# 也可以
scriptcontext.doc = Rhino.RhinoDoc.ActiveDoc
# 但 ghdoc != Rhino.RhinoDoc.ActiveDoc

就像下面的一样,前面的是变量,后面的是

a=1
a=2

1 是 1,2 是 2 ,1 不等于 2,2 也不等于 1,但 a 可以等于3,4,5,6,7。 :sweat_smile: :joy: :joy:

我也是这样想的,感觉在创建时候大多两个就是一个东西。

但是在gh python中用scriptcontext.doc 时候又不一样,所以我才好奇两个的区别什么时候会出现,感觉来看应该不是等价关系,是经过了某种传递或转换,想查查帮助文档。

就像rhinoscriptsyntax虽然是封装的RhinoCommon,但是两个的返回结果一个是guid,一个是物件信息的区别一样。

感觉scriptcontext这个,就如果和rhino.Rhinodoc完全一样的话,就很多余——连个文档也没有,如果是为了方便用,至少在编辑器里能看到能引用哪些。

如果函数还是调用的rhinodoc里的,指定没有rhinodoc的多,提示信息还没有rhinodoc时候的全,我为什么不直接引用rhino来实现,反正也可以在python中调用,又不是必须用C#。只有额外的感觉有点用,比如escape_test。

在我看来如果没有帮助文档,干脆就最好不要碰scriptcontext了,除了在ghpython中改doc这个没办法的事情……

至于例子,其实能理解,理解不了的是为什么要有这个奇怪的嵌套,感觉当时留这个必然是有它特别的地方,所以想找找帮助文档……

大体上和我猜的一致。

你说的我明白

可能表述上有点问题 :cold_sweat:

可否理解为在rhino中直接使用scriptcontext.doc和rhindoc是没区别的?
那在gh中时候,当scriptcontext.doc = ghdoc时候,使用scriptcontext.doc和rhindoc有区别吗?

不能!重要的事情重复三遍,上面已经说了 RhinoDoc 是个 类!类!类!, scriptcontext.doc 是个 变量!变量!变量!

班长(scriptcontext.doc)可以是小明(ghdoc),也可以是小红(Rhino.RhinoDoc.ActiveDoc),但首先必须得是个人(RhinoDoc)。

不能这样理解。

简单点理解,在 Rhino 里能选中的物件储存在 Rhino.RhinoDoc.ActiveDoc.Objects 中,只能在 GH 中选中的物件储存在 ghdoc.Objects 中,通通都有 GUID。

在 Rhino 中通过指令创建的物件,会被放置在 Rhino.RhinoDoc.ActiveDoc.Objects 中,所以也是有 GUID 的。

假如你用 RhinoCommon 中的 Rhino.Geometry.Curve 类,实例化了一个 Curve 对象,那它还不能显示在 Rhino 界面上,也没有 GUID,通过 Rhino.RhinoDoc.ActiveDoc.Objects.AddCurve() 方法添加到 Rhino.RhinoDoc.ActiveDoc.Objects 以后,有了 GUID,这时候才能显示到 Rhino 界面上,才能保存进 3dm 文件中。

rhinoscriptsyntax 简易就简易在这,其中的绝大多数函数,会自动把物件添加到 scriptcontext.doc.Objects 中。

如果 scriptcontext.doc = Rhino.RhinoDoc.ActiveDoc,就会直接把物件添加在 Rhino 场景中,不受 GH 的管理。如果 scriptcontext.doc = ghdoc,在 Rhino 场景中就看不到,就受到 GH 的管理了,必须输出给电池的 out 变量,才能显示出来。

1 个赞

scriptcontext 里面就保存了三个变量,要什么文档? :joy:

doc ,Rhino.RhinoDoc 类型,上面说过了,文档在这
id ,整数类型,1 表示脚本执行方式是 RhinoPython,2 表示执行方式 GH Python,3 表示其他。
sticky ,字典类型,可以在不同脚本间共享数据。

1 个赞

非常感谢,这下明白多了

这个RhinoPython中文帮助有离线版本可以下载下来的么?

没有离线的呢,只有在线的版本。