📄 lib2dxddlg.cpp
字号:
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 + -