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

📄 lib2dxddlg.cpp

📁 该软件为EDA行业所用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	symbolDef.polylineStrCA.RemoveAll();
	symbolDef.IEEESymbolCA.RemoveAll();
	symbolDef.BezierCA.RemoveAll();
	return true;
}
//================== Get lib symbol definiton =============================//
bool CLIB2DXDDlg::GetLibSymbolDef()
{
	bool transformResult=false;
	asciiLIbFp.ReadString(tmpStr);
	if(tmpStr.Find("Part")==-1)
		return false;
	asciiLIbFp.ReadString(tmpStr);
	//Get definition imformation
	while (1)
	{
		asciiLIbFp.ReadString(tmpStr);
		if(tmpStr.Find("EndNormalPart")!=-1)
		{
			while(1)
			{
				asciiLIbFp.ReadString(tmpStr);
				if(tmpStr.Find("      EndIEEEPart")!=-1)
					break;
			}
			break;
		}
		else if(tmpStr.Find("         EllipticalArc ")!=-1)
			GetEllipticalArcDef(tmpStr);
		else if(tmpStr.Find("         Label ")!=-1)
			GetLibLableDef(tmpStr);
		else if(tmpStr.Find("         Line ")!=-1)
			GetLibLineDef(tmpStr);
		else if(tmpStr.Find("         Pin ")!=-1)
			GetLibPinDef(tmpStr);
		else if(tmpStr.Find("         Polyline ")!=-1)
			GetLibPolyDef(tmpStr);
		else if(tmpStr.Find("         Polygon ")!=-1)
			GetLibPolyDef(tmpStr);
		else if(tmpStr.Find("         Rectangle ")!=-1)
			GetLibRectangleDef(tmpStr);
		else if(tmpStr.Find("         Symbol ")!=-1)
			GetIEEESymbolDef(tmpStr);
		else if(tmpStr.Find("         Bezier ")!=-1)
			GetBezierDef(tmpStr);

	}	
	return true;
}
//================== Lib Line dispose ===============//
void CLIB2DXDDlg::GetBezierDef(CString strBezierDef)
{
	//         Bezier  1 16711680 0 5 10 -20 18 -6 26 -20 26 -20 34 -30 
	float value[30];
	CString tmpStr2;
	strBezierDef=strBezierDef.Right(strBezierDef.GetLength()-17);
	for(char loopN=0;loopN<30;loopN++)
	{
		char tmpNum=strBezierDef.Find(' ');
		tmpStr=strBezierDef.Left(tmpNum);
		if(tmpStr==""||tmpStr==' ')
			break;
		value[loopN]=atof(tmpStr);
		strBezierDef=strBezierDef.Right(strBezierDef.GetLength()-tmpNum-1);
	}
	tmpStr="a ";
/*
	for(loopN=0;loopN<int(2*value[3]);loopN++)
	{
		tmpStr2.Format("%4.0f %4.0f ",value[loopN+4],value[loopN+5]);
		tmpStr+=tmpStr2;
		symbolDef.xMin=min(value[loopN+4],symbolDef.xMin);
		symbolDef.yMin=min(symbolDef.yMin,value[loopN+5]);
		symbolDef.xMax=max(symbolDef.xMax,value[loopN+4]);
		symbolDef.yMax=max(symbolDef.yMax,value[loopN+5]);
		loopN++;
	}
	tmpStr+='\n';
*/
	// symbolDef.BezierCA.Add(tmpStr);
}


//================== Lib poly dispose ===============//
void CLIB2DXDDlg::GetLibPolyDef(CString strPolyDef)
{
	//         Polyline  1 0 16711680 0 3 -10 0 -10 -30 0 -30 
	float value[30];
	bool isLine;
	char flagNum,index;
	if(strPolyDef.Find("Polyline")!=-1)
	{
		flagNum=19;
		index=5;
		isLine=true;
	}
	else
	{
		flagNum=18;
		index=6;
		isLine=false;
	}
	strPolyDef=strPolyDef.Right(strPolyDef.GetLength()-flagNum);
	for(char loopN=0;loopN<30;loopN++)
	{
		char tmpNum=strPolyDef.Find(' ');
		tmpStr=strPolyDef.Left(tmpNum);
		if(tmpStr==""||tmpStr==' ')
			break;
		value[loopN]=atof(tmpStr);
		strPolyDef=strPolyDef.Right(strPolyDef.GetLength()-tmpNum-1);
	}
	CString strPoly;
	poly.numPoints=value[index-1];
	if(isLine==false)
		strPoly.Format("l %d ",poly.numPoints+1);
	else
		strPoly.Format("l %d ",poly.numPoints);
	for(loopN=0;loopN<poly.numPoints*2;loopN++)
	{
		float polyX,polyY;
		polyX=value[index+loopN];
		loopN++;
		polyY=value[index+loopN];
		tmpStr.Format("%4.0f %4.0f ",polyX,polyY);
		strPoly+=tmpStr;
		symbolDef.xMin=min(symbolDef.xMin,polyX);
		symbolDef.yMin=min(symbolDef.yMin,polyY);
		symbolDef.xMax=max(symbolDef.xMax,polyX);
		symbolDef.yMax=max(symbolDef.yMax,polyY);
	}
	if(isLine==false)
	{
		tmpStr.Format("%4.0f %4.0f ",value[6],value[7]);
		strPoly+=tmpStr;
		strPoly+="\nQ 10 1 0\n";
	}
	else
		strPoly+="\nQ 10 0 0\n";
	symbolDef.polylineStrCA.Add(strPoly);
}
//================== Lib Line dispose ===============//
void CLIB2DXDDlg::GetLibLineDef(CString strLineDef)
{
	;
}

void CLIB2DXDDlg::CoordinateRotation(char charaNum)
{
	float radius,sweepAngle,startAngle;
	sweepAngle=IEEESymbol.degree;
	for(char loopN=0;loopN<charaNum;loopN++)
		{
			radius=sqrt(IEEESymbol.x[loopN]*IEEESymbol.x[loopN]+IEEESymbol.y[loopN]*IEEESymbol.y[loopN]);
			startAngle=atan(IEEESymbol.y[loopN]/IEEESymbol.x[loopN]);
			if(radius!=0)
			{
				IEEESymbol.x[loopN]=radius*cos(startAngle+sweepAngle)+IEEESymbol.x0;
				IEEESymbol.y[loopN]=radius*sin(startAngle+sweepAngle)+IEEESymbol.y0;
			}
			else
			{
				IEEESymbol.x[loopN]+=IEEESymbol.x0;
				IEEESymbol.y[loopN]+=IEEESymbol.y0;
			}
			symbolDef.xMax=max(IEEESymbol.x[loopN],symbolDef.xMax);
			symbolDef.xMin=min(IEEESymbol.x[loopN],symbolDef.xMin);
			symbolDef.yMax=max(IEEESymbol.y[loopN],symbolDef.yMax);
			symbolDef.yMin=min(IEEESymbol.y[loopN],symbolDef.yMin);
		}
}

//================== Lib EllipticalArcDef dispose ===============//
void CLIB2DXDDlg::GetEllipticalArcDef(CString strArcDef)
{
	//         EllipticalArc  20 -20 10 11 1 116.565 243.435 16711680 0
	float value[7],tmpNum1,tmpNum2,tmpNum3;
	float angle[3],xRadius,yRadius,radius;
	float x,y;
	strArcDef=strArcDef.Right(strArcDef.GetLength()-24);
	for(char loopN=0;loopN<7;loopN++)
	{
		char tmpNum=strArcDef.Find(' ');
		tmpStr=strArcDef.Left(tmpNum);
		value[loopN]=atof(tmpStr);
		strArcDef=strArcDef.Right(strArcDef.GetLength()-tmpNum-1);
	}
	arc.x[0]=value[0];
	arc.y[0]=value[1];
	xRadius=value[2];
	yRadius=value[3];
	angle[0]=value[5];
	angle[1]=value[6];
	if (angle[1]>=angle[0])
		angle[2]=angle[0]+(angle[1]-angle[0])/2;
	else
		angle[2]=angle[0]+(angle[1]+360-angle[0])/2;
	for(loopN=0;loopN<3;loopN++)
	{
		if(xRadius==0 && yRadius==0)
			break;
		angle[loopN]=angle[loopN]*2*Pi/360;
		tmpNum1=xRadius*xRadius*yRadius*yRadius;
		tmpNum2=yRadius*yRadius*cos(angle[loopN])*cos(angle[loopN]);
		tmpNum3=xRadius*xRadius*sin(angle[loopN])*sin(angle[loopN]);
		radius=sqrt(tmpNum1/(tmpNum2+tmpNum3));	
		x=radius*cos(angle[loopN]);
		y=radius*sin(angle[loopN]);
		arc.x[loopN+1]=x+arc.x[0];
		arc.y[loopN+1]=y+arc.y[0];
		symbolDef.xMin=min(symbolDef.xMin,arc.x[loopN+1]);
		symbolDef.xMax=max(symbolDef.xMax,arc.x[loopN+1]);
		symbolDef.yMin=min(symbolDef.yMin,arc.y[loopN+1]);
		symbolDef.yMax=max(symbolDef.yMax,arc.y[loopN+1]);
	}
	symbolDef.arcCA.Add(arc);
}

//================== Lib Lable dispose ===============//
void CLIB2DXDDlg::GetLibLableDef(CString strLableDef)
{
	//         Label  11 -18 0 8388608 2 0 '&';
	strLableDef=strLableDef.Right(strLableDef.GetLength()-16);
	char tmpNum=strLableDef.Find(' ');
	tmpStr=strLableDef.Left(tmpNum);
	symbolText.x=atof(tmpStr);
	strLableDef=strLableDef.Right(strLableDef.GetLength()-tmpNum-1);
	tmpNum=strLableDef.Find(' ');
	tmpStr=strLableDef.Left(tmpNum);
	symbolText.y=atof(tmpStr);
	tmpNum=strLableDef.Find(0x27);
	tmpStr=strLableDef.Right(strLableDef.GetLength()-tmpNum);
	tmpStr.Remove(0x27);
	tmpStr.Remove(' ');
	symbolText.textContent=tmpStr;
	symbolDef.LableCA.Add(symbolText);
	symbolDef.xMax=max(symbolDef.xMax,symbolText.x+10);
	symbolDef.xMin=min(symbolDef.xMin,symbolText.x);
	symbolDef.yMax=max(symbolDef.yMax,symbolText.y+10);
	symbolDef.yMin=min(symbolDef.yMin,symbolText.y);
}
//================== Lib Line dispose ===============//
void CLIB2DXDDlg::GetLibRectangleDef(CString strRectangleDef)
{
	//         Rectangle  0 0 20 10 0 8978557 16773375 0 1
	strRectangleDef=strRectangleDef.Right(strRectangleDef.GetLength()-20);
	char tmpNum;
	tmpNum=strRectangleDef.Find(' ');
	tmpStr=strRectangleDef.Left(tmpNum);
	rectangle.x[0]=atof(tmpStr);
	strRectangleDef=strRectangleDef.Right(strRectangleDef.GetLength()-tmpNum-1);
	tmpNum=strRectangleDef.Find(' ');
	tmpStr=strRectangleDef.Left(tmpNum);
	rectangle.y[0]=atof(tmpStr);
	strRectangleDef=strRectangleDef.Right(strRectangleDef.GetLength()-tmpNum-1);
	tmpNum=strRectangleDef.Find(' ');
	tmpStr=strRectangleDef.Left(tmpNum);
	rectangle.x[1]=atof(tmpStr);
	strRectangleDef=strRectangleDef.Right(strRectangleDef.GetLength()-tmpNum-1);
	tmpStr=strRectangleDef.Left(tmpNum);
	rectangle.y[1]=atof(tmpStr);
	strRectangleDef=strRectangleDef.Right(strRectangleDef.GetLength()-tmpNum-1);
	symbolDef.xMin=min(rectangle.x[0],symbolDef.xMin);
	symbolDef.xMin=min(rectangle.x[1],symbolDef.xMin);
	symbolDef.xMax=max(rectangle.x[0],symbolDef.xMax);
	symbolDef.xMax=max(rectangle.x[1],symbolDef.xMax);
	symbolDef.yMin=min(rectangle.y[0],symbolDef.yMin);
	symbolDef.yMin=min(rectangle.y[1],symbolDef.yMin);
	symbolDef.yMax=max(rectangle.y[0],symbolDef.yMax);
	symbolDef.yMax=max(rectangle.y[1],symbolDef.yMax);
	symbolDef.retangleCA.Add(rectangle);

}

//================== Lib Pin dispose ===============//
void CLIB2DXDDlg::GetLibPinDef(CString strPinDef)
{
	CString strParameter;
	PINDEFP pinDefP;
	strPinDef=strPinDef.Right(tmpStr.GetLength()-14);
	tmpStr=strPinDef;
	tmpStr.Remove(' ');
	pinDefP=PINDEFP(tmpStr.GetBuffer(6));
	pin.isInvert=pinDefP->isInvert-48;
	pin.isClock=pinDefP->isClock-48;
	pin.pinTypeIndex=pinDefP->pinTypeIndex-48;
	JustifyPinType(pin.pinTypeIndex);
	pin.dispPin=pinDefP->dispPin-48;
	if(pin.dispPin==1)
		pin.dispPin=false;
	else
		pin.dispPin=true;
	pin.dispPinName=pinDefP->dispPinName-48;
	pin.dispPinDes=pinDefP->dispPinDes-48;
	//pinLength
	tmpStr=strPinDef.Right(strPinDef.GetLength()-12);//Pin  0 0 7 1 0 1 30 0 -40 3 0 'GND' '7'
	strParameter=tmpStr.Left(tmpStr.Find(' '));
	pin.pinLength=atof(strParameter)*10;
	//x,y of pin
	tmpStr=tmpStr.Right(tmpStr.GetLength()-tmpStr.Find(' ')-1);
	strParameter=tmpStr.Left(tmpStr.Find(' '));
	symbolDef.x=atof(strParameter);
	tmpStr=tmpStr.Right(tmpStr.GetLength()-tmpStr.Find(' ')-1);
	strParameter=tmpStr.Left(tmpStr.Find(' '));
	symbolDef.y=atof(strParameter);
	// rotation of pin
	tmpStr=tmpStr.Right(tmpStr.GetLength()-tmpStr.Find(' ')-1);
	strParameter=tmpStr.Left(tmpStr.Find(' '));
	pin.rotation=atof(strParameter);
	symbolDef.rotation=pin.rotation;
	// color of pin
	tmpStr=tmpStr.Right(tmpStr.GetLength()-tmpStr.Find(' ')-1);
	strParameter=tmpStr.Left(tmpStr.Find(' '));
	// pinName
	tmpStr=tmpStr.Right(tmpStr.GetLength()-tmpStr.Find(' ')-1);
	pin.pinName=tmpStr.Left(tmpStr.Find(' '));
	pin.pinName.Remove(0x27);	//'
	// pinDes
	tmpStr=tmpStr.Right(tmpStr.GetLength()-tmpStr.Find(' ')-1);
	pin.pinDes=tmpStr.Left(tmpStr.Find(' '));
	pin.pinDes.Remove(0x27);
	pinDispose();
	symbolDef.pinCA.Add(pin);

}
//================== Lib IEEE Symbol dispose ===============//
void CLIB2DXDDlg::GetIEEESymbolDef(CString strIEEESymbolDef)
{
	//         Symbol  1 0 0 100 0 1 16711680 0
	IEEESYMBOLP IEEESymbolP;
	float value[8];
	float x[5],y[5],xMin,yMin,xMax,yMax,radius,sweepAngle,startAngle;
	CString tmpStr2;
	char  loopN;
	strIEEESymbolDef=strIEEESymbolDef.Right(strIEEESymbolDef.GetLength()-17);
	for(loopN=0;loopN<7;loopN++)
	{
		char tmpNum=strIEEESymbolDef.Find(' ');
		tmpStr=strIEEESymbolDef.Left(tmpNum);
		value[loopN]=atof(tmpStr);
		strIEEESymbolDef=strIEEESymbolDef.Right(strIEEESymbolDef.GetLength()-tmpNum-1);
	}
	IEEESymbolP=IEEESYMBOLP(value);
	IEEESymbol.degree=IEEESymbolP->degree*Pi/2;
	IEEESymbol.x0=IEEESymbolP->x0;
	IEEESymbol.y0=IEEESymbolP->y0;

	switch(int(IEEESymbolP->symbolNum))
	{
	case 1:		//Dot
		radius=0.3*IEEESymbolP->size;
		tmpStr.Format("c %4.0f %4.0f %4.0f\n",IEEESymbolP->x0,IEEESymbolP->y0,radius);
		symbolDef.IEEESymbolCA.Add(tmpStr);
		xMin=IEEESymbolP->x0-radius;
		xMax=IEEESymbolP->x0+radius;
		yMin=IEEESymbolP->y0-radius;
		yMax=IEEESymbolP->y0+radius;
		symbolDef.xMax=max(symbolDef.xMax,xMax);
		symbolDef.xMin=min(symbolDef.xMin,xMin);
		symbolDef.yMax=max(symbolDef.yMax,yMax);
		symbolDef.yMin=min(symbolDef.yMin,yMin);
		break;
	case 2:		//left or right
		IEEESymbol.x[0]=0;
		IEEESymbol.y[0]=0.4*IEEESymbolP->size;
		IEEESymbol.x[1]=1.2*IEEESymbolP->size;
		IEEESymbol.y[1]=0.8*IEEESymbolP->size;
		IEEESymbol.x[2]=1.2*IEEESymbolP->size;
		IEEESymbol.y[2]=0;
		sweepAngle=IEEESymbolP->degree*Pi/2;
		symbolDef.IEEESymbolCA.Add(tmpStr);
		CoordinateRotation(3);
		tmpStr.Format("l 3 %4.0f %4.0f %4.0f %4.0f %4.0f %4.0f \n",
			IEEESymbol.x[0],IEEESymbol.y[0],IEEESymbol.x[1],IEEESymbol.y[1],IEEESymbol.x[2],IEEESymbol.y[2]);
		tmpStr+="Q 10 2 0\n";
		break;
	case 3:		//clk
		IEEESymbol.x[0]=0;
		IEEESymbol.y[0]=0;
		IEEESymbol.x[1]=1.2*IEEESymbolP->size;

⌨️ 快捷键说明

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