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

📄 diagram.cpp

📁 doxygen(一个自动从源代码生成文档的工具)的源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
            }            else            {              t << "1 " << di->xPos()/(float)gridWidth  << " "                 << ((float)superRows-1.75-di->yPos()/(float)gridHeight)                << " out\n";            }          }          /* write input line */          DiagramItem *first = dil->first();          DiagramItem *last  = dil->last();          if (first!=last && !first->isInList()) /* connect with all base classes */          {            if (bitmap)            {              int xs = first->xPos()*(cellWidth+labelHorSpacing)/gridWidth                + cellWidth/2;              int xe = last->xPos()*(cellWidth+labelHorSpacing)/gridWidth                + cellWidth/2;               if (doBase) // base classes              {                image->drawHorzLine(y,xs,xe,col,mask);               }              else // super classes              {                image->drawHorzLine(y+labelVertSpacing/2,xs,xe,col,mask);               }            }            else            {              t << protToString(p) << endl;              if (doBase)              {                t << first->xPos()/(float)gridWidth << " "                   << last->xPos()/(float)gridWidth << " "                  << (first->yPos()/(float)gridHeight+superRows-1)                   << " conn\n";              }              else              {                t << first->xPos()/(float)gridWidth << " "                   << last->xPos()/(float)gridWidth << " "                  << ((float)superRows-first->yPos()/(float)gridHeight)                  << " conn\n";              }            }          }        }        di=dr->next();      }      dr=next();    }  }}void clearVisitFlags(){  ClassSDict::Iterator cli(Doxygen::classSDict);  ClassDef *cd;  for (;(cd=cli.current());++cli)  {    cd->visited=FALSE;  }}ClassDiagram::ClassDiagram(ClassDef *root){  clearVisitFlags();  base  = new TreeDiagram(root,TRUE);  base->computeLayout();  clearVisitFlags();  super = new TreeDiagram(root,FALSE);  super->computeLayout();  DiagramItem *baseItem  = base->first()->first();  DiagramItem *superItem = super->first()->first();  int xbase  = baseItem->xPos();  int xsuper = superItem->xPos();  if (xbase>xsuper)  {    superItem->move(xbase-xsuper,0);    super->moveChildren(superItem,xbase-xsuper);  }  else if (xbase<xsuper)  {    baseItem->move(xsuper-xbase,0);    base->moveChildren(baseItem,xsuper-xbase);  }}ClassDiagram::~ClassDiagram(){  delete base;  delete super;}void ClassDiagram::writeFigure(QTextStream &output,const char *path,                               const char *fileName){  uint baseRows=base->computeRows();  uint superRows=super->computeRows();  uint baseMaxX, baseMaxLabelWidth, superMaxX, superMaxLabelWidth;  base->computeExtremes(&baseMaxLabelWidth,&baseMaxX);  super->computeExtremes(&superMaxLabelWidth,&superMaxX);  uint rows=baseRows+superRows-1;  uint cols=(QMAX(baseMaxX,superMaxX)+gridWidth*2-1)/gridWidth;    // Estimate the image aspect width and height in pixels.  uint estHeight = rows*40;  uint estWidth  = cols*(20+QMAX(baseMaxLabelWidth,superMaxLabelWidth));  //printf("Estimated size %d x %d\n",estWidth,estHeight);    const float pageWidth = 14.0; // estimated page width in cm.                                // Somewhat lower to deal with estimation                                // errors.     // compute the image height in centimeters based on the estimates  float realHeight = QMIN(rows,12); // real height in cm  float realWidth  = realHeight * estWidth/(float)estHeight;  if (realWidth>pageWidth) // assume that the page width is about 15 cm  {    realHeight*=pageWidth/realWidth;     realWidth=pageWidth;  }  //output << "}\n";  output << ":\\begin{figure}[H]\n"            "\\begin{center}\n"            "\\leavevmode\n";  output << "\\includegraphics[height=" << realHeight << "cm]{"                                         << fileName << "}" << endl;  output << "\\end{center}\n"            "\\end{figure}\n";    //printf("writeFigure rows=%d cols=%d\n",rows,cols);  QCString epsBaseName=(QCString)path+"/"+fileName;  QCString epsName=epsBaseName+".eps";  QFile f1;  f1.setName(epsName.data());  if (!f1.open(IO_WriteOnly))  {    err("Could not open file %s for writing\n",convertToQCString(f1.name()).data());    exit(1);  }  QTextStream t(&f1);    //printf("writeEPS() rows=%d cols=%d\n",rows,cols);    // generate EPS header and postscript variables and procedures    t << "%!PS-Adobe-2.0 EPSF-2.0\n";  t << "%%Title: ClassName\n";  t << "%%Creator: Doxygen\n";  t << "%%CreationDate: Time\n";  t << "%%For: \n";  t << "%Magnification: 1.00\n";  t << "%%Orientation: Portrait\n";  t << "%%BoundingBox: 0 0 500 " << estHeight*500.0/(float)estWidth << "\n";  t << "%%Pages: 0\n";  t << "%%BeginSetup\n";  t << "%%EndSetup\n";  t << "%%EndComments\n";  t << "\n";  t << "% ----- variables -----\n";  t << "\n";  t << "/boxwidth 0 def\n";  t << "/boxheight 40 def\n";  t << "/fontheight 24 def\n";  t << "/marginwidth 10 def\n";  t << "/distx 20 def\n";  t << "/disty 40 def\n";  t << "/boundaspect " << estWidth/(float)estHeight << " def  % aspect ratio of the BoundingBox (width/height)\n";  t << "/boundx 500 def\n";  t << "/boundy boundx boundaspect div def\n";  t << "/xspacing 0 def\n";  t << "/yspacing 0 def\n";  t << "/rows " << rows << " def\n";  t << "/cols " << cols << " def\n";  t << "/scalefactor 0 def\n";  t << "/boxfont /Times-Roman findfont fontheight scalefont def\n";  t << "\n";  t << "% ----- procedures -----\n";  t << "\n";  t << "/dotted { [1 4] 0 setdash } def\n";  t << "/dashed { [5] 0 setdash } def\n";  t << "/solid  { [] 0 setdash } def\n";  t << "\n";  t << "/max % result = MAX(arg1,arg2)\n";  t << "{\n";  t << "  /a exch def\n";  t << "  /b exch def\n";  t << "  a b gt {a} {b} ifelse\n";  t << "} def\n";  t << "\n";  t << "/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)\n";  t << "{\n";  t << "  0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max\n";  t << "} def\n";  t << "\n";  t << "/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))\n";  t << "{\n";  t << "  /str exch def\n";  t << "  /boxwidth boxwidth str stringwidth pop max def\n";  t << "} def\n";  t << "\n";  t << "/box % draws a box with text `arg1' at grid pos (arg2,arg3)\n";  t << "{ gsave\n";  t << "  2 setlinewidth\n";  t << "  newpath\n";  t << "  exch xspacing mul xoffset add\n";  t << "  exch yspacing mul\n";  t << "  moveto\n";  t << "  boxwidth 0 rlineto \n";  t << "  0 boxheight rlineto \n";  t << "  boxwidth neg 0 rlineto \n";  t << "  0 boxheight neg rlineto \n";  t << "  closepath\n";  t << "  dup stringwidth pop neg boxwidth add 2 div\n";  t << "  boxheight fontheight 2 div sub 2 div\n";  t << "  rmoveto show stroke\n";  t << "  grestore\n";  t << "} def  \n";  t << "\n";  t << "/mark\n";  t << "{ newpath\n";  t << "  exch xspacing mul xoffset add boxwidth add\n";  t << "  exch yspacing mul\n";  t << "  moveto\n";  t << "  0 boxheight 4 div rlineto\n";  t << "  boxheight neg 4 div boxheight neg 4 div rlineto\n";  t << "  closepath\n";  t << "  eofill\n";  t << "  stroke\n";  t << "} def\n";  t << "\n";  t << "/arrow\n";  t << "{ newpath\n";  t << "  moveto\n";  t << "  3 -8 rlineto\n";  t << "  -6 0 rlineto\n";  t << "  3 8 rlineto\n";  t << "  closepath\n";  t << "  eofill\n";  t << "  stroke\n";  t << "} def\n";  t << "\n";  t << "/out % draws an output connector for the block at (arg1,arg2)\n";  t << "{\n";  t << "  newpath\n";  t << "  exch xspacing mul xoffset add boxwidth 2 div add\n";  t << "  exch yspacing mul boxheight add\n";  t << "  /y exch def\n";  t << "  /x exch def\n";  t << "  x y moveto\n";  t << "  0 disty 2 div rlineto \n";  t << "  stroke\n";  t << "  1 eq { x y disty 2 div add arrow } if\n";  t << "} def\n";  t << "\n";  t << "/in % draws an input connector for the block at (arg1,arg2)\n";  t << "{\n";  t << "  newpath\n";  t << "  exch xspacing mul xoffset add boxwidth 2 div add\n";  t << "  exch yspacing mul disty 2 div sub\n";  t << "  /y exch def\n";  t << "  /x exch def\n";  t << "  x y moveto\n";  t << "  0 disty 2 div rlineto\n";  t << "  stroke\n";  t << "  1 eq { x y disty 2 div add arrow } if\n";  t << "} def\n";  t << "\n";  t << "/hedge\n";  t << "{\n";  t << "  exch xspacing mul xoffset add boxwidth 2 div add\n";  t << "  exch yspacing mul boxheight 2 div sub\n";  t << "  /y exch def\n";  t << "  /x exch def\n";  t << "  newpath\n";  t << "  x y moveto\n";  t << "  boxwidth 2 div distx add 0 rlineto\n";  t << "  stroke\n";  t << "  1 eq\n";  t << "  { newpath x boxwidth 2 div distx add add y moveto\n";  t << "    -8 3 rlineto\n";  t << "    0 -6 rlineto\n";  t << "    8 3 rlineto\n";  t << "    closepath\n";  t << "    eofill\n";  t << "    stroke\n";  t << "  } if\n";  t << "} def\n";  t << "\n";  t << "/vedge\n";  t << "{\n";  t << "  /ye exch def\n";  t << "  /ys exch def\n";  t << "  /xs exch def\n";  t << "  newpath\n";  t << "  xs xspacing mul xoffset add boxwidth 2 div add dup\n";  t << "  ys yspacing mul boxheight 2 div sub\n";  t << "  moveto\n";  t << "  ye yspacing mul boxheight 2 div sub\n";  t << "  lineto\n";  t << "  stroke\n";  t << "} def\n";  t << "\n";  t << "/conn % connections the blocks from col `arg1' to `arg2' of row `arg3'\n";  t << "{\n";  t << "  /ys exch def\n";  t << "  /xe exch def\n";  t << "  /xs exch def\n";  t << "  newpath\n";  t << "  xs xspacing mul xoffset add boxwidth 2 div add\n";  t << "  ys yspacing mul disty 2 div sub\n";  t << "  moveto\n";  t << "  xspacing xe xs sub mul 0\n";  t << "  rlineto\n";  t << "  stroke\n";  t << "} def\n";  t << "\n";  t << "% ----- main ------\n";  t << "\n";  t << "boxfont setfont\n";  t << "1 boundaspect scale\n";    bool done=FALSE;  DiagramRow *dr=base->first();  while (dr && !done)  {    DiagramItem *di=dr->first();    while (di)    {      done=di->isInList();      t << "(" << di->label() << ") cw\n";      di=dr->next();    }    dr=base->next();  }  dr=super->first();  dr=super->next();  done=FALSE;  while (dr && !done)  {    DiagramItem *di=dr->first();    while (di)    {      done=di->isInList();      t << "(" << di->label() << ") cw\n";      di=dr->next();    }    dr=super->next();  }    t << "/boxwidth boxwidth marginwidth 2 mul add def\n"    << "/xspacing boxwidth distx add def\n"    << "/yspacing boxheight disty add def\n"    << "/scalefactor \n"    << "  boxwidth cols mul distx cols 1 sub mul add\n"    << "  boxheight rows mul disty rows 1 sub mul add boundaspect mul \n"    << "  max def\n"    << "boundx scalefactor div boundy scalefactor div scale\n";    t << "\n% ----- classes -----\n\n";  base->drawBoxes(t,0,TRUE,FALSE,baseRows,superRows,0,0);  super->drawBoxes(t,0,FALSE,FALSE,baseRows,superRows,0,0);    t << "\n% ----- relations -----\n\n";  base->drawConnectors(t,0,TRUE,FALSE,baseRows,superRows,0,0);  super->drawConnectors(t,0,FALSE,FALSE,baseRows,superRows,0,0);  f1.close();  if (Config_getBool("USE_PDFLATEX"))  {    QCString epstopdfArgs(4096);    epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",                   epsBaseName.data(),epsBaseName.data());    //printf("Converting eps using `%s'\n",epstopdfCmd.data());    if (iSystem("epstopdf",epstopdfArgs,TRUE)!=0)    {       err("Error: Problems running epstopdf. Check your TeX installation!\n");       return;    }  }}void ClassDiagram::writeImage(QTextStream &t,const char *path,                              const char *fileName, bool generateMap){  uint baseRows=base->computeRows();  uint superRows=super->computeRows();  uint rows=baseRows+superRows-1;//  t << "<p>Class diagram for "; //  HtmlGenerator::docifyStatic(t,name);//  t << ".\n<p><center><img src=\"" //    << fileName << ".gif\" usemap=\"#" << name << "_map\""//    << " border=\"0\"></center>" << endl//    << "<map name=\"" << name << "_map\"><p>" << endl;    uint lb,ls,xb,xs;  base->computeExtremes(&lb,&xb);  super->computeExtremes(&ls,&xs);   uint cellWidth  = QMAX(lb,ls)+labelHorMargin*2;  uint maxXPos    = QMAX(xb,xs);  uint labelVertMargin = 6; //QMAX(6,(cellWidth-fontHeight)/6); // aspect at least 1:3  uint cellHeight = labelVertMargin*2+fontHeight;  uint imageWidth = (maxXPos+gridWidth)*cellWidth/gridWidth+                    (maxXPos*labelHorSpacing)/gridWidth;  uint imageHeight = rows*cellHeight+(rows-1)*labelVertSpacing;  Image image(imageWidth,imageHeight);  base->drawBoxes(t,&image,TRUE,TRUE,baseRows,superRows,cellWidth,cellHeight,generateMap);  super->drawBoxes(t,&image,FALSE,TRUE,baseRows,superRows,cellWidth,cellHeight,generateMap);  base->drawConnectors(t,&image,TRUE,TRUE,baseRows,superRows,cellWidth,cellHeight);  super->drawConnectors(t,&image,FALSE,TRUE,baseRows,superRows,cellWidth,cellHeight);  image.save((QCString)path+"/"+fileName+".gif");    if (generateMap) t << "</map>" << endl;}

⌨️ 快捷键说明

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