format 58
"utils" // trunk::src::electronics::models::utils
  revision 1
  modified_by 22 "zolee"
  // class settings
  //class diagram settings
  draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default
  //use case diagram settings
  package_name_in_tab default show_context default auto_label_position default draw_all_relations default class_drawing_mode default shadow default show_stereotype_properties default
  //sequence diagram settings
  show_full_operations_definition default write_horizontally default class_drawing_mode default drawing_language default draw_all_relations default shadow default show_stereotype_properties default
  //collaboration diagram settings
  show_full_operations_definition default show_hierarchical_rank default write_horizontally default drawing_language default package_name_in_tab default show_context default draw_all_relations default shadow default show_stereotype_properties default
  //object diagram settings
   write_horizontally default package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default show_stereotype_properties default
  //component diagram settings
  package_name_in_tab default show_context default auto_label_position default draw_all_relations default shadow default
  draw_component_as_icon default show_component_req_prov default show_component_rea default show_stereotype_properties default
  //deployment diagram settings
  package_name_in_tab default show_context default write_horizontally default auto_label_position default draw_all_relations default shadow default
  draw_component_as_icon default show_component_req_prov default show_component_rea default show_stereotype_properties default
  //state diagram settings
  package_name_in_tab default show_context default auto_label_position default write_trans_label_horizontally default show_trans_definition default draw_all_relations default shadow default
  show_activities default region_horizontally default drawing_language default show_stereotype_properties default
  //activity diagram settings
  package_name_in_tab default show_context default show_opaque_action_definition default auto_label_position default write_flow_label_horizontally default draw_all_relations default shadow default
  show_infonote default drawing_language default show_stereotype_properties default
  
  deploymentview 131350 "utils"
    //deployment diagram settings
    package_name_in_tab default show_context default write_horizontally default auto_label_position default draw_all_relations default shadow default
    draw_component_as_icon default show_component_req_prov default show_component_rea default show_stereotype_properties default
    artifact 163350 "main"
      stereotype "source"
      cpp_src "int main()
{
	QFile input( inputFile );
	if ( !input.open( IO_ReadOnly ) )
	{
		cerr << \"Could not open input file \\\"\"<<inputFile<<\"\\\" for reading.\\n\";
		return 1;
	}
	
	QFile output( outputFile );
	if ( !output.open( IO_WriteOnly ) )
	{
		cerr << \"Could not open output file \\\"\"<<outputFile<<\"\\\" for writing.\\n\";
		return 1;
	}
	
	QTextStream inputStream( & input );
	QTextStream outputStream( & output );
	
	QStringList IDs;
	
	// Set true inside the while loop so when we come across a new model
	// in the input file, we can close the previous one in the output file.
	bool modelOpen = false;
	
	while ( !inputStream.atEnd() )
	{
		QString line = inputStream.readLine();
		
		// Make life easier
		line.replace( QRegExp( \"\\\\.MODEL[^(]*\\\\(\" ), \"+ \" );
		line.remove( \")\" );
		
		if ( line.isEmpty() )
			continue;
		
		if ( line.startsWith( \"*SRC=\" ) )
		{
			if ( modelOpen )
				outputStream << \"[/]\\n\\n\";
			modelOpen = true;
			
			line.remove( 0, 5 ); // remove \"*SRC=\"
			
			QStringList segments = QStringList::split( ';', line );
			if ( segments.size() != 5 )
			{
				cerr << \"Wrong number of \\\";\\\" for line \\\"\"<<line.latin1()<<\"\\\".\\n\";
				continue;
			}
			
			QStringList::iterator segmentsEnd = segments.end();
			for ( QStringList::iterator it = segments.begin(); it != segmentsEnd; ++it )
				*it = (*it).stripWhiteSpace();
			
			QString ID = segments[0];
			outputStream << QString(\"[%1]\\n\").arg( ID );
			if ( IDs.contains( ID ) )
			{
				cerr << \"Already have ID \\\"\"<<ID<<\"\\\".\\n\";
				continue;
			}
			else
				IDs.append( ID );
			
			if ( segments[2] == \"BJTs PNP\" )
				setProperty( \"Type\", \"PNP\" );
			else if ( segments[2] == \"BJTs NPN\" )
				setProperty( \"Type\", \"NPN\" );
			else
				cerr << \"Unknown type \\\"\"<<segments[2]<<\"\\\".\\n\";
			
			setProperty( \"Description\", segments[4] );
		}
		
		else if ( line.startsWith(\"+ \") )
		{
			line.remove( 0, 2 ); // remove \"+ \":
			QRegExp rx( \"([^\\\\s=]*)=([^\\\\s]*)\" );
			
			int pos = 0;
			while ( (pos = rx.search( line, pos )) >= 0 )
			{
				QString property = rx.cap( 1 );
				QString value = rx.cap( 2 );
				
				setProperty( property, toReal( value ) );
				
				pos += 4; // avoid the string we just found
			}
		}
		
		else
			cerr << \"Unknown line for line \\\"\"<<line.latin1()<<\"\\\".\\n\";
	}

	// And the final closing brace	
	if ( modelOpen )
		outputStream << \"[/]\\n\\n\";

	input.close();
	output.close();
	
	return 0;
}
"
      associated_classes
      end
    end
  end
end
