static void dot_begin_graph(GVJ_t *job) { int e_arrows; /* graph has edges with end arrows */ int s_arrows; /* graph has edges with start arrows */ graph_t *g = job->obj->u.g; switch (job->render.id) { case FORMAT_DOT: attach_attrs(g); break; case FORMAT_CANON: if (HAS_CLUST_EDGE(g)) undoClusterEdges(g); break; case FORMAT_PLAIN: case FORMAT_PLAIN_EXT: break; case FORMAT_XDOT: case FORMAT_XDOT12: case FORMAT_XDOT14: attach_attrs_and_arrows(g, &s_arrows, &e_arrows); xdot_begin_graph(g, s_arrows, e_arrows, job->render.id); break; } }
// annotate the graph with layout information bool render(Agraph_t *g) { if (!g) return false; attach_attrs(g); return true; }
static void json_begin_graph(GVJ_t *job) { if (job->render.id == FORMAT_JSON) { GVC_t* gvc = gvCloneGVC (job->gvc); graph_t *g = job->obj->u.g; gvRender (gvc, g, "xdot", NULL); gvFreeCloneGVC (gvc); } else if (job->render.id == FORMAT_JSON0) { attach_attrs(job->gvc->g); } }
// annotate the graph with layout information void render(Agraph_t *g) { attach_attrs(g); }
void dotneato_write(graph_t* g, std::string *output_str) { double xf, yf; char *p; int i; /* margins */ if ((p = agget(g,"margin"))) { i = sscanf(p,"%lf,%lf",&xf,&yf); if (i > 0) g->u.drawing->margin.x = g->u.drawing->margin.y = POINTS(xf); if (i > 1) g->u.drawing->margin.y = POINTS(yf); } else { /* set default margins depending on format */ switch (Output_lang) { case GIF: case PNG: case JPEG: case GD: case GD2: case ISMAP: case IMAP: case VRML: case SVG: g->u.drawing->margin.x = DEFAULT_EMBED_MARGIN_X; g->u.drawing->margin.y = DEFAULT_EMBED_MARGIN_Y; break; case POSTSCRIPT: case HPGL: case PCL: case MIF: case METAPOST: case FIG: case VTX: case ATTRIBUTED_DOT: case PLAIN: g->u.drawing->margin.x = g->u.drawing->margin.y = DEFAULT_MARGIN; break; case CANONICAL_DOT: break; } } switch (Output_lang) { case POSTSCRIPT: case HPGL: case PCL: case MIF: case GIF: case PNG: case JPEG: case GD: case GD2: case ISMAP: case IMAP: case VRML: case METAPOST: case FIG: case SVG: /* output in breadth first graph walk order */ emit_graph(g,0); break; case VTX: /* output sorted, i.e. all nodes then all edges */ emit_graph(g,1); break; case ATTRIBUTED_DOT: attach_attrs(g); agwrite(g,Output_file); break; case CANONICAL_DOT: agwrite(g,Output_file); break; case PLAIN: attach_attrs(g); if (output_str) write_plainstr(g,output_str); else write_plain(g,Output_file); break; } fflush(Output_file); }
main(int argc, char *argv[]) { Agraph_t **gs; Agraph_t **ccs; Agraph_t *g; Agraph_t *gp; char *fname; FILE *fp; int cnt; int i; init(argc, argv); if (!Files) { fprintf(stderr, "No input files given\n"); exit(1); } PSinputscale = POINTS_PER_INCH; if (doComps) { if (verbose) fprintf(stderr, "do Comps\n"); while (fname = *Files++) { fp = fopen(fname, "r"); if (!fp) { fprintf(stderr, "Could not open %s\n", fname); continue; } g = agread(fp); fclose(fp); if (!g) { fprintf(stderr, "Could not read graph\n"); continue; } printf("%s %d nodes %d edges %sconnected\n", g->name, agnnodes(g), agnedges(g), (isConnected(g) ? "" : "not ")); gs = ccomps(g, &cnt, "abc"); for (i = 0; i < cnt; i++) { gp = gs[i]; printf(" %s %d nodes %d edges\n", gp->name, agnnodes(gp), agnedges(gp)); } } } else { gs = N_GNEW(nFiles, Agraph_t *); cnt = 0; while (fname = Files[cnt]) { fp = fopen(fname, "r"); if (!fp) { fprintf(stderr, "Could not open %s\n", fname); exit(1); } g = agread(fp); fclose(fp); if (!g) { fprintf(stderr, "Could not read graph\n"); exit(1); } if (!single) { graph_init(g); ptest_initGraph(g); } initPos(g); /* if (Verbose) dumpG (g); */ gs[cnt++] = g; } if (single) { Agraph_t *root; Agnode_t *n; Agnode_t *np; Agnode_t *tp; Agnode_t *hp; Agedge_t *e; Agedge_t *ep; root = agopen("root", 0); agedgeattr(root, "pos", ""); for (i = 0; i < cnt; i++) { g = gs[i]; for (n = agfstnode(g); n; n = agnxtnode(g, n)) { if (agfindnode(root, n->name)) { fprintf(stderr, "Error: node %s in graph %d (%s) previously added\n", n->name, i, Files[i]); exit(1); } np = agnode(root, n->name); ND_pos(np)[0] = ND_pos(n)[0]; ND_pos(np)[1] = ND_pos(n)[1]; ND_coord_i(np).x = ND_coord_i(n).x; ND_coord_i(np).y = ND_coord_i(n).y; } for (n = agfstnode(g); n; n = agnxtnode(g, n)) { tp = agfindnode(root, n->name); for (e = agfstout(g, n); e; e = agnxtout(g, e)) { hp = agfindnode(root, e->head->name); ep = agedge(root, tp, hp); ED_spl(ep) = ED_spl(e); } } } graph_init(root); ptest_initGraph(root); ccs = ccomps(root, &cnt, 0); packGraphs(cnt, ccs, root, margin, doEdges); if (!doEdges) copyPos(root); else State = GVSPLINES; attach_attrs(root); for (i = 0; i < cnt; i++) { agdelete(root, ccs[i]); } agwrite(root, stdout); } else { packGraphs(cnt, gs, 0, margin, doEdges); if (doEdges) State = GVSPLINES; for (i = 0; i < cnt; i++) { if (!doEdges) copyPos(gs[i]); attach_attrs(gs[i]); agwrite(gs[i], stdout); } } } }