⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib2dxddlg.cpp

📁 该软件为EDA行业所用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 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 + -