9622 lines
294 KiB
Plaintext
9622 lines
294 KiB
Plaintext
|
|
#usage "en:<qt><nobr>After initial export of P-CAD / Altium and Protel boards and schematics <br>"
|
|||
|
|
"to ACCEL ASCII format you can import your designs herewith into EAGLE.<br>"
|
|||
|
|
// Remove this when it goes into EAGLE "
|
|||
|
|
//"<author>Author: apl@cadsoft.de</author>"
|
|||
|
|
,
|
|||
|
|
"de:<qt><nobr>Durch vorherigem Export von P-CAD-/Altium- und Protel-Boards und -Schaltplänen <br>"
|
|||
|
|
"in ACCEL-ASCII-Format können Sie Ihre Designs hiermit in EAGLE importieren.<br>"
|
|||
|
|
//"<author>Autor: apl@cadsoft.de</author>"
|
|||
|
|
,
|
|||
|
|
"ru:<qt><nobr>Импорт из Altium / Protel и P-CAD топологии или схемы в ACCEL ASCII формат.<br>"
|
|||
|
|
"Сделайте экспорт в формат ACCEL ASCII и затем импортируйте этот файл в EAGLE.<br>"
|
|||
|
|
//"<author>Автор: apl@cadsoft.de</author>"
|
|||
|
|
|
|||
|
|
string Version = "1.1.6";
|
|||
|
|
|
|||
|
|
// History
|
|||
|
|
//
|
|||
|
|
// 2013-11-12 Ver. 1.1.3 Problem with performance on schematics, skip keyword classToClassRules
|
|||
|
|
// 2014-01-08 Ver. 1.1.4 Info output was corrected
|
|||
|
|
// 2014-04-23 Ver. 1.1.5 Bug with mirrored and some other minor problems were fixed
|
|||
|
|
// 2014-11-14 Ver. 1.1.6 Connection pin - pad was added
|
|||
|
|
|
|||
|
|
#require 6.0300
|
|||
|
|
|
|||
|
|
// Please keep to alpabetic ordering for maintainability !
|
|||
|
|
string Dictionary[] = {
|
|||
|
|
"en\v"
|
|||
|
|
"de\v"
|
|||
|
|
"ru\v",
|
|||
|
|
"Cancel\v"
|
|||
|
|
"Abbrechen\v"
|
|||
|
|
"Отмена\v",
|
|||
|
|
"ACCEL - EAGLE layer mapping\v"
|
|||
|
|
"ACCEL - EAGLE - Layerzuordnung\v"
|
|||
|
|
"ACCEL - EAGLE - соответствие слоёв\v",
|
|||
|
|
"ACCEL\nType\tACCEL\nLayer\tACCEL\nNumber\tEAGLE\nNumber\tEAGLE\nName\v"
|
|||
|
|
"ACCEL\nTyp\tACCEL\nLayer\tACCEL\nNummer\tEAGLE\nNummer\tEAGLE\nName\v"
|
|||
|
|
"ACCEL\nТип\tACCEL\nСлой\tACCEL\nНомер\tEAGLE\nНомер\tEAGLE\nИмя\v",
|
|||
|
|
"Adjust layer mapping\v"
|
|||
|
|
"Layerzuordnung anpassen\v"
|
|||
|
|
"Настройка соответствия слоёв\v",
|
|||
|
|
"&Browse\v"
|
|||
|
|
"&Suchen\v"
|
|||
|
|
"&Обзор\v",
|
|||
|
|
" doesn't exist!\v"
|
|||
|
|
" existiert nicht!\v"
|
|||
|
|
" не существует!\v",
|
|||
|
|
"File \v"
|
|||
|
|
"Datei \v"
|
|||
|
|
"Файл\v",
|
|||
|
|
"Help\v"
|
|||
|
|
"Hilfe\v"
|
|||
|
|
"Помощь\v",
|
|||
|
|
"Import P-CAD/Altium/Protel (ACCEL ASCII)\v"
|
|||
|
|
"Import von P-CAD/Altium/Protel (ACCEL ASCII)\v"
|
|||
|
|
"Импорт из P-CAD/Altium/Protel (ACCEL ASCII)\v",
|
|||
|
|
"Import file:\v"
|
|||
|
|
"Import-Datei:\v"
|
|||
|
|
"Импортируемый файл:\v",
|
|||
|
|
"Load\v"
|
|||
|
|
"Laden\v"
|
|||
|
|
"Загрузить\v",
|
|||
|
|
"Mapping:\v"
|
|||
|
|
"Zuordnung:\v"
|
|||
|
|
"Соответствие:\v",
|
|||
|
|
"Please start from board or schematic editor !\v"
|
|||
|
|
"Bitte starten Sie vom Board- oder Schaltplan-Editor!\v"
|
|||
|
|
"Пожалуйста, начните с редактора топологии или схемы!\v",
|
|||
|
|
"Process sheet \v"
|
|||
|
|
"Bearbeite Sheet \v"
|
|||
|
|
"Обработка листа \v",
|
|||
|
|
"Save\v"
|
|||
|
|
"Speichern\v"
|
|||
|
|
"Сохранить\v",
|
|||
|
|
"Save layer mapping file\v"
|
|||
|
|
"Layerzuordnungs-Datei speichern\v"
|
|||
|
|
"Сохранить соответствие слоёв\v",
|
|||
|
|
"Select import file\v"
|
|||
|
|
"Import-Datei auswählen\v"
|
|||
|
|
"Выберите импортируемый файл\v",
|
|||
|
|
"Select layer mapping file\v"
|
|||
|
|
"Layerzuordnungs-Datei auswählen\v"
|
|||
|
|
"Выберите файл соответствия слоёв\v",
|
|||
|
|
"Start\v"
|
|||
|
|
"Start\v"
|
|||
|
|
"Старт\v",
|
|||
|
|
"Wrong file signature: \v"
|
|||
|
|
"Falsche Datei-Signatur: \v"
|
|||
|
|
"Неправильная сигнатура файла: \v",
|
|||
|
|
"Warnings log\v"
|
|||
|
|
"Warnungen log\v"
|
|||
|
|
"Предупреждения\v",
|
|||
|
|
"-Back\v"
|
|||
|
|
"-Zurück\v"
|
|||
|
|
"-Обратно\v",
|
|||
|
|
"Can't open default.dru !",
|
|||
|
|
"Kann nicht geöffnet werden default.dru !",
|
|||
|
|
"Ошибка при открытии файла default.dru !"
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
string DlgLang = language();
|
|||
|
|
if (DlgLang != "de" && DlgLang != "ru") DlgLang = "en";
|
|||
|
|
int LangIdx = strstr(Dictionary[0], DlgLang) / 3;
|
|||
|
|
|
|||
|
|
// Translate, based on dictionary
|
|||
|
|
string TR(string s) {
|
|||
|
|
string t = lookup(Dictionary, s, LangIdx, '\v');
|
|||
|
|
return t ? t : s;
|
|||
|
|
}
|
|||
|
|
//-----------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// merged string contains input file without comments
|
|||
|
|
string MergedString;
|
|||
|
|
|
|||
|
|
// Header
|
|||
|
|
|
|||
|
|
string Tokens[];
|
|||
|
|
int TokensNumber = 0;
|
|||
|
|
int CurrentChar = 0;
|
|||
|
|
int CurrentToken = 0;
|
|||
|
|
|
|||
|
|
string MajorVersion;
|
|||
|
|
string MinorVersion;
|
|||
|
|
|
|||
|
|
string TimeStampYear;
|
|||
|
|
string TimeStampMonth;
|
|||
|
|
string TimeStampDay;
|
|||
|
|
string TimeStampHour;
|
|||
|
|
string TimeStampMinute;
|
|||
|
|
string TimeStampSecond;
|
|||
|
|
|
|||
|
|
string ProgramName;
|
|||
|
|
string ProgramVersion;
|
|||
|
|
|
|||
|
|
string Copyright;
|
|||
|
|
|
|||
|
|
string HeaderString;
|
|||
|
|
|
|||
|
|
string FileUnits;
|
|||
|
|
|
|||
|
|
string GuidString;
|
|||
|
|
|
|||
|
|
string FileAuthor;
|
|||
|
|
|
|||
|
|
// Library
|
|||
|
|
|
|||
|
|
string LibraryName;
|
|||
|
|
|
|||
|
|
// This is a collection of data for Pads shapes
|
|||
|
|
|
|||
|
|
int PadShapeStyleShapeType[];
|
|||
|
|
string PadShapeStyleDefsWidth[];
|
|||
|
|
string PadShapeStyleDefsHeight[];
|
|||
|
|
int PadShapeStyleDefsPolygon[];
|
|||
|
|
string PadShapeStyleDefsLayer[];
|
|||
|
|
int NrPadShapeStyle = 0;
|
|||
|
|
|
|||
|
|
int PadStyleDefsArray[];
|
|||
|
|
string PadStyleDefsScript[];
|
|||
|
|
int PadShapeAddRotation[];
|
|||
|
|
// Pointer and number of Pad shapes in collection
|
|||
|
|
int PadShapePoiner[];
|
|||
|
|
int NrPadShapes[];
|
|||
|
|
int PadStyleDefsSkip[];
|
|||
|
|
int IfSMD[];
|
|||
|
|
int PadStyleDefsNumber = 0;
|
|||
|
|
|
|||
|
|
int ViaStyleDefsArray[];
|
|||
|
|
string ViaStyleDefsScript[];
|
|||
|
|
string ViaStyleDefsType[];
|
|||
|
|
string ViaStyleDefsDiameter[];
|
|||
|
|
int ViaStyleDefsSkip[];
|
|||
|
|
int ViaStyleDefsNumber = 0;
|
|||
|
|
|
|||
|
|
int TextStyleDefsArray[];
|
|||
|
|
string TextStyleDefFontHeight[];
|
|||
|
|
string TextStyleDefFontStrokeWidth[];
|
|||
|
|
int TextStyleDefsNumber = 0;
|
|||
|
|
|
|||
|
|
int PatternDefExtendedArray[];
|
|||
|
|
int PatternGraphicsDefArray[];
|
|||
|
|
int IfNameDefinedInPattern[];
|
|||
|
|
int IfValueDefinedInPattern[];
|
|||
|
|
int PatternAttributesIndex[];
|
|||
|
|
int PatternNrAttributes[];
|
|||
|
|
string PatternName[];
|
|||
|
|
string PatternOriginalName[];
|
|||
|
|
string PatternGraphicsDefName[];
|
|||
|
|
string PatternDefaultVariantName[];
|
|||
|
|
int PatternDefExtendedNumber = 0;
|
|||
|
|
|
|||
|
|
int NrPadPinMap = 0;
|
|||
|
|
string PadPinMapNum[];
|
|||
|
|
string PadPinMapPinRef[];
|
|||
|
|
|
|||
|
|
int CompDefsArray[];
|
|||
|
|
int CompDefsNumber = 0;
|
|||
|
|
int PadPinMapRef[];
|
|||
|
|
int PadPinMapCount[];
|
|||
|
|
|
|||
|
|
int NrAttributes = 0;
|
|||
|
|
string AttributesName[];
|
|||
|
|
int AttributesIndex[];
|
|||
|
|
|
|||
|
|
int SymbolDefsArray[];
|
|||
|
|
string SymbolsName[];
|
|||
|
|
string OriginalSymbolsName[];
|
|||
|
|
int IfNameDefinedInSymbol[];
|
|||
|
|
int IfValueDefinedInSymbol[];
|
|||
|
|
int SymbolAttributesIndex[];
|
|||
|
|
int SymbolNrAttributes[];
|
|||
|
|
int SymbolDefsNumber = 0;
|
|||
|
|
|
|||
|
|
string DevicesName[];
|
|||
|
|
string SymbolDevicesName[];
|
|||
|
|
int NrSymbolDevices = 0;
|
|||
|
|
|
|||
|
|
int NrPadsOnBoard = 0;
|
|||
|
|
int PadOnBoardIndex[];
|
|||
|
|
string PadOnBoardDefs[];
|
|||
|
|
|
|||
|
|
int NrDummyDevices = 0;
|
|||
|
|
string DummyDevices[];
|
|||
|
|
|
|||
|
|
// Netlist
|
|||
|
|
|
|||
|
|
string NetlistName;
|
|||
|
|
|
|||
|
|
// PCBDesign
|
|||
|
|
|
|||
|
|
int PCBDesignToken = 0;
|
|||
|
|
string PcbDesignName = "";
|
|||
|
|
|
|||
|
|
int LayerDefsArray[];
|
|||
|
|
string LayersName[];
|
|||
|
|
int LayersCode[];
|
|||
|
|
string LayersType[];
|
|||
|
|
int LayerDefsNumber = 0;
|
|||
|
|
|
|||
|
|
int PCBDesignMultiLayerToken = 0;
|
|||
|
|
|
|||
|
|
int PCBLayerContentsArray[];
|
|||
|
|
int NrPCBLayerContents = 0;
|
|||
|
|
|
|||
|
|
// schematicDesign
|
|||
|
|
|
|||
|
|
int SchematicDesignToken = 0;
|
|||
|
|
string SchematicDesignName = "";
|
|||
|
|
|
|||
|
|
int SchTitleSheet = 0;
|
|||
|
|
|
|||
|
|
int SheetsArray[];
|
|||
|
|
int NrSheets = 0;
|
|||
|
|
|
|||
|
|
int CompInstances[];
|
|||
|
|
int NrCompInstances = 0;
|
|||
|
|
string CompInstancesName[];
|
|||
|
|
string CompInstancesRef[];
|
|||
|
|
string CompValue[];
|
|||
|
|
|
|||
|
|
int NrNodes = 0;
|
|||
|
|
string NodeElementName[];
|
|||
|
|
string NodePadName[];
|
|||
|
|
|
|||
|
|
int NrNets = 0;
|
|||
|
|
string NetNames[];
|
|||
|
|
int NodeRef[];
|
|||
|
|
int NrNetNodes[];
|
|||
|
|
|
|||
|
|
int NrLabels = 0;
|
|||
|
|
string XCoordLabels[];
|
|||
|
|
string YCoordLabels[];
|
|||
|
|
string TypeLabels[];
|
|||
|
|
string NetNameRef[];
|
|||
|
|
string IsLabelFlipped[];
|
|||
|
|
string LabelRotation[];
|
|||
|
|
|
|||
|
|
// Misc
|
|||
|
|
|
|||
|
|
int DebugMessage = 1;
|
|||
|
|
|
|||
|
|
int IfPinText = 0;
|
|||
|
|
|
|||
|
|
string LabelTextHeight = "0.07inch";
|
|||
|
|
string NameValueTextHeight = "0.05inch";
|
|||
|
|
|
|||
|
|
int IfUpdateLayersMap = 0;
|
|||
|
|
|
|||
|
|
string PCADfileName;
|
|||
|
|
string SCRIPTfileName;
|
|||
|
|
string WarningsLogFileName;
|
|||
|
|
|
|||
|
|
string ext[] = { "*.asc", "*.asc" };
|
|||
|
|
enum { PCB, SCH };
|
|||
|
|
int FileType = PCB;
|
|||
|
|
//string FileInfo = "Select a import file.";
|
|||
|
|
|
|||
|
|
int Lines;
|
|||
|
|
string PcadLines[];
|
|||
|
|
|
|||
|
|
string Status; // = "First select a ACCEL_ASCII file, then click on Start.";
|
|||
|
|
|
|||
|
|
int SchematicWindow = 0;
|
|||
|
|
int BoardWindow = 0;
|
|||
|
|
|
|||
|
|
real WiresPointX[];
|
|||
|
|
real WiresPointY[];
|
|||
|
|
string WiresNet[];
|
|||
|
|
int NrWiresPoint = 0;
|
|||
|
|
|
|||
|
|
int UseExternalText = 0;
|
|||
|
|
string ExternalText = "";
|
|||
|
|
|
|||
|
|
int BatchMode = 0;
|
|||
|
|
|
|||
|
|
string DEFAULT_WIRE_WIDTH_BOARD = "10mil";
|
|||
|
|
string DEFAULT_WIRE_WIDTH_SCHEMATIC = "6mil";
|
|||
|
|
|
|||
|
|
real ROUNDNESS = 3.0;
|
|||
|
|
|
|||
|
|
string DRUFileName;
|
|||
|
|
|
|||
|
|
int Vers = 1;
|
|||
|
|
int SubVers = 1;
|
|||
|
|
|
|||
|
|
string LogLines[];
|
|||
|
|
int NrLogLines;
|
|||
|
|
|
|||
|
|
void WriteLog( string message )
|
|||
|
|
{
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "%s", message );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
LogLines[ NrLogLines++ ] = message;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string GetFile(string fname)
|
|||
|
|
{
|
|||
|
|
PCADfileName = fname;
|
|||
|
|
if (fname) PCADfileName = filesetext(fname,"/");
|
|||
|
|
string f[];
|
|||
|
|
int fcnt;
|
|||
|
|
|
|||
|
|
if (fname) fcnt = fileglob(f, PCADfileName); // 2008-10-21 check file name
|
|||
|
|
|
|||
|
|
if( !fcnt ) {
|
|||
|
|
PCADfileName = dlgFileOpen(TR("Select import file"), fname,
|
|||
|
|
ext[FileType] + " *.pcb *.ASC *.PCB *.sch *.txt *.TXT;; (*.*)");
|
|||
|
|
if (!PCADfileName) return fname;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Lines = fileread(PcadLines, PCADfileName);
|
|||
|
|
if (Lines == -1) exit(-7113);
|
|||
|
|
SCRIPTfileName = filesetext(PCADfileName, ".scr");
|
|||
|
|
return PCADfileName;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string ShowRefLayer[];
|
|||
|
|
|
|||
|
|
int CntlayerDef = -1;
|
|||
|
|
string RefLayerDef[];
|
|||
|
|
string RefLayerNum[];
|
|||
|
|
string RefLayerType[];
|
|||
|
|
string PcadEagleLayerRefName[];
|
|||
|
|
string PcadEagleLayerRefNum[];
|
|||
|
|
|
|||
|
|
void LoadCrossRef( string CrossfileName )
|
|||
|
|
{
|
|||
|
|
if (!CrossfileName) {
|
|||
|
|
CrossfileName = dlgFileOpen(TR("Select layer mapping file"), PCADfileName + ".lmp", "*.lmp");
|
|||
|
|
if (!CrossfileName) return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CntlayerDef = fileread(ShowRefLayer, CrossfileName);
|
|||
|
|
|
|||
|
|
if( CntlayerDef < 0 ) {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# info: CrossfileName %s not found\n", CrossfileName );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string w[];
|
|||
|
|
for (int n = 0; n < CntlayerDef; n++) {
|
|||
|
|
strsplit(w, ShowRefLayer[n], '\t');
|
|||
|
|
RefLayerType[n] = w[0];
|
|||
|
|
RefLayerDef[n] = w[1];
|
|||
|
|
RefLayerNum[n] = w[2];
|
|||
|
|
PcadEagleLayerRefNum[n] = w[3];
|
|||
|
|
PcadEagleLayerRefName[n] = w[4];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
//printf( "# info: CrossfileName %s loaded\n", CrossfileName );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void SaveCrossRef( void )
|
|||
|
|
{
|
|||
|
|
string CrossfileName = dlgFileSave(TR("Save layer mapping file"), PCADfileName + ".lmp", "*.lmp");
|
|||
|
|
|
|||
|
|
if (!CrossfileName) return;
|
|||
|
|
|
|||
|
|
output(CrossfileName, "wt") {
|
|||
|
|
for (int n = 0; n < CntlayerDef; n++) {
|
|||
|
|
printf("%s\t%s\t%s\t%s\t%s\n",
|
|||
|
|
RefLayerType[n],
|
|||
|
|
RefLayerDef[n],
|
|||
|
|
RefLayerNum[n],
|
|||
|
|
PcadEagleLayerRefNum[n],
|
|||
|
|
PcadEagleLayerRefName[n]
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function updates dialog window to show progress
|
|||
|
|
|
|||
|
|
void UpdateProgress( string info )
|
|||
|
|
{
|
|||
|
|
if( !BatchMode ) {
|
|||
|
|
sprintf( Status, "%s", info);
|
|||
|
|
dlgRedisplay();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function replaces characters which have
|
|||
|
|
// special meaning in Eagle. Returns updated string
|
|||
|
|
|
|||
|
|
string ReplaceNotSupportedCharacters( string InputStr )
|
|||
|
|
{
|
|||
|
|
string OutputStr;
|
|||
|
|
|
|||
|
|
int length = strlen( InputStr );
|
|||
|
|
|
|||
|
|
for( int i = 0; i < length; i++ ) {
|
|||
|
|
switch( InputStr[ i ] ) {
|
|||
|
|
case '\\':
|
|||
|
|
OutputStr[ i ] = '/';
|
|||
|
|
break;
|
|||
|
|
case ' ':
|
|||
|
|
OutputStr[ i ] = '_';
|
|||
|
|
break;
|
|||
|
|
case '(':
|
|||
|
|
OutputStr[ i ] = '_';
|
|||
|
|
break;
|
|||
|
|
case ')':
|
|||
|
|
OutputStr[ i ] = '_';
|
|||
|
|
break;
|
|||
|
|
case '[':
|
|||
|
|
OutputStr[ i ] = '_';
|
|||
|
|
break;
|
|||
|
|
case ']':
|
|||
|
|
OutputStr[ i ] = '_';
|
|||
|
|
break;
|
|||
|
|
case '\'':
|
|||
|
|
OutputStr[ i ] = '_';
|
|||
|
|
break;
|
|||
|
|
// case '%':
|
|||
|
|
// OutputStr[ i ] = '_';
|
|||
|
|
// break;
|
|||
|
|
default:
|
|||
|
|
OutputStr[ i ] = InputStr[ i ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( OutputStr );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function replaces characters which have
|
|||
|
|
// special meaning in Eagle for text string. Returns updated string
|
|||
|
|
|
|||
|
|
string ReplaceNotSupportedCharactersText( string InputStr )
|
|||
|
|
{
|
|||
|
|
string OutputStr;
|
|||
|
|
|
|||
|
|
int length = strlen( InputStr );
|
|||
|
|
|
|||
|
|
int j = 0;
|
|||
|
|
|
|||
|
|
for( int i = 0; i < length; i++ ) {
|
|||
|
|
switch( InputStr[ i ] ) {
|
|||
|
|
case '\'':
|
|||
|
|
OutputStr[ j ] = '\'';
|
|||
|
|
j++;
|
|||
|
|
OutputStr[ j ] = '\'';
|
|||
|
|
break;
|
|||
|
|
case '\\':
|
|||
|
|
if( ( InputStr[ i + 1 ] == 'n' ) ||
|
|||
|
|
( InputStr[ i + 1 ] == '\\' ) ) {
|
|||
|
|
OutputStr[ j ] = InputStr[ i ];
|
|||
|
|
i++;
|
|||
|
|
j++;
|
|||
|
|
OutputStr[ j ] = InputStr[ i ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
i++;
|
|||
|
|
j--;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
OutputStr[ j ] = InputStr[ i ];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
j++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( OutputStr );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function merges all lines and removes comments
|
|||
|
|
void MergeLines( void )
|
|||
|
|
{
|
|||
|
|
for( int j = 0; j < Lines; j++ ) {
|
|||
|
|
if ( strchr( PcadLines[ j ], ';' ) >= 0 ) {
|
|||
|
|
string currentLine = PcadLines[ j ];
|
|||
|
|
int lineLength = strlen( currentLine );
|
|||
|
|
int flag = 0;
|
|||
|
|
for( int i = 0; i < lineLength; i++ ) {
|
|||
|
|
if ( currentLine[ i ] == '"' )
|
|||
|
|
flag = !flag;
|
|||
|
|
if ( currentLine[ i ] == ';' && !flag) {
|
|||
|
|
currentLine[ i ] = '\0';
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
PcadLines[ j ] = currentLine;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// Merge them all in one step !
|
|||
|
|
MergedString = strjoin(PcadLines, ' ');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function create token for string inside double quotas
|
|||
|
|
|
|||
|
|
void ProcessDoubleQuotas( int lineLength )
|
|||
|
|
{
|
|||
|
|
string tmpString;
|
|||
|
|
int strLength = 0;
|
|||
|
|
|
|||
|
|
tmpString[ strLength ] = MergedString[ CurrentChar ];
|
|||
|
|
strLength++;
|
|||
|
|
|
|||
|
|
CurrentChar++;
|
|||
|
|
|
|||
|
|
while( CurrentChar < lineLength ) {
|
|||
|
|
tmpString[ strLength ] = MergedString[ CurrentChar ];
|
|||
|
|
strLength++;
|
|||
|
|
|
|||
|
|
if( MergedString[ CurrentChar ] == '"' ) {
|
|||
|
|
if( MergedString[ CurrentChar - 1 ] != '\\' ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
tmpString[ strLength - 1 ] = '"';
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentChar++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tmpString[ strLength ] = 0;
|
|||
|
|
|
|||
|
|
Tokens[ TokensNumber ] = tmpString;
|
|||
|
|
TokensNumber++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function create token for keyword or variable name
|
|||
|
|
|
|||
|
|
void ProcessString( int lineLength )
|
|||
|
|
{
|
|||
|
|
string tmpString;
|
|||
|
|
|
|||
|
|
while( CurrentChar < lineLength ) {
|
|||
|
|
switch( MergedString[ CurrentChar ] ) {
|
|||
|
|
case ' ':
|
|||
|
|
case '(':
|
|||
|
|
case ')':
|
|||
|
|
case '"':
|
|||
|
|
CurrentChar--;
|
|||
|
|
Tokens[ TokensNumber ] = tmpString;
|
|||
|
|
TokensNumber++;
|
|||
|
|
return;
|
|||
|
|
default:
|
|||
|
|
tmpString = tmpString + MergedString[ CurrentChar ];
|
|||
|
|
CurrentChar++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Tokens[ TokensNumber ] = tmpString;
|
|||
|
|
TokensNumber++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function creates array of strings from MergedString
|
|||
|
|
|
|||
|
|
void SplitToTokens( void )
|
|||
|
|
{
|
|||
|
|
UpdateProgress( TR("Parsing") );
|
|||
|
|
|
|||
|
|
int lineLength = strlen( MergedString );
|
|||
|
|
|
|||
|
|
CurrentChar = 0;
|
|||
|
|
|
|||
|
|
while( CurrentChar < lineLength ) {
|
|||
|
|
switch( MergedString[ CurrentChar ] ) {
|
|||
|
|
case ' ':
|
|||
|
|
break;
|
|||
|
|
case '(':
|
|||
|
|
Tokens[ TokensNumber ] = "(";
|
|||
|
|
TokensNumber++;
|
|||
|
|
break;
|
|||
|
|
case ')':
|
|||
|
|
Tokens[ TokensNumber ] = ")";
|
|||
|
|
TokensNumber++;
|
|||
|
|
break;
|
|||
|
|
case '"':
|
|||
|
|
ProcessDoubleQuotas( lineLength );
|
|||
|
|
|
|||
|
|
//sprintf(Status, "Token %d:%s", TokensNumber, Tokens[ TokensNumber ] );
|
|||
|
|
//dlgRedisplay();
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
ProcessString( lineLength );
|
|||
|
|
|
|||
|
|
//sprintf(Status, "Token %d:%s", TokensNumber, Tokens[ TokensNumber ] );
|
|||
|
|
//dlgRedisplay();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentChar++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function check if dbUnit equal to mil, mm or in.
|
|||
|
|
// Returns 0 if dbUnit is correct
|
|||
|
|
// otherwise returns 1
|
|||
|
|
|
|||
|
|
int checkDbUnits( string fileUnits )
|
|||
|
|
{
|
|||
|
|
if( fileUnits == "mil") return( 0 );
|
|||
|
|
if( fileUnits == "mm") return( 0 );
|
|||
|
|
if( fileUnits == "in") return( 0 );
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Removes double quotas at the begining and
|
|||
|
|
// the end of string if any. Return new string
|
|||
|
|
|
|||
|
|
string RemoveDoubleQuotas( string inputString )
|
|||
|
|
{
|
|||
|
|
string outputString = "";
|
|||
|
|
|
|||
|
|
int startPos = 0;
|
|||
|
|
int length = strlen( inputString );
|
|||
|
|
|
|||
|
|
if( length > 0 ) {
|
|||
|
|
if( inputString[ length - 1 ] == '"' ) {
|
|||
|
|
length--;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( inputString[ 0 ] == '"' ) {
|
|||
|
|
startPos = 1;
|
|||
|
|
length--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for( int i = 0; i < length; i++ ) {
|
|||
|
|
outputString[ i ] = inputString[ startPos + i ];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( outputString );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Check if the first word matches the ACCEL_ASCII signature.
|
|||
|
|
// Quite tolerant because many different file types are common.
|
|||
|
|
|
|||
|
|
int CheckSignature(void)
|
|||
|
|
{
|
|||
|
|
return strxstr(strupr(Tokens[0]), "[PCAD|ACCEL|TANGOPRO].ASCII") >= 0 ? 0 : 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process header of file.
|
|||
|
|
// If header processed successfully function returns 0
|
|||
|
|
// otherwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessAsciiHeader( void )
|
|||
|
|
{
|
|||
|
|
UpdateProgress( TR("ProcessAsciiHeader") );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "asciiVersion" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
MajorVersion = Tokens[ CurrentToken ];
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
MinorVersion = Tokens[ CurrentToken ];
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] != ")" ) {
|
|||
|
|
dlgMessageBox( "Error in asciiVersion", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "timeStamp" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
TimeStampYear = Tokens[ CurrentToken ];
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
TimeStampMonth = Tokens[ CurrentToken ];
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
TimeStampDay = Tokens[ CurrentToken ];
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
TimeStampHour = Tokens[ CurrentToken ];
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
TimeStampMinute = Tokens[ CurrentToken ];
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
TimeStampSecond = Tokens[ CurrentToken ];
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] != ")" ) {
|
|||
|
|
dlgMessageBox( "Error in timeStamp", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "program" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
ProgramName = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
ProgramVersion = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] != ")" ) {
|
|||
|
|
dlgMessageBox( "Error in program keyword", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "copyright" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
Copyright = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] != ")" ) {
|
|||
|
|
dlgMessageBox( "Error in copyright keyword", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "headerString" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
HeaderString = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] != ")" ) {
|
|||
|
|
dlgMessageBox( "Error in header string keyword", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "fileUnits" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
FileUnits = strlwr( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
if( checkDbUnits( FileUnits ) ) {
|
|||
|
|
dlgMessageBox( "Unknown fileUnits " + FileUnits, "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] != ")" ) {
|
|||
|
|
dlgMessageBox( "Error in fileUnits", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "guidString" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
GuidString = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] != ")" ) {
|
|||
|
|
dlgMessageBox( "Error in header guidString keyword", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "fileAuthor" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
FileAuthor = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] != ")" ) {
|
|||
|
|
dlgMessageBox( "Error in header fileAuthor keyword", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unknown keyword in header " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in header " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process padStyleDef keyword.
|
|||
|
|
// If padStyleDef processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessPadStyleDef( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
PadStyleDefsArray[ PadStyleDefsNumber ] = CurrentToken;
|
|||
|
|
|
|||
|
|
PadStyleDefsNumber++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process viaStyleDef keyword.
|
|||
|
|
// If viaStyleDef processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessViaStyleDef( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
ViaStyleDefsArray[ ViaStyleDefsNumber ] = CurrentToken;
|
|||
|
|
|
|||
|
|
ViaStyleDefsNumber++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process textStyleDef keyword.
|
|||
|
|
// If textStyleDef processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessTextStyleDef( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
TextStyleDefsArray[ TextStyleDefsNumber ] = CurrentToken;
|
|||
|
|
|
|||
|
|
TextStyleDefsNumber++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 1 ] == "fontHeight" ) {
|
|||
|
|
TextStyleDefFontHeight[ TextStyleDefsNumber - 1 ] = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
TextStyleDefFontHeight[ TextStyleDefsNumber - 1 ] =
|
|||
|
|
TextStyleDefFontHeight[ TextStyleDefsNumber - 1 ] + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken + 1 ] == "strokeWidth" ) {
|
|||
|
|
TextStyleDefFontStrokeWidth[ TextStyleDefsNumber - 1 ] = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
TextStyleDefFontStrokeWidth[ TextStyleDefsNumber - 1 ] =
|
|||
|
|
TextStyleDefFontStrokeWidth[ TextStyleDefsNumber - 1 ] + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process patternDefExtended keyword.
|
|||
|
|
// If patternDefExtended processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessPatternDefExtended( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
int patternDefExtendedToken = CurrentToken;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 1 ] == "patternGraphicsDef" ) {
|
|||
|
|
PatternDefExtendedArray[ PatternDefExtendedNumber ] = patternDefExtendedToken;
|
|||
|
|
PatternGraphicsDefArray[ PatternDefExtendedNumber ] = CurrentToken + 1;
|
|||
|
|
|
|||
|
|
PatternDefExtendedNumber++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process compDef keyword.
|
|||
|
|
// If compDef processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessCompDef( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
CompDefsArray[ CompDefsNumber ] = CurrentToken;
|
|||
|
|
|
|||
|
|
CompDefsNumber++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process patternDef keyword.
|
|||
|
|
// If patternDef processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessPatternDef( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
//PatternDefsArray[ PatternDefsNumber ] = CurrentToken;
|
|||
|
|
|
|||
|
|
//PatternDefsNumber++;
|
|||
|
|
|
|||
|
|
PatternDefExtendedArray[ PatternDefExtendedNumber ] = CurrentToken;
|
|||
|
|
PatternGraphicsDefArray[ PatternDefExtendedNumber ] = -1;
|
|||
|
|
PatternGraphicsDefName[ PatternDefExtendedNumber ] = "";
|
|||
|
|
|
|||
|
|
PatternDefExtendedNumber++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process symbolDef keyword.
|
|||
|
|
// If symbolDef processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessSymbolDef( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
SymbolDefsArray[ SymbolDefsNumber ] = CurrentToken;
|
|||
|
|
|
|||
|
|
SymbolDefsNumber++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process library keyword.
|
|||
|
|
// If library processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessLibrary( void )
|
|||
|
|
{
|
|||
|
|
PadStyleDefsNumber = 0;
|
|||
|
|
ViaStyleDefsNumber = 0;
|
|||
|
|
TextStyleDefsNumber = 0;
|
|||
|
|
PatternDefExtendedNumber = 0;
|
|||
|
|
CompDefsNumber = 0;
|
|||
|
|
//PatternDefsNumber = 0;
|
|||
|
|
SymbolDefsNumber = 0;
|
|||
|
|
|
|||
|
|
UpdateProgress( TR("ProcessLibrary") );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
LibraryName = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "padStyleDef" ) {
|
|||
|
|
if( ProcessPadStyleDef() ) {
|
|||
|
|
dlgMessageBox( "Error in padStyleDef processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "viaStyleDef" ) {
|
|||
|
|
if( ProcessViaStyleDef() ) {
|
|||
|
|
dlgMessageBox( "Error in viaStyleDef processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "textStyleDef" ) {
|
|||
|
|
if( ProcessTextStyleDef() ) {
|
|||
|
|
dlgMessageBox( "Error in textStyleDef processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "patternDefExtended" ) {
|
|||
|
|
if( ProcessPatternDefExtended() ) {
|
|||
|
|
dlgMessageBox( "Error in patternDefExtended processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "compDef" ) {
|
|||
|
|
if( ProcessCompDef() ) {
|
|||
|
|
dlgMessageBox( "Error in compDef processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "patternDef" ) {
|
|||
|
|
if( ProcessPatternDef() ) {
|
|||
|
|
dlgMessageBox( "Error in patternDef processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "symbolDef" ) {
|
|||
|
|
if( ProcessSymbolDef() ) {
|
|||
|
|
dlgMessageBox( "Error in symbolDef processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unknown keyword in library " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
|
|||
|
|
/*string info;
|
|||
|
|
|
|||
|
|
sprintf( info, "PadStyleDefsNumber = %d ViaStyleDefsNumber = %d",
|
|||
|
|
PadStyleDefsNumber, ViaStyleDefsNumber );
|
|||
|
|
dlgMessageBox( info, "OK");
|
|||
|
|
|
|||
|
|
sprintf( info, "TextStyleDefsNumber = %d PatternDefExtendedNumber = %d",
|
|||
|
|
TextStyleDefsNumber, PatternDefExtendedNumber );
|
|||
|
|
dlgMessageBox( info, "OK");
|
|||
|
|
|
|||
|
|
sprintf( info, "CompDefsNumber = %d PatternDefsNumber = %d SymbolDefsNumber = %d",
|
|||
|
|
CompDefsNumber, PatternDefsNumber, SymbolDefsNumber );
|
|||
|
|
dlgMessageBox( info, "OK");*/
|
|||
|
|
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in library " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function skip all internal data and return.
|
|||
|
|
|
|||
|
|
int SkipThisItem( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process globalAttrs keyword.
|
|||
|
|
// If globalAttrs processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessGlobalAttrs( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process compInst keyword.
|
|||
|
|
// If compInst processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessCompInst( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
CompInstances[ NrCompInstances ] = CurrentToken;
|
|||
|
|
|
|||
|
|
CompInstancesName[ NrCompInstances ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) );
|
|||
|
|
|
|||
|
|
NrCompInstances++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 1 ] == "compRef" ) {
|
|||
|
|
CompInstancesRef[ NrCompInstances - 1 ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 2 ] ) );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken + 1 ] == "compValue" ) {
|
|||
|
|
CompValue[ NrCompInstances - 1 ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 2 ] ) );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process net keyword.
|
|||
|
|
// If net processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessNet( void )
|
|||
|
|
{
|
|||
|
|
int nodesCount = 0;
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
NetNames[ NrNets ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) );
|
|||
|
|
NodeRef[ NrNets ] = NrNodes;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "node" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
NodeElementName[ NrNodes ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) );
|
|||
|
|
CurrentToken++;
|
|||
|
|
NodePadName[ NrNodes ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) );
|
|||
|
|
CurrentToken++;
|
|||
|
|
NrNodes++;
|
|||
|
|
nodesCount++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
if( nodesCount ) {
|
|||
|
|
NrNetNodes[ NrNets ] = nodesCount;
|
|||
|
|
NrNets++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process netClass keyword.
|
|||
|
|
// If netClass processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessNetClass( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process netlist keyword.
|
|||
|
|
// If netlist processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessNetlist( void )
|
|||
|
|
{
|
|||
|
|
UpdateProgress( TR("ProcessNetlist") );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
NetlistName = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "globalAttrs" ) {
|
|||
|
|
if( ProcessGlobalAttrs() ) {
|
|||
|
|
dlgMessageBox( "Error in globalAttrs processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "compInst" ) {
|
|||
|
|
if( ProcessCompInst() ) {
|
|||
|
|
dlgMessageBox( "Error in compInst processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "net" ) {
|
|||
|
|
if( ProcessNet() ) {
|
|||
|
|
dlgMessageBox( "Error in net processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "netClass" ) {
|
|||
|
|
if( ProcessNetClass() ) {
|
|||
|
|
dlgMessageBox( "Error in net processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "classToClassRules" ) { // 2013-05-28 classToClassRules
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in net processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unknown keyword in netlist: " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in netlist " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process pcbDesignHeader keyword.
|
|||
|
|
// If pcbDesignHeader processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessPcbDesignHeader( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process layerDef keyword.
|
|||
|
|
// If layerDef processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessLayerDef( void )
|
|||
|
|
{
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
LayersName[ LayerDefsNumber ] = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "layerNum" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
LayersCode[ LayerDefsNumber ] = strtol( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] != ")" ) {
|
|||
|
|
dlgMessageBox( "Error in layerNum", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "layerType" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
LayersType[ LayerDefsNumber ] = Tokens[ CurrentToken ];
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] != ")" ) {
|
|||
|
|
dlgMessageBox( "Error in layerType", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "attr" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in LayerDef attr processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "fieldSetRef" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in LayerDef fieldSetRef processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "netNameRef" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in LayerDef netNameRef processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "layerBias" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in LayerDef layerBias processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unknown keyword in ProcessLayerDef: " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
LayerDefsArray[ LayerDefsNumber ] = CurrentToken;
|
|||
|
|
|
|||
|
|
LayerDefsNumber++;
|
|||
|
|
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in ProcessLayerDef " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process multiLayer keyword.
|
|||
|
|
// If multiLayer processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessMultiLayer( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
PCBDesignMultiLayerToken = CurrentToken;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pad" ) {
|
|||
|
|
PadOnBoardIndex[ NrPadsOnBoard ] = CurrentToken;
|
|||
|
|
NrPadsOnBoard++;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in ProcessMultiLayer processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
level--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
return( 0 );
|
|||
|
|
|
|||
|
|
/*level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}*/
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in ProcessMultiLayer " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process layerContents keyword.
|
|||
|
|
// If layerContents processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessLayerContents( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
PCBLayerContentsArray[ NrPCBLayerContents ] = CurrentToken;
|
|||
|
|
|
|||
|
|
NrPCBLayerContents++;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process pcbDesign keyword.
|
|||
|
|
// If pcbDesign processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessPcbDesign( void )
|
|||
|
|
{
|
|||
|
|
UpdateProgress( TR("ProcessPcbDesign") );
|
|||
|
|
|
|||
|
|
PCBDesignToken = CurrentToken;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
PcbDesignName = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pcbDesignHeader" ) {
|
|||
|
|
if( ProcessPcbDesignHeader() ) {
|
|||
|
|
dlgMessageBox( "Error in ProcessPcbDesignHeader processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "layerDef" ) {
|
|||
|
|
if( ProcessLayerDef() ) {
|
|||
|
|
dlgMessageBox( "Error in ProcessLayerDef processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "multiLayer" ) {
|
|||
|
|
if( ProcessMultiLayer() ) {
|
|||
|
|
dlgMessageBox( "Error in ProcessMultiLayer processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "layerContents" ) {
|
|||
|
|
if( ProcessLayerContents() ) {
|
|||
|
|
dlgMessageBox( "Error in ProcessLayerContents processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pcbPrintSettings" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in pcbPrintSettings processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "drillSymSettings" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in drillSymSettings processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "gerberSettings" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in gerberSettings processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "ncDrillSettings" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in ncDrillSettings processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "programState" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in programState processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "layerSets" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in layerSets processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "layerPairs" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in layerPairs processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "displayDrawOrder" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in displayDrawOrder processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "reportSettings" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in reportSettings processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "odbSettings" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in odbSettings processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "layersStackup" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in layersStackup processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unknown keyword in ProcessPcbDesign: " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in ProcessPcbDesign " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int ProcessSchDesignHeader( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int ProcessDesignInfo( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int ProcessSchTitleSheet( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SchTitleSheet = CurrentToken;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int ProcessSheet( void )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
SheetsArray[ NrSheets ] = CurrentToken;
|
|||
|
|
|
|||
|
|
NrSheets++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function process schematicDesign keyword.
|
|||
|
|
// If schematicDesign processed successfully function returns 0
|
|||
|
|
// oterwise returns 1
|
|||
|
|
|
|||
|
|
int ProcessSchematicDesign( void )
|
|||
|
|
{
|
|||
|
|
UpdateProgress( TR("ProcessSchematicDesign") );
|
|||
|
|
|
|||
|
|
SchematicDesignToken = CurrentToken;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
SchematicDesignName = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "schDesignHeader" ) {
|
|||
|
|
if( ProcessSchDesignHeader() ) {
|
|||
|
|
dlgMessageBox( "Error in ProcessSchDesignHeader processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "designInfo" ) {
|
|||
|
|
if( ProcessDesignInfo() ) {
|
|||
|
|
dlgMessageBox( "Error in ProcessDesignInfo processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "titleSheet" ) {
|
|||
|
|
if( ProcessSchTitleSheet() ) {
|
|||
|
|
dlgMessageBox( "Error in ProcessSchTitleSheet processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "sheet" ) {
|
|||
|
|
if( ProcessSheet() ) {
|
|||
|
|
dlgMessageBox( "Error in ProcessLayerContents processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "schematicPrintSettings" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in schematicPrintSettings processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "programState" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in programState processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "reportSettings" ) {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
dlgMessageBox( "Error in reportSettings processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unknown keyword in ProcessSchematicDesign: " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in ProcessSchematicDesign " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function parse tree starting from
|
|||
|
|
// top keywords. If processed seccesfully returns 0,
|
|||
|
|
// if signature is wrong returns 1
|
|||
|
|
|
|||
|
|
int ParseTree( void )
|
|||
|
|
{
|
|||
|
|
if( CheckSignature() ) {
|
|||
|
|
dlgMessageBox( TR("Wrong file signature: ") + Tokens[ 0 ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "asciiHeader" ) {
|
|||
|
|
if( ProcessAsciiHeader() ) {
|
|||
|
|
dlgMessageBox( "Error in file header processing", "OK");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "library" ) {
|
|||
|
|
if( ProcessLibrary() ) {
|
|||
|
|
dlgMessageBox( "Error in library processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "netlist" ) {
|
|||
|
|
if( ProcessNetlist() ) {
|
|||
|
|
dlgMessageBox( "Error in netlist processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pcbDesign" ) {
|
|||
|
|
if( ProcessPcbDesign() ) {
|
|||
|
|
dlgMessageBox( "Error in pcbDesign processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "schematicDesign" ) {
|
|||
|
|
if( ProcessSchematicDesign() ) {
|
|||
|
|
dlgMessageBox( "Error in schematicDesign processing", "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword: " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
|
|||
|
|
if( 1 ) {
|
|||
|
|
dlgMessageBox( "debug: " + Tokens[ CurrentToken - 2 ] +
|
|||
|
|
Tokens[ CurrentToken - 1 ] +
|
|||
|
|
Tokens[ CurrentToken ] +
|
|||
|
|
Tokens[ CurrentToken + 1 ] +
|
|||
|
|
Tokens[ CurrentToken + 2 ], "OK");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string ConvertUnits( string textValue, string unitValue )
|
|||
|
|
{
|
|||
|
|
if( unitValue == "" ) {
|
|||
|
|
if( FileUnits == "mil") {
|
|||
|
|
real rValue = strtod( textValue );
|
|||
|
|
string retValue;
|
|||
|
|
sprintf( retValue, "%f", round( rValue ) );
|
|||
|
|
return( retValue );
|
|||
|
|
}
|
|||
|
|
return( textValue );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( unitValue == "mil") {
|
|||
|
|
if( FileUnits == "mil") {
|
|||
|
|
real rValue = strtod( textValue );
|
|||
|
|
string retValue;
|
|||
|
|
sprintf( retValue, "%f", round( rValue ) );
|
|||
|
|
return( retValue );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( FileUnits == "mm") {
|
|||
|
|
real rValue = strtod( textValue );
|
|||
|
|
string retValue;
|
|||
|
|
sprintf( retValue, "%f", rValue * 25.4 / 1000.0 );
|
|||
|
|
return( retValue );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( FileUnits == "in") {
|
|||
|
|
real rValue = strtod( textValue );
|
|||
|
|
string retValue;
|
|||
|
|
sprintf( retValue, "%f", rValue / 1000.0 );
|
|||
|
|
return( retValue );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( unitValue == "mm") {
|
|||
|
|
if( FileUnits == "mil") {
|
|||
|
|
real rValue = strtod( textValue );
|
|||
|
|
string retValue;
|
|||
|
|
sprintf( retValue, "%f", rValue * 1000.0 / 25.4 );
|
|||
|
|
return( retValue );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( FileUnits == "mm") {
|
|||
|
|
return( textValue );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( FileUnits == "in") {
|
|||
|
|
real rValue = strtod( textValue );
|
|||
|
|
string retValue;
|
|||
|
|
sprintf( retValue, "%f", rValue / 25.4 );
|
|||
|
|
return( retValue );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( unitValue == "in") {
|
|||
|
|
if( FileUnits == "mil") {
|
|||
|
|
real rValue = strtod( textValue );
|
|||
|
|
string retValue;
|
|||
|
|
sprintf( retValue, "%f", rValue * 1000.0 );
|
|||
|
|
return( retValue );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( FileUnits == "mm") {
|
|||
|
|
real rValue = strtod( textValue );
|
|||
|
|
string retValue;
|
|||
|
|
sprintf( retValue, "%f", rValue * 25.4 );
|
|||
|
|
return( retValue );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( FileUnits == "in") {
|
|||
|
|
return( textValue );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# ConvertUnits: unknown units: %s", unitValue );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
|
|||
|
|
return( textValue );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CheckForNull( string str )
|
|||
|
|
{
|
|||
|
|
int length = strlen( str );
|
|||
|
|
|
|||
|
|
for( int i = 0; i < length; i++ ) {
|
|||
|
|
switch( str[ i ] ) {
|
|||
|
|
case '1':
|
|||
|
|
case '2':
|
|||
|
|
case '3':
|
|||
|
|
case '4':
|
|||
|
|
case '5':
|
|||
|
|
case '6':
|
|||
|
|
case '7':
|
|||
|
|
case '8':
|
|||
|
|
case '9':
|
|||
|
|
return( 0 );
|
|||
|
|
default:;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string GetNumberValue( string str )
|
|||
|
|
{
|
|||
|
|
string value = "";
|
|||
|
|
|
|||
|
|
int length = strlen( str );
|
|||
|
|
|
|||
|
|
for( int i = 0; i < length; i++ ) {
|
|||
|
|
switch( str[ i ] ) {
|
|||
|
|
case '+':
|
|||
|
|
case '-':
|
|||
|
|
case '0':
|
|||
|
|
case '1':
|
|||
|
|
case '2':
|
|||
|
|
case '3':
|
|||
|
|
case '4':
|
|||
|
|
case '5':
|
|||
|
|
case '6':
|
|||
|
|
case '7':
|
|||
|
|
case '8':
|
|||
|
|
case '9':
|
|||
|
|
case '.':
|
|||
|
|
value = value + str[ i ];
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
return( value );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( value );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int IsNumberValue( string str )
|
|||
|
|
{
|
|||
|
|
int length = strlen( str );
|
|||
|
|
|
|||
|
|
for( int i = 0; i < length; i++ ) {
|
|||
|
|
switch( str[ i ] ) {
|
|||
|
|
case '+':
|
|||
|
|
case '-':
|
|||
|
|
case '0':
|
|||
|
|
case '1':
|
|||
|
|
case '2':
|
|||
|
|
case '3':
|
|||
|
|
case '4':
|
|||
|
|
case '5':
|
|||
|
|
case '6':
|
|||
|
|
case '7':
|
|||
|
|
case '8':
|
|||
|
|
case '9':
|
|||
|
|
case '.':
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int IsASCIIValue( string str )
|
|||
|
|
{
|
|||
|
|
if( strlen( str ) > 0 ) {
|
|||
|
|
switch( str[ 0 ] ) {
|
|||
|
|
case '0':
|
|||
|
|
case '1':
|
|||
|
|
case '2':
|
|||
|
|
case '3':
|
|||
|
|
case '4':
|
|||
|
|
case '5':
|
|||
|
|
case '6':
|
|||
|
|
case '7':
|
|||
|
|
case '8':
|
|||
|
|
case '9':
|
|||
|
|
return( 0 );
|
|||
|
|
case '.':
|
|||
|
|
case '+':
|
|||
|
|
case '-':
|
|||
|
|
if( strlen( str ) > 1 ) {
|
|||
|
|
switch( str[ 1 ] ) {
|
|||
|
|
case '0':
|
|||
|
|
case '1':
|
|||
|
|
case '2':
|
|||
|
|
case '3':
|
|||
|
|
case '4':
|
|||
|
|
case '5':
|
|||
|
|
case '6':
|
|||
|
|
case '7':
|
|||
|
|
case '8':
|
|||
|
|
case '9':
|
|||
|
|
return( 0 );
|
|||
|
|
default:;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string GetUnitValue( string str )
|
|||
|
|
{
|
|||
|
|
string value = "";
|
|||
|
|
|
|||
|
|
int length = strlen( str );
|
|||
|
|
|
|||
|
|
for( int i = 0; i < length; i++ ) {
|
|||
|
|
switch( str[ i ] ) {
|
|||
|
|
case '+':
|
|||
|
|
case '-':
|
|||
|
|
case '0':
|
|||
|
|
case '1':
|
|||
|
|
case '2':
|
|||
|
|
case '3':
|
|||
|
|
case '4':
|
|||
|
|
case '5':
|
|||
|
|
case '6':
|
|||
|
|
case '7':
|
|||
|
|
case '8':
|
|||
|
|
case '9':
|
|||
|
|
case '.':
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
value = value + str[ i ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( value );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string MinValue( string val1, string val2 )
|
|||
|
|
{
|
|||
|
|
real rVal1 = strtod( ConvertUnits( GetNumberValue( val1 ), GetUnitValue( val1 ) ) );
|
|||
|
|
real rVal2 = strtod( ConvertUnits( GetNumberValue( val2 ), GetUnitValue( val2 ) ) );
|
|||
|
|
|
|||
|
|
string tmp;
|
|||
|
|
|
|||
|
|
if( rVal1 > rVal2 ) {
|
|||
|
|
sprintf( tmp, "%f", rVal2 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
sprintf( tmp, "%f", rVal1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( tmp );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string MaxValue( string val1, string val2 )
|
|||
|
|
{
|
|||
|
|
real rVal1 = strtod( ConvertUnits( GetNumberValue( val1 ), GetUnitValue( val1 ) ) );
|
|||
|
|
real rVal2 = strtod( ConvertUnits( GetNumberValue( val2 ), GetUnitValue( val2 ) ) );
|
|||
|
|
|
|||
|
|
string tmp;
|
|||
|
|
|
|||
|
|
if( rVal1 < rVal2 ) {
|
|||
|
|
sprintf( tmp, "%f", rVal2 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
sprintf( tmp, "%f", rVal1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( tmp );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
real GetValue( string val )
|
|||
|
|
{
|
|||
|
|
real rVal = strtod( ConvertUnits( GetNumberValue( val ), GetUnitValue( val ) ) );
|
|||
|
|
|
|||
|
|
return( rVal );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Find token with a name.
|
|||
|
|
// Returns token number if found,
|
|||
|
|
// -1 if not found
|
|||
|
|
// startToken should points to "("
|
|||
|
|
|
|||
|
|
int FindToken( int startToken, string name )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
CurrentToken = startToken;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
CurrentToken++;
|
|||
|
|
if( Tokens[ CurrentToken ] == name ) {
|
|||
|
|
return( CurrentToken );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( SkipThisItem() ) {
|
|||
|
|
return( -1 );
|
|||
|
|
}
|
|||
|
|
level--; // If an item is skipped, the level needs to be increased !
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( -1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
/*dlgMessageBox( "Unexpected keyword in FindToken " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return( 1 );*/
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( -1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function write list of PCAD layer as comments to script
|
|||
|
|
|
|||
|
|
void PrintPCADLayers( void )
|
|||
|
|
{
|
|||
|
|
printf( "# PCAD layers:\n");
|
|||
|
|
|
|||
|
|
for( int i = 0; i < LayerDefsNumber; i++ ) {
|
|||
|
|
printf( "#Layer = '%s' %d %s\n", LayersName[ i ], LayersCode[ i ],
|
|||
|
|
LayersType[ i ] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf( "#\n" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function returns index of found PadStyleDefinition
|
|||
|
|
// in array or -1 if failed
|
|||
|
|
|
|||
|
|
int FindPadStyleDef( string name )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < PadStyleDefsNumber; i++ ) {
|
|||
|
|
int startToken = PadStyleDefsArray[ i ];
|
|||
|
|
|
|||
|
|
if( Tokens[ startToken ] == name ) {
|
|||
|
|
return( i );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( -1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function returns index of found ViaStyleDefinition
|
|||
|
|
// in array or -1 if failed
|
|||
|
|
|
|||
|
|
int FindViaStyleDef( string name )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < ViaStyleDefsNumber; i++ ) {
|
|||
|
|
int startToken = ViaStyleDefsArray[ i ];
|
|||
|
|
|
|||
|
|
if( Tokens[ startToken ] == name ) {
|
|||
|
|
return( i );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( -1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function returns index of found TextStyleDefinition
|
|||
|
|
// in array or -1 if failed
|
|||
|
|
|
|||
|
|
int FindTextStyleDef( string name )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < TextStyleDefsNumber; i++ ) {
|
|||
|
|
int startToken = TextStyleDefsArray[ i ];
|
|||
|
|
|
|||
|
|
if( Tokens[ startToken ] == name ) {
|
|||
|
|
return( i );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( -1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int checkLayerType( int LayerNumPosition )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < LayerDefsNumber; i++ ) {
|
|||
|
|
if( LayersCode[ i ] == strtol( Tokens[ LayerNumPosition ] ) ) {
|
|||
|
|
if( LayersType[ i ] == "Signal" ) {
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
real RotateXCoord( real x, real y, real rotationInRad )
|
|||
|
|
{
|
|||
|
|
return( x * cos( rotationInRad ) - y * sin( rotationInRad ) );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
real RotateYCoord( real x, real y, real rotationInRad )
|
|||
|
|
{
|
|||
|
|
return( x * sin( rotationInRad ) + y * cos( rotationInRad ) );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Ellipse( real a, real b, real xCoord, real yCoord, real rotationInDegree )
|
|||
|
|
{
|
|||
|
|
if( a < 0.0 ) {
|
|||
|
|
dlgMessageBox( "a must be > 0", "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( b < 0.0 ) {
|
|||
|
|
dlgMessageBox( "b must be > 0", "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( b > a ) {
|
|||
|
|
dlgMessageBox( "a must be > b", "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
real phi = atan( b / a );
|
|||
|
|
|
|||
|
|
real theta = PI / 2 - phi;
|
|||
|
|
|
|||
|
|
real r1 = ( a * sin( theta ) + b * cos( theta ) - a ) /
|
|||
|
|
( sin( theta ) + cos( theta ) - 1 );
|
|||
|
|
|
|||
|
|
real r2 = ( a * sin( theta ) + b * cos( theta ) - b ) /
|
|||
|
|
( sin( theta ) + cos( theta ) - 1 );
|
|||
|
|
|
|||
|
|
real x = r2 * sin( phi );
|
|||
|
|
|
|||
|
|
real y = b - r2 * ( 1.0 - cos( phi ) );
|
|||
|
|
|
|||
|
|
real rotationInRad = rotationInDegree * PI / 180.0;
|
|||
|
|
|
|||
|
|
printf( "ARC CW (%f %f) (%f %f) (%f %f);\n",
|
|||
|
|
xCoord + RotateXCoord( 0.0, b, rotationInRad ), yCoord + RotateYCoord( 0.0, b, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( 0.0, b - 2.0 * r2, rotationInRad ), yCoord + RotateYCoord( 0.0, b - 2.0 * r2, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( x, y, rotationInRad ), yCoord + RotateYCoord( x, y, rotationInRad ) );
|
|||
|
|
|
|||
|
|
printf( "ARC CCW (%f %f) (%f %f) (%f %f);\n",
|
|||
|
|
xCoord + RotateXCoord( 0.0, b, rotationInRad ), yCoord + RotateYCoord( 0.0, b, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( 0.0, b - 2.0 * r2, rotationInRad ), yCoord + RotateYCoord( 0.0, b - 2.0 * r2, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( -x, y, rotationInRad ), yCoord + RotateYCoord( -x, y, rotationInRad ) );
|
|||
|
|
|
|||
|
|
|
|||
|
|
printf( "ARC CW (%f %f) (%f %f) (%f %f);\n",
|
|||
|
|
xCoord + RotateXCoord( 0.0, -b, rotationInRad ), yCoord + RotateYCoord( 0.0, -b, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( 0.0, 2.0 * r2 - b, rotationInRad ), yCoord + RotateYCoord( 0.0, 2.0 * r2 - b, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( -x, -y, rotationInRad ), yCoord + RotateYCoord( -x, -y, rotationInRad ) );
|
|||
|
|
|
|||
|
|
printf( "ARC CCW (%f %f) (%f %f) (%f %f);\n",
|
|||
|
|
xCoord + RotateXCoord( 0.0, -b, rotationInRad ), yCoord + RotateYCoord( 0.0, -b, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( 0.0, 2.0 * r2 - b, rotationInRad ), yCoord + RotateYCoord( 0.0, 2.0 * r2 - b, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( x, -y, rotationInRad ), yCoord + RotateYCoord( x, -y, rotationInRad ) );
|
|||
|
|
|
|||
|
|
|
|||
|
|
printf( "ARC CW (%f %f) (%f %f) (%f %f);\n",
|
|||
|
|
xCoord + RotateXCoord( a, 0.0, rotationInRad ), yCoord + RotateYCoord( a, 0.0, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( a - 2.0 * r1, 0.0, rotationInRad ), yCoord + RotateYCoord( a - 2.0 * r1, 0.0, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( x, -y, rotationInRad ), yCoord + RotateYCoord( x, -y, rotationInRad ) );
|
|||
|
|
|
|||
|
|
printf( "ARC CCW (%f %f) (%f %f) (%f %f);\n",
|
|||
|
|
xCoord + RotateXCoord( a, 0.0, rotationInRad ), yCoord + RotateYCoord( a, 0.0, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( a - 2.0 * r1, 0.0, rotationInRad ), yCoord + RotateYCoord( a - 2.0 * r1, 0.0, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( x, y, rotationInRad ), yCoord + RotateYCoord( x, y, rotationInRad ) );
|
|||
|
|
|
|||
|
|
|
|||
|
|
printf( "ARC CW (%f %f) (%f %f) (%f %f);\n",
|
|||
|
|
xCoord + RotateXCoord( -a, 0.0, rotationInRad ), yCoord + RotateYCoord( -a, 0.0, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( 2.0 * r1 - a, 0.0, rotationInRad ), yCoord + RotateYCoord( 2.0 * r1 - a, 0.0, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( -x, y, rotationInRad ), yCoord + RotateYCoord( -x, y, rotationInRad ) );
|
|||
|
|
|
|||
|
|
printf( "ARC CCW (%f %f) (%f %f) (%f %f);\n",
|
|||
|
|
xCoord + RotateXCoord( -a, 0.0, rotationInRad ), yCoord + RotateYCoord( -a, 0.0, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( 2.0 * r1 - a, 0.0, rotationInRad ), yCoord + RotateYCoord( 2.0 * r1 - a, 0.0, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( -x, -y, rotationInRad ), yCoord + RotateYCoord( -x, -y, rotationInRad ) );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void FilledEllipse( real a, real b, real xCoord, real yCoord, real rotationInDegree )
|
|||
|
|
{
|
|||
|
|
if( a < 0.0 ) {
|
|||
|
|
dlgMessageBox( "a must be > 0", "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( b < 0.0 ) {
|
|||
|
|
dlgMessageBox( "b must be > 0", "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( b > a ) {
|
|||
|
|
dlgMessageBox( "a must be > b", "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
real phi = atan( b / a );
|
|||
|
|
|
|||
|
|
real theta = PI / 2 - phi;
|
|||
|
|
|
|||
|
|
real r1 = ( a * sin( theta ) + b * cos( theta ) - a ) /
|
|||
|
|
( sin( theta ) + cos( theta ) - 1 );
|
|||
|
|
|
|||
|
|
real r2 = ( a * sin( theta ) + b * cos( theta ) - b ) /
|
|||
|
|
( sin( theta ) + cos( theta ) - 1 );
|
|||
|
|
|
|||
|
|
real x = r2 * sin( phi );
|
|||
|
|
|
|||
|
|
real y = b - r2 * ( 1.0 - cos( phi ) );
|
|||
|
|
|
|||
|
|
real rotationInRad = rotationInDegree * PI / 180.0;
|
|||
|
|
|
|||
|
|
printf( "POLYGON 0\n");
|
|||
|
|
printf( "(%f %f) @-%f (%f %f)\n",
|
|||
|
|
xCoord + RotateXCoord( 0.0, b, rotationInRad ), yCoord + RotateYCoord( 0.0, b, rotationInRad ),
|
|||
|
|
r2,
|
|||
|
|
xCoord + RotateXCoord( x, y, rotationInRad ), yCoord + RotateYCoord( x, y, rotationInRad ) );
|
|||
|
|
|
|||
|
|
printf( "@-%f (%f %f)\n",
|
|||
|
|
r1,
|
|||
|
|
xCoord + RotateXCoord( a, 0.0, rotationInRad ), yCoord + RotateYCoord( a, 0.0, rotationInRad ) );
|
|||
|
|
|
|||
|
|
printf( "@-%f (%f %f)\n",
|
|||
|
|
r1,
|
|||
|
|
xCoord + RotateXCoord( x, -y, rotationInRad ), yCoord + RotateYCoord( x, -y, rotationInRad ) );
|
|||
|
|
|
|||
|
|
|
|||
|
|
printf( "@-%f (%f %f)\n",
|
|||
|
|
r2,
|
|||
|
|
xCoord + RotateXCoord( 0.0, -b, rotationInRad ), yCoord + RotateYCoord( 0.0, -b, rotationInRad ) );
|
|||
|
|
|
|||
|
|
printf( "@-%f (%f %f)\n",
|
|||
|
|
r2,
|
|||
|
|
xCoord + RotateXCoord( -x, -y, rotationInRad ), yCoord + RotateYCoord( -x, -y, rotationInRad ) );
|
|||
|
|
|
|||
|
|
printf( "@-%f (%f %f)\n",
|
|||
|
|
r1,
|
|||
|
|
xCoord + RotateXCoord( -a, 0.0, rotationInRad ), yCoord + RotateYCoord( -a, 0.0, rotationInRad ) );
|
|||
|
|
|
|||
|
|
printf( "@-%f (%f %f)\n",
|
|||
|
|
r1,
|
|||
|
|
xCoord + RotateXCoord( -x, y, rotationInRad ), yCoord + RotateYCoord( -x, y, rotationInRad ) );
|
|||
|
|
|
|||
|
|
printf( "@-%f (%f %f);\n",
|
|||
|
|
r2,
|
|||
|
|
xCoord + RotateXCoord( 0.0, b, rotationInRad ), yCoord + RotateYCoord( 0.0, b, rotationInRad ) );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int OnePadShapeCreated;
|
|||
|
|
|
|||
|
|
int ProcessOnePadShape( int Number, int startToken, string holeDiam )
|
|||
|
|
{
|
|||
|
|
int layerNumRefPosition = FindToken( startToken + 1, "layerNumRef" );
|
|||
|
|
|
|||
|
|
if( layerNumRefPosition >= 0 ) {
|
|||
|
|
if( checkLayerType( layerNumRefPosition + 1 ) ) {
|
|||
|
|
int padShapeTypePosition = FindToken( startToken + 1, "padShapeType" );
|
|||
|
|
|
|||
|
|
if( padShapeTypePosition >= 0 ) {
|
|||
|
|
int shapeWidthPosition = FindToken( startToken + 1, "shapeWidth" );
|
|||
|
|
|
|||
|
|
if( shapeWidthPosition >= 0 ) {
|
|||
|
|
string TokenText = Tokens[ shapeWidthPosition + 1 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ shapeWidthPosition + 2 ] != ")" ) {
|
|||
|
|
if( IsASCIIValue( Tokens[ shapeWidthPosition + 2 ] ) ) {
|
|||
|
|
TokenText = TokenText + Tokens[ shapeWidthPosition + 2 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wrong description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string shapeWidth = ConvertUnits( GetNumberValue( TokenText ),
|
|||
|
|
GetUnitValue( TokenText ) );
|
|||
|
|
|
|||
|
|
int shapeHeightPosition = FindToken( startToken + 1, "shapeHeight" );
|
|||
|
|
|
|||
|
|
if( shapeHeightPosition >= 0 ) {
|
|||
|
|
|
|||
|
|
string TokenText = Tokens[ shapeHeightPosition + 1 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ shapeHeightPosition + 2 ] != ")" ) {
|
|||
|
|
if( IsASCIIValue( Tokens[ shapeHeightPosition + 2 ] ) ) {
|
|||
|
|
TokenText = TokenText + Tokens[ shapeHeightPosition + 2 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wrong description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string shapeHeight = ConvertUnits( GetNumberValue( TokenText ),
|
|||
|
|
GetUnitValue( TokenText ) );
|
|||
|
|
|
|||
|
|
if( ( !CheckForNull( shapeWidth ) ) ||
|
|||
|
|
( !CheckForNull( shapeHeight ) ) ) {
|
|||
|
|
|
|||
|
|
printf("# PadShape: layerNumRef = %s",
|
|||
|
|
Tokens[ layerNumRefPosition + 1 ] );
|
|||
|
|
printf(" padShapeType = %s",
|
|||
|
|
Tokens[ padShapeTypePosition + 1 ] );
|
|||
|
|
printf(" shapeWidth = %s",
|
|||
|
|
shapeWidth );
|
|||
|
|
printf(" shapeHeight = %s\n",
|
|||
|
|
shapeHeight );
|
|||
|
|
|
|||
|
|
if( IfSMD[ Number ] ) { // SMD
|
|||
|
|
if( 1 /*OnePadShapeCreated == 0*/ ) {
|
|||
|
|
if( Tokens[ padShapeTypePosition + 1 ] == "Oval" ) { // Oval
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sSMD %s %s -100",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
shapeWidth, shapeHeight );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ padShapeTypePosition + 1 ] == "Rect" ) { // Rectangle
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sSMD %s %s -0",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
shapeWidth, shapeHeight );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ padShapeTypePosition + 1 ] == "Ellipse" ) { // Ellipse
|
|||
|
|
if( shapeWidth == shapeHeight ) {
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sSMD %s %s -100",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
shapeWidth, shapeHeight );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
//if( DebugMessage ) {
|
|||
|
|
WriteLog( "# warning: Ellipse with different width and height.\n");
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
// Create circle here and ellipse later over it
|
|||
|
|
|
|||
|
|
//PadStyleShapeType[ Number ] = 1;
|
|||
|
|
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sSMD %s %s -100",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
shapeWidth, shapeWidth );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ padShapeTypePosition + 1 ] == "RndRect" ) { // RoundRectangle
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sSMD %s %s -25",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
shapeWidth, shapeHeight );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ padShapeTypePosition + 1 ] == "Target" ) { // Make round
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sSMD %s %s -100",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
shapeWidth, shapeHeight );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: SMDShape %s not supported yet\n",
|
|||
|
|
Tokens[ padShapeTypePosition + 1 ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else { // PAD
|
|||
|
|
if( 1 /*OnePadShapeCreated == 0*/ ) {
|
|||
|
|
if( Tokens[ padShapeTypePosition + 1 ] == "Oval" ) { // Oval
|
|||
|
|
if( shapeWidth == shapeHeight ) {
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sPAD %s ROUND",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
shapeWidth );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
//PadStyleShapeType[ Number ] = 1;
|
|||
|
|
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
real val1 = strtod( ConvertUnits( GetNumberValue( shapeHeight ),
|
|||
|
|
GetUnitValue( shapeHeight ) ) );
|
|||
|
|
real val2 = strtod( ConvertUnits( GetNumberValue( shapeWidth ),
|
|||
|
|
GetUnitValue( shapeWidth ) ) );
|
|||
|
|
|
|||
|
|
real D = val1;
|
|||
|
|
|
|||
|
|
if( D > val2 ) {
|
|||
|
|
D = val2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sPAD %f LONG",
|
|||
|
|
PadStyleDefsScript[ Number ], D );
|
|||
|
|
|
|||
|
|
/*sprintf( PadStyleDefsScript[ Number ], "%sPAD %s SQUARE",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
MinValue( shapeWidth, shapeHeight ) );*/
|
|||
|
|
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
|
|||
|
|
if( val1 > val2 ) {
|
|||
|
|
PadShapeAddRotation[ Number ] = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*PadShapeStyleShapeType[ NrPadShapeStyle ] = 2;
|
|||
|
|
PadShapeStyleDefsWidth[ NrPadShapeStyle ] = shapeWidth;
|
|||
|
|
PadShapeStyleDefsHeight[ NrPadShapeStyle ] = shapeHeight;
|
|||
|
|
PadShapeStyleDefsLayer[ NrPadShapeStyle ] = Tokens[ layerNumRefPosition + 1 ];
|
|||
|
|
NrPadShapeStyle++;
|
|||
|
|
|
|||
|
|
NrPadShapes[ Number ]++;*/
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ padShapeTypePosition + 1 ] == "Rect" ) { // Rectangle
|
|||
|
|
if( shapeWidth == shapeHeight ) {
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sPAD %s SQUARE",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
shapeWidth );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sPAD %s SQUARE",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
MinValue( shapeWidth, shapeHeight ) );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
PadShapeStyleShapeType[ NrPadShapeStyle ] = 4;
|
|||
|
|
PadShapeStyleDefsWidth[ NrPadShapeStyle ] = shapeWidth;
|
|||
|
|
PadShapeStyleDefsHeight[ NrPadShapeStyle ] = shapeHeight;
|
|||
|
|
PadShapeStyleDefsLayer[ NrPadShapeStyle ] = Tokens[ layerNumRefPosition + 1 ];
|
|||
|
|
NrPadShapeStyle++;
|
|||
|
|
|
|||
|
|
NrPadShapes[ Number ]++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ padShapeTypePosition + 1 ] == "Ellipse" ) { // Ellipse
|
|||
|
|
if( shapeWidth == shapeHeight ) {
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sPAD %s ROUND",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
shapeWidth );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
//if( DebugMessage ) {
|
|||
|
|
WriteLog( "# warning: Ellipse with different width and height.\n");
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
// Create circle here and ellipse later over it
|
|||
|
|
|
|||
|
|
PadShapeStyleShapeType[ NrPadShapeStyle ] = 1;
|
|||
|
|
PadShapeStyleDefsWidth[ NrPadShapeStyle ] = shapeWidth;
|
|||
|
|
PadShapeStyleDefsHeight[ NrPadShapeStyle ] = shapeHeight;
|
|||
|
|
PadShapeStyleDefsLayer[ NrPadShapeStyle ] = Tokens[ layerNumRefPosition + 1 ];
|
|||
|
|
NrPadShapeStyle++;
|
|||
|
|
|
|||
|
|
NrPadShapes[ Number ]++;
|
|||
|
|
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sPAD %s ROUND",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
MinValue( shapeWidth, shapeHeight ) );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ padShapeTypePosition + 1 ] == "MtHole" ) { // MountingHole
|
|||
|
|
if( shapeWidth == shapeHeight ) {
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sHOLE %s",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
holeDiam );
|
|||
|
|
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
//if( DebugMessage ) {
|
|||
|
|
WriteLog( "# warning: MtHole with different width and height.\n");
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ padShapeTypePosition + 1 ] == "RndRect" ) { // RoundRectangle
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
real val1 = strtod( ConvertUnits( GetNumberValue( shapeHeight ),
|
|||
|
|
GetUnitValue( shapeHeight ) ) );
|
|||
|
|
real val2 = strtod( ConvertUnits( GetNumberValue( shapeWidth ),
|
|||
|
|
GetUnitValue( shapeWidth ) ) );
|
|||
|
|
|
|||
|
|
real minVal = val1;
|
|||
|
|
real maxVal = val1;
|
|||
|
|
|
|||
|
|
if( minVal > val2 ) {
|
|||
|
|
minVal = val2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( maxVal < val2 ) {
|
|||
|
|
maxVal = val2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
real d = maxVal * ( 1.0 - 0.7 / ROUNDNESS );
|
|||
|
|
|
|||
|
|
if( minVal > d ) {
|
|||
|
|
minVal = d;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sPAD %f SQUARE",
|
|||
|
|
PadStyleDefsScript[ Number ], minVal );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
PadShapeStyleShapeType[ NrPadShapeStyle ] = 2;
|
|||
|
|
PadShapeStyleDefsWidth[ NrPadShapeStyle ] = shapeWidth;
|
|||
|
|
PadShapeStyleDefsHeight[ NrPadShapeStyle ] = shapeHeight;
|
|||
|
|
PadShapeStyleDefsLayer[ NrPadShapeStyle ] = Tokens[ layerNumRefPosition + 1 ];
|
|||
|
|
NrPadShapeStyle++;
|
|||
|
|
|
|||
|
|
NrPadShapes[ Number ]++;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ padShapeTypePosition + 1 ] == "Target" ) { // Make it round
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sPAD %s ROUND",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
shapeWidth );
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: PadShape %s not supported yet\n",
|
|||
|
|
Tokens[ padShapeTypePosition + 1 ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
PadStyleDefsSkip[ Number ] = 0;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# skips because of zero coordinates.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else { // No width
|
|||
|
|
if( Tokens[ padShapeTypePosition + 1 ] == "Polygon" ) {
|
|||
|
|
printf( "#polygonPad\n");
|
|||
|
|
|
|||
|
|
string xLineCoord[];
|
|||
|
|
string yLineCoord[];
|
|||
|
|
int nrLines = 0;
|
|||
|
|
|
|||
|
|
int shapeOutlinePosition = FindToken( startToken + 1, "shapeOutline" );
|
|||
|
|
|
|||
|
|
if( shapeOutlinePosition >= 0 ) {
|
|||
|
|
int currentToken = shapeOutlinePosition + 1;
|
|||
|
|
|
|||
|
|
PadShapeStyleDefsPolygon[ NrPadShapeStyle ] = currentToken;
|
|||
|
|
|
|||
|
|
while( currentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ currentToken ] == "(" ) {
|
|||
|
|
currentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ currentToken ] == "pt" ) {
|
|||
|
|
xLineCoord[ nrLines ] = Tokens[ currentToken + 1 ];
|
|||
|
|
yLineCoord[ nrLines ] = Tokens[ currentToken + 2 ];
|
|||
|
|
nrLines++;
|
|||
|
|
|
|||
|
|
currentToken = currentToken + 3;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ currentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
currentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string minX = xLineCoord[ 0 ];
|
|||
|
|
string minY = yLineCoord[ 0 ];
|
|||
|
|
string maxX = xLineCoord[ 0 ];
|
|||
|
|
string maxY = yLineCoord[ 0 ];
|
|||
|
|
|
|||
|
|
for( int i = 0; i < nrLines; i++ ) {
|
|||
|
|
minX = MinValue( minX, xLineCoord[ i ] );
|
|||
|
|
maxX = MaxValue( maxX, xLineCoord[ i ] );
|
|||
|
|
minY = MinValue( minY, yLineCoord[ i ] );
|
|||
|
|
maxY = MaxValue( maxY, yLineCoord[ i ] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
real rMinX = strtod( minX );
|
|||
|
|
real rMaxX = strtod( maxX );
|
|||
|
|
real rMinY = strtod( minY );
|
|||
|
|
real rMaxY = strtod( maxY );
|
|||
|
|
|
|||
|
|
real rX = ( rMaxX - rMinX ) / 2.0;
|
|||
|
|
real rY = ( rMaxY - rMinY ) / 2.0;
|
|||
|
|
|
|||
|
|
real r = rX;
|
|||
|
|
|
|||
|
|
if( r > rY ) {
|
|||
|
|
r = rY;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( OnePadShapeCreated == 0 ) {
|
|||
|
|
if( IfSMD[ Number ] ) {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sSMD %f %f -0",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
r,
|
|||
|
|
r );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "%sPAD %f SQUARE",
|
|||
|
|
PadStyleDefsScript[ Number ],
|
|||
|
|
r );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
OnePadShapeCreated = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
PadShapeStyleShapeType[ NrPadShapeStyle ] = 3;
|
|||
|
|
PadShapeStyleDefsWidth[ NrPadShapeStyle ] = maxX;
|
|||
|
|
PadShapeStyleDefsHeight[ NrPadShapeStyle ] = maxY;
|
|||
|
|
PadShapeStyleDefsLayer[ NrPadShapeStyle ] = Tokens[ layerNumRefPosition + 1 ];
|
|||
|
|
NrPadShapeStyle++;
|
|||
|
|
|
|||
|
|
NrPadShapes[ Number ]++;
|
|||
|
|
|
|||
|
|
PadStyleDefsSkip[ Number ] = 0;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("# warning: can't find shapeOutline\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "#skips because of layer.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int ProcessPadShapes( int Number, int startToken, string holeDiam )
|
|||
|
|
{
|
|||
|
|
OnePadShapeCreated = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "padShape" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
ProcessOnePadShape( Number, SavePosition, holeDiam );
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in ProcessPadShapes " + Tokens[
|
|||
|
|
CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function converts PCAD layers to Eagle layers
|
|||
|
|
|
|||
|
|
string ConvertLayer( string PCADLayer )
|
|||
|
|
{
|
|||
|
|
for (int n = 0; n <= CntlayerDef; n++) {
|
|||
|
|
if( PCADLayer == RefLayerNum[n] ) {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
//printf( "# info: this layer was converted by using user file.\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( PcadEagleLayerRefNum[n] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( PCADLayer == "0" ) return( "48" ); // Unknown layer
|
|||
|
|
if( PCADLayer == "1" ) return( "1" ); // Top
|
|||
|
|
if( PCADLayer == "2" ) return( "16" ); // Bottom
|
|||
|
|
if( PCADLayer == "3" ) return( "20" ); // Dimension
|
|||
|
|
if( PCADLayer == "4" ) return( "29" ); // Top Mask
|
|||
|
|
if( PCADLayer == "5" ) return( "30" ); // Bot Mask
|
|||
|
|
if( PCADLayer == "6" ) return( "21" ); // Top Silk
|
|||
|
|
if( PCADLayer == "7" ) return( "22" ); // Bot Silk
|
|||
|
|
if( PCADLayer == "8" ) return( "31" ); // Top Paste
|
|||
|
|
if( PCADLayer == "9" ) return( "32" ); // Bot Paste
|
|||
|
|
if( PCADLayer == "10" ) return( "21" ); // Top Assy
|
|||
|
|
if( PCADLayer == "11" ) return( "22" ); // Bot Assy
|
|||
|
|
if( PCADLayer == "12" ) return( "2" ); // Int1
|
|||
|
|
if( PCADLayer == "13" ) return( "3" ); // Int2
|
|||
|
|
if( PCADLayer == "14" ) return( "4" ); // Int3
|
|||
|
|
if( PCADLayer == "15" ) return( "5" ); // Int4
|
|||
|
|
if( PCADLayer == "16" ) return( "6" ); // Int5
|
|||
|
|
if( PCADLayer == "17" ) return( "7" ); // Int6
|
|||
|
|
if( PCADLayer == "18" ) return( "8" ); // Int7
|
|||
|
|
if( PCADLayer == "19" ) return( "9" ); // Int8
|
|||
|
|
if( PCADLayer == "20" ) return( "48" ); // MECH
|
|||
|
|
if( PCADLayer == "21" ) return( "48" ); // MECH
|
|||
|
|
if( PCADLayer == "22" ) return( "48" ); // MESH
|
|||
|
|
if( PCADLayer == "23" ) return( "48" ); // MESH
|
|||
|
|
if( PCADLayer == "24" ) return( "48" ); // MESH
|
|||
|
|
if( PCADLayer == "25" ) return( "48" ); // TopStrMsk 48 ?
|
|||
|
|
if( PCADLayer == "26" ) return( "48" ); // BotStrMsk 48 ?
|
|||
|
|
if( PCADLayer == "27" ) return( "48" ); // TopCreep 48 ?
|
|||
|
|
if( PCADLayer == "28" ) return( "48" ); // BotCreep 48 ?
|
|||
|
|
if( PCADLayer == "29" ) return( "48" ); // Int1Creep 48 ?
|
|||
|
|
if( PCADLayer == "30" ) return( "48" ); // Int2Creep 48 ?
|
|||
|
|
if( PCADLayer == "31" ) return( "48" ); // Int3Creep 48 ?
|
|||
|
|
if( PCADLayer == "32" ) return( "48" ); // Int4Creep 48 ?
|
|||
|
|
if( PCADLayer == "33" ) return( "48" ); // Int5Creep 48 ?
|
|||
|
|
if( PCADLayer == "34" ) return( "48" ); // Int6Creep 48 ?
|
|||
|
|
if( PCADLayer == "35" ) return( "48" ); // Int7Creep 48 ?
|
|||
|
|
if( PCADLayer == "36" ) return( "48" ); // Int8Creep 48 ?
|
|||
|
|
if( PCADLayer == "37" ) return( "48" ); // Int9Creep 48 ?
|
|||
|
|
if( PCADLayer == "38" ) return( "48" ); // Int10Creep 48 ?
|
|||
|
|
if( PCADLayer == "39" ) return( "48" ); // Reserve ?
|
|||
|
|
if( PCADLayer == "40" ) return( "48" ); // TxtCreep 48 ?
|
|||
|
|
if( PCADLayer == "41" ) return( "48" ); // DrillHelp 48 ?
|
|||
|
|
if( PCADLayer == "42" ) return( "44" ); // Drill
|
|||
|
|
if( PCADLayer == "43" ) return( "48" ); // TopTxt 48 ?
|
|||
|
|
if( PCADLayer == "44" ) return( "48" ); // BotTxt 48 ?
|
|||
|
|
if( PCADLayer == "45" ) return( "48" ); // TopHelp 48 ?
|
|||
|
|
if( PCADLayer == "46" ) return( "48" ); // BotHelp 48 ?
|
|||
|
|
if( PCADLayer == "47" ) return( "48" ); // Int1Help 48 ?
|
|||
|
|
if( PCADLayer == "48" ) return( "48" ); // Int2Help 48 ?
|
|||
|
|
if( PCADLayer == "49" ) return( "48" ); // Int3Help 48 ?
|
|||
|
|
if( PCADLayer == "50" ) return( "48" ); // Int4Help 48 ?
|
|||
|
|
if( PCADLayer == "51" ) return( "48" ); // Int5Help 48 ?
|
|||
|
|
if( PCADLayer == "52" ) return( "48" ); // Int6Help 48 ?
|
|||
|
|
if( PCADLayer == "53" ) return( "48" ); // Int7Help 48 ?
|
|||
|
|
if( PCADLayer == "54" ) return( "48" ); // Int8Help 48 ?
|
|||
|
|
if( PCADLayer == "55" ) return( "48" ); // Int9Help 48 ?
|
|||
|
|
if( PCADLayer == "56" ) return( "48" ); // Int10Help 48 ?
|
|||
|
|
if( PCADLayer == "57" ) return( "48" ); // SilkscreenTop 48 ?
|
|||
|
|
if( PCADLayer == "58" ) return( "48" ); // SilkscreenBot 48 ?
|
|||
|
|
if( PCADLayer == "59" ) return( "48" ); // BoardHelp 48 ?
|
|||
|
|
if( PCADLayer == "60" ) return( "48" ); // A4H1T0 48 ?
|
|||
|
|
if( PCADLayer == "61" ) return( "48" ); // A4H1B0 48 ?
|
|||
|
|
if( PCADLayer == "62" ) return( "48" ); // A4H2T0 48 ?
|
|||
|
|
if( PCADLayer == "63" ) return( "48" ); // A4H2B0 48 ?
|
|||
|
|
if( PCADLayer == "64" ) return( "48" ); // A4H1-5T0 48 ?
|
|||
|
|
if( PCADLayer == "65" ) return( "48" ); // A4H1-5B0 48 ?
|
|||
|
|
if( PCADLayer == "66" ) return( "48" ); // A4H3T0 48 ?
|
|||
|
|
if( PCADLayer == "67" ) return( "48" ); // A4H3B0 48 ?
|
|||
|
|
if( PCADLayer == "68" ) return( "48" ); // A3H1T0 48 ?
|
|||
|
|
if( PCADLayer == "69" ) return( "48" ); // A3H1B0 48 ?
|
|||
|
|
if( PCADLayer == "70" ) return( "48" ); // TitleReserveT 48 ?
|
|||
|
|
if( PCADLayer == "71" ) return( "48" ); // TitleReserveB 48 ?
|
|||
|
|
if( PCADLayer == "72" ) return( "48" ); // TopDesRes 48 ?
|
|||
|
|
if( PCADLayer == "73" ) return( "48" ); // BotDesRes 48 ?
|
|||
|
|
if( PCADLayer == "74" ) return( "48" ); // TopLCover 48 ?
|
|||
|
|
if( PCADLayer == "75" ) return( "48" ); // BotLCover 48 ?
|
|||
|
|
if( PCADLayer == "76" ) return( "48" ); // TopTstPnt 48 ?
|
|||
|
|
if( PCADLayer == "77" ) return( "48" ); // BotTstPnt 48 ?
|
|||
|
|
// No Layers 78, 79
|
|||
|
|
if( PCADLayer == "80" ) return( "48" ); // Int1Txt 48 ?
|
|||
|
|
if( PCADLayer == "81" ) return( "48" ); // Int2Txt 48 ?
|
|||
|
|
if( PCADLayer == "82" ) return( "48" ); // Int3Txt 48 ?
|
|||
|
|
if( PCADLayer == "83" ) return( "48" ); // Int4Txt 48 ?
|
|||
|
|
if( PCADLayer == "84" ) return( "48" ); // Int5Txt 48 ?
|
|||
|
|
if( PCADLayer == "85" ) return( "48" ); // Int6Txt 48 ?
|
|||
|
|
if( PCADLayer == "86" ) return( "48" ); // Int7Txt 48 ?
|
|||
|
|
if( PCADLayer == "87" ) return( "48" ); // Int8Txt 48 ?
|
|||
|
|
if( PCADLayer == "88" ) return( "48" ); // Int9Txt 48 ?
|
|||
|
|
if( PCADLayer == "89" ) return( "48" ); // Int10Txt 48 ?
|
|||
|
|
if( PCADLayer == "90" ) return( "48" ); // TxtTopCreep 48 ?
|
|||
|
|
if( PCADLayer == "91" ) return( "48" ); // TxtBotCreep 48 ?
|
|||
|
|
if( PCADLayer == "92" ) return( "48" ); // TxtInt1Creep 48 ?
|
|||
|
|
if( PCADLayer == "93" ) return( "48" ); // TxtInt2Creep 48 ?
|
|||
|
|
if( PCADLayer == "94" ) return( "48" ); // TxtInt3Creep 48 ?
|
|||
|
|
if( PCADLayer == "95" ) return( "48" ); // TxtInt4Creep 48 ?
|
|||
|
|
if( PCADLayer == "96" ) return( "48" ); // TxtInt5Creep 48 ?
|
|||
|
|
if( PCADLayer == "97" ) return( "48" ); // TxtInt6Creep 48 ?
|
|||
|
|
if( PCADLayer == "98" ) return( "48" ); // TxtInt7Creep 48 ?
|
|||
|
|
if( PCADLayer == "99" ) return( "48" ); // TxtInt8Creep 48 ?
|
|||
|
|
if( PCADLayer == "100" ) return( "48" ); // TxtInt9Creep 48 ?
|
|||
|
|
if( PCADLayer == "101" ) return( "48" ); // TxtInt10Creep 48 ?
|
|||
|
|
if( PCADLayer == "102" ) return( "48" ); // Reserve1 48 ?
|
|||
|
|
if( PCADLayer == "103" ) return( "48" ); // TxtAssyTopCreep 48 ?
|
|||
|
|
if( PCADLayer == "104" ) return( "48" ); // TxtAssyBotCreep 48 ?
|
|||
|
|
if( PCADLayer == "105" ) return( "48" ); // TxtAssyTop 48 ?
|
|||
|
|
if( PCADLayer == "106" ) return( "48" ); // TxtAssyBot 48 ?
|
|||
|
|
if( PCADLayer == "107" ) return( "48" ); // TxtTopLCover 48 ?
|
|||
|
|
if( PCADLayer == "108" ) return( "48" ); // TxtBotLCover 48 ?
|
|||
|
|
if( PCADLayer == "109" ) return( "48" ); // TestPointTop 48 ?
|
|||
|
|
if( PCADLayer == "110" ) return( "48" ); // TestPointBot 48 ?
|
|||
|
|
if( PCADLayer == "111" ) return( "35" ); // TopGlue
|
|||
|
|
if( PCADLayer == "112" ) return( "36" ); // BotGlue
|
|||
|
|
if( PCADLayer == "113" ) return( "48" ); // Drill-Top-I1 48 ?
|
|||
|
|
if( PCADLayer == "123" ) return( "48" ); // Drill-Top-I4 48 ?
|
|||
|
|
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: ConvertLayer: can't convert layer %s\n", PCADLayer );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
|
|||
|
|
return( "" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOnePadDefinition( int Number, int startToken )
|
|||
|
|
{
|
|||
|
|
//PadStyleDefsScript[ Number ] = "#PadStyleDef " + Tokens[ startToken ];
|
|||
|
|
printf( "#PadStyleDef %s\n", Tokens[ startToken ] );
|
|||
|
|
|
|||
|
|
/*ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
|
|||
|
|
Tokens[ startToken ] ) );*/
|
|||
|
|
|
|||
|
|
PadStyleDefsSkip[ Number ] = 1;
|
|||
|
|
PadShapeAddRotation[ Number ] = 0;
|
|||
|
|
|
|||
|
|
int holeDiamPosition = FindToken( startToken + 1, "holeDiam" );
|
|||
|
|
|
|||
|
|
if( holeDiamPosition >= 0 ) {
|
|||
|
|
string TokenText = Tokens[ holeDiamPosition + 1 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ holeDiamPosition + 2 ] != ")" ) {
|
|||
|
|
if( IsASCIIValue( Tokens[ holeDiamPosition + 2 ] ) ) {
|
|||
|
|
TokenText = TokenText + Tokens[ holeDiamPosition + 2 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wrong description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string holeDiam = ConvertUnits( GetNumberValue( TokenText ),
|
|||
|
|
GetUnitValue( TokenText ) );
|
|||
|
|
|
|||
|
|
PadShapePoiner[ Number ] = NrPadShapeStyle;
|
|||
|
|
NrPadShapes[ Number ] = 0;
|
|||
|
|
|
|||
|
|
if( CheckForNull( holeDiam ) ) {
|
|||
|
|
IfSMD[ Number ] = 1;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
IfSMD[ Number ] = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "#HoleDiameter = %s\n", holeDiam );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ProcessPadShapes( Number, startToken, holeDiam );
|
|||
|
|
|
|||
|
|
if( PadStyleDefsSkip[ Number ] ) {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# this PadDefinition was skipped.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( IfSMD[ Number ] ) {
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
sprintf( PadStyleDefsScript[ Number ], "CHANGE DRILL %s;\n%s",
|
|||
|
|
holeDiam, PadStyleDefsScript[ Number ] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//printf( "#%s\n", PadStyleDefsScript[ Number ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# skips because pad has no holeDiam.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GeneratePadDefinitions( void )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < PadStyleDefsNumber; i++ ) {
|
|||
|
|
int startToken = PadStyleDefsArray[ i ];
|
|||
|
|
|
|||
|
|
string info;
|
|||
|
|
sprintf( info, "Process Pad Style definition %d (%d)", i, PadStyleDefsNumber );
|
|||
|
|
UpdateProgress( info );
|
|||
|
|
|
|||
|
|
GenerateOnePadDefinition( i, startToken );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function write library header to script
|
|||
|
|
|
|||
|
|
void GenerateLibraryHeader( void )
|
|||
|
|
{
|
|||
|
|
string libraryName;
|
|||
|
|
string array[];
|
|||
|
|
|
|||
|
|
libraryName = filesetext( PCADfileName, ".lbr");
|
|||
|
|
|
|||
|
|
PrintPCADLayers();
|
|||
|
|
|
|||
|
|
printf("# Library header:\n");
|
|||
|
|
|
|||
|
|
if( fileglob( array, libraryName ) ) {
|
|||
|
|
printf("SET CONFIRM YES;\n");
|
|||
|
|
printf("REMOVE '%s';\n", libraryName );
|
|||
|
|
printf("SET CONFIRM OFF;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("OPEN '%s';\n", libraryName);
|
|||
|
|
printf("SET WIRE_BEND 2;\n");
|
|||
|
|
printf("SET OPTIMIZING OFF;\n");
|
|||
|
|
|
|||
|
|
printf("#\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Returns originalName
|
|||
|
|
|
|||
|
|
string GetOriginalDeviceName( int startToken )
|
|||
|
|
{
|
|||
|
|
string originalName = "";
|
|||
|
|
|
|||
|
|
int token = FindToken( startToken, "originalName" );
|
|||
|
|
|
|||
|
|
if( token > 0 ) {
|
|||
|
|
originalName = Tokens[ token + 1 ];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( ReplaceNotSupportedCharacters( RemoveDoubleQuotas( originalName ) ) );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function generates one pad in device
|
|||
|
|
|
|||
|
|
void GeneratePad( int startToken, int zeroPosition )
|
|||
|
|
{
|
|||
|
|
int tokenPosition = FindToken( startToken + 1, "padStyleRef" );
|
|||
|
|
|
|||
|
|
if( tokenPosition >= 0 ) {
|
|||
|
|
printf("#padStyleRef = %s\n", Tokens[ tokenPosition + 1 ] );
|
|||
|
|
|
|||
|
|
string info;
|
|||
|
|
sprintf( info, "Process pad %d %s", tokenPosition, Tokens[ tokenPosition + 1 ] );
|
|||
|
|
UpdateProgress( info );
|
|||
|
|
|
|||
|
|
int PadStyleDefNum = FindPadStyleDef( Tokens[ tokenPosition + 1 ] );
|
|||
|
|
|
|||
|
|
if( PadStyleDefNum >= 0 ) {
|
|||
|
|
if( PadStyleDefsSkip[ PadStyleDefNum ] == 0 ) {
|
|||
|
|
printf( "%s", PadStyleDefsScript[ PadStyleDefNum ] );
|
|||
|
|
|
|||
|
|
int defaultPinDesPosition = FindToken( startToken + 1, "defaultPinDes" );
|
|||
|
|
|
|||
|
|
int padNumPosition = FindToken( startToken + 1, "padNum" );
|
|||
|
|
|
|||
|
|
if( padNumPosition >= 0 ) {
|
|||
|
|
int padCoordPosition = FindToken( startToken + 1, "pt" );
|
|||
|
|
|
|||
|
|
if( padCoordPosition >= 0 ) {
|
|||
|
|
string rotation = "0";
|
|||
|
|
|
|||
|
|
int rotationPosition = FindToken( startToken + 1, "rotation" );
|
|||
|
|
|
|||
|
|
if( rotationPosition >= 0 ) {
|
|||
|
|
rotation = Tokens[ rotationPosition + 1 ];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( PadShapeAddRotation[ PadStyleDefNum ] ) {
|
|||
|
|
real rot = strtod( rotation );
|
|||
|
|
|
|||
|
|
rot = rot + 90.0;
|
|||
|
|
|
|||
|
|
if( rot >= 360.0 ) {
|
|||
|
|
rot = rot - 360.0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sprintf( rotation, "%f", rot );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string padName = "";
|
|||
|
|
|
|||
|
|
padName = Tokens[ padNumPosition + 1 ];
|
|||
|
|
|
|||
|
|
/*if( defaultPinDesPosition >= 0 ) {
|
|||
|
|
padName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ defaultPinDesPosition + 1 ] ) );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
padName = Tokens[ padNumPosition + 1 ];
|
|||
|
|
}*/
|
|||
|
|
|
|||
|
|
string xCoordPad = "";
|
|||
|
|
string yCoordPad = "";
|
|||
|
|
|
|||
|
|
xCoordPad = Tokens[ padCoordPosition + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ padCoordPosition + 2 ] ) ) {
|
|||
|
|
xCoordPad = xCoordPad + Tokens[ padCoordPosition + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ padCoordPosition + 3 ] != ")" ) {
|
|||
|
|
yCoordPad = Tokens[ padCoordPosition + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ padCoordPosition + 4 ] != ")" ) {
|
|||
|
|
yCoordPad = yCoordPad + Tokens[ padCoordPosition + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoordPad = Tokens[ padCoordPosition + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ padCoordPosition + 3 ] != ")" ) {
|
|||
|
|
yCoordPad = yCoordPad + Tokens[ padCoordPosition + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string Val1 = ConvertUnits( GetNumberValue( xCoordPad ),
|
|||
|
|
GetUnitValue( xCoordPad ) );
|
|||
|
|
string Val2 = ConvertUnits( GetNumberValue( yCoordPad ),
|
|||
|
|
GetUnitValue( yCoordPad ) );
|
|||
|
|
|
|||
|
|
if( zeroPosition ) {
|
|||
|
|
Val1 = "0.0";
|
|||
|
|
Val2 = "0.0";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( IfSMD[ PadStyleDefNum ] ) {
|
|||
|
|
printf( " R%s '%s' (%s %s);\n",
|
|||
|
|
rotation,
|
|||
|
|
padName,
|
|||
|
|
Val1, Val2 );
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
int pos = strstr( PadStyleDefsScript[ PadStyleDefNum ], "HOLE" );
|
|||
|
|
|
|||
|
|
if( padName == "0" ) {
|
|||
|
|
printf( " (%s %s);\n",
|
|||
|
|
Val1, Val2 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( pos >= 0 ) {
|
|||
|
|
printf( " '%s' (%s %s);\n",
|
|||
|
|
padName,
|
|||
|
|
Val1, Val2 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf( " R%s '%s' (%s %s);\n",
|
|||
|
|
rotation,
|
|||
|
|
padName,
|
|||
|
|
Val1, Val2 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int PPointer = PadShapePoiner[ PadStyleDefNum ];
|
|||
|
|
int PNumber = NrPadShapes[ PadStyleDefNum ];
|
|||
|
|
|
|||
|
|
for( int i = 0; i < PNumber; i++, PPointer++ ) {
|
|||
|
|
if( PadShapeStyleShapeType[ PPointer ] == 1 ) {
|
|||
|
|
printf("CHANGE LAYER %s;\n", ConvertLayer( PadShapeStyleDefsLayer[ PPointer ] ) );
|
|||
|
|
|
|||
|
|
real xCoord = GetValue( Tokens[ padCoordPosition + 1 ] );
|
|||
|
|
real yCoord = GetValue( Tokens[ padCoordPosition + 2 ] );
|
|||
|
|
real halfWidth = GetValue( PadShapeStyleDefsWidth[ PPointer ] ) / 2.0;
|
|||
|
|
real halfHeight = GetValue( PadShapeStyleDefsHeight[ PPointer ] ) / 2.0;
|
|||
|
|
|
|||
|
|
if( halfWidth > halfHeight ) {
|
|||
|
|
FilledEllipse( halfWidth, halfHeight, xCoord, yCoord, 0 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
FilledEllipse( halfHeight, halfWidth, xCoord, yCoord, 90.0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( PadShapeStyleShapeType[ PPointer ] == 2 ) {
|
|||
|
|
printf("CHANGE LAYER %s;\n", ConvertLayer( PadShapeStyleDefsLayer[ PPointer ] ) );
|
|||
|
|
|
|||
|
|
real xCoord = GetValue( Tokens[ padCoordPosition + 1 ] );
|
|||
|
|
real yCoord = GetValue( Tokens[ padCoordPosition + 2 ] );
|
|||
|
|
real halfWidth = GetValue( PadShapeStyleDefsWidth[ PPointer ] ) / 2.0;
|
|||
|
|
real halfHeight = GetValue( PadShapeStyleDefsHeight[ PPointer ] ) / 2.0;
|
|||
|
|
|
|||
|
|
real rotationInRad = strtod( rotation ) * PI / 180.0;
|
|||
|
|
|
|||
|
|
real radius;
|
|||
|
|
|
|||
|
|
if( halfWidth < halfHeight ) {
|
|||
|
|
radius = halfWidth / ROUNDNESS;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
radius = halfHeight / ROUNDNESS;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("# PadShapeStyleShapeType = 2 halfWidth = %f halfHeight = %f radius = %f\n", halfWidth, halfHeight, radius );
|
|||
|
|
|
|||
|
|
real x_lo = -halfWidth + radius;
|
|||
|
|
real y_lo = -halfHeight + radius;
|
|||
|
|
real x_hi = halfWidth - radius;
|
|||
|
|
real y_hi = halfHeight - radius;
|
|||
|
|
|
|||
|
|
printf("POLYGON %f (%f %f) (%f %f) (%f %f) (%f %f) (%f %f);\n", 2 * radius,
|
|||
|
|
xCoord + RotateXCoord( x_lo, y_lo, rotationInRad ), yCoord + RotateYCoord( x_lo, y_lo, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( x_hi, y_lo, rotationInRad ), yCoord + RotateYCoord( x_hi, y_lo, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( x_hi, y_hi, rotationInRad ), yCoord + RotateYCoord( x_hi, y_hi, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( x_lo, y_hi, rotationInRad ), yCoord + RotateYCoord( x_lo, y_hi, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( x_lo, y_hi, rotationInRad ), yCoord + RotateYCoord( x_lo, y_hi, rotationInRad ) );
|
|||
|
|
|
|||
|
|
/*printf("POLYGON 0 (%f %f) (%f %f) @-%f (%f %f) (%f %f) @-%f (%f %f) (%f %f) @-%f (%f %f) (%f %f) @-%f (%f %f) ;\n",
|
|||
|
|
xCoord + RotateXCoord( halfWidth - radius, -halfHeight, rotationInRad ), yCoord + RotateYCoord( halfWidth - radius, -halfHeight, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( -halfWidth + radius, -halfHeight, rotationInRad ), yCoord + RotateYCoord( -halfWidth + radius, -halfHeight, rotationInRad ),
|
|||
|
|
radius,
|
|||
|
|
xCoord + RotateXCoord( -halfWidth, -halfHeight + radius, rotationInRad ), yCoord + RotateYCoord( -halfWidth, -halfHeight + radius, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( -halfWidth, halfHeight - radius, rotationInRad ), yCoord + RotateYCoord( -halfWidth, halfHeight - radius, rotationInRad ),
|
|||
|
|
radius,
|
|||
|
|
xCoord + RotateXCoord( -halfWidth + radius, halfHeight, rotationInRad ), yCoord + RotateYCoord( -halfWidth + radius, halfHeight, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( halfWidth - radius, halfHeight, rotationInRad ), yCoord + RotateYCoord( halfWidth - radius, halfHeight, rotationInRad ),
|
|||
|
|
radius,
|
|||
|
|
xCoord + RotateXCoord( halfWidth, halfHeight - radius, rotationInRad ), yCoord + RotateYCoord( halfWidth, halfHeight - radius, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( halfWidth, -halfHeight + radius, rotationInRad ), yCoord + RotateYCoord( halfWidth, -halfHeight + radius, rotationInRad ),
|
|||
|
|
radius,
|
|||
|
|
xCoord + RotateXCoord( halfWidth - radius, -halfHeight, rotationInRad ), yCoord + RotateYCoord( halfWidth - radius, -halfHeight, rotationInRad ) );*/
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( PadShapeStyleShapeType[ PPointer ] == 3 ) {
|
|||
|
|
string xPadCoord[];
|
|||
|
|
string yPadCoord[];
|
|||
|
|
int nrLines = 0;
|
|||
|
|
|
|||
|
|
printf("CHANGE LAYER %s;\n", ConvertLayer( PadShapeStyleDefsLayer[ PPointer ] ) );
|
|||
|
|
|
|||
|
|
int currentToken = PadShapeStyleDefsPolygon[ PPointer ];
|
|||
|
|
|
|||
|
|
while( currentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ currentToken ] == "(" ) {
|
|||
|
|
currentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ currentToken ] == "pt" ) {
|
|||
|
|
xPadCoord[ nrLines ] = Tokens[ currentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ currentToken + 2 ] ) ) {
|
|||
|
|
xPadCoord[ nrLines ] = xPadCoord[ nrLines ] + Tokens[ currentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ currentToken + 3 ] != ")" ) {
|
|||
|
|
yPadCoord[ nrLines ] = Tokens[ currentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ currentToken + 4 ] != ")" ) {
|
|||
|
|
yPadCoord[ nrLines ] = yPadCoord[ nrLines ] + Tokens[ currentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yPadCoord[ nrLines ] = Tokens[ currentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ currentToken + 3 ] != ")" ) {
|
|||
|
|
yPadCoord[ nrLines ] = yPadCoord[ nrLines ] + Tokens[ currentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
nrLines++;
|
|||
|
|
|
|||
|
|
currentToken = currentToken + 3;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ currentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
currentToken++;
|
|||
|
|
} // while
|
|||
|
|
|
|||
|
|
real xCoord = GetValue( Tokens[ padCoordPosition + 1 ] );
|
|||
|
|
real yCoord = GetValue( Tokens[ padCoordPosition + 2 ] );
|
|||
|
|
|
|||
|
|
//printf("GRID 0.01 mil;\n" );
|
|||
|
|
|
|||
|
|
real rotationInRad = strtod( rotation ) * PI / 180.0;
|
|||
|
|
|
|||
|
|
printf("# PadShapeStyleShapeType == 3\n");
|
|||
|
|
|
|||
|
|
printf("POLYGON 0\n");
|
|||
|
|
|
|||
|
|
for( int i = 0; i < nrLines; i++ ) {
|
|||
|
|
real xPolyCoord = strtod( ConvertUnits( GetNumberValue( xPadCoord[ i ] ), GetUnitValue( xPadCoord[ i ] ) ) );
|
|||
|
|
real yPolyCoord = strtod( ConvertUnits( GetNumberValue( yPadCoord[ i ] ), GetUnitValue( yPadCoord[ i ] ) ) );
|
|||
|
|
|
|||
|
|
printf(" (%f %f)\n", xCoord + RotateXCoord( xPolyCoord, yPolyCoord, rotationInRad ), yCoord + RotateYCoord( xPolyCoord, yPolyCoord, rotationInRad ) );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
real xPolyCoord = strtod( ConvertUnits( GetNumberValue( xPadCoord[ 0 ] ), GetUnitValue( xPadCoord[ 0 ] ) ) );
|
|||
|
|
real yPolyCoord = strtod( ConvertUnits( GetNumberValue( yPadCoord[ 0 ] ), GetUnitValue( yPadCoord[ 0 ] ) ) );
|
|||
|
|
|
|||
|
|
printf(" (%f %f);\n", xCoord + RotateXCoord( xPolyCoord, yPolyCoord, rotationInRad ), yCoord + RotateYCoord( xPolyCoord, yPolyCoord, rotationInRad ) );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( PadShapeStyleShapeType[ PPointer ] == 4 ) {
|
|||
|
|
printf("CHANGE LAYER %s;\n", ConvertLayer( PadShapeStyleDefsLayer[ PPointer ] ) );
|
|||
|
|
|
|||
|
|
real xCoord = GetValue( Tokens[ padCoordPosition + 1 ] );
|
|||
|
|
real yCoord = GetValue( Tokens[ padCoordPosition + 2 ] );
|
|||
|
|
real halfWidth = GetValue( PadShapeStyleDefsWidth[ PPointer ] ) / 2.0;
|
|||
|
|
real halfHeight = GetValue( PadShapeStyleDefsHeight[ PPointer ] ) / 2.0;
|
|||
|
|
|
|||
|
|
printf("# PadShapeStyleShapeType = 4\n");
|
|||
|
|
|
|||
|
|
real rotationInRad = strtod( rotation ) * PI / 180.0;
|
|||
|
|
|
|||
|
|
printf("POLYGON 0 (%f %f) (%f %f) (%f %f) (%f %f) (%f %f);\n",
|
|||
|
|
xCoord + RotateXCoord( -halfWidth, -halfHeight, rotationInRad ), yCoord + RotateYCoord( -halfWidth, -halfHeight, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( halfWidth, -halfHeight, rotationInRad ), yCoord + RotateYCoord( halfWidth, -halfHeight, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( halfWidth, halfHeight, rotationInRad ), yCoord + RotateYCoord( halfWidth, halfHeight, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( -halfWidth, halfHeight, rotationInRad ), yCoord + RotateYCoord( -halfWidth, halfHeight, rotationInRad ),
|
|||
|
|
xCoord + RotateXCoord( -halfWidth, -halfHeight, rotationInRad ), yCoord + RotateYCoord( -halfWidth, -halfHeight, rotationInRad ) );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "#WARNING: Can't find pt for pad %s\n",
|
|||
|
|
Tokens[ startToken + 3 ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
printf("#WARNING: Can't find padNum for pad %s\n",
|
|||
|
|
Tokens[ startToken + 3 ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf("#skip this pad\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
printf("#WARNING: Can't find padStyleDef for pad %s\n",
|
|||
|
|
Tokens[ startToken + 3 ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
printf("#WARNING: Can't find padStyleRef for pad %s\n",
|
|||
|
|
Tokens[ startToken + 3 ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOneLine( int startToken, int ifNet, int ifBoard )
|
|||
|
|
{
|
|||
|
|
string net = "";
|
|||
|
|
string width;
|
|||
|
|
string xLineCoord[];
|
|||
|
|
string yLineCoord[];
|
|||
|
|
int nrLines = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = FindToken( startToken + 1, "width" );
|
|||
|
|
|
|||
|
|
|
|||
|
|
if( CurrentToken > 0 ) {
|
|||
|
|
string TokenText = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 2 ] != ")" ) {
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
TokenText = TokenText + Tokens[ CurrentToken + 2 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wrong description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
width = TokenText;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( ifBoard ) {
|
|||
|
|
width = DEFAULT_WIRE_WIDTH_BOARD;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
width = DEFAULT_WIRE_WIDTH_SCHEMATIC;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( 1 ) {
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
xLineCoord[ nrLines ] = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xLineCoord[ nrLines ] = xLineCoord[ nrLines ] + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yLineCoord[ nrLines ] = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yLineCoord[ nrLines ] = yLineCoord[ nrLines ] + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yLineCoord[ nrLines ] = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yLineCoord[ nrLines ] = yLineCoord[ nrLines ] + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
nrLines++;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "width" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "netNameRef" ) {
|
|||
|
|
net = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "dimensionRef" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "endStyle" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GenerateOneLine ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in GenerateOneLine " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( ifNet ) {
|
|||
|
|
for( int i = 0; i < nrLines - 1; i++ ) {
|
|||
|
|
printf("NET '%s' (%s %s) (%s %s);\n", net, xLineCoord[ i ], yLineCoord[ i ],
|
|||
|
|
xLineCoord[ i + 1 ], yLineCoord[ i + 1 ] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for( int j = 0; j < nrLines; j++ ) {
|
|||
|
|
real xCoord = strtod( ConvertUnits( GetNumberValue( xLineCoord[ j ] ), GetUnitValue( xLineCoord[ j ] ) ) );
|
|||
|
|
real yCoord = strtod( ConvertUnits( GetNumberValue( yLineCoord[ j ] ), GetUnitValue( yLineCoord[ j ] ) ) );
|
|||
|
|
|
|||
|
|
WiresPointX[ NrWiresPoint ] = xCoord;
|
|||
|
|
WiresPointY[ NrWiresPoint ] = yCoord;
|
|||
|
|
WiresNet[ NrWiresPoint ] = net;
|
|||
|
|
|
|||
|
|
NrWiresPoint++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Generate line or wire
|
|||
|
|
if( net == "" ) {
|
|||
|
|
for( int i = 0; i < nrLines - 1; i++ ) {
|
|||
|
|
string Val1 = ConvertUnits( GetNumberValue( xLineCoord[ i ] ),
|
|||
|
|
GetUnitValue( xLineCoord[ i ] ) );
|
|||
|
|
string Val2 = ConvertUnits( GetNumberValue( yLineCoord[ i ] ),
|
|||
|
|
GetUnitValue( yLineCoord[ i ] ) );
|
|||
|
|
|
|||
|
|
string Val3 = ConvertUnits( GetNumberValue( xLineCoord[ i + 1 ] ),
|
|||
|
|
GetUnitValue( xLineCoord[ i + 1 ] ) );
|
|||
|
|
string Val4 = ConvertUnits( GetNumberValue( yLineCoord[ i + 1 ] ),
|
|||
|
|
GetUnitValue( yLineCoord[ i + 1 ] ) );
|
|||
|
|
|
|||
|
|
printf("WIRE %s (%s %s) (%s %s);\n", width, Val1, Val2, Val3, Val4 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
for( int i = 0; i < nrLines - 1; i++ ) {
|
|||
|
|
string Val1 = ConvertUnits( GetNumberValue( xLineCoord[ i ] ),
|
|||
|
|
GetUnitValue( xLineCoord[ i ] ) );
|
|||
|
|
string Val2 = ConvertUnits( GetNumberValue( yLineCoord[ i ] ),
|
|||
|
|
GetUnitValue( yLineCoord[ i ] ) );
|
|||
|
|
|
|||
|
|
string Val3 = ConvertUnits( GetNumberValue( xLineCoord[ i + 1 ] ),
|
|||
|
|
GetUnitValue( xLineCoord[ i + 1 ] ) );
|
|||
|
|
string Val4 = ConvertUnits( GetNumberValue( yLineCoord[ i + 1 ] ),
|
|||
|
|
GetUnitValue( yLineCoord[ i + 1 ] ) );
|
|||
|
|
|
|||
|
|
printf("WIRE '%s' %s (%s %s) (%s %s);\n", net, width, Val1, Val2, Val3, Val4 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("# warning: GenerateOneLine can't find width.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOnePcbPoly( int startToken, int ifBoard, string width )
|
|||
|
|
{
|
|||
|
|
string net = "";
|
|||
|
|
string xLineCoord[];
|
|||
|
|
string yLineCoord[];
|
|||
|
|
int nrLines = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
xLineCoord[ nrLines ] = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xLineCoord[ nrLines ] = xLineCoord[ nrLines ] + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yLineCoord[ nrLines ] = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yLineCoord[ nrLines ] = yLineCoord[ nrLines ] + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yLineCoord[ nrLines ] = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yLineCoord[ nrLines ] = yLineCoord[ nrLines ] + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
nrLines++;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "width" ) {
|
|||
|
|
string TokenText = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 2 ] != ")" ) {
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
TokenText = TokenText + Tokens[ CurrentToken + 2 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wrong description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
width = TokenText;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "netNameRef" ) {
|
|||
|
|
net = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "fillets" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GenerateOnePcbPoly ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in GenerateOnePcbPoly " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( width == "" ) {
|
|||
|
|
width = "0";
|
|||
|
|
|
|||
|
|
/*if( ifBoard ) {
|
|||
|
|
width = DEFAULT_WIRE_WIDTH_BOARD;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
width = DEFAULT_WIRE_WIDTH_SCHEMATIC;
|
|||
|
|
}*/
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Generate line
|
|||
|
|
if( net == "" ) {
|
|||
|
|
printf("POLYGON");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf("POLYGON '%s'", net );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( width == "" ) {
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf(" %s", width );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("\n");
|
|||
|
|
|
|||
|
|
for( int i = 0; i < nrLines; i++ ) {
|
|||
|
|
printf(" (%s %s)\n", xLineCoord[ i ], yLineCoord[ i ] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf(" (%s %s);\n", xLineCoord[ 0 ], yLineCoord[ 0 ] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOneText( int startToken )
|
|||
|
|
{
|
|||
|
|
string text = "";
|
|||
|
|
string textStyleDef;
|
|||
|
|
string textRotation = "0";
|
|||
|
|
string xTextCoord;
|
|||
|
|
string yTextCoord;
|
|||
|
|
string justify = "";
|
|||
|
|
string xExtent = "";
|
|||
|
|
string yExtent = "";
|
|||
|
|
string mirrored = "";
|
|||
|
|
int pointFound = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = FindToken( startToken + 1, "textStyleRef" );
|
|||
|
|
|
|||
|
|
textStyleDef = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( CurrentToken > 0 ) {
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
pointFound = 1;
|
|||
|
|
|
|||
|
|
xTextCoord = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xTextCoord = xTextCoord + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yTextCoord = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yTextCoord = yTextCoord + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yTextCoord = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yTextCoord = yTextCoord + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "rotation" ) {
|
|||
|
|
textRotation = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "justify" ) {
|
|||
|
|
justify = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "extent" ) {
|
|||
|
|
//xExtent = Tokens[ CurrentToken + 1 ];
|
|||
|
|
//yExtent = Tokens[ CurrentToken + 2 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isFlipped" ) {
|
|||
|
|
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
|
|||
|
|
mirrored = "M";
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isVisible" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GenerateOneText ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( UseExternalText ) {
|
|||
|
|
text = ExternalText;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
sprintf( text, "'%s'", ReplaceNotSupportedCharactersText( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) ) );
|
|||
|
|
|
|||
|
|
//printf("# IfPinText = %d text = %s\n", IfPinText, text );
|
|||
|
|
|
|||
|
|
// It should be in all cases as we discussed
|
|||
|
|
//if( IfPinText ) {
|
|||
|
|
if( text[ 1 ] == '~' ) {
|
|||
|
|
text[ 1 ] = '!';
|
|||
|
|
}
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( text == "''" ) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( !pointFound ) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( justify == "" ) { //LowerLeft
|
|||
|
|
printf("CHANGE ALIGN BOTTOM LEFT;\n");
|
|||
|
|
|
|||
|
|
if( xExtent != "" ) {
|
|||
|
|
sprintf( xTextCoord, "%f", strtod( xTextCoord ) - strtod( xExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( yExtent != "" ) {
|
|||
|
|
sprintf( yTextCoord, "%f", strtod( yTextCoord ) - strtod( yExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
} else if( justify == "UpperLeft" ) {
|
|||
|
|
printf("CHANGE ALIGN TOP LEFT;\n");
|
|||
|
|
|
|||
|
|
if( xExtent != "" ) {
|
|||
|
|
sprintf( xTextCoord, "%f", strtod( xTextCoord ) - strtod( xExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( yExtent != "" ) {
|
|||
|
|
sprintf( yTextCoord, "%f", strtod( yTextCoord ) + strtod( yExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
} else if( justify == "UpperCenter" ) {
|
|||
|
|
printf("CHANGE ALIGN TOP CENTER;\n");
|
|||
|
|
|
|||
|
|
if( yExtent != "" ) {
|
|||
|
|
sprintf( yTextCoord, "%f", strtod( yTextCoord ) + strtod( yExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
} else if( justify == "UpperRight" ) {
|
|||
|
|
printf("CHANGE ALIGN TOP RIGHT;\n");
|
|||
|
|
|
|||
|
|
if( xExtent != "" ) {
|
|||
|
|
sprintf( xTextCoord, "%f", strtod( xTextCoord ) + strtod( xExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( yExtent != "" ) {
|
|||
|
|
sprintf( yTextCoord, "%f", strtod( yTextCoord ) + strtod( yExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
} else if( justify == "Left" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER LEFT;\n");
|
|||
|
|
|
|||
|
|
if( xExtent != "" ) {
|
|||
|
|
sprintf( xTextCoord, "%f", strtod( xTextCoord ) - strtod( xExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
} else if( justify == "Center" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER CENTER;\n");
|
|||
|
|
} else if( justify == "Right" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER RIGHT;\n");
|
|||
|
|
|
|||
|
|
if( xExtent != "" ) {
|
|||
|
|
sprintf( xTextCoord, "%f", strtod( xTextCoord ) + strtod( xExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
} else if( justify == "LowerLeft" ) {
|
|||
|
|
printf("CHANGE ALIGN BOTTOM LEFT;\n");
|
|||
|
|
|
|||
|
|
if( xExtent != "" ) {
|
|||
|
|
sprintf( xTextCoord, "%f", strtod( xTextCoord ) - strtod( xExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( yExtent != "" ) {
|
|||
|
|
sprintf( yTextCoord, "%f", strtod( yTextCoord ) - strtod( yExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
} else if( justify == "LowerCenter" ) {
|
|||
|
|
printf("CHANGE ALIGN BOTTOM CENTER;\n");
|
|||
|
|
|
|||
|
|
if( yExtent != "" ) {
|
|||
|
|
sprintf( yTextCoord, "%f", strtod( yTextCoord ) - strtod( yExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} else if( justify == "LowerRight" ) {
|
|||
|
|
printf("CHANGE ALIGN BOTTOM RIGHT;\n");
|
|||
|
|
|
|||
|
|
if( xExtent != "" ) {
|
|||
|
|
sprintf( xTextCoord, "%f", strtod( xTextCoord ) + strtod( xExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( yExtent != "" ) {
|
|||
|
|
sprintf( yTextCoord, "%f", strtod( yTextCoord ) - strtod( yExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf("# warning: unknown justify parameter value = %s\n", justify );
|
|||
|
|
printf("CHANGE ALIGN BOTTOM LEFT;\n");
|
|||
|
|
|
|||
|
|
if( xExtent != "" ) {
|
|||
|
|
sprintf( xTextCoord, "%f", strtod( xTextCoord ) - strtod( xExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( yExtent != "" ) {
|
|||
|
|
sprintf( yTextCoord, "%f", strtod( yTextCoord ) - strtod( yExtent ) / 2 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Generate text
|
|||
|
|
int textStyleDefPos = FindTextStyleDef( textStyleDef );
|
|||
|
|
|
|||
|
|
if( textStyleDefPos >= 0 ) {
|
|||
|
|
real fontHeight = strtod( ConvertUnits( GetNumberValue( TextStyleDefFontHeight[ textStyleDefPos ] ), GetUnitValue( TextStyleDefFontHeight[ textStyleDefPos ] ) ) );
|
|||
|
|
real fontWidth = strtod( ConvertUnits( GetNumberValue( TextStyleDefFontStrokeWidth[ textStyleDefPos ] ), GetUnitValue( TextStyleDefFontStrokeWidth[ textStyleDefPos ] ) ) );
|
|||
|
|
|
|||
|
|
printf("CHANGE SIZE %s;\n", TextStyleDefFontHeight[ textStyleDefPos ] );
|
|||
|
|
|
|||
|
|
if( fontHeight ) {
|
|||
|
|
int ratio = round( 100.0 * fontWidth / fontHeight );
|
|||
|
|
|
|||
|
|
if( ratio > 31.0 ) {
|
|||
|
|
ratio = 31.0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("CHANGE RATIO %d;\n", ratio );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("TEXT %s %sSR%s (%s %s);\n", text, mirrored, textRotation, xTextCoord, yTextCoord );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("# warning: GenerateOneText can't find textStyleDef.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("# warning: GenerateOneText can't find textStyleRef.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOneBus( int startToken )
|
|||
|
|
{
|
|||
|
|
int textToken;
|
|||
|
|
string dispName;
|
|||
|
|
string textX;
|
|||
|
|
string textY;
|
|||
|
|
string xLineCoord[];
|
|||
|
|
string yLineCoord[];
|
|||
|
|
int nrLines = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
string name = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
xLineCoord[ nrLines ] = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xLineCoord[ nrLines ] = xLineCoord[ nrLines ] + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yLineCoord[ nrLines ] = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yLineCoord[ nrLines ] = yLineCoord[ nrLines ] + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yLineCoord[ nrLines ] = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yLineCoord[ nrLines ] = yLineCoord[ nrLines ] + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
nrLines++;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "dispName" ) {
|
|||
|
|
dispName = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "text" ) {
|
|||
|
|
textToken = CurrentToken;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GenerateOneBus ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in GenerateOneBus " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int pos = strchr( name, '(' );
|
|||
|
|
|
|||
|
|
if( pos >= 0 ) {
|
|||
|
|
int pos1 = strchr( name, ':' );
|
|||
|
|
|
|||
|
|
if( pos1 >= 0 ) {
|
|||
|
|
if( pos1 > pos + 1 ) {
|
|||
|
|
int firstNumber = strtol( strsub( name, pos + 1, pos1 - pos - 1 ) );
|
|||
|
|
|
|||
|
|
int pos2 = strchr( name, ')' );
|
|||
|
|
|
|||
|
|
if( pos2 >= 0 ) {
|
|||
|
|
if( pos2 > pos1 + 1 ) {
|
|||
|
|
int secondNumber = strtol( strsub( name, pos1 + 1, pos2 - pos1 - 1 ) );
|
|||
|
|
|
|||
|
|
string busName = ReplaceNotSupportedCharacters( strsub( name, 0, pos ) );
|
|||
|
|
|
|||
|
|
for( int i = 0; i < nrLines - 1; i++ ) {
|
|||
|
|
printf("BUS '%s[%d..%d]' (%s %s) (%s %s);\n", busName, firstNumber, secondNumber,
|
|||
|
|
xLineCoord[ i ], yLineCoord[ i ],
|
|||
|
|
xLineCoord[ i + 1 ], yLineCoord[ i + 1 ] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( dispName == "True" ) {
|
|||
|
|
UseExternalText = 1;
|
|||
|
|
sprintf( ExternalText, "'%s[%d..%d]'", busName, firstNumber, secondNumber );
|
|||
|
|
GenerateOneText( textToken );
|
|||
|
|
UseExternalText = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: GenerateOneBus cant find ')'\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: GenerateOneBus wrong first number\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: GenerateOneBus cant find ':'\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string busName = ReplaceNotSupportedCharacters( name );
|
|||
|
|
|
|||
|
|
for( int i = 0; i < nrLines - 1; i++ ) {
|
|||
|
|
printf("BUS '%s' (%s %s) (%s %s);\n", busName,
|
|||
|
|
xLineCoord[ i ], yLineCoord[ i ],
|
|||
|
|
xLineCoord[ i + 1 ], yLineCoord[ i + 1 ] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( dispName == "True" ) {
|
|||
|
|
UseExternalText = 1;
|
|||
|
|
sprintf( ExternalText, "'%s'", busName );
|
|||
|
|
GenerateOneText( textToken );
|
|||
|
|
UseExternalText = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//printf( "# GenerateOneBus cant find '('\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ArcDraw( string width, real X, string xArcCoordUnit, real Y, string yArcCoordUnit,
|
|||
|
|
real Radius, string radiusUnit, real arcs, real arce )
|
|||
|
|
{
|
|||
|
|
string as;
|
|||
|
|
real arcStart = 360 + (arcs);
|
|||
|
|
if (arcStart > 360) arcStart -= 360;
|
|||
|
|
real arcEnd = arcStart + (arce);
|
|||
|
|
if (arcEnd > 360) arcEnd -= 360;
|
|||
|
|
real xArcStart = Radius * cos(PI / 180 * arcStart);
|
|||
|
|
real yArcStart = Radius * sin(PI / 180 * arcStart);
|
|||
|
|
real xArcEnd = Radius * cos(PI / 180 * arcEnd);
|
|||
|
|
real yArcEnd = Radius * sin(PI / 180 * arcEnd);
|
|||
|
|
|
|||
|
|
printf( "ARC CCW %s (%.8f%s %.8f%s) (%.8f%s %.8f%s) (%.8f%s %.8f%s);\n",
|
|||
|
|
width,
|
|||
|
|
X + xArcStart, xArcCoordUnit, Y + yArcStart, yArcCoordUnit,
|
|||
|
|
X - xArcStart, xArcCoordUnit, Y - yArcStart, yArcCoordUnit,
|
|||
|
|
X + xArcEnd, xArcCoordUnit, Y + yArcEnd, yArcCoordUnit );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOneArc( int startToken )
|
|||
|
|
{
|
|||
|
|
real radius;
|
|||
|
|
string radiusUnit = "";
|
|||
|
|
real startAngle;
|
|||
|
|
real sweepAngle;
|
|||
|
|
string width;
|
|||
|
|
real xArcCoord;
|
|||
|
|
string xArcCoordUnit = "";
|
|||
|
|
real yArcCoord;
|
|||
|
|
string yArcCoordUnit = "";
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
string xArcCoordText = "";
|
|||
|
|
string yArcCoordText = "";
|
|||
|
|
|
|||
|
|
xArcCoordText = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xArcCoordText = xArcCoordText + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yArcCoordText = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yArcCoordText = yArcCoordText + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yArcCoordText = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yArcCoordText = yArcCoordText + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
xArcCoord = strtod( ConvertUnits( GetNumberValue( xArcCoordText ), GetUnitValue( xArcCoordText ) ) );
|
|||
|
|
yArcCoord = strtod( ConvertUnits( GetNumberValue( yArcCoordText ), GetUnitValue( yArcCoordText ) ) );
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "radius" ) {
|
|||
|
|
string ArcRadiusText = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 2 ] != ")" ) {
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
ArcRadiusText = ArcRadiusText + Tokens[ CurrentToken + 2 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront radius description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
radius = strtod( ConvertUnits( GetNumberValue( ArcRadiusText ), GetUnitValue( ArcRadiusText ) ) );
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "startAngle" ) {
|
|||
|
|
startAngle = strtod( Tokens[ CurrentToken + 1 ] );
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "sweepAngle" ) {
|
|||
|
|
sweepAngle = strtod( Tokens[ CurrentToken + 1 ] );
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "width" ) {
|
|||
|
|
width = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GenerateOneArc ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//if( ( sweepAngle - startAngle >= 360 ) || ( ( ( sweepAngle == 0 ) && ( startAngle == 0 ) ) ) ) {
|
|||
|
|
if( ( sweepAngle >= 360 ) || ( ( ( sweepAngle == 0 ) && ( startAngle == 0 ) ) ) ) {
|
|||
|
|
printf("CIRCLE %s (%.8f%s %.8f%s) (%.8f%s %.8f%s);\n",
|
|||
|
|
width, xArcCoord, xArcCoordUnit, yArcCoord, yArcCoordUnit,
|
|||
|
|
xArcCoord + radius, xArcCoordUnit, yArcCoord, yArcCoordUnit );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
ArcDraw( width, xArcCoord, xArcCoordUnit, yArcCoord, yArcCoordUnit, radius, radiusUnit, startAngle, sweepAngle );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOneTripleArc( int startToken )
|
|||
|
|
{
|
|||
|
|
string width;
|
|||
|
|
real xPointCoord[];
|
|||
|
|
real yPointCoord[];
|
|||
|
|
int nrPoints = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
string xArcCoordText = "";
|
|||
|
|
string yArcCoordText = "";
|
|||
|
|
|
|||
|
|
xArcCoordText = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xArcCoordText = xArcCoordText + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yArcCoordText = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yArcCoordText = yArcCoordText + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yArcCoordText = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yArcCoordText = yArcCoordText + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
xPointCoord[ nrPoints ] = strtod( ConvertUnits( GetNumberValue( xArcCoordText ), GetUnitValue( xArcCoordText ) ) );
|
|||
|
|
yPointCoord[ nrPoints ] = strtod( ConvertUnits( GetNumberValue( yArcCoordText ), GetUnitValue( yArcCoordText ) ) );
|
|||
|
|
|
|||
|
|
//printf( "# coord = %f %f\n", xPointCoord[ nrPoints ], yPointCoord[ nrPoints ] );
|
|||
|
|
|
|||
|
|
nrPoints++;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "width" ) {
|
|||
|
|
width = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GenerateOneTripleArc ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( nrPoints == 3 ) {
|
|||
|
|
if( ( xPointCoord[ 1 ] == xPointCoord[ 2 ] ) && ( yPointCoord[ 1 ] == yPointCoord[ 2 ] ) ) {
|
|||
|
|
printf( "CIRCLE %s (%.8f %.8f) (%.8f %.8f); # triplePointArc\n", width,
|
|||
|
|
xPointCoord[ 0 ], yPointCoord[ 0 ],
|
|||
|
|
xPointCoord[ 1 ], yPointCoord[ 1 ] );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
real pX = 2 * xPointCoord[ 0 ] - xPointCoord[ 1 ];
|
|||
|
|
real pY = 2 * yPointCoord[ 0 ] - yPointCoord[ 1 ];
|
|||
|
|
|
|||
|
|
printf( "ARC CCW %s (%.8f %.8f) (%.8f %.8f) (%.8f %.8f); # triplePointArc\n", width,
|
|||
|
|
xPointCoord[ 1 ],
|
|||
|
|
yPointCoord[ 1 ],
|
|||
|
|
pX,
|
|||
|
|
pY,
|
|||
|
|
xPointCoord[ 2 ],
|
|||
|
|
yPointCoord[ 2 ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "warning: GenerateOneTripleArc wrong number of points %d\n", nrPoints );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateIslandCutouts( int startToken )
|
|||
|
|
{
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "islandOutline" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "cutout" ) {
|
|||
|
|
printf("CHANGE Pour cutout;\n");
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
CurrentToken++;
|
|||
|
|
CurrentToken++;
|
|||
|
|
printf( "CHANGE THERMALS OFF;\n");
|
|||
|
|
GenerateOnePcbPoly( CurrentToken, 1, "" );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
printf("CHANGE Pour solid;\n");
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf( "# GenerateIslandCutouts ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOneCopperPour95( int startToken )
|
|||
|
|
{
|
|||
|
|
int thermal = 0;
|
|||
|
|
int pourSolid = 1;
|
|||
|
|
string width = DEFAULT_WIRE_WIDTH_BOARD;
|
|||
|
|
string pourSpacing = "";
|
|||
|
|
|
|||
|
|
CurrentToken = FindToken( startToken + 1, "pourSpacing" );
|
|||
|
|
|
|||
|
|
if( CurrentToken > 0 ) {
|
|||
|
|
printf( "CHANGE SPACING %s;\n", Tokens[ CurrentToken + 1 ] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pourType" ) {
|
|||
|
|
if( Tokens[ CurrentToken + 1 ] != "SolidPour" ) {
|
|||
|
|
pourSolid = 0;
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "netNameRef" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pourSpacing" ) {
|
|||
|
|
string TokenText = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 2 ] != ")" ) {
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
TokenText = TokenText + Tokens[ CurrentToken + 2 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wrong description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pourSpacing = TokenText;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pourBackoff" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pourSmoothness" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "islandRemoval" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pcbPoly" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
if( thermal ) {
|
|||
|
|
printf( "CHANGE THERMALS ON;\n");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf( "CHANGE THERMALS OFF;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( pourSolid ) {
|
|||
|
|
printf( "CHANGE POUR SOLID;\n");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf( "CHANGE POUR HATCH;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( pourSpacing != "" ) {
|
|||
|
|
printf( "CHANGE SPACING %s;\n", pourSpacing );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf( "CHANGE SPACING 50mil;\n", pourSpacing );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("# CopperPour95\n");
|
|||
|
|
GenerateOnePcbPoly( SavePosition, 1, width );
|
|||
|
|
|
|||
|
|
if( thermal ) {
|
|||
|
|
printf( "CHANGE THERMALS OFF;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "width" ) {
|
|||
|
|
string TokenText = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 2 ] != ")" ) {
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
TokenText = TokenText + Tokens[ CurrentToken + 2 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wrong description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
width = TokenText;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "useDesignRules" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "thermalType" ) {
|
|||
|
|
if( Tokens[ CurrentToken + 1 ] != "NoTherm" ) {
|
|||
|
|
thermal = 1;
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "thermalWidth" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "thermalSpokes" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "viaThermalType" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "viaThermalWidth" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "viaThermalSpokes" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "island" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
// Comment this line because Eagle doesn't use GND cutouts
|
|||
|
|
//GenerateIslandCutouts( CurrentToken );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GenerateOneCopperPour95 ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOneDimension( int startToken )
|
|||
|
|
{
|
|||
|
|
CurrentToken = FindToken( startToken + 1, "dimPoints" );
|
|||
|
|
|
|||
|
|
if( CurrentToken > 0 ) {
|
|||
|
|
string xPointCoord[];
|
|||
|
|
string yPointCoord[];
|
|||
|
|
string xPointUnit[];
|
|||
|
|
string yPointUnit[];
|
|||
|
|
int nrPoints = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = CurrentToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
string xCoord = "";
|
|||
|
|
string yCoord = "";
|
|||
|
|
|
|||
|
|
xCoord = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xCoord = xCoord + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoord = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yCoord = yCoord + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoord = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoord = yCoord + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
xPointCoord[ nrPoints ] = GetNumberValue( xCoord );
|
|||
|
|
yPointCoord[ nrPoints ] = GetNumberValue( yCoord );
|
|||
|
|
xPointUnit[ nrPoints ] = GetUnitValue( xCoord );
|
|||
|
|
yPointUnit[ nrPoints ] = GetUnitValue( yCoord );
|
|||
|
|
|
|||
|
|
nrPoints++;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GenerateOneDimension ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = FindToken( startToken + 1, "dimOrient" );
|
|||
|
|
|
|||
|
|
string dimensionDirection = "PARALLEL";
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 1 ] == "dim_vertical" ) {
|
|||
|
|
xPointCoord[ 1 ] = xPointCoord[ 0 ];
|
|||
|
|
xPointUnit[ 1 ] = xPointUnit[ 0 ];
|
|||
|
|
dimensionDirection = "Horizontal";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 1 ] == "dim_horizontal" ) {
|
|||
|
|
yPointCoord[ 1 ] = yPointCoord[ 0 ];
|
|||
|
|
yPointUnit[ 1 ] = yPointUnit[ 0 ];
|
|||
|
|
dimensionDirection = "Vertical";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( nrPoints == 3 ) {
|
|||
|
|
printf("GRID mm 0.0001;\n" );
|
|||
|
|
printf("CHANGE LAYER 47;\n");
|
|||
|
|
printf( "DIMENSION %s (C%s%s %s%s) (C%s%s %s%s) (C%s%s %s%s);\n",
|
|||
|
|
dimensionDirection,
|
|||
|
|
xPointCoord[ 0 ],
|
|||
|
|
xPointUnit[ 0 ],
|
|||
|
|
yPointCoord[ 0 ],
|
|||
|
|
yPointUnit[ 0 ],
|
|||
|
|
xPointCoord[ 1 ],
|
|||
|
|
xPointUnit[ 1 ],
|
|||
|
|
yPointCoord[ 1 ],
|
|||
|
|
yPointUnit[ 1 ],
|
|||
|
|
xPointCoord[ 2 ],
|
|||
|
|
xPointUnit[ 2 ],
|
|||
|
|
yPointCoord[ 2 ],
|
|||
|
|
yPointUnit[ 2 ] );
|
|||
|
|
}
|
|||
|
|
printf("GRID %s;\n", FileUnits );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*void GenerateOneAttribute( int startToken, string layer )
|
|||
|
|
{
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
string type = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
if( type == "Type" ) {
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER;\n");
|
|||
|
|
printf("CHANGE LAYER 27;\n");
|
|||
|
|
|
|||
|
|
string xCoord = Tokens[ CurrentToken + 1 ];
|
|||
|
|
string yCoord = "";
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xCoord = xCoord + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoord = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yCoord = yCoord + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoord = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoord = yCoord + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("TEXT '>VALUE' (%s %s);\n",
|
|||
|
|
ConvertUnits( GetNumberValue( xCoord ), GetUnitValue( xCoord ) ),
|
|||
|
|
ConvertUnits( GetNumberValue( yCoord ), GetUnitValue( yCoord ) ) );
|
|||
|
|
|
|||
|
|
printf("CHANGE LAYER 25;\n");
|
|||
|
|
printf("TEXT '>NAME' (0.0 0.0);\n");
|
|||
|
|
|
|||
|
|
if( layer != "" ) {
|
|||
|
|
printf( "CHANGE LAYER %s;\n", layer );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}*/
|
|||
|
|
|
|||
|
|
/*void GenerateNameAndValue( int startToken, string layer )
|
|||
|
|
{
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
int textToken = startToken + 1;
|
|||
|
|
|
|||
|
|
string type = RemoveDoubleQuotas( Tokens[ CurrentToken ] );
|
|||
|
|
|
|||
|
|
string xCoord = "0.0";
|
|||
|
|
string yCoord = "0.0";
|
|||
|
|
string isVisible = "True";
|
|||
|
|
string textStyleRef = "";
|
|||
|
|
int ifPoint = 0;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
ifPoint = 1;
|
|||
|
|
|
|||
|
|
xCoord = Tokens[ CurrentToken + 1 ];
|
|||
|
|
yCoord = "";
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xCoord = xCoord + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoord = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yCoord = yCoord + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoord = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoord = yCoord + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isVisible" ) {
|
|||
|
|
if( ( Tokens[ CurrentToken + 1 ] == "False" ) || ( Tokens[ CurrentToken + 1 ] == "false" ) ) {
|
|||
|
|
isVisible = "False";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
|
|||
|
|
textStyleRef = RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] );
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( type == "Value" ) {
|
|||
|
|
if( isVisible == "True" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER;\n");
|
|||
|
|
printf("CHANGE LAYER 27;\n");
|
|||
|
|
|
|||
|
|
if( ifPoint ) {
|
|||
|
|
UseExternalText = 1;
|
|||
|
|
ExternalText = "'>VALUE'";
|
|||
|
|
GenerateOneText( textToken );
|
|||
|
|
UseExternalText = 0;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf("TEXT '>VALUE' (0.0 0.0);\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( layer != "" ) {
|
|||
|
|
printf( "CHANGE LAYER %s;\n", layer );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( type == "RefDes" ) {
|
|||
|
|
if( isVisible == "True" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER;\n");
|
|||
|
|
printf("CHANGE LAYER 25;\n");
|
|||
|
|
|
|||
|
|
if( ifPoint ) {
|
|||
|
|
UseExternalText = 1;
|
|||
|
|
ExternalText = "'>NAME'";
|
|||
|
|
GenerateOneText( textToken );
|
|||
|
|
UseExternalText = 0;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf("TEXT '>NAME' (0.0 0.0);\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( layer != "" ) {
|
|||
|
|
printf( "CHANGE LAYER %s;\n", layer );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}*/
|
|||
|
|
|
|||
|
|
void GenerateNameAndValue( int startToken, string layer, int patternIndex )
|
|||
|
|
{
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
int textToken = startToken + 1;
|
|||
|
|
|
|||
|
|
string type = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) );
|
|||
|
|
|
|||
|
|
string xCoord = "0.0";
|
|||
|
|
string yCoord = "0.0";
|
|||
|
|
string isVisible = "False";
|
|||
|
|
string textStyleRef = "";
|
|||
|
|
int ifPoint = 0;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
ifPoint = 1;
|
|||
|
|
|
|||
|
|
xCoord = Tokens[ CurrentToken + 1 ];
|
|||
|
|
yCoord = "";
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xCoord = xCoord + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoord = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yCoord = yCoord + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoord = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoord = yCoord + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isVisible" ) {
|
|||
|
|
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
|
|||
|
|
isVisible = "True";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
|
|||
|
|
textStyleRef = RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] );
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( type == "Value" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER;\n");
|
|||
|
|
printf("CHANGE LAYER 27;\n");
|
|||
|
|
|
|||
|
|
if( ifPoint ) {
|
|||
|
|
UseExternalText = 1;
|
|||
|
|
ExternalText = "'>VALUE'";
|
|||
|
|
GenerateOneText( textToken );
|
|||
|
|
UseExternalText = 0;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf("TEXT '>VALUE' (0.0 0.0);\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( layer != "" ) {
|
|||
|
|
printf( "CHANGE LAYER %s;\n", layer );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( isVisible != "True" ) {
|
|||
|
|
IfValueDefinedInPattern[ patternIndex ] = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( type == "RefDes" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER;\n");
|
|||
|
|
printf("CHANGE LAYER 25;\n");
|
|||
|
|
|
|||
|
|
if( ifPoint ) {
|
|||
|
|
UseExternalText = 1;
|
|||
|
|
ExternalText = "'>NAME'";
|
|||
|
|
GenerateOneText( textToken );
|
|||
|
|
UseExternalText = 0;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf("TEXT '>NAME' (0.0 0.0);\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( layer != "" ) {
|
|||
|
|
printf( "CHANGE LAYER %s;\n", layer );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( isVisible != "True" ) {
|
|||
|
|
IfNameDefinedInPattern[ patternIndex ] = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
AttributesName[ NrAttributes ] = type;
|
|||
|
|
AttributesIndex[ NrAttributes ] = startToken;
|
|||
|
|
NrAttributes++;
|
|||
|
|
|
|||
|
|
PatternNrAttributes[ patternIndex ]++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateNameAndValueSchematics( int startToken, int symbolIndex )
|
|||
|
|
{
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
int textToken = startToken + 1;
|
|||
|
|
|
|||
|
|
string type = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) );
|
|||
|
|
|
|||
|
|
string xCoord = "0.0";
|
|||
|
|
string yCoord = "0.0";
|
|||
|
|
string isVisible = "False";
|
|||
|
|
string textStyleRef = "";
|
|||
|
|
int ifPoint = 0;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
ifPoint = 1;
|
|||
|
|
|
|||
|
|
xCoord = Tokens[ CurrentToken + 1 ];
|
|||
|
|
yCoord = "";
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xCoord = xCoord + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoord = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yCoord = yCoord + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoord = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoord = yCoord + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isVisible" ) {
|
|||
|
|
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
|
|||
|
|
isVisible = "True";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
|
|||
|
|
textStyleRef = RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] );
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( type == "Value" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER;\n");
|
|||
|
|
printf("CHANGE LAYER 96;\n");
|
|||
|
|
|
|||
|
|
if( ifPoint ) {
|
|||
|
|
UseExternalText = 1;
|
|||
|
|
ExternalText = "'>VALUE'";
|
|||
|
|
GenerateOneText( textToken );
|
|||
|
|
UseExternalText = 0;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf("TEXT '>VALUE' (0.0 0.0);\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( isVisible != "True" ) {
|
|||
|
|
IfValueDefinedInSymbol[ symbolIndex ] = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( type == "RefDes" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER;\n");
|
|||
|
|
printf("CHANGE LAYER 95;\n");
|
|||
|
|
|
|||
|
|
if( ifPoint ) {
|
|||
|
|
UseExternalText = 1;
|
|||
|
|
ExternalText = "'>NAME'";
|
|||
|
|
GenerateOneText( textToken );
|
|||
|
|
UseExternalText = 0;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf("TEXT '>NAME' (0.0 0.0);\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( isVisible != "True" ) {
|
|||
|
|
IfNameDefinedInSymbol[ symbolIndex ] = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
AttributesName[ NrAttributes ] = type;
|
|||
|
|
AttributesIndex[ NrAttributes ] = startToken;
|
|||
|
|
NrAttributes++;
|
|||
|
|
|
|||
|
|
SymbolNrAttributes[ symbolIndex ]++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateLayerContents( int startToken, int patternIndex )
|
|||
|
|
{
|
|||
|
|
printf("# LayerContents\n");
|
|||
|
|
|
|||
|
|
CurrentToken = FindToken( startToken + 1, "layerNumRef" );
|
|||
|
|
|
|||
|
|
if( CurrentToken > 0 ) {
|
|||
|
|
string layer = ConvertLayer( Tokens[ CurrentToken + 1 ] );
|
|||
|
|
|
|||
|
|
printf( "# layerNumRef = %s\n", Tokens[ CurrentToken + 1 ] );
|
|||
|
|
printf( "CHANGE LAYER %s;\n", layer );
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "line" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneLine( SavePosition, 0, 1 );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "arc" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneArc( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "text" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneText( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "attr" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
if( patternIndex >= 0 ) {
|
|||
|
|
GenerateNameAndValue( SavePosition, layer, patternIndex );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "triplePointArc" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneTripleArc( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "testpoint" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "layerNumRef" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pcbPoly" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
printf( "CHANGE THERMALS OFF;\n");
|
|||
|
|
GenerateOnePcbPoly( SavePosition, 1, DEFAULT_WIRE_WIDTH_BOARD );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "polyCutOut" ) {
|
|||
|
|
printf("CHANGE Pour cutout;\n");
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
CurrentToken++;
|
|||
|
|
CurrentToken++;
|
|||
|
|
printf( "CHANGE THERMALS OFF;\n");
|
|||
|
|
GenerateOnePcbPoly( CurrentToken, 1, DEFAULT_WIRE_WIDTH_BOARD );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
printf("CHANGE Pour solid;\n");
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "copperPour95" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneCopperPour95( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "field" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "boardOutlineObj" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "dimension" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneDimension( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "table" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GenerateLayerContents ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( TR("Unexpected keyword in LayerContents: ") + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("# warning: GenerateLayerContents can't find layerNumRef.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Generate devices from patternDef and patternDefExtended
|
|||
|
|
|
|||
|
|
void GeneratePackages( void )
|
|||
|
|
{
|
|||
|
|
printf("# Packages:\n");
|
|||
|
|
|
|||
|
|
for( int i = 0; i < PatternDefExtendedNumber; i++ ) {
|
|||
|
|
int startToken = PatternDefExtendedArray[ i ];
|
|||
|
|
|
|||
|
|
string DeviceName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
|
|||
|
|
Tokens[ startToken ] )
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
string OriginalDeviceName = GetOriginalDeviceName( startToken + 1 );
|
|||
|
|
|
|||
|
|
IfNameDefinedInPattern[ i ] = 0;
|
|||
|
|
IfValueDefinedInPattern[ i ] = 0;
|
|||
|
|
PatternAttributesIndex[ i ] = NrAttributes;
|
|||
|
|
PatternNrAttributes[ i ] = 0;
|
|||
|
|
PatternName[ i ] = DeviceName;
|
|||
|
|
PatternOriginalName[ i ] = OriginalDeviceName;
|
|||
|
|
|
|||
|
|
int patternGraphicsNameRefToken = FindToken( startToken + 1, "patternGraphicsNameRef" );
|
|||
|
|
|
|||
|
|
if( patternGraphicsNameRefToken >= 0 ) {
|
|||
|
|
PatternDefaultVariantName[ i ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ patternGraphicsNameRefToken + 1 ] ) );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
PatternDefaultVariantName[ i ] = "";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int patternGraphicsDefToken = PatternGraphicsDefArray[ i ];
|
|||
|
|
|
|||
|
|
if( patternGraphicsDefToken < 0 ) {
|
|||
|
|
patternGraphicsDefToken = startToken;
|
|||
|
|
PatternGraphicsDefName[ i ] = "";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
int patternGraphicsNameDefToken = FindToken( patternGraphicsDefToken + 1, "patternGraphicsNameDef" );
|
|||
|
|
|
|||
|
|
if( patternGraphicsNameDefToken >= 0 ) {
|
|||
|
|
PatternGraphicsDefName[ i ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ patternGraphicsNameDefToken + 1 ] ) );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
PatternGraphicsDefName[ i ] = "";
|
|||
|
|
WriteLog( "# warning: no patternGraphicsNameDef\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("#\n");
|
|||
|
|
printf("# Package: %s OriginalName = %s VariantName = %s PatternDefaultVariantName = %s\n", DeviceName, OriginalDeviceName,
|
|||
|
|
PatternGraphicsDefName[ i ], PatternDefaultVariantName[ i ] );
|
|||
|
|
|
|||
|
|
printf("EDIT '%s%s.PAC';\n", DeviceName, PatternGraphicsDefName[ i ] );
|
|||
|
|
printf("DESCRIPTION 'Original name <b>%s</b><p>';\n", OriginalDeviceName );
|
|||
|
|
printf("GRID %s;\n", FileUnits );
|
|||
|
|
printf("CHANGE FONT VECTOR;\n");
|
|||
|
|
|
|||
|
|
if( patternGraphicsDefToken >= 0 ) {
|
|||
|
|
CurrentToken = FindToken( patternGraphicsDefToken + 1, "multiLayer" );
|
|||
|
|
|
|||
|
|
if( CurrentToken > 0 ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pad" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
GeneratePad( SavePosition, 0 );
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in multiLayer " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = patternGraphicsDefToken;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "layerContents" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
GenerateLayerContents( SavePosition, i );
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in layerContents " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int OneViaShapeCreated;
|
|||
|
|
|
|||
|
|
int ProcessOneViaShape( int Number, int startToken, string holeDiam )
|
|||
|
|
{
|
|||
|
|
int layerNumRefPosition = FindToken( startToken + 1, "layerNumRef" );
|
|||
|
|
|
|||
|
|
if( layerNumRefPosition >= 0 ) {
|
|||
|
|
if( checkLayerType( layerNumRefPosition + 1 ) ) {
|
|||
|
|
int viaShapeTypePosition = FindToken( startToken + 1, "viaShapeType" );
|
|||
|
|
|
|||
|
|
if( viaShapeTypePosition >= 0 ) {
|
|||
|
|
int shapeWidthPosition = FindToken( startToken + 1, "shapeWidth" );
|
|||
|
|
|
|||
|
|
if( shapeWidthPosition >= 0 ) {
|
|||
|
|
string TokenText = Tokens[ shapeWidthPosition + 1 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ shapeWidthPosition + 2 ] != ")" ) {
|
|||
|
|
if( IsASCIIValue( Tokens[ shapeWidthPosition + 2 ] ) ) {
|
|||
|
|
TokenText = TokenText + Tokens[ shapeWidthPosition + 2 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wrong description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string shapeWidth = ConvertUnits( GetNumberValue( TokenText ),
|
|||
|
|
GetUnitValue( TokenText ) );
|
|||
|
|
|
|||
|
|
int shapeHeightPosition = FindToken( startToken + 1, "shapeHeight" );
|
|||
|
|
|
|||
|
|
if( shapeHeightPosition >= 0 ) {
|
|||
|
|
|
|||
|
|
string TokenText = Tokens[ shapeHeightPosition + 1 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ shapeHeightPosition + 2 ] != ")" ) {
|
|||
|
|
if( IsASCIIValue( Tokens[ shapeHeightPosition + 2 ] ) ) {
|
|||
|
|
TokenText = TokenText + Tokens[ shapeHeightPosition + 2 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wrong description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string shapeHeight = ConvertUnits( GetNumberValue( TokenText ),
|
|||
|
|
GetUnitValue( TokenText ) );
|
|||
|
|
|
|||
|
|
if( ( !CheckForNull( shapeWidth ) ) ||
|
|||
|
|
( !CheckForNull( shapeHeight ) ) ) {
|
|||
|
|
|
|||
|
|
printf("# ViaShape: layerNumRef = %s",
|
|||
|
|
Tokens[ layerNumRefPosition + 1 ] );
|
|||
|
|
printf(" viaShapeType = %s",
|
|||
|
|
Tokens[ viaShapeTypePosition + 1 ] );
|
|||
|
|
printf(" shapeWidth = %s", shapeWidth );
|
|||
|
|
printf(" shapeHeight = %s\n", shapeHeight );
|
|||
|
|
|
|||
|
|
if( OneViaShapeCreated == 0 ) {
|
|||
|
|
if( Tokens[ viaShapeTypePosition + 1 ] == "Oval" ) { // Oval
|
|||
|
|
if( shapeWidth == shapeHeight ) {
|
|||
|
|
ViaStyleDefsType[ Number ] = "ROUND";
|
|||
|
|
ViaStyleDefsDiameter[ Number ] = shapeWidth;
|
|||
|
|
OneViaShapeCreated = 1;
|
|||
|
|
ViaStyleDefsSkip[ Number ] = 0;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
ViaStyleDefsType[ Number ] = "ROUND";
|
|||
|
|
ViaStyleDefsDiameter[ Number ] = shapeWidth;
|
|||
|
|
OneViaShapeCreated = 1;
|
|||
|
|
ViaStyleDefsSkip[ Number ] = 0;
|
|||
|
|
|
|||
|
|
//if( DebugMessage ) {
|
|||
|
|
WriteLog("#warning: ViaShape: oval. Create round via\n");
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ viaShapeTypePosition + 1 ] == "Rect" ) { // Rectangle
|
|||
|
|
if( shapeWidth == shapeHeight ) {
|
|||
|
|
ViaStyleDefsType[ Number ] = "SQUARE";
|
|||
|
|
ViaStyleDefsDiameter[ Number ] = shapeWidth;
|
|||
|
|
OneViaShapeCreated = 1;
|
|||
|
|
ViaStyleDefsSkip[ Number ] = 0;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
ViaStyleDefsType[ Number ] = "SQUARE";
|
|||
|
|
ViaStyleDefsDiameter[ Number ] = shapeWidth;
|
|||
|
|
OneViaShapeCreated = 1;
|
|||
|
|
ViaStyleDefsSkip[ Number ] = 0;
|
|||
|
|
|
|||
|
|
//if( DebugMessage ) {
|
|||
|
|
WriteLog("#warning: ViaShape: rectangle. Create square via.\n");
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ viaShapeTypePosition + 1 ] == "Ellipse" ) { // Ellipse
|
|||
|
|
if( shapeWidth == shapeHeight ) {
|
|||
|
|
ViaStyleDefsType[ Number ] = "ROUND";
|
|||
|
|
ViaStyleDefsDiameter[ Number ] = shapeWidth;
|
|||
|
|
OneViaShapeCreated = 1;
|
|||
|
|
ViaStyleDefsSkip[ Number ] = 0;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
ViaStyleDefsType[ Number ] = "ROUND";
|
|||
|
|
ViaStyleDefsDiameter[ Number ] = shapeWidth;
|
|||
|
|
OneViaShapeCreated = 1;
|
|||
|
|
ViaStyleDefsSkip[ Number ] = 0;
|
|||
|
|
|
|||
|
|
//if( DebugMessage ) {
|
|||
|
|
WriteLog( "# warning: ViaShape: Ellips with different width and height. Create round via.\n");
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ viaShapeTypePosition + 1 ] == "MtHole" ) { // MountingHole
|
|||
|
|
//if( DebugMessage ) {
|
|||
|
|
WriteLog("#warning: ViaShape:MtHole \n");
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ viaShapeTypePosition + 1 ] == "RndRect" ) { // RoundRectangle
|
|||
|
|
ViaStyleDefsType[ Number ] = "SQUARE";
|
|||
|
|
real width = strtod( shapeWidth );
|
|||
|
|
width = width * ( 1.0 - 0.7 / ROUNDNESS );
|
|||
|
|
|
|||
|
|
string newWidth;
|
|||
|
|
|
|||
|
|
sprintf( newWidth, "%f", width );
|
|||
|
|
|
|||
|
|
ViaStyleDefsDiameter[ Number ] = newWidth;
|
|||
|
|
OneViaShapeCreated = 1;
|
|||
|
|
ViaStyleDefsSkip[ Number ] = 0;
|
|||
|
|
|
|||
|
|
//if( DebugMessage ) {
|
|||
|
|
WriteLog("#warning: ViaShape: RndRect. Create shrinked square via.\n");
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ viaShapeTypePosition + 1 ] == "Target" ) { // Make it round
|
|||
|
|
//if( DebugMessage ) {
|
|||
|
|
WriteLog("#warning: ViaShape: Target. Do not supported.\n");
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: ViaShape %s not supported yet\n",
|
|||
|
|
Tokens[ viaShapeTypePosition + 1 ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# via's shape skips because of zero width and height.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# via's shape skips because of layer.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int ProcessViaShapes( int Number, int startToken, string holeDiam )
|
|||
|
|
{
|
|||
|
|
OneViaShapeCreated = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "viaShape" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
ProcessOneViaShape( Number, SavePosition, holeDiam );
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( TR("Unexpected keyword in ProcessViaShapes: ") + Tokens[
|
|||
|
|
CurrentToken ], "OK");
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOneViaDefinition( int Number, int startToken )
|
|||
|
|
{
|
|||
|
|
printf( "#ViaStyleDef %s\n", Tokens[ startToken ] );
|
|||
|
|
|
|||
|
|
ViaStyleDefsSkip[ Number ] = 1;
|
|||
|
|
|
|||
|
|
int holeDiamPosition = FindToken( startToken + 1, "holeDiam" );
|
|||
|
|
|
|||
|
|
if( holeDiamPosition >= 0 ) {
|
|||
|
|
string holeDiam = Tokens[ holeDiamPosition + 1 ];
|
|||
|
|
|
|||
|
|
if( CheckForNull( holeDiam ) ) {
|
|||
|
|
WriteLog("# warning: zero hole in via\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "#HoleDiameter = %s\n", holeDiam );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ProcessViaShapes( Number, startToken, holeDiam );
|
|||
|
|
|
|||
|
|
if( ViaStyleDefsSkip[ Number ] ) {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# this ViaDefinition was skipped.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
sprintf( ViaStyleDefsScript[ Number ], "CHANGE DRILL %s;\n%s",
|
|||
|
|
holeDiam, ViaStyleDefsScript[ Number ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# skips because via has no holeDiam.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateViaDefinitions( void )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < ViaStyleDefsNumber; i++ ) {
|
|||
|
|
int startToken = ViaStyleDefsArray[ i ];
|
|||
|
|
|
|||
|
|
string info;
|
|||
|
|
sprintf( info, TR("Process Via Style definition") + " %d (%d)", i, ViaStyleDefsNumber );
|
|||
|
|
UpdateProgress( info );
|
|||
|
|
|
|||
|
|
GenerateOneViaDefinition( i, startToken );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string FindSymbolNameByOriginal( string originalSymbolName )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < SymbolDefsNumber; i++ ) {
|
|||
|
|
if( originalSymbolName == OriginalSymbolsName[ i ] ) {
|
|||
|
|
return( SymbolsName[ i ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( "" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int FindSymbolIndexByName( string symbolName )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < SymbolDefsNumber; i++ ) {
|
|||
|
|
if( symbolName == SymbolsName[ i ] ) {
|
|||
|
|
return( i );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( -1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int FindPatternDefIndexByName( string patternName, string variantName )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < PatternDefExtendedNumber; i++ ) {
|
|||
|
|
if( patternName == PatternName[ i ] ) {
|
|||
|
|
if( variantName == PatternGraphicsDefName[ i ] ) {
|
|||
|
|
return( i );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( -1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string FindPatternNameByOrigin( string originalPatternName )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < PatternDefExtendedNumber; i++ ) {
|
|||
|
|
if( originalPatternName == PatternOriginalName[ i ] ) {
|
|||
|
|
return( PatternName[ i ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( "" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string FindPatternDefaultVariantByOrigin( string originalPatternName )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < PatternDefExtendedNumber; i++ ) {
|
|||
|
|
if( originalPatternName == PatternOriginalName[ i ] ) {
|
|||
|
|
if( PatternDefaultVariantName[ i ] == PatternGraphicsDefName[ i ] ) {
|
|||
|
|
return( PatternDefaultVariantName[ i ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( "" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string FindSymbolDeviceName( string compName )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < NrCompInstances; i++ ) {
|
|||
|
|
if( compName == CompInstancesName[ i ] ) {
|
|||
|
|
return( CompInstancesRef[ i ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( "" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string FindCompValue( string compName )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < NrCompInstances; i++ ) {
|
|||
|
|
if( compName == CompInstancesName[ i ] ) {
|
|||
|
|
return( CompValue[ i ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( "" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string FindText( int startToken )
|
|||
|
|
{
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken ] ) ) );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( "" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string ConvertPinType( string pinType )
|
|||
|
|
{
|
|||
|
|
if( pinType == "Unknown" ) {
|
|||
|
|
return( "IO" );
|
|||
|
|
} else if( pinType == "Passive" ) {
|
|||
|
|
return( "Pas" );
|
|||
|
|
} else if( pinType == "Input" ) {
|
|||
|
|
return( "In" );
|
|||
|
|
} else if( pinType == "Output" ) {
|
|||
|
|
return( "Out" );
|
|||
|
|
} else if( pinType == "Bidirectional" ) {
|
|||
|
|
return( "IO" );
|
|||
|
|
} else if( pinType == "OpenH" ) {
|
|||
|
|
return( "OC" );
|
|||
|
|
} else if( pinType == "OpenL" ) {
|
|||
|
|
return( "OC" );
|
|||
|
|
} else if( pinType == "PassiveH" ) {
|
|||
|
|
return( "Pas" );
|
|||
|
|
} else if( pinType == "PassiveL" ) {
|
|||
|
|
return( "Pas" );
|
|||
|
|
} else if( pinType == "ThreeState" ) {
|
|||
|
|
return( "Hiz" );
|
|||
|
|
} else if( pinType == "Power" ) {
|
|||
|
|
return( "Pwr" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: unknown pinType = %s\n", pinType );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
|
|||
|
|
return( "IO" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int IfFitToSymbolName( int startToken, string OriginalSymbolName )
|
|||
|
|
{
|
|||
|
|
int level = 1;
|
|||
|
|
CurrentToken = startToken;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
level++;
|
|||
|
|
CurrentToken++;
|
|||
|
|
if( Tokens[ CurrentToken ] == "attachedSymbol" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
CurrentToken = FindToken( SavePosition + 1, "symbolName" );
|
|||
|
|
|
|||
|
|
if( CurrentToken >= 0 ) {
|
|||
|
|
string OriginalDeviceName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
|
|||
|
|
|
|||
|
|
if( OriginalSymbolName == OriginalDeviceName ) {
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
|
|||
|
|
level--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string FindPinDirection( string OriginalSymbolName, string pinNum )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < CompDefsNumber; i++ ) {
|
|||
|
|
int startToken = CompDefsArray[ i ];
|
|||
|
|
|
|||
|
|
if( IfFitToSymbolName( startToken, OriginalSymbolName ) ) {
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "compPin" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
string currentPinNum = FindText( SavePosition );
|
|||
|
|
|
|||
|
|
if( currentPinNum == pinNum ) {
|
|||
|
|
int tokenPosition = FindToken( SavePosition + 1, "pinType" );
|
|||
|
|
|
|||
|
|
if( tokenPosition >= 0 ) {
|
|||
|
|
string pinType = Tokens[ tokenPosition + 1 ];
|
|||
|
|
|
|||
|
|
string pinTypeEagle = ConvertPinType( pinType );
|
|||
|
|
|
|||
|
|
return( pinTypeEagle );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( "IO" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string PinNamesTable[];
|
|||
|
|
int NrOfThisPinName[];
|
|||
|
|
int CurrentPinIndex[];
|
|||
|
|
int NrPinNames;
|
|||
|
|
|
|||
|
|
int FindPinName( string pinName )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < NrPinNames; i++ ) {
|
|||
|
|
if( PinNamesTable[ i ] == pinName ) {
|
|||
|
|
return( i );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( -1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void FillOnePinName( int startToken )
|
|||
|
|
{
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pinName" ) {
|
|||
|
|
int pinNameToken = CurrentToken + 1;
|
|||
|
|
|
|||
|
|
string pinName = FindText( pinNameToken + 1 );
|
|||
|
|
|
|||
|
|
if( pinName != "" ) {
|
|||
|
|
int index = FindPinName( pinName );
|
|||
|
|
|
|||
|
|
if( index >= 0 ) {
|
|||
|
|
NrOfThisPinName[ index ]++;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
PinNamesTable[ NrPinNames ] = pinName;
|
|||
|
|
NrOfThisPinName[ NrPinNames ] = 1;
|
|||
|
|
CurrentPinIndex[ NrPinNames ] = 1;
|
|||
|
|
NrPinNames++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void FillPinNameTable( int startToken )
|
|||
|
|
{
|
|||
|
|
NrPinNames = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pin" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
FillOnePinName( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GeneratePin( int startToken, string OriginalSymbolName )
|
|||
|
|
{
|
|||
|
|
string pinNum;
|
|||
|
|
string xPointCoord;
|
|||
|
|
string yPointCoord;
|
|||
|
|
string rotation = "0";
|
|||
|
|
string pinLength = "0";
|
|||
|
|
int isPinLength = 0;
|
|||
|
|
string dispPinDes = "True";
|
|||
|
|
int pinDesToken = 0;
|
|||
|
|
string pinDes = "";
|
|||
|
|
string pinVisibility = "Off";
|
|||
|
|
int pinNameToken = 0;
|
|||
|
|
string defaultPinDes;
|
|||
|
|
string insideStyle;
|
|||
|
|
int isFlipped = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
xPointCoord = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xPointCoord = xPointCoord + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yPointCoord = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yPointCoord = yPointCoord + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yPointCoord = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yPointCoord = yPointCoord + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pinNum" ) {
|
|||
|
|
pinNum = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "rotation" ) {
|
|||
|
|
rotation = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pinLength" ) {
|
|||
|
|
pinLength = Tokens[ CurrentToken + 1 ];
|
|||
|
|
isPinLength = 1;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pinDisplay" ) {
|
|||
|
|
if( Tokens[ CurrentToken + 2 ] == "dispPinDes" ) {
|
|||
|
|
dispPinDes = Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 2 ] == "dispPinName" ) {
|
|||
|
|
if( ( Tokens[ CurrentToken + 3 ] == "True" ) || ( Tokens[ CurrentToken + 3 ] == "true" ) ) {
|
|||
|
|
pinVisibility = "";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pinDes" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
pinDesToken = SavePosition + 1;
|
|||
|
|
pinDes = FindText( SavePosition + 2 );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pinName" ) {
|
|||
|
|
pinNameToken = CurrentToken + 1;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "defaultPinDes" ) {
|
|||
|
|
defaultPinDes = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "insideStyle" ) {
|
|||
|
|
insideStyle = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isFlipped" ) {
|
|||
|
|
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
|
|||
|
|
isFlipped = 1;
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GeneratePin ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( pinDesToken ) {
|
|||
|
|
if( dispPinDes == "True" ) {
|
|||
|
|
IfPinText = 1;
|
|||
|
|
GenerateOneText( pinDesToken + 1 );
|
|||
|
|
IfPinText = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*if( pinNameToken ) {
|
|||
|
|
GenerateOneText( pinNameToken + 1 );
|
|||
|
|
}*/
|
|||
|
|
|
|||
|
|
real pinLengthValue = strtod( GetNumberValue( pinLength ) );
|
|||
|
|
real rotationValue = strtod( GetNumberValue( rotation ) );
|
|||
|
|
|
|||
|
|
real pinX = strtod( ConvertUnits( GetNumberValue( xPointCoord ), GetUnitValue( xPointCoord ) ) );
|
|||
|
|
real pinY = strtod( ConvertUnits( GetNumberValue( yPointCoord ), GetUnitValue( yPointCoord ) ) );
|
|||
|
|
|
|||
|
|
if( !pinLengthValue ) {
|
|||
|
|
printf( "CHANGE LENGTH POINT;\n");
|
|||
|
|
} else if( pinLengthValue == 100 ) {
|
|||
|
|
printf( "CHANGE LENGTH SHORT;\n");
|
|||
|
|
} else if( pinLengthValue == 200 ) {
|
|||
|
|
printf( "CHANGE LENGTH MIDDLE;\n");
|
|||
|
|
} else if ( pinLengthValue == 300) {
|
|||
|
|
printf( "CHANGE LENGTH LONG;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( !isPinLength ) {
|
|||
|
|
printf( "CHANGE LENGTH LONG;\n");
|
|||
|
|
pinLengthValue = 300;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( rotationValue >= 270 ) {
|
|||
|
|
pinY -= pinLengthValue;
|
|||
|
|
}
|
|||
|
|
else if( rotationValue >= 180 ) {
|
|||
|
|
pinX -= pinLengthValue;
|
|||
|
|
}
|
|||
|
|
else if( rotationValue >= 90 ) {
|
|||
|
|
pinY += pinLengthValue;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
pinX += pinLengthValue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string mirrored = "";
|
|||
|
|
|
|||
|
|
// Mirrored (flipped) is not use here because it supported by above code
|
|||
|
|
|
|||
|
|
/*if( isFlipped ) {
|
|||
|
|
mirrored = "M";
|
|||
|
|
}*/
|
|||
|
|
|
|||
|
|
/*if( isFlipped ) {
|
|||
|
|
if( rotationValue >= 270 ) {
|
|||
|
|
pinY = pinY - 2 * pinLengthValue;
|
|||
|
|
}
|
|||
|
|
else if( rotationValue >= 180 ) {
|
|||
|
|
pinX = pinX - 2 * pinLengthValue;
|
|||
|
|
}
|
|||
|
|
else if( rotationValue >= 90 ) {
|
|||
|
|
pinY = pinY + 2 * pinLengthValue;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
pinX = pinX - 2 * pinLengthValue;
|
|||
|
|
}
|
|||
|
|
}*/
|
|||
|
|
|
|||
|
|
string pinDirection = FindPinDirection( OriginalSymbolName, pinDes );
|
|||
|
|
|
|||
|
|
string pinName = FindText( pinNameToken + 1 );
|
|||
|
|
|
|||
|
|
if( pinName != "" ) {
|
|||
|
|
int index = FindPinName( pinName );
|
|||
|
|
|
|||
|
|
if( index >= 0 ) {
|
|||
|
|
if( NrOfThisPinName[ index ] > 1 ) {
|
|||
|
|
sprintf( pinName, "%s@%d", pinName, CurrentPinIndex[ index ] );
|
|||
|
|
CurrentPinIndex[ index ]++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: can't find pin %s in table\n", pinName );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( pinName[ 0 ] == '~' ) {
|
|||
|
|
pinName[ 0 ] = '!';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf( "PIN '%s' %s %sR%f %s (%f %f);\n", pinName, pinDirection, mirrored, rotationValue + 180.0,
|
|||
|
|
pinVisibility, pinX, pinY );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf( "PIN %s %sR%f %s (%f %f);\n", pinDirection, mirrored, rotationValue + 180.0,
|
|||
|
|
pinVisibility, pinX, pinY );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateSymbols( void )
|
|||
|
|
{
|
|||
|
|
printf("# Symbols:\n");
|
|||
|
|
|
|||
|
|
for( int i = 0; i < SymbolDefsNumber; i++ ) {
|
|||
|
|
int startToken = SymbolDefsArray[ i ];
|
|||
|
|
|
|||
|
|
string info;
|
|||
|
|
sprintf( info, "Process symbol %d (%d)", i, SymbolDefsNumber + 1 );
|
|||
|
|
UpdateProgress( info );
|
|||
|
|
|
|||
|
|
string SymbolName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
|
|||
|
|
Tokens[ startToken ] )
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
string OriginalSymbolName = GetOriginalDeviceName( startToken + 1 );
|
|||
|
|
|
|||
|
|
SymbolsName[ i ] = SymbolName;
|
|||
|
|
OriginalSymbolsName[ i ] = OriginalSymbolName;
|
|||
|
|
|
|||
|
|
printf("#\n");
|
|||
|
|
printf("# Symbol: %s OriginalName = %s\n", SymbolName, OriginalSymbolName );
|
|||
|
|
|
|||
|
|
printf("EDIT '%s.SYM';\n", SymbolName );
|
|||
|
|
printf("DESCRIPTION 'Original name <b>%s</b><p>';\n", OriginalSymbolName );
|
|||
|
|
printf("GRID %s;\n", FileUnits );
|
|||
|
|
printf("CHANGE FONT VECTOR;\n");
|
|||
|
|
|
|||
|
|
FillPinNameTable( startToken );
|
|||
|
|
|
|||
|
|
printf( "CHANGE LAYER 94;\n" );
|
|||
|
|
|
|||
|
|
IfNameDefinedInSymbol[ i ] = 0;
|
|||
|
|
IfValueDefinedInSymbol[ i ] = 0;
|
|||
|
|
SymbolAttributesIndex[ i ] = NrAttributes;
|
|||
|
|
SymbolNrAttributes[ i ] = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "originalName" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pin" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
GeneratePin( SavePosition, OriginalSymbolName );
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "line" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
GenerateOneLine( SavePosition, 0, 0 );
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "attr" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateNameAndValueSchematics( SavePosition, i );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "poly" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
GenerateOnePcbPoly( SavePosition, 0, DEFAULT_WIRE_WIDTH_BOARD );
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "text" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
IfPinText = 1;
|
|||
|
|
GenerateOneText( SavePosition );
|
|||
|
|
IfPinText = 0;
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "triplePointArc" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
GenerateOneTripleArc( SavePosition );
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "arc" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneArc( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GenerateSymbols ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int FindAttributeByNameInSymbol( int symbolIndex, string attributeName )
|
|||
|
|
{
|
|||
|
|
for( int i = SymbolAttributesIndex[ symbolIndex ]; i < SymbolNrAttributes[ symbolIndex ]; i++ ) {
|
|||
|
|
if( attributeName == AttributesName[ i ] ) {
|
|||
|
|
return( AttributesIndex[ i ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( -1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int FindAttributeByNameInPattern( int patternIndex, string attributeName )
|
|||
|
|
{
|
|||
|
|
for( int i = PatternAttributesIndex[ patternIndex ]; i < PatternNrAttributes[ patternIndex ]; i++ ) {
|
|||
|
|
if( attributeName == AttributesName[ i ] ) {
|
|||
|
|
return( AttributesIndex[ i ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( -1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void AddOneAttributes( int ifSymbol, int symbolIndex, string elemName, string attributeName, string attributeValue, int startToken, string xCoord, string yCoord )
|
|||
|
|
{
|
|||
|
|
string xCoordText = "0.0";
|
|||
|
|
string yCoordText = "0.0";
|
|||
|
|
string rotation = "0";
|
|||
|
|
string isVisible = "False";
|
|||
|
|
string textStyleRef = "";
|
|||
|
|
string justify = "";
|
|||
|
|
int isFlipped = 0;
|
|||
|
|
|
|||
|
|
if( symbolIndex >= 0 ) {
|
|||
|
|
int attrIndex;
|
|||
|
|
|
|||
|
|
if( ifSymbol ) {
|
|||
|
|
attrIndex = FindAttributeByNameInSymbol( symbolIndex, attributeName );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
attrIndex = FindAttributeByNameInPattern( symbolIndex, attributeName );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//printf("# index attr name = %s\n", attributeName );
|
|||
|
|
if( attrIndex >= 0 ) {
|
|||
|
|
//printf("# attr name = %s\n", Tokens[ attrIndex + 1 ] );
|
|||
|
|
|
|||
|
|
CurrentToken = attrIndex + 3;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "rotation" ) {
|
|||
|
|
rotation = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isVisible" ) {
|
|||
|
|
isVisible = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
|
|||
|
|
textStyleRef = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isFlipped" ) {
|
|||
|
|
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
|
|||
|
|
isFlipped = 1;
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "justify" ) {
|
|||
|
|
justify = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = startToken;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
xCoordText = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xCoordText = xCoordText + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoordText = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yCoordText = yCoordText + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoordText = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoordText = yCoordText + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "rotation" ) {
|
|||
|
|
rotation = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isVisible" ) {
|
|||
|
|
isVisible = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
|
|||
|
|
textStyleRef = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isFlipped" ) {
|
|||
|
|
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
|
|||
|
|
isFlipped = 1;
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "justify" ) {
|
|||
|
|
justify = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
real newXCoord = strtod( ConvertUnits( GetNumberValue( xCoord ), GetUnitValue( xCoord ) ) ) +
|
|||
|
|
strtod( ConvertUnits( GetNumberValue( xCoordText ), GetUnitValue( xCoordText ) ) );
|
|||
|
|
|
|||
|
|
real newYCoord = strtod( ConvertUnits( GetNumberValue( yCoord ), GetUnitValue( yCoord ) ) ) +
|
|||
|
|
strtod( ConvertUnits( GetNumberValue( yCoordText ), GetUnitValue( yCoordText ) ) );
|
|||
|
|
|
|||
|
|
string mirrored = "";
|
|||
|
|
|
|||
|
|
if( isFlipped ) {
|
|||
|
|
mirrored = "M";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( attributeValue == "" ) {
|
|||
|
|
attributeValue = "''";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
attributeValue = ReplaceNotSupportedCharactersText( attributeValue );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( isVisible != "True" ) {
|
|||
|
|
if( elemName != "" ) {
|
|||
|
|
printf( "CHANGE DISPLAY OFF;\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( elemName != "" ) {
|
|||
|
|
printf( "CHANGE DISPLAY VALUE;\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( justify == "" ) { //LowerLeft
|
|||
|
|
printf("CHANGE ALIGN BOTTOM LEFT;\n");
|
|||
|
|
} else if( justify == "UpperLeft" ) {
|
|||
|
|
printf("CHANGE ALIGN TOP LEFT;\n");
|
|||
|
|
} else if( justify == "UpperCenter" ) {
|
|||
|
|
printf("CHANGE ALIGN TOP CENTER;\n");
|
|||
|
|
} else if( justify == "UpperRight" ) {
|
|||
|
|
printf("CHANGE ALIGN TOP RIGHT;\n");
|
|||
|
|
} else if( justify == "Left" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER LEFT;\n");
|
|||
|
|
} else if( justify == "Center" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER CENTER;\n");
|
|||
|
|
} else if( justify == "Right" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER RIGHT;\n");
|
|||
|
|
} else if( justify == "LowerLeft" ) {
|
|||
|
|
printf("CHANGE ALIGN BOTTOM LEFT;\n");
|
|||
|
|
} else if( justify == "LowerCenter" ) {
|
|||
|
|
printf("CHANGE ALIGN BOTTOM CENTER;\n");
|
|||
|
|
} else if( justify == "LowerRight" ) {
|
|||
|
|
printf("CHANGE ALIGN BOTTOM RIGHT;\n");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf("# warning: unknown justify parameter value = %s\n", justify );
|
|||
|
|
printf("CHANGE ALIGN BOTTOM LEFT;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int textStyleDefPos = FindTextStyleDef( textStyleRef );
|
|||
|
|
|
|||
|
|
if( textStyleDefPos >= 0 ) {
|
|||
|
|
real fontHeight = strtod( ConvertUnits( GetNumberValue( TextStyleDefFontHeight[ textStyleDefPos ] ), GetUnitValue( TextStyleDefFontHeight[ textStyleDefPos ] ) ) );
|
|||
|
|
real fontWidth = strtod( ConvertUnits( GetNumberValue( TextStyleDefFontStrokeWidth[ textStyleDefPos ] ), GetUnitValue( TextStyleDefFontStrokeWidth[ textStyleDefPos ] ) ) );
|
|||
|
|
|
|||
|
|
printf("CHANGE SIZE %s;\n", TextStyleDefFontHeight[ textStyleDefPos ] );
|
|||
|
|
|
|||
|
|
if( fontHeight ) {
|
|||
|
|
int ratio = round( 100.0 * fontWidth / fontHeight );
|
|||
|
|
|
|||
|
|
if( ratio > 31.0 ) {
|
|||
|
|
ratio = 31.0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("CHANGE RATIO %d;\n", ratio );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( elemName != "" ) {
|
|||
|
|
printf( "ATTRIBUTE '%s' '%s' '%s' %sSR%s (%f %f);\n", elemName, attributeName, attributeValue, mirrored, rotation, newXCoord, newYCoord );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf( "ATTRIBUTE '%s' '%s';\n", attributeName, attributeValue );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void AddAttributes( int ifSymbol, int symbolIndex, string elemName, int patternGraphicsRef, string xCoord, string yCoord )
|
|||
|
|
{
|
|||
|
|
CurrentToken = patternGraphicsRef + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "attr" ) {
|
|||
|
|
string attrName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
|
|||
|
|
|
|||
|
|
if( attrName == "Name" ) {
|
|||
|
|
attrName = "Name_";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( ( strlwr( attrName ) != "value" ) && ( strlwr( attrName ) != "name" ) && ( strlwr( attrName ) != "refdes" ) ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
AddOneAttributes( ifSymbol, symbolIndex, elemName, attrName, ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 2 ] ) ),
|
|||
|
|
CurrentToken, xCoord, yCoord );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string FindPinNameByPinRef( int startToken, string pinRef )
|
|||
|
|
{
|
|||
|
|
int CurrentToken = startToken + 1;
|
|||
|
|
int level = 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
level++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "compPin" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
string currentPinRef = FindText( SavePosition );
|
|||
|
|
|
|||
|
|
if( currentPinRef == pinRef ) {
|
|||
|
|
int tokenPosition = FindToken( SavePosition + 1, "pinName" );
|
|||
|
|
|
|||
|
|
if( tokenPosition >= 0 ) {
|
|||
|
|
string pinName = Tokens[ tokenPosition + 1 ];
|
|||
|
|
|
|||
|
|
return( pinName );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
level--;
|
|||
|
|
|
|||
|
|
if( level == 0 ) {
|
|||
|
|
return( "" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( "" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string DevicePinNamesTable[];
|
|||
|
|
string DevicePadNamesTable[];
|
|||
|
|
int CurrentDevicePinCount[];
|
|||
|
|
int NrOfDevicePadNames;
|
|||
|
|
|
|||
|
|
void GenerateDevices( void )
|
|||
|
|
{
|
|||
|
|
printf("# Devices:\n");
|
|||
|
|
|
|||
|
|
for( int i = 0; i < CompDefsNumber; i++ ) {
|
|||
|
|
int startToken = CompDefsArray[ i ];
|
|||
|
|
|
|||
|
|
string DeviceName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
|
|||
|
|
Tokens[ startToken ] )
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
string OriginalDeviceName = GetOriginalDeviceName( startToken + 1 );
|
|||
|
|
|
|||
|
|
printf("#\n");
|
|||
|
|
printf("# Device: %s OriginalName = %s\n", DeviceName, OriginalDeviceName );
|
|||
|
|
|
|||
|
|
printf("EDIT '%s.DEV';\n", DeviceName );
|
|||
|
|
printf("GRID %s;\n", FileUnits );
|
|||
|
|
|
|||
|
|
//AddAttributes( 0, -1, "", startToken, "0.0", "0.0" );
|
|||
|
|
|
|||
|
|
int packageExists = 0;
|
|||
|
|
|
|||
|
|
int attachedPatternToken = FindToken( startToken + 1, "attachedPattern" );
|
|||
|
|
|
|||
|
|
if( attachedPatternToken > 0 ) {
|
|||
|
|
CurrentToken = FindToken( attachedPatternToken + 1, "patternName" );
|
|||
|
|
|
|||
|
|
if( CurrentToken >= 0 ) {
|
|||
|
|
string originPatternName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
|
|||
|
|
|
|||
|
|
string patternName = FindPatternNameByOrigin( originPatternName );
|
|||
|
|
|
|||
|
|
if( patternName != "" ) {
|
|||
|
|
string patternDefaultVariant = FindPatternDefaultVariantByOrigin( originPatternName );
|
|||
|
|
|
|||
|
|
printf( "PACKAGE '%s%s';\n", patternName, patternDefaultVariant );
|
|||
|
|
|
|||
|
|
packageExists = 1;
|
|||
|
|
|
|||
|
|
CurrentToken = FindToken( attachedPatternToken + 1, "padPinMap" );
|
|||
|
|
|
|||
|
|
if( CurrentToken > 0 ) {
|
|||
|
|
PadPinMapRef[ i ] = NrPadPinMap;
|
|||
|
|
PadPinMapCount[ i ] = 0;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( Tokens[ CurrentToken ] != ")" ) {
|
|||
|
|
PadPinMapNum[ NrPadPinMap ] = Tokens[ CurrentToken + 2 ];
|
|||
|
|
PadPinMapPinRef[ NrPadPinMap ] = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 6 ] ) );
|
|||
|
|
|
|||
|
|
//printf( "# PadMap: num = %s ref = %s\n", PadPinMapNum[ NrPadPinMap ], PadPinMapPinRef[ NrPadPinMap ] );
|
|||
|
|
|
|||
|
|
NrPadPinMap++;
|
|||
|
|
PadPinMapCount[ i ]++;
|
|||
|
|
|
|||
|
|
CurrentToken = CurrentToken + 8;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: no package exists for attachedPattern in device %s \n", DeviceName );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: no pattern name in device %s \n", DeviceName );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: no package for device %s \n", DeviceName );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( !packageExists ) {
|
|||
|
|
printf("ATTRIBUTE '_EXTERNAL_';\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int symbolNum = 0;
|
|||
|
|
int symbolExists = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "attachedSymbol" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
CurrentToken = FindToken( SavePosition + 1, "symbolName" );
|
|||
|
|
|
|||
|
|
if( CurrentToken > 0 ) {
|
|||
|
|
string symbolName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
|
|||
|
|
|
|||
|
|
string symbolNameByOriginal = FindSymbolNameByOriginal( symbolName );
|
|||
|
|
|
|||
|
|
string partNum = "";
|
|||
|
|
|
|||
|
|
int partNumPosition = FindToken( SavePosition + 1, "partNum" );
|
|||
|
|
|
|||
|
|
if( partNumPosition >= 0 ) {
|
|||
|
|
partNum = Tokens[ partNumPosition + 1 ];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( symbolNameByOriginal != "" ) {
|
|||
|
|
symbolExists = 1;
|
|||
|
|
|
|||
|
|
printf( "ADD '%s' 'G%s'(%.8f%s %.8f%s);\n", symbolNameByOriginal, partNum,
|
|||
|
|
0.0, FileUnits, symbolNum * -100.0, FileUnits );
|
|||
|
|
|
|||
|
|
DevicesName[ NrSymbolDevices ] = DeviceName;
|
|||
|
|
SymbolDevicesName[ NrSymbolDevices ] = symbolNameByOriginal;
|
|||
|
|
NrSymbolDevices++;
|
|||
|
|
|
|||
|
|
symbolNum++;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: no SymbolNameByOriginal was found for symbol %s\n", symbolName );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: no symbol name in device %s\n", DeviceName );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in GenerateDevices " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Prefix
|
|||
|
|
|
|||
|
|
int compHeaderToken = FindToken( startToken + 1, "compHeader" );
|
|||
|
|
|
|||
|
|
if( compHeaderToken > 0 ) {
|
|||
|
|
int prefixToken = FindToken( compHeaderToken + 1, "refDesPrefix" );
|
|||
|
|
|
|||
|
|
if( prefixToken > 0 ) {
|
|||
|
|
printf("PREFIX '%s';\n", RemoveDoubleQuotas( Tokens[ prefixToken + 1 ]));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Make connections between pins and pads
|
|||
|
|
|
|||
|
|
if( packageExists && symbolExists ) {
|
|||
|
|
NrOfDevicePadNames = 0;
|
|||
|
|
|
|||
|
|
for( int j = PadPinMapRef[ i ]; j < PadPinMapRef[ i ] + PadPinMapCount[ i ]; j++ ) {
|
|||
|
|
string PinName = RemoveDoubleQuotas(FindPinNameByPinRef( startToken, PadPinMapPinRef[ j ]));
|
|||
|
|
|
|||
|
|
if( PinName != "" ) {
|
|||
|
|
DevicePinNamesTable[NrOfDevicePadNames] = PinName;
|
|||
|
|
DevicePadNamesTable[NrOfDevicePadNames] = PadPinMapNum[ j ];
|
|||
|
|
CurrentDevicePinCount[NrOfDevicePadNames] = 0;
|
|||
|
|
NrOfDevicePadNames++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for( j = 0; j < NrOfDevicePadNames; j++ ) {
|
|||
|
|
if( CurrentDevicePinCount[ j ] == 0 ) {
|
|||
|
|
int Count = 0;
|
|||
|
|
|
|||
|
|
for( int k = j; k < NrOfDevicePadNames; k++ ) {
|
|||
|
|
if( DevicePinNamesTable[ j ] == DevicePinNamesTable[ k ]) {
|
|||
|
|
Count++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Count > 1) {
|
|||
|
|
int m = 1;
|
|||
|
|
|
|||
|
|
for( int k = j; k < NrOfDevicePadNames; k++ ) {
|
|||
|
|
if( DevicePinNamesTable[ j ] == DevicePinNamesTable[ k ]) {
|
|||
|
|
CurrentDevicePinCount[ k ] = m;
|
|||
|
|
m++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for( j = 0; j < NrOfDevicePadNames; j++ ) {
|
|||
|
|
if( CurrentDevicePinCount[ j ] == 0 ) {
|
|||
|
|
printf("CONNECT '%s' '%s';\n", DevicePinNamesTable[ j ], DevicePadNamesTable[ j ]);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf("CONNECT '%s@%d' '%s';\n", DevicePinNamesTable[ j ], CurrentDevicePinCount[ j ], DevicePadNamesTable[ j ]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int FindDummyDeviceName( string DeviceName )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < NrDummyDevices; i++ ) {
|
|||
|
|
if( DummyDevices[ i ] == DeviceName ) {
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateDummyDevices( void )
|
|||
|
|
{
|
|||
|
|
NrDummyDevices = 0;
|
|||
|
|
|
|||
|
|
printf("# Dummy devices: %d\n", NrPadsOnBoard );
|
|||
|
|
|
|||
|
|
for( int i = 0; i < NrPadsOnBoard; i++ ) {
|
|||
|
|
int startToken = PadOnBoardIndex[ i ];
|
|||
|
|
|
|||
|
|
int padStyleRefPosition = FindToken( startToken + 1, "padStyleRef" );
|
|||
|
|
|
|||
|
|
if( padStyleRefPosition >= 0 ) {
|
|||
|
|
string DeviceName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
|
|||
|
|
Tokens[ padStyleRefPosition + 1 ] )
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
PadOnBoardDefs[ i ] = DeviceName;
|
|||
|
|
|
|||
|
|
if( FindDummyDeviceName( DeviceName ) == 0 ) {
|
|||
|
|
DummyDevices[ NrDummyDevices ] = DeviceName;
|
|||
|
|
NrDummyDevices++;
|
|||
|
|
|
|||
|
|
printf("#\n");
|
|||
|
|
printf("# Dummy package: %s\n", DeviceName );
|
|||
|
|
|
|||
|
|
printf("EDIT '%s.PAC';\n", DeviceName );
|
|||
|
|
printf("GRID %s;\n", FileUnits );
|
|||
|
|
|
|||
|
|
GeneratePad( startToken, 1 );
|
|||
|
|
|
|||
|
|
printf("#\n");
|
|||
|
|
printf("# Device: %s\n", DeviceName );
|
|||
|
|
|
|||
|
|
printf("EDIT '%s.DEV';\n", DeviceName );
|
|||
|
|
printf("GRID %s;\n", FileUnits );
|
|||
|
|
printf("ATTRIBUTE '_EXTERNAL_';\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("# warning: can't find padStyleRef in dummy device.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Generate library from 'library' keyword
|
|||
|
|
|
|||
|
|
void GenerateLibrary( void )
|
|||
|
|
{
|
|||
|
|
GenerateLibraryHeader();
|
|||
|
|
|
|||
|
|
GeneratePadDefinitions();
|
|||
|
|
|
|||
|
|
GenerateViaDefinitions();
|
|||
|
|
|
|||
|
|
GeneratePackages();
|
|||
|
|
|
|||
|
|
GenerateSymbols();
|
|||
|
|
|
|||
|
|
GenerateDevices();
|
|||
|
|
|
|||
|
|
GenerateDummyDevices();
|
|||
|
|
|
|||
|
|
printf("WRITE;\n");
|
|||
|
|
printf("CLOSE;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GeneratePCBHeader( void )
|
|||
|
|
{
|
|||
|
|
string libraryName;
|
|||
|
|
|
|||
|
|
printf("# ***** Board *****\n");
|
|||
|
|
|
|||
|
|
string eagleFileName;
|
|||
|
|
string array[];
|
|||
|
|
|
|||
|
|
sprintf( eagleFileName, "%s.brd", PCADfileName);
|
|||
|
|
|
|||
|
|
if( fileglob( array, eagleFileName ) ) {
|
|||
|
|
printf("SET CONFIRM YES;\n");
|
|||
|
|
printf("REMOVE '%s';\n", eagleFileName );
|
|||
|
|
printf("SET CONFIRM OFF;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("EDIT '%s';\n", eagleFileName );
|
|||
|
|
printf("DRC LOAD '%s';\n", DRUFileName );
|
|||
|
|
printf("SET WIRE_BEND 2;\n");
|
|||
|
|
|
|||
|
|
libraryName = filesetext( PCADfileName, ".lbr");
|
|||
|
|
|
|||
|
|
printf("USE -* '%s';\n", libraryName);
|
|||
|
|
printf("GRID %s;\n", FileUnits );
|
|||
|
|
printf("SET OPTIMIZING ON;\n");
|
|||
|
|
printf("SET CONFIRM YES;\n");
|
|||
|
|
printf("CHANGE FONT VECTOR;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function generates one via
|
|||
|
|
|
|||
|
|
void GenerateVia( int startToken )
|
|||
|
|
{
|
|||
|
|
int tokenPosition = FindToken( startToken + 1, "viaStyleRef" );
|
|||
|
|
|
|||
|
|
if( tokenPosition >= 0 ) {
|
|||
|
|
printf("#viaStyleRef = %s\n", Tokens[ tokenPosition + 1 ] );
|
|||
|
|
|
|||
|
|
string info;
|
|||
|
|
sprintf( info, "Process via %d %s", tokenPosition, Tokens[ tokenPosition + 1 ] );
|
|||
|
|
UpdateProgress( info );
|
|||
|
|
|
|||
|
|
int ViaStyleDefNum = FindViaStyleDef( Tokens[ tokenPosition + 1 ] );
|
|||
|
|
|
|||
|
|
if( ViaStyleDefNum >= 0 ) {
|
|||
|
|
if( ViaStyleDefsSkip[ ViaStyleDefNum ] == 0 ) {
|
|||
|
|
printf( "%s", ViaStyleDefsScript[ ViaStyleDefNum ] );
|
|||
|
|
|
|||
|
|
int viaNetPosition = FindToken( startToken + 1, "netNameRef" );
|
|||
|
|
|
|||
|
|
int ifSignalName = 0;
|
|||
|
|
|
|||
|
|
if( viaNetPosition >= 0 ) {
|
|||
|
|
ifSignalName = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int viaCoordPosition = FindToken( startToken + 1, "pt" );
|
|||
|
|
|
|||
|
|
if( viaCoordPosition >= 0 ) {
|
|||
|
|
string xCoordVia = "";
|
|||
|
|
string yCoordVia = "";
|
|||
|
|
|
|||
|
|
xCoordVia = Tokens[ viaCoordPosition + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ viaCoordPosition + 2 ] ) ) {
|
|||
|
|
xCoordVia = xCoordVia + Tokens[ viaCoordPosition + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ viaCoordPosition + 3 ] != ")" ) {
|
|||
|
|
yCoordVia = Tokens[ viaCoordPosition + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ viaCoordPosition + 4 ] != ")" ) {
|
|||
|
|
yCoordVia = yCoordVia + Tokens[ viaCoordPosition + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoordVia = Tokens[ viaCoordPosition + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ viaCoordPosition + 3 ] != ")" ) {
|
|||
|
|
yCoordVia = yCoordVia + Tokens[ viaCoordPosition + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string Val1 = ConvertUnits( GetNumberValue( xCoordVia ),
|
|||
|
|
GetUnitValue( xCoordVia ) );
|
|||
|
|
string Val2 = ConvertUnits( GetNumberValue( yCoordVia ),
|
|||
|
|
GetUnitValue( yCoordVia ) );
|
|||
|
|
|
|||
|
|
if( ifSignalName ) {
|
|||
|
|
printf( "VIA '%s' %s %s (%s %s);\n",
|
|||
|
|
ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ viaNetPosition + 1 ] ) ),
|
|||
|
|
ViaStyleDefsDiameter[ ViaStyleDefNum ],
|
|||
|
|
ViaStyleDefsType[ ViaStyleDefNum ],
|
|||
|
|
Val1, Val2 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf( "VIA %s %s (%s %s);\n",
|
|||
|
|
ViaStyleDefsDiameter[ ViaStyleDefNum ],
|
|||
|
|
ViaStyleDefsType[ ViaStyleDefNum ],
|
|||
|
|
Val1, Val2 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "#WARNING: Can't find pt for via %s\n",
|
|||
|
|
Tokens[ startToken + 3 ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf("#skip this via\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "#WARNING: Can't find viaStyleDef for via %s\n",
|
|||
|
|
Tokens[ startToken + 3 ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "#WARNING: Can't find viaStyleRef for via %s\n",
|
|||
|
|
Tokens[ startToken + 3 ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int IfNameChanged = 0;
|
|||
|
|
int IfValueChanged = 0;
|
|||
|
|
|
|||
|
|
void ChangeOneNameAndValue( string elemName, string attributeName, int startToken, string xCoord, string yCoord, string pureRotation )
|
|||
|
|
{
|
|||
|
|
string xCoordText = "0.0";
|
|||
|
|
string yCoordText = "0.0";
|
|||
|
|
string rotation = "0";
|
|||
|
|
string isVisible = "False";
|
|||
|
|
string textStyleRef = "";
|
|||
|
|
string justify = "";
|
|||
|
|
int isFlipped = 0;
|
|||
|
|
|
|||
|
|
CurrentToken = startToken;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
xCoordText = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xCoordText = xCoordText + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoordText = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yCoordText = yCoordText + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoordText = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoordText = yCoordText + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "rotation" ) {
|
|||
|
|
rotation = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isVisible" ) {
|
|||
|
|
isVisible = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "textStyleRef" ) {
|
|||
|
|
textStyleRef = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isFlipped" ) {
|
|||
|
|
if( ( Tokens[ CurrentToken + 1 ] == "True" ) || ( Tokens[ CurrentToken + 1 ] == "true" ) ) {
|
|||
|
|
isFlipped = 1;
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "justify" ) {
|
|||
|
|
justify = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
real newXCoord = strtod( ConvertUnits( GetNumberValue( xCoord ), GetUnitValue( xCoord ) ) ) +
|
|||
|
|
strtod( ConvertUnits( GetNumberValue( xCoordText ), GetUnitValue( xCoordText ) ) );
|
|||
|
|
|
|||
|
|
real newYCoord = strtod( ConvertUnits( GetNumberValue( yCoord ), GetUnitValue( yCoord ) ) ) +
|
|||
|
|
strtod( ConvertUnits( GetNumberValue( yCoordText ), GetUnitValue( yCoordText ) ) );
|
|||
|
|
|
|||
|
|
printf( "MOVE '%s>%s' (%f %f);\n", elemName, attributeName, newXCoord, newYCoord );
|
|||
|
|
|
|||
|
|
real finalRotation = strtod( pureRotation );
|
|||
|
|
|
|||
|
|
string mirrored = "";
|
|||
|
|
|
|||
|
|
if( isFlipped ) {
|
|||
|
|
mirrored = "M";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf( "ROTATE =S%sR%s '%s>%s';\n", mirrored, rotation, elemName, attributeName );
|
|||
|
|
|
|||
|
|
if( justify == "" ) { //LowerLeft
|
|||
|
|
printf("CHANGE ALIGN BOTTOM LEFT;\n");
|
|||
|
|
} else if( justify == "UpperLeft" ) {
|
|||
|
|
printf("CHANGE ALIGN TOP LEFT;\n");
|
|||
|
|
} else if( justify == "UpperCenter" ) {
|
|||
|
|
printf("CHANGE ALIGN TOP CENTER;\n");
|
|||
|
|
} else if( justify == "UpperRight" ) {
|
|||
|
|
printf("CHANGE ALIGN TOP RIGHT;\n");
|
|||
|
|
} else if( justify == "Left" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER LEFT;\n");
|
|||
|
|
} else if( justify == "Center" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER CENTER;\n");
|
|||
|
|
} else if( justify == "Right" ) {
|
|||
|
|
printf("CHANGE ALIGN CENTER RIGHT;\n");
|
|||
|
|
} else if( justify == "LowerLeft" ) {
|
|||
|
|
printf("CHANGE ALIGN BOTTOM LEFT;\n");
|
|||
|
|
} else if( justify == "LowerCenter" ) {
|
|||
|
|
printf("CHANGE ALIGN BOTTOM CENTER;\n");
|
|||
|
|
} else if( justify == "LowerRight" ) {
|
|||
|
|
printf("CHANGE ALIGN BOTTOM RIGHT;\n");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: unknown justify parameter value = %s\n", justify );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
|
|||
|
|
printf("CHANGE ALIGN BOTTOM LEFT;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int textStyleDefPos = FindTextStyleDef( textStyleRef );
|
|||
|
|
|
|||
|
|
if( textStyleDefPos >= 0 ) {
|
|||
|
|
real fontHeight = strtod( ConvertUnits( GetNumberValue( TextStyleDefFontHeight[ textStyleDefPos ] ), GetUnitValue( TextStyleDefFontHeight[ textStyleDefPos ] ) ) );
|
|||
|
|
real fontWidth = strtod( ConvertUnits( GetNumberValue( TextStyleDefFontStrokeWidth[ textStyleDefPos ] ), GetUnitValue( TextStyleDefFontStrokeWidth[ textStyleDefPos ] ) ) );
|
|||
|
|
|
|||
|
|
printf("CHANGE SIZE %s (%f %f);\n", TextStyleDefFontHeight[ textStyleDefPos ], newXCoord, newYCoord );
|
|||
|
|
|
|||
|
|
if( fontHeight ) {
|
|||
|
|
int ratio = round( 100.0 * fontWidth / fontHeight );
|
|||
|
|
|
|||
|
|
if( ratio > 31.0 ) {
|
|||
|
|
ratio = 31.0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("CHANGE RATIO %d (%f %f);\n", ratio, newXCoord, newYCoord );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( isVisible != "True" ) {
|
|||
|
|
printf( "CHANGE DISPLAY OFF (%f %f);\n", newXCoord, newYCoord );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf( "CHANGE DISPLAY VALUE (%f %f);\n", newXCoord, newYCoord );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ChangeNameAndValuePosition( string elemName, int patternGraphicsRef, string xCoord, string yCoord, string pureRotation )
|
|||
|
|
{
|
|||
|
|
//printf("SMASH '%s';\n", elemName );
|
|||
|
|
|
|||
|
|
CurrentToken = patternGraphicsRef + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "attr" ) {
|
|||
|
|
if( Tokens[ CurrentToken + 1 ] == "\"RefDes\"" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
ChangeOneNameAndValue( elemName, "NAME", CurrentToken + 3, xCoord, yCoord, pureRotation );
|
|||
|
|
IfNameChanged = 1;
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 1 ] == "\"Value\"" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
ChangeOneNameAndValue( elemName, "VALUE", CurrentToken + 3, xCoord, yCoord, pureRotation );
|
|||
|
|
IfValueChanged = 1;
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int FindPatternGraphisRef( int startToken )
|
|||
|
|
{
|
|||
|
|
int patternGraphicsNameRefToken = FindToken( startToken + 1, "patternGraphicsNameRef" );
|
|||
|
|
|
|||
|
|
if( patternGraphicsNameRefToken >= 0 ) {
|
|||
|
|
string patternGraphicsNameRef = RemoveDoubleQuotas( Tokens[ patternGraphicsNameRefToken + 1 ] );
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "patternGraphicsRef" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
int nameRefToken = FindToken( CurrentToken + 1, "patternGraphicsNameRef" );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
|
|||
|
|
if( nameRefToken >= 0 ) {
|
|||
|
|
string name = RemoveDoubleQuotas( Tokens[ nameRefToken + 1 ] );
|
|||
|
|
|
|||
|
|
if( name == patternGraphicsNameRef ) {
|
|||
|
|
return( SavePosition );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
return( -1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( FindToken( startToken + 1, "patternGraphicsRef" ) );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function generates one component
|
|||
|
|
|
|||
|
|
void GeneratePattern( int startToken )
|
|||
|
|
{
|
|||
|
|
int patternRefPosition = FindToken( startToken + 1, "patternRef" );
|
|||
|
|
|
|||
|
|
if( patternRefPosition >= 0 ) {
|
|||
|
|
printf("#patternRef = %s\n", Tokens[ patternRefPosition + 1 ] );
|
|||
|
|
|
|||
|
|
string info;
|
|||
|
|
sprintf( info, "Process pattern %d %s", patternRefPosition, Tokens[ patternRefPosition + 1 ] );
|
|||
|
|
UpdateProgress( info );
|
|||
|
|
|
|||
|
|
int refDesRefPosition = FindToken( startToken + 1, "refDesRef" );
|
|||
|
|
|
|||
|
|
if( refDesRefPosition >= 0 ) {
|
|||
|
|
string RotationMirrored = "";
|
|||
|
|
|
|||
|
|
int mirrored = FindToken( startToken + 1, "isFlipped" );
|
|||
|
|
|
|||
|
|
if( mirrored >= 0 ) {
|
|||
|
|
if( ( Tokens[ mirrored + 1 ] == "True" ) || ( Tokens[ mirrored + 1 ] == "true" ) ) {
|
|||
|
|
RotationMirrored = "M";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int rotationPosition = FindToken( startToken + 1, "rotation" );
|
|||
|
|
|
|||
|
|
string pureRotation = "0.0";
|
|||
|
|
|
|||
|
|
if( rotationPosition >= 0 ) {
|
|||
|
|
pureRotation = Tokens[ rotationPosition + 1 ];
|
|||
|
|
RotationMirrored = RotationMirrored + "R" + Tokens[ rotationPosition + 1 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
RotationMirrored = RotationMirrored + "R0";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int patternPosition = FindToken( startToken + 1, "pt" );
|
|||
|
|
|
|||
|
|
if( patternPosition >= 0 ) {
|
|||
|
|
string xCoordPattern = "";
|
|||
|
|
string yCoordPattern = "";
|
|||
|
|
|
|||
|
|
xCoordPattern = Tokens[ patternPosition + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ patternPosition + 2 ] ) ) {
|
|||
|
|
xCoordPattern = xCoordPattern + Tokens[ patternPosition + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ patternPosition + 3 ] != ")" ) {
|
|||
|
|
yCoordPattern = Tokens[ patternPosition + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ patternPosition + 4 ] != ")" ) {
|
|||
|
|
yCoordPattern = yCoordPattern + Tokens[ patternPosition + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoordPattern = Tokens[ patternPosition + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ patternPosition + 3 ] != ")" ) {
|
|||
|
|
yCoordPattern = yCoordPattern + Tokens[ patternPosition + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string Val1 = ConvertUnits( GetNumberValue( xCoordPattern ),
|
|||
|
|
GetUnitValue( xCoordPattern ) );
|
|||
|
|
string Val2 = ConvertUnits( GetNumberValue( yCoordPattern ),
|
|||
|
|
GetUnitValue( yCoordPattern ) );
|
|||
|
|
|
|||
|
|
string patternDefName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ patternRefPosition + 1 ] ) );
|
|||
|
|
string elemName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ refDesRefPosition + 1 ] ) );
|
|||
|
|
|
|||
|
|
int patternGraphicsNameRefToken = FindToken( startToken + 1, "patternGraphicsNameRef" );
|
|||
|
|
|
|||
|
|
string variantName = "";
|
|||
|
|
|
|||
|
|
if( patternGraphicsNameRefToken >= 0 ) {
|
|||
|
|
variantName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ patternGraphicsNameRefToken + 1 ] ) );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( RotationMirrored != "" ) {
|
|||
|
|
printf( "ADD '%s%s' '%s' %s (%s %s);\n",
|
|||
|
|
patternDefName,
|
|||
|
|
variantName,
|
|||
|
|
elemName,
|
|||
|
|
RotationMirrored,
|
|||
|
|
Val1, Val2 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf( "ADD '%s%s' '%s' (%s %s);\n",
|
|||
|
|
patternDefName,
|
|||
|
|
variantName,
|
|||
|
|
elemName,
|
|||
|
|
Val1, Val2 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string value = FindCompValue( elemName );
|
|||
|
|
|
|||
|
|
if( value != "" ) {
|
|||
|
|
printf( "VALUE '%s' '%s';\n", elemName, value );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int patternGraphicsRef = FindPatternGraphisRef( startToken );
|
|||
|
|
|
|||
|
|
if( patternGraphicsRef >= 0 ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
int index = FindPatternDefIndexByName( patternDefName, variantName );
|
|||
|
|
|
|||
|
|
AddAttributes( 0, index, elemName, patternGraphicsRef, Val1, Val2 );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
printf("SMASH '%s';\n", elemName );
|
|||
|
|
|
|||
|
|
IfNameChanged = 0;
|
|||
|
|
IfValueChanged = 0;
|
|||
|
|
|
|||
|
|
ChangeNameAndValuePosition( elemName, patternGraphicsRef, Val1, Val2, pureRotation );
|
|||
|
|
|
|||
|
|
if( index >= 0 ) {
|
|||
|
|
if( IfNameDefinedInPattern[ index ] ) {
|
|||
|
|
if( !IfNameChanged ) {
|
|||
|
|
printf( "DELETE '%s>NAME';\n", elemName );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( IfValueDefinedInPattern[ index ] ) {
|
|||
|
|
if( !IfValueChanged ) {
|
|||
|
|
printf( "DELETE '%s>VALUE';\n", elemName );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: can't find index for pattern %s\n", patternDefName );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
int index = FindPatternDefIndexByName( patternDefName, "" );
|
|||
|
|
|
|||
|
|
AddAttributes( 0, index, elemName, startToken, Val1, Val2 );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
printf("SMASH '%s';\n", elemName );
|
|||
|
|
|
|||
|
|
ChangeNameAndValuePosition( elemName, startToken, Val1, Val2, pureRotation );
|
|||
|
|
|
|||
|
|
if( index >= 0 ) {
|
|||
|
|
if( IfNameDefinedInPattern[ index ] ) {
|
|||
|
|
if( !IfNameChanged ) {
|
|||
|
|
printf( "DELETE '%s>NAME';\n", elemName );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( IfValueDefinedInPattern[ index ] ) {
|
|||
|
|
if( !IfValueChanged ) {
|
|||
|
|
printf( "DELETE '%s>VALUE';\n", elemName );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: can't find index for pattern %s\n", patternDefName );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "#warning: Can't find pattern coordinates %s\n",
|
|||
|
|
Tokens[ patternRefPosition + 1 ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("#warning: can't find pattern design name\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("#warning: Can't find pattern reference.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string FindNodePadName( string nodeElementName, string nodePadName )
|
|||
|
|
{
|
|||
|
|
string compDefName = FindSymbolDeviceName( nodeElementName );
|
|||
|
|
|
|||
|
|
if( compDefName != "" ) {
|
|||
|
|
for( int i = 0; i < CompDefsNumber; i++ ) {
|
|||
|
|
int startToken = CompDefsArray[ i ];
|
|||
|
|
|
|||
|
|
string DeviceName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
|
|||
|
|
Tokens[ startToken ] )
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
if( DeviceName == compDefName ) {
|
|||
|
|
int padMapIndex = PadPinMapRef[ i ];
|
|||
|
|
|
|||
|
|
for( int j = 0; j < PadPinMapCount[ i ]; j++ ) {
|
|||
|
|
if( nodePadName == PadPinMapPinRef[ padMapIndex ] ) {
|
|||
|
|
return( PadPinMapNum[ padMapIndex ] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
padMapIndex++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( "" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateSignals( void )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < NrNets; i++ ) {
|
|||
|
|
int node = NodeRef[ i ];
|
|||
|
|
|
|||
|
|
for( int j = 0; j < NrNetNodes[ i ]; j++ ) {
|
|||
|
|
string nodePadName = FindNodePadName( NodeElementName[ node ], NodePadName[ node ] );
|
|||
|
|
|
|||
|
|
if( nodePadName != "" ) {
|
|||
|
|
printf( "SIGNAL %s %s %s;\n", NetNames[ i ], NodeElementName[ node ], nodePadName );
|
|||
|
|
node++;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: NodePadName not found %s %s\n", NodeElementName[ node ], NodePadName[ node ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOneDummyPattern( int startToken, int dummyPatternCount )
|
|||
|
|
{
|
|||
|
|
int padStyleRefPosition = FindToken( startToken + 1, "padStyleRef" );
|
|||
|
|
|
|||
|
|
if( padStyleRefPosition >= 0 ) {
|
|||
|
|
string DeviceName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
|
|||
|
|
Tokens[ padStyleRefPosition + 1 ] )
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
CurrentToken = FindToken( startToken + 1, "pt" );
|
|||
|
|
|
|||
|
|
if( CurrentToken >= 0 ) {
|
|||
|
|
string xCoordText;
|
|||
|
|
string yCoordText;
|
|||
|
|
|
|||
|
|
xCoordText = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xCoordText = xCoordText + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoordText = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yCoordText = yCoordText + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoordText = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoordText = yCoordText + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf( "ADD '%s' 'DUMMY%d' (%s %s);\n",
|
|||
|
|
ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ padStyleRefPosition + 1 ] ) ),
|
|||
|
|
dummyPatternCount,
|
|||
|
|
xCoordText, yCoordText );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("# warning: GenerateOneDummyPattern: can't find point in dummy device.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("# warning: GenerateOneDummyPattern: can't find padStyleRef in dummy device.\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GeneratePCBMultilayer( void )
|
|||
|
|
{
|
|||
|
|
int dummyPatternCount = 1;
|
|||
|
|
|
|||
|
|
if( PCBDesignMultiLayerToken ) {
|
|||
|
|
CurrentToken = PCBDesignMultiLayerToken;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pad" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneDummyPattern( SavePosition, dummyPatternCount );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
dummyPatternCount++;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "via" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
GenerateVia( SavePosition );
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pattern" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
GeneratePattern( SavePosition );
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "fromTo" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: GeneratePCBMultilayer unknown keyword: %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( "Unexpected keyword in pcbDesign multiLayer " + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "# warning: no multilayer token in pcbDesign\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
GenerateSignals();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GeneratePCBLayerContents( void )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < NrPCBLayerContents; i++ ) {
|
|||
|
|
int startToken = PCBLayerContentsArray[ i ];
|
|||
|
|
|
|||
|
|
GenerateLayerContents( startToken, -1 );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Generate PCB from 'pcbDesign' keyword
|
|||
|
|
|
|||
|
|
void GeneratePCB( void )
|
|||
|
|
{
|
|||
|
|
GeneratePCBHeader();
|
|||
|
|
|
|||
|
|
GeneratePCBMultilayer();
|
|||
|
|
|
|||
|
|
GeneratePCBLayerContents();
|
|||
|
|
|
|||
|
|
printf("WINDOW FIT;\n");
|
|||
|
|
printf("SET CONFIRM OFF;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateSchematicHeader( void )
|
|||
|
|
{
|
|||
|
|
string libraryName;
|
|||
|
|
|
|||
|
|
printf("# ***** Schematic *****\n");
|
|||
|
|
|
|||
|
|
string eagleFileName;
|
|||
|
|
string array[];
|
|||
|
|
|
|||
|
|
sprintf( eagleFileName, "%s.eagle.sch", PCADfileName);
|
|||
|
|
|
|||
|
|
if( fileglob( array, eagleFileName ) ) {
|
|||
|
|
printf("SET CONFIRM YES;\n");
|
|||
|
|
printf("REMOVE '%s';\n", eagleFileName );
|
|||
|
|
printf("SET CONFIRM OFF;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("EDIT '%s';\n", eagleFileName );
|
|||
|
|
|
|||
|
|
libraryName = filesetext( PCADfileName, ".lbr");
|
|||
|
|
|
|||
|
|
printf("USE -* '%s';\n", libraryName);
|
|||
|
|
printf("GRID %s;\n", FileUnits );
|
|||
|
|
//printf("SET OPTIMIZING ON;\n");
|
|||
|
|
printf("SET CONFIRM YES;\n");
|
|||
|
|
printf("SET AUTO_JUNCTION OFF;\n");
|
|||
|
|
printf("SET CHECK_CONNECTS OFF;\n");
|
|||
|
|
printf("SET WIRE_BEND 2;\n");
|
|||
|
|
printf("CHANGE FONT VECTOR;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOneSheetSymbol( int startToken )
|
|||
|
|
{
|
|||
|
|
int symbolRefPosition = FindToken( startToken + 1, "symbolRef" );
|
|||
|
|
|
|||
|
|
if( symbolRefPosition >= 0 ) {
|
|||
|
|
//printf("#symbolRef = %s\n", Tokens[ symbolRefPosition + 1 ] );
|
|||
|
|
|
|||
|
|
string info;
|
|||
|
|
sprintf( info, TR("Process symbolref ") + " %d %s", symbolRefPosition, Tokens[ symbolRefPosition + 1 ] );
|
|||
|
|
UpdateProgress( info );
|
|||
|
|
|
|||
|
|
int refDesRefPosition = FindToken( startToken + 1, "refDesRef" );
|
|||
|
|
|
|||
|
|
if( refDesRefPosition >= 0 ) {
|
|||
|
|
string refDesRef = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ refDesRefPosition + 1 ] ) );
|
|||
|
|
|
|||
|
|
printf("#refDesRef = %s\n", Tokens[ refDesRefPosition + 1 ] );
|
|||
|
|
|
|||
|
|
string RotationMirrored = "";
|
|||
|
|
|
|||
|
|
int mirrored = FindToken( startToken + 1, "isFlipped" );
|
|||
|
|
|
|||
|
|
if( mirrored >= 0 ) {
|
|||
|
|
if( ( Tokens[ mirrored + 1 ] == "True" ) || ( Tokens[ mirrored + 1 ] == "true" ) ) {
|
|||
|
|
RotationMirrored = "M";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int rotationPosition = FindToken( startToken + 1, "rotation" );
|
|||
|
|
|
|||
|
|
if( rotationPosition >= 0 ) {
|
|||
|
|
RotationMirrored = RotationMirrored + "R" + Tokens[ rotationPosition + 1 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
RotationMirrored = RotationMirrored + "R0";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string partNum = "";
|
|||
|
|
|
|||
|
|
int partNumPosition = FindToken( startToken + 1, "partNum" );
|
|||
|
|
|
|||
|
|
if( partNumPosition >= 0 ) {
|
|||
|
|
partNum = Tokens[ partNumPosition + 1 ];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int patternPosition = FindToken( startToken + 1, "pt" );
|
|||
|
|
|
|||
|
|
if( patternPosition >= 0 ) {
|
|||
|
|
string DeviceName = FindSymbolDeviceName( refDesRef );
|
|||
|
|
|
|||
|
|
if( DeviceName != "" ) {
|
|||
|
|
string vtText = "";
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "attr" ) {
|
|||
|
|
string type = RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] );
|
|||
|
|
|
|||
|
|
if( ( type == "VT" ) || ( type == "Vt" ) ) {
|
|||
|
|
vtText = FindText( CurrentToken + 1 );
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string xCoordPattern = "";
|
|||
|
|
string yCoordPattern = "";
|
|||
|
|
|
|||
|
|
xCoordPattern = Tokens[ patternPosition + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ patternPosition + 2 ] ) ) {
|
|||
|
|
xCoordPattern = xCoordPattern + Tokens[ patternPosition + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ patternPosition + 3 ] != ")" ) {
|
|||
|
|
yCoordPattern = Tokens[ patternPosition + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ patternPosition + 4 ] != ")" ) {
|
|||
|
|
yCoordPattern = yCoordPattern + Tokens[ patternPosition + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoordPattern = Tokens[ patternPosition + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ patternPosition + 3 ] != ")" ) {
|
|||
|
|
yCoordPattern = yCoordPattern + Tokens[ patternPosition + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string Val1 = ConvertUnits( GetNumberValue( xCoordPattern ),
|
|||
|
|
GetUnitValue( xCoordPattern ) );
|
|||
|
|
string Val2 = ConvertUnits( GetNumberValue( yCoordPattern ),
|
|||
|
|
GetUnitValue( yCoordPattern ) );
|
|||
|
|
|
|||
|
|
if( strtol( partNum ) > 1 ) {
|
|||
|
|
printf( "ADD '%s' '%sG%s' 'G%s' %s (%s %s);\n",
|
|||
|
|
DeviceName,
|
|||
|
|
refDesRef,
|
|||
|
|
partNum,
|
|||
|
|
partNum,
|
|||
|
|
RotationMirrored,
|
|||
|
|
Val1, Val2 );
|
|||
|
|
|
|||
|
|
string tmp;
|
|||
|
|
|
|||
|
|
sprintf( tmp, "%sG%sG%s", refDesRef, partNum, partNum );
|
|||
|
|
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
string symbolDefName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ symbolRefPosition + 1 ] ) );
|
|||
|
|
|
|||
|
|
int index = FindSymbolIndexByName( symbolDefName );
|
|||
|
|
|
|||
|
|
AddAttributes( 1, index, tmp, startToken, Val1, Val2 );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
printf("SMASH (%s %s);\n", Val1, Val2 );
|
|||
|
|
|
|||
|
|
IfNameChanged = 0;
|
|||
|
|
IfValueChanged = 0;
|
|||
|
|
|
|||
|
|
ChangeNameAndValuePosition( tmp, startToken, Val1, Val2, Tokens[ rotationPosition + 1 ] );
|
|||
|
|
|
|||
|
|
if( index >= 0 ) {
|
|||
|
|
if( IfNameDefinedInSymbol[ index ] ) {
|
|||
|
|
if( !IfNameChanged ) {
|
|||
|
|
printf( "DELETE '%s>NAME';\n", tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( IfValueDefinedInSymbol[ index ] ) {
|
|||
|
|
if( !IfValueChanged ) {
|
|||
|
|
printf( "DELETE '%s>VALUE';\n", tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: can't find index for symbol %s\n", symbolDefName );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
printf( "ADD '%s' '%s' 'G%s' %s (%s %s);\n",
|
|||
|
|
DeviceName,
|
|||
|
|
refDesRef,
|
|||
|
|
partNum,
|
|||
|
|
RotationMirrored,
|
|||
|
|
Val1, Val2 );
|
|||
|
|
|
|||
|
|
string tmp;
|
|||
|
|
|
|||
|
|
sprintf( tmp, "%sG%s", refDesRef, partNum );
|
|||
|
|
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
|
|||
|
|
string symbolDefName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ symbolRefPosition + 1 ] ) );
|
|||
|
|
|
|||
|
|
int index = FindSymbolIndexByName( symbolDefName );
|
|||
|
|
|
|||
|
|
AddAttributes( 1, index, tmp, startToken, Val1, Val2 );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
printf("SMASH (%s %s);\n", Val1, Val2 );
|
|||
|
|
|
|||
|
|
IfNameChanged = 0;
|
|||
|
|
IfValueChanged = 0;
|
|||
|
|
|
|||
|
|
ChangeNameAndValuePosition( tmp, startToken, Val1, Val2, Tokens[ rotationPosition + 1 ] );
|
|||
|
|
|
|||
|
|
if( index >= 0 ) {
|
|||
|
|
if( IfNameDefinedInSymbol[ index ] ) {
|
|||
|
|
if( !IfNameChanged ) {
|
|||
|
|
printf( "DELETE '%s>NAME';\n", tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( IfValueDefinedInSymbol[ index ] ) {
|
|||
|
|
if( !IfValueChanged ) {
|
|||
|
|
printf( "DELETE '%s>VALUE';\n", tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "# warning: can't find index for symbol %s\n", symbolDefName );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("#warning: no DeviceName found.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "#warning: Can't find pattern coordinates %s\n",
|
|||
|
|
Tokens[ symbolRefPosition + 1 ] );
|
|||
|
|
WriteLog( tmp );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("#warning: can't find symbol design name\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog("#warning: Can't find symbol reference.\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateTitleSheet( void )
|
|||
|
|
{
|
|||
|
|
if( SchTitleSheet ) {
|
|||
|
|
CurrentToken = SchTitleSheet;
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "isVisible" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "border" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
//GenerateBorder( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "zones" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
//GenerateZones( SavePosition ); FixMe
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "offset" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "line" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneLine( SavePosition, 0, 0 );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "field" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "poly" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOnePcbPoly( SavePosition, 0, DEFAULT_WIRE_WIDTH_BOARD );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "text" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneText( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "triplePointArc" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneTripleArc( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# ????? GenerateTitleSheet unknown keyword: %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox( TR("Unexpected keyword in GenerateTitleSheet: ") + Tokens[ CurrentToken ], "OK");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "# warning: no titleSheet token in schematicDesign\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateOnePort( int startToken )
|
|||
|
|
{
|
|||
|
|
string type;
|
|||
|
|
string netNameRef;
|
|||
|
|
string isFlipped;
|
|||
|
|
string xCoordText;
|
|||
|
|
string yCoordText;
|
|||
|
|
string rotation = "0";
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "pt" ) {
|
|||
|
|
xCoordText = Tokens[ CurrentToken + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ CurrentToken + 2 ] ) ) {
|
|||
|
|
xCoordText = xCoordText + Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoordText = Tokens[ CurrentToken + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 4 ] != ")" ) {
|
|||
|
|
yCoordText = yCoordText + Tokens[ CurrentToken + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoordText = Tokens[ CurrentToken + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken + 3 ] != ")" ) {
|
|||
|
|
yCoordText = yCoordText + Tokens[ CurrentToken + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "portType" ) {
|
|||
|
|
type = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "netNameRef" ) {
|
|||
|
|
netNameRef = ReplaceNotSupportedCharacters( RemoveDoubleQuotas( Tokens[ CurrentToken + 1 ] ) );
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isFlipped" ) {
|
|||
|
|
isFlipped = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "portPinLength" ) {
|
|||
|
|
isFlipped = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "rotation" ) {
|
|||
|
|
rotation = Tokens[ CurrentToken + 1 ];
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GenerateOnePort ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
XCoordLabels[ NrLabels ] = xCoordText;
|
|||
|
|
YCoordLabels[ NrLabels ] = yCoordText;
|
|||
|
|
TypeLabels[ NrLabels ] = type;
|
|||
|
|
NetNameRef[ NrLabels ] = netNameRef;
|
|||
|
|
IsLabelFlipped[ NrLabels ] = isFlipped;
|
|||
|
|
LabelRotation[ NrLabels ] = rotation;
|
|||
|
|
|
|||
|
|
NrLabels++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateSheets( void )
|
|||
|
|
{
|
|||
|
|
printf("# Sheets:\n");
|
|||
|
|
|
|||
|
|
for( int i = 0; i < NrSheets; i++ ) {
|
|||
|
|
int startToken = SheetsArray[ i ];
|
|||
|
|
|
|||
|
|
int junctions[];
|
|||
|
|
int NrJunctions = 0;
|
|||
|
|
|
|||
|
|
NrLabels = 0;
|
|||
|
|
NrWiresPoint = 0;
|
|||
|
|
|
|||
|
|
int buses[];
|
|||
|
|
int NrBuses = 0;
|
|||
|
|
|
|||
|
|
string info;
|
|||
|
|
sprintf( info, TR("Process sheet ") + " %d (%d)", i, NrSheets );
|
|||
|
|
UpdateProgress( info );
|
|||
|
|
|
|||
|
|
string sheetName = ReplaceNotSupportedCharacters( RemoveDoubleQuotas(
|
|||
|
|
Tokens[ startToken ] )
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
int sheetNumberToken = FindToken( startToken + 1, "sheetNum" );
|
|||
|
|
|
|||
|
|
string sheetNumber;
|
|||
|
|
|
|||
|
|
sprintf( sheetNumber, "%d", i + 1 );
|
|||
|
|
|
|||
|
|
if( sheetNumberToken >= 0 ) {
|
|||
|
|
sheetNumber = Tokens[ sheetNumberToken + 1 ];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "# warning: no sheet number.\n" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("#\n");
|
|||
|
|
printf("# sheet: %s %s\n", sheetName, sheetNumber );
|
|||
|
|
|
|||
|
|
printf("EDIT '.S%s'\n", sheetNumber );
|
|||
|
|
printf("GRID %s;\n", FileUnits );
|
|||
|
|
|
|||
|
|
GenerateTitleSheet();
|
|||
|
|
|
|||
|
|
printf( "CHANGE LAYER 91;\n" );
|
|||
|
|
|
|||
|
|
CurrentToken = startToken + 1;
|
|||
|
|
|
|||
|
|
while( CurrentToken < TokensNumber ) {
|
|||
|
|
if( Tokens[ CurrentToken ] == "(" ) {
|
|||
|
|
CurrentToken++;
|
|||
|
|
|
|||
|
|
if( Tokens[ CurrentToken ] == "sheetNum" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "fieldSetRef" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "junction" ) {
|
|||
|
|
junctions[ NrJunctions ] = CurrentToken + 1;
|
|||
|
|
NrJunctions++;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "symbol" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneSheetSymbol( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "wire" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneLine( SavePosition + 2, 1, 0 );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "text" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneText( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "triplePointArc" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneTripleArc( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "port" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOnePort( SavePosition );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "line" ) {
|
|||
|
|
int SavePosition = CurrentToken;
|
|||
|
|
GenerateOneLine( SavePosition, 0, 0 );
|
|||
|
|
CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "bus" ) {
|
|||
|
|
//int SavePosition = CurrentToken;
|
|||
|
|
//GenerateOneBus( SavePosition );
|
|||
|
|
buses[ NrBuses ] = CurrentToken;
|
|||
|
|
NrBuses++;
|
|||
|
|
//CurrentToken = SavePosition;
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "drawBorder" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "EntireDesign" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "isRotated" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "pageSize" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "scaleFactor" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "offset" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "PrintRegion" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "sheetOrderNum" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == "busEntry" ) {
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( DebugMessage ) {
|
|||
|
|
printf( "# GenerateSheets ??????? %s\n", Tokens[ CurrentToken ] );
|
|||
|
|
}
|
|||
|
|
SkipThisItem();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( Tokens[ CurrentToken ] == ")" ) {
|
|||
|
|
for( int j = 0; j < NrJunctions; j++ ) {
|
|||
|
|
int CurrentToken = junctions[ j ];
|
|||
|
|
|
|||
|
|
int junctionPt = FindToken( CurrentToken, "pt" );
|
|||
|
|
|
|||
|
|
if( junctionPt >= 0 ) {
|
|||
|
|
string xCoordPattern = "";
|
|||
|
|
string yCoordPattern = "";
|
|||
|
|
|
|||
|
|
xCoordPattern = Tokens[ junctionPt + 1 ];
|
|||
|
|
|
|||
|
|
if( IsASCIIValue( Tokens[ junctionPt + 2 ] ) ) {
|
|||
|
|
xCoordPattern = xCoordPattern + Tokens[ junctionPt + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ junctionPt + 3 ] != ")" ) {
|
|||
|
|
yCoordPattern = Tokens[ junctionPt + 3 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ junctionPt + 4 ] != ")" ) {
|
|||
|
|
yCoordPattern = yCoordPattern + Tokens[ junctionPt + 4 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "#warning: wront point description.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
yCoordPattern = Tokens[ junctionPt + 2 ];
|
|||
|
|
|
|||
|
|
if( Tokens[ junctionPt + 3 ] != ")" ) {
|
|||
|
|
yCoordPattern = yCoordPattern + Tokens[ junctionPt + 3 ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string Val1 = ConvertUnits( GetNumberValue( xCoordPattern ),
|
|||
|
|
GetUnitValue( xCoordPattern ) );
|
|||
|
|
string Val2 = ConvertUnits( GetNumberValue( yCoordPattern ),
|
|||
|
|
GetUnitValue( yCoordPattern ) );
|
|||
|
|
|
|||
|
|
printf( "JUNCTION (%s %s);\n", Val1, Val2 );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
WriteLog( "# warning: no junction position.\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("CHANGE SIZE %s;\n", LabelTextHeight );
|
|||
|
|
|
|||
|
|
for( int k = 0; k < NrLabels; k++ ) {
|
|||
|
|
string mirrored = "";
|
|||
|
|
|
|||
|
|
if( IsLabelFlipped[ k ] ) {
|
|||
|
|
mirrored = "M";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printf("LABEL %sR%s (%s %s) (%s %s);\n", mirrored, LabelRotation[ k ],
|
|||
|
|
XCoordLabels[ k ],
|
|||
|
|
YCoordLabels[ k ],
|
|||
|
|
XCoordLabels[ k ],
|
|||
|
|
YCoordLabels[ k ] );
|
|||
|
|
|
|||
|
|
// Generate wires to fill gaps in ports
|
|||
|
|
|
|||
|
|
real xLabelCoord = strtod( XCoordLabels[ k ] );
|
|||
|
|
real yLabelCoord = strtod( YCoordLabels[ k ] );
|
|||
|
|
|
|||
|
|
int toLeft = ( TypeLabels[ k ] == "LeftAngle_Sgl_Horz" ) ||
|
|||
|
|
( TypeLabels[ k ] == "LeftAngle_Dbl_Horz" ) ||
|
|||
|
|
( TypeLabels[ k ] == "BothAngle_Dbl_Horz" );
|
|||
|
|
int toRight = ( TypeLabels[ k ] == "RightAngle_Sgl_Horz" ) ||
|
|||
|
|
( TypeLabels[ k ] == "RightAngle_Dbl_Horz" ) ||
|
|||
|
|
( TypeLabels[ k ] == "BothAngle_Dbl_Horz" );
|
|||
|
|
|
|||
|
|
if( IsLabelFlipped[ k ] ) {
|
|||
|
|
int tmp = toLeft;
|
|||
|
|
toLeft = toRight;
|
|||
|
|
toRight = tmp;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( 1 /*toRight*/ ) {
|
|||
|
|
for( int l = 0; l < NrWiresPoint; l++ ) {
|
|||
|
|
int right = 1000000;
|
|||
|
|
int index = -1;
|
|||
|
|
|
|||
|
|
if( ( yLabelCoord == WiresPointY[ l ] ) && ( WiresNet[ l ] == NetNameRef[ k ] ) ) {
|
|||
|
|
if( xLabelCoord < WiresPointX[ l ] ) {
|
|||
|
|
if( right > WiresPointX[ l ] ) {
|
|||
|
|
right = WiresPointX[ l ];
|
|||
|
|
index = l;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( index >= 0 ) {
|
|||
|
|
printf("NET '%s' (%s %s) (%f %f);\n", NetNameRef[ k ], XCoordLabels[ k ], YCoordLabels[ k ],
|
|||
|
|
WiresPointX[ index ], WiresPointY[ index ] );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
//printf( "#info: wires point %s %s to the right not found.\n", XCoordLabels[ k ], YCoordLabels[ k ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( 1 /*toLeft*/ ) {
|
|||
|
|
for( int l = 0; l < NrWiresPoint; l++ ) {
|
|||
|
|
int left = -1000000;
|
|||
|
|
int index = -1;
|
|||
|
|
|
|||
|
|
if( ( yLabelCoord == WiresPointY[ l ] ) && ( WiresNet[ l ] == NetNameRef[ k ] ) ) {
|
|||
|
|
if( xLabelCoord > WiresPointX[ l ] ) {
|
|||
|
|
if( left < WiresPointX[ l ] ) {
|
|||
|
|
left = WiresPointX[ l ];
|
|||
|
|
index = l;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( index >= 0 ) {
|
|||
|
|
printf("NET '%s' (%s %s) (%f %f);\n", NetNameRef[ k ], XCoordLabels[ k ], YCoordLabels[ k ],
|
|||
|
|
WiresPointX[ index ], WiresPointY[ index ] );
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
//printf( "#info: wires point %s %s to the left not found.\n", XCoordLabels[ k ], YCoordLabels[ k ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for( int l = 0; l < NrBuses; l++ ) {
|
|||
|
|
int busToken = buses[ l ];
|
|||
|
|
|
|||
|
|
GenerateOneBus( busToken );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CurrentToken++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GenerateSchematic( void )
|
|||
|
|
{
|
|||
|
|
GenerateSchematicHeader();
|
|||
|
|
|
|||
|
|
GenerateSheets();
|
|||
|
|
|
|||
|
|
printf("WINDOW FIT;\n");
|
|||
|
|
printf("SET CONFIRM OFF;\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This function generate script based on parsed data.
|
|||
|
|
// If processed seccesfully returns 0,
|
|||
|
|
// otherwise returns 1
|
|||
|
|
|
|||
|
|
int GenerateScript( void )
|
|||
|
|
{
|
|||
|
|
output(SCRIPTfileName, "wt") {
|
|||
|
|
GenerateLibrary();
|
|||
|
|
|
|||
|
|
if( PCBDesignToken ) {
|
|||
|
|
GeneratePCB();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( SchematicDesignToken ) {
|
|||
|
|
GenerateSchematic();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int Cntelayer = 0;
|
|||
|
|
string EagleLayerName[];
|
|||
|
|
int EagleLayerNum[];
|
|||
|
|
|
|||
|
|
string SaveRefLayerDef[];
|
|||
|
|
string SaveRefLayerNum[];
|
|||
|
|
string SaveRefLayerType[];
|
|||
|
|
string SavePcadEagleLayerRefName[];
|
|||
|
|
string SavePcadEagleLayerRefNum[];
|
|||
|
|
|
|||
|
|
string PrevRefLayerDef[];
|
|||
|
|
string PrevRefLayerNum[];
|
|||
|
|
string PrevRefLayerType[];
|
|||
|
|
string PrevPcadEagleLayerRefName[];
|
|||
|
|
string PrevPcadEagleLayerRefNum[];
|
|||
|
|
|
|||
|
|
string PrevShowRefLayer[];
|
|||
|
|
|
|||
|
|
int UpdateRefLayers( void )
|
|||
|
|
{
|
|||
|
|
int selref = 0;
|
|||
|
|
|
|||
|
|
for( int i = 0; i < LayerDefsNumber; i++ ) {
|
|||
|
|
string pcadLayerStrNum;
|
|||
|
|
|
|||
|
|
sprintf( pcadLayerStrNum, "%d", LayersCode[ i ] );
|
|||
|
|
|
|||
|
|
int eagleFromPcadLayerNum = strtol( ConvertLayer( pcadLayerStrNum ) );
|
|||
|
|
|
|||
|
|
int found = 0;
|
|||
|
|
|
|||
|
|
for( int j = 0; j < Cntelayer; j++ ) {
|
|||
|
|
if( eagleFromPcadLayerNum == EagleLayerNum[ j ] ) {
|
|||
|
|
SaveRefLayerType[ i ] = LayersType[ i ];
|
|||
|
|
SaveRefLayerDef[ i ] = LayersName[ i ];
|
|||
|
|
SaveRefLayerNum[ i ] = pcadLayerStrNum;
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "%d", EagleLayerNum[ j ] );
|
|||
|
|
SavePcadEagleLayerRefNum[ i ] = tmp;
|
|||
|
|
SavePcadEagleLayerRefName[ i ] = EagleLayerName[ j ];
|
|||
|
|
|
|||
|
|
selref++;
|
|||
|
|
|
|||
|
|
found = 1;
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( !found ) {
|
|||
|
|
sprintf( ShowRefLayer[selref], "%s\t%s\t%s\t%s\t%s",
|
|||
|
|
RefLayerType[ i ],
|
|||
|
|
RefLayerDef[ i ],
|
|||
|
|
RefLayerNum[ i ],
|
|||
|
|
0,
|
|||
|
|
"unknown" );
|
|||
|
|
|
|||
|
|
selref++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for( i = 0; i < selref; i++ ) {
|
|||
|
|
RefLayerType[ i ] = SaveRefLayerType[ i ];
|
|||
|
|
RefLayerDef[ i ] = SaveRefLayerDef[ i ];
|
|||
|
|
RefLayerNum[ i ] = SaveRefLayerNum[ i ];
|
|||
|
|
PcadEagleLayerRefNum[ i ] = SavePcadEagleLayerRefNum[ i ];
|
|||
|
|
PcadEagleLayerRefName[ i ] = SavePcadEagleLayerRefName[ i ];
|
|||
|
|
|
|||
|
|
sprintf( ShowRefLayer[ i ], "%s\t%s\t%s\t%s\t%s",
|
|||
|
|
SaveRefLayerType[ i ],
|
|||
|
|
SaveRefLayerDef[ i ],
|
|||
|
|
SaveRefLayerNum[ i ],
|
|||
|
|
SavePcadEagleLayerRefNum[ i ],
|
|||
|
|
SavePcadEagleLayerRefName[ i ] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
RefLayerType[ selref ] = "";
|
|||
|
|
RefLayerDef[ selref ] = "";
|
|||
|
|
RefLayerNum[ selref ] = "";
|
|||
|
|
PcadEagleLayerRefNum[ selref ] = "";
|
|||
|
|
PcadEagleLayerRefName[ selref ] = "";
|
|||
|
|
|
|||
|
|
CntlayerDef = selref;
|
|||
|
|
|
|||
|
|
return( selref );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ProcessLayersMap( void )
|
|||
|
|
{
|
|||
|
|
if( schematic ) {
|
|||
|
|
schematic(S) {
|
|||
|
|
S.layers(L) {
|
|||
|
|
EagleLayerName[Cntelayer] = L.name;
|
|||
|
|
EagleLayerNum[Cntelayer] = L.number;
|
|||
|
|
Cntelayer++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if( board ) {
|
|||
|
|
board(B) {
|
|||
|
|
B.layers(L) {
|
|||
|
|
EagleLayerName[Cntelayer] = L.name;
|
|||
|
|
EagleLayerNum[Cntelayer] = L.number;
|
|||
|
|
Cntelayer++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int selPCAD = LayerDefsNumber;
|
|||
|
|
int selUlay = LayerDefsNumber;
|
|||
|
|
int selEAGLE = Cntelayer;
|
|||
|
|
|
|||
|
|
int selref = 0;
|
|||
|
|
|
|||
|
|
for( int i = 0; i < CntlayerDef; i++ ) {
|
|||
|
|
PrevRefLayerType[ i ] = RefLayerType[ i ];
|
|||
|
|
PrevRefLayerDef[ i ] = RefLayerDef[ i ];
|
|||
|
|
PrevRefLayerNum[ i ] = RefLayerNum[ i ];
|
|||
|
|
PrevPcadEagleLayerRefNum[ i ] = PcadEagleLayerRefNum[ i ];
|
|||
|
|
PrevPcadEagleLayerRefName[ i ] = PcadEagleLayerRefName[ i ];
|
|||
|
|
|
|||
|
|
sprintf( PrevShowRefLayer[ i ], "%s\t%s\t%s\t%s\t%s",
|
|||
|
|
RefLayerType[ i ],
|
|||
|
|
RefLayerDef[ i ],
|
|||
|
|
RefLayerNum[ i ],
|
|||
|
|
PcadEagleLayerRefNum[ i ],
|
|||
|
|
SavePcadEagleLayerRefName[ i ] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
dlgDialog(TR("ACCEL - EAGLE layer mapping")) {
|
|||
|
|
|
|||
|
|
selref = UpdateRefLayers();
|
|||
|
|
|
|||
|
|
dlgHBoxLayout {
|
|||
|
|
dlgVBoxLayout dlgSpacing(350);
|
|||
|
|
|
|||
|
|
dlgVBoxLayout {
|
|||
|
|
dlgLabel("ACCEL\nLayer\n--->>");
|
|||
|
|
dlgListBox( LayersName, selPCAD );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
dlgVBoxLayout {
|
|||
|
|
dlgLabel("EAGLE\nLayer\n<<---");
|
|||
|
|
dlgListBox( PcadEagleLayerRefName, selUlay );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
dlgVBoxLayout {
|
|||
|
|
dlgLabel("EAGLE\nLayer\n");
|
|||
|
|
dlgListBox( EagleLayerName, selEAGLE ) {
|
|||
|
|
// set Reference layer name
|
|||
|
|
PcadEagleLayerRefName[selPCAD] = EagleLayerName[selEAGLE];
|
|||
|
|
|
|||
|
|
// set Reference layer number
|
|||
|
|
string tmp;
|
|||
|
|
sprintf( tmp, "%d", EagleLayerNum[selEAGLE] );
|
|||
|
|
PcadEagleLayerRefNum[selPCAD] = tmp;
|
|||
|
|
|
|||
|
|
sprintf( ShowRefLayer[ selPCAD ], "%s\t%s\t%s\t%s\t%s",
|
|||
|
|
RefLayerType[ selPCAD ],
|
|||
|
|
RefLayerDef[ selPCAD ],
|
|||
|
|
RefLayerNum[ selPCAD ],
|
|||
|
|
PcadEagleLayerRefNum[ selPCAD ],
|
|||
|
|
PcadEagleLayerRefName[ selPCAD ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
dlgSpacing(10);
|
|||
|
|
|
|||
|
|
dlgVBoxLayout {
|
|||
|
|
dlgLabel(TR("Mapping:"));
|
|||
|
|
dlgListView(TR("ACCEL\nType\tACCEL\nLayer\tACCEL\nNumber\tEAGLE\nNumber\tEAGLE\nName"), ShowRefLayer, selref );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
dlgHBoxLayout {
|
|||
|
|
dlgStretch(1);
|
|||
|
|
dlgPushButton("&" + TR("Load")) { LoadCrossRef(""); selref = UpdateRefLayers(); }
|
|||
|
|
dlgPushButton("&" + TR("Save")) SaveCrossRef();
|
|||
|
|
dlgPushButton("+OK")
|
|||
|
|
dlgAccept();
|
|||
|
|
|
|||
|
|
dlgPushButton("-" + TR("Cancel")) {
|
|||
|
|
for( int i = 0; i < CntlayerDef; i++ ) {
|
|||
|
|
RefLayerType[ i ] = PrevRefLayerType[ i ];
|
|||
|
|
RefLayerDef[ i ] = PrevRefLayerDef[ i ];
|
|||
|
|
RefLayerNum[ i ] = PrevRefLayerNum[ i ];
|
|||
|
|
PcadEagleLayerRefNum[ i ] = PrevPcadEagleLayerRefNum[ i ];
|
|||
|
|
PcadEagleLayerRefName[ i ] = PrevPcadEagleLayerRefName[ i ];
|
|||
|
|
ShowRefLayer[ i ] = PrevShowRefLayer[ i ];
|
|||
|
|
}
|
|||
|
|
dlgReject();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void OutputWarningsLogFile( void )
|
|||
|
|
{
|
|||
|
|
string fullLog = "";
|
|||
|
|
|
|||
|
|
WarningsLogFileName = PCADfileName + ".err";
|
|||
|
|
|
|||
|
|
sprintf( fullLog, "Number of messages = %d\n\n", NrLogLines );
|
|||
|
|
|
|||
|
|
for( int n = 0; n < NrLogLines; n++ ) {
|
|||
|
|
fullLog = fullLog + LogLines[ n ];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
output( WarningsLogFileName, "wt" ) {
|
|||
|
|
printf("%s", fullLog );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( !BatchMode ) {
|
|||
|
|
if( NrLogLines ) {
|
|||
|
|
dlgDialog( TR( "Warnings log" ) ) {
|
|||
|
|
dlgHBoxLayout dlgSpacing (400);
|
|||
|
|
|
|||
|
|
dlgHBoxLayout {
|
|||
|
|
dlgVBoxLayout dlgSpacing (300);
|
|||
|
|
dlgTextView ( fullLog );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
dlgHBoxLayout {
|
|||
|
|
dlgStretch( 1 );
|
|||
|
|
dlgPushButton( TR("-Back")) dlgReject ();
|
|||
|
|
dlgStretch(1);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ChangeDRU( void )
|
|||
|
|
{
|
|||
|
|
string drufile = path_dru[ 0 ] + "/" + "default.dru";
|
|||
|
|
|
|||
|
|
string f[];
|
|||
|
|
int fcnt = fileglob( f, drufile );
|
|||
|
|
|
|||
|
|
if( fcnt ) {
|
|||
|
|
string DRUvalues[];
|
|||
|
|
|
|||
|
|
int DRUlcnt = fileread( DRUvalues, drufile );
|
|||
|
|
|
|||
|
|
string s[];
|
|||
|
|
int n;
|
|||
|
|
string outputString[];
|
|||
|
|
|
|||
|
|
for( int line = 0; line < DRUlcnt; line++ ) {
|
|||
|
|
n = strsplit( s, DRUvalues[ line ], ' ');
|
|||
|
|
|
|||
|
|
if( s[ 0 ] == "rvPadTop" ) {
|
|||
|
|
outputString[ line ] = "rvPadTop = 0";
|
|||
|
|
} else if( s[ 0 ] == "rvPadInner" ) {
|
|||
|
|
outputString[ line ] = "rvPadInner = 0";
|
|||
|
|
} else if( s[ 0 ] == "rvPadBottom" ) {
|
|||
|
|
outputString[ line ] = "rvPadBottom = 0";
|
|||
|
|
} else if( s[ 0 ] == "rvViaOuter" ) {
|
|||
|
|
outputString[ line ] = "rvViaOuter = 0";
|
|||
|
|
} else if( s[ 0 ] == "rvViaInner" ) {
|
|||
|
|
outputString[ line ] = "rvViaInner = 0";
|
|||
|
|
} else if( s[ 0 ] == "rvMicroViaOuter" ) {
|
|||
|
|
outputString[ line ] = "rvMicroViaOuter = 0";
|
|||
|
|
} else if( s[ 0 ] == "rvMicroViaInner" ) {
|
|||
|
|
outputString[ line ] = "rvMicroViaInner = 0";
|
|||
|
|
} else if( s[ 0 ] == "rlMinPadTop" ) {
|
|||
|
|
outputString[ line ] = "rlMinPadTop = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMaxPadTop" ) {
|
|||
|
|
outputString[ line ] = "rlMaxPadTop = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMinPadInner" ) {
|
|||
|
|
outputString[ line ] = "rlMinPadInner = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMaxPadInner" ) {
|
|||
|
|
outputString[ line ] = "rlMaxPadInner = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMinPadBottom" ) {
|
|||
|
|
outputString[ line ] = "rlMinPadBottom = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMaxPadBottom" ) {
|
|||
|
|
outputString[ line ] = "rlMaxPadBottom = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMinViaOuter" ) {
|
|||
|
|
outputString[ line ] = "rlMinViaOuter = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMaxViaOuter" ) {
|
|||
|
|
outputString[ line ] = "rlMaxViaOuter = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMinViaInner" ) {
|
|||
|
|
outputString[ line ] = "rlMinViaInner = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMaxViaInner" ) {
|
|||
|
|
outputString[ line ] = "rlMaxViaInner = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMinMicroViaOuter" ) {
|
|||
|
|
outputString[ line ] = "rlMinMicroViaOuter = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMaxMicroViaOuter" ) {
|
|||
|
|
outputString[ line ] = "rlMaxMicroViaOuter = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMinMicroViaInner" ) {
|
|||
|
|
outputString[ line ] = "rlMinMicroViaInner = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "rlMaxMicroViaInner" ) {
|
|||
|
|
outputString[ line ] = "rlMaxMicroViaInner = 0mil";
|
|||
|
|
} else if( s[ 0 ] == "srRoundness" ) {
|
|||
|
|
outputString[ line ] = "srRoundness = 0.0";
|
|||
|
|
} else if( s[ 0 ] == "srMinRoundness" ) {
|
|||
|
|
outputString[ line ] = "srMinRoundness = 0mil";
|
|||
|
|
} else {
|
|||
|
|
outputString[ line ] = DRUvalues[ line ];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
output( DRUFileName, "wt") {
|
|||
|
|
for( int line = 0; line < DRUlcnt; line++ ) {
|
|||
|
|
printf("%s\n", outputString[ line ] );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox(TR("Can't open default.dru !"), "OK");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// This is the main parsing procedure
|
|||
|
|
// This procedure do the following:
|
|||
|
|
//
|
|||
|
|
// 1. Merge all lines to one string and
|
|||
|
|
// remove all comments (comments may be added by inserting
|
|||
|
|
// a semicolon; the comment continues from the semicolon
|
|||
|
|
// to the end of the line.
|
|||
|
|
// 2. Split merged string to array of tokens
|
|||
|
|
// 3. Parse tree
|
|||
|
|
// 4. Generate script
|
|||
|
|
|
|||
|
|
int Parsing( void )
|
|||
|
|
{
|
|||
|
|
string a[];
|
|||
|
|
|
|||
|
|
int fileExist = fileglob( a, PCADfileName );
|
|||
|
|
|
|||
|
|
if( !fileExist ) {
|
|||
|
|
dlgMessageBox( TR("File ") + PCADfileName + TR(" doesn't exist!"), "OK" );
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DebugMessage = 1;
|
|||
|
|
MergedString = "";
|
|||
|
|
TokensNumber = 0;
|
|||
|
|
|
|||
|
|
MergeLines();
|
|||
|
|
|
|||
|
|
SplitToTokens();
|
|||
|
|
|
|||
|
|
if( ParseTree() ) {
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( PCBDesignToken ) {
|
|||
|
|
DRUFileName = filesetext( PCADfileName, ".dru" );
|
|||
|
|
|
|||
|
|
ChangeDRU();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string CrossfileName = PCADfileName + ".lmp";
|
|||
|
|
string f[];
|
|||
|
|
int crossfileExist = fileglob(f, CrossfileName);
|
|||
|
|
if( crossfileExist ) LoadCrossRef(CrossfileName);
|
|||
|
|
|
|||
|
|
if( IfUpdateLayersMap ) {
|
|||
|
|
ProcessLayersMap();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( GenerateScript() ) {
|
|||
|
|
return( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
OutputWarningsLogFile();
|
|||
|
|
|
|||
|
|
return( 0 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// *********** Show and creat Reference ****************
|
|||
|
|
int Execute(string fname) {
|
|||
|
|
// APL make parsing
|
|||
|
|
Parsing();
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ***** Main *****
|
|||
|
|
void main( void )
|
|||
|
|
{
|
|||
|
|
// Keep help here for it's too big to stuff into dictionary.
|
|||
|
|
string help[] = {
|
|||
|
|
"<b>General</b><br>"
|
|||
|
|
"ACCEL ASCII is also known as TangoPRO ASCII or P-CAD ASCII. "
|
|||
|
|
"It can be exported from <b>P-CAD</b>, <b>Altium Designer</b> and <b>PROTEL</b> and therefore allows conversion of "
|
|||
|
|
"designs in these formats to EAGLE. From Altium Designer only boards can be exported to this format.<br>"
|
|||
|
|
"The conversion to EAGLE works following:<br>"
|
|||
|
|
"First, in the directory of the input file, an EAGLE library with same name is generated. "
|
|||
|
|
"It contains the devices that are used. With this an EAGLE schematic or board with same name is generated. <br>"
|
|||
|
|
"For ACCEL ASCII schematic files partly end with \".sch\", EAGLE schematics get ending \".eagle.sch\". "
|
|||
|
|
"The conversion of a schematic without board doesn't make much sense because the package information is "
|
|||
|
|
"missing which is necessary for creation of a board.<br>"
|
|||
|
|
"Because of different data models and powerfulness of the foreign systems and EAGLE the conversion has limits. "
|
|||
|
|
"Ideally certain cases should already be avoided in the original data. "
|
|||
|
|
"Otherwise certain post processing steps may be necessary. In any case we recommend to perform a DRC after "
|
|||
|
|
"import in order to find and eliminate potential weaknesses of the design. "
|
|||
|
|
"<p>"
|
|||
|
|
"<b>Layer assignment</b><br>"
|
|||
|
|
"Depending on the source system, signal, solder and other layer types have different names. "
|
|||
|
|
"For conversion a default assignment is used which may not always be correct. "
|
|||
|
|
"For this case you can change this individually with the option \"Adjust layer mapping\"."
|
|||
|
|
"<p>"
|
|||
|
|
"<b>Conversion details:</b><br>"
|
|||
|
|
"<ul><li><i>Names: </i><br>"
|
|||
|
|
"To follow EAGLE's naming conventions for different types of entities certain characters are replaced "
|
|||
|
|
"by '_', in particular '(', ')', '[', ']', ''' and space. '\\\\' is replaced by '/'. " // 4 backslashes here ? Insane. Seems to be a bug in EAGLE.
|
|||
|
|
"Control characters like '\\\\r' are not processed in a special way.</li>"
|
|||
|
|
"<li><i>Texts:</i><br>"
|
|||
|
|
"All texts are converted to vectorfont in EAGLE. This allows a system independent "
|
|||
|
|
"representation for polygon calculation and CAM processing. The font can be changed to fixed or "
|
|||
|
|
"proportional where needed. All other text properties are taken over from ACCEL ASCII.</li>"
|
|||
|
|
"<li><i>Pads and SMDs: </i><br>"
|
|||
|
|
"For pad and SMD types following conversion agreement is used:<br>"
|
|||
|
|
"Square pad/SMD -> SQUARE pad/SMD,<br>"
|
|||
|
|
"Rectangle pad -> SQUARE pad with additional rectangle polygon,<br>"
|
|||
|
|
"Oval pad -> LONG pad in EAGLE (size and shape of original and converted pads are slightly "
|
|||
|
|
"different in this case),<br>"
|
|||
|
|
"Ellipse pad -> ROUND pad with additional approximation polygon consisting of four arcs,<br>"
|
|||
|
|
"Polygon pad -> SQUARE pad with additional polygon,<br>"
|
|||
|
|
"Round rectangle pad -> SQUARE pad and additional polygon with rounded corners,<br>"
|
|||
|
|
"Target pad -> ROUND pad,<br>"
|
|||
|
|
"Rectangle SMD -> rectangle SMD,<br>"
|
|||
|
|
"Oval SMD -> SMD with 100% roundness,<br>"
|
|||
|
|
"Ellipse SMD -> round SMD with additional approximation polygon consisting of four arcs,<br>"
|
|||
|
|
"Polygon SMD -> square SMD with additional polygon,<br>"
|
|||
|
|
"Round rectangle -> SMD with 25% roundness,<br>"
|
|||
|
|
"Target SMD -> SMD with 100% roundness.</li>"
|
|||
|
|
"<li><i>Standalone pads (Free pads): </i><br>"
|
|||
|
|
"For standalone pads an appropriate library package is created in EAGLE.</li>"
|
|||
|
|
"<li><i>Vias:</i><br>"
|
|||
|
|
"Vias are converted the following way to EAGLE:<br>"
|
|||
|
|
"Oval -> ROUND, Rectangle -> SQUARE, Ellipse -> ROUND, Round rectangle -> SQUARE and Target -> ROUND.<br>"
|
|||
|
|
"The sizes of the EAGLE vias are adjusted to fit within the shape of the ACCEL vias to avoid clearance issues.</li>"
|
|||
|
|
"<li><i>Contacts / Routing: </i><br>"
|
|||
|
|
"In EAGLE coordinates of traces, pads, vias etc. have to match exactly in order to be properly routed. "
|
|||
|
|
"Otherwise airwires are generated. In some other systems certain deviations are allowed."
|
|||
|
|
"In other systems it's possible that a longer trace crosses a pad without connecting point. "
|
|||
|
|
"In EAGLE this leads to an airwire to the next connecting point. In this case the trace needs to be splitted with "
|
|||
|
|
"SPLIT command in order to create an additional connecting point at the pad position. </li>"
|
|||
|
|
"<li><i>Copper polygons general: </i><br>"
|
|||
|
|
"In EAGLE there's only one type for hatched polygons (horizontal and vertical stripes)."
|
|||
|
|
"The different possible hatch types in ACCEL ASCII like diagonal style for example, are all "
|
|||
|
|
"converted to this.<br>"
|
|||
|
|
"Thermals within polygons are also always horizontal and vertical. There's no specific thermal spoke width "
|
|||
|
|
"for each polygon, but a general value in the EAGLE design rules.<br>"
|
|||
|
|
"The removal of orphan property is converted to EAGLE but without threshold value (only on/off).</li>"
|
|||
|
|
"<li><i>Copper polygons in poured state: </i><br>"
|
|||
|
|
"In EAGLE polygons are saved always in unpoured state. The pour state is calculated dynamically "
|
|||
|
|
"by RATSNEST and depends on the parameters currently set.</li>"
|
|||
|
|
"<li><i>Dimensions: </i><br>"
|
|||
|
|
"As the data model for dimensions in EAGLE is much simpler than in ACCEL ASCII some details are not mapped to EAGLE.</li>"
|
|||
|
|
"<li><i>Labels:</i><br>"
|
|||
|
|
"Input, output and bidirectional labels are all converted to Xref labels in EAGLE.</li>"
|
|||
|
|
"<li><i>Attributes for layers: </i><br>"
|
|||
|
|
"In EAGLE layers can't have attributes. This is skipped.</li>"
|
|||
|
|
"<li><i>'zones' (in ACCEL schematic): </i><br>"
|
|||
|
|
"'zones' are not supported and skipped.</li>"
|
|||
|
|
"</ul>"
|
|||
|
|
,
|
|||
|
|
"<b>Allgemeines</b><br>"
|
|||
|
|
"ACCEL ASCII ist auch unter dem Namen TangoPRO ASCII, oder P-CAD ASCII bekannt. "
|
|||
|
|
"Es kann von <b>P-CAD</b>, <b>Altium Designer</b> und <b>PROTEL</b> aus exportiert werden und ermöglicht so die "
|
|||
|
|
"Konvertierung von Designs in diesen Formaten in EAGLE-Format. Von Altium Designer aus können nur <br>"
|
|||
|
|
"Boards in dieses Format exportiert werden. Für die Konvertierung in EAGLE ist Folgendes zu beachten:<br>"
|
|||
|
|
"Zunächst wird im Verzeichnis der Inputdatei eine EAGLE-Bibliothek gleichen Namens generiert, "
|
|||
|
|
"die die verwendeten Bauteile enthält. Damit wird dann der gleichnamige EAGLE-Schaltplan oder das Board erstellt. "
|
|||
|
|
"Da ACCEL-ASCII-Schaltpläne wie EAGLE teilweise die Endung \".sch\" haben, erhalten die EAGLE-Schaltpläne "
|
|||
|
|
"die Endung \".eagle.sch\". "
|
|||
|
|
"Die Konvertierung eines Schaltplans alleine macht wenig Sinn, da die Package-Information fehlt, "
|
|||
|
|
"die für die Generierung eines Boards erforderlich wäre. "
|
|||
|
|
"Aufgrund der verschiedenen Datenmodelle und der Mächtigkeit der Fremdsysteme und EAGLE sind der Konvertierung "
|
|||
|
|
"Grenzen gesetzt. Idealerweise sollten bestimmte Fälle in den Originaldaten bereits vermieden werden. "
|
|||
|
|
"Ansonsten sind gewisse Nachbearbeitungsschritte erforderlich. In jedem Fall sollten Sie nach dem Import einen "
|
|||
|
|
"DRC durchführen, um eventuelle Schachstellen des Designs zu finden und zu beseitigen."
|
|||
|
|
"<p>"
|
|||
|
|
"<b>Zuordnung der Layer</b><br>"
|
|||
|
|
"Je nach Herkunftssystem haben die Signal- Beschriftungs- und sonstigen Layerarten verschiedene Namen. "
|
|||
|
|
"Für die Konvertierung wird eine gewisse Standard-Zuordnung angenommen, die jedoch nicht immer richtig sein muss. "
|
|||
|
|
"Für diesen Fall können Sie über die Option \"Manuelle Layer-Zuordnung\" dies individuell einstellen."
|
|||
|
|
"<p>"
|
|||
|
|
"<b>Details zur Konvertierung:</b><br>"
|
|||
|
|
"<ul><li><i>Namen: </i><br>"
|
|||
|
|
"Um EAGLE's Namenskonventionen für verschiedene Objekttypen zu entsprechen, werden verschiedene Zeichen "
|
|||
|
|
"durch '_' ersetzt, insbesondere '(', ')', '[', ']', ''' und Leerzeichen. '\\\\' wird ersetzt durch '/'. "
|
|||
|
|
"Kontrollzeichen wie '\\\\r' werden nicht speziell behandelt.</li>"
|
|||
|
|
"<li><i>Texte:</i><br>"
|
|||
|
|
"Alle Texte werden in Vektorfont konvertiert. Dies ermöglicht eine systemunabhängige "
|
|||
|
|
"Darstellung für das Polygon-Freirechnen und die CAM-Verarbeitung. Die Schriftart kann auf Fixed oder "
|
|||
|
|
"Proportional geändert werden wo nötig. Alle anderen Texteigenschaften werden aus ACCEL ASCII übernommen."
|
|||
|
|
"<li><i>Pads und SMDs: </i><br>"
|
|||
|
|
"Für Pads und SMDs werden folgende Konvertierungsregeln verwendet:<br>"
|
|||
|
|
"Square Pad/SMD -> SQUARE Pad/SMD,<br>"
|
|||
|
|
"Rectangle Pad -> SQUARE Pad mit umgebendem rechteckigem Polygon,<br>"
|
|||
|
|
"Oval Pad -> LONG Pad (Größe und Form weichen leicht voneinander ab),<br>"
|
|||
|
|
"Ellipse Pad -> ROUND Pad mit umgebendem Approximation-Polygon aus 4 Kreisbögen,<br>"
|
|||
|
|
"Polygon Pad -> SQUARE Pad mit umgebendem Polygon,<br>"
|
|||
|
|
"Round rectangle Pad -> SQUARE Pad mit umgebendem Polygon mit Verrundungen,<br>"
|
|||
|
|
"Target Pad -> ROUND Pad,<br>"
|
|||
|
|
"Rectangle SMD -> rechteckiges SMD,<br>"
|
|||
|
|
"Oval SMD -> SMD mit 100% Roundness,<br>"
|
|||
|
|
"Ellipse SMD -> rundes SMD mit umgebendem Approximation-Polygon aus 4 Kreisbögen,<br>"
|
|||
|
|
"Polygon SMD -> quadratisches SMD with umgebendem Polygon,<br>"
|
|||
|
|
"Round rectangle -> SMD with 25% Roundness,<br>"
|
|||
|
|
"Target SMD -> SMD with 100% Roundness.</li>"
|
|||
|
|
"<li><i>Standalone-Pads (Freie Pads): </i><br>"
|
|||
|
|
"Für Standalone-Pads wird ein entsprechendes Package in EAGLE erzeugt und verwendet.</li>"
|
|||
|
|
"<li><i>Vias:</i><br>"
|
|||
|
|
"Vias werden folgendermaßen zu EAGLE konvertiert:<br>"
|
|||
|
|
"Oval -> ROUND, Rectangle -> SQUARE, Ellipse -> ROUND, Round rectangle -> SQUARE and Target -> ROUND.<br>"
|
|||
|
|
"Die Größen der EAGLE-Vias werden so gesetzt, dass sie in die Form der ACCEL-Vias hineinpassen, um Abstände einzuhalten.</li>"
|
|||
|
|
"<li><i>Kontaktierung / Routen: </i><br>"
|
|||
|
|
"In EAGLE müssen die Koordinaten von Leiterbahnen, Pads, Vias etc. exakt aufeinander treffen, um als richtig geroutet "
|
|||
|
|
"zu gelten, sonst entstehen Luftlinien. In manchen anderen Systemen sind gewisse Abweichungen zulässig. "
|
|||
|
|
"Es kann in anderen Systemen vorkommen, daß eine längere Leiterbahn über einen Pad gelegt ist ohne einen Absetzpunkt. "
|
|||
|
|
"Das erzeugt in EAGLE eine Luftlinie bis zum nächsten Absetzpunkt. In diesem Fall muß mit SPLIT die Leiterbahn gesplittet "
|
|||
|
|
"werden, um einen zusätzlichen Absetzpunkt an der Pad-Position zu erzeugen.</li>"
|
|||
|
|
"<li><i>Kupfer-Polygone allgemein: </i><br>"
|
|||
|
|
"In EAGLE gibt es nur einen Typ für schraffierte Polygone (horizontale und vertikale Streifen). "
|
|||
|
|
"Die verschiedenen möglichen Schraffiertypen in ACCEL ASCII wie z.B. diagonale Schraffur werden alle "
|
|||
|
|
"dazu konvertiert.<br>"
|
|||
|
|
"Thermalstege in den Polygonen verlaufen immer horizontal und vertikal. Es gibt keine spezifische "
|
|||
|
|
"Thermalbreite für jedes Polygon, aber einen allgemeinen Wert in den Designregeln.<br>"
|
|||
|
|
"Die Orphan-Eigenschaft wird nach EAGLE konvertiert aber ohne Schwellwert (nur Orphans behalten/nicht behalten).</li>"
|
|||
|
|
"<li><i>Kupfer-Polygone in freigerechnetem Zustand: </i><br>"
|
|||
|
|
"In EAGLE werden Polygone immer im Definitions-Zustand gespeichert (nicht freigerechnet). Das Freirechnen erfolgt "
|
|||
|
|
"dynamisch durch RATSNEST und hängt von den aktuellen Parametern ab.</li>"
|
|||
|
|
"<li><i>Bemaßungen: </i><br>"
|
|||
|
|
"Da das Datenmodell für Bemaßungen in EAGLE wesentlich einfacher ist als in ACCEL ASCII, werden einige Details "
|
|||
|
|
"nicht in EAGLE abgebildet.</li>"
|
|||
|
|
"<li><i>Labels:</i><br>"
|
|||
|
|
"Input- Output- und bidirektionale Labels werden alle in Xref-Labels in EAGLE konvertiert.</li>"
|
|||
|
|
"<li><i>Attributes für Layer: </i><br>"
|
|||
|
|
"In EAGLE können Layer keine Attribute haben. Dies wird weggelassen.</li>"
|
|||
|
|
"<li><i>'zones' (in ACCEL-Schaltplänen): </i><br>"
|
|||
|
|
"'zones' werden nicht unterstützt und daher weggelassen.</li>"
|
|||
|
|
"</ul>"
|
|||
|
|
,
|
|||
|
|
"<b>Общие замечания</b><br>"
|
|||
|
|
"ACCEL ASCII также известен как TangoPRO ASCII или P-CAD ASCII. "
|
|||
|
|
"Он может быть экспортирован из <b>Altium Designer</b>, <b>P-CAD</b> и <b>PROTEL</b>. "
|
|||
|
|
"Трансляция в EAGLE работает следующим образом:<br>"
|
|||
|
|
"В начале, в каталоге входного файла, создаётся библиотека EAGLE с тем же именем. "
|
|||
|
|
"Она содержит компоненты, которые будут использованы в дальнейшем. Затем создаётся файл EAGLE с тем же именем, содержащий схему или топологию. <br>"
|
|||
|
|
"Для ACCEL ASCII файла схемы \".sch\", создаётся файл EAGLE \".eagle.sch\". "
|
|||
|
|
"Преобразование схемы без платы не имеет смысла, так как отсутствует информация,"
|
|||
|
|
"необходимая для создания платы."
|
|||
|
|
"<p>"
|
|||
|
|
"<b>Присвоение значений слоям</b><br>"
|
|||
|
|
"В зависимости от исходной системы, типы сигналов, припой и другие слои имеют разные названия. "
|
|||
|
|
"Соответствие слоёв, заданное по умолчанию, может быть изменено. "
|
|||
|
|
"Для этого воспользуйтесь опцией \"Настройка соответствия слоёв\"."
|
|||
|
|
"<p>"
|
|||
|
|
"<b>Различия и ограничения, возникающие при преобразовании</b><br>"
|
|||
|
|
"В связи с различными моделями данных и систем, преобразование имеет ограничения. "
|
|||
|
|
"В идеале некоторые конфигурации следует избегать в исходных данных. "
|
|||
|
|
"В противном случае потребуется постобработка. Это включает в себя, в частности: "
|
|||
|
|
"<ul><li><i>Имена: </i><br>"
|
|||
|
|
"Следуя соглашениям о именах в EAGLE следующие символы будут преобразованы "
|
|||
|
|
"в '_': '(', ')', '[', ']', ''' и пробел. '\\\\' заменяется на '/'. " // 4 backslashes here ? Insane. Seems to be a bug in EAGLE.
|
|||
|
|
"Управляющие символы, такие как '\\\\r' в строках не обрабатываются.</li>"
|
|||
|
|
"<li><i>Текстовые строки:</i><br>"
|
|||
|
|
"Все текстовые строки преобразуются в векторный шрифт в EAGLE. Это даёт возможность "
|
|||
|
|
"представить текст и использовать его для CAM обработки. Шрифт может быть изменен на фиксированный или "
|
|||
|
|
"пропорциональный где это необходимо. Все остальные свойства шрифта сохраняются из ACCEL ASCII.</li>"
|
|||
|
|
"<li><i>Pad и SMD: </i><br>"
|
|||
|
|
"Pad и SMD преобразуются следующим образом:<br>"
|
|||
|
|
"Square pad/SMD -> SQUARE pad/SMD,<br>"
|
|||
|
|
"Rectangle pad -> SQUARE pad с дополнительным прямоугольным полигоном,<br>"
|
|||
|
|
"Oval pad -> LONG pad в EAGLE (размер и форма отличаются в этом случае),"
|
|||
|
|
"<br>"
|
|||
|
|
"Ellipse pad -> ROUND pad с дополнительным полигоном, аппроксимированным четыремя дугам,<br>"
|
|||
|
|
"Polygon pad -> SQUARE pad с дополнительным полигоном,<br>"
|
|||
|
|
"Round rectangle pad -> SQUARE pad с дополнительным полигоном с закругленными углами,<br>"
|
|||
|
|
"Target pad -> ROUND pad,<br>"
|
|||
|
|
"Rectangle SMD -> прямоугольный SMD,<br>"
|
|||
|
|
"Oval SMD -> SMD с 100% закругленностью,<br>"
|
|||
|
|
"Ellipse SMD -> ROUND SMD с дополнительным полигоном, аппроксимированным четыремя дугами,<br>"
|
|||
|
|
"Polygon SMD -> SQUARE SMD с дополнительным полигоном,<br>"
|
|||
|
|
"Round rectangle -> SMD с 25% закругленностью,<br>"
|
|||
|
|
"Target SMD -> SMD с 100% закругленностью.</li>"
|
|||
|
|
"<li><i>Одиночные контактные площадки: </i><br>"
|
|||
|
|
"Для автономных контактных площадок в EAGLE создаются соответствующие библиотечные элементы.</li>"
|
|||
|
|
"<li><i>Переходы:</i><br>"
|
|||
|
|
"Переходы преобразуются следующим образом:<br>"
|
|||
|
|
"Oval -> ROUND, Rectangle -> SQUARE, Ellipse -> ROUND, Round rectangle -> SQUARE and Target -> ROUND.<br>"
|
|||
|
|
"Размер перехода в EAGLE подбирается таким образом, чтобы исключить нарушение минимального технологического допуска.</li>"
|
|||
|
|
"<li><i>Контакты / трассировка: </i><br>"
|
|||
|
|
"В EAGLE координаты проводов, контактных площадок, переходов и т.д. должны в точности совпадать с тем, чтобы быть правильно соединенными. "
|
|||
|
|
"В противном случае создаются неподключенные соединения. В некоторых других системах допускаются отклонения.</li>"
|
|||
|
|
"В других системах допускается если провод пересекает контактную площадку без подключения. "
|
|||
|
|
"В EAGLE это приводит к созданию airwire к следующей точке цепи. В этом случае соединение должно быть разделено с помощью команды SPLIT "
|
|||
|
|
"чтобы создать дополнительные соединительные точки. </li>"
|
|||
|
|
"<li><i>Преобразование заливки: </i><br>"
|
|||
|
|
"В EAGLE есть только один тип заливки (горизонтальных и вертикальных полос штриховки). "
|
|||
|
|
"Различные возможные типы заливки в ACCEL ASCII, как, например, диагональный стиль, "
|
|||
|
|
"преобразуется в этот. <br>"
|
|||
|
|
"Thermals в пределах полигона также всегда горизонтальные и вертикальные. Там нет конкретных тепловых ширин "
|
|||
|
|
"для каждого полигона. Это значение задано в общих настройках EAGLE. <br>"
|
|||
|
|
"Удаление одиночных полигонов также преобразуется в EAGLE, но без порогового значения (только вкл / выкл). </ Li>"
|
|||
|
|
"<li><i>>Преобразование полигонов заливки: </i><br>"
|
|||
|
|
"В EAGLE полигоны заливки всегда сохраняются в незалитом состоянии. Состояние заливки всегда вычисляется динамически "
|
|||
|
|
"с помощью RATSNEST и зависит от текущих установленных параметров.</li>"
|
|||
|
|
"<li><i>Линейки: </i><br>"
|
|||
|
|
"Поскольку модель данных в EAGLE существенно проще, чем в ACCEL ASCII некоторые детали линеек не преобразуются в EAGLE.</li>"
|
|||
|
|
"<li><i>Знаки подключения:</i><br>"
|
|||
|
|
"Входные, выходные и двунаправленные знаки подключения преобразуются в знак Xref в EAGLE.</li>"
|
|||
|
|
"<li><i>Атрибуты слоёв: </i><br>"
|
|||
|
|
"В EAGLE атрибуты слоёв не преобразуются.</li>"
|
|||
|
|
"<li><i>'зоны' (в ACCEL принципиальной схеме): </i><br>"
|
|||
|
|
"'зоны' в принципиальной схеме не преобразуются</li>"
|
|||
|
|
"</ul>"
|
|||
|
|
"В любом случае мы рекомендуем выполнить DRC после импорта для того, чтобы найти и устранить потенциальные проблемы."
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
BatchMode = 0;
|
|||
|
|
|
|||
|
|
if( argc > 1 ) {
|
|||
|
|
BatchMode = 1;
|
|||
|
|
|
|||
|
|
PCADfileName = argv[ 1 ];
|
|||
|
|
|
|||
|
|
Lines = fileread( PcadLines, PCADfileName );
|
|||
|
|
|
|||
|
|
if (Lines == -1) exit(-7113);
|
|||
|
|
|
|||
|
|
SCRIPTfileName = filesetext(PCADfileName, ".scr");
|
|||
|
|
|
|||
|
|
if( Parsing() ) {
|
|||
|
|
exit( 1 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( PCBDesignToken ) {
|
|||
|
|
exit ("SCRIPT '" + SCRIPTfileName + "'; RATSNEST; WRITE;");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
exit ("SCRIPT '" + SCRIPTfileName +"' WRITE;");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SchematicWindow = 0;
|
|||
|
|
BoardWindow = 0;
|
|||
|
|
|
|||
|
|
if (schematic) {
|
|||
|
|
schematic(S) {
|
|||
|
|
SchematicWindow = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (board) {
|
|||
|
|
board(B) {
|
|||
|
|
BoardWindow = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
dlgMessageBox(TR("Please start from board or schematic editor !"), "OK");
|
|||
|
|
exit(0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
string fname = "";
|
|||
|
|
int nowstart = 0;
|
|||
|
|
dlgDialog(TR("Import P-CAD/Altium/Protel (ACCEL ASCII)")) {
|
|||
|
|
dlgLabel(usage);
|
|||
|
|
// www: Remove this when integrated into EAGLE
|
|||
|
|
//dlgLabel("Version " + Version);
|
|||
|
|
dlgLabel(Status, 1);
|
|||
|
|
dlgHBoxLayout {
|
|||
|
|
dlgLabel(TR("Import file:"));
|
|||
|
|
dlgStringEdit(fname);
|
|||
|
|
dlgPushButton(TR("&Browse") + "...") {
|
|||
|
|
fname = GetFile(fname);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
dlgHBoxLayout {
|
|||
|
|
dlgCheckBox(TR("Adjust layer mapping"), IfUpdateLayersMap );
|
|||
|
|
dlgStretch(1);
|
|||
|
|
dlgPushButton("-" + TR("Help") + "...")
|
|||
|
|
dlgDialog(TR("Import P-CAD/Altium/Protel (ACCEL ASCII)") + " - " + TR("Help")) {
|
|||
|
|
dlgHBoxLayout dlgSpacing(900);
|
|||
|
|
|
|||
|
|
dlgHBoxLayout {
|
|||
|
|
dlgVBoxLayout dlgSpacing (500);
|
|||
|
|
dlgTextView( help[LangIdx] );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//dlgLabel(help[LangIdx]);
|
|||
|
|
|
|||
|
|
dlgHBoxLayout {
|
|||
|
|
dlgStretch(1);
|
|||
|
|
dlgPushButton("+" + TR("OK"))
|
|||
|
|
dlgAccept();
|
|||
|
|
dlgStretch(1);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
dlgPushButton("+" + TR("Start")) {
|
|||
|
|
nowstart = Execute(fname);
|
|||
|
|
if (nowstart == 1) dlgAccept();
|
|||
|
|
}
|
|||
|
|
dlgPushButton("-" + TR("Cancel")) { dlgReject(); exit(-1); }
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
if( PCBDesignToken )
|
|||
|
|
exit ("SCRIPT '" + SCRIPTfileName + "'; RATSNEST");
|
|||
|
|
exit ("SCRIPT '" + SCRIPTfileName +"';");
|
|||
|
|
}
|
|||
|
|
|