void ParmLinkMgr::AddLink( Parm* pA, Parm* pB ) { //==== Make Sure Parm Are Not Already Linked ====// for ( int i = 0 ; i < (int)m_ParmLinkVec.size() ; i++ ) { if ( m_ParmLinkVec[i]->GetParmA() == pA && m_ParmLinkVec[i]->GetParmB() == pB ) { return; } } ParmLink* pl = new ParmLink(); pl->SetParmA( pA ); pl->SetParmB( pB ); pl->SetOffsetFlag( true ); pl->SetOffset( pB->get() - pA->get() ); pl->SetScaleFlag( false ); pl->SetScale( 1.0 ); pA->set_linked_flag( true ); pB->set_linked_flag( true ); m_ParmLinkVec.push_back( pl ); m_CurrParmLinkIndex = (int)m_ParmLinkVec.size() - 1; m_ParmLinkMap[pl->GetParmA()].push_back( pl ); ParmChanged( pl->GetParmA(), true ); // Trigger Update }
void ParmLinkMgr::ReadLinks(xmlNodePtr root, vector< Geom* > & geomVec) { vector< Geom* > gVec = geomVec; gVec.push_back( aircraftPtr->getUserGeom() ); xmlNodePtr node_list = xmlGetNode( root, "ParmLink_List", 0 ); if ( node_list ) { int num_links = xmlGetNumNames( node_list, "Link" ); for ( int i = 0 ; i < num_links ; i++ ) { xmlNodePtr link_node = xmlGetNode( node_list, "Link", i ); if ( link_node ) { int geomA_id = xmlFindInt( link_node, "GeomA", 0 ); Stringc groupA_name = Stringc( xmlFindString( link_node, "GroupA", " " ) ); Stringc parmA_name = Stringc( xmlFindString( link_node, "ParmA", " " ) ); Parm* parmA = FindParm( gVec, geomA_id, groupA_name, parmA_name ); int geomB_id = xmlFindInt( link_node, "GeomB", 0 ); Stringc groupB_name = Stringc( xmlFindString( link_node, "GroupB", " " ) ); Stringc parmB_name = Stringc( xmlFindString( link_node, "ParmB", " " ) ); Parm* parmB = FindParm( gVec, geomB_id, groupB_name, parmB_name ); if ( parmA && parmB ) { ParmLink* pl = new ParmLink(); pl->SetParmA( parmA ); pl->SetParmB( parmB ); pl->SetOffsetFlag( !!xmlFindInt( link_node, "OffsetFlag", 0 ) ); pl->SetOffset( xmlFindDouble( link_node, "Offset", 0.0 ) ); pl->SetScaleFlag( !!xmlFindInt( link_node, "ScaleFlag", 0 ) ); pl->SetScale( xmlFindDouble( link_node, "Scale", 1.0 ) ); pl->SetLowerLimitFlag( !!xmlFindInt( link_node, "LowerLimitFlag", 0 ) ); pl->SetLowerLimit( xmlFindDouble( link_node, "LowerLimit", 0.0 ) ); pl->SetUpperLimitFlag( !!xmlFindInt( link_node, "UpperLimitFlag", 0 ) ); pl->SetUpperLimit( xmlFindDouble( link_node, "UpperLimit", 0.0 ) ); pl->GetParmA()->set_linked_flag( true ); pl->GetParmB()->set_linked_flag( true ); m_ParmLinkVec.push_back( pl ); m_CurrParmLinkIndex = (int)m_ParmLinkVec.size() - 1; } } } } }
void ParmLinkScreen::screenCB( Fl_Widget* w ) { ParmLink* currLink = parmLinkMgrPtr->GetCurrParmLink(); if ( w == parmLinkUI->compAChoice || w == parmLinkUI->compBChoice || w == parmLinkUI->groupAChoice || w == parmLinkUI->groupBChoice || w == parmLinkUI->parmAChoice || w == parmLinkUI->parmBChoice) { compGroupLinkChange(); } else if ( w == parmLinkUI->offsetButton ) { if ( parmLinkUI->offsetButton->value() ) currLink->SetOffsetFlag( true ); else currLink->SetOffsetFlag( false ); m_OffsetSlider->Activate(); if ( !currLink->GetOffsetFlag() ) m_OffsetSlider->Deactivate(); parmLinkMgrPtr->ParmChanged( currLink->GetParmA(), true ); } else if ( w == parmLinkUI->scaleButton ) { if ( parmLinkUI->scaleButton->value() ) currLink->SetScaleFlag( true ); else currLink->SetScaleFlag( false ); m_ScaleSlider->Activate(); if ( !currLink->GetScaleFlag() ) m_ScaleSlider->Deactivate(); parmLinkMgrPtr->ParmChanged( currLink->GetParmA(), true ); } else if ( w == parmLinkUI->lowerLimitButton ) { if ( parmLinkUI->lowerLimitButton->value() ) currLink->SetLowerLimitFlag( true ); else currLink->SetLowerLimitFlag( false ); m_LowerLimitSlider->Activate(); if ( !currLink->GetLowerLimitFlag() ) m_LowerLimitSlider->Deactivate(); parmLinkMgrPtr->ParmChanged( currLink->GetParmA(), true ); } else if ( w == parmLinkUI->upperLimitButton ) { if ( parmLinkUI->upperLimitButton->value() ) currLink->SetUpperLimitFlag( true ); else currLink->SetUpperLimitFlag( false ); m_UpperLimitSlider->Activate(); if ( !currLink->GetUpperLimitFlag() ) m_UpperLimitSlider->Deactivate(); parmLinkMgrPtr->ParmChanged( currLink->GetParmA(), true ); } else if ( w == parmLinkUI->addLinkButton ) { bool success = parmLinkMgrPtr->AddCurrLink(); if ( !success ) fl_alert( "Error: Identical Parms or Already Linked" ); update(); } else if ( w == parmLinkUI->deleteLinkButton ) { parmLinkMgrPtr->DelCurrLink(); update(); } else if ( w == parmLinkUI->deleteAllLinksButton ) { parmLinkMgrPtr->DelAllLinks(); update(); } else if ( w == parmLinkUI->linkAllCompButton ) { bool success = parmLinkMgrPtr->LinkAllComp(); if ( !success ) fl_alert( "Error: Identical Comps" ); update(); } else if ( w == parmLinkUI->linkAllGroupButton ) { bool success = parmLinkMgrPtr->LinkAllGroup(); if ( !success ) fl_alert( "Error: Identical Group" ); update(); } else if ( w == parmLinkUI->linkBrowser ) { int sel = parmLinkUI->linkBrowser->value(); parmLinkMgrPtr->SetCurrParmLinkIndex( sel-2 ); update(); } else if ( m_OffsetSlider->GuiChanged( w ) ) { currLink->SetOffset( m_OffsetSlider->GetVal() ); parmLinkMgrPtr->ParmChanged( currLink->GetParmA(), true ); } else if ( m_ScaleSlider->GuiChanged( w ) ) { currLink->SetScale( m_ScaleSlider->GetVal() ); parmLinkMgrPtr->ParmChanged( currLink->GetParmA(), true ); } else if ( m_LowerLimitSlider->GuiChanged( w ) ) { currLink->SetLowerLimit( m_LowerLimitSlider->GetVal() ); parmLinkMgrPtr->ParmChanged( currLink->GetParmA(), true ); } else if ( m_UpperLimitSlider->GuiChanged( w ) ) { currLink->SetUpperLimit( m_UpperLimitSlider->GetVal() ); parmLinkMgrPtr->ParmChanged( currLink->GetParmA(), true ); } aircraftPtr->triggerDraw(); }