» cn.Subpatches
This site relies heavily on Javascript. You should enable it if you want the full experience. Learn more.

cn.Subpatches

English | French | Russian | Italian

导言

图形化的编程倾向于产生庞大而繁复的结构,有时候看上去很美,但如果你持续在一个程序片上工作,你迟早会发现字程序片的好处:

借助于子程序片, 你可以将充满了整整一屏的程序片变成一个节点。然后你就能像使用内置的节点一样自由应用这个节点。你也可以将这些子程序片存到硬盘上反复利用。

创建子程序片及其简单。严格来讲,你创建好了一个程序片,也就创建好了一个子程序片。要理解这一点,我们有必要后退一步来多学点由关vvvv架构的知识:

根程序 Root Patch

如果从主菜单上选择了Show Root(显示根),你就能看到vvvv的根程序片。这个程序片包含了代表所有打开的窗口的节点。通常来说你不需要看到这个窗口,vvvv能够自行管理其内容。

每当你用Open命令新打开一个程序片,root窗口中就会创建一个节点。同理,当你关闭一个窗口,根程序中的对应的节点也被删除。

根窗口一点也不特殊:只要你愿意,完全可以像在其它窗口上一样创建节点和程序。

你也可以在根程序中自由删除节点,不过这也会关闭对应的程序片窗口。

提示: 根程序在启动时自动加载。如果你在根程序中有节点时保存了它,当你下次在启动vvvv时会重置。你可以将任何一个程序片设成根程序((用主菜单中的 “Set as Root” 命令)。

vvvv总是只需要一个根程序。所以如果关闭了根程序,程序就会退出(或出现一个新的空白的根)。

窗口模式

vvvv的一个非常重要的架构特性就是根程序中的节点和程序片窗口本质上是一样的。

基本上,节点可以以四种方式显示: 窗口化, 隐藏, 方框置入式或全屏幕。

vvvv中几乎所有内置的节点如LFO, +, Damper, Quad等默认都是隐藏的。你只需要节点的呈现就够了。

内置的渲染器节点如DX8或GDI渲染器有一个关联的窗口。它们的默认状态是窗口模式,可以使用菜单或键盘快捷键来在四种状态中切换。

隐藏<br>Alt+3<br>只有节点可见
窗口化<br>Alt+1<br>节点带一个独立窗口
方框置入式<br>Alt+2<br>节点呈现为方框, 包含一个窗口
全屏<br>Alt+Enter<br>以全屏方式展现的窗口

要理解子程序片的关键是知道所有的程序片同时也是节点。

在正常情况下工作时,你只跟一个程序片窗口打交道,看不到它对应的节点。不过你完全可以在根程序中选择这个节点,并将其在四种模式中切换。

利用方框置入式模式,你就可以将一个程序片放到其它程序片中去。当你要准备非常复杂的用户界面时,这就大有用武之地了,这样你可以在你的视野中隐藏其它节点而只保留最重要的IOBoxes。

子程序片

啰唆了这么多,子程序片现在一点也不神秘了:它就是一个包含了程序的节点。

Subpatch? 只是一种观点,也可以以 ParentPatch? (父程序)来表述: 就是从另一个角度看问题:
范例:

Patch1 contains Patch2.
从 Patch1 来看: Patch2 是一个 Subpatch?
从 Patch2 来看: Patch1 是一个 ParentPatch?

不管怎么说: 在以子程序片方式工作时要小心 - 关闭和隐藏窗口是有本质的不同的。如果你只是隐藏窗口,这个程序片就仍然是系统的一部分,继续发挥作用。而当你关闭了窗口,这个程序片就会从系统中去除并删掉相应的节点。所以当你想关闭窗口的时候,请使用隐藏。当你想删除这个程序片时,才使用关闭。

参数

还有一个重要的方面没有提及: 我们怎样才能向和从一个子程序片中传输数据呢?

这是通过程序片中的IOBoxes来实现的 -- 通常将IOBoxes来作为改变或显示值的一个交互元素来使用。很简单的一招就能把它们变成程序的参数: 只要你在其描述性名称(Descriptive Name)引脚(这是一个配置引脚,所以只能在属性检查器中才出现)中输入一个字符串,这个IOBox就变成一个参数了。当从这个节点向下连到其它节点上时,它就作为一个输入参数,而若是向上连到其它节点时,它就是一个输出参数。知道这些就够了。

设定了描述性名称的IOBoxes会将这个名字连在一个跟随的灰色文本框里。

举例来说,上述程序片提供了两个参数: 一个名为“get new”的输入引脚和一个名为“kitchenboy of the week”的输出引脚。之后,我们就可以像下面这样在其它程序片中来使用它了:

节点上参数引脚的从左到右的顺序取决于程序片中那些IOBoxes的x坐标值。你可以观察到,如果在程序片中移动IOBoxes,节点上对应的引脚也会随之改变位置。

进一步

vvvv的另一个重要特性就是所有同名的程序片本质上就是同一个。当多次打开同一个程序片时,然后在其中一个做出修改时,可以注意到,所有其它程序片也同时反应出这个修改。对所有数值变化和所有程序修改来说都是这样。在原型设计时这是一个很强大的特性,这样你可以在任何需要的细节程度上开展工作,同时又能看到完整运行的系统的所有结果。

从参数引脚得到的数值也就是这个程序片产生的结果在每个子程序片中是独立的。所以每个子程序片能够处理不同的数据。

相对路径

可以使用相对路径或绝对路径来定位你的子程序片。如果使用相对路径,它们总是相对于父节点的目录而言。这样做的优势就是你可以在硬盘上自由移动项目文件夹,而不用担心丢失文件。显然你要小心每次要同时移动所有组件,而不需要去修改程序片本身。

还有一个重要警告: 如果你将程序片保存到另一个目录中, 你要仔细检查,因为此时vvvv会假定所有文件都要相对于该新的目录。你要确定相对于这个新目录,所有文件都各在其所。为此会出现一个警告信息,询问你是否接受这一安排,那样会自动转移所有的相对文件(33beta3 的用户注意了: 这一特性尚未实现):

嵌套

一个 Subpatch? 当然可以包含 另一个 Subpatches (它还可以包含 其它的 子程序片...) 。
但是:

不要试图做一个包含它自身的程序片!

这会导致死循环从而锁死vvvv。

anonymous user login

Shoutbox

~4d ago

joreg: vvvvTv S02E01 is out: Buttons & Sliders with Dear ImGui: https://www.youtube.com/live/PuuTilbqd9w

~10d ago

joreg: vvvvTv S02E00 is out: Sensors & Servos with Arduino: https://visualprogramming.net/blog/2024/vvvvtv-is-back-with-season-2/

~10d ago

~11d ago

fleg: hey there! What's the best tool for remote work? Teamviewer feels terrible. Thanks!

~24d ago

joreg: Last call: 6-session vvvv beginner course starting November 4: https://thenodeinstitute.org/courses/ws24-5-vvvv-beginners-part-i/

~1mth ago

joreg: Missed the last meetup? You can rewatch it here: https://www.youtube.com/live/MdvTa58uxB0?si=Fwi-9hHoCmo794Ag

~1mth ago

theurbankind: When is the next big event, like node festival ?

~1mth ago

~1mth ago

joreg: Join us for the next vvvv meetup on Oktober 17th: https://visualprogramming.net/blog/2024/25.-vvvv-worldwide-meetup/

~2mth ago

joreg: 6 session beginner course part 2 "Deep Dive" starts January 13th: https://thenodeinstitute.org/courses/ws24-5-vvvv-beginners-part-ii/