1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#include <stdio.h>
#include "rotor.h"
#include "nodes.h"
#include "factory.h"
using namespace std;
using namespace Rotor;
Json::Value Node::list_json(){
Json::Value node;
node["node_type"]=node_type;
node["title"]=title;
node["output_type"]=output_type();
node["description"]=description;
node["node_id"]=node_id;
node["ui_type"]=ui_type;
if (vars.size()){
node["vars"]=Json::arrayValue;
for (auto& var: vars) {
string type=var.second->get_type();
Json::Value newvar;
newvar["type"]=type;
newvar["connectable"]=var.second->connectable?"yes":"no";
if (dynamic_cast<Variable_array*>(var.second)){
newvar["input"]=Json::arrayValue;
for (auto& element: dynamic_cast<Variable_array*>(var.second)->values) {
Json::Value newvalue;
newvar["input"].append(newvalue);
}
}
else {
newvar["input"]=Json::Value();
}
node["vars"].append(newvar);
}
}
/*
if (_node->inputs.size()){
node["signal_inputs"]=Json::arrayValue;
for (auto& input: _node->inputs) {
Json::Value signal_input;
signal_input["title"]=input->title;
signal_input["description"]=input->description;
node["signal_inputs"].append(signal_input);
}
}
if (dynamic_cast<Image_node*> (_node)!=nullptr) {
if ((dynamic_cast<Image_node*>(_node))->image_inputs.size()){
node["image_inputs"]=Json::arrayValue;
for (auto& input: (dynamic_cast<Image_node*>(_node))->image_inputs) {
Json::Value image_input;
image_input["title"]=input->title;
image_input["description"]=input->description;
node["image_inputs"].append(image_input);
}
}
}
if (_node->parameters.size()){
node["parameters"]=Json::arrayValue;
for (auto& param: _node->parameters) {
Json::Value parameter;
parameter["name"]=param.first;
parameter["type"]=param.second->type;
parameter["title"]=param.second->title;
parameter["description"]=param.second->description;
parameter["value"]=param.second->value;
parameter["min"]=param.second->min;
parameter["max"]=param.second->max;
parameter["step"]=param.second->step;
node["parameters"].append(parameter);
}
}
if (_node->attributes.size()){
node["attributes"]=Json::arrayValue;
for (auto& attr: _node->attributes) {
Json::Value attribute;
attribute["name"]=attr.first;
attribute["title"]=attr.second->title;
attribute["description"]=attr.second->description;
if (attr.second->vals.size()){ //document attribute enumeration
attribute["value"]=attr.second->value;
attribute["type"]="enum";
attribute["options"]=Json::arrayValue;
for (auto val: attr.second->vals){
attribute["options"].append(val);
}
}
else {
attribute["type"]=attr.second->type;
if (attr.second->type=="array"){
attribute["value"]=Json::arrayValue;
}
else attribute["value"]=attr.second->value;
}
node["attributes"].append(attribute);
}
}
*/
return node;
}
//factory generates linker errors if rotor.h implementation is seperated: why?
int main(){
Node_factory f;
/*
map<string,string> settings={{"node_type","time"}};
Node *t=f.create(settings);
settings={{"value","2"},{"node_type","multiply"}};
Node *m=f.create(settings);
if (!m->connect("inlet",t)) printf("not connected...\n");
settings={{"node_type","print"}};
Node *p=f.create(settings);
if (!p->connect("inlet",m)) printf("not connected...\n");
for (double t=0;t<10.0;t+=0.765){
Frame_parameters f=Frame_parameters(t,25.0,10.0,640,360);
printf("%04f %s\n",t,(dynamic_cast<Node_type<string>*>(p))->get_output(f).c_str());
}
delete t;
delete m;
delete p;
*/
Json::Value js;
f.list_node("multiply",js);
Json::StyledWriter writer;
cerr<<writer.write(js)<<endl;
}
|