实现基于节点的图形界面?

dbr*_*dbr 21 python user-interface directed-graph

我想实现一个节点接口,基本上是一个DAG,每个节点在它的输入连接上执行操作,并输出一些东西(你可以连接到另一个节点)

一些示例应用:


作为第一个目标,我想拥有一个只有2个节点的图形应用程序.一个简单输出一个固定数字的"数字"和一个"加"节点,它取两个输入并输出两者之和.

正如人们已经回答的那样,我对如何在代码中表示数据有一个粗略的想法,例如在Python中寻找伪代码:

class Number:
    def __init__(self, value):
        self.value = value

    def eval(self):
        return self.value

class Add:
    def __init__(self, input1, input2):
        self.input1 = input1
        self.input2 = input2

    def eval(self):
        return self.input1.eval() + self.input2.eval()


a = Number(20)
b = Number(72)

adder = Add(a, b)
print adder.eval()
Run Code Online (Sandbox Code Playgroud)

我如何围绕此包装自定义GUI?像下面的东西,但略少手绘!

节点UI模型

我从哪里开始?我目前打算用Objective-C/Cocoa编写它,尽管我对其他语言的建议不仅仅是开放的.

Rya*_*ham 3

我将从建模一些基本界面开始(在 OOP 意义上,而不是 GUI 意义上)。在我看来,您将有一个节点,它将接受输入集合和单个输出。您没有说明数据类型的范围,但您需要一些合适的方法来表示输入/输出。对于您的第一个目标,这可以是一个整数。

在一些通用的 C 风格的 OOP 语言中(希望它有意义):

class Node<T> {
    Node<T>[] inputs;
    T eval();
}

class AdderNode extends Node<int> {
    int eval() {
        int accum = 0;
        for (inputs : i)
            accum += i.eval();
        return i;
    }
}

class ConstNode<int I> extends Node<int> {
    int eval() { return I; }
}

AdderNode a;
a.inputs.add(ConstNode<2>());
a.inputs.add(ConstNode<3>());
a.eval();
Run Code Online (Sandbox Code Playgroud)

您可以通过用一些抽象类、泛型或接口替换 int 来对此进行扩展。当然,实际实施会根据实际语言而有所不同。