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