#usage "en:After initial export of P-CAD / Altium and Protel boards and schematics
" "to ACCEL ASCII format you can import your designs herewith into EAGLE.
" // Remove this when it goes into EAGLE " //"Author: apl@cadsoft.de" , "de:
Durch vorherigem Export von P-CAD-/Altium- und Protel-Boards und -Schaltplänen
" "in ACCEL-ASCII-Format können Sie Ihre Designs hiermit in EAGLE importieren.
" //"Autor: apl@cadsoft.de" , "ru:
Импорт из Altium / Protel и P-CAD топологии или схемы в ACCEL ASCII формат.
" "Сделайте экспорт в формат ACCEL ASCII и затем импортируйте этот файл в EAGLE.
" //"Автор: apl@cadsoft.de" 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 %s

';\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 %s

';\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[] = { "General
" "ACCEL ASCII is also known as TangoPRO ASCII or P-CAD ASCII. " "It can be exported from P-CAD, Altium Designer and PROTEL and therefore allows conversion of " "designs in these formats to EAGLE. From Altium Designer only boards can be exported to this format.
" "The conversion to EAGLE works following:
" "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.
" "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.
" "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. " "

" "Layer assignment
" "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\"." "

" "Conversion details:
" "

" , "Allgemeines
" "ACCEL ASCII ist auch unter dem Namen TangoPRO ASCII, oder P-CAD ASCII bekannt. " "Es kann von P-CAD, Altium Designer und PROTEL aus exportiert werden und ermöglicht so die " "Konvertierung von Designs in diesen Formaten in EAGLE-Format. Von Altium Designer aus können nur
" "Boards in dieses Format exportiert werden. Für die Konvertierung in EAGLE ist Folgendes zu beachten:
" "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." "

" "Zuordnung der Layer
" "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." "

" "Details zur Konvertierung:
" "

" , "Общие замечания
" "ACCEL ASCII также известен как TangoPRO ASCII или P-CAD ASCII. " "Он может быть экспортирован из Altium Designer, P-CAD и PROTEL. " "Трансляция в EAGLE работает следующим образом:
" "В начале, в каталоге входного файла, создаётся библиотека EAGLE с тем же именем. " "Она содержит компоненты, которые будут использованы в дальнейшем. Затем создаётся файл EAGLE с тем же именем, содержащий схему или топологию.
" "Для ACCEL ASCII файла схемы \".sch\", создаётся файл EAGLE \".eagle.sch\". " "Преобразование схемы без платы не имеет смысла, так как отсутствует информация," "необходимая для создания платы." "

" "Присвоение значений слоям
" "В зависимости от исходной системы, типы сигналов, припой и другие слои имеют разные названия. " "Соответствие слоёв, заданное по умолчанию, может быть изменено. " "Для этого воспользуйтесь опцией \"Настройка соответствия слоёв\"." "

" "Различия и ограничения, возникающие при преобразовании
" "В связи с различными моделями данных и систем, преобразование имеет ограничения. " "В идеале некоторые конфигурации следует избегать в исходных данных. " "В противном случае потребуется постобработка. Это включает в себя, в частности: " "

" "В любом случае мы рекомендуем выполнить 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 +"';"); }