populate a group object from this. This mutates the ids in a consistent way into the free id space of the global minsky object
638 auto& itemMap=impl->reverseItemMap;
639 map<int, weak_ptr<minsky::Port>> portMap;
640 map<int, schema3::Item> schema3VarMap;
641 const MinskyItemFactory
factory;
644 for (
const auto& i:
items)
648 for (
size_t j=0; j<min(newItem->portsSize(), i.ports.size()); ++j)
649 portMap[i.ports[j]]=newItem->ports(j);
650 if (newItem->variableCast())
651 schema3VarMap[i.id]=i;
662 for (
const auto& i:
items)
664 if ((i.type==
"IntOp" || i.type==
"Operation:integrate") && i.intVar)
666 assert(itemMap.count(i.id));
667 assert(dynamic_pointer_cast<minsky::IntOp>(itemMap[i.id]));
668 if (
auto* integ=dynamic_cast<minsky::IntOp*>(itemMap[i.id].get()))
670 assert(integ->intVar);
672 if (itemMap.contains(*i.intVar))
674 if (integ->coupled()) integ->toggleCoupled();
676 integ->intVar=itemMap[*i.intVar];
679 integ->description(integ->description());
681 auto iv=schema3VarMap.find(*i.intVar);
682 if (iv!=schema3VarMap.end())
683 if ((!i.ports.empty() && !iv->second.ports.empty() && i.ports[0]==iv->second.ports[0]) != integ->coupled())
684 integ->toggleCoupled();
686 if (!i.ports.empty())
687 portMap[i.ports[0]]=integ->coupled()? integ->intVar->ports(0): integ->ports(0);
690 if (i.type==
"GodleyIcon")
692 assert(itemMap.count(i.id));
693 if (
auto*
godley=dynamic_cast<minsky::GodleyIcon*>(itemMap[i.id].get()))
696 for (
auto p: i.ports)
698 auto newP=portMap.find(p);
699 if (newP!=portMap.end())
700 if (
auto ip=g.
findItem(newP->second.lock()->item()))
701 if (
auto v=dynamic_pointer_cast<minsky::VariableBase>(ip))
705 stockVars.push_back(v);
708 flowVars.push_back(v);
722 if (i.type==
"Ravel" && i.lockGroup)
723 if (
auto r=dynamic_pointer_cast<minsky::Ravel>(itemMap[i.id]))
727 r->lockGroup->addRavel(r);
728 if (i.lockGroupHandles)
729 r->lockGroup->setLockHandles({i.lockGroupHandles->begin(), i.lockGroupHandles->end()});
734 for (
auto& lgi: this->lockGroups)
736 auto lockGroup=make_shared<minsky::RavelLockGroup>();
737 for (
auto i: lgi.ravels)
738 if (
auto r=dynamic_pointer_cast<minsky::Ravel>(itemMap[i]))
740 lockGroup->addRavel(r);
741 r->lockGroup=lockGroup;
744 lockGroup->addRavel({});
745 lockGroup->handleLockInfo=lgi.handleLockInfo;
748 for (
const auto& w:
wires)
749 if (portMap.contains(
w.to) && portMap.contains(
w.from))
755 for (
const auto& i:
groups)
759 for (
const auto& i:
groups)
761 assert(itemMap.count(i.id));
762 auto newG=dynamic_pointer_cast<
minsky::Group>(itemMap[i.id]);
765 for (
auto j: i.items)
767 auto it=itemMap.find(j);
768 if (it!=itemMap.end())
770 newG->
addItem(it->second,
true);
773 if (i.displayPlot>=0)
775 auto it=itemMap.find(i.displayPlot);
776 if (it!=itemMap.end())
777 newG->displayPlot=dynamic_pointer_cast<minsky::PlotWidget>(it->second);
780 for (
auto j: *i.inVariables)
782 auto it=itemMap.find(j);
783 if (it!=itemMap.end())
784 if (
auto v=dynamic_pointer_cast<minsky::VariableBase>(it->second))
786 newG->addItem(it->second);
787 newG->inVariables.push_back(v);
792 for (
auto j: *i.outVariables)
794 auto it=itemMap.find(j);
795 if (it!=itemMap.end())
796 if (
auto v=dynamic_pointer_cast<minsky::VariableBase>(it->second))
798 newG->addItem(it->second);
799 newG->outVariables.push_back(v);
806 for (
auto& i: schema3VarMap)
808 auto it=itemMap.find(i.first);
809 if (!it->second)
continue;
810 if (
auto* v=it->second->variableCast())
813 v->init(*i.second.init);
815 v->setUnits(*i.second.units);
817 if (
auto val=v->vValue())
819 if (i.second.csvDataSpec)
820 val->csvDialog.spec=*i.second.csvDataSpec;
822 val->csvDialog.url=*i.second.url;
823 if (i.second.tensorData)
828 civita::TensorVal tmp;
831 val->tensorInit=std::move(tmp);
832 assert(val->idxInRange());
834 catch (
const std::exception& ex) {
835 val->tensorInit.hypercube({});
836 #if !defined(NDEBUG) || !defined(_WIN32) 837 cout<<ex.what()<<endl;
841 val->tensorInit.hypercube({});
842 assert(val->idxInRange());
vector< LockGroup > lockGroups
std::vector< VariablePtr > inVariables
void populateWire(minsky::Wire &x, const Wire &y)
classdesc::pack_t decode(const classdesc::CDATA &data)
decode ascii-encoded representation to binary data
ItemPtr addItem(const std::shared_ptr< Item > &it, bool inSchema=false) override
void populateNote(minsky::NoteBase &x, const Note &y)
std::vector< VariablePtr > outVariables
ItemPtr findItem(const Item &it) const
finds item within this group or subgroups. Returns null if not found
GroupPtr addGroup(const std::shared_ptr< Group > &)
void unpack(classdesc::pack_t &b, civita::XVector &a)
Optional< vector< int > > outVariables
static void setStockAndFlow(minsky::GodleyIcon &g, const minsky::GodleyIcon::Variables &flowVars, const minsky::GodleyIcon::Variables &stockVars)
std::unique_ptr< T > factory(const std::string &)
std::vector< VariablePtr > Variables
WirePtr addWire(const Item &from, const Item &to, unsigned toPortIdx, const std::vector< float > &coords)
add a wire from item from, to item to, connecting to the toIdx port of to, with coordinates ...
void populateItem(minsky::Item &x, const Item &y)
Optional< vector< int > > inVariables
ItemPtr removeItem(const Item &)