61 auto ret = std::make_shared<QtDataModelRegistry>();
63 for (
auto const c : *classMap)
67 QString str = QString::fromStdString(c.first);
69 std::shared_ptr<dyno::Module> module(
dynamic_cast<dyno::Module*
>(obj));
71 if (module !=
nullptr)
73 QtDataModelRegistry::RegistryItemCreator creator = [str]() {
75 std::shared_ptr<dyno::Module> new_module(
dynamic_cast<dyno::Module*
>(new_obj));
76 auto dat = std::make_unique<QtModuleWidget>(new_module);
80 QString category = QString::fromStdString(module->getModuleType());
85 this->setRegistry(ret);
148 std::map<dyno::ObjectId, QtNode*> moduleMap;
156 auto addModuleWidget = [&](std::shared_ptr<Module> m) ->
void
158 auto mId = m->objectId();
160 auto type = std::make_unique<QtModuleWidget>(m);
162 auto& node = this->createNode(std::move(type));
164 moduleMap[mId] = &node;
166 QPointF posView(m->bx(), m->by());
168 node.nodeGraphicsObject().setPos(posView);
170 this->nodePlaced(node);
174 mStates = std::make_shared<dyno::States>();
177 for (
auto field : fields)
182 mStates->addOutputField(field);
188 mStates->setBlockCoord(pos.x(), pos.y());
192 for (
auto m : modules)
194 addModuleWidget(m.second);
197 auto createModuleConnections = [&](std::shared_ptr<Module> m) ->
void
199 auto inId = m->objectId();
201 if (moduleMap.find(inId) != moduleMap.end()) {
202 auto inBlock = moduleMap[m->objectId()];
204 auto imports = m->getImportModules();
206 if (m->allowImported())
208 for (
int i = 0; i < imports.size(); i++)
213 auto moduleSrc = imports[i]->getModules()[0];
214 if (moduleSrc !=
nullptr)
216 auto outId = moduleSrc->objectId();
217 if (moduleMap.find(outId) != moduleMap.end())
219 auto outBlock = moduleMap[moduleSrc->objectId()];
220 createConnection(*inBlock, i, *outBlock, 0);
228 auto& modules = imports[i]->getModules();
230 for (
int j = 0; j < modules.size(); j++)
232 if (modules[j] !=
nullptr)
234 auto outId = modules[j]->objectId();
235 if (moduleMap.find(outId) != moduleMap.end())
237 auto outBlock = moduleMap[outId];
238 createConnection(*inBlock, i, *outBlock, 0);
248 auto fieldIn = m->getInputFields();
250 for (
int i = 0; i < fieldIn.size(); i++)
252 auto fieldSrc = fieldIn[i]->getSource();
253 if (fieldSrc !=
nullptr) {
254 auto parSrc = fieldSrc->parent();
255 if (parSrc !=
nullptr)
258 if (moduleSrc ==
nullptr)
266 uint outFieldIndex = 0;
267 bool fieldFound =
false;
268 for (
auto f : fieldsOut)
280 uint inFieldIndex = m->allowImported() ? i + imports.size() : i;
282 if (fieldFound && moduleMap.find(outId) != moduleMap.end())
284 auto outBlock = moduleMap[outId];
285 createConnection(*inBlock, inFieldIndex, *outBlock, outFieldIndex);
293 for (
auto m : modules)
295 createModuleConnections(m.second);
299 mOutputs = std::make_shared<dyno::Outputs>();
301 auto hasModuleConnected = [&](
FBase* f) ->
bool
303 bool fieldFound =
false;
304 auto fieldSrc = f->getSource();
305 if (fieldSrc !=
nullptr) {
306 auto parSrc = fieldSrc->parent();
307 if (parSrc !=
nullptr)
310 if (moduleSrc ==
nullptr)
318 if (moduleMap.find(outId) != moduleMap.end())
320 for (
auto f : fieldsOut)
335 for (
auto field : output_fields)
343 if (
mOutputs->getInputFields().size() > 0)
345 mOutputs->setBlockCoord(pos.x() + 500, pos.y());
469 auto constructDAG = [&](std::shared_ptr<Module> m) ->
void
471 if (m->allowImported())
473 auto imports = m->getImportModules();
474 for (
int i = 0; i < imports.size(); i++)
476 auto inId = m->objectId();
480 auto module = imports[i]->getModules()[0];
481 if (module !=
nullptr)
483 auto outId =
module->objectId();
490 auto& modules = imports[i]->getModules();
491 for (
int j = 0; j < modules.size(); j++)
493 if (modules[j] !=
nullptr)
495 auto outId = modules[j]->objectId();
505 auto outId = m->objectId();
506 auto fieldOut = m->getOutputFields();
507 for (
int i = 0; i < fieldOut.size(); i++)
509 auto& sinks = fieldOut[i]->getSinks();
510 for (
auto sink : sinks)
512 if (sink !=
nullptr) {
513 auto parSrc = sink->parent();
514 if (parSrc !=
nullptr)
518 if (nodeSrc !=
nullptr)
532 for (
auto it = mlists.begin(); it != mlists.end(); it++)
541 auto& _nodes = this->nodes();
542 std::map<dyno::ObjectId, QtNode*> qtNodeMapper;
543 std::map<dyno::ObjectId, Module*> moduleMapper;
544 for (
auto const& _node : _nodes)
546 auto const& qtNode = _node.second;
547 auto model = qtNode->nodeDataModel();
551 if (model !=
nullptr)
553 auto m = nodeData->getModule();
556 qtNodeMapper[m->objectId()] = qtNode.get();
557 moduleMapper[m->objectId()] = m.get();
562 float offsetX = 0.0f;
565 auto& xc = layout.
layer(l);
567 float offsetY = 0.0f;
569 for (
size_t index = 0; index < xc.size(); index++)
572 if (qtNodeMapper.find(
id) != qtNodeMapper.end())
574 QtNode* qtNode = qtNodeMapper[id];
575 NodeGeometry& geo = qtNode->nodeGeometry();
577 float w = geo.width();
578 float h = geo.height();
580 xMax = std::max(xMax, w);
582 Module* node = moduleMapper[id];
586 offsetY += (h +
mDy);
590 offsetX += (xMax +
mDx);
601 qtNodeMapper.clear();
602 moduleMapper.clear();