32 #include <boost/graph/fruchterman_reingold.hpp> 33 #include <boost/graph/topology.hpp> 34 #include <boost/graph/directed_graph.hpp> 37 using namespace boost;
44 using Graph=boost::directed_graph<Item*>;
53 double operator()(
const Graph::edge_descriptor& e,
double k,
double d,
const Graph& g)
55 auto from=g[source(e,g)], to=g[target(e,g)];
56 auto m=
minD(*from,*to);
66 double operator()(
const Graph::vertex_descriptor& v1,
const Graph::vertex_descriptor& v2,
67 double k,
double d,
const Graph& g)
69 auto m=
minD(*g[v1],*g[v2]);
80 for (
auto& i: g.
items)
81 area+=double(i->width())*i->height();
83 area+=double(i->width())*i->height();
91 default_random_engine gen;
92 uniform_real_distribution<double> rng(0,1);
93 for (
auto& i: g.
items)
94 i->moveTo(layoutSize*rng(gen), layoutSize*rng(gen));
96 i->moveTo(layoutSize*rng(gen), layoutSize*rng(gen));
107 map<
Item*, decltype(gg.add_vertex())> vertexMap;
108 for (
auto& i: g.
items)
109 vertexMap.emplace(i.get(), gg.add_vertex(i.get()));
112 vertexMap.emplace(i.get(), gg.add_vertex(i.get()));
114 for (
auto& j: i->inVariables)
115 vertexMap.emplace(j.get(), gg.add_vertex(j.get()));
116 for (
auto& j: i->outVariables)
117 vertexMap.emplace(j.get(), gg.add_vertex(j.get()));
120 for (
auto& w: g.
wires)
121 gg.add_edge(vertexMap[&w->from()->item()], vertexMap[&w->to()->item()]);
124 Item functions, parameters, flowVars, intVars;
125 functions.
moveTo(-0.5*layoutSize,-0.5*layoutSize);
126 parameters.
moveTo(-0.5*layoutSize,0.5*layoutSize);
127 flowVars.
moveTo(-0.5*layoutSize,0.5*layoutSize);
128 intVars.
moveTo(0.5*layoutSize,0.5*layoutSize);
129 vertexMap.emplace(&functions, gg.add_vertex(&functions));
130 vertexMap.emplace(¶meters, gg.add_vertex(¶meters));
131 vertexMap.emplace(&flowVars, gg.add_vertex(&flowVars));
132 vertexMap.emplace(&intVars, gg.add_vertex(&intVars));
135 for (
auto& i: g.
items)
137 if (dynamic_cast<UserFunction*>(i.get()) && i->ports(0).lock()->wires().empty())
138 gg.add_edge(vertexMap[&functions], vertexMap[i.get()]);
139 else if (
auto v=i->variableCast())
140 if ((i->portsSize()>0 && i->ports(0).lock()->wires().empty()) || (i->portsSize()>1 && !i->ports(1).lock()->wires().empty()))
143 case VariableType::parameter:
144 gg.add_edge(vertexMap[¶meters], vertexMap[i.get()]);
146 case VariableType::flow:
147 gg.add_edge(vertexMap[&flowVars], vertexMap[i.get()]);
149 case VariableType::integral:
150 gg.add_edge(vertexMap[&intVars], vertexMap[i.get()]);
158 using Topology=square_topology<>;
160 using PosMap=std::map<decltype(gg.add_vertex()), Topology::point_type>;
162 const boost::associative_property_map<PosMap> pm(positions);
164 for (
auto& i: vertexMap)
166 Topology::point_type p;
169 positions[i.second]=p;
175 fruchterman_reingold_force_directed_layout
176 (gg,pm, Topology(layoutSize), attractive_force(WireForce()).repulsive_force(RepulsiveForce()).
177 cooling([&temp,&pu](){pu.
setProgress(0.1*(10-temp));
return std::max(0., temp-=0.1);}));
182 auto vertexRange=vertices(gg);
183 for (
auto i=vertexRange.first; i!=vertexRange.second; ++i)
186 gg[*i]->moveTo(p[0]+layoutSize,p[1]+layoutSize);
double totalArea(const Group &g)
void randomizeLayout(Group &g)
randomly place items on canvas
Creation and access to the minskyTCL_obj object, which has code to record whenever Minsky's state cha...
void setProgress(double fraction)
Sets the progress to a given fraction of this stack's allocation.
double operator()(const Graph::vertex_descriptor &v1, const Graph::vertex_descriptor &v2, double k, double d, const Graph &g)
double minD(const Item &item1, const Item &item2)
boost::directed_graph< Item * > Graph
void layoutGroup(Group &g)
auto layout group items
void moveTo(float x, float y)
double operator()(const Graph::edge_descriptor &e, double k, double d, const Graph &g)