Пример #1
0
void ParmLinkMgr::WriteLinks( xmlNodePtr root )
{
	xmlNodePtr link_list_node = xmlNewChild( root, NULL, (const xmlChar *)"ParmLink_List", NULL );

	for ( int i = 0 ; i < (int)m_ParmLinkVec.size() ; i++ )
	{
		ParmLink* pl = m_ParmLinkVec[i];
		xmlNodePtr link_node = xmlNewChild( link_list_node, NULL, (const xmlChar *)"Link", NULL );
		xmlAddIntNode( link_node, "GeomA", ((Geom*)pl->GetParmA()->get_geom_base())->getPtrID() );
		xmlAddStringNode( link_node, "GroupA", pl->GetParmA()->get_group_name().get_char_star() );
		xmlAddStringNode( link_node, "ParmA",  pl->GetParmA()->get_name().get_char_star() );

		xmlAddIntNode( link_node, "GeomB", ((Geom*)pl->GetParmB()->get_geom_base())->getPtrID() );
		xmlAddStringNode( link_node, "GroupB", pl->GetParmB()->get_group_name().get_char_star() );
		xmlAddStringNode( link_node, "ParmB",  pl->GetParmB()->get_name().get_char_star() );

		xmlAddIntNode( link_node, "OffsetFlag", pl->GetOffsetFlag() );
		xmlAddDoubleNode( link_node, "Offset",  pl->GetOffset() );
		xmlAddIntNode( link_node, "ScaleFlag",  pl->GetScaleFlag() );
		xmlAddDoubleNode( link_node, "Scale",   pl->GetScale() );

		xmlAddIntNode( link_node, "LowerLimitFlag", pl->GetLowerLimitFlag() );
		xmlAddDoubleNode( link_node, "LowerLimit",  pl->GetLowerLimit() );
		xmlAddIntNode( link_node, "UpperLimitFlag", pl->GetUpperLimitFlag() );
		xmlAddDoubleNode( link_node, "UpperLimit",  pl->GetUpperLimit() );

	}
}
Пример #2
0
void ParmLinkMgr::ParmChanged( Parm* parmPtr, bool start_flag  )
{
	int i;
	map< Parm*, vector< ParmLink* > >::iterator itr;

	//==== Look for Links and Modify Linked Parms ====//
	itr = m_ParmLinkMap.find( parmPtr );

	if ( itr == m_ParmLinkMap.end() )
		return;

	if ( parmPtr->get_link_update_flag() == true )
		return;

	vector< ParmLink* > plVec = itr->second;

	if ( plVec.size() == 0 )
		return;

	parmPtr->set_link_update_flag( true );
	m_UpdatedParmVec.push_back( parmPtr );

	for ( i = 0 ; i < (int)plVec.size() ; i++ )
	{
		ParmLink* pl = plVec[i];

		if ( pl->GetParmB()->get_link_update_flag() == false )			// Prevent Circular 
		{
			double offset = 0.0;
			if ( pl->GetOffsetFlag() )	offset = pl->GetOffset();
			double scale = 1.0;
			if ( pl->GetScaleFlag() )	scale = pl->GetScale();

			double val = parmPtr->get()*scale + offset;

			if ( pl->GetLowerLimitFlag() && val < pl->GetLowerLimit() )		// Constraints
				val = pl->GetLowerLimit();

			if ( pl->GetUpperLimitFlag() && val > pl->GetUpperLimit() )		// Constraints
				val = pl->GetUpperLimit();

			pl->GetParmB()->set_from_link( val );
			pl->GetParmB()->get_geom()->parm_changed( pl->GetParmB() );
		}
	}

	if ( start_flag )										// Clean Up
	{
		for ( i = 0 ; i < (int)m_UpdatedParmVec.size() ; i++ )
			m_UpdatedParmVec[i]->set_link_update_flag( false );

		m_UpdatedParmVec.clear();
	}
}
Пример #3
0
void ParmLinkScreen::update()
{
	int i;
	char str[256];

	ParmLink* currLink = parmLinkMgrPtr->GetCurrParmLink();

	if ( currLink->GetParmA() == NULL || currLink->GetParmB() == NULL )
		currLink = parmLinkMgrPtr->ResetWorkingParmLink();

	//==== Geom Names A ====//
	parmLinkUI->compAChoice->clear();
	vector< string > geomNameVecA;
	int indA = parmLinkMgrPtr->GetCurrGeomNameVec( currLink->GetParmA(), geomNameVecA );
	for ( i = 0 ; i < (int)geomNameVecA.size() ; i++ )
	{
		sprintf( str, "%d-%s", i,  geomNameVecA[i].c_str() );
		parmLinkUI->compAChoice->add( str );
	}
		//parmLinkUI->compAChoice->add( geomNameVecA[i].c_str() );
	parmLinkUI->compAChoice->value( indA );

	//==== Group Names A ====//
	parmLinkUI->groupAChoice->clear();
	vector< string > groupNameVecA;
	indA = parmLinkMgrPtr->GetCurrGroupNameVec( currLink->GetParmA(), groupNameVecA );
	for ( i = 0 ; i < (int)groupNameVecA.size() ; i++ )
		parmLinkUI->groupAChoice->add( groupNameVecA[i].c_str() );
	parmLinkUI->groupAChoice->value( indA );

	//==== Parm Names A =====//
	parmLinkUI->parmAChoice->clear();
	vector< string > parmNameVecA;
	indA = parmLinkMgrPtr->GetCurrParmNameVec( currLink->GetParmA(), parmNameVecA );
	for ( i = 0 ; i < (int)parmNameVecA.size() ; i++ )
		parmLinkUI->parmAChoice->add( parmNameVecA[i].c_str() );
	parmLinkUI->parmAChoice->value( indA );

	//==== Geom Names B ====//
	parmLinkUI->compBChoice->clear();
	vector< string > geomNameVecB;
	int indB = parmLinkMgrPtr->GetCurrGeomNameVec( currLink->GetParmB(), geomNameVecB );
	for ( i = 0 ; i < (int)geomNameVecB.size() ; i++ )
	{
		sprintf( str, "%d-%s", i,  geomNameVecB[i].c_str() );
		parmLinkUI->compBChoice->add( str );
	}
//		parmLinkUI->compBChoice->add( geomNameVecB[i].c_str() );
	parmLinkUI->compBChoice->value( indB );

	//==== Group Names B ====//
	parmLinkUI->groupBChoice->clear();
	vector< string > groupNameVecB;
	indB = parmLinkMgrPtr->GetCurrGroupNameVec( currLink->GetParmB(), groupNameVecB );
	for ( i = 0 ; i < (int)groupNameVecB.size() ; i++ )
		parmLinkUI->groupBChoice->add( groupNameVecB[i].c_str() );
	parmLinkUI->groupBChoice->value( indB );

	//==== Parm Names B =====//
	parmLinkUI->parmBChoice->clear();
	vector< string > parmNameVecB;
	indB = parmLinkMgrPtr->GetCurrParmNameVec( currLink->GetParmB(), parmNameVecB );
	for ( i = 0 ; i < (int)parmNameVecB.size() ; i++ )
		parmLinkUI->parmBChoice->add( parmNameVecB[i].c_str() );
	parmLinkUI->parmBChoice->value( indB );

	//===== Update Offset ====//
	parmLinkUI->offsetButton->value(1);
	m_OffsetSlider->Activate();
	if ( !currLink->GetOffsetFlag() )
	{
		parmLinkUI->offsetButton->value(0);
		m_OffsetSlider->Deactivate();
	}

	m_OffsetSlider->SetVal( currLink->GetOffset() );
	m_OffsetSlider->UpdateGui();

	//===== Update Scale ====//
	parmLinkUI->scaleButton->value(1);
	m_ScaleSlider->Activate();
	if ( !currLink->GetScaleFlag() )
	{
		parmLinkUI->scaleButton->value(0);
		m_ScaleSlider->Deactivate();
	}

	m_ScaleSlider->SetVal( currLink->GetScale() );
	m_ScaleSlider->UpdateGui();

	//===== Update Lower Limit ====//
	parmLinkUI->lowerLimitButton->value(1);
	m_LowerLimitSlider->Activate();
	if ( !currLink->GetLowerLimitFlag() )
	{
		parmLinkUI->lowerLimitButton->value(0);
		m_LowerLimitSlider->Deactivate();
	}
	m_LowerLimitSlider->SetVal( currLink->GetLowerLimit() );
	m_LowerLimitSlider->UpdateGui();

	//===== Update Upper Limit ====//
	parmLinkUI->upperLimitButton->value(1);
	m_UpperLimitSlider->Activate();
	if ( !currLink->GetUpperLimitFlag() )
	{
		parmLinkUI->upperLimitButton->value(0);
		m_UpperLimitSlider->Deactivate();
	}
	m_UpperLimitSlider->SetVal( currLink->GetUpperLimit() );
	m_UpperLimitSlider->UpdateGui();

	//==== Update Link Browser ====//
	parmLinkUI->linkBrowser->clear();

	static int widths[] = { 75,75,90,20,75,75,80,0 };	// widths for each column
	parmLinkUI->linkBrowser->column_widths(widths);		// assign array to widget
	parmLinkUI->linkBrowser->column_char(':');			// use : as the column character

	sprintf( str, "@[email protected]_A:@[email protected]:@[email protected]:->:@[email protected]_B:@[email protected]:@[email protected]" );
	parmLinkUI->linkBrowser->add( str ); 

	vector< ParmLink* > parmLinkVec = parmLinkMgrPtr->GetParmLinkVec();
	for ( i = 0 ; i < (int)parmLinkVec.size() ; i++ )
	{
		Parm* pa = parmLinkVec[i]->GetParmA();
		Parm* pb = parmLinkVec[i]->GetParmB();
		sprintf( str, "%s:%s:%s:->:%s:%s:%s", 
			pa->get_geom_base()->getName().get_char_star(), pa->get_group_name().get_char_star(), pa->get_name().get_char_star(),
			pb->get_geom_base()->getName().get_char_star(), pb->get_group_name().get_char_star(), pb->get_name().get_char_star() );
		parmLinkUI->linkBrowser->add( str ); 
	}

	int index = parmLinkMgrPtr->GetCurrParmLinkIndex();
	if ( index >= 0 && index < (int)parmLinkVec.size() ) 
		parmLinkUI->linkBrowser->select( index+2 );

	parmLinkUI->UIWindow->redraw();

	for ( int i = 0 ; i < (int)m_ParmButtonVec.size() ; i++ )
	{
		m_ParmButtonVec[i]->update();
	}
}