void TreeCanvas::navNextSol(bool back) { QMutexLocker locker(&mutex); NextSolCursor nsc(currentNode,back,*na); PreorderNodeVisitor<NextSolCursor> nsv(nsc); nsv.run(); VisualNode* n = nsv.getCursor().node(); if (n != root) { setCurrentNode(n); centerCurrentNode(); } }
static tuple< unique_ptr<AnimObj::Geom::nds_vt>, unique_ptr<AnimObj::Geom::NormalData::NsV>, unique_ptr<AnimObj::Geom::nds_vt>> extract(AnimObj::Geom::NormalData::NsV const& ons) { std::vector<std::array<float, 3>> nrmf; Alembic::AbcGeom::N3fArraySample::value_vector::size_type const nsz = ons.size(); nrmf.reserve(nsz); for (size_t k = 0; k < nsz; ++k) { Alembic::AbcGeom::N3fArraySample::value_type const& v = ons[k]; decltype(nrmf)::value_type a = {v[0], v[1], v[2]}; nrmf.emplace_back(a); } decltype(nrmf) nrms(nrmf); std::sort(nrms.begin(), nrms.end()); std::size_t const d = std::distance(nrms.begin(), std::unique(nrms.begin(), nrms.end())); Alembic::AbcGeom::N3fArraySample::value_vector nsv(d); std::vector<std::pair<decltype(nrmf)::value_type, int>> nrmN; for (size_t m = 0; m < d; ++m) { decltype(nrms)::value_type const& n = nrms[m]; nrmN.emplace_back(n, m); nsv[m] = {n[0], n[1], n[2]}; } Alembic::AbcGeom::UInt32ArraySample::value_vector ndxv(nsz); Alembic::AbcGeom::UInt32ArraySample::value_vector ndrxv(d); decltype(nrmN)::const_iterator const& nrmNB = nrmN.cbegin(); decltype(nrmN)::const_iterator const& nrmNE = nrmN.cend(); for (size_t m = 0; m < nsz; ++m) { decltype(nrmN)::const_iterator const& found = std::lower_bound( nrmNB, nrmNE, nrmf[m], [](decltype(nrmN)::value_type const& a, decltype(nrmf)::value_type const& b) { return a.first < b; } ); if (nrmNE == found) { continue; } ndrxv[std::distance(nrmNB, found)] = m; ndxv[m] = found->second; } return std::make_tuple( std::make_unique<AnimObj::Geom::nds_vt>(ndxv), std::make_unique<AnimObj::Geom::NormalData::NsV>(nsv), std::make_unique<AnimObj::Geom::nds_vt>(ndrxv)); }
/// TODO void Gist::on_canvas_statusChanged(VisualNode* n, const Statistics& stats, bool finished) { nodeStatInspector->node(execution->getNA(),n,stats,finished); /// for single node stats if (!finished) { showNodeStats->setEnabled(false); // stop-> setEnabled(true); // reset->setEnabled(false); navNextSol->setEnabled(false); navPrevSol->setEnabled(false); // searchNext->setEnabled(false); // searchAll->setEnabled(false); toggleHidden->setEnabled(false); hideFailed->setEnabled(false); // hideSize->setEnabled(false); // labelBranches->setEnabled(false); // labelPath->setEnabled(false); // toggleStop->setEnabled(false); // unstopAll->setEnabled(false); center->setEnabled(false); /// ?? exportPDF->setEnabled(false); exportWholeTreePDF->setEnabled(false); print->setEnabled(false); // printSearchLog->setEnabled(false); bookmarkNode->setEnabled(false); bookmarksGroup->setEnabled(false); } else { // stop->setEnabled(false); // reset->setEnabled(true); if ( (n->isOpen() || n->hasOpenChildren()) && (!n->isHidden()) ) { // searchNext->setEnabled(true); // searchAll->setEnabled(true); } else { // searchNext->setEnabled(false); // searchAll->setEnabled(false); } if (n->getNumberOfChildren() > 0) { toggleHidden->setEnabled(true); hideFailed->setEnabled(true); // hideSize->setEnabled(true); // unstopAll->setEnabled(true); } else { toggleHidden->setEnabled(false); hideFailed->setEnabled(false); // hideSize->setEnabled(false); // unhideAll->setEnabled(false); // unstopAll->setEnabled(false); } toggleStop->setEnabled(n->getStatus() == STOP || n->getStatus() == UNSTOP); showNodeStats->setEnabled(true); labelPath->setEnabled(true); VisualNode* root = n; while (!root->isRoot()) { root = root->getParent(execution->getNA()); } NextSolCursor nsc(n, false, execution->getNA()); PreorderNodeVisitor<NextSolCursor> nsv(nsc); nsv.run(); navNextSol->setEnabled(nsv.getCursor().node() != root); NextSolCursor psc(n, true, execution->getNA()); PreorderNodeVisitor<NextSolCursor> psv(psc); psv.run(); navPrevSol->setEnabled(psv.getCursor().node() != root); center->setEnabled(true); exportPDF->setEnabled(true); exportWholeTreePDF->setEnabled(true); print->setEnabled(true); printSearchLog->setEnabled(true); bookmarkNode->setEnabled(true); bookmarksGroup->setEnabled(true); } emit statusChanged(stats,finished); }
Expr Ast_While::_parse_in( ParsingContext &context ) const { // watch modified variables IpSnapshot nsv( ip->ip_snapshot ); // we repeat until there are no external modified values int ne = ip->error_list.size(); std::map<Expr,Expr> unknowns; for( unsigned old_nsv_size = 0, cpt = 0; ; old_nsv_size = nsv.rooms.size(), ++cpt ) { if ( cpt == 20 ) return context.ret_error( "infinite loop during while parsing" ); ParsingContext wh_scope( &context, 0, "while_" + to_string( ok ) ); wh_scope.cont = true; ok->parse_in( wh_scope ); if ( ne != ip->error_list.size() ) return Expr(); // if no new modified variables if ( old_nsv_size == nsv.rooms.size() ) break; // replace each modified variable to a new unknown variables // (to avoid simplifications during the next round) for( std::pair<Inst *const,Expr> &it : nsv.rooms ) { Expr unk = unknown_inst( it.second->type(), cpt ); unknowns[ it.first ] = unk; const_cast<Inst *>( it.first )->set( unk, true ); } nsv.undo_parsing_contexts(); } // corr table (output number -> input number) // -> find if Unknown inst are used to compute the outputs ++Inst::cur_op_id; for( std::pair<Inst *const,Expr> &it : nsv.rooms ) const_cast<Inst *>( it.first )->get( context.cond )->mark_children(); int cpt = 0; Vec<int> corr; Vec<Type *> inp_types; for( std::pair<Inst *const,Expr> &it : nsv.rooms ) { if ( unknowns[ it.first ]->op_id == Inst::cur_op_id ) { corr << cpt++; inp_types << it.second->type(); } else corr << -1; } // prepare a while inp (for initial values of variables modified in the loop) Expr winp = while_inp( inp_types ); // set winp[...] as initial values of modified variables cpt = 0; for( std::pair<Inst *const,Expr> &it : nsv.rooms ) { int num_inp = corr[ cpt++ ]; if ( num_inp >= 0 ) const_cast<Inst *>( it.first )->set( get_nout( winp, num_inp ), true ); else const_cast<Inst *>( it.first )->set( it.second, true ); } nsv.undo_parsing_contexts(); // relaunch the while inst ParsingContext wh_scope( &context, 0, "while_" + to_string( ok ) ); wh_scope.cont = true; ok->parse_in( wh_scope ); if ( wh_scope.cont->always( false ) ) { ip->ip_snapshot = nsv.prev; } else { // make the while instruction Vec<Expr> out_exprs; for( std::pair<Inst *const,Expr> &it : nsv.rooms ) out_exprs << const_cast<Inst *>( it.first )->get( context.cond ); Expr wout = while_out( out_exprs, wh_scope.cont ); cpt = 0; Vec<Expr> inp_exprs; for( std::pair<Inst *const,Expr> &it : nsv.rooms ) if ( corr[ cpt++ ] >= 0 ) inp_exprs << it.second->simplified( context.cond ); Expr wins = while_inst( inp_exprs, winp, wout, corr ); ip->ip_snapshot = nsv.prev; // replace changed variable by while_inst outputs cpt = 0; for( std::pair<Inst *const,Expr> &it : nsv.rooms ) const_cast<Inst *>( it.first )->set( get_nout( wins, cpt++ ), context.cond ); } // break(s) to transmit ? for( ParsingContext::RemBreak rb : wh_scope.rem_breaks ) context.BREAK( rb.count, rb.cond ); return ip->void_var(); }