Files
SyncHome/trunk/ulp/import-accel.ulp

9622 lines
294 KiB
Plaintext
Raw Normal View History

2023-03-09 10:24:21 +00:00
#usage "en:<qt><nobr>After initial export of P-CAD / Altium and Protel boards and schematics <br>"
"to ACCEL ASCII format you can import your designs herewith into EAGLE.<br>"
// Remove this when it goes into EAGLE "
//"<author>Author: apl@cadsoft.de</author>"
,
"de:<qt><nobr>Durch vorherigem Export von P-CAD-/Altium- und Protel-Boards und -Schaltplänen <br>"
"in ACCEL-ASCII-Format können Sie Ihre Designs hiermit in EAGLE importieren.<br>"
//"<author>Autor: apl@cadsoft.de</author>"
,
"ru:<qt><nobr>Импорт из Altium / Protel и P-CAD топологии или схемы в ACCEL ASCII формат.<br>"
"Сделайте экспорт в формат ACCEL ASCII и затем импортируйте этот файл в EAGLE.<br>"
//"<author>Автор: apl@cadsoft.de</author>"
string Version = "1.1.6";
// History
//
// 2013-11-12 Ver. 1.1.3 Problem with performance on schematics, skip keyword classToClassRules
// 2014-01-08 Ver. 1.1.4 Info output was corrected
// 2014-04-23 Ver. 1.1.5 Bug with mirrored and some other minor problems were fixed
// 2014-11-14 Ver. 1.1.6 Connection pin - pad was added
#require 6.0300
// Please keep to alpabetic ordering for maintainability !
string Dictionary[] = {
"en\v"
"de\v"
"ru\v",
"Cancel\v"
"Abbrechen\v"
"Отмена\v",
"ACCEL - EAGLE layer mapping\v"
"ACCEL - EAGLE - Layerzuordnung\v"
"ACCEL - EAGLE - соответствие слоёв\v",
"ACCEL\nType\tACCEL\nLayer\tACCEL\nNumber\tEAGLE\nNumber\tEAGLE\nName\v"
"ACCEL\nTyp\tACCEL\nLayer\tACCEL\nNummer\tEAGLE\nNummer\tEAGLE\nName\v"
"ACCEL\nТип\tACCEL\nСлой\tACCEL\nНомер\tEAGLE\nНомер\tEAGLE\nИмя\v",
"Adjust layer mapping\v"
"Layerzuordnung anpassen\v"
"Настройка соответствия слоёв\v",
"&Browse\v"
"&Suchen\v"
"&Обзор\v",
" doesn't exist!\v"
" existiert nicht!\v"
" не существует!\v",
"File \v"
"Datei \v"
"Файл\v",
"Help\v"
"Hilfe\v"
"Помощь\v",
"Import P-CAD/Altium/Protel (ACCEL ASCII)\v"
"Import von P-CAD/Altium/Protel (ACCEL ASCII)\v"
"Импорт из P-CAD/Altium/Protel (ACCEL ASCII)\v",
"Import file:\v"
"Import-Datei:\v"
"Импортируемый файл:\v",
"Load\v"
"Laden\v"
"Загрузить\v",
"Mapping:\v"
"Zuordnung:\v"
"Соответствие:\v",
"Please start from board or schematic editor !\v"
"Bitte starten Sie vom Board- oder Schaltplan-Editor!\v"
"Пожалуйста, начните с редактора топологии или схемы!\v",
"Process sheet \v"
"Bearbeite Sheet \v"
"Обработка листа \v",
"Save\v"
"Speichern\v"
"Сохранить\v",
"Save layer mapping file\v"
"Layerzuordnungs-Datei speichern\v"
"Сохранить соответствие слоёв\v",
"Select import file\v"
"Import-Datei auswählen\v"
"Выберите импортируемый файл\v",
"Select layer mapping file\v"
"Layerzuordnungs-Datei auswählen\v"
"Выберите файл соответствия слоёв\v",
"Start\v"
"Start\v"
"Старт\v",
"Wrong file signature: \v"
"Falsche Datei-Signatur: \v"
"Неправильная сигнатура файла: \v",
"Warnings log\v"
"Warnungen log\v"
"Предупреждения\v",
"-Back\v"
"-Zurück\v"
"-Обратно\v",
"Can't open default.dru !",
"Kann nicht geöffnet werden default.dru !",
"Ошибка при открытии файла default.dru !"
};
string DlgLang = language();
if (DlgLang != "de" && DlgLang != "ru") DlgLang = "en";
int LangIdx = strstr(Dictionary[0], DlgLang) / 3;
// Translate, based on dictionary
string TR(string s) {
string t = lookup(Dictionary, s, LangIdx, '\v');
return t ? t : s;
}
//-----------------------------------------------------------------------------
// merged string contains input file without comments
string MergedString;
// Header
string Tokens[];
int TokensNumber = 0;
int CurrentChar = 0;
int CurrentToken = 0;
string MajorVersion;
string MinorVersion;
string TimeStampYear;
string TimeStampMonth;
string TimeStampDay;
string TimeStampHour;
string TimeStampMinute;
string TimeStampSecond;
string ProgramName;
string ProgramVersion;
string Copyright;
string HeaderString;
string FileUnits;
string GuidString;
string FileAuthor;
// Library
string LibraryName;
// This is a collection of data for Pads shapes
int PadShapeStyleShapeType[];
string PadShapeStyleDefsWidth[];
string PadShapeStyleDefsHeight[];
int PadShapeStyleDefsPolygon[];
string PadShapeStyleDefsLayer[];
int NrPadShapeStyle = 0;
int PadStyleDefsArray[];
string PadStyleDefsScript[];
int PadShapeAddRotation[];
// Pointer and number of Pad shapes in collection
int PadShapePoiner[];
int NrPadShapes[];
int PadStyleDefsSkip[];
int IfSMD[];
int PadStyleDefsNumber = 0;
int ViaStyleDefsArray[];
string ViaStyleDefsScript[];
string ViaStyleDefsType[];
string ViaStyleDefsDiameter[];
int ViaStyleDefsSkip[];
int ViaStyleDefsNumber = 0;
int TextStyleDefsArray[];
string TextStyleDefFontHeight[];
string TextStyleDefFontStrokeWidth[];
int TextStyleDefsNumber = 0;
int PatternDefExtendedArray[];
int PatternGraphicsDefArray[];
int IfNameDefinedInPattern[];
int IfValueDefinedInPattern[];
int PatternAttributesIndex[];
int PatternNrAttributes[];
string PatternName[];
string PatternOriginalName[];
string PatternGraphicsDefName[];
string PatternDefaultVariantName[];
int PatternDefExtendedNumber = 0;
int NrPadPinMap = 0;
string PadPinMapNum[];
string PadPinMapPinRef[];
int CompDefsArray[];
int CompDefsNumber = 0;
int PadPinMapRef[];
int PadPinMapCount[];
int NrAttributes = 0;
string AttributesName[];
int AttributesIndex[];
int SymbolDefsArray[];
string SymbolsName[];
string OriginalSymbolsName[];
int IfNameDefinedInSymbol[];
int IfValueDefinedInSymbol[];
int SymbolAttributesIndex[];
int SymbolNrAttributes[];
int SymbolDefsNumber = 0;
string DevicesName[];
string SymbolDevicesName[];
int NrSymbolDevices = 0;
int NrPadsOnBoard = 0;
int PadOnBoardIndex[];
string PadOnBoardDefs[];
int NrDummyDevices = 0;
string DummyDevices[];
// Netlist
string NetlistName;
// PCBDesign
int PCBDesignToken = 0;
string PcbDesignName = "";
int LayerDefsArray[];
string LayersName[];
int LayersCode[];
string LayersType[];
int LayerDefsNumber = 0;
int PCBDesignMultiLayerToken = 0;
int PCBLayerContentsArray[];
int NrPCBLayerContents = 0;
// schematicDesign
int SchematicDesignToken = 0;
string SchematicDesignName = "";
int SchTitleSheet = 0;
int SheetsArray[];
int NrSheets = 0;
int CompInstances[];
int NrCompInstances = 0;
string CompInstancesName[];
string CompInstancesRef[];
string CompValue[];
int NrNodes = 0;
string NodeElementName[];
string NodePadName[];
int NrNets = 0;
string NetNames[];
int NodeRef[];
int NrNetNodes[];
int NrLabels = 0;
string XCoordLabels[];
string YCoordLabels[];
string TypeLabels[];
string NetNameRef[];
string IsLabelFlipped[];
string LabelRotation[];
// Misc
int DebugMessage = 1;
int IfPinText = 0;
string LabelTextHeight = "0.07inch";
string NameValueTextHeight = "0.05inch";
int IfUpdateLayersMap = 0;
string PCADfileName;
string SCRIPTfileName;
string WarningsLogFileName;
string ext[] = { "*.asc", "*.asc" };
enum { PCB, SCH };
int FileType = PCB;
//string FileInfo = "Select a import file.";
int Lines;
string PcadLines[];
string Status; // = "First select a ACCEL_ASCII file, then click on Start.";
int SchematicWindow = 0;
int BoardWindow = 0;
real WiresPointX[];
real WiresPointY[];
string WiresNet[];
int NrWiresPoint = 0;
int UseExternalText = 0;
string ExternalText = "";
int BatchMode = 0;
string DEFAULT_WIRE_WIDTH_BOARD = "10mil";
string DEFAULT_WIRE_WIDTH_SCHEMATIC = "6mil";
real ROUNDNESS = 3.0;
string DRUFileName;
int Vers = 1;
int SubVers = 1;
string LogLines[];
int NrLogLines;
void WriteLog( string message )
{
if( DebugMessage ) {
printf( "%s", message );
}
LogLines[ NrLogLines++ ] = message;
}
string GetFile(string fname)
{
PCADfileName = fname;
if (fname) PCADfileName = filesetext(fname,"/");
string f[];
int fcnt;
if (fname) fcnt = fileglob(f, PCADfileName); // 2008-10-21 check file name
if( !fcnt ) {
PCADfileName = dlgFileOpen(TR("Select import file"), fname,
ext[FileType] + " *.pcb *.ASC *.PCB *.sch *.txt *.TXT;; (*.*)");
if (!PCADfileName) return fname;
}
Lines = fileread(PcadLines, PCADfileName);
if (Lines == -1) exit(-7113);
SCRIPTfileName = filesetext(PCADfileName, ".scr");
return PCADfileName;
}
string ShowRefLayer[];
int CntlayerDef = -1;
string RefLayerDef[];
string RefLayerNum[];
string RefLayerType[];
string PcadEagleLayerRefName[];
string PcadEagleLayerRefNum[];
void LoadCrossRef( string CrossfileName )
{
if (!CrossfileName) {
CrossfileName = dlgFileOpen(TR("Select layer mapping file"), PCADfileName + ".lmp", "*.lmp");
if (!CrossfileName) return;
}
CntlayerDef = fileread(ShowRefLayer, CrossfileName);
if( CntlayerDef < 0 ) {
if( DebugMessage ) {
printf( "# info: CrossfileName %s not found\n", CrossfileName );
}
return;
}
string w[];
for (int n = 0; n < CntlayerDef; n++) {
strsplit(w, ShowRefLayer[n], '\t');
RefLayerType[n] = w[0];
RefLayerDef[n] = w[1];
RefLayerNum[n] = w[2];
PcadEagleLayerRefNum[n] = w[3];
PcadEagleLayerRefName[n] = w[4];
}
if( DebugMessage ) {
//printf( "# info: CrossfileName %s loaded\n", CrossfileName );
}
}
void SaveCrossRef( void )
{
string CrossfileName = dlgFileSave(TR("Save layer mapping file"), PCADfileName + ".lmp", "*.lmp");
if (!CrossfileName) return;
output(CrossfileName, "wt") {
for (int n = 0; n < CntlayerDef; n++) {
printf("%s\t%s\t%s\t%s\t%s\n",
RefLayerType[n],
RefLayerDef[n],
RefLayerNum[n],
PcadEagleLayerRefNum[n],
PcadEagleLayerRefName[n]
);
}
}
}
// This function updates dialog window to show progress
void UpdateProgress( string info )
{
if( !BatchMode ) {
sprintf( Status, "%s", info);
dlgRedisplay();
}
}
// This function replaces characters which have
// special meaning in Eagle. Returns updated string
string ReplaceNotSupportedCharacters( string InputStr )
{
string OutputStr;
int length = strlen( InputStr );
for( int i = 0; i < length; i++ ) {
switch( InputStr[ i ] ) {
case '\\':
OutputStr[ i ] = '/';
break;
case ' ':
OutputStr[ i ] = '_';
break;
case '(':
OutputStr[ i ] = '_';
break;
case ')':
OutputStr[ i ] = '_';
break;
case '[':
OutputStr[ i ] = '_';
break;
case ']':
OutputStr[ i ] = '_';
break;
case '\'':
OutputStr[ i ] = '_';
break;
// case '%':
// OutputStr[ i ] = '_';
// break;
default:
OutputStr[ i ] = InputStr[ i ];
}
}
return( OutputStr );
}
// This function replaces characters which have
// special meaning in Eagle for text string. Returns updated string
string ReplaceNotSupportedCharactersText( string InputStr )
{
string OutputStr;
int length = strlen( InputStr );
int j = 0;
for( int i = 0; i < length; i++ ) {
switch( InputStr[ i ] ) {
case '\'':
OutputStr[ j ] = '\'';
j++;
OutputStr[ j ] = '\'';
break;
case '\\':
if( ( InputStr[ i + 1 ] == 'n' ) ||
( InputStr[ i + 1 ] == '\\' ) ) {
OutputStr[ j ] = InputStr[ i ];
i++;
j++;
OutputStr[ j ] = InputStr[ i ];
}
else {
i++;
j--;
}
break;
default:
OutputStr[ j ] = InputStr[ i ];
}
j++;
}
return( OutputStr );
}
// This function merges all lines and removes comments
void MergeLines( void )
{
for( int j = 0; j < Lines; j++ ) {
if ( strchr( PcadLines[ j ], ';' ) >= 0 ) {
string currentLine = PcadLines[ j ];
int lineLength = strlen( currentLine );
int flag = 0;
for( int i = 0; i < lineLength; i++ ) {
if ( currentLine[ i ] == '"' )
flag = !flag;
if ( currentLine[ i ] == ';' && !flag) {
currentLine[ i ] = '\0';
break;
}
}
PcadLines[ j ] = currentLine;
}
}
// Merge them all in one step !
MergedString = strjoin(PcadLines, ' ');
}
// This function create token for string inside double quotas
void ProcessDoubleQuotas( int lineLength )
{
string tmpString;
int strLength = 0;
tmpString[ strLength ] = MergedString[ CurrentChar ];
strLength++;
CurrentChar++;
while( CurrentChar < lineLength ) {
tmpString[ strLength ] = MergedString[ CurrentChar ];
strLength++;
if( MergedString[ CurrentChar ] == '"' ) {
if( MergedString[ CurrentChar - 1 ] != '\\' ) {
break;
}
else {
tmpString[ strLength - 1 ] = '"';
}
}
CurrentChar++;
}
tmpString[ strLength ] = 0;
Tokens[ TokensNumber ] = tmpString;
TokensNumber++;
}
// This function create token for keyword or variable name
void ProcessString( int lineLength )
{
string tmpString;
while( CurrentChar < lineLength ) {
switch( MergedString[ CurrentChar ] ) {
case ' ':
case '(':
case ')':
case '"':
CurrentChar--;
Tokens[ TokensNumber ] = tmpString;
TokensNumber++;
return;
default:
tmpString = tmpString + MergedString[ CurrentChar ];
CurrentChar++;
}
}
Tokens[ TokensNumber ] = tmpString;
TokensNumber++;
}
// This function creates array of strings from MergedString
void SplitToTokens( void )
{
UpdateProgress( TR("Parsing") );
int lineLength = strlen( MergedString );
CurrentChar = 0;
while( CurrentChar < lineLength ) {
switch( MergedString[ CurrentChar ] ) {
case ' ':
break;
case '(':
Tokens[ TokensNumber ] = "(";
TokensNumber++;
break;
case ')':
Tokens[ TokensNumber ] = ")";
TokensNumber++;
break;
case '"':
ProcessDoubleQuotas( lineLength );
//sprintf(Status, "Token %d:%s", TokensNumber, Tokens[ TokensNumber ] );
//dlgRedisplay();
break;
default:
ProcessString( lineLength );
//sprintf(Status, "Token %d:%s", TokensNumber, Tokens[ TokensNumber ] );
//dlgRedisplay();
}
CurrentChar++;
}
}
// This function check if dbUnit equal to mil, mm or in.
// Returns 0 if dbUnit is correct
// otherwise returns 1
int checkDbUnits( string fileUnits )
{
if( fileUnits == "mil") return( 0 );
if( fileUnits == "mm") return( 0 );
if( fileUnits == "in") return( 0 );
return( 1 );
}
// Removes double quotas at the begining and
// the end of string if any. Return new string
string RemoveDoubleQuotas( string inputString )
{
string outputString = "";
int startPos = 0;
int length = strlen( inputString );
if( length > 0 ) {
if( inputString[ length - 1 ] == '"' ) {
length--;
}
if( inputString[ 0 ] == '"' ) {
startPos = 1;
length--;
}
}
for( int i = 0; i < length; i++ ) {
outputString[ i ] = inputString[ startPos + i ];
}
return( outputString );
}
// Check if the first word matches the ACCEL_ASCII signature.
// Quite tolerant because many different file types are common.
int CheckSignature(void)
{
return strxstr(strupr(Tokens[0]), "[PCAD|ACCEL|TANGOPRO].ASCII") >= 0 ? 0 : 1;
}
// This function process header of file.
// If header processed successfully function returns 0
// otherwise returns 1
int ProcessAsciiHeader( void )
{
UpdateProgress( TR("ProcessAsciiHeader") );
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "asciiVersion" ) {
CurrentToken++;
MajorVersion = Tokens[ CurrentToken ];
CurrentToken++;
MinorVersion = Tokens[ CurrentToken ];
CurrentToken++;
if( Tokens[ CurrentToken ] != ")" ) {
dlgMessageBox( "Error in asciiVersion", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "timeStamp" ) {
CurrentToken++;
TimeStampYear = Tokens[ CurrentToken ];
CurrentToken++;
TimeStampMonth = Tokens[ CurrentToken ];
CurrentToken++;
TimeStampDay = Tokens[ CurrentToken ];
CurrentToken++;
TimeStampHour = Tokens[ CurrentToken ];
CurrentToken++;
TimeStampMinute = Tokens[ CurrentToken ];
CurrentToken++;
TimeStampSecond = Tokens[ CurrentToken ];
CurrentToken++;
if( Tokens[ CurrentToken ] != ")" ) {
dlgMessageBox( "Error in timeStamp", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "program" ) {
CurrentToken++;
ProgramName = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
CurrentToken++;
ProgramVersion = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
CurrentToken++;
if( Tokens[ CurrentToken ] != ")" ) {
dlgMessageBox( "Error in program keyword", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "copyright" ) {
CurrentToken++;
Copyright = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
CurrentToken++;
if( Tokens[ CurrentToken ] != ")" ) {
dlgMessageBox( "Error in copyright keyword", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "headerString" ) {
CurrentToken++;
HeaderString = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
CurrentToken++;
if( Tokens[ CurrentToken ] != ")" ) {
dlgMessageBox( "Error in header string keyword", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "fileUnits" ) {
CurrentToken++;
FileUnits = strlwr( Tokens[ CurrentToken ] );
if( checkDbUnits( FileUnits ) ) {
dlgMessageBox( "Unknown fileUnits " + FileUnits, "OK");
return( 1 );
}
CurrentToken++;
if( Tokens[ CurrentToken ] != ")" ) {
dlgMessageBox( "Error in fileUnits", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "guidString" ) {
CurrentToken++;
GuidString = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
CurrentToken++;
if( Tokens[ CurrentToken ] != ")" ) {
dlgMessageBox( "Error in header guidString keyword", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "fileAuthor" ) {
CurrentToken++;
FileAuthor = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
CurrentToken++;
if( Tokens[ CurrentToken ] != ")" ) {
dlgMessageBox( "Error in header fileAuthor keyword", "OK");
return( 1 );
}
}
else {
dlgMessageBox( "Unknown keyword in header " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
return( 0 );
}
else {
dlgMessageBox( "Unexpected keyword in header " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process padStyleDef keyword.
// If padStyleDef processed successfully function returns 0
// oterwise returns 1
int ProcessPadStyleDef( void )
{
int level = 1;
CurrentToken++;
PadStyleDefsArray[ PadStyleDefsNumber ] = CurrentToken;
PadStyleDefsNumber++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process viaStyleDef keyword.
// If viaStyleDef processed successfully function returns 0
// oterwise returns 1
int ProcessViaStyleDef( void )
{
int level = 1;
CurrentToken++;
ViaStyleDefsArray[ ViaStyleDefsNumber ] = CurrentToken;
ViaStyleDefsNumber++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process textStyleDef keyword.
// If textStyleDef processed successfully function returns 0
// oterwise returns 1
int ProcessTextStyleDef( void )
{
int level = 1;
CurrentToken++;
TextStyleDefsArray[ TextStyleDefsNumber ] = CurrentToken;
TextStyleDefsNumber++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
if( Tokens[ CurrentToken + 1 ] == "fontHeight" ) {
TextStyleDefFontHeight[ TextStyleDefsNumber - 1 ] = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
TextStyleDefFontHeight[ TextStyleDefsNumber - 1 ] =
TextStyleDefFontHeight[ TextStyleDefsNumber - 1 ] + Tokens[ CurrentToken + 3 ];
}
}
else {
if( Tokens[ CurrentToken + 1 ] == "strokeWidth" ) {
TextStyleDefFontStrokeWidth[ TextStyleDefsNumber - 1 ] = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
TextStyleDefFontStrokeWidth[ TextStyleDefsNumber - 1 ] =
TextStyleDefFontStrokeWidth[ TextStyleDefsNumber - 1 ] + Tokens[ CurrentToken + 3 ];
}
}
}
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process patternDefExtended keyword.
// If patternDefExtended processed successfully function returns 0
// oterwise returns 1
int ProcessPatternDefExtended( void )
{
int level = 1;
CurrentToken++;
int patternDefExtendedToken = CurrentToken;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
if( Tokens[ CurrentToken + 1 ] == "patternGraphicsDef" ) {
PatternDefExtendedArray[ PatternDefExtendedNumber ] = patternDefExtendedToken;
PatternGraphicsDefArray[ PatternDefExtendedNumber ] = CurrentToken + 1;
PatternDefExtendedNumber++;
}
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process compDef keyword.
// If compDef processed successfully function returns 0
// oterwise returns 1
int ProcessCompDef( void )
{
int level = 1;
CurrentToken++;
CompDefsArray[ CompDefsNumber ] = CurrentToken;
CompDefsNumber++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process patternDef keyword.
// If patternDef processed successfully function returns 0
// oterwise returns 1
int ProcessPatternDef( void )
{
int level = 1;
CurrentToken++;
//PatternDefsArray[ PatternDefsNumber ] = CurrentToken;
//PatternDefsNumber++;
PatternDefExtendedArray[ PatternDefExtendedNumber ] = CurrentToken;
PatternGraphicsDefArray[ PatternDefExtendedNumber ] = -1;
PatternGraphicsDefName[ PatternDefExtendedNumber ] = "";
PatternDefExtendedNumber++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process symbolDef keyword.
// If symbolDef processed successfully function returns 0
// oterwise returns 1
int ProcessSymbolDef( void )
{
int level = 1;
CurrentToken++;
SymbolDefsArray[ SymbolDefsNumber ] = CurrentToken;
SymbolDefsNumber++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process library keyword.
// If library processed successfully function returns 0
// oterwise returns 1
int ProcessLibrary( void )
{
PadStyleDefsNumber = 0;
ViaStyleDefsNumber = 0;
TextStyleDefsNumber = 0;
PatternDefExtendedNumber = 0;
CompDefsNumber = 0;
//PatternDefsNumber = 0;
SymbolDefsNumber = 0;
UpdateProgress( TR("ProcessLibrary") );
CurrentToken++;
LibraryName = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "padStyleDef" ) {
if( ProcessPadStyleDef() ) {
dlgMessageBox( "Error in padStyleDef processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "viaStyleDef" ) {
if( ProcessViaStyleDef() ) {
dlgMessageBox( "Error in viaStyleDef processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "textStyleDef" ) {
if( ProcessTextStyleDef() ) {
dlgMessageBox( "Error in textStyleDef processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "patternDefExtended" ) {
if( ProcessPatternDefExtended() ) {
dlgMessageBox( "Error in patternDefExtended processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "compDef" ) {
if( ProcessCompDef() ) {
dlgMessageBox( "Error in compDef processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "patternDef" ) {
if( ProcessPatternDef() ) {
dlgMessageBox( "Error in patternDef processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "symbolDef" ) {
if( ProcessSymbolDef() ) {
dlgMessageBox( "Error in symbolDef processing", "OK");
return( 1 );
}
}
else {
dlgMessageBox( "Unknown keyword in library " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
/*string info;
sprintf( info, "PadStyleDefsNumber = %d ViaStyleDefsNumber = %d",
PadStyleDefsNumber, ViaStyleDefsNumber );
dlgMessageBox( info, "OK");
sprintf( info, "TextStyleDefsNumber = %d PatternDefExtendedNumber = %d",
TextStyleDefsNumber, PatternDefExtendedNumber );
dlgMessageBox( info, "OK");
sprintf( info, "CompDefsNumber = %d PatternDefsNumber = %d SymbolDefsNumber = %d",
CompDefsNumber, PatternDefsNumber, SymbolDefsNumber );
dlgMessageBox( info, "OK");*/
return( 0 );
}
else {
dlgMessageBox( "Unexpected keyword in library " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function skip all internal data and return.
int SkipThisItem( void )
{
int level = 1;
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process globalAttrs keyword.
// If globalAttrs processed successfully function returns 0
// oterwise returns 1
int ProcessGlobalAttrs( void )
{
int level = 1;
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process compInst keyword.
// If compInst processed successfully function returns 0
// oterwise returns 1
int ProcessCompInst( void )
{
int level = 1;
CurrentToken++;
CompInstances[ NrCompInstances ] = CurrentToken;
CompInstancesName[ NrCompInstances ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) );
NrCompInstances++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
if( Tokens[ CurrentToken + 1 ] == "compRef" ) {
CompInstancesRef[ NrCompInstances - 1 ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 2 ] ) );
}
else {
if( Tokens[ CurrentToken + 1 ] == "compValue" ) {
CompValue[ NrCompInstances - 1 ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 2 ] ) );
}
}
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process net keyword.
// If net processed successfully function returns 0
// oterwise returns 1
int ProcessNet( void )
{
int nodesCount = 0;
int level = 1;
CurrentToken++;
NetNames[ NrNets ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) );
NodeRef[ NrNets ] = NrNodes;
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
CurrentToken++;
if( Tokens[ CurrentToken ] == "node" ) {
CurrentToken++;
NodeElementName[ NrNodes ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) );
CurrentToken++;
NodePadName[ NrNodes ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) );
CurrentToken++;
NrNodes++;
nodesCount++;
}
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
if( nodesCount ) {
NrNetNodes[ NrNets ] = nodesCount;
NrNets++;
}
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process netClass keyword.
// If netClass processed successfully function returns 0
// oterwise returns 1
int ProcessNetClass( void )
{
int level = 1;
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process netlist keyword.
// If netlist processed successfully function returns 0
// oterwise returns 1
int ProcessNetlist( void )
{
UpdateProgress( TR("ProcessNetlist") );
CurrentToken++;
NetlistName = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "globalAttrs" ) {
if( ProcessGlobalAttrs() ) {
dlgMessageBox( "Error in globalAttrs processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "compInst" ) {
if( ProcessCompInst() ) {
dlgMessageBox( "Error in compInst processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "net" ) {
if( ProcessNet() ) {
dlgMessageBox( "Error in net processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "netClass" ) {
if( ProcessNetClass() ) {
dlgMessageBox( "Error in net processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "classToClassRules" ) { // 2013-05-28 classToClassRules
if( SkipThisItem() ) {
dlgMessageBox( "Error in net processing", "OK");
return( 1 );
}
}
else {
dlgMessageBox( "Unknown keyword in netlist: " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
return( 0 );
}
else {
dlgMessageBox( "Unexpected keyword in netlist " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process pcbDesignHeader keyword.
// If pcbDesignHeader processed successfully function returns 0
// oterwise returns 1
int ProcessPcbDesignHeader( void )
{
int level = 1;
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process layerDef keyword.
// If layerDef processed successfully function returns 0
// oterwise returns 1
int ProcessLayerDef( void )
{
CurrentToken++;
LayersName[ LayerDefsNumber ] = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "layerNum" ) {
CurrentToken++;
LayersCode[ LayerDefsNumber ] = strtol( Tokens[ CurrentToken ] );
CurrentToken++;
if( Tokens[ CurrentToken ] != ")" ) {
dlgMessageBox( "Error in layerNum", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "layerType" ) {
CurrentToken++;
LayersType[ LayerDefsNumber ] = Tokens[ CurrentToken ];
CurrentToken++;
if( Tokens[ CurrentToken ] != ")" ) {
dlgMessageBox( "Error in layerType", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "attr" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in LayerDef attr processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "fieldSetRef" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in LayerDef fieldSetRef processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "netNameRef" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in LayerDef netNameRef processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "layerBias" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in LayerDef layerBias processing", "OK");
return( 1 );
}
}
else {
dlgMessageBox( "Unknown keyword in ProcessLayerDef: " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
LayerDefsArray[ LayerDefsNumber ] = CurrentToken;
LayerDefsNumber++;
return( 0 );
}
else {
dlgMessageBox( "Unexpected keyword in ProcessLayerDef " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process multiLayer keyword.
// If multiLayer processed successfully function returns 0
// oterwise returns 1
int ProcessMultiLayer( void )
{
int level = 1;
CurrentToken++;
PCBDesignMultiLayerToken = CurrentToken;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
CurrentToken++;
if( Tokens[ CurrentToken ] == "pad" ) {
PadOnBoardIndex[ NrPadsOnBoard ] = CurrentToken;
NrPadsOnBoard++;
SkipThisItem();
}
else {
if( SkipThisItem() ) {
dlgMessageBox( "Error in ProcessMultiLayer processing", "OK");
return( 1 );
}
level--;
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
return( 0 );
/*level--;
if( level == 0 ) {
return( 0 );
}*/
}
else {
dlgMessageBox( "Unexpected keyword in ProcessMultiLayer " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process layerContents keyword.
// If layerContents processed successfully function returns 0
// oterwise returns 1
int ProcessLayerContents( void )
{
int level = 1;
PCBLayerContentsArray[ NrPCBLayerContents ] = CurrentToken;
NrPCBLayerContents++;
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process pcbDesign keyword.
// If pcbDesign processed successfully function returns 0
// oterwise returns 1
int ProcessPcbDesign( void )
{
UpdateProgress( TR("ProcessPcbDesign") );
PCBDesignToken = CurrentToken;
CurrentToken++;
PcbDesignName = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pcbDesignHeader" ) {
if( ProcessPcbDesignHeader() ) {
dlgMessageBox( "Error in ProcessPcbDesignHeader processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "layerDef" ) {
if( ProcessLayerDef() ) {
dlgMessageBox( "Error in ProcessLayerDef processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "multiLayer" ) {
if( ProcessMultiLayer() ) {
dlgMessageBox( "Error in ProcessMultiLayer processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "layerContents" ) {
if( ProcessLayerContents() ) {
dlgMessageBox( "Error in ProcessLayerContents processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "pcbPrintSettings" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in pcbPrintSettings processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "drillSymSettings" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in drillSymSettings processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "gerberSettings" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in gerberSettings processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "ncDrillSettings" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in ncDrillSettings processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "programState" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in programState processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "layerSets" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in layerSets processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "layerPairs" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in layerPairs processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "displayDrawOrder" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in displayDrawOrder processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "reportSettings" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in reportSettings processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "odbSettings" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in odbSettings processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "layersStackup" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in layersStackup processing", "OK");
return( 1 );
}
}
else {
dlgMessageBox( "Unknown keyword in ProcessPcbDesign: " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
return( 0 );
}
else {
dlgMessageBox( "Unexpected keyword in ProcessPcbDesign " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
CurrentToken++;
}
return( 1 );
}
int ProcessSchDesignHeader( void )
{
int level = 1;
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
int ProcessDesignInfo( void )
{
int level = 1;
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
int ProcessSchTitleSheet( void )
{
int level = 1;
CurrentToken++;
if( Tokens[ CurrentToken ] == ")" ) {
return( 0 );
}
SchTitleSheet = CurrentToken;
CurrentToken++;
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
int ProcessSheet( void )
{
int level = 1;
CurrentToken++;
SheetsArray[ NrSheets ] = CurrentToken;
NrSheets++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
}
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function process schematicDesign keyword.
// If schematicDesign processed successfully function returns 0
// oterwise returns 1
int ProcessSchematicDesign( void )
{
UpdateProgress( TR("ProcessSchematicDesign") );
SchematicDesignToken = CurrentToken;
CurrentToken++;
SchematicDesignName = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "schDesignHeader" ) {
if( ProcessSchDesignHeader() ) {
dlgMessageBox( "Error in ProcessSchDesignHeader processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "designInfo" ) {
if( ProcessDesignInfo() ) {
dlgMessageBox( "Error in ProcessDesignInfo processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "titleSheet" ) {
if( ProcessSchTitleSheet() ) {
dlgMessageBox( "Error in ProcessSchTitleSheet processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "sheet" ) {
if( ProcessSheet() ) {
dlgMessageBox( "Error in ProcessLayerContents processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "schematicPrintSettings" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in schematicPrintSettings processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "programState" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in programState processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "reportSettings" ) {
if( SkipThisItem() ) {
dlgMessageBox( "Error in reportSettings processing", "OK");
return( 1 );
}
}
else {
dlgMessageBox( "Unknown keyword in ProcessSchematicDesign: " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
return( 0 );
}
else {
dlgMessageBox( "Unexpected keyword in ProcessSchematicDesign " + Tokens[ CurrentToken ], "OK");
return( 1 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function parse tree starting from
// top keywords. If processed seccesfully returns 0,
// if signature is wrong returns 1
int ParseTree( void )
{
if( CheckSignature() ) {
dlgMessageBox( TR("Wrong file signature: ") + Tokens[ 0 ], "OK");
return( 1 );
}
CurrentToken = 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "asciiHeader" ) {
if( ProcessAsciiHeader() ) {
dlgMessageBox( "Error in file header processing", "OK");
}
}
else {
if( Tokens[ CurrentToken ] == "library" ) {
if( ProcessLibrary() ) {
dlgMessageBox( "Error in library processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "netlist" ) {
if( ProcessNetlist() ) {
dlgMessageBox( "Error in netlist processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "pcbDesign" ) {
if( ProcessPcbDesign() ) {
dlgMessageBox( "Error in pcbDesign processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == "schematicDesign" ) {
if( ProcessSchematicDesign() ) {
dlgMessageBox( "Error in schematicDesign processing", "OK");
return( 1 );
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
dlgMessageBox( "Unexpected keyword: " + Tokens[ CurrentToken ], "OK");
if( 1 ) {
dlgMessageBox( "debug: " + Tokens[ CurrentToken - 2 ] +
Tokens[ CurrentToken - 1 ] +
Tokens[ CurrentToken ] +
Tokens[ CurrentToken + 1 ] +
Tokens[ CurrentToken + 2 ], "OK");
}
return( 1 );
}
}
}
}
}
}
}
CurrentToken++;
}
return( 0 );
}
string ConvertUnits( string textValue, string unitValue )
{
if( unitValue == "" ) {
if( FileUnits == "mil") {
real rValue = strtod( textValue );
string retValue;
sprintf( retValue, "%f", round( rValue ) );
return( retValue );
}
return( textValue );
}
if( unitValue == "mil") {
if( FileUnits == "mil") {
real rValue = strtod( textValue );
string retValue;
sprintf( retValue, "%f", round( rValue ) );
return( retValue );
}
if( FileUnits == "mm") {
real rValue = strtod( textValue );
string retValue;
sprintf( retValue, "%f", rValue * 25.4 / 1000.0 );
return( retValue );
}
if( FileUnits == "in") {
real rValue = strtod( textValue );
string retValue;
sprintf( retValue, "%f", rValue / 1000.0 );
return( retValue );
}
}
if( unitValue == "mm") {
if( FileUnits == "mil") {
real rValue = strtod( textValue );
string retValue;
sprintf( retValue, "%f", rValue * 1000.0 / 25.4 );
return( retValue );
}
if( FileUnits == "mm") {
return( textValue );
}
if( FileUnits == "in") {
real rValue = strtod( textValue );
string retValue;
sprintf( retValue, "%f", rValue / 25.4 );
return( retValue );
}
}
if( unitValue == "in") {
if( FileUnits == "mil") {
real rValue = strtod( textValue );
string retValue;
sprintf( retValue, "%f", rValue * 1000.0 );
return( retValue );
}
if( FileUnits == "mm") {
real rValue = strtod( textValue );
string retValue;
sprintf( retValue, "%f", rValue * 25.4 );
return( retValue );
}
if( FileUnits == "in") {
return( textValue );
}
}
string tmp;
sprintf( tmp, "# ConvertUnits: unknown units: %s", unitValue );
WriteLog( tmp );
return( textValue );
}
int CheckForNull( string str )
{
int length = strlen( str );
for( int i = 0; i < length; i++ ) {
switch( str[ i ] ) {
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
return( 0 );
default:;
}
}
return( 1 );
}
string GetNumberValue( string str )
{
string value = "";
int length = strlen( str );
for( int i = 0; i < length; i++ ) {
switch( str[ i ] ) {
case '+':
case '-':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
value = value + str[ i ];
break;
default:
return( value );
}
}
return( value );
}
int IsNumberValue( string str )
{
int length = strlen( str );
for( int i = 0; i < length; i++ ) {
switch( str[ i ] ) {
case '+':
case '-':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
break;
default:
return( 0 );
}
}
return( 1 );
}
int IsASCIIValue( string str )
{
if( strlen( str ) > 0 ) {
switch( str[ 0 ] ) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
return( 0 );
case '.':
case '+':
case '-':
if( strlen( str ) > 1 ) {
switch( str[ 1 ] ) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
return( 0 );
default:;
}
}
break;
default:;
}
}
return( 1 );
}
string GetUnitValue( string str )
{
string value = "";
int length = strlen( str );
for( int i = 0; i < length; i++ ) {
switch( str[ i ] ) {
case '+':
case '-':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
break;
default:
value = value + str[ i ];
}
}
return( value );
}
string MinValue( string val1, string val2 )
{
real rVal1 = strtod( ConvertUnits( GetNumberValue( val1 ), GetUnitValue( val1 ) ) );
real rVal2 = strtod( ConvertUnits( GetNumberValue( val2 ), GetUnitValue( val2 ) ) );
string tmp;
if( rVal1 > rVal2 ) {
sprintf( tmp, "%f", rVal2 );
}
else {
sprintf( tmp, "%f", rVal1 );
}
return( tmp );
}
string MaxValue( string val1, string val2 )
{
real rVal1 = strtod( ConvertUnits( GetNumberValue( val1 ), GetUnitValue( val1 ) ) );
real rVal2 = strtod( ConvertUnits( GetNumberValue( val2 ), GetUnitValue( val2 ) ) );
string tmp;
if( rVal1 < rVal2 ) {
sprintf( tmp, "%f", rVal2 );
}
else {
sprintf( tmp, "%f", rVal1 );
}
return( tmp );
}
real GetValue( string val )
{
real rVal = strtod( ConvertUnits( GetNumberValue( val ), GetUnitValue( val ) ) );
return( rVal );
}
// Find token with a name.
// Returns token number if found,
// -1 if not found
// startToken should points to "("
int FindToken( int startToken, string name )
{
int level = 1;
CurrentToken = startToken;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
CurrentToken++;
if( Tokens[ CurrentToken ] == name ) {
return( CurrentToken );
}
else {
if( SkipThisItem() ) {
return( -1 );
}
level--; // If an item is skipped, the level needs to be increased !
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( -1 );
}
}
else {
/*dlgMessageBox( "Unexpected keyword in FindToken " + Tokens[ CurrentToken ], "OK");
return( 1 );*/
}
}
CurrentToken++;
}
return( -1 );
}
// This function write list of PCAD layer as comments to script
void PrintPCADLayers( void )
{
printf( "# PCAD layers:\n");
for( int i = 0; i < LayerDefsNumber; i++ ) {
printf( "#Layer = '%s' %d %s\n", LayersName[ i ], LayersCode[ i ],
LayersType[ i ] );
}
printf( "#\n" );
}
// This function returns index of found PadStyleDefinition
// in array or -1 if failed
int FindPadStyleDef( string name )
{
for( int i = 0; i < PadStyleDefsNumber; i++ ) {
int startToken = PadStyleDefsArray[ i ];
if( Tokens[ startToken ] == name ) {
return( i );
}
}
return( -1 );
}
// This function returns index of found ViaStyleDefinition
// in array or -1 if failed
int FindViaStyleDef( string name )
{
for( int i = 0; i < ViaStyleDefsNumber; i++ ) {
int startToken = ViaStyleDefsArray[ i ];
if( Tokens[ startToken ] == name ) {
return( i );
}
}
return( -1 );
}
// This function returns index of found TextStyleDefinition
// in array or -1 if failed
int FindTextStyleDef( string name )
{
for( int i = 0; i < TextStyleDefsNumber; i++ ) {
int startToken = TextStyleDefsArray[ i ];
if( Tokens[ startToken ] == name ) {
return( i );
}
}
return( -1 );
}
int checkLayerType( int LayerNumPosition )
{
for( int i = 0; i < LayerDefsNumber; i++ ) {
if( LayersCode[ i ] == strtol( Tokens[ LayerNumPosition ] ) ) {
if( LayersType[ i ] == "Signal" ) {
return( 1 );
}
}
}
return( 0 );
}
real RotateXCoord( real x, real y, real rotationInRad )
{
return( x * cos( rotationInRad ) - y * sin( rotationInRad ) );
}
real RotateYCoord( real x, real y, real rotationInRad )
{
return( x * sin( rotationInRad ) + y * cos( rotationInRad ) );
}
void Ellipse( real a, real b, real xCoord, real yCoord, real rotationInDegree )
{
if( a < 0.0 ) {
dlgMessageBox( "a must be > 0", "OK");
return;
}
if( b < 0.0 ) {
dlgMessageBox( "b must be > 0", "OK");
return;
}
if( b > a ) {
dlgMessageBox( "a must be > b", "OK");
return;
}
real phi = atan( b / a );
real theta = PI / 2 - phi;
real r1 = ( a * sin( theta ) + b * cos( theta ) - a ) /
( sin( theta ) + cos( theta ) - 1 );
real r2 = ( a * sin( theta ) + b * cos( theta ) - b ) /
( sin( theta ) + cos( theta ) - 1 );
real x = r2 * sin( phi );
real y = b - r2 * ( 1.0 - cos( phi ) );
real rotationInRad = rotationInDegree * PI / 180.0;
printf( "ARC CW (%f %f) (%f %f) (%f %f);\n",
xCoord + RotateXCoord( 0.0, b, rotationInRad ), yCoord + RotateYCoord( 0.0, b, rotationInRad ),
xCoord + RotateXCoord( 0.0, b - 2.0 * r2, rotationInRad ), yCoord + RotateYCoord( 0.0, b - 2.0 * r2, rotationInRad ),
xCoord + RotateXCoord( x, y, rotationInRad ), yCoord + RotateYCoord( x, y, rotationInRad ) );
printf( "ARC CCW (%f %f) (%f %f) (%f %f);\n",
xCoord + RotateXCoord( 0.0, b, rotationInRad ), yCoord + RotateYCoord( 0.0, b, rotationInRad ),
xCoord + RotateXCoord( 0.0, b - 2.0 * r2, rotationInRad ), yCoord + RotateYCoord( 0.0, b - 2.0 * r2, rotationInRad ),
xCoord + RotateXCoord( -x, y, rotationInRad ), yCoord + RotateYCoord( -x, y, rotationInRad ) );
printf( "ARC CW (%f %f) (%f %f) (%f %f);\n",
xCoord + RotateXCoord( 0.0, -b, rotationInRad ), yCoord + RotateYCoord( 0.0, -b, rotationInRad ),
xCoord + RotateXCoord( 0.0, 2.0 * r2 - b, rotationInRad ), yCoord + RotateYCoord( 0.0, 2.0 * r2 - b, rotationInRad ),
xCoord + RotateXCoord( -x, -y, rotationInRad ), yCoord + RotateYCoord( -x, -y, rotationInRad ) );
printf( "ARC CCW (%f %f) (%f %f) (%f %f);\n",
xCoord + RotateXCoord( 0.0, -b, rotationInRad ), yCoord + RotateYCoord( 0.0, -b, rotationInRad ),
xCoord + RotateXCoord( 0.0, 2.0 * r2 - b, rotationInRad ), yCoord + RotateYCoord( 0.0, 2.0 * r2 - b, rotationInRad ),
xCoord + RotateXCoord( x, -y, rotationInRad ), yCoord + RotateYCoord( x, -y, rotationInRad ) );
printf( "ARC CW (%f %f) (%f %f) (%f %f);\n",
xCoord + RotateXCoord( a, 0.0, rotationInRad ), yCoord + RotateYCoord( a, 0.0, rotationInRad ),
xCoord + RotateXCoord( a - 2.0 * r1, 0.0, rotationInRad ), yCoord + RotateYCoord( a - 2.0 * r1, 0.0, rotationInRad ),
xCoord + RotateXCoord( x, -y, rotationInRad ), yCoord + RotateYCoord( x, -y, rotationInRad ) );
printf( "ARC CCW (%f %f) (%f %f) (%f %f);\n",
xCoord + RotateXCoord( a, 0.0, rotationInRad ), yCoord + RotateYCoord( a, 0.0, rotationInRad ),
xCoord + RotateXCoord( a - 2.0 * r1, 0.0, rotationInRad ), yCoord + RotateYCoord( a - 2.0 * r1, 0.0, rotationInRad ),
xCoord + RotateXCoord( x, y, rotationInRad ), yCoord + RotateYCoord( x, y, rotationInRad ) );
printf( "ARC CW (%f %f) (%f %f) (%f %f);\n",
xCoord + RotateXCoord( -a, 0.0, rotationInRad ), yCoord + RotateYCoord( -a, 0.0, rotationInRad ),
xCoord + RotateXCoord( 2.0 * r1 - a, 0.0, rotationInRad ), yCoord + RotateYCoord( 2.0 * r1 - a, 0.0, rotationInRad ),
xCoord + RotateXCoord( -x, y, rotationInRad ), yCoord + RotateYCoord( -x, y, rotationInRad ) );
printf( "ARC CCW (%f %f) (%f %f) (%f %f);\n",
xCoord + RotateXCoord( -a, 0.0, rotationInRad ), yCoord + RotateYCoord( -a, 0.0, rotationInRad ),
xCoord + RotateXCoord( 2.0 * r1 - a, 0.0, rotationInRad ), yCoord + RotateYCoord( 2.0 * r1 - a, 0.0, rotationInRad ),
xCoord + RotateXCoord( -x, -y, rotationInRad ), yCoord + RotateYCoord( -x, -y, rotationInRad ) );
}
void FilledEllipse( real a, real b, real xCoord, real yCoord, real rotationInDegree )
{
if( a < 0.0 ) {
dlgMessageBox( "a must be > 0", "OK");
return;
}
if( b < 0.0 ) {
dlgMessageBox( "b must be > 0", "OK");
return;
}
if( b > a ) {
dlgMessageBox( "a must be > b", "OK");
return;
}
real phi = atan( b / a );
real theta = PI / 2 - phi;
real r1 = ( a * sin( theta ) + b * cos( theta ) - a ) /
( sin( theta ) + cos( theta ) - 1 );
real r2 = ( a * sin( theta ) + b * cos( theta ) - b ) /
( sin( theta ) + cos( theta ) - 1 );
real x = r2 * sin( phi );
real y = b - r2 * ( 1.0 - cos( phi ) );
real rotationInRad = rotationInDegree * PI / 180.0;
printf( "POLYGON 0\n");
printf( "(%f %f) @-%f (%f %f)\n",
xCoord + RotateXCoord( 0.0, b, rotationInRad ), yCoord + RotateYCoord( 0.0, b, rotationInRad ),
r2,
xCoord + RotateXCoord( x, y, rotationInRad ), yCoord + RotateYCoord( x, y, rotationInRad ) );
printf( "@-%f (%f %f)\n",
r1,
xCoord + RotateXCoord( a, 0.0, rotationInRad ), yCoord + RotateYCoord( a, 0.0, rotationInRad ) );
printf( "@-%f (%f %f)\n",
r1,
xCoord + RotateXCoord( x, -y, rotationInRad ), yCoord + RotateYCoord( x, -y, rotationInRad ) );
printf( "@-%f (%f %f)\n",
r2,
xCoord + RotateXCoord( 0.0, -b, rotationInRad ), yCoord + RotateYCoord( 0.0, -b, rotationInRad ) );
printf( "@-%f (%f %f)\n",
r2,
xCoord + RotateXCoord( -x, -y, rotationInRad ), yCoord + RotateYCoord( -x, -y, rotationInRad ) );
printf( "@-%f (%f %f)\n",
r1,
xCoord + RotateXCoord( -a, 0.0, rotationInRad ), yCoord + RotateYCoord( -a, 0.0, rotationInRad ) );
printf( "@-%f (%f %f)\n",
r1,
xCoord + RotateXCoord( -x, y, rotationInRad ), yCoord + RotateYCoord( -x, y, rotationInRad ) );
printf( "@-%f (%f %f);\n",
r2,
xCoord + RotateXCoord( 0.0, b, rotationInRad ), yCoord + RotateYCoord( 0.0, b, rotationInRad ) );
}
int OnePadShapeCreated;
int ProcessOnePadShape( int Number, int startToken, string holeDiam )
{
int layerNumRefPosition = FindToken( startToken + 1, "layerNumRef" );
if( layerNumRefPosition >= 0 ) {
if( checkLayerType( layerNumRefPosition + 1 ) ) {
int padShapeTypePosition = FindToken( startToken + 1, "padShapeType" );
if( padShapeTypePosition >= 0 ) {
int shapeWidthPosition = FindToken( startToken + 1, "shapeWidth" );
if( shapeWidthPosition >= 0 ) {
string TokenText = Tokens[ shapeWidthPosition + 1 ];
if( Tokens[ shapeWidthPosition + 2 ] != ")" ) {
if( IsASCIIValue( Tokens[ shapeWidthPosition + 2 ] ) ) {
TokenText = TokenText + Tokens[ shapeWidthPosition + 2 ];
}
else {
WriteLog( "#warning: wrong description.\n" );
}
}
string shapeWidth = ConvertUnits( GetNumberValue( TokenText ),
GetUnitValue( TokenText ) );
int shapeHeightPosition = FindToken( startToken + 1, "shapeHeight" );
if( shapeHeightPosition >= 0 ) {
string TokenText = Tokens[ shapeHeightPosition + 1 ];
if( Tokens[ shapeHeightPosition + 2 ] != ")" ) {
if( IsASCIIValue( Tokens[ shapeHeightPosition + 2 ] ) ) {
TokenText = TokenText + Tokens[ shapeHeightPosition + 2 ];
}
else {
WriteLog( "#warning: wrong description.\n" );
}
}
string shapeHeight = ConvertUnits( GetNumberValue( TokenText ),
GetUnitValue( TokenText ) );
if( ( !CheckForNull( shapeWidth ) ) ||
( !CheckForNull( shapeHeight ) ) ) {
printf("# PadShape: layerNumRef = %s",
Tokens[ layerNumRefPosition + 1 ] );
printf(" padShapeType = %s",
Tokens[ padShapeTypePosition + 1 ] );
printf(" shapeWidth = %s",
shapeWidth );
printf(" shapeHeight = %s\n",
shapeHeight );
if( IfSMD[ Number ] ) { // SMD
if( 1 /*OnePadShapeCreated == 0*/ ) {
if( Tokens[ padShapeTypePosition + 1 ] == "Oval" ) { // Oval
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sSMD %s %s -100",
PadStyleDefsScript[ Number ],
shapeWidth, shapeHeight );
OnePadShapeCreated = 1;
}
}
else {
if( Tokens[ padShapeTypePosition + 1 ] == "Rect" ) { // Rectangle
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sSMD %s %s -0",
PadStyleDefsScript[ Number ],
shapeWidth, shapeHeight );
OnePadShapeCreated = 1;
}
}
else {
if( Tokens[ padShapeTypePosition + 1 ] == "Ellipse" ) { // Ellipse
if( shapeWidth == shapeHeight ) {
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sSMD %s %s -100",
PadStyleDefsScript[ Number ],
shapeWidth, shapeHeight );
OnePadShapeCreated = 1;
}
}
else {
//if( DebugMessage ) {
WriteLog( "# warning: Ellipse with different width and height.\n");
//}
// Create circle here and ellipse later over it
//PadStyleShapeType[ Number ] = 1;
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sSMD %s %s -100",
PadStyleDefsScript[ Number ],
shapeWidth, shapeWidth );
OnePadShapeCreated = 1;
}
}
}
else {
if( Tokens[ padShapeTypePosition + 1 ] == "RndRect" ) { // RoundRectangle
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sSMD %s %s -25",
PadStyleDefsScript[ Number ],
shapeWidth, shapeHeight );
OnePadShapeCreated = 1;
}
}
else {
if( Tokens[ padShapeTypePosition + 1 ] == "Target" ) { // Make round
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sSMD %s %s -100",
PadStyleDefsScript[ Number ],
shapeWidth, shapeHeight );
OnePadShapeCreated = 1;
}
}
else {
string tmp;
sprintf( tmp, "# warning: SMDShape %s not supported yet\n",
Tokens[ padShapeTypePosition + 1 ] );
WriteLog( tmp );
}
}
}
}
}
}
}
else { // PAD
if( 1 /*OnePadShapeCreated == 0*/ ) {
if( Tokens[ padShapeTypePosition + 1 ] == "Oval" ) { // Oval
if( shapeWidth == shapeHeight ) {
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sPAD %s ROUND",
PadStyleDefsScript[ Number ],
shapeWidth );
OnePadShapeCreated = 1;
}
}
else {
//PadStyleShapeType[ Number ] = 1;
if( OnePadShapeCreated == 0 ) {
real val1 = strtod( ConvertUnits( GetNumberValue( shapeHeight ),
GetUnitValue( shapeHeight ) ) );
real val2 = strtod( ConvertUnits( GetNumberValue( shapeWidth ),
GetUnitValue( shapeWidth ) ) );
real D = val1;
if( D > val2 ) {
D = val2;
}
sprintf( PadStyleDefsScript[ Number ], "%sPAD %f LONG",
PadStyleDefsScript[ Number ], D );
/*sprintf( PadStyleDefsScript[ Number ], "%sPAD %s SQUARE",
PadStyleDefsScript[ Number ],
MinValue( shapeWidth, shapeHeight ) );*/
OnePadShapeCreated = 1;
if( val1 > val2 ) {
PadShapeAddRotation[ Number ] = 1;
}
}
/*PadShapeStyleShapeType[ NrPadShapeStyle ] = 2;
PadShapeStyleDefsWidth[ NrPadShapeStyle ] = shapeWidth;
PadShapeStyleDefsHeight[ NrPadShapeStyle ] = shapeHeight;
PadShapeStyleDefsLayer[ NrPadShapeStyle ] = Tokens[ layerNumRefPosition + 1 ];
NrPadShapeStyle++;
NrPadShapes[ Number ]++;*/
}
}
else {
if( Tokens[ padShapeTypePosition + 1 ] == "Rect" ) { // Rectangle
if( shapeWidth == shapeHeight ) {
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sPAD %s SQUARE",
PadStyleDefsScript[ Number ],
shapeWidth );
OnePadShapeCreated = 1;
}
}
else {
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sPAD %s SQUARE",
PadStyleDefsScript[ Number ],
MinValue( shapeWidth, shapeHeight ) );
OnePadShapeCreated = 1;
}
PadShapeStyleShapeType[ NrPadShapeStyle ] = 4;
PadShapeStyleDefsWidth[ NrPadShapeStyle ] = shapeWidth;
PadShapeStyleDefsHeight[ NrPadShapeStyle ] = shapeHeight;
PadShapeStyleDefsLayer[ NrPadShapeStyle ] = Tokens[ layerNumRefPosition + 1 ];
NrPadShapeStyle++;
NrPadShapes[ Number ]++;
}
}
else {
if( Tokens[ padShapeTypePosition + 1 ] == "Ellipse" ) { // Ellipse
if( shapeWidth == shapeHeight ) {
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sPAD %s ROUND",
PadStyleDefsScript[ Number ],
shapeWidth );
OnePadShapeCreated = 1;
}
}
else {
//if( DebugMessage ) {
WriteLog( "# warning: Ellipse with different width and height.\n");
//}
// Create circle here and ellipse later over it
PadShapeStyleShapeType[ NrPadShapeStyle ] = 1;
PadShapeStyleDefsWidth[ NrPadShapeStyle ] = shapeWidth;
PadShapeStyleDefsHeight[ NrPadShapeStyle ] = shapeHeight;
PadShapeStyleDefsLayer[ NrPadShapeStyle ] = Tokens[ layerNumRefPosition + 1 ];
NrPadShapeStyle++;
NrPadShapes[ Number ]++;
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sPAD %s ROUND",
PadStyleDefsScript[ Number ],
MinValue( shapeWidth, shapeHeight ) );
OnePadShapeCreated = 1;
}
}
}
else {
if( Tokens[ padShapeTypePosition + 1 ] == "MtHole" ) { // MountingHole
if( shapeWidth == shapeHeight ) {
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sHOLE %s",
PadStyleDefsScript[ Number ],
holeDiam );
OnePadShapeCreated = 1;
}
}
else {
//if( DebugMessage ) {
WriteLog( "# warning: MtHole with different width and height.\n");
//}
}
}
else {
if( Tokens[ padShapeTypePosition + 1 ] == "RndRect" ) { // RoundRectangle
if( OnePadShapeCreated == 0 ) {
real val1 = strtod( ConvertUnits( GetNumberValue( shapeHeight ),
GetUnitValue( shapeHeight ) ) );
real val2 = strtod( ConvertUnits( GetNumberValue( shapeWidth ),
GetUnitValue( shapeWidth ) ) );
real minVal = val1;
real maxVal = val1;
if( minVal > val2 ) {
minVal = val2;
}
if( maxVal < val2 ) {
maxVal = val2;
}
real d = maxVal * ( 1.0 - 0.7 / ROUNDNESS );
if( minVal > d ) {
minVal = d;
}
sprintf( PadStyleDefsScript[ Number ], "%sPAD %f SQUARE",
PadStyleDefsScript[ Number ], minVal );
OnePadShapeCreated = 1;
}
PadShapeStyleShapeType[ NrPadShapeStyle ] = 2;
PadShapeStyleDefsWidth[ NrPadShapeStyle ] = shapeWidth;
PadShapeStyleDefsHeight[ NrPadShapeStyle ] = shapeHeight;
PadShapeStyleDefsLayer[ NrPadShapeStyle ] = Tokens[ layerNumRefPosition + 1 ];
NrPadShapeStyle++;
NrPadShapes[ Number ]++;
}
else {
if( Tokens[ padShapeTypePosition + 1 ] == "Target" ) { // Make it round
if( OnePadShapeCreated == 0 ) {
sprintf( PadStyleDefsScript[ Number ], "%sPAD %s ROUND",
PadStyleDefsScript[ Number ],
shapeWidth );
OnePadShapeCreated = 1;
}
}
else {
string tmp;
sprintf( tmp, "# warning: PadShape %s not supported yet\n",
Tokens[ padShapeTypePosition + 1 ] );
WriteLog( tmp );
}
}
}
}
}
}
}
}
PadStyleDefsSkip[ Number ] = 0;
}
else {
if( DebugMessage ) {
printf( "# skips because of zero coordinates.\n");
}
}
}
}
else { // No width
if( Tokens[ padShapeTypePosition + 1 ] == "Polygon" ) {
printf( "#polygonPad\n");
string xLineCoord[];
string yLineCoord[];
int nrLines = 0;
int shapeOutlinePosition = FindToken( startToken + 1, "shapeOutline" );
if( shapeOutlinePosition >= 0 ) {
int currentToken = shapeOutlinePosition + 1;
PadShapeStyleDefsPolygon[ NrPadShapeStyle ] = currentToken;
while( currentToken < TokensNumber ) {
if( Tokens[ currentToken ] == "(" ) {
currentToken++;
if( Tokens[ currentToken ] == "pt" ) {
xLineCoord[ nrLines ] = Tokens[ currentToken + 1 ];
yLineCoord[ nrLines ] = Tokens[ currentToken + 2 ];
nrLines++;
currentToken = currentToken + 3;
}
}
else {
if( Tokens[ currentToken ] == ")" ) {
break;
}
}
currentToken++;
}
string minX = xLineCoord[ 0 ];
string minY = yLineCoord[ 0 ];
string maxX = xLineCoord[ 0 ];
string maxY = yLineCoord[ 0 ];
for( int i = 0; i < nrLines; i++ ) {
minX = MinValue( minX, xLineCoord[ i ] );
maxX = MaxValue( maxX, xLineCoord[ i ] );
minY = MinValue( minY, yLineCoord[ i ] );
maxY = MaxValue( maxY, yLineCoord[ i ] );
}
real rMinX = strtod( minX );
real rMaxX = strtod( maxX );
real rMinY = strtod( minY );
real rMaxY = strtod( maxY );
real rX = ( rMaxX - rMinX ) / 2.0;
real rY = ( rMaxY - rMinY ) / 2.0;
real r = rX;
if( r > rY ) {
r = rY;
}
if( OnePadShapeCreated == 0 ) {
if( IfSMD[ Number ] ) {
sprintf( PadStyleDefsScript[ Number ], "%sSMD %f %f -0",
PadStyleDefsScript[ Number ],
r,
r );
}
else {
sprintf( PadStyleDefsScript[ Number ], "%sPAD %f SQUARE",
PadStyleDefsScript[ Number ],
r );
}
OnePadShapeCreated = 1;
}
PadShapeStyleShapeType[ NrPadShapeStyle ] = 3;
PadShapeStyleDefsWidth[ NrPadShapeStyle ] = maxX;
PadShapeStyleDefsHeight[ NrPadShapeStyle ] = maxY;
PadShapeStyleDefsLayer[ NrPadShapeStyle ] = Tokens[ layerNumRefPosition + 1 ];
NrPadShapeStyle++;
NrPadShapes[ Number ]++;
PadStyleDefsSkip[ Number ] = 0;
}
else {
WriteLog("# warning: can't find shapeOutline\n");
}
}
}
}
}
}
else {
if( DebugMessage ) {
printf( "#skips because of layer.\n");
}
}
return( 0 );
}
int ProcessPadShapes( int Number, int startToken, string holeDiam )
{
OnePadShapeCreated = 0;
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "padShape" ) {
int SavePosition = CurrentToken;
ProcessOnePadShape( Number, SavePosition, holeDiam );
CurrentToken = SavePosition;
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
dlgMessageBox( "Unexpected keyword in ProcessPadShapes " + Tokens[
CurrentToken ], "OK");
return( 1 );
}
}
CurrentToken++;
}
return( 1 );
}
// This function converts PCAD layers to Eagle layers
string ConvertLayer( string PCADLayer )
{
for (int n = 0; n <= CntlayerDef; n++) {
if( PCADLayer == RefLayerNum[n] ) {
if( DebugMessage ) {
//printf( "# info: this layer was converted by using user file.\n");
}
return( PcadEagleLayerRefNum[n] );
}
}
if( PCADLayer == "0" ) return( "48" ); // Unknown layer
if( PCADLayer == "1" ) return( "1" ); // Top
if( PCADLayer == "2" ) return( "16" ); // Bottom
if( PCADLayer == "3" ) return( "20" ); // Dimension
if( PCADLayer == "4" ) return( "29" ); // Top Mask
if( PCADLayer == "5" ) return( "30" ); // Bot Mask
if( PCADLayer == "6" ) return( "21" ); // Top Silk
if( PCADLayer == "7" ) return( "22" ); // Bot Silk
if( PCADLayer == "8" ) return( "31" ); // Top Paste
if( PCADLayer == "9" ) return( "32" ); // Bot Paste
if( PCADLayer == "10" ) return( "21" ); // Top Assy
if( PCADLayer == "11" ) return( "22" ); // Bot Assy
if( PCADLayer == "12" ) return( "2" ); // Int1
if( PCADLayer == "13" ) return( "3" ); // Int2
if( PCADLayer == "14" ) return( "4" ); // Int3
if( PCADLayer == "15" ) return( "5" ); // Int4
if( PCADLayer == "16" ) return( "6" ); // Int5
if( PCADLayer == "17" ) return( "7" ); // Int6
if( PCADLayer == "18" ) return( "8" ); // Int7
if( PCADLayer == "19" ) return( "9" ); // Int8
if( PCADLayer == "20" ) return( "48" ); // MECH
if( PCADLayer == "21" ) return( "48" ); // MECH
if( PCADLayer == "22" ) return( "48" ); // MESH
if( PCADLayer == "23" ) return( "48" ); // MESH
if( PCADLayer == "24" ) return( "48" ); // MESH
if( PCADLayer == "25" ) return( "48" ); // TopStrMsk 48 ?
if( PCADLayer == "26" ) return( "48" ); // BotStrMsk 48 ?
if( PCADLayer == "27" ) return( "48" ); // TopCreep 48 ?
if( PCADLayer == "28" ) return( "48" ); // BotCreep 48 ?
if( PCADLayer == "29" ) return( "48" ); // Int1Creep 48 ?
if( PCADLayer == "30" ) return( "48" ); // Int2Creep 48 ?
if( PCADLayer == "31" ) return( "48" ); // Int3Creep 48 ?
if( PCADLayer == "32" ) return( "48" ); // Int4Creep 48 ?
if( PCADLayer == "33" ) return( "48" ); // Int5Creep 48 ?
if( PCADLayer == "34" ) return( "48" ); // Int6Creep 48 ?
if( PCADLayer == "35" ) return( "48" ); // Int7Creep 48 ?
if( PCADLayer == "36" ) return( "48" ); // Int8Creep 48 ?
if( PCADLayer == "37" ) return( "48" ); // Int9Creep 48 ?
if( PCADLayer == "38" ) return( "48" ); // Int10Creep 48 ?
if( PCADLayer == "39" ) return( "48" ); // Reserve ?
if( PCADLayer == "40" ) return( "48" ); // TxtCreep 48 ?
if( PCADLayer == "41" ) return( "48" ); // DrillHelp 48 ?
if( PCADLayer == "42" ) return( "44" ); // Drill
if( PCADLayer == "43" ) return( "48" ); // TopTxt 48 ?
if( PCADLayer == "44" ) return( "48" ); // BotTxt 48 ?
if( PCADLayer == "45" ) return( "48" ); // TopHelp 48 ?
if( PCADLayer == "46" ) return( "48" ); // BotHelp 48 ?
if( PCADLayer == "47" ) return( "48" ); // Int1Help 48 ?
if( PCADLayer == "48" ) return( "48" ); // Int2Help 48 ?
if( PCADLayer == "49" ) return( "48" ); // Int3Help 48 ?
if( PCADLayer == "50" ) return( "48" ); // Int4Help 48 ?
if( PCADLayer == "51" ) return( "48" ); // Int5Help 48 ?
if( PCADLayer == "52" ) return( "48" ); // Int6Help 48 ?
if( PCADLayer == "53" ) return( "48" ); // Int7Help 48 ?
if( PCADLayer == "54" ) return( "48" ); // Int8Help 48 ?
if( PCADLayer == "55" ) return( "48" ); // Int9Help 48 ?
if( PCADLayer == "56" ) return( "48" ); // Int10Help 48 ?
if( PCADLayer == "57" ) return( "48" ); // SilkscreenTop 48 ?
if( PCADLayer == "58" ) return( "48" ); // SilkscreenBot 48 ?
if( PCADLayer == "59" ) return( "48" ); // BoardHelp 48 ?
if( PCADLayer == "60" ) return( "48" ); // A4H1T0 48 ?
if( PCADLayer == "61" ) return( "48" ); // A4H1B0 48 ?
if( PCADLayer == "62" ) return( "48" ); // A4H2T0 48 ?
if( PCADLayer == "63" ) return( "48" ); // A4H2B0 48 ?
if( PCADLayer == "64" ) return( "48" ); // A4H1-5T0 48 ?
if( PCADLayer == "65" ) return( "48" ); // A4H1-5B0 48 ?
if( PCADLayer == "66" ) return( "48" ); // A4H3T0 48 ?
if( PCADLayer == "67" ) return( "48" ); // A4H3B0 48 ?
if( PCADLayer == "68" ) return( "48" ); // A3H1T0 48 ?
if( PCADLayer == "69" ) return( "48" ); // A3H1B0 48 ?
if( PCADLayer == "70" ) return( "48" ); // TitleReserveT 48 ?
if( PCADLayer == "71" ) return( "48" ); // TitleReserveB 48 ?
if( PCADLayer == "72" ) return( "48" ); // TopDesRes 48 ?
if( PCADLayer == "73" ) return( "48" ); // BotDesRes 48 ?
if( PCADLayer == "74" ) return( "48" ); // TopLCover 48 ?
if( PCADLayer == "75" ) return( "48" ); // BotLCover 48 ?
if( PCADLayer == "76" ) return( "48" ); // TopTstPnt 48 ?
if( PCADLayer == "77" ) return( "48" ); // BotTstPnt 48 ?
// No Layers 78, 79
if( PCADLayer == "80" ) return( "48" ); // Int1Txt 48 ?
if( PCADLayer == "81" ) return( "48" ); // Int2Txt 48 ?
if( PCADLayer == "82" ) return( "48" ); // Int3Txt 48 ?
if( PCADLayer == "83" ) return( "48" ); // Int4Txt 48 ?
if( PCADLayer == "84" ) return( "48" ); // Int5Txt 48 ?
if( PCADLayer == "85" ) return( "48" ); // Int6Txt 48 ?
if( PCADLayer == "86" ) return( "48" ); // Int7Txt 48 ?
if( PCADLayer == "87" ) return( "48" ); // Int8Txt 48 ?
if( PCADLayer == "88" ) return( "48" ); // Int9Txt 48 ?
if( PCADLayer == "89" ) return( "48" ); // Int10Txt 48 ?
if( PCADLayer == "90" ) return( "48" ); // TxtTopCreep 48 ?
if( PCADLayer == "91" ) return( "48" ); // TxtBotCreep 48 ?
if( PCADLayer == "92" ) return( "48" ); // TxtInt1Creep 48 ?
if( PCADLayer == "93" ) return( "48" ); // TxtInt2Creep 48 ?
if( PCADLayer == "94" ) return( "48" ); // TxtInt3Creep 48 ?
if( PCADLayer == "95" ) return( "48" ); // TxtInt4Creep 48 ?
if( PCADLayer == "96" ) return( "48" ); // TxtInt5Creep 48 ?
if( PCADLayer == "97" ) return( "48" ); // TxtInt6Creep 48 ?
if( PCADLayer == "98" ) return( "48" ); // TxtInt7Creep 48 ?
if( PCADLayer == "99" ) return( "48" ); // TxtInt8Creep 48 ?
if( PCADLayer == "100" ) return( "48" ); // TxtInt9Creep 48 ?
if( PCADLayer == "101" ) return( "48" ); // TxtInt10Creep 48 ?
if( PCADLayer == "102" ) return( "48" ); // Reserve1 48 ?
if( PCADLayer == "103" ) return( "48" ); // TxtAssyTopCreep 48 ?
if( PCADLayer == "104" ) return( "48" ); // TxtAssyBotCreep 48 ?
if( PCADLayer == "105" ) return( "48" ); // TxtAssyTop 48 ?
if( PCADLayer == "106" ) return( "48" ); // TxtAssyBot 48 ?
if( PCADLayer == "107" ) return( "48" ); // TxtTopLCover 48 ?
if( PCADLayer == "108" ) return( "48" ); // TxtBotLCover 48 ?
if( PCADLayer == "109" ) return( "48" ); // TestPointTop 48 ?
if( PCADLayer == "110" ) return( "48" ); // TestPointBot 48 ?
if( PCADLayer == "111" ) return( "35" ); // TopGlue
if( PCADLayer == "112" ) return( "36" ); // BotGlue
if( PCADLayer == "113" ) return( "48" ); // Drill-Top-I1 48 ?
if( PCADLayer == "123" ) return( "48" ); // Drill-Top-I4 48 ?
string tmp;
sprintf( tmp, "# warning: ConvertLayer: can't convert layer %s\n", PCADLayer );
WriteLog( tmp );
return( "" );
}
void GenerateOnePadDefinition( int Number, int startToken )
{
//PadStyleDefsScript[ Number ] = "#PadStyleDef " + Tokens[ startToken ];
printf( "#PadStyleDef %s\n", Tokens[ startToken ] );
/*ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
Tokens[ startToken ] ) );*/
PadStyleDefsSkip[ Number ] = 1;
PadShapeAddRotation[ Number ] = 0;
int holeDiamPosition = FindToken( startToken + 1, "holeDiam" );
if( holeDiamPosition >= 0 ) {
string TokenText = Tokens[ holeDiamPosition + 1 ];
if( Tokens[ holeDiamPosition + 2 ] != ")" ) {
if( IsASCIIValue( Tokens[ holeDiamPosition + 2 ] ) ) {
TokenText = TokenText + Tokens[ holeDiamPosition + 2 ];
}
else {
WriteLog( "#warning: wrong description.\n" );
}
}
string holeDiam = ConvertUnits( GetNumberValue( TokenText ),
GetUnitValue( TokenText ) );
PadShapePoiner[ Number ] = NrPadShapeStyle;
NrPadShapes[ Number ] = 0;
if( CheckForNull( holeDiam ) ) {
IfSMD[ Number ] = 1;
}
else {
IfSMD[ Number ] = 0;
}
if( DebugMessage ) {
printf( "#HoleDiameter = %s\n", holeDiam );
}
ProcessPadShapes( Number, startToken, holeDiam );
if( PadStyleDefsSkip[ Number ] ) {
if( DebugMessage ) {
printf( "# this PadDefinition was skipped.\n");
}
}
else {
if( IfSMD[ Number ] ) {
}
else {
sprintf( PadStyleDefsScript[ Number ], "CHANGE DRILL %s;\n%s",
holeDiam, PadStyleDefsScript[ Number ] );
}
//printf( "#%s\n", PadStyleDefsScript[ Number ] );
}
}
else {
if( DebugMessage ) {
printf( "# skips because pad has no holeDiam.\n");
}
}
}
void GeneratePadDefinitions( void )
{
for( int i = 0; i < PadStyleDefsNumber; i++ ) {
int startToken = PadStyleDefsArray[ i ];
string info;
sprintf( info, "Process Pad Style definition %d (%d)", i, PadStyleDefsNumber );
UpdateProgress( info );
GenerateOnePadDefinition( i, startToken );
}
}
// This function write library header to script
void GenerateLibraryHeader( void )
{
string libraryName;
string array[];
libraryName = filesetext( PCADfileName, ".lbr");
PrintPCADLayers();
printf("# Library header:\n");
if( fileglob( array, libraryName ) ) {
printf("SET CONFIRM YES;\n");
printf("REMOVE '%s';\n", libraryName );
printf("SET CONFIRM OFF;\n");
}
printf("OPEN '%s';\n", libraryName);
printf("SET WIRE_BEND 2;\n");
printf("SET OPTIMIZING OFF;\n");
printf("#\n");
}
// Returns originalName
string GetOriginalDeviceName( int startToken )
{
string originalName = "";
int token = FindToken( startToken, "originalName" );
if( token > 0 ) {
originalName = Tokens[ token + 1 ];
}
return( ReplaceNotSupportedCharacters( RemoveDoubleQuotas( originalName ) ) );
}
// This function generates one pad in device
void GeneratePad( int startToken, int zeroPosition )
{
int tokenPosition = FindToken( startToken + 1, "padStyleRef" );
if( tokenPosition >= 0 ) {
printf("#padStyleRef = %s\n", Tokens[ tokenPosition + 1 ] );
string info;
sprintf( info, "Process pad %d %s", tokenPosition, Tokens[ tokenPosition + 1 ] );
UpdateProgress( info );
int PadStyleDefNum = FindPadStyleDef( Tokens[ tokenPosition + 1 ] );
if( PadStyleDefNum >= 0 ) {
if( PadStyleDefsSkip[ PadStyleDefNum ] == 0 ) {
printf( "%s", PadStyleDefsScript[ PadStyleDefNum ] );
int defaultPinDesPosition = FindToken( startToken + 1, "defaultPinDes" );
int padNumPosition = FindToken( startToken + 1, "padNum" );
if( padNumPosition >= 0 ) {
int padCoordPosition = FindToken( startToken + 1, "pt" );
if( padCoordPosition >= 0 ) {
string rotation = "0";
int rotationPosition = FindToken( startToken + 1, "rotation" );
if( rotationPosition >= 0 ) {
rotation = Tokens[ rotationPosition + 1 ];
}
if( PadShapeAddRotation[ PadStyleDefNum ] ) {
real rot = strtod( rotation );
rot = rot + 90.0;
if( rot >= 360.0 ) {
rot = rot - 360.0;
}
sprintf( rotation, "%f", rot );
}
string padName = "";
padName = Tokens[ padNumPosition + 1 ];
/*if( defaultPinDesPosition >= 0 ) {
padName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ defaultPinDesPosition + 1 ] ) );
}
else {
padName = Tokens[ padNumPosition + 1 ];
}*/
string xCoordPad = "";
string yCoordPad = "";
xCoordPad = Tokens[ padCoordPosition + 1 ];
if( IsASCIIValue( Tokens[ padCoordPosition + 2 ] ) ) {
xCoordPad = xCoordPad + Tokens[ padCoordPosition + 2 ];
if( Tokens[ padCoordPosition + 3 ] != ")" ) {
yCoordPad = Tokens[ padCoordPosition + 3 ];
if( Tokens[ padCoordPosition + 4 ] != ")" ) {
yCoordPad = yCoordPad + Tokens[ padCoordPosition + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoordPad = Tokens[ padCoordPosition + 2 ];
if( Tokens[ padCoordPosition + 3 ] != ")" ) {
yCoordPad = yCoordPad + Tokens[ padCoordPosition + 3 ];
}
}
string Val1 = ConvertUnits( GetNumberValue( xCoordPad ),
GetUnitValue( xCoordPad ) );
string Val2 = ConvertUnits( GetNumberValue( yCoordPad ),
GetUnitValue( yCoordPad ) );
if( zeroPosition ) {
Val1 = "0.0";
Val2 = "0.0";
}
if( IfSMD[ PadStyleDefNum ] ) {
printf( " R%s '%s' (%s %s);\n",
rotation,
padName,
Val1, Val2 );
}
else {
int pos = strstr( PadStyleDefsScript[ PadStyleDefNum ], "HOLE" );
if( padName == "0" ) {
printf( " (%s %s);\n",
Val1, Val2 );
}
else {
if( pos >= 0 ) {
printf( " '%s' (%s %s);\n",
padName,
Val1, Val2 );
}
else {
printf( " R%s '%s' (%s %s);\n",
rotation,
padName,
Val1, Val2 );
}
}
}
int PPointer = PadShapePoiner[ PadStyleDefNum ];
int PNumber = NrPadShapes[ PadStyleDefNum ];
for( int i = 0; i < PNumber; i++, PPointer++ ) {
if( PadShapeStyleShapeType[ PPointer ] == 1 ) {
printf("CHANGE LAYER %s;\n", ConvertLayer( PadShapeStyleDefsLayer[ PPointer ] ) );
real xCoord = GetValue( Tokens[ padCoordPosition + 1 ] );
real yCoord = GetValue( Tokens[ padCoordPosition + 2 ] );
real halfWidth = GetValue( PadShapeStyleDefsWidth[ PPointer ] ) / 2.0;
real halfHeight = GetValue( PadShapeStyleDefsHeight[ PPointer ] ) / 2.0;
if( halfWidth > halfHeight ) {
FilledEllipse( halfWidth, halfHeight, xCoord, yCoord, 0 );
}
else {
FilledEllipse( halfHeight, halfWidth, xCoord, yCoord, 90.0 );
}
}
if( PadShapeStyleShapeType[ PPointer ] == 2 ) {
printf("CHANGE LAYER %s;\n", ConvertLayer( PadShapeStyleDefsLayer[ PPointer ] ) );
real xCoord = GetValue( Tokens[ padCoordPosition + 1 ] );
real yCoord = GetValue( Tokens[ padCoordPosition + 2 ] );
real halfWidth = GetValue( PadShapeStyleDefsWidth[ PPointer ] ) / 2.0;
real halfHeight = GetValue( PadShapeStyleDefsHeight[ PPointer ] ) / 2.0;
real rotationInRad = strtod( rotation ) * PI / 180.0;
real radius;
if( halfWidth < halfHeight ) {
radius = halfWidth / ROUNDNESS;
}
else {
radius = halfHeight / ROUNDNESS;
}
printf("# PadShapeStyleShapeType = 2 halfWidth = %f halfHeight = %f radius = %f\n", halfWidth, halfHeight, radius );
real x_lo = -halfWidth + radius;
real y_lo = -halfHeight + radius;
real x_hi = halfWidth - radius;
real y_hi = halfHeight - radius;
printf("POLYGON %f (%f %f) (%f %f) (%f %f) (%f %f) (%f %f);\n", 2 * radius,
xCoord + RotateXCoord( x_lo, y_lo, rotationInRad ), yCoord + RotateYCoord( x_lo, y_lo, rotationInRad ),
xCoord + RotateXCoord( x_hi, y_lo, rotationInRad ), yCoord + RotateYCoord( x_hi, y_lo, rotationInRad ),
xCoord + RotateXCoord( x_hi, y_hi, rotationInRad ), yCoord + RotateYCoord( x_hi, y_hi, rotationInRad ),
xCoord + RotateXCoord( x_lo, y_hi, rotationInRad ), yCoord + RotateYCoord( x_lo, y_hi, rotationInRad ),
xCoord + RotateXCoord( x_lo, y_hi, rotationInRad ), yCoord + RotateYCoord( x_lo, y_hi, rotationInRad ) );
/*printf("POLYGON 0 (%f %f) (%f %f) @-%f (%f %f) (%f %f) @-%f (%f %f) (%f %f) @-%f (%f %f) (%f %f) @-%f (%f %f) ;\n",
xCoord + RotateXCoord( halfWidth - radius, -halfHeight, rotationInRad ), yCoord + RotateYCoord( halfWidth - radius, -halfHeight, rotationInRad ),
xCoord + RotateXCoord( -halfWidth + radius, -halfHeight, rotationInRad ), yCoord + RotateYCoord( -halfWidth + radius, -halfHeight, rotationInRad ),
radius,
xCoord + RotateXCoord( -halfWidth, -halfHeight + radius, rotationInRad ), yCoord + RotateYCoord( -halfWidth, -halfHeight + radius, rotationInRad ),
xCoord + RotateXCoord( -halfWidth, halfHeight - radius, rotationInRad ), yCoord + RotateYCoord( -halfWidth, halfHeight - radius, rotationInRad ),
radius,
xCoord + RotateXCoord( -halfWidth + radius, halfHeight, rotationInRad ), yCoord + RotateYCoord( -halfWidth + radius, halfHeight, rotationInRad ),
xCoord + RotateXCoord( halfWidth - radius, halfHeight, rotationInRad ), yCoord + RotateYCoord( halfWidth - radius, halfHeight, rotationInRad ),
radius,
xCoord + RotateXCoord( halfWidth, halfHeight - radius, rotationInRad ), yCoord + RotateYCoord( halfWidth, halfHeight - radius, rotationInRad ),
xCoord + RotateXCoord( halfWidth, -halfHeight + radius, rotationInRad ), yCoord + RotateYCoord( halfWidth, -halfHeight + radius, rotationInRad ),
radius,
xCoord + RotateXCoord( halfWidth - radius, -halfHeight, rotationInRad ), yCoord + RotateYCoord( halfWidth - radius, -halfHeight, rotationInRad ) );*/
}
if( PadShapeStyleShapeType[ PPointer ] == 3 ) {
string xPadCoord[];
string yPadCoord[];
int nrLines = 0;
printf("CHANGE LAYER %s;\n", ConvertLayer( PadShapeStyleDefsLayer[ PPointer ] ) );
int currentToken = PadShapeStyleDefsPolygon[ PPointer ];
while( currentToken < TokensNumber ) {
if( Tokens[ currentToken ] == "(" ) {
currentToken++;
if( Tokens[ currentToken ] == "pt" ) {
xPadCoord[ nrLines ] = Tokens[ currentToken + 1 ];
if( IsASCIIValue( Tokens[ currentToken + 2 ] ) ) {
xPadCoord[ nrLines ] = xPadCoord[ nrLines ] + Tokens[ currentToken + 2 ];
if( Tokens[ currentToken + 3 ] != ")" ) {
yPadCoord[ nrLines ] = Tokens[ currentToken + 3 ];
if( Tokens[ currentToken + 4 ] != ")" ) {
yPadCoord[ nrLines ] = yPadCoord[ nrLines ] + Tokens[ currentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yPadCoord[ nrLines ] = Tokens[ currentToken + 2 ];
if( Tokens[ currentToken + 3 ] != ")" ) {
yPadCoord[ nrLines ] = yPadCoord[ nrLines ] + Tokens[ currentToken + 3 ];
}
}
nrLines++;
currentToken = currentToken + 3;
}
}
else {
if( Tokens[ currentToken ] == ")" ) {
break;
}
}
currentToken++;
} // while
real xCoord = GetValue( Tokens[ padCoordPosition + 1 ] );
real yCoord = GetValue( Tokens[ padCoordPosition + 2 ] );
//printf("GRID 0.01 mil;\n" );
real rotationInRad = strtod( rotation ) * PI / 180.0;
printf("# PadShapeStyleShapeType == 3\n");
printf("POLYGON 0\n");
for( int i = 0; i < nrLines; i++ ) {
real xPolyCoord = strtod( ConvertUnits( GetNumberValue( xPadCoord[ i ] ), GetUnitValue( xPadCoord[ i ] ) ) );
real yPolyCoord = strtod( ConvertUnits( GetNumberValue( yPadCoord[ i ] ), GetUnitValue( yPadCoord[ i ] ) ) );
printf(" (%f %f)\n", xCoord + RotateXCoord( xPolyCoord, yPolyCoord, rotationInRad ), yCoord + RotateYCoord( xPolyCoord, yPolyCoord, rotationInRad ) );
}
real xPolyCoord = strtod( ConvertUnits( GetNumberValue( xPadCoord[ 0 ] ), GetUnitValue( xPadCoord[ 0 ] ) ) );
real yPolyCoord = strtod( ConvertUnits( GetNumberValue( yPadCoord[ 0 ] ), GetUnitValue( yPadCoord[ 0 ] ) ) );
printf(" (%f %f);\n", xCoord + RotateXCoord( xPolyCoord, yPolyCoord, rotationInRad ), yCoord + RotateYCoord( xPolyCoord, yPolyCoord, rotationInRad ) );
}
if( PadShapeStyleShapeType[ PPointer ] == 4 ) {
printf("CHANGE LAYER %s;\n", ConvertLayer( PadShapeStyleDefsLayer[ PPointer ] ) );
real xCoord = GetValue( Tokens[ padCoordPosition + 1 ] );
real yCoord = GetValue( Tokens[ padCoordPosition + 2 ] );
real halfWidth = GetValue( PadShapeStyleDefsWidth[ PPointer ] ) / 2.0;
real halfHeight = GetValue( PadShapeStyleDefsHeight[ PPointer ] ) / 2.0;
printf("# PadShapeStyleShapeType = 4\n");
real rotationInRad = strtod( rotation ) * PI / 180.0;
printf("POLYGON 0 (%f %f) (%f %f) (%f %f) (%f %f) (%f %f);\n",
xCoord + RotateXCoord( -halfWidth, -halfHeight, rotationInRad ), yCoord + RotateYCoord( -halfWidth, -halfHeight, rotationInRad ),
xCoord + RotateXCoord( halfWidth, -halfHeight, rotationInRad ), yCoord + RotateYCoord( halfWidth, -halfHeight, rotationInRad ),
xCoord + RotateXCoord( halfWidth, halfHeight, rotationInRad ), yCoord + RotateYCoord( halfWidth, halfHeight, rotationInRad ),
xCoord + RotateXCoord( -halfWidth, halfHeight, rotationInRad ), yCoord + RotateYCoord( -halfWidth, halfHeight, rotationInRad ),
xCoord + RotateXCoord( -halfWidth, -halfHeight, rotationInRad ), yCoord + RotateYCoord( -halfWidth, -halfHeight, rotationInRad ) );
}
}
}
else {
string tmp;
sprintf( tmp, "#WARNING: Can't find pt for pad %s\n",
Tokens[ startToken + 3 ] );
WriteLog( tmp );
}
}
else {
string tmp;
printf("#WARNING: Can't find padNum for pad %s\n",
Tokens[ startToken + 3 ] );
WriteLog( tmp );
}
}
else {
printf("#skip this pad\n");
}
}
else {
string tmp;
printf("#WARNING: Can't find padStyleDef for pad %s\n",
Tokens[ startToken + 3 ] );
WriteLog( tmp );
}
}
else {
string tmp;
printf("#WARNING: Can't find padStyleRef for pad %s\n",
Tokens[ startToken + 3 ] );
WriteLog( tmp );
}
}
void GenerateOneLine( int startToken, int ifNet, int ifBoard )
{
string net = "";
string width;
string xLineCoord[];
string yLineCoord[];
int nrLines = 0;
CurrentToken = FindToken( startToken + 1, "width" );
if( CurrentToken > 0 ) {
string TokenText = Tokens[ CurrentToken + 1 ];
if( Tokens[ CurrentToken + 2 ] != ")" ) {
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
TokenText = TokenText + Tokens[ CurrentToken + 2 ];
}
else {
WriteLog( "#warning: wrong description.\n" );
}
}
width = TokenText;
}
else {
if( ifBoard ) {
width = DEFAULT_WIRE_WIDTH_BOARD;
}
else {
width = DEFAULT_WIRE_WIDTH_SCHEMATIC;
}
}
if( 1 ) {
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
xLineCoord[ nrLines ] = Tokens[ CurrentToken + 1 ];
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xLineCoord[ nrLines ] = xLineCoord[ nrLines ] + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yLineCoord[ nrLines ] = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yLineCoord[ nrLines ] = yLineCoord[ nrLines ] + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yLineCoord[ nrLines ] = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yLineCoord[ nrLines ] = yLineCoord[ nrLines ] + Tokens[ CurrentToken + 3 ];
}
}
nrLines++;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "width" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "netNameRef" ) {
net = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "dimensionRef" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "endStyle" ) {
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GenerateOneLine ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
dlgMessageBox( "Unexpected keyword in GenerateOneLine " + Tokens[ CurrentToken ], "OK");
return;
}
}
CurrentToken++;
}
if( ifNet ) {
for( int i = 0; i < nrLines - 1; i++ ) {
printf("NET '%s' (%s %s) (%s %s);\n", net, xLineCoord[ i ], yLineCoord[ i ],
xLineCoord[ i + 1 ], yLineCoord[ i + 1 ] );
}
for( int j = 0; j < nrLines; j++ ) {
real xCoord = strtod( ConvertUnits( GetNumberValue( xLineCoord[ j ] ), GetUnitValue( xLineCoord[ j ] ) ) );
real yCoord = strtod( ConvertUnits( GetNumberValue( yLineCoord[ j ] ), GetUnitValue( yLineCoord[ j ] ) ) );
WiresPointX[ NrWiresPoint ] = xCoord;
WiresPointY[ NrWiresPoint ] = yCoord;
WiresNet[ NrWiresPoint ] = net;
NrWiresPoint++;
}
return;
}
// Generate line or wire
if( net == "" ) {
for( int i = 0; i < nrLines - 1; i++ ) {
string Val1 = ConvertUnits( GetNumberValue( xLineCoord[ i ] ),
GetUnitValue( xLineCoord[ i ] ) );
string Val2 = ConvertUnits( GetNumberValue( yLineCoord[ i ] ),
GetUnitValue( yLineCoord[ i ] ) );
string Val3 = ConvertUnits( GetNumberValue( xLineCoord[ i + 1 ] ),
GetUnitValue( xLineCoord[ i + 1 ] ) );
string Val4 = ConvertUnits( GetNumberValue( yLineCoord[ i + 1 ] ),
GetUnitValue( yLineCoord[ i + 1 ] ) );
printf("WIRE %s (%s %s) (%s %s);\n", width, Val1, Val2, Val3, Val4 );
}
}
else {
for( int i = 0; i < nrLines - 1; i++ ) {
string Val1 = ConvertUnits( GetNumberValue( xLineCoord[ i ] ),
GetUnitValue( xLineCoord[ i ] ) );
string Val2 = ConvertUnits( GetNumberValue( yLineCoord[ i ] ),
GetUnitValue( yLineCoord[ i ] ) );
string Val3 = ConvertUnits( GetNumberValue( xLineCoord[ i + 1 ] ),
GetUnitValue( xLineCoord[ i + 1 ] ) );
string Val4 = ConvertUnits( GetNumberValue( yLineCoord[ i + 1 ] ),
GetUnitValue( yLineCoord[ i + 1 ] ) );
printf("WIRE '%s' %s (%s %s) (%s %s);\n", net, width, Val1, Val2, Val3, Val4 );
}
}
}
else {
WriteLog("# warning: GenerateOneLine can't find width.\n");
}
}
void GenerateOnePcbPoly( int startToken, int ifBoard, string width )
{
string net = "";
string xLineCoord[];
string yLineCoord[];
int nrLines = 0;
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
xLineCoord[ nrLines ] = Tokens[ CurrentToken + 1 ];
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xLineCoord[ nrLines ] = xLineCoord[ nrLines ] + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yLineCoord[ nrLines ] = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yLineCoord[ nrLines ] = yLineCoord[ nrLines ] + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yLineCoord[ nrLines ] = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yLineCoord[ nrLines ] = yLineCoord[ nrLines ] + Tokens[ CurrentToken + 3 ];
}
}
nrLines++;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "width" ) {
string TokenText = Tokens[ CurrentToken + 1 ];
if( Tokens[ CurrentToken + 2 ] != ")" ) {
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
TokenText = TokenText + Tokens[ CurrentToken + 2 ];
}
else {
WriteLog( "#warning: wrong description.\n" );
}
}
width = TokenText;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "netNameRef" ) {
net = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "fillets" ) {
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GenerateOnePcbPoly ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
dlgMessageBox( "Unexpected keyword in GenerateOnePcbPoly " + Tokens[ CurrentToken ], "OK");
return;
}
}
CurrentToken++;
}
if( width == "" ) {
width = "0";
/*if( ifBoard ) {
width = DEFAULT_WIRE_WIDTH_BOARD;
}
else {
width = DEFAULT_WIRE_WIDTH_SCHEMATIC;
}*/
}
// Generate line
if( net == "" ) {
printf("POLYGON");
}
else {
printf("POLYGON '%s'", net );
}
if( width == "" ) {
}
else {
printf(" %s", width );
}
printf("\n");
for( int i = 0; i < nrLines; i++ ) {
printf(" (%s %s)\n", xLineCoord[ i ], yLineCoord[ i ] );
}
printf(" (%s %s);\n", xLineCoord[ 0 ], yLineCoord[ 0 ] );
}
void GenerateOneText( int startToken )
{
string text = "";
string textStyleDef;
string textRotation = "0";
string xTextCoord;
string yTextCoord;
string justify = "";
string xExtent = "";
string yExtent = "";
string mirrored = "";
int pointFound = 0;
CurrentToken = FindToken( startToken + 1, "textStyleRef" );
textStyleDef = Tokens[ CurrentToken + 1 ];
if( CurrentToken > 0 ) {
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
pointFound = 1;
xTextCoord = Tokens[ CurrentToken + 1 ];
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xTextCoord = xTextCoord + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yTextCoord = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yTextCoord = yTextCoord + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yTextCoord = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yTextCoord = yTextCoord + Tokens[ CurrentToken + 3 ];
}
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "rotation" ) {
textRotation = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "justify" ) {
justify = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "extent" ) {
//xExtent = Tokens[ CurrentToken + 1 ];
//yExtent = Tokens[ CurrentToken + 2 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isFlipped" ) {
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
mirrored = "M";
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isVisible" ) {
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GenerateOneText ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
if( UseExternalText ) {
text = ExternalText;
}
else {
sprintf( text, "'%s'", ReplaceNotSupportedCharactersText( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) ) );
//printf("# IfPinText = %d text = %s\n", IfPinText, text );
// It should be in all cases as we discussed
//if( IfPinText ) {
if( text[ 1 ] == '~' ) {
text[ 1 ] = '!';
}
//}
}
}
}
CurrentToken++;
}
if( text == "''" ) {
return;
}
if( !pointFound ) {
return;
}
if( justify == "" ) { //LowerLeft
printf("CHANGE ALIGN BOTTOM LEFT;\n");
if( xExtent != "" ) {
sprintf( xTextCoord, "%f", strtod( xTextCoord ) - strtod( xExtent ) / 2 );
}
if( yExtent != "" ) {
sprintf( yTextCoord, "%f", strtod( yTextCoord ) - strtod( yExtent ) / 2 );
}
} else if( justify == "UpperLeft" ) {
printf("CHANGE ALIGN TOP LEFT;\n");
if( xExtent != "" ) {
sprintf( xTextCoord, "%f", strtod( xTextCoord ) - strtod( xExtent ) / 2 );
}
if( yExtent != "" ) {
sprintf( yTextCoord, "%f", strtod( yTextCoord ) + strtod( yExtent ) / 2 );
}
} else if( justify == "UpperCenter" ) {
printf("CHANGE ALIGN TOP CENTER;\n");
if( yExtent != "" ) {
sprintf( yTextCoord, "%f", strtod( yTextCoord ) + strtod( yExtent ) / 2 );
}
} else if( justify == "UpperRight" ) {
printf("CHANGE ALIGN TOP RIGHT;\n");
if( xExtent != "" ) {
sprintf( xTextCoord, "%f", strtod( xTextCoord ) + strtod( xExtent ) / 2 );
}
if( yExtent != "" ) {
sprintf( yTextCoord, "%f", strtod( yTextCoord ) + strtod( yExtent ) / 2 );
}
} else if( justify == "Left" ) {
printf("CHANGE ALIGN CENTER LEFT;\n");
if( xExtent != "" ) {
sprintf( xTextCoord, "%f", strtod( xTextCoord ) - strtod( xExtent ) / 2 );
}
} else if( justify == "Center" ) {
printf("CHANGE ALIGN CENTER CENTER;\n");
} else if( justify == "Right" ) {
printf("CHANGE ALIGN CENTER RIGHT;\n");
if( xExtent != "" ) {
sprintf( xTextCoord, "%f", strtod( xTextCoord ) + strtod( xExtent ) / 2 );
}
} else if( justify == "LowerLeft" ) {
printf("CHANGE ALIGN BOTTOM LEFT;\n");
if( xExtent != "" ) {
sprintf( xTextCoord, "%f", strtod( xTextCoord ) - strtod( xExtent ) / 2 );
}
if( yExtent != "" ) {
sprintf( yTextCoord, "%f", strtod( yTextCoord ) - strtod( yExtent ) / 2 );
}
} else if( justify == "LowerCenter" ) {
printf("CHANGE ALIGN BOTTOM CENTER;\n");
if( yExtent != "" ) {
sprintf( yTextCoord, "%f", strtod( yTextCoord ) - strtod( yExtent ) / 2 );
}
} else if( justify == "LowerRight" ) {
printf("CHANGE ALIGN BOTTOM RIGHT;\n");
if( xExtent != "" ) {
sprintf( xTextCoord, "%f", strtod( xTextCoord ) + strtod( xExtent ) / 2 );
}
if( yExtent != "" ) {
sprintf( yTextCoord, "%f", strtod( yTextCoord ) - strtod( yExtent ) / 2 );
}
}
else {
printf("# warning: unknown justify parameter value = %s\n", justify );
printf("CHANGE ALIGN BOTTOM LEFT;\n");
if( xExtent != "" ) {
sprintf( xTextCoord, "%f", strtod( xTextCoord ) - strtod( xExtent ) / 2 );
}
if( yExtent != "" ) {
sprintf( yTextCoord, "%f", strtod( yTextCoord ) - strtod( yExtent ) / 2 );
}
}
// Generate text
int textStyleDefPos = FindTextStyleDef( textStyleDef );
if( textStyleDefPos >= 0 ) {
real fontHeight = strtod( ConvertUnits( GetNumberValue( TextStyleDefFontHeight[ textStyleDefPos ] ), GetUnitValue( TextStyleDefFontHeight[ textStyleDefPos ] ) ) );
real fontWidth = strtod( ConvertUnits( GetNumberValue( TextStyleDefFontStrokeWidth[ textStyleDefPos ] ), GetUnitValue( TextStyleDefFontStrokeWidth[ textStyleDefPos ] ) ) );
printf("CHANGE SIZE %s;\n", TextStyleDefFontHeight[ textStyleDefPos ] );
if( fontHeight ) {
int ratio = round( 100.0 * fontWidth / fontHeight );
if( ratio > 31.0 ) {
ratio = 31.0;
}
printf("CHANGE RATIO %d;\n", ratio );
}
printf("TEXT %s %sSR%s (%s %s);\n", text, mirrored, textRotation, xTextCoord, yTextCoord );
}
else {
WriteLog("# warning: GenerateOneText can't find textStyleDef.\n");
}
}
else {
WriteLog("# warning: GenerateOneText can't find textStyleRef.\n");
}
}
void GenerateOneBus( int startToken )
{
int textToken;
string dispName;
string textX;
string textY;
string xLineCoord[];
string yLineCoord[];
int nrLines = 0;
CurrentToken = startToken + 1;
string name = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
xLineCoord[ nrLines ] = Tokens[ CurrentToken + 1 ];
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xLineCoord[ nrLines ] = xLineCoord[ nrLines ] + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yLineCoord[ nrLines ] = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yLineCoord[ nrLines ] = yLineCoord[ nrLines ] + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yLineCoord[ nrLines ] = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yLineCoord[ nrLines ] = yLineCoord[ nrLines ] + Tokens[ CurrentToken + 3 ];
}
}
nrLines++;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "dispName" ) {
dispName = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "text" ) {
textToken = CurrentToken;
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GenerateOneBus ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
dlgMessageBox( "Unexpected keyword in GenerateOneBus " + Tokens[ CurrentToken ], "OK");
return;
}
}
CurrentToken++;
}
int pos = strchr( name, '(' );
if( pos >= 0 ) {
int pos1 = strchr( name, ':' );
if( pos1 >= 0 ) {
if( pos1 > pos + 1 ) {
int firstNumber = strtol( strsub( name, pos + 1, pos1 - pos - 1 ) );
int pos2 = strchr( name, ')' );
if( pos2 >= 0 ) {
if( pos2 > pos1 + 1 ) {
int secondNumber = strtol( strsub( name, pos1 + 1, pos2 - pos1 - 1 ) );
string busName = ReplaceNotSupportedCharacters( strsub( name, 0, pos ) );
for( int i = 0; i < nrLines - 1; i++ ) {
printf("BUS '%s[%d..%d]' (%s %s) (%s %s);\n", busName, firstNumber, secondNumber,
xLineCoord[ i ], yLineCoord[ i ],
xLineCoord[ i + 1 ], yLineCoord[ i + 1 ] );
}
if( dispName == "True" ) {
UseExternalText = 1;
sprintf( ExternalText, "'%s[%d..%d]'", busName, firstNumber, secondNumber );
GenerateOneText( textToken );
UseExternalText = 0;
}
}
}
else {
WriteLog( "#warning: GenerateOneBus cant find ')'\n");
}
}
else {
WriteLog( "#warning: GenerateOneBus wrong first number\n");
}
}
else {
WriteLog( "#warning: GenerateOneBus cant find ':'\n");
}
}
else {
string busName = ReplaceNotSupportedCharacters( name );
for( int i = 0; i < nrLines - 1; i++ ) {
printf("BUS '%s' (%s %s) (%s %s);\n", busName,
xLineCoord[ i ], yLineCoord[ i ],
xLineCoord[ i + 1 ], yLineCoord[ i + 1 ] );
}
if( dispName == "True" ) {
UseExternalText = 1;
sprintf( ExternalText, "'%s'", busName );
GenerateOneText( textToken );
UseExternalText = 0;
}
//printf( "# GenerateOneBus cant find '('\n");
}
}
void ArcDraw( string width, real X, string xArcCoordUnit, real Y, string yArcCoordUnit,
real Radius, string radiusUnit, real arcs, real arce )
{
string as;
real arcStart = 360 + (arcs);
if (arcStart > 360) arcStart -= 360;
real arcEnd = arcStart + (arce);
if (arcEnd > 360) arcEnd -= 360;
real xArcStart = Radius * cos(PI / 180 * arcStart);
real yArcStart = Radius * sin(PI / 180 * arcStart);
real xArcEnd = Radius * cos(PI / 180 * arcEnd);
real yArcEnd = Radius * sin(PI / 180 * arcEnd);
printf( "ARC CCW %s (%.8f%s %.8f%s) (%.8f%s %.8f%s) (%.8f%s %.8f%s);\n",
width,
X + xArcStart, xArcCoordUnit, Y + yArcStart, yArcCoordUnit,
X - xArcStart, xArcCoordUnit, Y - yArcStart, yArcCoordUnit,
X + xArcEnd, xArcCoordUnit, Y + yArcEnd, yArcCoordUnit );
}
void GenerateOneArc( int startToken )
{
real radius;
string radiusUnit = "";
real startAngle;
real sweepAngle;
string width;
real xArcCoord;
string xArcCoordUnit = "";
real yArcCoord;
string yArcCoordUnit = "";
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
string xArcCoordText = "";
string yArcCoordText = "";
xArcCoordText = Tokens[ CurrentToken + 1 ];
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xArcCoordText = xArcCoordText + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yArcCoordText = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yArcCoordText = yArcCoordText + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yArcCoordText = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yArcCoordText = yArcCoordText + Tokens[ CurrentToken + 3 ];
}
}
xArcCoord = strtod( ConvertUnits( GetNumberValue( xArcCoordText ), GetUnitValue( xArcCoordText ) ) );
yArcCoord = strtod( ConvertUnits( GetNumberValue( yArcCoordText ), GetUnitValue( yArcCoordText ) ) );
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "radius" ) {
string ArcRadiusText = Tokens[ CurrentToken + 1 ];
if( Tokens[ CurrentToken + 2 ] != ")" ) {
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
ArcRadiusText = ArcRadiusText + Tokens[ CurrentToken + 2 ];
}
else {
WriteLog( "#warning: wront radius description.\n" );
}
}
radius = strtod( ConvertUnits( GetNumberValue( ArcRadiusText ), GetUnitValue( ArcRadiusText ) ) );
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "startAngle" ) {
startAngle = strtod( Tokens[ CurrentToken + 1 ] );
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "sweepAngle" ) {
sweepAngle = strtod( Tokens[ CurrentToken + 1 ] );
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "width" ) {
width = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GenerateOneArc ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
//if( ( sweepAngle - startAngle >= 360 ) || ( ( ( sweepAngle == 0 ) && ( startAngle == 0 ) ) ) ) {
if( ( sweepAngle >= 360 ) || ( ( ( sweepAngle == 0 ) && ( startAngle == 0 ) ) ) ) {
printf("CIRCLE %s (%.8f%s %.8f%s) (%.8f%s %.8f%s);\n",
width, xArcCoord, xArcCoordUnit, yArcCoord, yArcCoordUnit,
xArcCoord + radius, xArcCoordUnit, yArcCoord, yArcCoordUnit );
}
else {
ArcDraw( width, xArcCoord, xArcCoordUnit, yArcCoord, yArcCoordUnit, radius, radiusUnit, startAngle, sweepAngle );
}
}
void GenerateOneTripleArc( int startToken )
{
string width;
real xPointCoord[];
real yPointCoord[];
int nrPoints = 0;
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
string xArcCoordText = "";
string yArcCoordText = "";
xArcCoordText = Tokens[ CurrentToken + 1 ];
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xArcCoordText = xArcCoordText + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yArcCoordText = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yArcCoordText = yArcCoordText + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yArcCoordText = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yArcCoordText = yArcCoordText + Tokens[ CurrentToken + 3 ];
}
}
xPointCoord[ nrPoints ] = strtod( ConvertUnits( GetNumberValue( xArcCoordText ), GetUnitValue( xArcCoordText ) ) );
yPointCoord[ nrPoints ] = strtod( ConvertUnits( GetNumberValue( yArcCoordText ), GetUnitValue( yArcCoordText ) ) );
//printf( "# coord = %f %f\n", xPointCoord[ nrPoints ], yPointCoord[ nrPoints ] );
nrPoints++;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "width" ) {
width = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GenerateOneTripleArc ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
if( nrPoints == 3 ) {
if( ( xPointCoord[ 1 ] == xPointCoord[ 2 ] ) && ( yPointCoord[ 1 ] == yPointCoord[ 2 ] ) ) {
printf( "CIRCLE %s (%.8f %.8f) (%.8f %.8f); # triplePointArc\n", width,
xPointCoord[ 0 ], yPointCoord[ 0 ],
xPointCoord[ 1 ], yPointCoord[ 1 ] );
}
else {
real pX = 2 * xPointCoord[ 0 ] - xPointCoord[ 1 ];
real pY = 2 * yPointCoord[ 0 ] - yPointCoord[ 1 ];
printf( "ARC CCW %s (%.8f %.8f) (%.8f %.8f) (%.8f %.8f); # triplePointArc\n", width,
xPointCoord[ 1 ],
yPointCoord[ 1 ],
pX,
pY,
xPointCoord[ 2 ],
yPointCoord[ 2 ] );
}
}
else {
string tmp;
sprintf( tmp, "warning: GenerateOneTripleArc wrong number of points %d\n", nrPoints );
WriteLog( tmp );
}
}
void GenerateIslandCutouts( int startToken )
{
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "islandOutline" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "cutout" ) {
printf("CHANGE Pour cutout;\n");
int SavePosition = CurrentToken;
CurrentToken++;
CurrentToken++;
printf( "CHANGE THERMALS OFF;\n");
GenerateOnePcbPoly( CurrentToken, 1, "" );
CurrentToken = SavePosition;
printf("CHANGE Pour solid;\n");
SkipThisItem();
}
else {
printf( "# GenerateIslandCutouts ??????? %s\n", Tokens[ CurrentToken ] );
SkipThisItem();
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
}
void GenerateOneCopperPour95( int startToken )
{
int thermal = 0;
int pourSolid = 1;
string width = DEFAULT_WIRE_WIDTH_BOARD;
string pourSpacing = "";
CurrentToken = FindToken( startToken + 1, "pourSpacing" );
if( CurrentToken > 0 ) {
printf( "CHANGE SPACING %s;\n", Tokens[ CurrentToken + 1 ] );
}
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pourType" ) {
if( Tokens[ CurrentToken + 1 ] != "SolidPour" ) {
pourSolid = 0;
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "netNameRef" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pourSpacing" ) {
string TokenText = Tokens[ CurrentToken + 1 ];
if( Tokens[ CurrentToken + 2 ] != ")" ) {
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
TokenText = TokenText + Tokens[ CurrentToken + 2 ];
}
else {
WriteLog( "#warning: wrong description.\n" );
}
}
pourSpacing = TokenText;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pourBackoff" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pourSmoothness" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "islandRemoval" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pcbPoly" ) {
int SavePosition = CurrentToken;
if( thermal ) {
printf( "CHANGE THERMALS ON;\n");
}
else {
printf( "CHANGE THERMALS OFF;\n");
}
if( pourSolid ) {
printf( "CHANGE POUR SOLID;\n");
}
else {
printf( "CHANGE POUR HATCH;\n");
}
if( pourSpacing != "" ) {
printf( "CHANGE SPACING %s;\n", pourSpacing );
}
else {
printf( "CHANGE SPACING 50mil;\n", pourSpacing );
}
printf("# CopperPour95\n");
GenerateOnePcbPoly( SavePosition, 1, width );
if( thermal ) {
printf( "CHANGE THERMALS OFF;\n");
}
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "width" ) {
string TokenText = Tokens[ CurrentToken + 1 ];
if( Tokens[ CurrentToken + 2 ] != ")" ) {
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
TokenText = TokenText + Tokens[ CurrentToken + 2 ];
}
else {
WriteLog( "#warning: wrong description.\n" );
}
}
width = TokenText;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "useDesignRules" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "thermalType" ) {
if( Tokens[ CurrentToken + 1 ] != "NoTherm" ) {
thermal = 1;
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "thermalWidth" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "thermalSpokes" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "viaThermalType" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "viaThermalWidth" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "viaThermalSpokes" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "island" ) {
int SavePosition = CurrentToken;
// Comment this line because Eagle doesn't use GND cutouts
//GenerateIslandCutouts( CurrentToken );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GenerateOneCopperPour95 ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
}
void GenerateOneDimension( int startToken )
{
CurrentToken = FindToken( startToken + 1, "dimPoints" );
if( CurrentToken > 0 ) {
string xPointCoord[];
string yPointCoord[];
string xPointUnit[];
string yPointUnit[];
int nrPoints = 0;
CurrentToken = CurrentToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
string xCoord = "";
string yCoord = "";
xCoord = Tokens[ CurrentToken + 1 ];
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xCoord = xCoord + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoord = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yCoord = yCoord + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoord = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoord = yCoord + Tokens[ CurrentToken + 3 ];
}
}
xPointCoord[ nrPoints ] = GetNumberValue( xCoord );
yPointCoord[ nrPoints ] = GetNumberValue( yCoord );
xPointUnit[ nrPoints ] = GetUnitValue( xCoord );
yPointUnit[ nrPoints ] = GetUnitValue( yCoord );
nrPoints++;
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GenerateOneDimension ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
CurrentToken = FindToken( startToken + 1, "dimOrient" );
string dimensionDirection = "PARALLEL";
if( Tokens[ CurrentToken + 1 ] == "dim_vertical" ) {
xPointCoord[ 1 ] = xPointCoord[ 0 ];
xPointUnit[ 1 ] = xPointUnit[ 0 ];
dimensionDirection = "Horizontal";
}
if( Tokens[ CurrentToken + 1 ] == "dim_horizontal" ) {
yPointCoord[ 1 ] = yPointCoord[ 0 ];
yPointUnit[ 1 ] = yPointUnit[ 0 ];
dimensionDirection = "Vertical";
}
if( nrPoints == 3 ) {
printf("GRID mm 0.0001;\n" );
printf("CHANGE LAYER 47;\n");
printf( "DIMENSION %s (C%s%s %s%s) (C%s%s %s%s) (C%s%s %s%s);\n",
dimensionDirection,
xPointCoord[ 0 ],
xPointUnit[ 0 ],
yPointCoord[ 0 ],
yPointUnit[ 0 ],
xPointCoord[ 1 ],
xPointUnit[ 1 ],
yPointCoord[ 1 ],
yPointUnit[ 1 ],
xPointCoord[ 2 ],
xPointUnit[ 2 ],
yPointCoord[ 2 ],
yPointUnit[ 2 ] );
}
printf("GRID %s;\n", FileUnits );
}
}
/*void GenerateOneAttribute( int startToken, string layer )
{
CurrentToken = startToken + 1;
string type = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
if( type == "Type" ) {
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
printf("CHANGE ALIGN CENTER;\n");
printf("CHANGE LAYER 27;\n");
string xCoord = Tokens[ CurrentToken + 1 ];
string yCoord = "";
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xCoord = xCoord + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoord = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yCoord = yCoord + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoord = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoord = yCoord + Tokens[ CurrentToken + 3 ];
}
}
printf("TEXT '>VALUE' (%s %s);\n",
ConvertUnits( GetNumberValue( xCoord ), GetUnitValue( xCoord ) ),
ConvertUnits( GetNumberValue( yCoord ), GetUnitValue( yCoord ) ) );
printf("CHANGE LAYER 25;\n");
printf("TEXT '>NAME' (0.0 0.0);\n");
if( layer != "" ) {
printf( "CHANGE LAYER %s;\n", layer );
}
}
else {
SkipThisItem();
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
}
}*/
/*void GenerateNameAndValue( int startToken, string layer )
{
CurrentToken = startToken + 1;
int textToken = startToken + 1;
string type = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
string xCoord = "0.0";
string yCoord = "0.0";
string isVisible = "True";
string textStyleRef = "";
int ifPoint = 0;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
ifPoint = 1;
xCoord = Tokens[ CurrentToken + 1 ];
yCoord = "";
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xCoord = xCoord + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoord = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yCoord = yCoord + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoord = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoord = yCoord + Tokens[ CurrentToken + 3 ];
}
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isVisible" ) {
if( ( Tokens[ CurrentToken + 1 ] == "False" ) || ( Tokens[ CurrentToken + 1 ] == "false" ) ) {
isVisible = "False";
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
textStyleRef = RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] );
SkipThisItem();
}
else {
SkipThisItem();
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
if( type == "Value" ) {
if( isVisible == "True" ) {
printf("CHANGE ALIGN CENTER;\n");
printf("CHANGE LAYER 27;\n");
if( ifPoint ) {
UseExternalText = 1;
ExternalText = "'>VALUE'";
GenerateOneText( textToken );
UseExternalText = 0;
}
else {
printf("TEXT '>VALUE' (0.0 0.0);\n");
}
if( layer != "" ) {
printf( "CHANGE LAYER %s;\n", layer );
}
}
}
if( type == "RefDes" ) {
if( isVisible == "True" ) {
printf("CHANGE ALIGN CENTER;\n");
printf("CHANGE LAYER 25;\n");
if( ifPoint ) {
UseExternalText = 1;
ExternalText = "'>NAME'";
GenerateOneText( textToken );
UseExternalText = 0;
}
else {
printf("TEXT '>NAME' (0.0 0.0);\n");
}
if( layer != "" ) {
printf( "CHANGE LAYER %s;\n", layer );
}
}
}
}*/
void GenerateNameAndValue( int startToken, string layer, int patternIndex )
{
CurrentToken = startToken + 1;
int textToken = startToken + 1;
string type = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) );
string xCoord = "0.0";
string yCoord = "0.0";
string isVisible = "False";
string textStyleRef = "";
int ifPoint = 0;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
ifPoint = 1;
xCoord = Tokens[ CurrentToken + 1 ];
yCoord = "";
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xCoord = xCoord + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoord = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yCoord = yCoord + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoord = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoord = yCoord + Tokens[ CurrentToken + 3 ];
}
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isVisible" ) {
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
isVisible = "True";
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
textStyleRef = RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] );
SkipThisItem();
}
else {
SkipThisItem();
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
if( type == "Value" ) {
printf("CHANGE ALIGN CENTER;\n");
printf("CHANGE LAYER 27;\n");
if( ifPoint ) {
UseExternalText = 1;
ExternalText = "'>VALUE'";
GenerateOneText( textToken );
UseExternalText = 0;
}
else {
printf("TEXT '>VALUE' (0.0 0.0);\n");
}
if( layer != "" ) {
printf( "CHANGE LAYER %s;\n", layer );
}
if( isVisible != "True" ) {
IfValueDefinedInPattern[ patternIndex ] = 1;
}
}
if( type == "RefDes" ) {
printf("CHANGE ALIGN CENTER;\n");
printf("CHANGE LAYER 25;\n");
if( ifPoint ) {
UseExternalText = 1;
ExternalText = "'>NAME'";
GenerateOneText( textToken );
UseExternalText = 0;
}
else {
printf("TEXT '>NAME' (0.0 0.0);\n");
}
if( layer != "" ) {
printf( "CHANGE LAYER %s;\n", layer );
}
if( isVisible != "True" ) {
IfNameDefinedInPattern[ patternIndex ] = 1;
}
}
AttributesName[ NrAttributes ] = type;
AttributesIndex[ NrAttributes ] = startToken;
NrAttributes++;
PatternNrAttributes[ patternIndex ]++;
}
void GenerateNameAndValueSchematics( int startToken, int symbolIndex )
{
CurrentToken = startToken + 1;
int textToken = startToken + 1;
string type = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) );
string xCoord = "0.0";
string yCoord = "0.0";
string isVisible = "False";
string textStyleRef = "";
int ifPoint = 0;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
ifPoint = 1;
xCoord = Tokens[ CurrentToken + 1 ];
yCoord = "";
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xCoord = xCoord + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoord = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yCoord = yCoord + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoord = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoord = yCoord + Tokens[ CurrentToken + 3 ];
}
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isVisible" ) {
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
isVisible = "True";
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
textStyleRef = RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] );
SkipThisItem();
}
else {
SkipThisItem();
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
if( type == "Value" ) {
printf("CHANGE ALIGN CENTER;\n");
printf("CHANGE LAYER 96;\n");
if( ifPoint ) {
UseExternalText = 1;
ExternalText = "'>VALUE'";
GenerateOneText( textToken );
UseExternalText = 0;
}
else {
printf("TEXT '>VALUE' (0.0 0.0);\n");
}
if( isVisible != "True" ) {
IfValueDefinedInSymbol[ symbolIndex ] = 1;
}
}
if( type == "RefDes" ) {
printf("CHANGE ALIGN CENTER;\n");
printf("CHANGE LAYER 95;\n");
if( ifPoint ) {
UseExternalText = 1;
ExternalText = "'>NAME'";
GenerateOneText( textToken );
UseExternalText = 0;
}
else {
printf("TEXT '>NAME' (0.0 0.0);\n");
}
if( isVisible != "True" ) {
IfNameDefinedInSymbol[ symbolIndex ] = 1;
}
}
AttributesName[ NrAttributes ] = type;
AttributesIndex[ NrAttributes ] = startToken;
NrAttributes++;
SymbolNrAttributes[ symbolIndex ]++;
}
void GenerateLayerContents( int startToken, int patternIndex )
{
printf("# LayerContents\n");
CurrentToken = FindToken( startToken + 1, "layerNumRef" );
if( CurrentToken > 0 ) {
string layer = ConvertLayer( Tokens[ CurrentToken + 1 ] );
printf( "# layerNumRef = %s\n", Tokens[ CurrentToken + 1 ] );
printf( "CHANGE LAYER %s;\n", layer );
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "line" ) {
int SavePosition = CurrentToken;
GenerateOneLine( SavePosition, 0, 1 );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "arc" ) {
int SavePosition = CurrentToken;
GenerateOneArc( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "text" ) {
int SavePosition = CurrentToken;
GenerateOneText( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "attr" ) {
int SavePosition = CurrentToken;
if( patternIndex >= 0 ) {
GenerateNameAndValue( SavePosition, layer, patternIndex );
}
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "triplePointArc" ) {
int SavePosition = CurrentToken;
GenerateOneTripleArc( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "testpoint" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "layerNumRef" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pcbPoly" ) {
int SavePosition = CurrentToken;
printf( "CHANGE THERMALS OFF;\n");
GenerateOnePcbPoly( SavePosition, 1, DEFAULT_WIRE_WIDTH_BOARD );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "polyCutOut" ) {
printf("CHANGE Pour cutout;\n");
int SavePosition = CurrentToken;
CurrentToken++;
CurrentToken++;
printf( "CHANGE THERMALS OFF;\n");
GenerateOnePcbPoly( CurrentToken, 1, DEFAULT_WIRE_WIDTH_BOARD );
CurrentToken = SavePosition;
printf("CHANGE Pour solid;\n");
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "copperPour95" ) {
int SavePosition = CurrentToken;
GenerateOneCopperPour95( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "field" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "boardOutlineObj" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "dimension" ) {
int SavePosition = CurrentToken;
GenerateOneDimension( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "table" ) {
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GenerateLayerContents ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
dlgMessageBox( TR("Unexpected keyword in LayerContents: ") + Tokens[ CurrentToken ], "OK");
return;
}
}
CurrentToken++;
}
}
else {
WriteLog("# warning: GenerateLayerContents can't find layerNumRef.\n");
}
}
// Generate devices from patternDef and patternDefExtended
void GeneratePackages( void )
{
printf("# Packages:\n");
for( int i = 0; i < PatternDefExtendedNumber; i++ ) {
int startToken = PatternDefExtendedArray[ i ];
string DeviceName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
Tokens[ startToken ] )
);
string OriginalDeviceName = GetOriginalDeviceName( startToken + 1 );
IfNameDefinedInPattern[ i ] = 0;
IfValueDefinedInPattern[ i ] = 0;
PatternAttributesIndex[ i ] = NrAttributes;
PatternNrAttributes[ i ] = 0;
PatternName[ i ] = DeviceName;
PatternOriginalName[ i ] = OriginalDeviceName;
int patternGraphicsNameRefToken = FindToken( startToken + 1, "patternGraphicsNameRef" );
if( patternGraphicsNameRefToken >= 0 ) {
PatternDefaultVariantName[ i ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ patternGraphicsNameRefToken + 1 ] ) );
}
else {
PatternDefaultVariantName[ i ] = "";
}
int patternGraphicsDefToken = PatternGraphicsDefArray[ i ];
if( patternGraphicsDefToken < 0 ) {
patternGraphicsDefToken = startToken;
PatternGraphicsDefName[ i ] = "";
}
else {
int patternGraphicsNameDefToken = FindToken( patternGraphicsDefToken + 1, "patternGraphicsNameDef" );
if( patternGraphicsNameDefToken >= 0 ) {
PatternGraphicsDefName[ i ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ patternGraphicsNameDefToken + 1 ] ) );
}
else {
PatternGraphicsDefName[ i ] = "";
WriteLog( "# warning: no patternGraphicsNameDef\n");
}
}
printf("#\n");
printf("# Package: %s OriginalName = %s VariantName = %s PatternDefaultVariantName = %s\n", DeviceName, OriginalDeviceName,
PatternGraphicsDefName[ i ], PatternDefaultVariantName[ i ] );
printf("EDIT '%s%s.PAC';\n", DeviceName, PatternGraphicsDefName[ i ] );
printf("DESCRIPTION 'Original name <b>%s</b><p>';\n", OriginalDeviceName );
printf("GRID %s;\n", FileUnits );
printf("CHANGE FONT VECTOR;\n");
if( patternGraphicsDefToken >= 0 ) {
CurrentToken = FindToken( patternGraphicsDefToken + 1, "multiLayer" );
if( CurrentToken > 0 ) {
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pad" ) {
int SavePosition = CurrentToken;
GeneratePad( SavePosition, 0 );
CurrentToken = SavePosition;
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
dlgMessageBox( "Unexpected keyword in multiLayer " + Tokens[ CurrentToken ], "OK");
return;
}
}
CurrentToken++;
}
}
CurrentToken = patternGraphicsDefToken;
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "layerContents" ) {
int SavePosition = CurrentToken;
GenerateLayerContents( SavePosition, i );
CurrentToken = SavePosition;
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
dlgMessageBox( "Unexpected keyword in layerContents " + Tokens[ CurrentToken ], "OK");
return;
}
}
CurrentToken++;
}
}
}
}
int OneViaShapeCreated;
int ProcessOneViaShape( int Number, int startToken, string holeDiam )
{
int layerNumRefPosition = FindToken( startToken + 1, "layerNumRef" );
if( layerNumRefPosition >= 0 ) {
if( checkLayerType( layerNumRefPosition + 1 ) ) {
int viaShapeTypePosition = FindToken( startToken + 1, "viaShapeType" );
if( viaShapeTypePosition >= 0 ) {
int shapeWidthPosition = FindToken( startToken + 1, "shapeWidth" );
if( shapeWidthPosition >= 0 ) {
string TokenText = Tokens[ shapeWidthPosition + 1 ];
if( Tokens[ shapeWidthPosition + 2 ] != ")" ) {
if( IsASCIIValue( Tokens[ shapeWidthPosition + 2 ] ) ) {
TokenText = TokenText + Tokens[ shapeWidthPosition + 2 ];
}
else {
WriteLog( "#warning: wrong description.\n" );
}
}
string shapeWidth = ConvertUnits( GetNumberValue( TokenText ),
GetUnitValue( TokenText ) );
int shapeHeightPosition = FindToken( startToken + 1, "shapeHeight" );
if( shapeHeightPosition >= 0 ) {
string TokenText = Tokens[ shapeHeightPosition + 1 ];
if( Tokens[ shapeHeightPosition + 2 ] != ")" ) {
if( IsASCIIValue( Tokens[ shapeHeightPosition + 2 ] ) ) {
TokenText = TokenText + Tokens[ shapeHeightPosition + 2 ];
}
else {
WriteLog( "#warning: wrong description.\n" );
}
}
string shapeHeight = ConvertUnits( GetNumberValue( TokenText ),
GetUnitValue( TokenText ) );
if( ( !CheckForNull( shapeWidth ) ) ||
( !CheckForNull( shapeHeight ) ) ) {
printf("# ViaShape: layerNumRef = %s",
Tokens[ layerNumRefPosition + 1 ] );
printf(" viaShapeType = %s",
Tokens[ viaShapeTypePosition + 1 ] );
printf(" shapeWidth = %s", shapeWidth );
printf(" shapeHeight = %s\n", shapeHeight );
if( OneViaShapeCreated == 0 ) {
if( Tokens[ viaShapeTypePosition + 1 ] == "Oval" ) { // Oval
if( shapeWidth == shapeHeight ) {
ViaStyleDefsType[ Number ] = "ROUND";
ViaStyleDefsDiameter[ Number ] = shapeWidth;
OneViaShapeCreated = 1;
ViaStyleDefsSkip[ Number ] = 0;
}
else {
ViaStyleDefsType[ Number ] = "ROUND";
ViaStyleDefsDiameter[ Number ] = shapeWidth;
OneViaShapeCreated = 1;
ViaStyleDefsSkip[ Number ] = 0;
//if( DebugMessage ) {
WriteLog("#warning: ViaShape: oval. Create round via\n");
//}
}
}
else {
if( Tokens[ viaShapeTypePosition + 1 ] == "Rect" ) { // Rectangle
if( shapeWidth == shapeHeight ) {
ViaStyleDefsType[ Number ] = "SQUARE";
ViaStyleDefsDiameter[ Number ] = shapeWidth;
OneViaShapeCreated = 1;
ViaStyleDefsSkip[ Number ] = 0;
}
else {
ViaStyleDefsType[ Number ] = "SQUARE";
ViaStyleDefsDiameter[ Number ] = shapeWidth;
OneViaShapeCreated = 1;
ViaStyleDefsSkip[ Number ] = 0;
//if( DebugMessage ) {
WriteLog("#warning: ViaShape: rectangle. Create square via.\n");
//}
}
}
else {
if( Tokens[ viaShapeTypePosition + 1 ] == "Ellipse" ) { // Ellipse
if( shapeWidth == shapeHeight ) {
ViaStyleDefsType[ Number ] = "ROUND";
ViaStyleDefsDiameter[ Number ] = shapeWidth;
OneViaShapeCreated = 1;
ViaStyleDefsSkip[ Number ] = 0;
}
else {
ViaStyleDefsType[ Number ] = "ROUND";
ViaStyleDefsDiameter[ Number ] = shapeWidth;
OneViaShapeCreated = 1;
ViaStyleDefsSkip[ Number ] = 0;
//if( DebugMessage ) {
WriteLog( "# warning: ViaShape: Ellips with different width and height. Create round via.\n");
//}
}
}
else {
if( Tokens[ viaShapeTypePosition + 1 ] == "MtHole" ) { // MountingHole
//if( DebugMessage ) {
WriteLog("#warning: ViaShape:MtHole \n");
//}
}
else {
if( Tokens[ viaShapeTypePosition + 1 ] == "RndRect" ) { // RoundRectangle
ViaStyleDefsType[ Number ] = "SQUARE";
real width = strtod( shapeWidth );
width = width * ( 1.0 - 0.7 / ROUNDNESS );
string newWidth;
sprintf( newWidth, "%f", width );
ViaStyleDefsDiameter[ Number ] = newWidth;
OneViaShapeCreated = 1;
ViaStyleDefsSkip[ Number ] = 0;
//if( DebugMessage ) {
WriteLog("#warning: ViaShape: RndRect. Create shrinked square via.\n");
//}
}
else {
if( Tokens[ viaShapeTypePosition + 1 ] == "Target" ) { // Make it round
//if( DebugMessage ) {
WriteLog("#warning: ViaShape: Target. Do not supported.\n");
//}
}
else {
string tmp;
sprintf( tmp, "# warning: ViaShape %s not supported yet\n",
Tokens[ viaShapeTypePosition + 1 ] );
WriteLog( tmp );
}
}
}
}
}
}
}
}
else {
if( DebugMessage ) {
printf( "# via's shape skips because of zero width and height.\n");
}
}
}
}
}
}
else {
if( DebugMessage ) {
printf( "# via's shape skips because of layer.\n");
}
}
}
return( 0 );
}
int ProcessViaShapes( int Number, int startToken, string holeDiam )
{
OneViaShapeCreated = 0;
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "viaShape" ) {
int SavePosition = CurrentToken;
ProcessOneViaShape( Number, SavePosition, holeDiam );
CurrentToken = SavePosition;
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
dlgMessageBox( TR("Unexpected keyword in ProcessViaShapes: ") + Tokens[
CurrentToken ], "OK");
return( 1 );
}
}
CurrentToken++;
}
return( 1 );
}
void GenerateOneViaDefinition( int Number, int startToken )
{
printf( "#ViaStyleDef %s\n", Tokens[ startToken ] );
ViaStyleDefsSkip[ Number ] = 1;
int holeDiamPosition = FindToken( startToken + 1, "holeDiam" );
if( holeDiamPosition >= 0 ) {
string holeDiam = Tokens[ holeDiamPosition + 1 ];
if( CheckForNull( holeDiam ) ) {
WriteLog("# warning: zero hole in via\n");
}
if( DebugMessage ) {
printf( "#HoleDiameter = %s\n", holeDiam );
}
ProcessViaShapes( Number, startToken, holeDiam );
if( ViaStyleDefsSkip[ Number ] ) {
if( DebugMessage ) {
printf( "# this ViaDefinition was skipped.\n");
}
}
else {
sprintf( ViaStyleDefsScript[ Number ], "CHANGE DRILL %s;\n%s",
holeDiam, ViaStyleDefsScript[ Number ] );
}
}
else {
if( DebugMessage ) {
printf( "# skips because via has no holeDiam.\n");
}
}
}
void GenerateViaDefinitions( void )
{
for( int i = 0; i < ViaStyleDefsNumber; i++ ) {
int startToken = ViaStyleDefsArray[ i ];
string info;
sprintf( info, TR("Process Via Style definition") + " %d (%d)", i, ViaStyleDefsNumber );
UpdateProgress( info );
GenerateOneViaDefinition( i, startToken );
}
}
string FindSymbolNameByOriginal( string originalSymbolName )
{
for( int i = 0; i < SymbolDefsNumber; i++ ) {
if( originalSymbolName == OriginalSymbolsName[ i ] ) {
return( SymbolsName[ i ] );
}
}
return( "" );
}
int FindSymbolIndexByName( string symbolName )
{
for( int i = 0; i < SymbolDefsNumber; i++ ) {
if( symbolName == SymbolsName[ i ] ) {
return( i );
}
}
return( -1 );
}
int FindPatternDefIndexByName( string patternName, string variantName )
{
for( int i = 0; i < PatternDefExtendedNumber; i++ ) {
if( patternName == PatternName[ i ] ) {
if( variantName == PatternGraphicsDefName[ i ] ) {
return( i );
}
}
}
return( -1 );
}
string FindPatternNameByOrigin( string originalPatternName )
{
for( int i = 0; i < PatternDefExtendedNumber; i++ ) {
if( originalPatternName == PatternOriginalName[ i ] ) {
return( PatternName[ i ] );
}
}
return( "" );
}
string FindPatternDefaultVariantByOrigin( string originalPatternName )
{
for( int i = 0; i < PatternDefExtendedNumber; i++ ) {
if( originalPatternName == PatternOriginalName[ i ] ) {
if( PatternDefaultVariantName[ i ] == PatternGraphicsDefName[ i ] ) {
return( PatternDefaultVariantName[ i ] );
}
}
}
return( "" );
}
string FindSymbolDeviceName( string compName )
{
for( int i = 0; i < NrCompInstances; i++ ) {
if( compName == CompInstancesName[ i ] ) {
return( CompInstancesRef[ i ] );
}
}
return( "" );
}
string FindCompValue( string compName )
{
for( int i = 0; i < NrCompInstances; i++ ) {
if( compName == CompInstancesName[ i ] ) {
return( CompValue[ i ] );
}
}
return( "" );
}
string FindText( int startToken )
{
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
return( ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) ) );
}
CurrentToken++;
}
return( "" );
}
string ConvertPinType( string pinType )
{
if( pinType == "Unknown" ) {
return( "IO" );
} else if( pinType == "Passive" ) {
return( "Pas" );
} else if( pinType == "Input" ) {
return( "In" );
} else if( pinType == "Output" ) {
return( "Out" );
} else if( pinType == "Bidirectional" ) {
return( "IO" );
} else if( pinType == "OpenH" ) {
return( "OC" );
} else if( pinType == "OpenL" ) {
return( "OC" );
} else if( pinType == "PassiveH" ) {
return( "Pas" );
} else if( pinType == "PassiveL" ) {
return( "Pas" );
} else if( pinType == "ThreeState" ) {
return( "Hiz" );
} else if( pinType == "Power" ) {
return( "Pwr" );
}
string tmp;
sprintf( tmp, "# warning: unknown pinType = %s\n", pinType );
WriteLog( tmp );
return( "IO" );
}
int IfFitToSymbolName( int startToken, string OriginalSymbolName )
{
int level = 1;
CurrentToken = startToken;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
level++;
CurrentToken++;
if( Tokens[ CurrentToken ] == "attachedSymbol" ) {
int SavePosition = CurrentToken;
CurrentToken = FindToken( SavePosition + 1, "symbolName" );
if( CurrentToken >= 0 ) {
string OriginalDeviceName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
if( OriginalSymbolName == OriginalDeviceName ) {
return( 1 );
}
}
CurrentToken = SavePosition;
break;
}
else {
SkipThisItem();
level--;
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( 0 );
}
}
}
CurrentToken++;
}
return( 0 );
}
string FindPinDirection( string OriginalSymbolName, string pinNum )
{
for( int i = 0; i < CompDefsNumber; i++ ) {
int startToken = CompDefsArray[ i ];
if( IfFitToSymbolName( startToken, OriginalSymbolName ) ) {
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "compPin" ) {
int SavePosition = CurrentToken;
string currentPinNum = FindText( SavePosition );
if( currentPinNum == pinNum ) {
int tokenPosition = FindToken( SavePosition + 1, "pinType" );
if( tokenPosition >= 0 ) {
string pinType = Tokens[ tokenPosition + 1 ];
string pinTypeEagle = ConvertPinType( pinType );
return( pinTypeEagle );
}
}
CurrentToken = SavePosition;
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
}
}
CurrentToken++;
}
}
}
return( "IO" );
}
string PinNamesTable[];
int NrOfThisPinName[];
int CurrentPinIndex[];
int NrPinNames;
int FindPinName( string pinName )
{
for( int i = 0; i < NrPinNames; i++ ) {
if( PinNamesTable[ i ] == pinName ) {
return( i );
}
}
return( -1 );
}
void FillOnePinName( int startToken )
{
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pinName" ) {
int pinNameToken = CurrentToken + 1;
string pinName = FindText( pinNameToken + 1 );
if( pinName != "" ) {
int index = FindPinName( pinName );
if( index >= 0 ) {
NrOfThisPinName[ index ]++;
}
else {
PinNamesTable[ NrPinNames ] = pinName;
NrOfThisPinName[ NrPinNames ] = 1;
CurrentPinIndex[ NrPinNames ] = 1;
NrPinNames++;
}
}
return;
}
else {
SkipThisItem();
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
}
void FillPinNameTable( int startToken )
{
NrPinNames = 0;
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pin" ) {
int SavePosition = CurrentToken;
FillOnePinName( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
SkipThisItem();
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
}
void GeneratePin( int startToken, string OriginalSymbolName )
{
string pinNum;
string xPointCoord;
string yPointCoord;
string rotation = "0";
string pinLength = "0";
int isPinLength = 0;
string dispPinDes = "True";
int pinDesToken = 0;
string pinDes = "";
string pinVisibility = "Off";
int pinNameToken = 0;
string defaultPinDes;
string insideStyle;
int isFlipped = 0;
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
xPointCoord = Tokens[ CurrentToken + 1 ];
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xPointCoord = xPointCoord + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yPointCoord = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yPointCoord = yPointCoord + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yPointCoord = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yPointCoord = yPointCoord + Tokens[ CurrentToken + 3 ];
}
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pinNum" ) {
pinNum = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "rotation" ) {
rotation = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pinLength" ) {
pinLength = Tokens[ CurrentToken + 1 ];
isPinLength = 1;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pinDisplay" ) {
if( Tokens[ CurrentToken + 2 ] == "dispPinDes" ) {
dispPinDes = Tokens[ CurrentToken + 3 ];
}
if( Tokens[ CurrentToken + 2 ] == "dispPinName" ) {
if( ( Tokens[ CurrentToken + 3 ] == "True" ) || ( Tokens[ CurrentToken + 3 ] == "true" ) ) {
pinVisibility = "";
}
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pinDes" ) {
int SavePosition = CurrentToken;
pinDesToken = SavePosition + 1;
pinDes = FindText( SavePosition + 2 );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pinName" ) {
pinNameToken = CurrentToken + 1;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "defaultPinDes" ) {
defaultPinDes = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "insideStyle" ) {
insideStyle = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isFlipped" ) {
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
isFlipped = 1;
}
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GeneratePin ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
}
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
if( pinDesToken ) {
if( dispPinDes == "True" ) {
IfPinText = 1;
GenerateOneText( pinDesToken + 1 );
IfPinText = 0;
}
}
/*if( pinNameToken ) {
GenerateOneText( pinNameToken + 1 );
}*/
real pinLengthValue = strtod( GetNumberValue( pinLength ) );
real rotationValue = strtod( GetNumberValue( rotation ) );
real pinX = strtod( ConvertUnits( GetNumberValue( xPointCoord ), GetUnitValue( xPointCoord ) ) );
real pinY = strtod( ConvertUnits( GetNumberValue( yPointCoord ), GetUnitValue( yPointCoord ) ) );
if( !pinLengthValue ) {
printf( "CHANGE LENGTH POINT;\n");
} else if( pinLengthValue == 100 ) {
printf( "CHANGE LENGTH SHORT;\n");
} else if( pinLengthValue == 200 ) {
printf( "CHANGE LENGTH MIDDLE;\n");
} else if ( pinLengthValue == 300) {
printf( "CHANGE LENGTH LONG;\n");
}
if( !isPinLength ) {
printf( "CHANGE LENGTH LONG;\n");
pinLengthValue = 300;
}
if( rotationValue >= 270 ) {
pinY -= pinLengthValue;
}
else if( rotationValue >= 180 ) {
pinX -= pinLengthValue;
}
else if( rotationValue >= 90 ) {
pinY += pinLengthValue;
}
else {
pinX += pinLengthValue;
}
string mirrored = "";
// Mirrored (flipped) is not use here because it supported by above code
/*if( isFlipped ) {
mirrored = "M";
}*/
/*if( isFlipped ) {
if( rotationValue >= 270 ) {
pinY = pinY - 2 * pinLengthValue;
}
else if( rotationValue >= 180 ) {
pinX = pinX - 2 * pinLengthValue;
}
else if( rotationValue >= 90 ) {
pinY = pinY + 2 * pinLengthValue;
}
else {
pinX = pinX - 2 * pinLengthValue;
}
}*/
string pinDirection = FindPinDirection( OriginalSymbolName, pinDes );
string pinName = FindText( pinNameToken + 1 );
if( pinName != "" ) {
int index = FindPinName( pinName );
if( index >= 0 ) {
if( NrOfThisPinName[ index ] > 1 ) {
sprintf( pinName, "%s@%d", pinName, CurrentPinIndex[ index ] );
CurrentPinIndex[ index ]++;
}
}
else {
string tmp;
sprintf( tmp, "# warning: can't find pin %s in table\n", pinName );
WriteLog( tmp );
}
if( pinName[ 0 ] == '~' ) {
pinName[ 0 ] = '!';
}
printf( "PIN '%s' %s %sR%f %s (%f %f);\n", pinName, pinDirection, mirrored, rotationValue + 180.0,
pinVisibility, pinX, pinY );
}
else {
printf( "PIN %s %sR%f %s (%f %f);\n", pinDirection, mirrored, rotationValue + 180.0,
pinVisibility, pinX, pinY );
}
}
void GenerateSymbols( void )
{
printf("# Symbols:\n");
for( int i = 0; i < SymbolDefsNumber; i++ ) {
int startToken = SymbolDefsArray[ i ];
string info;
sprintf( info, "Process symbol %d (%d)", i, SymbolDefsNumber + 1 );
UpdateProgress( info );
string SymbolName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
Tokens[ startToken ] )
);
string OriginalSymbolName = GetOriginalDeviceName( startToken + 1 );
SymbolsName[ i ] = SymbolName;
OriginalSymbolsName[ i ] = OriginalSymbolName;
printf("#\n");
printf("# Symbol: %s OriginalName = %s\n", SymbolName, OriginalSymbolName );
printf("EDIT '%s.SYM';\n", SymbolName );
printf("DESCRIPTION 'Original name <b>%s</b><p>';\n", OriginalSymbolName );
printf("GRID %s;\n", FileUnits );
printf("CHANGE FONT VECTOR;\n");
FillPinNameTable( startToken );
printf( "CHANGE LAYER 94;\n" );
IfNameDefinedInSymbol[ i ] = 0;
IfValueDefinedInSymbol[ i ] = 0;
SymbolAttributesIndex[ i ] = NrAttributes;
SymbolNrAttributes[ i ] = 0;
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "originalName" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pin" ) {
int SavePosition = CurrentToken;
GeneratePin( SavePosition, OriginalSymbolName );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "line" ) {
int SavePosition = CurrentToken;
GenerateOneLine( SavePosition, 0, 0 );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "attr" ) {
int SavePosition = CurrentToken;
GenerateNameAndValueSchematics( SavePosition, i );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "poly" ) {
int SavePosition = CurrentToken;
GenerateOnePcbPoly( SavePosition, 0, DEFAULT_WIRE_WIDTH_BOARD );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "text" ) {
int SavePosition = CurrentToken;
IfPinText = 1;
GenerateOneText( SavePosition );
IfPinText = 0;
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "triplePointArc" ) {
int SavePosition = CurrentToken;
GenerateOneTripleArc( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "arc" ) {
int SavePosition = CurrentToken;
GenerateOneArc( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GenerateSymbols ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
}
}
int FindAttributeByNameInSymbol( int symbolIndex, string attributeName )
{
for( int i = SymbolAttributesIndex[ symbolIndex ]; i < SymbolNrAttributes[ symbolIndex ]; i++ ) {
if( attributeName == AttributesName[ i ] ) {
return( AttributesIndex[ i ] );
}
}
return( -1 );
}
int FindAttributeByNameInPattern( int patternIndex, string attributeName )
{
for( int i = PatternAttributesIndex[ patternIndex ]; i < PatternNrAttributes[ patternIndex ]; i++ ) {
if( attributeName == AttributesName[ i ] ) {
return( AttributesIndex[ i ] );
}
}
return( -1 );
}
void AddOneAttributes( int ifSymbol, int symbolIndex, string elemName, string attributeName, string attributeValue, int startToken, string xCoord, string yCoord )
{
string xCoordText = "0.0";
string yCoordText = "0.0";
string rotation = "0";
string isVisible = "False";
string textStyleRef = "";
string justify = "";
int isFlipped = 0;
if( symbolIndex >= 0 ) {
int attrIndex;
if( ifSymbol ) {
attrIndex = FindAttributeByNameInSymbol( symbolIndex, attributeName );
}
else {
attrIndex = FindAttributeByNameInPattern( symbolIndex, attributeName );
}
//printf("# index attr name = %s\n", attributeName );
if( attrIndex >= 0 ) {
//printf("# attr name = %s\n", Tokens[ attrIndex + 1 ] );
CurrentToken = attrIndex + 3;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "rotation" ) {
rotation = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isVisible" ) {
isVisible = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
textStyleRef = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isFlipped" ) {
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
isFlipped = 1;
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "justify" ) {
justify = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
SkipThisItem();
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
}
}
CurrentToken = startToken;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
xCoordText = Tokens[ CurrentToken + 1 ];
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xCoordText = xCoordText + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoordText = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yCoordText = yCoordText + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoordText = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoordText = yCoordText + Tokens[ CurrentToken + 3 ];
}
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "rotation" ) {
rotation = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isVisible" ) {
isVisible = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
textStyleRef = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isFlipped" ) {
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
isFlipped = 1;
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "justify" ) {
justify = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
SkipThisItem();
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
real newXCoord = strtod( ConvertUnits( GetNumberValue( xCoord ), GetUnitValue( xCoord ) ) ) +
strtod( ConvertUnits( GetNumberValue( xCoordText ), GetUnitValue( xCoordText ) ) );
real newYCoord = strtod( ConvertUnits( GetNumberValue( yCoord ), GetUnitValue( yCoord ) ) ) +
strtod( ConvertUnits( GetNumberValue( yCoordText ), GetUnitValue( yCoordText ) ) );
string mirrored = "";
if( isFlipped ) {
mirrored = "M";
}
if( attributeValue == "" ) {
attributeValue = "''";
}
else {
attributeValue = ReplaceNotSupportedCharactersText( attributeValue );
}
if( isVisible != "True" ) {
if( elemName != "" ) {
printf( "CHANGE DISPLAY OFF;\n" );
}
}
else {
if( elemName != "" ) {
printf( "CHANGE DISPLAY VALUE;\n" );
}
}
if( justify == "" ) { //LowerLeft
printf("CHANGE ALIGN BOTTOM LEFT;\n");
} else if( justify == "UpperLeft" ) {
printf("CHANGE ALIGN TOP LEFT;\n");
} else if( justify == "UpperCenter" ) {
printf("CHANGE ALIGN TOP CENTER;\n");
} else if( justify == "UpperRight" ) {
printf("CHANGE ALIGN TOP RIGHT;\n");
} else if( justify == "Left" ) {
printf("CHANGE ALIGN CENTER LEFT;\n");
} else if( justify == "Center" ) {
printf("CHANGE ALIGN CENTER CENTER;\n");
} else if( justify == "Right" ) {
printf("CHANGE ALIGN CENTER RIGHT;\n");
} else if( justify == "LowerLeft" ) {
printf("CHANGE ALIGN BOTTOM LEFT;\n");
} else if( justify == "LowerCenter" ) {
printf("CHANGE ALIGN BOTTOM CENTER;\n");
} else if( justify == "LowerRight" ) {
printf("CHANGE ALIGN BOTTOM RIGHT;\n");
}
else {
printf("# warning: unknown justify parameter value = %s\n", justify );
printf("CHANGE ALIGN BOTTOM LEFT;\n");
}
int textStyleDefPos = FindTextStyleDef( textStyleRef );
if( textStyleDefPos >= 0 ) {
real fontHeight = strtod( ConvertUnits( GetNumberValue( TextStyleDefFontHeight[ textStyleDefPos ] ), GetUnitValue( TextStyleDefFontHeight[ textStyleDefPos ] ) ) );
real fontWidth = strtod( ConvertUnits( GetNumberValue( TextStyleDefFontStrokeWidth[ textStyleDefPos ] ), GetUnitValue( TextStyleDefFontStrokeWidth[ textStyleDefPos ] ) ) );
printf("CHANGE SIZE %s;\n", TextStyleDefFontHeight[ textStyleDefPos ] );
if( fontHeight ) {
int ratio = round( 100.0 * fontWidth / fontHeight );
if( ratio > 31.0 ) {
ratio = 31.0;
}
printf("CHANGE RATIO %d;\n", ratio );
}
}
if( elemName != "" ) {
printf( "ATTRIBUTE '%s' '%s' '%s' %sSR%s (%f %f);\n", elemName, attributeName, attributeValue, mirrored, rotation, newXCoord, newYCoord );
}
else {
printf( "ATTRIBUTE '%s' '%s';\n", attributeName, attributeValue );
}
}
void AddAttributes( int ifSymbol, int symbolIndex, string elemName, int patternGraphicsRef, string xCoord, string yCoord )
{
CurrentToken = patternGraphicsRef + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "attr" ) {
string attrName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
if( attrName == "Name" ) {
attrName = "Name_";
}
if( ( strlwr( attrName ) != "value" ) && ( strlwr( attrName ) != "name" ) && ( strlwr( attrName ) != "refdes" ) ) {
int SavePosition = CurrentToken;
AddOneAttributes( ifSymbol, symbolIndex, elemName, attrName, ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 2 ] ) ),
CurrentToken, xCoord, yCoord );
CurrentToken = SavePosition;
}
SkipThisItem();
}
else {
SkipThisItem();
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
}
string FindPinNameByPinRef( int startToken, string pinRef )
{
int CurrentToken = startToken + 1;
int level = 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
level++;
if( Tokens[ CurrentToken ] == "compPin" ) {
int SavePosition = CurrentToken;
string currentPinRef = FindText( SavePosition );
if( currentPinRef == pinRef ) {
int tokenPosition = FindToken( SavePosition + 1, "pinName" );
if( tokenPosition >= 0 ) {
string pinName = Tokens[ tokenPosition + 1 ];
return( pinName );
}
}
CurrentToken = SavePosition;
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
level--;
if( level == 0 ) {
return( "" );
}
}
}
CurrentToken++;
}
return( "" );
}
string DevicePinNamesTable[];
string DevicePadNamesTable[];
int CurrentDevicePinCount[];
int NrOfDevicePadNames;
void GenerateDevices( void )
{
printf("# Devices:\n");
for( int i = 0; i < CompDefsNumber; i++ ) {
int startToken = CompDefsArray[ i ];
string DeviceName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
Tokens[ startToken ] )
);
string OriginalDeviceName = GetOriginalDeviceName( startToken + 1 );
printf("#\n");
printf("# Device: %s OriginalName = %s\n", DeviceName, OriginalDeviceName );
printf("EDIT '%s.DEV';\n", DeviceName );
printf("GRID %s;\n", FileUnits );
//AddAttributes( 0, -1, "", startToken, "0.0", "0.0" );
int packageExists = 0;
int attachedPatternToken = FindToken( startToken + 1, "attachedPattern" );
if( attachedPatternToken > 0 ) {
CurrentToken = FindToken( attachedPatternToken + 1, "patternName" );
if( CurrentToken >= 0 ) {
string originPatternName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
string patternName = FindPatternNameByOrigin( originPatternName );
if( patternName != "" ) {
string patternDefaultVariant = FindPatternDefaultVariantByOrigin( originPatternName );
printf( "PACKAGE '%s%s';\n", patternName, patternDefaultVariant );
packageExists = 1;
CurrentToken = FindToken( attachedPatternToken + 1, "padPinMap" );
if( CurrentToken > 0 ) {
PadPinMapRef[ i ] = NrPadPinMap;
PadPinMapCount[ i ] = 0;
CurrentToken++;
while( Tokens[ CurrentToken ] != ")" ) {
PadPinMapNum[ NrPadPinMap ] = Tokens[ CurrentToken + 2 ];
PadPinMapPinRef[ NrPadPinMap ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 6 ] ) );
//printf( "# PadMap: num = %s ref = %s\n", PadPinMapNum[ NrPadPinMap ], PadPinMapPinRef[ NrPadPinMap ] );
NrPadPinMap++;
PadPinMapCount[ i ]++;
CurrentToken = CurrentToken + 8;
}
}
}
else {
string tmp;
sprintf( tmp, "# warning: no package exists for attachedPattern in device %s \n", DeviceName );
WriteLog( tmp );
}
}
else {
string tmp;
sprintf( tmp, "# warning: no pattern name in device %s \n", DeviceName );
WriteLog( tmp );
}
}
else {
string tmp;
sprintf( tmp, "# warning: no package for device %s \n", DeviceName );
WriteLog( tmp );
}
if( !packageExists ) {
printf("ATTRIBUTE '_EXTERNAL_';\n");
}
int symbolNum = 0;
int symbolExists = 0;
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "attachedSymbol" ) {
int SavePosition = CurrentToken;
CurrentToken = FindToken( SavePosition + 1, "symbolName" );
if( CurrentToken > 0 ) {
string symbolName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
string symbolNameByOriginal = FindSymbolNameByOriginal( symbolName );
string partNum = "";
int partNumPosition = FindToken( SavePosition + 1, "partNum" );
if( partNumPosition >= 0 ) {
partNum = Tokens[ partNumPosition + 1 ];
}
if( symbolNameByOriginal != "" ) {
symbolExists = 1;
printf( "ADD '%s' 'G%s'(%.8f%s %.8f%s);\n", symbolNameByOriginal, partNum,
0.0, FileUnits, symbolNum * -100.0, FileUnits );
DevicesName[ NrSymbolDevices ] = DeviceName;
SymbolDevicesName[ NrSymbolDevices ] = symbolNameByOriginal;
NrSymbolDevices++;
symbolNum++;
}
else {
string tmp;
sprintf( tmp, "# warning: no SymbolNameByOriginal was found for symbol %s\n", symbolName );
WriteLog( tmp );
}
}
else {
string tmp;
sprintf( tmp, "# warning: no symbol name in device %s\n", DeviceName );
WriteLog( tmp );
}
CurrentToken = SavePosition;
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
dlgMessageBox( "Unexpected keyword in GenerateDevices " + Tokens[ CurrentToken ], "OK");
return;
}
}
CurrentToken++;
}
// Prefix
int compHeaderToken = FindToken( startToken + 1, "compHeader" );
if( compHeaderToken > 0 ) {
int prefixToken = FindToken( compHeaderToken + 1, "refDesPrefix" );
if( prefixToken > 0 ) {
printf("PREFIX '%s';\n", RemoveDoubleQuotas( Tokens[ prefixToken + 1 ]));
}
}
// Make connections between pins and pads
if( packageExists && symbolExists ) {
NrOfDevicePadNames = 0;
for( int j = PadPinMapRef[ i ]; j < PadPinMapRef[ i ] + PadPinMapCount[ i ]; j++ ) {
string PinName = RemoveDoubleQuotas(FindPinNameByPinRef( startToken, PadPinMapPinRef[ j ]));
if( PinName != "" ) {
DevicePinNamesTable[NrOfDevicePadNames] = PinName;
DevicePadNamesTable[NrOfDevicePadNames] = PadPinMapNum[ j ];
CurrentDevicePinCount[NrOfDevicePadNames] = 0;
NrOfDevicePadNames++;
}
}
for( j = 0; j < NrOfDevicePadNames; j++ ) {
if( CurrentDevicePinCount[ j ] == 0 ) {
int Count = 0;
for( int k = j; k < NrOfDevicePadNames; k++ ) {
if( DevicePinNamesTable[ j ] == DevicePinNamesTable[ k ]) {
Count++;
}
}
if( Count > 1) {
int m = 1;
for( int k = j; k < NrOfDevicePadNames; k++ ) {
if( DevicePinNamesTable[ j ] == DevicePinNamesTable[ k ]) {
CurrentDevicePinCount[ k ] = m;
m++;
}
}
}
}
}
for( j = 0; j < NrOfDevicePadNames; j++ ) {
if( CurrentDevicePinCount[ j ] == 0 ) {
printf("CONNECT '%s' '%s';\n", DevicePinNamesTable[ j ], DevicePadNamesTable[ j ]);
}
else {
printf("CONNECT '%s@%d' '%s';\n", DevicePinNamesTable[ j ], CurrentDevicePinCount[ j ], DevicePadNamesTable[ j ]);
}
}
}
}
}
int FindDummyDeviceName( string DeviceName )
{
for( int i = 0; i < NrDummyDevices; i++ ) {
if( DummyDevices[ i ] == DeviceName ) {
return( 1 );
}
}
return( 0 );
}
void GenerateDummyDevices( void )
{
NrDummyDevices = 0;
printf("# Dummy devices: %d\n", NrPadsOnBoard );
for( int i = 0; i < NrPadsOnBoard; i++ ) {
int startToken = PadOnBoardIndex[ i ];
int padStyleRefPosition = FindToken( startToken + 1, "padStyleRef" );
if( padStyleRefPosition >= 0 ) {
string DeviceName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
Tokens[ padStyleRefPosition + 1 ] )
);
PadOnBoardDefs[ i ] = DeviceName;
if( FindDummyDeviceName( DeviceName ) == 0 ) {
DummyDevices[ NrDummyDevices ] = DeviceName;
NrDummyDevices++;
printf("#\n");
printf("# Dummy package: %s\n", DeviceName );
printf("EDIT '%s.PAC';\n", DeviceName );
printf("GRID %s;\n", FileUnits );
GeneratePad( startToken, 1 );
printf("#\n");
printf("# Device: %s\n", DeviceName );
printf("EDIT '%s.DEV';\n", DeviceName );
printf("GRID %s;\n", FileUnits );
printf("ATTRIBUTE '_EXTERNAL_';\n");
}
}
else {
WriteLog("# warning: can't find padStyleRef in dummy device.\n");
}
}
}
// Generate library from 'library' keyword
void GenerateLibrary( void )
{
GenerateLibraryHeader();
GeneratePadDefinitions();
GenerateViaDefinitions();
GeneratePackages();
GenerateSymbols();
GenerateDevices();
GenerateDummyDevices();
printf("WRITE;\n");
printf("CLOSE;\n");
}
void GeneratePCBHeader( void )
{
string libraryName;
printf("# ***** Board *****\n");
string eagleFileName;
string array[];
sprintf( eagleFileName, "%s.brd", PCADfileName);
if( fileglob( array, eagleFileName ) ) {
printf("SET CONFIRM YES;\n");
printf("REMOVE '%s';\n", eagleFileName );
printf("SET CONFIRM OFF;\n");
}
printf("EDIT '%s';\n", eagleFileName );
printf("DRC LOAD '%s';\n", DRUFileName );
printf("SET WIRE_BEND 2;\n");
libraryName = filesetext( PCADfileName, ".lbr");
printf("USE -* '%s';\n", libraryName);
printf("GRID %s;\n", FileUnits );
printf("SET OPTIMIZING ON;\n");
printf("SET CONFIRM YES;\n");
printf("CHANGE FONT VECTOR;\n");
}
// This function generates one via
void GenerateVia( int startToken )
{
int tokenPosition = FindToken( startToken + 1, "viaStyleRef" );
if( tokenPosition >= 0 ) {
printf("#viaStyleRef = %s\n", Tokens[ tokenPosition + 1 ] );
string info;
sprintf( info, "Process via %d %s", tokenPosition, Tokens[ tokenPosition + 1 ] );
UpdateProgress( info );
int ViaStyleDefNum = FindViaStyleDef( Tokens[ tokenPosition + 1 ] );
if( ViaStyleDefNum >= 0 ) {
if( ViaStyleDefsSkip[ ViaStyleDefNum ] == 0 ) {
printf( "%s", ViaStyleDefsScript[ ViaStyleDefNum ] );
int viaNetPosition = FindToken( startToken + 1, "netNameRef" );
int ifSignalName = 0;
if( viaNetPosition >= 0 ) {
ifSignalName = 1;
}
int viaCoordPosition = FindToken( startToken + 1, "pt" );
if( viaCoordPosition >= 0 ) {
string xCoordVia = "";
string yCoordVia = "";
xCoordVia = Tokens[ viaCoordPosition + 1 ];
if( IsASCIIValue( Tokens[ viaCoordPosition + 2 ] ) ) {
xCoordVia = xCoordVia + Tokens[ viaCoordPosition + 2 ];
if( Tokens[ viaCoordPosition + 3 ] != ")" ) {
yCoordVia = Tokens[ viaCoordPosition + 3 ];
if( Tokens[ viaCoordPosition + 4 ] != ")" ) {
yCoordVia = yCoordVia + Tokens[ viaCoordPosition + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoordVia = Tokens[ viaCoordPosition + 2 ];
if( Tokens[ viaCoordPosition + 3 ] != ")" ) {
yCoordVia = yCoordVia + Tokens[ viaCoordPosition + 3 ];
}
}
string Val1 = ConvertUnits( GetNumberValue( xCoordVia ),
GetUnitValue( xCoordVia ) );
string Val2 = ConvertUnits( GetNumberValue( yCoordVia ),
GetUnitValue( yCoordVia ) );
if( ifSignalName ) {
printf( "VIA '%s' %s %s (%s %s);\n",
ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ viaNetPosition + 1 ] ) ),
ViaStyleDefsDiameter[ ViaStyleDefNum ],
ViaStyleDefsType[ ViaStyleDefNum ],
Val1, Val2 );
}
else {
printf( "VIA %s %s (%s %s);\n",
ViaStyleDefsDiameter[ ViaStyleDefNum ],
ViaStyleDefsType[ ViaStyleDefNum ],
Val1, Val2 );
}
}
else {
string tmp;
sprintf( tmp, "#WARNING: Can't find pt for via %s\n",
Tokens[ startToken + 3 ] );
WriteLog( tmp );
}
}
else {
if( DebugMessage ) {
printf("#skip this via\n");
}
}
}
else {
string tmp;
sprintf( tmp, "#WARNING: Can't find viaStyleDef for via %s\n",
Tokens[ startToken + 3 ] );
WriteLog( tmp );
}
}
else {
string tmp;
sprintf( tmp, "#WARNING: Can't find viaStyleRef for via %s\n",
Tokens[ startToken + 3 ] );
WriteLog( tmp );
}
}
int IfNameChanged = 0;
int IfValueChanged = 0;
void ChangeOneNameAndValue( string elemName, string attributeName, int startToken, string xCoord, string yCoord, string pureRotation )
{
string xCoordText = "0.0";
string yCoordText = "0.0";
string rotation = "0";
string isVisible = "False";
string textStyleRef = "";
string justify = "";
int isFlipped = 0;
CurrentToken = startToken;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
xCoordText = Tokens[ CurrentToken + 1 ];
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xCoordText = xCoordText + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoordText = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yCoordText = yCoordText + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoordText = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoordText = yCoordText + Tokens[ CurrentToken + 3 ];
}
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "rotation" ) {
rotation = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isVisible" ) {
isVisible = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
textStyleRef = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isFlipped" ) {
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
isFlipped = 1;
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "justify" ) {
justify = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
SkipThisItem();
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
real newXCoord = strtod( ConvertUnits( GetNumberValue( xCoord ), GetUnitValue( xCoord ) ) ) +
strtod( ConvertUnits( GetNumberValue( xCoordText ), GetUnitValue( xCoordText ) ) );
real newYCoord = strtod( ConvertUnits( GetNumberValue( yCoord ), GetUnitValue( yCoord ) ) ) +
strtod( ConvertUnits( GetNumberValue( yCoordText ), GetUnitValue( yCoordText ) ) );
printf( "MOVE '%s>%s' (%f %f);\n", elemName, attributeName, newXCoord, newYCoord );
real finalRotation = strtod( pureRotation );
string mirrored = "";
if( isFlipped ) {
mirrored = "M";
}
printf( "ROTATE =S%sR%s '%s>%s';\n", mirrored, rotation, elemName, attributeName );
if( justify == "" ) { //LowerLeft
printf("CHANGE ALIGN BOTTOM LEFT;\n");
} else if( justify == "UpperLeft" ) {
printf("CHANGE ALIGN TOP LEFT;\n");
} else if( justify == "UpperCenter" ) {
printf("CHANGE ALIGN TOP CENTER;\n");
} else if( justify == "UpperRight" ) {
printf("CHANGE ALIGN TOP RIGHT;\n");
} else if( justify == "Left" ) {
printf("CHANGE ALIGN CENTER LEFT;\n");
} else if( justify == "Center" ) {
printf("CHANGE ALIGN CENTER CENTER;\n");
} else if( justify == "Right" ) {
printf("CHANGE ALIGN CENTER RIGHT;\n");
} else if( justify == "LowerLeft" ) {
printf("CHANGE ALIGN BOTTOM LEFT;\n");
} else if( justify == "LowerCenter" ) {
printf("CHANGE ALIGN BOTTOM CENTER;\n");
} else if( justify == "LowerRight" ) {
printf("CHANGE ALIGN BOTTOM RIGHT;\n");
}
else {
string tmp;
sprintf( tmp, "# warning: unknown justify parameter value = %s\n", justify );
WriteLog( tmp );
printf("CHANGE ALIGN BOTTOM LEFT;\n");
}
int textStyleDefPos = FindTextStyleDef( textStyleRef );
if( textStyleDefPos >= 0 ) {
real fontHeight = strtod( ConvertUnits( GetNumberValue( TextStyleDefFontHeight[ textStyleDefPos ] ), GetUnitValue( TextStyleDefFontHeight[ textStyleDefPos ] ) ) );
real fontWidth = strtod( ConvertUnits( GetNumberValue( TextStyleDefFontStrokeWidth[ textStyleDefPos ] ), GetUnitValue( TextStyleDefFontStrokeWidth[ textStyleDefPos ] ) ) );
printf("CHANGE SIZE %s (%f %f);\n", TextStyleDefFontHeight[ textStyleDefPos ], newXCoord, newYCoord );
if( fontHeight ) {
int ratio = round( 100.0 * fontWidth / fontHeight );
if( ratio > 31.0 ) {
ratio = 31.0;
}
printf("CHANGE RATIO %d (%f %f);\n", ratio, newXCoord, newYCoord );
}
}
if( isVisible != "True" ) {
printf( "CHANGE DISPLAY OFF (%f %f);\n", newXCoord, newYCoord );
}
else {
printf( "CHANGE DISPLAY VALUE (%f %f);\n", newXCoord, newYCoord );
}
}
void ChangeNameAndValuePosition( string elemName, int patternGraphicsRef, string xCoord, string yCoord, string pureRotation )
{
//printf("SMASH '%s';\n", elemName );
CurrentToken = patternGraphicsRef + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "attr" ) {
if( Tokens[ CurrentToken + 1 ] == "\"RefDes\"" ) {
int SavePosition = CurrentToken;
ChangeOneNameAndValue( elemName, "NAME", CurrentToken + 3, xCoord, yCoord, pureRotation );
IfNameChanged = 1;
CurrentToken = SavePosition;
}
if( Tokens[ CurrentToken + 1 ] == "\"Value\"" ) {
int SavePosition = CurrentToken;
ChangeOneNameAndValue( elemName, "VALUE", CurrentToken + 3, xCoord, yCoord, pureRotation );
IfValueChanged = 1;
CurrentToken = SavePosition;
}
SkipThisItem();
}
else {
SkipThisItem();
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
}
int FindPatternGraphisRef( int startToken )
{
int patternGraphicsNameRefToken = FindToken( startToken + 1, "patternGraphicsNameRef" );
if( patternGraphicsNameRefToken >= 0 ) {
string patternGraphicsNameRef = RemoveDoubleQuotas( Tokens[ patternGraphicsNameRefToken + 1 ] );
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "patternGraphicsRef" ) {
int SavePosition = CurrentToken;
int nameRefToken = FindToken( CurrentToken + 1, "patternGraphicsNameRef" );
CurrentToken = SavePosition;
if( nameRefToken >= 0 ) {
string name = RemoveDoubleQuotas( Tokens[ nameRefToken + 1 ] );
if( name == patternGraphicsNameRef ) {
return( SavePosition );
}
}
SkipThisItem();
}
else {
SkipThisItem();
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
return( -1 );
}
}
CurrentToken++;
}
}
return( FindToken( startToken + 1, "patternGraphicsRef" ) );
}
// This function generates one component
void GeneratePattern( int startToken )
{
int patternRefPosition = FindToken( startToken + 1, "patternRef" );
if( patternRefPosition >= 0 ) {
printf("#patternRef = %s\n", Tokens[ patternRefPosition + 1 ] );
string info;
sprintf( info, "Process pattern %d %s", patternRefPosition, Tokens[ patternRefPosition + 1 ] );
UpdateProgress( info );
int refDesRefPosition = FindToken( startToken + 1, "refDesRef" );
if( refDesRefPosition >= 0 ) {
string RotationMirrored = "";
int mirrored = FindToken( startToken + 1, "isFlipped" );
if( mirrored >= 0 ) {
if( ( Tokens[ mirrored + 1 ] == "True" ) || ( Tokens[ mirrored + 1 ] == "true" ) ) {
RotationMirrored = "M";
}
}
int rotationPosition = FindToken( startToken + 1, "rotation" );
string pureRotation = "0.0";
if( rotationPosition >= 0 ) {
pureRotation = Tokens[ rotationPosition + 1 ];
RotationMirrored = RotationMirrored + "R" + Tokens[ rotationPosition + 1 ];
}
else {
RotationMirrored = RotationMirrored + "R0";
}
int patternPosition = FindToken( startToken + 1, "pt" );
if( patternPosition >= 0 ) {
string xCoordPattern = "";
string yCoordPattern = "";
xCoordPattern = Tokens[ patternPosition + 1 ];
if( IsASCIIValue( Tokens[ patternPosition + 2 ] ) ) {
xCoordPattern = xCoordPattern + Tokens[ patternPosition + 2 ];
if( Tokens[ patternPosition + 3 ] != ")" ) {
yCoordPattern = Tokens[ patternPosition + 3 ];
if( Tokens[ patternPosition + 4 ] != ")" ) {
yCoordPattern = yCoordPattern + Tokens[ patternPosition + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoordPattern = Tokens[ patternPosition + 2 ];
if( Tokens[ patternPosition + 3 ] != ")" ) {
yCoordPattern = yCoordPattern + Tokens[ patternPosition + 3 ];
}
}
string Val1 = ConvertUnits( GetNumberValue( xCoordPattern ),
GetUnitValue( xCoordPattern ) );
string Val2 = ConvertUnits( GetNumberValue( yCoordPattern ),
GetUnitValue( yCoordPattern ) );
string patternDefName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ patternRefPosition + 1 ] ) );
string elemName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ refDesRefPosition + 1 ] ) );
int patternGraphicsNameRefToken = FindToken( startToken + 1, "patternGraphicsNameRef" );
string variantName = "";
if( patternGraphicsNameRefToken >= 0 ) {
variantName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ patternGraphicsNameRefToken + 1 ] ) );
}
if( RotationMirrored != "" ) {
printf( "ADD '%s%s' '%s' %s (%s %s);\n",
patternDefName,
variantName,
elemName,
RotationMirrored,
Val1, Val2 );
}
else {
printf( "ADD '%s%s' '%s' (%s %s);\n",
patternDefName,
variantName,
elemName,
Val1, Val2 );
}
string value = FindCompValue( elemName );
if( value != "" ) {
printf( "VALUE '%s' '%s';\n", elemName, value );
}
int patternGraphicsRef = FindPatternGraphisRef( startToken );
if( patternGraphicsRef >= 0 ) {
int SavePosition = CurrentToken;
int index = FindPatternDefIndexByName( patternDefName, variantName );
AddAttributes( 0, index, elemName, patternGraphicsRef, Val1, Val2 );
CurrentToken = SavePosition;
printf("SMASH '%s';\n", elemName );
IfNameChanged = 0;
IfValueChanged = 0;
ChangeNameAndValuePosition( elemName, patternGraphicsRef, Val1, Val2, pureRotation );
if( index >= 0 ) {
if( IfNameDefinedInPattern[ index ] ) {
if( !IfNameChanged ) {
printf( "DELETE '%s>NAME';\n", elemName );
}
}
if( IfValueDefinedInPattern[ index ] ) {
if( !IfValueChanged ) {
printf( "DELETE '%s>VALUE';\n", elemName );
}
}
}
else {
string tmp;
sprintf( tmp, "# warning: can't find index for pattern %s\n", patternDefName );
WriteLog( tmp );
}
CurrentToken = SavePosition;
}
else {
int SavePosition = CurrentToken;
int index = FindPatternDefIndexByName( patternDefName, "" );
AddAttributes( 0, index, elemName, startToken, Val1, Val2 );
CurrentToken = SavePosition;
printf("SMASH '%s';\n", elemName );
ChangeNameAndValuePosition( elemName, startToken, Val1, Val2, pureRotation );
if( index >= 0 ) {
if( IfNameDefinedInPattern[ index ] ) {
if( !IfNameChanged ) {
printf( "DELETE '%s>NAME';\n", elemName );
}
}
if( IfValueDefinedInPattern[ index ] ) {
if( !IfValueChanged ) {
printf( "DELETE '%s>VALUE';\n", elemName );
}
}
}
else {
string tmp;
sprintf( tmp, "# warning: can't find index for pattern %s\n", patternDefName );
WriteLog( tmp );
}
CurrentToken = SavePosition;
}
}
else {
string tmp;
sprintf( tmp, "#warning: Can't find pattern coordinates %s\n",
Tokens[ patternRefPosition + 1 ] );
WriteLog( tmp );
}
}
else {
WriteLog("#warning: can't find pattern design name\n");
}
}
else {
WriteLog("#warning: Can't find pattern reference.\n");
}
}
string FindNodePadName( string nodeElementName, string nodePadName )
{
string compDefName = FindSymbolDeviceName( nodeElementName );
if( compDefName != "" ) {
for( int i = 0; i < CompDefsNumber; i++ ) {
int startToken = CompDefsArray[ i ];
string DeviceName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
Tokens[ startToken ] )
);
if( DeviceName == compDefName ) {
int padMapIndex = PadPinMapRef[ i ];
for( int j = 0; j < PadPinMapCount[ i ]; j++ ) {
if( nodePadName == PadPinMapPinRef[ padMapIndex ] ) {
return( PadPinMapNum[ padMapIndex ] );
}
padMapIndex++;
}
}
}
}
return( "" );
}
void GenerateSignals( void )
{
for( int i = 0; i < NrNets; i++ ) {
int node = NodeRef[ i ];
for( int j = 0; j < NrNetNodes[ i ]; j++ ) {
string nodePadName = FindNodePadName( NodeElementName[ node ], NodePadName[ node ] );
if( nodePadName != "" ) {
printf( "SIGNAL %s %s %s;\n", NetNames[ i ], NodeElementName[ node ], nodePadName );
node++;
}
else {
string tmp;
sprintf( tmp, "# warning: NodePadName not found %s %s\n", NodeElementName[ node ], NodePadName[ node ] );
WriteLog( tmp );
}
}
}
}
void GenerateOneDummyPattern( int startToken, int dummyPatternCount )
{
int padStyleRefPosition = FindToken( startToken + 1, "padStyleRef" );
if( padStyleRefPosition >= 0 ) {
string DeviceName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
Tokens[ padStyleRefPosition + 1 ] )
);
CurrentToken = FindToken( startToken + 1, "pt" );
if( CurrentToken >= 0 ) {
string xCoordText;
string yCoordText;
xCoordText = Tokens[ CurrentToken + 1 ];
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xCoordText = xCoordText + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoordText = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yCoordText = yCoordText + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoordText = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoordText = yCoordText + Tokens[ CurrentToken + 3 ];
}
}
printf( "ADD '%s' 'DUMMY%d' (%s %s);\n",
ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ padStyleRefPosition + 1 ] ) ),
dummyPatternCount,
xCoordText, yCoordText );
}
else {
WriteLog("# warning: GenerateOneDummyPattern: can't find point in dummy device.\n");
}
}
else {
WriteLog("# warning: GenerateOneDummyPattern: can't find padStyleRef in dummy device.\n");
}
}
void GeneratePCBMultilayer( void )
{
int dummyPatternCount = 1;
if( PCBDesignMultiLayerToken ) {
CurrentToken = PCBDesignMultiLayerToken;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pad" ) {
int SavePosition = CurrentToken;
GenerateOneDummyPattern( SavePosition, dummyPatternCount );
CurrentToken = SavePosition;
dummyPatternCount++;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "via" ) {
int SavePosition = CurrentToken;
GenerateVia( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pattern" ) {
int SavePosition = CurrentToken;
GeneratePattern( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "fromTo" ) {
SkipThisItem();
}
else {
string tmp;
sprintf( tmp, "# warning: GeneratePCBMultilayer unknown keyword: %s\n", Tokens[ CurrentToken ] );
WriteLog( tmp );
SkipThisItem();
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
dlgMessageBox( "Unexpected keyword in pcbDesign multiLayer " + Tokens[ CurrentToken ], "OK");
return;
}
}
CurrentToken++;
}
}
else {
WriteLog( "# warning: no multilayer token in pcbDesign\n");
}
GenerateSignals();
}
void GeneratePCBLayerContents( void )
{
for( int i = 0; i < NrPCBLayerContents; i++ ) {
int startToken = PCBLayerContentsArray[ i ];
GenerateLayerContents( startToken, -1 );
}
}
// Generate PCB from 'pcbDesign' keyword
void GeneratePCB( void )
{
GeneratePCBHeader();
GeneratePCBMultilayer();
GeneratePCBLayerContents();
printf("WINDOW FIT;\n");
printf("SET CONFIRM OFF;\n");
}
void GenerateSchematicHeader( void )
{
string libraryName;
printf("# ***** Schematic *****\n");
string eagleFileName;
string array[];
sprintf( eagleFileName, "%s.eagle.sch", PCADfileName);
if( fileglob( array, eagleFileName ) ) {
printf("SET CONFIRM YES;\n");
printf("REMOVE '%s';\n", eagleFileName );
printf("SET CONFIRM OFF;\n");
}
printf("EDIT '%s';\n", eagleFileName );
libraryName = filesetext( PCADfileName, ".lbr");
printf("USE -* '%s';\n", libraryName);
printf("GRID %s;\n", FileUnits );
//printf("SET OPTIMIZING ON;\n");
printf("SET CONFIRM YES;\n");
printf("SET AUTO_JUNCTION OFF;\n");
printf("SET CHECK_CONNECTS OFF;\n");
printf("SET WIRE_BEND 2;\n");
printf("CHANGE FONT VECTOR;\n");
}
void GenerateOneSheetSymbol( int startToken )
{
int symbolRefPosition = FindToken( startToken + 1, "symbolRef" );
if( symbolRefPosition >= 0 ) {
//printf("#symbolRef = %s\n", Tokens[ symbolRefPosition + 1 ] );
string info;
sprintf( info, TR("Process symbolref ") + " %d %s", symbolRefPosition, Tokens[ symbolRefPosition + 1 ] );
UpdateProgress( info );
int refDesRefPosition = FindToken( startToken + 1, "refDesRef" );
if( refDesRefPosition >= 0 ) {
string refDesRef = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ refDesRefPosition + 1 ] ) );
printf("#refDesRef = %s\n", Tokens[ refDesRefPosition + 1 ] );
string RotationMirrored = "";
int mirrored = FindToken( startToken + 1, "isFlipped" );
if( mirrored >= 0 ) {
if( ( Tokens[ mirrored + 1 ] == "True" ) || ( Tokens[ mirrored + 1 ] == "true" ) ) {
RotationMirrored = "M";
}
}
int rotationPosition = FindToken( startToken + 1, "rotation" );
if( rotationPosition >= 0 ) {
RotationMirrored = RotationMirrored + "R" + Tokens[ rotationPosition + 1 ];
}
else {
RotationMirrored = RotationMirrored + "R0";
}
string partNum = "";
int partNumPosition = FindToken( startToken + 1, "partNum" );
if( partNumPosition >= 0 ) {
partNum = Tokens[ partNumPosition + 1 ];
}
int patternPosition = FindToken( startToken + 1, "pt" );
if( patternPosition >= 0 ) {
string DeviceName = FindSymbolDeviceName( refDesRef );
if( DeviceName != "" ) {
string vtText = "";
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "attr" ) {
string type = RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] );
if( ( type == "VT" ) || ( type == "Vt" ) ) {
vtText = FindText( CurrentToken + 1 );
break;
}
SkipThisItem();
}
else {
SkipThisItem();
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
string xCoordPattern = "";
string yCoordPattern = "";
xCoordPattern = Tokens[ patternPosition + 1 ];
if( IsASCIIValue( Tokens[ patternPosition + 2 ] ) ) {
xCoordPattern = xCoordPattern + Tokens[ patternPosition + 2 ];
if( Tokens[ patternPosition + 3 ] != ")" ) {
yCoordPattern = Tokens[ patternPosition + 3 ];
if( Tokens[ patternPosition + 4 ] != ")" ) {
yCoordPattern = yCoordPattern + Tokens[ patternPosition + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoordPattern = Tokens[ patternPosition + 2 ];
if( Tokens[ patternPosition + 3 ] != ")" ) {
yCoordPattern = yCoordPattern + Tokens[ patternPosition + 3 ];
}
}
string Val1 = ConvertUnits( GetNumberValue( xCoordPattern ),
GetUnitValue( xCoordPattern ) );
string Val2 = ConvertUnits( GetNumberValue( yCoordPattern ),
GetUnitValue( yCoordPattern ) );
if( strtol( partNum ) > 1 ) {
printf( "ADD '%s' '%sG%s' 'G%s' %s (%s %s);\n",
DeviceName,
refDesRef,
partNum,
partNum,
RotationMirrored,
Val1, Val2 );
string tmp;
sprintf( tmp, "%sG%sG%s", refDesRef, partNum, partNum );
int SavePosition = CurrentToken;
string symbolDefName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ symbolRefPosition + 1 ] ) );
int index = FindSymbolIndexByName( symbolDefName );
AddAttributes( 1, index, tmp, startToken, Val1, Val2 );
CurrentToken = SavePosition;
printf("SMASH (%s %s);\n", Val1, Val2 );
IfNameChanged = 0;
IfValueChanged = 0;
ChangeNameAndValuePosition( tmp, startToken, Val1, Val2, Tokens[ rotationPosition + 1 ] );
if( index >= 0 ) {
if( IfNameDefinedInSymbol[ index ] ) {
if( !IfNameChanged ) {
printf( "DELETE '%s>NAME';\n", tmp );
}
}
if( IfValueDefinedInSymbol[ index ] ) {
if( !IfValueChanged ) {
printf( "DELETE '%s>VALUE';\n", tmp );
}
}
}
else {
string tmp;
sprintf( tmp, "# warning: can't find index for symbol %s\n", symbolDefName );
WriteLog( tmp );
}
CurrentToken = SavePosition;
}
else {
printf( "ADD '%s' '%s' 'G%s' %s (%s %s);\n",
DeviceName,
refDesRef,
partNum,
RotationMirrored,
Val1, Val2 );
string tmp;
sprintf( tmp, "%sG%s", refDesRef, partNum );
int SavePosition = CurrentToken;
string symbolDefName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ symbolRefPosition + 1 ] ) );
int index = FindSymbolIndexByName( symbolDefName );
AddAttributes( 1, index, tmp, startToken, Val1, Val2 );
CurrentToken = SavePosition;
printf("SMASH (%s %s);\n", Val1, Val2 );
IfNameChanged = 0;
IfValueChanged = 0;
ChangeNameAndValuePosition( tmp, startToken, Val1, Val2, Tokens[ rotationPosition + 1 ] );
if( index >= 0 ) {
if( IfNameDefinedInSymbol[ index ] ) {
if( !IfNameChanged ) {
printf( "DELETE '%s>NAME';\n", tmp );
}
}
if( IfValueDefinedInSymbol[ index ] ) {
if( !IfValueChanged ) {
printf( "DELETE '%s>VALUE';\n", tmp );
}
}
}
else {
string tmp;
sprintf( tmp, "# warning: can't find index for symbol %s\n", symbolDefName );
WriteLog( tmp );
}
CurrentToken = SavePosition;
}
}
else {
WriteLog("#warning: no DeviceName found.\n" );
}
}
else {
string tmp;
sprintf( tmp, "#warning: Can't find pattern coordinates %s\n",
Tokens[ symbolRefPosition + 1 ] );
WriteLog( tmp );
}
}
else {
WriteLog("#warning: can't find symbol design name\n");
}
}
else {
WriteLog("#warning: Can't find symbol reference.\n");
}
}
void GenerateTitleSheet( void )
{
if( SchTitleSheet ) {
CurrentToken = SchTitleSheet;
CurrentToken++;
CurrentToken++;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "isVisible" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "border" ) {
int SavePosition = CurrentToken;
//GenerateBorder( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "zones" ) {
int SavePosition = CurrentToken;
//GenerateZones( SavePosition ); FixMe
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "offset" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "line" ) {
int SavePosition = CurrentToken;
GenerateOneLine( SavePosition, 0, 0 );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "field" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "poly" ) {
int SavePosition = CurrentToken;
GenerateOnePcbPoly( SavePosition, 0, DEFAULT_WIRE_WIDTH_BOARD );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "text" ) {
int SavePosition = CurrentToken;
GenerateOneText( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "triplePointArc" ) {
int SavePosition = CurrentToken;
GenerateOneTripleArc( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# ????? GenerateTitleSheet unknown keyword: %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
else {
dlgMessageBox( TR("Unexpected keyword in GenerateTitleSheet: ") + Tokens[ CurrentToken ], "OK");
return;
}
}
CurrentToken++;
}
}
else {
WriteLog( "# warning: no titleSheet token in schematicDesign\n");
}
}
void GenerateOnePort( int startToken )
{
string type;
string netNameRef;
string isFlipped;
string xCoordText;
string yCoordText;
string rotation = "0";
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "pt" ) {
xCoordText = Tokens[ CurrentToken + 1 ];
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
xCoordText = xCoordText + Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoordText = Tokens[ CurrentToken + 3 ];
if( Tokens[ CurrentToken + 4 ] != ")" ) {
yCoordText = yCoordText + Tokens[ CurrentToken + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoordText = Tokens[ CurrentToken + 2 ];
if( Tokens[ CurrentToken + 3 ] != ")" ) {
yCoordText = yCoordText + Tokens[ CurrentToken + 3 ];
}
}
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "portType" ) {
type = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "netNameRef" ) {
netNameRef = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isFlipped" ) {
isFlipped = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "portPinLength" ) {
isFlipped = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "rotation" ) {
rotation = Tokens[ CurrentToken + 1 ];
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GenerateOnePort ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
break;
}
}
CurrentToken++;
}
XCoordLabels[ NrLabels ] = xCoordText;
YCoordLabels[ NrLabels ] = yCoordText;
TypeLabels[ NrLabels ] = type;
NetNameRef[ NrLabels ] = netNameRef;
IsLabelFlipped[ NrLabels ] = isFlipped;
LabelRotation[ NrLabels ] = rotation;
NrLabels++;
}
void GenerateSheets( void )
{
printf("# Sheets:\n");
for( int i = 0; i < NrSheets; i++ ) {
int startToken = SheetsArray[ i ];
int junctions[];
int NrJunctions = 0;
NrLabels = 0;
NrWiresPoint = 0;
int buses[];
int NrBuses = 0;
string info;
sprintf( info, TR("Process sheet ") + " %d (%d)", i, NrSheets );
UpdateProgress( info );
string sheetName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
Tokens[ startToken ] )
);
int sheetNumberToken = FindToken( startToken + 1, "sheetNum" );
string sheetNumber;
sprintf( sheetNumber, "%d", i + 1 );
if( sheetNumberToken >= 0 ) {
sheetNumber = Tokens[ sheetNumberToken + 1 ];
}
else {
WriteLog( "# warning: no sheet number.\n" );
}
printf("#\n");
printf("# sheet: %s %s\n", sheetName, sheetNumber );
printf("EDIT '.S%s'\n", sheetNumber );
printf("GRID %s;\n", FileUnits );
GenerateTitleSheet();
printf( "CHANGE LAYER 91;\n" );
CurrentToken = startToken + 1;
while( CurrentToken < TokensNumber ) {
if( Tokens[ CurrentToken ] == "(" ) {
CurrentToken++;
if( Tokens[ CurrentToken ] == "sheetNum" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "fieldSetRef" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "junction" ) {
junctions[ NrJunctions ] = CurrentToken + 1;
NrJunctions++;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "symbol" ) {
int SavePosition = CurrentToken;
GenerateOneSheetSymbol( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "wire" ) {
int SavePosition = CurrentToken;
GenerateOneLine( SavePosition + 2, 1, 0 );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "text" ) {
int SavePosition = CurrentToken;
GenerateOneText( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "triplePointArc" ) {
int SavePosition = CurrentToken;
GenerateOneTripleArc( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "port" ) {
int SavePosition = CurrentToken;
GenerateOnePort( SavePosition );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "line" ) {
int SavePosition = CurrentToken;
GenerateOneLine( SavePosition, 0, 0 );
CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "bus" ) {
//int SavePosition = CurrentToken;
//GenerateOneBus( SavePosition );
buses[ NrBuses ] = CurrentToken;
NrBuses++;
//CurrentToken = SavePosition;
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "drawBorder" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "EntireDesign" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "isRotated" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "pageSize" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "scaleFactor" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "offset" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "PrintRegion" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "sheetOrderNum" ) {
SkipThisItem();
}
else {
if( Tokens[ CurrentToken ] == "busEntry" ) {
SkipThisItem();
}
else {
if( DebugMessage ) {
printf( "# GenerateSheets ??????? %s\n", Tokens[ CurrentToken ] );
}
SkipThisItem();
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
else {
if( Tokens[ CurrentToken ] == ")" ) {
for( int j = 0; j < NrJunctions; j++ ) {
int CurrentToken = junctions[ j ];
int junctionPt = FindToken( CurrentToken, "pt" );
if( junctionPt >= 0 ) {
string xCoordPattern = "";
string yCoordPattern = "";
xCoordPattern = Tokens[ junctionPt + 1 ];
if( IsASCIIValue( Tokens[ junctionPt + 2 ] ) ) {
xCoordPattern = xCoordPattern + Tokens[ junctionPt + 2 ];
if( Tokens[ junctionPt + 3 ] != ")" ) {
yCoordPattern = Tokens[ junctionPt + 3 ];
if( Tokens[ junctionPt + 4 ] != ")" ) {
yCoordPattern = yCoordPattern + Tokens[ junctionPt + 4 ];
}
}
else {
WriteLog( "#warning: wront point description.\n" );
}
}
else {
yCoordPattern = Tokens[ junctionPt + 2 ];
if( Tokens[ junctionPt + 3 ] != ")" ) {
yCoordPattern = yCoordPattern + Tokens[ junctionPt + 3 ];
}
}
string Val1 = ConvertUnits( GetNumberValue( xCoordPattern ),
GetUnitValue( xCoordPattern ) );
string Val2 = ConvertUnits( GetNumberValue( yCoordPattern ),
GetUnitValue( yCoordPattern ) );
printf( "JUNCTION (%s %s);\n", Val1, Val2 );
}
else {
WriteLog( "# warning: no junction position.\n" );
}
}
printf("CHANGE SIZE %s;\n", LabelTextHeight );
for( int k = 0; k < NrLabels; k++ ) {
string mirrored = "";
if( IsLabelFlipped[ k ] ) {
mirrored = "M";
}
printf("LABEL %sR%s (%s %s) (%s %s);\n", mirrored, LabelRotation[ k ],
XCoordLabels[ k ],
YCoordLabels[ k ],
XCoordLabels[ k ],
YCoordLabels[ k ] );
// Generate wires to fill gaps in ports
real xLabelCoord = strtod( XCoordLabels[ k ] );
real yLabelCoord = strtod( YCoordLabels[ k ] );
int toLeft = ( TypeLabels[ k ] == "LeftAngle_Sgl_Horz" ) ||
( TypeLabels[ k ] == "LeftAngle_Dbl_Horz" ) ||
( TypeLabels[ k ] == "BothAngle_Dbl_Horz" );
int toRight = ( TypeLabels[ k ] == "RightAngle_Sgl_Horz" ) ||
( TypeLabels[ k ] == "RightAngle_Dbl_Horz" ) ||
( TypeLabels[ k ] == "BothAngle_Dbl_Horz" );
if( IsLabelFlipped[ k ] ) {
int tmp = toLeft;
toLeft = toRight;
toRight = tmp;
}
if( 1 /*toRight*/ ) {
for( int l = 0; l < NrWiresPoint; l++ ) {
int right = 1000000;
int index = -1;
if( ( yLabelCoord == WiresPointY[ l ] ) && ( WiresNet[ l ] == NetNameRef[ k ] ) ) {
if( xLabelCoord < WiresPointX[ l ] ) {
if( right > WiresPointX[ l ] ) {
right = WiresPointX[ l ];
index = l;
}
}
}
if( index >= 0 ) {
printf("NET '%s' (%s %s) (%f %f);\n", NetNameRef[ k ], XCoordLabels[ k ], YCoordLabels[ k ],
WiresPointX[ index ], WiresPointY[ index ] );
}
else {
//printf( "#info: wires point %s %s to the right not found.\n", XCoordLabels[ k ], YCoordLabels[ k ] );
}
}
}
if( 1 /*toLeft*/ ) {
for( int l = 0; l < NrWiresPoint; l++ ) {
int left = -1000000;
int index = -1;
if( ( yLabelCoord == WiresPointY[ l ] ) && ( WiresNet[ l ] == NetNameRef[ k ] ) ) {
if( xLabelCoord > WiresPointX[ l ] ) {
if( left < WiresPointX[ l ] ) {
left = WiresPointX[ l ];
index = l;
}
}
}
if( index >= 0 ) {
printf("NET '%s' (%s %s) (%f %f);\n", NetNameRef[ k ], XCoordLabels[ k ], YCoordLabels[ k ],
WiresPointX[ index ], WiresPointY[ index ] );
}
else {
//printf( "#info: wires point %s %s to the left not found.\n", XCoordLabels[ k ], YCoordLabels[ k ] );
}
}
}
}
for( int l = 0; l < NrBuses; l++ ) {
int busToken = buses[ l ];
GenerateOneBus( busToken );
}
break;
}
}
CurrentToken++;
}
}
}
void GenerateSchematic( void )
{
GenerateSchematicHeader();
GenerateSheets();
printf("WINDOW FIT;\n");
printf("SET CONFIRM OFF;\n");
}
// This function generate script based on parsed data.
// If processed seccesfully returns 0,
// otherwise returns 1
int GenerateScript( void )
{
output(SCRIPTfileName, "wt") {
GenerateLibrary();
if( PCBDesignToken ) {
GeneratePCB();
}
if( SchematicDesignToken ) {
GenerateSchematic();
}
}
return( 0 );
}
int Cntelayer = 0;
string EagleLayerName[];
int EagleLayerNum[];
string SaveRefLayerDef[];
string SaveRefLayerNum[];
string SaveRefLayerType[];
string SavePcadEagleLayerRefName[];
string SavePcadEagleLayerRefNum[];
string PrevRefLayerDef[];
string PrevRefLayerNum[];
string PrevRefLayerType[];
string PrevPcadEagleLayerRefName[];
string PrevPcadEagleLayerRefNum[];
string PrevShowRefLayer[];
int UpdateRefLayers( void )
{
int selref = 0;
for( int i = 0; i < LayerDefsNumber; i++ ) {
string pcadLayerStrNum;
sprintf( pcadLayerStrNum, "%d", LayersCode[ i ] );
int eagleFromPcadLayerNum = strtol( ConvertLayer( pcadLayerStrNum ) );
int found = 0;
for( int j = 0; j < Cntelayer; j++ ) {
if( eagleFromPcadLayerNum == EagleLayerNum[ j ] ) {
SaveRefLayerType[ i ] = LayersType[ i ];
SaveRefLayerDef[ i ] = LayersName[ i ];
SaveRefLayerNum[ i ] = pcadLayerStrNum;
string tmp;
sprintf( tmp, "%d", EagleLayerNum[ j ] );
SavePcadEagleLayerRefNum[ i ] = tmp;
SavePcadEagleLayerRefName[ i ] = EagleLayerName[ j ];
selref++;
found = 1;
break;
}
}
if( !found ) {
sprintf( ShowRefLayer[selref], "%s\t%s\t%s\t%s\t%s",
RefLayerType[ i ],
RefLayerDef[ i ],
RefLayerNum[ i ],
0,
"unknown" );
selref++;
}
}
for( i = 0; i < selref; i++ ) {
RefLayerType[ i ] = SaveRefLayerType[ i ];
RefLayerDef[ i ] = SaveRefLayerDef[ i ];
RefLayerNum[ i ] = SaveRefLayerNum[ i ];
PcadEagleLayerRefNum[ i ] = SavePcadEagleLayerRefNum[ i ];
PcadEagleLayerRefName[ i ] = SavePcadEagleLayerRefName[ i ];
sprintf( ShowRefLayer[ i ], "%s\t%s\t%s\t%s\t%s",
SaveRefLayerType[ i ],
SaveRefLayerDef[ i ],
SaveRefLayerNum[ i ],
SavePcadEagleLayerRefNum[ i ],
SavePcadEagleLayerRefName[ i ] );
}
RefLayerType[ selref ] = "";
RefLayerDef[ selref ] = "";
RefLayerNum[ selref ] = "";
PcadEagleLayerRefNum[ selref ] = "";
PcadEagleLayerRefName[ selref ] = "";
CntlayerDef = selref;
return( selref );
}
void ProcessLayersMap( void )
{
if( schematic ) {
schematic(S) {
S.layers(L) {
EagleLayerName[Cntelayer] = L.name;
EagleLayerNum[Cntelayer] = L.number;
Cntelayer++;
}
}
}
else {
if( board ) {
board(B) {
B.layers(L) {
EagleLayerName[Cntelayer] = L.name;
EagleLayerNum[Cntelayer] = L.number;
Cntelayer++;
}
}
}
}
int selPCAD = LayerDefsNumber;
int selUlay = LayerDefsNumber;
int selEAGLE = Cntelayer;
int selref = 0;
for( int i = 0; i < CntlayerDef; i++ ) {
PrevRefLayerType[ i ] = RefLayerType[ i ];
PrevRefLayerDef[ i ] = RefLayerDef[ i ];
PrevRefLayerNum[ i ] = RefLayerNum[ i ];
PrevPcadEagleLayerRefNum[ i ] = PcadEagleLayerRefNum[ i ];
PrevPcadEagleLayerRefName[ i ] = PcadEagleLayerRefName[ i ];
sprintf( PrevShowRefLayer[ i ], "%s\t%s\t%s\t%s\t%s",
RefLayerType[ i ],
RefLayerDef[ i ],
RefLayerNum[ i ],
PcadEagleLayerRefNum[ i ],
SavePcadEagleLayerRefName[ i ] );
}
dlgDialog(TR("ACCEL - EAGLE layer mapping")) {
selref = UpdateRefLayers();
dlgHBoxLayout {
dlgVBoxLayout dlgSpacing(350);
dlgVBoxLayout {
dlgLabel("ACCEL\nLayer\n--->>");
dlgListBox( LayersName, selPCAD );
}
dlgVBoxLayout {
dlgLabel("EAGLE\nLayer\n<<---");
dlgListBox( PcadEagleLayerRefName, selUlay );
}
dlgVBoxLayout {
dlgLabel("EAGLE\nLayer\n");
dlgListBox( EagleLayerName, selEAGLE ) {
// set Reference layer name
PcadEagleLayerRefName[selPCAD] = EagleLayerName[selEAGLE];
// set Reference layer number
string tmp;
sprintf( tmp, "%d", EagleLayerNum[selEAGLE] );
PcadEagleLayerRefNum[selPCAD] = tmp;
sprintf( ShowRefLayer[ selPCAD ], "%s\t%s\t%s\t%s\t%s",
RefLayerType[ selPCAD ],
RefLayerDef[ selPCAD ],
RefLayerNum[ selPCAD ],
PcadEagleLayerRefNum[ selPCAD ],
PcadEagleLayerRefName[ selPCAD ] );
}
}
}
dlgSpacing(10);
dlgVBoxLayout {
dlgLabel(TR("Mapping:"));
dlgListView(TR("ACCEL\nType\tACCEL\nLayer\tACCEL\nNumber\tEAGLE\nNumber\tEAGLE\nName"), ShowRefLayer, selref );
}
dlgHBoxLayout {
dlgStretch(1);
dlgPushButton("&" + TR("Load")) { LoadCrossRef(""); selref = UpdateRefLayers(); }
dlgPushButton("&" + TR("Save")) SaveCrossRef();
dlgPushButton("+OK")
dlgAccept();
dlgPushButton("-" + TR("Cancel")) {
for( int i = 0; i < CntlayerDef; i++ ) {
RefLayerType[ i ] = PrevRefLayerType[ i ];
RefLayerDef[ i ] = PrevRefLayerDef[ i ];
RefLayerNum[ i ] = PrevRefLayerNum[ i ];
PcadEagleLayerRefNum[ i ] = PrevPcadEagleLayerRefNum[ i ];
PcadEagleLayerRefName[ i ] = PrevPcadEagleLayerRefName[ i ];
ShowRefLayer[ i ] = PrevShowRefLayer[ i ];
}
dlgReject();
}
}
};
}
void OutputWarningsLogFile( void )
{
string fullLog = "";
WarningsLogFileName = PCADfileName + ".err";
sprintf( fullLog, "Number of messages = %d\n\n", NrLogLines );
for( int n = 0; n < NrLogLines; n++ ) {
fullLog = fullLog + LogLines[ n ];
}
output( WarningsLogFileName, "wt" ) {
printf("%s", fullLog );
}
if( !BatchMode ) {
if( NrLogLines ) {
dlgDialog( TR( "Warnings log" ) ) {
dlgHBoxLayout dlgSpacing (400);
dlgHBoxLayout {
dlgVBoxLayout dlgSpacing (300);
dlgTextView ( fullLog );
}
dlgHBoxLayout {
dlgStretch( 1 );
dlgPushButton( TR("-Back")) dlgReject ();
dlgStretch(1);
}
};
}
}
}
void ChangeDRU( void )
{
string drufile = path_dru[ 0 ] + "/" + "default.dru";
string f[];
int fcnt = fileglob( f, drufile );
if( fcnt ) {
string DRUvalues[];
int DRUlcnt = fileread( DRUvalues, drufile );
string s[];
int n;
string outputString[];
for( int line = 0; line < DRUlcnt; line++ ) {
n = strsplit( s, DRUvalues[ line ], ' ');
if( s[ 0 ] == "rvPadTop" ) {
outputString[ line ] = "rvPadTop = 0";
} else if( s[ 0 ] == "rvPadInner" ) {
outputString[ line ] = "rvPadInner = 0";
} else if( s[ 0 ] == "rvPadBottom" ) {
outputString[ line ] = "rvPadBottom = 0";
} else if( s[ 0 ] == "rvViaOuter" ) {
outputString[ line ] = "rvViaOuter = 0";
} else if( s[ 0 ] == "rvViaInner" ) {
outputString[ line ] = "rvViaInner = 0";
} else if( s[ 0 ] == "rvMicroViaOuter" ) {
outputString[ line ] = "rvMicroViaOuter = 0";
} else if( s[ 0 ] == "rvMicroViaInner" ) {
outputString[ line ] = "rvMicroViaInner = 0";
} else if( s[ 0 ] == "rlMinPadTop" ) {
outputString[ line ] = "rlMinPadTop = 0mil";
} else if( s[ 0 ] == "rlMaxPadTop" ) {
outputString[ line ] = "rlMaxPadTop = 0mil";
} else if( s[ 0 ] == "rlMinPadInner" ) {
outputString[ line ] = "rlMinPadInner = 0mil";
} else if( s[ 0 ] == "rlMaxPadInner" ) {
outputString[ line ] = "rlMaxPadInner = 0mil";
} else if( s[ 0 ] == "rlMinPadBottom" ) {
outputString[ line ] = "rlMinPadBottom = 0mil";
} else if( s[ 0 ] == "rlMaxPadBottom" ) {
outputString[ line ] = "rlMaxPadBottom = 0mil";
} else if( s[ 0 ] == "rlMinViaOuter" ) {
outputString[ line ] = "rlMinViaOuter = 0mil";
} else if( s[ 0 ] == "rlMaxViaOuter" ) {
outputString[ line ] = "rlMaxViaOuter = 0mil";
} else if( s[ 0 ] == "rlMinViaInner" ) {
outputString[ line ] = "rlMinViaInner = 0mil";
} else if( s[ 0 ] == "rlMaxViaInner" ) {
outputString[ line ] = "rlMaxViaInner = 0mil";
} else if( s[ 0 ] == "rlMinMicroViaOuter" ) {
outputString[ line ] = "rlMinMicroViaOuter = 0mil";
} else if( s[ 0 ] == "rlMaxMicroViaOuter" ) {
outputString[ line ] = "rlMaxMicroViaOuter = 0mil";
} else if( s[ 0 ] == "rlMinMicroViaInner" ) {
outputString[ line ] = "rlMinMicroViaInner = 0mil";
} else if( s[ 0 ] == "rlMaxMicroViaInner" ) {
outputString[ line ] = "rlMaxMicroViaInner = 0mil";
} else if( s[ 0 ] == "srRoundness" ) {
outputString[ line ] = "srRoundness = 0.0";
} else if( s[ 0 ] == "srMinRoundness" ) {
outputString[ line ] = "srMinRoundness = 0mil";
} else {
outputString[ line ] = DRUvalues[ line ];
}
}
output( DRUFileName, "wt") {
for( int line = 0; line < DRUlcnt; line++ ) {
printf("%s\n", outputString[ line ] );
}
}
}
else {
dlgMessageBox(TR("Can't open default.dru !"), "OK");
}
}
// This is the main parsing procedure
// This procedure do the following:
//
// 1. Merge all lines to one string and
// remove all comments (comments may be added by inserting
// a semicolon; the comment continues from the semicolon
// to the end of the line.
// 2. Split merged string to array of tokens
// 3. Parse tree
// 4. Generate script
int Parsing( void )
{
string a[];
int fileExist = fileglob( a, PCADfileName );
if( !fileExist ) {
dlgMessageBox( TR("File ") + PCADfileName + TR(" doesn't exist!"), "OK" );
return( 1 );
}
DebugMessage = 1;
MergedString = "";
TokensNumber = 0;
MergeLines();
SplitToTokens();
if( ParseTree() ) {
return( 1 );
}
if( PCBDesignToken ) {
DRUFileName = filesetext( PCADfileName, ".dru" );
ChangeDRU();
}
string CrossfileName = PCADfileName + ".lmp";
string f[];
int crossfileExist = fileglob(f, CrossfileName);
if( crossfileExist ) LoadCrossRef(CrossfileName);
if( IfUpdateLayersMap ) {
ProcessLayersMap();
}
if( GenerateScript() ) {
return( 1 );
}
OutputWarningsLogFile();
return( 0 );
}
// *********** Show and creat Reference ****************
int Execute(string fname) {
// APL make parsing
Parsing();
return 1;
}
// ***** Main *****
void main( void )
{
// Keep help here for it's too big to stuff into dictionary.
string help[] = {
"<b>General</b><br>"
"ACCEL ASCII is also known as TangoPRO ASCII or P-CAD ASCII. "
"It can be exported from <b>P-CAD</b>, <b>Altium Designer</b> and <b>PROTEL</b> and therefore allows conversion of "
"designs in these formats to EAGLE. From Altium Designer only boards can be exported to this format.<br>"
"The conversion to EAGLE works following:<br>"
"First, in the directory of the input file, an EAGLE library with same name is generated. "
"It contains the devices that are used. With this an EAGLE schematic or board with same name is generated. <br>"
"For ACCEL ASCII schematic files partly end with \".sch\", EAGLE schematics get ending \".eagle.sch\". "
"The conversion of a schematic without board doesn't make much sense because the package information is "
"missing which is necessary for creation of a board.<br>"
"Because of different data models and powerfulness of the foreign systems and EAGLE the conversion has limits. "
"Ideally certain cases should already be avoided in the original data. "
"Otherwise certain post processing steps may be necessary. In any case we recommend to perform a DRC after "
"import in order to find and eliminate potential weaknesses of the design. "
"<p>"
"<b>Layer assignment</b><br>"
"Depending on the source system, signal, solder and other layer types have different names. "
"For conversion a default assignment is used which may not always be correct. "
"For this case you can change this individually with the option \"Adjust layer mapping\"."
"<p>"
"<b>Conversion details:</b><br>"
"<ul><li><i>Names: </i><br>"
"To follow EAGLE's naming conventions for different types of entities certain characters are replaced "
"by '_', in particular '(', ')', '[', ']', ''' and space. '\\\\' is replaced by '/'. " // 4 backslashes here ? Insane. Seems to be a bug in EAGLE.
"Control characters like '\\\\r' are not processed in a special way.</li>"
"<li><i>Texts:</i><br>"
"All texts are converted to vectorfont in EAGLE. This allows a system independent "
"representation for polygon calculation and CAM processing. The font can be changed to fixed or "
"proportional where needed. All other text properties are taken over from ACCEL ASCII.</li>"
"<li><i>Pads and SMDs: </i><br>"
"For pad and SMD types following conversion agreement is used:<br>"
"Square pad/SMD -> SQUARE pad/SMD,<br>"
"Rectangle pad -> SQUARE pad with additional rectangle polygon,<br>"
"Oval pad -> LONG pad in EAGLE (size and shape of original and converted pads are slightly "
"different in this case),<br>"
"Ellipse pad -> ROUND pad with additional approximation polygon consisting of four arcs,<br>"
"Polygon pad -> SQUARE pad with additional polygon,<br>"
"Round rectangle pad -> SQUARE pad and additional polygon with rounded corners,<br>"
"Target pad -> ROUND pad,<br>"
"Rectangle SMD -> rectangle SMD,<br>"
"Oval SMD -> SMD with 100% roundness,<br>"
"Ellipse SMD -> round SMD with additional approximation polygon consisting of four arcs,<br>"
"Polygon SMD -> square SMD with additional polygon,<br>"
"Round rectangle -> SMD with 25% roundness,<br>"
"Target SMD -> SMD with 100% roundness.</li>"
"<li><i>Standalone pads (Free pads): </i><br>"
"For standalone pads an appropriate library package is created in EAGLE.</li>"
"<li><i>Vias:</i><br>"
"Vias are converted the following way to EAGLE:<br>"
"Oval -> ROUND, Rectangle -> SQUARE, Ellipse -> ROUND, Round rectangle -> SQUARE and Target -> ROUND.<br>"
"The sizes of the EAGLE vias are adjusted to fit within the shape of the ACCEL vias to avoid clearance issues.</li>"
"<li><i>Contacts / Routing: </i><br>"
"In EAGLE coordinates of traces, pads, vias etc. have to match exactly in order to be properly routed. "
"Otherwise airwires are generated. In some other systems certain deviations are allowed."
"In other systems it's possible that a longer trace crosses a pad without connecting point. "
"In EAGLE this leads to an airwire to the next connecting point. In this case the trace needs to be splitted with "
"SPLIT command in order to create an additional connecting point at the pad position. </li>"
"<li><i>Copper polygons general: </i><br>"
"In EAGLE there's only one type for hatched polygons (horizontal and vertical stripes)."
"The different possible hatch types in ACCEL ASCII like diagonal style for example, are all "
"converted to this.<br>"
"Thermals within polygons are also always horizontal and vertical. There's no specific thermal spoke width "
"for each polygon, but a general value in the EAGLE design rules.<br>"
"The removal of orphan property is converted to EAGLE but without threshold value (only on/off).</li>"
"<li><i>Copper polygons in poured state: </i><br>"
"In EAGLE polygons are saved always in unpoured state. The pour state is calculated dynamically "
"by RATSNEST and depends on the parameters currently set.</li>"
"<li><i>Dimensions: </i><br>"
"As the data model for dimensions in EAGLE is much simpler than in ACCEL ASCII some details are not mapped to EAGLE.</li>"
"<li><i>Labels:</i><br>"
"Input, output and bidirectional labels are all converted to Xref labels in EAGLE.</li>"
"<li><i>Attributes for layers: </i><br>"
"In EAGLE layers can't have attributes. This is skipped.</li>"
"<li><i>'zones' (in ACCEL schematic): </i><br>"
"'zones' are not supported and skipped.</li>"
"</ul>"
,
"<b>Allgemeines</b><br>"
"ACCEL ASCII ist auch unter dem Namen TangoPRO ASCII, oder P-CAD ASCII bekannt. "
"Es kann von <b>P-CAD</b>, <b>Altium Designer</b> und <b>PROTEL</b> aus exportiert werden und ermöglicht so die "
"Konvertierung von Designs in diesen Formaten in EAGLE-Format. Von Altium Designer aus können nur <br>"
"Boards in dieses Format exportiert werden. Für die Konvertierung in EAGLE ist Folgendes zu beachten:<br>"
"Zunächst wird im Verzeichnis der Inputdatei eine EAGLE-Bibliothek gleichen Namens generiert, "
"die die verwendeten Bauteile enthält. Damit wird dann der gleichnamige EAGLE-Schaltplan oder das Board erstellt. "
"Da ACCEL-ASCII-Schaltpläne wie EAGLE teilweise die Endung \".sch\" haben, erhalten die EAGLE-Schaltpläne "
"die Endung \".eagle.sch\". "
"Die Konvertierung eines Schaltplans alleine macht wenig Sinn, da die Package-Information fehlt, "
"die für die Generierung eines Boards erforderlich wäre. "
"Aufgrund der verschiedenen Datenmodelle und der Mächtigkeit der Fremdsysteme und EAGLE sind der Konvertierung "
"Grenzen gesetzt. Idealerweise sollten bestimmte Fälle in den Originaldaten bereits vermieden werden. "
"Ansonsten sind gewisse Nachbearbeitungsschritte erforderlich. In jedem Fall sollten Sie nach dem Import einen "
"DRC durchführen, um eventuelle Schachstellen des Designs zu finden und zu beseitigen."
"<p>"
"<b>Zuordnung der Layer</b><br>"
"Je nach Herkunftssystem haben die Signal- Beschriftungs- und sonstigen Layerarten verschiedene Namen. "
"Für die Konvertierung wird eine gewisse Standard-Zuordnung angenommen, die jedoch nicht immer richtig sein muss. "
"Für diesen Fall können Sie über die Option \"Manuelle Layer-Zuordnung\" dies individuell einstellen."
"<p>"
"<b>Details zur Konvertierung:</b><br>"
"<ul><li><i>Namen: </i><br>"
"Um EAGLE's Namenskonventionen für verschiedene Objekttypen zu entsprechen, werden verschiedene Zeichen "
"durch '_' ersetzt, insbesondere '(', ')', '[', ']', ''' und Leerzeichen. '\\\\' wird ersetzt durch '/'. "
"Kontrollzeichen wie '\\\\r' werden nicht speziell behandelt.</li>"
"<li><i>Texte:</i><br>"
"Alle Texte werden in Vektorfont konvertiert. Dies ermöglicht eine systemunabhängige "
"Darstellung für das Polygon-Freirechnen und die CAM-Verarbeitung. Die Schriftart kann auf Fixed oder "
"Proportional geändert werden wo nötig. Alle anderen Texteigenschaften werden aus ACCEL ASCII übernommen."
"<li><i>Pads und SMDs: </i><br>"
"Für Pads und SMDs werden folgende Konvertierungsregeln verwendet:<br>"
"Square Pad/SMD -> SQUARE Pad/SMD,<br>"
"Rectangle Pad -> SQUARE Pad mit umgebendem rechteckigem Polygon,<br>"
"Oval Pad -> LONG Pad (Größe und Form weichen leicht voneinander ab),<br>"
"Ellipse Pad -> ROUND Pad mit umgebendem Approximation-Polygon aus 4 Kreisbögen,<br>"
"Polygon Pad -> SQUARE Pad mit umgebendem Polygon,<br>"
"Round rectangle Pad -> SQUARE Pad mit umgebendem Polygon mit Verrundungen,<br>"
"Target Pad -> ROUND Pad,<br>"
"Rectangle SMD -> rechteckiges SMD,<br>"
"Oval SMD -> SMD mit 100% Roundness,<br>"
"Ellipse SMD -> rundes SMD mit umgebendem Approximation-Polygon aus 4 Kreisbögen,<br>"
"Polygon SMD -> quadratisches SMD with umgebendem Polygon,<br>"
"Round rectangle -> SMD with 25% Roundness,<br>"
"Target SMD -> SMD with 100% Roundness.</li>"
"<li><i>Standalone-Pads (Freie Pads): </i><br>"
"Für Standalone-Pads wird ein entsprechendes Package in EAGLE erzeugt und verwendet.</li>"
"<li><i>Vias:</i><br>"
"Vias werden folgendermaßen zu EAGLE konvertiert:<br>"
"Oval -> ROUND, Rectangle -> SQUARE, Ellipse -> ROUND, Round rectangle -> SQUARE and Target -> ROUND.<br>"
"Die Größen der EAGLE-Vias werden so gesetzt, dass sie in die Form der ACCEL-Vias hineinpassen, um Abstände einzuhalten.</li>"
"<li><i>Kontaktierung / Routen: </i><br>"
"In EAGLE müssen die Koordinaten von Leiterbahnen, Pads, Vias etc. exakt aufeinander treffen, um als richtig geroutet "
"zu gelten, sonst entstehen Luftlinien. In manchen anderen Systemen sind gewisse Abweichungen zulässig. "
"Es kann in anderen Systemen vorkommen, daß eine längere Leiterbahn über einen Pad gelegt ist ohne einen Absetzpunkt. "
"Das erzeugt in EAGLE eine Luftlinie bis zum nächsten Absetzpunkt. In diesem Fall muß mit SPLIT die Leiterbahn gesplittet "
"werden, um einen zusätzlichen Absetzpunkt an der Pad-Position zu erzeugen.</li>"
"<li><i>Kupfer-Polygone allgemein: </i><br>"
"In EAGLE gibt es nur einen Typ für schraffierte Polygone (horizontale und vertikale Streifen). "
"Die verschiedenen möglichen Schraffiertypen in ACCEL ASCII wie z.B. diagonale Schraffur werden alle "
"dazu konvertiert.<br>"
"Thermalstege in den Polygonen verlaufen immer horizontal und vertikal. Es gibt keine spezifische "
"Thermalbreite für jedes Polygon, aber einen allgemeinen Wert in den Designregeln.<br>"
"Die Orphan-Eigenschaft wird nach EAGLE konvertiert aber ohne Schwellwert (nur Orphans behalten/nicht behalten).</li>"
"<li><i>Kupfer-Polygone in freigerechnetem Zustand: </i><br>"
"In EAGLE werden Polygone immer im Definitions-Zustand gespeichert (nicht freigerechnet). Das Freirechnen erfolgt "
"dynamisch durch RATSNEST und hängt von den aktuellen Parametern ab.</li>"
"<li><i>Bemaßungen: </i><br>"
"Da das Datenmodell für Bemaßungen in EAGLE wesentlich einfacher ist als in ACCEL ASCII, werden einige Details "
"nicht in EAGLE abgebildet.</li>"
"<li><i>Labels:</i><br>"
"Input- Output- und bidirektionale Labels werden alle in Xref-Labels in EAGLE konvertiert.</li>"
"<li><i>Attributes für Layer: </i><br>"
"In EAGLE können Layer keine Attribute haben. Dies wird weggelassen.</li>"
"<li><i>'zones' (in ACCEL-Schaltplänen): </i><br>"
"'zones' werden nicht unterstützt und daher weggelassen.</li>"
"</ul>"
,
"<b>Общие замечания</b><br>"
"ACCEL ASCII также известен как TangoPRO ASCII или P-CAD ASCII. "
"Он может быть экспортирован из <b>Altium Designer</b>, <b>P-CAD</b> и <b>PROTEL</b>. "
"Трансляция в EAGLE работает следующим образом:<br>"
"В начале, в каталоге входного файла, создаётся библиотека EAGLE с тем же именем. "
"Она содержит компоненты, которые будут использованы в дальнейшем. Затем создаётся файл EAGLE с тем же именем, содержащий схему или топологию. <br>"
"Для ACCEL ASCII файла схемы \".sch\", создаётся файл EAGLE \".eagle.sch\". "
"Преобразование схемы без платы не имеет смысла, так как отсутствует информация,"
"необходимая для создания платы."
"<p>"
"<b>Присвоение значений слоям</b><br>"
"В зависимости от исходной системы, типы сигналов, припой и другие слои имеют разные названия. "
"Соответствие слоёв, заданное по умолчанию, может быть изменено. "
"Для этого воспользуйтесь опцией \"Настройка соответствия слоёв\"."
"<p>"
"<b>Различия и ограничения, возникающие при преобразовании</b><br>"
"В связи с различными моделями данных и систем, преобразование имеет ограничения. "
"В идеале некоторые конфигурации следует избегать в исходных данных. "
"В противном случае потребуется постобработка. Это включает в себя, в частности: "
"<ul><li><i>Имена: </i><br>"
"Следуя соглашениям о именах в EAGLE следующие символы будут преобразованы "
"в '_': '(', ')', '[', ']', ''' и пробел. '\\\\' заменяется на '/'. " // 4 backslashes here ? Insane. Seems to be a bug in EAGLE.
"Управляющие символы, такие как '\\\\r' в строках не обрабатываются.</li>"
"<li><i>Текстовые строки:</i><br>"
"Все текстовые строки преобразуются в векторный шрифт в EAGLE. Это даёт возможность "
"представить текст и использовать его для CAM обработки. Шрифт может быть изменен на фиксированный или "
"пропорциональный где это необходимо. Все остальные свойства шрифта сохраняются из ACCEL ASCII.</li>"
"<li><i>Pad и SMD: </i><br>"
"Pad и SMD преобразуются следующим образом:<br>"
"Square pad/SMD -> SQUARE pad/SMD,<br>"
"Rectangle pad -> SQUARE pad с дополнительным прямоугольным полигоном,<br>"
"Oval pad -> LONG pad в EAGLE (размер и форма отличаются в этом случае),"
"<br>"
"Ellipse pad -> ROUND pad с дополнительным полигоном, аппроксимированным четыремя дугам,<br>"
"Polygon pad -> SQUARE pad с дополнительным полигоном,<br>"
"Round rectangle pad -> SQUARE pad с дополнительным полигоном с закругленными углами,<br>"
"Target pad -> ROUND pad,<br>"
"Rectangle SMD -> прямоугольный SMD,<br>"
"Oval SMD -> SMD с 100% закругленностью,<br>"
"Ellipse SMD -> ROUND SMD с дополнительным полигоном, аппроксимированным четыремя дугами,<br>"
"Polygon SMD -> SQUARE SMD с дополнительным полигоном,<br>"
"Round rectangle -> SMD с 25% закругленностью,<br>"
"Target SMD -> SMD с 100% закругленностью.</li>"
"<li><i>Одиночные контактные площадки: </i><br>"
"Для автономных контактных площадок в EAGLE создаются соответствующие библиотечные элементы.</li>"
"<li><i>Переходы:</i><br>"
"Переходы преобразуются следующим образом:<br>"
"Oval -> ROUND, Rectangle -> SQUARE, Ellipse -> ROUND, Round rectangle -> SQUARE and Target -> ROUND.<br>"
"Размер перехода в EAGLE подбирается таким образом, чтобы исключить нарушение минимального технологического допуска.</li>"
"<li><i>Контакты / трассировка: </i><br>"
"В EAGLE координаты проводов, контактных площадок, переходов и т.д. должны в точности совпадать с тем, чтобы быть правильно соединенными. "
"В противном случае создаются неподключенные соединения. В некоторых других системах допускаются отклонения.</li>"
"В других системах допускается если провод пересекает контактную площадку без подключения. "
"В EAGLE это приводит к созданию airwire к следующей точке цепи. В этом случае соединение должно быть разделено с помощью команды SPLIT "
"чтобы создать дополнительные соединительные точки. </li>"
"<li><i>Преобразование заливки: </i><br>"
"В EAGLE есть только один тип заливки (горизонтальных и вертикальных полос штриховки). "
"Различные возможные типы заливки в ACCEL ASCII, как, например, диагональный стиль, "
"преобразуется в этот. <br>"
"Thermals в пределах полигона также всегда горизонтальные и вертикальные. Там нет конкретных тепловых ширин "
"для каждого полигона. Это значение задано в общих настройках EAGLE. <br>"
"Удаление одиночных полигонов также преобразуется в EAGLE, но без порогового значения (только вкл / выкл). </ Li>"
"<li><i>>Преобразование полигонов заливки: </i><br>"
"В EAGLE полигоны заливки всегда сохраняются в незалитом состоянии. Состояние заливки всегда вычисляется динамически "
"с помощью RATSNEST и зависит от текущих установленных параметров.</li>"
"<li><i>Линейки: </i><br>"
"Поскольку модель данных в EAGLE существенно проще, чем в ACCEL ASCII некоторые детали линеек не преобразуются в EAGLE.</li>"
"<li><i>Знаки подключения:</i><br>"
"Входные, выходные и двунаправленные знаки подключения преобразуются в знак Xref в EAGLE.</li>"
"<li><i>Атрибуты слоёв: </i><br>"
"В EAGLE атрибуты слоёв не преобразуются.</li>"
"<li><i>'зоны' (в ACCEL принципиальной схеме): </i><br>"
"'зоны' в принципиальной схеме не преобразуются</li>"
"</ul>"
"В любом случае мы рекомендуем выполнить DRC после импорта для того, чтобы найти и устранить потенциальные проблемы."
};
BatchMode = 0;
if( argc > 1 ) {
BatchMode = 1;
PCADfileName = argv[ 1 ];
Lines = fileread( PcadLines, PCADfileName );
if (Lines == -1) exit(-7113);
SCRIPTfileName = filesetext(PCADfileName, ".scr");
if( Parsing() ) {
exit( 1 );
}
if( PCBDesignToken ) {
exit ("SCRIPT '" + SCRIPTfileName + "'; RATSNEST; WRITE;");
}
exit ("SCRIPT '" + SCRIPTfileName +"' WRITE;");
}
SchematicWindow = 0;
BoardWindow = 0;
if (schematic) {
schematic(S) {
SchematicWindow = 1;
}
}
else if (board) {
board(B) {
BoardWindow = 1;
}
}
else {
dlgMessageBox(TR("Please start from board or schematic editor !"), "OK");
exit(0);
}
string fname = "";
int nowstart = 0;
dlgDialog(TR("Import P-CAD/Altium/Protel (ACCEL ASCII)")) {
dlgLabel(usage);
// www: Remove this when integrated into EAGLE
//dlgLabel("Version " + Version);
dlgLabel(Status, 1);
dlgHBoxLayout {
dlgLabel(TR("Import file:"));
dlgStringEdit(fname);
dlgPushButton(TR("&Browse") + "...") {
fname = GetFile(fname);
}
}
dlgHBoxLayout {
dlgCheckBox(TR("Adjust layer mapping"), IfUpdateLayersMap );
dlgStretch(1);
dlgPushButton("-" + TR("Help") + "...")
dlgDialog(TR("Import P-CAD/Altium/Protel (ACCEL ASCII)") + " - " + TR("Help")) {
dlgHBoxLayout dlgSpacing(900);
dlgHBoxLayout {
dlgVBoxLayout dlgSpacing (500);
dlgTextView( help[LangIdx] );
}
//dlgLabel(help[LangIdx]);
dlgHBoxLayout {
dlgStretch(1);
dlgPushButton("+" + TR("OK"))
dlgAccept();
dlgStretch(1);
}
};
dlgPushButton("+" + TR("Start")) {
nowstart = Execute(fname);
if (nowstart == 1) dlgAccept();
}
dlgPushButton("-" + TR("Cancel")) { dlgReject(); exit(-1); }
}
};
if( PCBDesignToken )
exit ("SCRIPT '" + SCRIPTfileName + "'; RATSNEST");
exit ("SCRIPT '" + SCRIPTfileName +"';");
}