void PHolderListMgr::WritePHolderListXDDM( char *newfile )
{
	xmlDocPtr doc = xmlNewDoc((const xmlChar *)"1.0");

	xmlNodePtr model_node = xmlNewNode(NULL,(const xmlChar *)"Model");
	xmlDocSetRootElement(doc, model_node);

	xmlSetProp( model_node, (const xmlChar *)"ID", (const xmlChar *)aircraftPtr->getFileName().get_char_star() );
	xmlSetProp( model_node, (const xmlChar *)"Modeler", (const xmlChar *)"OpenVSP" );
	xmlSetProp( model_node, (const xmlChar *)"Wrapper", (const xmlChar *)"wrap_vsp.csh" );

	for ( int i = 0 ; i < (int)m_PHolderVec.size() ; i++ )
	{
		Parm* p = m_PHolderVec[i]->getParm();

		xmlNodePtr var_node;

		if( m_PHolderVec[i]->getDesType() == XDDM_VAR )
			var_node = xmlNewChild( model_node, NULL, (const xmlChar *)"Variable", NULL );
		else
			var_node = xmlNewChild( model_node, NULL, (const xmlChar *)"Constant", NULL );

		char varname[255];
		sprintf( varname, "%d:%s:%s:%s", ((Geom*)p->get_geom_base())->getPtrID(), p->get_geom_base()->getName().get_char_star(), p->get_group_name().get_char_star(), p->get_name().get_char_star() );

		xmlSetProp( var_node, (const xmlChar *)"ID", (const xmlChar *)varname );
		xmlSetDoubleProp( var_node, "Value", p->get() );
		xmlSetDoubleProp( var_node, "Min", p->get_lower() );
		xmlSetDoubleProp( var_node, "Max", p->get_upper() );
		xmlSetProp( var_node, (const xmlChar *)"VSPVarName", (const xmlChar *)varname );
	}

	//===== Save XML Tree and Free Doc =====//
	xmlSaveFormatFile((const char *)newfile, doc, 1);
	xmlFreeDoc( doc );
}
void PHolderListMgr::ReadPHolderListXDDM( char *newfile )
{
	pHolderListMgrPtr->DelAllPHolders();

	//==== Read Xml File ====//
	xmlDocPtr doc;
	xmlNodePtr node;

	LIBXML_TEST_VERSION
	xmlKeepBlanksDefault(0);

	//==== Build an XML tree from a the file ====//
	doc = xmlParseFile(newfile);
//			if (doc == NULL) return 0;

	xmlNodePtr root = xmlDocGetRootElement(doc);
	if (root == NULL)
	{
		fprintf(stderr,"empty document\n");
		xmlFreeDoc(doc);
//				return 0;
	}

	vector< Geom* > gVec = aircraftPtr->getGeomVec();
	gVec.push_back( aircraftPtr->getUserGeom() );

	vector< xmlNodePtr > vlist;

	int num_v = xmlGetNumNames( root, "Variable" );
	for ( int i = 0 ; i < num_v ; i++ )
	{
		xmlNodePtr var_node = xmlGetNode( root, "Variable", i );
		vlist.push_back( var_node );
	}

	int num_c = xmlGetNumNames( root, "Constant" );
	for ( int i = 0 ; i < num_c ; i++ )
	{
		xmlNodePtr cst_node = xmlGetNode( root, "Constant", i );
		vlist.push_back( cst_node );
	}

	int num_tot = num_v + num_c;

	for ( int i = 0 ; i < num_tot ; i++ )
	{
		xmlNodePtr var_node = vlist[i];

		if ( var_node )
		{
			Stringc varname = Stringc( xmlFindPropString( var_node, "VSPVarName", " " ) );

			int istart = 0;
			int iend = varname.search_for_substring(':');
			int id = varname.get_range( istart, iend-1 ).convert_to_integer();

			istart = iend + 1;
			iend = varname.search_for_substring( istart, ':' );
			istart = iend + 1;
			iend = varname.search_for_substring( istart, ':' );
			Stringc group = varname.get_range( istart, iend-1 );

			istart = iend + 1;
			iend = varname.get_length();
			Stringc parm = varname.get_range( istart, iend-1 );

			Parm* p = parmMgrPtr->FindParm( gVec, id, group, parm );

			if ( p )
			{
				double val = xmlFindPropDouble( var_node, "Value", p->get() );

				p->set_from_link( val );
				p->get_geom()->parm_changed( p );

				ParmHolder* ph = new ParmHolder();
				ph->setParm( p );

				const xmlChar* varstr = (xmlChar*) "Variable";

				if( !xmlStrcmp(var_node->name, varstr ) )
					ph->setDesType( XDDM_VAR );
				else
					ph->setDesType( XDDM_CONST );

				m_PHolderVec.push_back( ph );
				m_CurrPHolderIndex = (int)m_PHolderVec.size() - 1;
			}
		}
	}

	//===== Free Doc =====//
	xmlFreeDoc( doc );

//			return 1;
}
void PHolderListMgr::WritePHolderListDES( char *newfile )
{
	FILE *fp;
	fp = fopen( newfile, "w" );

	fprintf( fp, "%d\n", (int)m_PHolderVec.size() );

	for ( int i = 0 ; i < (int)m_PHolderVec.size() ; i++ )
	{
		Parm *p = m_PHolderVec[i]->getParm();

		fprintf( fp, "%d:%s:%s:%s: %g\n", ((Geom*)p->get_geom_base())->getPtrID(), p->get_geom_base()->getName().get_char_star(), p->get_group_name().get_char_star(), p->get_name().get_char_star(), p->get() );
	}

	fclose( fp );
}