📄 lib2dxddlg.cpp
字号:
// LIB2DXDDlg.cpp : implementation file
//
#include "stdafx.h"
#include "LIB2DXD.h"
#include "LIB2DXDDlg.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "common.h"
#include "BackAnnt.h"
#include "SearchTree.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// CMyDialog my;
CBackAnnt *BackDlg;
char *FileBuf;
//int Counter=0;
LPTSTR bufOffset;
////////////////////Varible for pinOp//////////////////
////////////////////////For Transform////////////////////
COMPDEF compDef;
SYMBOLDEF symbolDef; //symbol imfomation was saved in symbolDef
PARTDEF partDef;
ARC arc;
PIN pin;
LINE line;
COMPPIN compPin;
ATTACHEDSYMBOL attachedSymbol;
ATTR attribute;
POLY poly;
TEXT symbolText;
ALIASSYMBOL aliasSymbol;
SIGNAL signal;
SCHDEF schDef;
HETERO hetero;
RECTANGLE rectangle;
IEEESYMBOL IEEESymbol;
char Word[76],fileBuffer[20000]; // save the string getted
char year[5],month[3],day[3];
double Pi = 3.1415926535897932;
CString tmpStr;
CFile LIBfp; //File pointer of Protel library file
CFile tmpFp;
FILE *csvFp; //File pointer of Library list file
CStdioFile asciiLIbFp;
//////////////////Transform///////////////////////
void CLIB2DXDDlg::OnTransform()
{
int AddFileListIndex; //operation on AddFileListbox
UINT fileLength;
CString TransformFile;
// TODO: Add your control notification handler code here
char interSign[]="_";
/////////////// 指定列表文件的位置和名称 ////////////////////////
AddFileListIndex=m_AddFileListBox.GetCount();
if (AddFileListIndex== 0)
OnOpen();
AddFileListIndex=m_AddFileListBox.GetCount();
CString logFileName=partDef.partFilePath+"translatelog.log";
CFile logFp;
logFp.Open(logFileName,CFile::modeCreate|CFile::modeWrite);
if(AddFileListIndex==0)
return;
do //symbolName,symbolClass,deviceName,pkgType,manufacture,Describtion
{
AddFileListIndex--;
m_AddFileListBox.GetText(AddFileListIndex,TransformFile); //get filename
m_AddFileListBox.DeleteString(AddFileListIndex); //delete the string had been readed
//partDef.partFileName=GetFileName(TransformFile,"txt");
symbolDef.symbolListFileName=GetFileName(TransformFile,"csv");
logFp.Write(TransformFile,TransformFile.GetLength());
attachedSymbol.symbolPathName=partDef.partFilePath;
symbolDef.symbolPathName=partDef.partFilePath;
LIBfp.Open(TransformFile,CFile::modeRead);
fileLength=LIBfp.GetLength();
bufOffset=fileBuffer;
LIBfp.Read(bufOffset,200);
bufOffset[200]='\0';
strncpy(Word,bufOffset,75); //判断文件格式是否正确
Word[74]='\0';
if (strcmp(Word,"Protel for Windows - Schematic Library Editor Ascii File Version 1.2 - 2.0")==0)
{
TransformFile.ReleaseBuffer(); //释放内存
LIBfp.Close();
TranslateAsciiLib(TransformFile);
}
else //LIA file
{
strncpy(Word,bufOffset,11);
Word[11]='\0';
OpenFile(symbolDef.symbolListFileName,true);
TranslateLia();
OpenFile(symbolDef.symbolListFileName,false);
TransformFile.ReleaseBuffer(); //释放内存
LIBfp.Close(); //关闭源库文件
} //对应于 if (strcmp(FileType,"Accel_ASCII")!=0)
tmpStr.Format(" Translate end with success!\0xd\0x0a");
logFp.Write(tmpStr,tmpStr.GetLength());
}while(AddFileListIndex);
//================= show the result of tansform ===========//
CFile Openfp;
CString buffer;
if(Openfp.Open(symbolDef.symbolListFileName,CFile::modeRead)==0)
{
//AfxMessageBox("Error!! Transform is Failure!!");
return;
}
UINT j=Openfp.GetLength();
FileBuf=buffer.GetBuffer(j+1);
Openfp.Read(FileBuf,j) ;
FileBuf[j]='\0';
buffer.ReleaseBuffer();
m_FileContent=_T(FileBuf);
Openfp.Close();
m_OutFile="";
UpdateData(false);
}
////////////////////END OF TRANSFORM/////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// Transform lib to DXD //
////////////////////////////////////////////////////////////////////////////////////
bool CLIB2DXDDlg::TranslateAsciiLib(CString asciiLibFile)
{
bool transformResult=false;
UINT numComponents;
if(asciiLIbFp.Open(asciiLibFile,CFile::modeRead))
{
asciiLIbFp.ReadString(tmpStr);
if(tmpStr!="Protel for Windows - Schematic Library Editor Ascii File Version 1.2 - 2.0")
return false;
//=============== Get orgnanization ==================//
while (1)
{
asciiLIbFp.ReadString(tmpStr);
if(tmpStr.Find("End")!=-1)
break;
}
while (1)
{
asciiLIbFp.ReadString(tmpStr);
if(tmpStr=="EndFont")
break;
}
asciiLIbFp.ReadString(tmpStr);
if(tmpStr.Find("Library")==-1)
return false;
asciiLIbFp.ReadString(tmpStr);
numComponents=atof(tmpStr);
for(UINT componentNum=0;componentNum<numComponents;componentNum++)
{
transformResult=CreatLibSymbol();
// if(!transformResult)
// break;
while(1)
{
asciiLIbFp.ReadString(tmpStr);
if(tmpStr.Left(15)==" EndComponent")
break;
}
}
asciiLIbFp.Close();
//transformResult=true;
}
return true;
}
bool CLIB2DXDDlg::CreatLibSymbol()
{
bool transformResult=false;
//UINT numAliasComponents;
symbolDef.xMax=-6553567890;
symbolDef.yMax=-6553567890;
symbolDef.xMin=6553567890;
symbolDef.yMin=6553567890;
asciiLIbFp.ReadString(tmpStr);
if(tmpStr.Find("Component")==-1)
return false;
//============ Get number of heteros ==========//
asciiLIbFp.ReadString(tmpStr);
partDef.numHeteros=atof(tmpStr);
//============= Get number of aliasSymbols ====//
asciiLIbFp.ReadString(tmpStr);
symbolDef.numAliasSymbols=atof(tmpStr);
asciiLIbFp.ReadString(tmpStr);
//============= Get Description ===============//
asciiLIbFp.ReadString(tmpStr);
partDef.desc=tmpStr;
//============= Get 4 pkgTypes ================//
for(char pkgTypeNum=0;pkgTypeNum<4;pkgTypeNum++)
{
asciiLIbFp.ReadString(tmpStr);
partDef.pkgTypeCA.Add(tmpStr);
}
for(char num=0;num<8;num++)
asciiLIbFp.ReadString(tmpStr);
//============== Get referencdDesign ==========//
asciiLIbFp.ReadString(tmpStr);
tmpStr.Remove(' ');
partDef.refDesPrefix=tmpStr;
asciiLIbFp.ReadString(tmpStr);
//============== Get aliasComponent ==============//
for(UINT aliasComponentNum=0;aliasComponentNum<symbolDef.numAliasSymbols;aliasComponentNum++)
{
asciiLIbFp.ReadString(tmpStr);
tmpStr.Remove(' ');
symbolDef.aliasComponentCA.Add(tmpStr);
}
//=============== symbolName heteroName ===========//
symbolDef.deviceName=symbolDef.aliasComponentCA.GetAt(0);
symbolDef.hetero="";
if(partDef.numHeteros>1)
{
symbolDef.hetero=symbolDef.deviceName+"_1";
for(UINT heteroNum=1;heteroNum<partDef.numHeteros;heteroNum++)
{
symbolDef.hetero+=',';
tmpStr.Format("_%d",heteroNum+1);
symbolDef.hetero+=symbolDef.deviceName+tmpStr;
}
}
//============== Get symbolDef & Creat symbol file ====//
for(UINT heteroNum=0;heteroNum<partDef.numHeteros;heteroNum++)
{
GetLibSymbolDef();
transformResult=CreatLibSymbolFile(heteroNum);
}
partDef.pkgTypeCA.RemoveAll();
symbolDef.aliasComponentCA.RemoveAll();
return true;
}
//================== Creat Lib symbolFile =================================//
bool CLIB2DXDDlg::CreatLibSymbolFile(char heteroNum)
{
CString symbolFileBuf;
CStdioFile libSymbolFp;
tmpStr.Format("V 51\n");
symbolFileBuf=tmpStr;
tmpStr.Format("K 182171569100 %s\n",symbolDef.symbolName);
symbolFileBuf+=tmpStr;
//tmpStr.Format("|R 2:55_%s-%s-04\nY 1\nZ 10\ni 15\n",month,day);
tmpStr="|R 2:55_04-06-04\nY 1\nZ 10\ni 15\n";
symbolFileBuf+=tmpStr;
if(partDef.numHeteros>1)
{
tmpStr.Format("U %4.0f %4.0f 10 0 1 0 HETERO=%s\n",
symbolDef.xMin,symbolDef.yMin-30,symbolDef.hetero);
symbolFileBuf+=tmpStr;
}
//=========================== Creat pin of symbol =======//
for(Uint symbolPinNum=0;symbolPinNum<symbolDef.pinCA.GetSize();symbolPinNum++)
{
#define pinDef symbolDef.pinCA.GetAt(symbolPinNum)
tmpStr.Format("P %d %1.0f %1.0f %1.0f %1.0f 0 %d %d\n",
symbolPinNum+1,pinDef.x[0],pinDef.y[0],pinDef.x[1],pinDef.y[1],pinDef.location,pinDef.isInvert);
symbolFileBuf+=tmpStr;
tmpStr.Format("A %1.0f %1.0f 5 %d %d 0 PINTYPE=%s\n",
pinDef.x[1],pinDef.y[1],pinDef.rotation,pinDef.pinTypeAlign,pinDef.pinType);
symbolFileBuf+=tmpStr;
if(pinDef.pinDes!="")
{
tmpStr.Format("A %1.0f %1.0f 5 %d %d 3 #=%s\n",
pinDef.x[0],pinDef.y[0],pinDef.rotation,pinDef.pinDesAlign,pinDef.pinDes); //pinDes
symbolFileBuf+=tmpStr;
}
if(pinDef.pinName!="") //pinName
{
tmpStr.Format("L %1.0f %1.0f 5 %d %d 0 %d %d %s\n",
pinDef.x[1],pinDef.y[1],pinDef.rotation,pinDef.pinNameAlign,pinDef.dispPinName,pinDef.isFlipped,pinDef.pinName); //pinName 数值化
symbolFileBuf+=tmpStr;
}
#undef pinDef
}
//=======================Creat Rectangle ======================//
for(char rectangleNum=0;rectangleNum<symbolDef.retangleCA.GetSize();rectangleNum++)
{
#define rectangleDef symbolDef.retangleCA.GetAt(rectangleNum)
tmpStr.Format("b %d %d %d %d\n",
rectangleDef.x[0],rectangleDef.y[0],rectangleDef.x[1],rectangleDef.y[1]);
symbolFileBuf+=tmpStr+"Q 10 0 0\n";
#undef rectangleDef
}
//=======================Creat Ellips Arc ====================//
for(char arcNum=0;arcNum<symbolDef.arcCA.GetSize();arcNum++)
{
#define arcDef symbolDef.arcCA.GetAt(arcNum)
tmpStr.Format("a %5.0f %5.0f %5.0f %5.0f %5.0f %5.0f\n",
arcDef.x[2],arcDef.y[2],arcDef.x[3],arcDef.y[3],arcDef.x[1],arcDef.y[1]);
symbolFileBuf+=tmpStr+"Q 10 0 0\n";
#undef arcDef
}
//=======================Creat polyline ====================//
for(char polylineNum=0;polylineNum<symbolDef.polylineStrCA.GetSize();polylineNum++)
{
symbolFileBuf+=symbolDef.polylineStrCA.GetAt(polylineNum);
}
//=======================Creat IEEESymbol Bezier ====================//
for(char loopN=0;loopN<symbolDef.IEEESymbolCA.GetSize();loopN++)
{
symbolFileBuf+=symbolDef.IEEESymbolCA.GetAt(loopN);
}
for(loopN=0;loopN<symbolDef.BezierCA.GetSize();loopN++)
{
symbolFileBuf+=symbolDef.BezierCA.GetAt(loopN);
}
//=======================Creat TEXT====================//
for(char textNum=0;textNum<symbolDef.LableCA.GetSize();textNum++)
{
#define lableDef symbolDef.LableCA.GetAt(textNum)
// tmpStr.Format("U %4.0f %4.0f 5 %d 1 3 TEXT=%s\n",
// tmpStr.Format("U %4.0f %4.0f 5 1 1 3 TEXT=%s\n",
tmpStr.Format("U %4.0f %4.0f 3 2 7 3 TEXT=%s\n",
lableDef.x,lableDef.y,lableDef.textContent);
symbolFileBuf+=tmpStr;
#undef lableDef;
}
//============== End of symbol file =============================//
if(symbolDef.xMax==-6553567890||symbolDef.yMax==-6553567890||
symbolDef.xMin==6553567890||symbolDef.yMin==6553567890)
{
symbolDef.xMax=10;
symbolDef.yMax=10;
symbolDef.xMin=0;
symbolDef.yMin=0;
}
tmpStr.Format("D %4.0f %4.0f %4.0f %4.0f\n",
symbolDef.xMin,symbolDef.yMin,symbolDef.xMax,symbolDef.yMax);
symbolFileBuf+=tmpStr;
symbolFileBuf+="E\n";
//=============== Get symbolFiles Name ======================//
if(partDef.numHeteros!=1)
tmpStr.Format("_%d.1",heteroNum+1);
else
tmpStr=".1";
for(loopN=0;loopN<symbolDef.numAliasSymbols;loopN++)
{
symbolDef.symbolName=symbolDef.aliasComponentCA.GetAt(loopN);
symbolDef.symbolFileName=symbolDef.symbolPathName+symbolDef.symbolName+tmpStr;
symbolFileBuf.Replace(symbolDef.deviceName,symbolDef.symbolName);
symbolDef.deviceName=symbolDef.symbolName;
libSymbolFp.Open(symbolDef.symbolFileName,CFile::modeCreate|CFile::modeWrite);
libSymbolFp.Write(symbolFileBuf,symbolFileBuf.GetLength());
libSymbolFp.Close();
}
/*
symbolDef.symbolName=symbolDef.deviceName;
{
tmpStr.Format();
symbolDef.symbolFileName+=tmpStr;
symbolDef.symbolName+=tmpStr;
}
symbolDef.symbolFileName+=".1";
*/
symbolDef.arcCA.RemoveAll();
symbolDef.pinCA.RemoveAll();
symbolDef.LableCA.RemoveAll();
symbolDef.retangleCA.RemoveAll();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -