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

📄 lib2dxddlg.cpp

📁 该软件为EDA行业所用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	partFileBuf+="	..Slots \n";
	for(heteroNum=1;heteroNum<=numHeteros;heteroNum++)
	{
		if(symbolDef.numParts==1)
		{
			tmpStr.Format("		...Slot_SwapGroup     \x22gate_%d\x22\n",heteroNum);
			partFileBuf+=tmpStr;
			for(compPinNum=0;compPinNum<numCompPins;compPinNum++)
			{
				if((compDef.compPinCA.GetAt(compPinNum).partNum==heteroNum)&&
					(compDef.compPinCA.GetAt(compPinNum).pinDes!=""))
				{
					tmpStr.Format("			....PinNumber     \x22%s\x22\n",
						compDef.compPinCA.GetAt(compPinNum).pinDes);
					partFileBuf+=tmpStr;
					
				}
			}
		}
		else
		{
			int partNum,numParts;
			numParts=symbolDef.numParts;
			for(partNum=0;partNum<numParts;partNum++)
			{
				partFileBuf+="		...Slot_SwapGroup     \x22gate_1\x22\n";
				for(compPinNum=0;compPinNum<numCompPins;compPinNum++)
				{
					if((compDef.compPinCA.GetAt(compPinNum).partNum==partNum+1)&&
						(compDef.compPinCA.GetAt(compPinNum).pinDes!=""))
					{
						tmpStr.Format("			....PinNumber     \x22%s\x22\n",
							compDef.compPinCA.GetAt(compPinNum).pinDes);
						partFileBuf+=tmpStr;
						
					}
				}
			}//for
		}//if

	}
	//====================== ..Slots of PowerPin ==============//
	if(numPowerPins!=0)
	{
		tmpStr.Format("		...Slot_SwapGroup     \x22gate_%d\x22\n",heteroNum);
		partFileBuf+=tmpStr;
		for(powerPinNum=0;powerPinNum<numPowerPins;powerPinNum++)
		{
			if(partDef.powerCA.GetAt(powerPinNum).pinDes!="")
			{
				tmpStr.Format("			....PinNumber     \x22%s\x22\n",
					partDef.powerCA.GetAt(powerPinNum).pinDes);
				partFileBuf+=tmpStr;
			}
			else
				;
		}

	}

	//===================== ..Slots of supply ==================//
	if(numSupply!=0)
	{
		for(supplyNum=0;supplyNum<numSupply;supplyNum++)
		{
			tmpStr.Format("		...Slot_SwapGroup \x22%s\x22\n",
				partDef.supplyCA.GetAt(supplyNum).pinName);
			partFileBuf+=tmpStr;
			tmpStr.Format("			....PinNumber     \x22%s\x22\n",
				partDef.supplyCA.GetAt(supplyNum).pinDes);
			partFileBuf+=tmpStr;
		}
	}
	//============== ..Slots of "No Connect" =========//
	if(partDef.NCPinDesCA.GetSize()!=0)
	{
		for(int NCPinNum=0;NCPinNum<partDef.NCPinDesCA.GetSize();NCPinNum++)
		{
			partFileBuf+="		...Slot_SwapGroup \x22No Connect\x22\n";
			tmpStr.Format("			....PinNumber     \x22%s\x22\n",
				partDef.NCPinDesCA.GetAt(NCPinNum));
			partFileBuf+=tmpStr;
		}
		partDef.NCPinDesCA.RemoveAll();
		compDef.maxPadNum=0;
		partDef.numPads=0;
	}

	#undef partFileBuf
}


//====================
void CLIB2DXDDlg::CreatPartFile(void)
{
	CFileFind findFile;
	CTime fileTime,sysTime;
	time_t intervalTime;	
	CString	fileName;
	Uint	fileLength;
	bool	isCreatNewFile=false;
	tmpStr=partDef.partFileName;
	if(tmpStr!="")
	{
		tmpStr=tmpStr.Left(tmpStr.ReverseFind('\\')+1);
		if(tmpStr!=partDef.partFilePath)
			partDef.numPartFiles=0;
	}	
	if(partDef.numPartFiles==0)
		fileName=partDef.partFilePath+partDef.partName+".txt" ;
	else
	{
		tmpStr.Format("%d",partDef.numPartFiles);
		fileName=partDef.partFilePath+partDef.partName+'_'+tmpStr+".txt";
	}
	//==================== an old parts file exist ========//
	if(findFile.FindFile(fileName))
	{
		findFile.FindNextFile();
		findFile.GetLastWriteTime(fileTime);
		fileLength=findFile.GetLength();
		sysTime=CTime::GetCurrentTime();
		intervalTime=sysTime.GetTime()-fileTime.GetTime();
		if(intervalTime>100)											//an old file exist but a new file is needed
			isCreatNewFile=true;
		else if(fileLength>100000)										//creat another partsFile when the is larger
		{
			isCreatNewFile=true;
			partDef.numPartFiles++;
			tmpStr.Format("%d",partDef.numPartFiles);
			fileName=partDef.partFilePath+partDef.partName+'_'+tmpStr+".txt";
		}
	}//if(isOpen)
	else
		isCreatNewFile=true;
	//=========================== Creat a new partFile =============//
	if(isCreatNewFile)
	{
		CStdioFile partFp;
		partFp.Open(fileName,CFile::modeCreate|CFile::modeWrite);
		tmpStr=".Filetype ASCII_PDB\n.Version \x22";   //x22 --""
		tmpStr+="02.00\x22\n.Units th\n.Notation Si\n\n";
		partFp.Write(tmpStr,tmpStr.GetLength());
		partFp.Close();
	}
	partDef.partFileName=fileName;										//return filename		
}



//============== Get SymbolDef ========================//
bool CLIB2DXDDlg::CreatTmpSymbol(void)
{
	FILE *tmpSymbolFp;
	float valueX,valueY;
	//========= get symbolName ========================//
	symbolDef.xMax=-6553567890;
	symbolDef.yMax=-6553567890;
	symbolDef.xMin=6553567890;
	symbolDef.yMin=6553567890;
	//Initiate poly
	poly.numPoints=0;
	strGet(Word,QUOTATION,QUOTATION);	
	tmpStr=Word;
	if(tmpStr.Right(2)=="_N")
		tmpStr=tmpStr.Left(tmpStr.GetLength()-2);
	tmpStr=removeInvalid(tmpStr);
	symbolDef.symbolName=tmpStr;
	symbolDef.symbolFileName=symbolDef.symbolPathName+symbolDef.symbolName+".~1";
	tmpSymbolFp=fopen(symbolDef.symbolFileName,"w");
	parameterGet(LBRACKET,RBRACKET);			//get oringinName;
	while(true)
	{
		bufOffset=SeekBracket(bufOffset);
		if (*bufOffset==RBRACKET)
			break;
		else
		{
			symbolDef.thisKeyWord="";
			parameterGet(LBRACKET,RBRACKET);			
			if(symbolDef.thisKeyWord=="arc")					//angle[0]-startAngle angle[1]-endAngle angle[2]-biAngle
			{
				symbolDef.arcCA.Add(arc);
				arc.x[0]=symbolDef.x;
				arc.y[0]=symbolDef.y;
				for(char i=0;i<3;i++)
				{
					arc.angle[i]=arc.angle[i]*Pi/180;
					valueX=arc.radius*cos(arc.angle[i]);
					arc.x[i+1]=valueX+arc.x[0];
					valueY=arc.radius*sin(arc.angle[i]);
					arc.y[i+1]=valueY+arc.y[0];
					symbolDef.xMin=min(symbolDef.xMin,arc.x[i+1]);
					symbolDef.yMin=min(symbolDef.yMin,arc.y[i+1]);
					symbolDef.xMax=max(symbolDef.xMax,arc.x[i+1]);
					symbolDef.yMax=max(symbolDef.yMax,arc.y[i+1]);
					
				}
				fprintf(tmpSymbolFp,"a %5.0f %5.0f %5.0f %5.0f %5.0f %5.0f\n",arc.x[2],arc.y[2],arc.x[3],arc.y[3],arc.x[1],arc.y[1]);
				fprintf(tmpSymbolFp,"Q 10 0 0\n");
			}
			else if(symbolDef.thisKeyWord=="attr")
			{
				attribute.attrContent.Remove(' ');
				attribute.attrContent.Remove('\\');
				attribute.attrContent.Remove('\x2f');		// "\"
				if((attribute.attrName=="RefDes"||
					attribute.attrContent==""  ||
					attribute.attrContent.Find('{')||
					attribute.attrContent.Find('}')||
					attribute.attrContent.Find(' ')||
					attribute.attrName=="Part Field")==0)
					fprintf(tmpSymbolFp,"U %1.0f %1.0f 10 0 3 0 %s=%s\n",symbolDef.x,symbolDef.y,attribute.attrName,attribute.attrContent);
				if(attribute.attrName=="Class")
				{
					symbolDef.desc=attribute.attrContent;
					symbolDef.symbolClass=attribute.attrContent;
				}
				else if(attribute.attrName=="SubClass")
					symbolDef.desc+=attribute.attrContent;
				else if(attribute.attrName=="Manufacturer")
					symbolDef.manufacture=attribute.attrContent;
			}
			else if(symbolDef.thisKeyWord=="line")
			{
				symbolDef.xMin=min(symbolDef.xMin,line.x[0]);
				symbolDef.xMin=min(symbolDef.xMin,line.x[1]);
				symbolDef.yMin=min(symbolDef.yMin,line.y[0]);
				symbolDef.yMin=min(symbolDef.yMin,line.y[1]);
				symbolDef.xMax=max(symbolDef.xMax,line.x[0]);
				symbolDef.xMax=max(symbolDef.xMax,line.x[1]);
				symbolDef.yMax=max(symbolDef.yMax,line.y[0]);
				symbolDef.yMax=max(symbolDef.yMax,line.y[1]);
				symbolDef.lineCA.Add(line);
				fprintf(tmpSymbolFp,"l 2 %1.0f %1.0f %1.0f %1.0f\n",line.x[0],line.y[0],line.x[1],line.y[1]);
				fprintf(tmpSymbolFp,"Q 10 0 0\n");
			}
			else if(symbolDef.thisKeyWord=="pin")
			{
				pinDispose();
				symbolDef.pinCA.Add(pin);
				fprintf(tmpSymbolFp,"P %d %1.0f %1.0f %1.0f %1.0f 0 %d %d\n",
					pin.pinNum,pin.x[0],pin.y[0],pin.x[1],pin.y[1],pin.location,pin.isInvert);		//Pin
				pin.isInvert=false;												//reset isInvert bit
				fprintf(tmpSymbolFp,"A %1.0f %1.0f 5 %d %d 0 PINTYPE=\n",
					pin.x[1],pin.y[1],pin.rotation,pin.pinTypeAlign);
				if(pin.pinDes!="")
					fprintf(tmpSymbolFp,"A %1.0f %1.0f 5 %d %d 3 #=\n",
					pin.x[0],pin.y[0],pin.rotation,pin.pinDesAlign);		//pinDes
				else
					fprintf(tmpSymbolFp,"pinDes=null\n");
				if(pin.pinName!="")											//pinName
					fprintf(tmpSymbolFp,"L %1.0f %1.0f 5 %d %d 0 %d %d %s\n",
					pin.x[1],pin.y[1],pin.rotation,pin.pinNameAlign,pin.dispPinName,pin.isFlipped,pin.pinName);	//pinName 数值化
				else
					fprintf(tmpSymbolFp,"pinName=null\n");

			}
			else if(symbolDef.thisKeyWord=="poly")
			{
				poly.numPoints=poly.xCA.GetSize();
				fprintf(tmpSymbolFp,"l %d",poly.numPoints+1);
				for(int polyLoop=0;polyLoop<poly.numPoints;polyLoop++)
				{
					float polyX,polyY;
					polyX=poly.xCA.GetAt(polyLoop);
					polyY=poly.yCA.GetAt(polyLoop);
					symbolDef.xMin=min(symbolDef.xMin,polyX);
					symbolDef.yMin=min(symbolDef.yMin,polyY);
					symbolDef.xMax=max(symbolDef.xMax,polyX);
					symbolDef.yMax=max(symbolDef.yMax,polyY);
					fprintf(tmpSymbolFp,"%4.0f %4.0f ",polyX,polyY);
				}
				fprintf(tmpSymbolFp,"%4.0f %4.0f ",poly.xCA.GetAt(0),poly.yCA.GetAt(0));	
				fprintf(tmpSymbolFp,"\nQ 10 0 0\n");
				poly.xCA.RemoveAll();
				poly.yCA.RemoveAll();
			}
			else if(symbolDef.thisKeyWord=="text")
			{
				if(symbolText.textContent!="" && symbolDef.rotation<4)
					fprintf(tmpSymbolFp,"U %4.0f %4.0f 5 %d 1 3 TEXT=%s\n",
					symbolDef.x+5,symbolDef.y+5,symbolDef.rotation,symbolText.textContent);
			}				
		}
	}
	fprintf(tmpSymbolFp,"D %4.0f %4.0f %4.0f %4.0f\n",					//draw retangle 
		symbolDef.xMin,symbolDef.yMin,symbolDef.xMax,symbolDef.yMax);
	fprintf(tmpSymbolFp,"E\n");				//完成一个symbol/Part,关闭文件
	fprintf(tmpSymbolFp,"%1.0f\n",symbolDef.xMin);						//keep max value imformation
	fprintf(tmpSymbolFp,"%1.0f\n",symbolDef.xMax);
	fprintf(tmpSymbolFp,"%1.0f\n",symbolDef.yMin);
	fprintf(tmpSymbolFp,"%1.0f\n",symbolDef.yMax);
	if(symbolDef.desc!="")
		fprintf(tmpSymbolFp,"%s\n",symbolDef.desc);
	fclose(tmpSymbolFp);
	symbolDef.arcCA.RemoveAll();
	symbolDef.attrCA.RemoveAll();
	symbolDef.pinCA.RemoveAll();
	symbolDef.lineCA.RemoveAll();
	return true;
}


//================= Get pin imformation ===================//
void CLIB2DXDDlg:: pinDispose(void)
{
	pin.x[1]=symbolDef.x;
	pin.y[1]=symbolDef.y;
	pin.pinTypeAlign=3;
	if((pin.pinLength>20)||pin.pinLength<0)
		pin.pinLength=20;
	else
		pin.pinLength/=10;
	if(pin.pinName=="" && pin.pinDes!="")
		pin.pinName=pin.pinDes;
	switch(symbolDef.rotation)
	{
		case 0:									//0度,位于右侧
            pin.x[0]=pin.x[1]+pin.pinLength;
			pin.y[0]=pin.y[1];
			pin.location=3;
			pin.pinDesAlign=LOWERRIGHT;	
			pin.pinNameAlign=MIDDLERIGHT;
			break;
		case 1:									//90度,位于上侧
            pin.x[0]=pin.x[1];
			pin.y[0]=pin.y[1]+pin.pinLength;
			pin.location=0;
			pin.pinDesAlign=UPPERRIGHT;					//upper right
			pin.pinNameAlign=MIDDLERIGHT;
			break;
		case 2:									//180度,位于左侧
            pin.x[0]=pin.x[1]-pin.pinLength;
			pin.y[0]=pin.y[1];
			pin.location=2;
			pin.pinDesAlign=LOWERLEFT;					//lower left
			pin.pinNameAlign=MIDDLELEFT;
			break;
		case 3:									//270度,位于下侧
            pin.x[0]=pin.x[1];
			pin.y[0]=pin.y[1]-pin.pinLength;
			pin.location=1;
			pin.pinDesAlign=LOWERRIGHT;					//lower right
			pin.pinNameAlign=MIDDLERIGHT;
			break;
	}
	symbolDef.xMin=min(symbolDef.xMin,pin.x[0]);
	symbolDef.xMin=min(symbolDef.xMin,pin.x[1]);
	symbolDef.yMin=min(symbolDef.yMin,pin.y[0]);
	symbolDef.yMin=min(symbolDef.yMin,pin.y[1]);
	symbolDef.xMax=max(symbolDef.xMax,pin.x[0]);
	symbolDef.xMax=max(symbolDef.xMax,pin.x[1]);
	symbolDef.yMax=max(symbolDef.yMax,pin.y[0]);
	symbolDef.yMax=max(symbolDef.yMax,pin.y[1]);
}

///////////////////////
void CLIB2DXDDlg::GetCompDef(void)
{
	char interSign[]="_",Word[100];
	CString  allPinName;
	int signalNum;
	strGet(Word,QUOTATION,QUOTATION);							//get deviceName
	tmpStr=Word;
	compDef.deviceName=removeInvalid(tmpStr);
	//strcpy(deviceName,Word);
	parameterGet(LBRACKET,RBRACKET);
	parameterGet(LBRACKET,RBRACKET);							//read compHeader
	compDef.maxPadNum=0;
	compDef.allCompPinName="";
	compDef.allCompPinDes="";
	partDef.refDesPrefix=compDef.compHeader.refDesPrefix;
	for(int loopN=0;loopN<compDef.compHeader.numPins;loopN++)	//read compin imformation
	{
		//================ Get compPin imformation =============//
		parameterGet(LBRACKET,RBRACKET);						
		//================ dispose the condit

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -