15int graphcmd(ClientData clientData, Tcl_Interp * interp,
17 int argc,
char *argv[]
19 int argc, Tcl_Obj * CONST objv[]
30 char buf[12], **argv2;
35 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
" option ?arg arg ...?\"",
NULL);
40 Tcl_AppendResult(interp,
"graph \"", argv[0],
"\" not found",
NULL);
44 if (strcmp(
"addedge", argv[1]) == 0) {
45 if ((argc < 4) || (argc % 2)) {
46 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
47 " addedge tail head ?attributename attributevalue? ?...?\"",
51 tail =
cmd2n(argv[2]);
54 Tcl_AppendResult(interp,
"tail node \"", argv[2],
"\" not found.",
NULL);
59 Tcl_AppendResult(interp,
"tail node ", argv[2],
" is not in the graph.",
NULL);
65 Tcl_AppendResult(interp,
"head node \"", argv[3],
"\" not found.",
NULL);
70 Tcl_AppendResult(interp,
"head node ", argv[3],
" is not in the graph.",
NULL);
78 }
else if (strcmp(
"addnode", argv[1]) == 0) {
91 }
else if (strcmp(
"addsubgraph", argv[1]) == 0) {
93 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
94 "\" addsubgraph ?name? ?attributename attributevalue? ?...?",
99 sg =
agsubg(g, argv[2], 1);
109 }
else if (strcmp(
"countnodes", argv[1]) == 0) {
110 snprintf(buf,
sizeof(buf),
"%d",
agnnodes(g));
111 Tcl_AppendResult(interp, buf,
NULL);
114 }
else if (strcmp(
"countedges", argv[1]) == 0) {
115 snprintf(buf,
sizeof(buf),
"%d",
agnedges(g));
116 Tcl_AppendResult(interp, buf,
NULL);
119 }
else if (strcmp(
"delete", argv[1]) == 0) {
123 }
else if (strcmp(
"findedge", argv[1]) == 0) {
125 Tcl_AppendResult(interp,
"wrong # args: should be \"",
126 argv[0],
" findedge tailnodename headnodename\"",
NULL);
130 Tcl_AppendResult(interp,
"tail node \"", argv[2],
"\" not found.",
NULL);
134 Tcl_AppendResult(interp,
"head node \"", argv[3],
"\" not found.",
NULL);
138 Tcl_AppendResult(interp,
"edge \"", argv[2],
" - ", argv[3],
"\" not found.",
NULL);
141 Tcl_AppendElement(interp,
obj2cmd(e));
144 }
else if (strcmp(
"findnode", argv[1]) == 0) {
146 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
" findnode nodename\"",
NULL);
150 Tcl_AppendResult(interp,
"node not found.",
NULL);
156 }
else if (strcmp(
"layoutedges", argv[1]) == 0) {
158 if (!
aggetrec (g,
"Agraphinfo_t",0))
162 }
else if (strcmp(
"layoutnodes", argv[1]) == 0) {
164 if (!
aggetrec (g,
"Agraphinfo_t",0))
168 }
else if (strcmp(
"listattributes", argv[1]) == 0) {
172 }
else if (strcmp(
"listedgeattributes", argv[1]) == 0) {
176 }
else if (strcmp(
"listnodeattributes", argv[1]) == 0) {
180 }
else if (strcmp(
"listedges", argv[1]) == 0) {
183 Tcl_AppendElement(interp,
obj2cmd(e));
188 }
else if (strcmp(
"listnodes", argv[1]) == 0) {
190 Tcl_AppendElement(interp,
obj2cmd(n));
195 }
else if (strcmp(
"listnodesrev", argv[1]) == 0) {
197 Tcl_AppendElement(interp,
obj2cmd(n));
201 }
else if (strcmp(
"listsubgraphs", argv[1]) == 0) {
203 Tcl_AppendElement(interp,
obj2cmd(sg));
207 }
else if (strcmp(
"queryattributes", argv[1]) == 0) {
208 for (i = 2; i < argc; i++) {
210 (interp, argv[i], &argc2,
211 (
CONST84 char ***) &argv2) != TCL_OK)
213 for (j = 0; j < argc2; j++) {
215 Tcl_AppendElement(interp,
agxget(g, a));
217 Tcl_AppendResult(interp,
" No attribute named \"", argv2[j],
"\"",
NULL);
221 Tcl_Free((
char *) argv2);
225 }
else if (strcmp(
"queryattributevalues", argv[1]) == 0) {
226 for (i = 2; i < argc; i++) {
228 (interp, argv[i], &argc2,
229 (
CONST84 char ***) &argv2) != TCL_OK)
231 for (j = 0; j < argc2; j++) {
233 Tcl_AppendElement(interp, argv2[j]);
234 Tcl_AppendElement(interp,
agxget(g, a));
236 Tcl_AppendResult(interp,
" No attribute named \"", argv2[j],
"\"",
NULL);
240 Tcl_Free((
char *) argv2);
244 }
else if (strcmp(
"queryedgeattributes", argv[1]) == 0) {
245 for (i = 2; i < argc; i++) {
247 (interp, argv[i], &argc2,
248 (
CONST84 char ***) &argv2) != TCL_OK)
250 for (j = 0; j < argc2; j++) {
252 Tcl_AppendElement(interp,
agxget(g, a));
254 Tcl_AppendResult(interp,
" No attribute named \"", argv2[j],
"\"",
NULL);
258 Tcl_Free((
char *) argv2);
262 }
else if (strcmp(
"queryedgeattributevalues", argv[1]) == 0) {
263 for (i = 2; i < argc; i++) {
265 (interp, argv[i], &argc2,
266 (
CONST84 char ***) &argv2) != TCL_OK)
268 for (j = 0; j < argc2; j++) {
270 Tcl_AppendElement(interp, argv2[j]);
271 Tcl_AppendElement(interp,
agxget(g, a));
273 Tcl_AppendResult(interp,
" No attribute named \"",
274 argv2[j],
"\"",
NULL);
278 Tcl_Free((
char *) argv2);
282 }
else if (strcmp(
"querynodeattributes", argv[1]) == 0) {
283 for (i = 2; i < argc; i++) {
285 (interp, argv[i], &argc2,
286 (
CONST84 char ***) &argv2) != TCL_OK)
288 for (j = 0; j < argc2; j++) {
290 Tcl_AppendElement(interp,
agxget(g, a));
292 Tcl_AppendResult(interp,
" No attribute named \"",
293 argv2[j],
"\"",
NULL);
297 Tcl_Free((
char *) argv2);
301 }
else if (strcmp(
"querynodeattributevalues", argv[1]) == 0) {
302 for (i = 2; i < argc; i++) {
304 (interp, argv[i], &argc2,
305 (
CONST84 char ***) &argv2) != TCL_OK)
307 for (j = 0; j < argc2; j++) {
309 Tcl_AppendElement(interp, argv2[j]);
310 Tcl_AppendElement(interp,
agxget(g, a));
312 Tcl_AppendResult(interp,
" No attribute named \"", argv2[j],
"\"",
NULL);
316 Tcl_Free((
char *) argv2);
320 }
else if (strcmp(
"render", argv[1]) == 0) {
334 if (!
aggetrec (g,
"Agraphinfo_t",0) || argc > 3)
345 }
else if (strcmp(
"setattributes", argv[1]) == 0) {
348 (interp, argv[2], &argc2,
349 (
CONST84 char ***) &argv2) != TCL_OK)
351 if ((argc2 == 0) || (argc2 % 2)) {
352 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
353 "\" setattributes attributename attributevalue ?attributename attributevalue? ?...?",
355 Tcl_Free((
char *) argv2);
359 Tcl_Free((
char *) argv2);
361 if (argc == 4 && strcmp(argv[2],
"viewport") == 0) {
365 if ((argc < 4) || (argc % 2)) {
366 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
367 "\" setattributes attributename attributevalue ?attributename attributevalue? ?...?",
375 }
else if (strcmp(
"setedgeattributes", argv[1]) == 0) {
378 (interp, argv[2], &argc2,
379 (
CONST84 char ***) &argv2) != TCL_OK)
381 if ((argc2 == 0) || (argc2 % 2)) {
382 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
383 "\" setedgeattributes attributename attributevalue ?attributename attributevalue? ?...?",
385 Tcl_Free((
char *) argv2);
389 Tcl_Free((
char *) argv2);
391 if ((argc < 4) || (argc % 2)) {
392 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
393 "\" setedgeattributes attributename attributevalue ?attributename attributevalue? ?...?",
400 }
else if (strcmp(
"setnodeattributes", argv[1]) == 0) {
403 (interp, argv[2], &argc2,
404 (
CONST84 char ***) &argv2) != TCL_OK)
406 if ((argc2 == 0) || (argc2 % 2)) {
407 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
408 "\" setnodeattributes attributename attributevalue ?attributename attributevalue? ?...?",
410 Tcl_Free((
char *) argv2);
414 Tcl_Free((
char *) argv2);
416 if ((argc < 4) || (argc % 2)) {
417 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
418 "\" setnodeattributes attributename attributevalue ?attributename attributevalue? ?...?",
425 }
else if (strcmp(
"showname", argv[1]) == 0) {
426 Tcl_SetResult(interp,
agnameof(g), TCL_STATIC);
428 }
else if (strcmp(
"write", argv[1]) == 0) {
431 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
432 " write fileHandle ?language ?DOT|NEATO|TWOPI|FDP|CIRCO|NOP??\"",
443 chan = Tcl_GetChannel(interp, argv[2], &
mode);
446 Tcl_AppendResult(interp,
"channel not open: \"", argv[2],
NULL);
449 if (!(
mode & TCL_WRITABLE)) {
450 Tcl_AppendResult(interp,
"channel not writable: \"", argv[2],
NULL);
456 if (!
aggetrec (g,
"Agraphinfo_t",0) || argc > 4)
460 if (
gvRender(
gvc, g, argc < 4 ?
"dot" : argv[3], (FILE *)chan) != 0) {
466 Tcl_AppendResult(interp,
"bad option \"", argv[1],
467 "\": must be one of:",
468 "\n\taddedge, addnode, addsubgraph, countedges, countnodes,",
469 "\n\tlayout, listattributes, listedgeattributes, listnodeattributes,",
470 "\n\tlistedges, listnodes, listsubgraphs, render, rendergd,",
471 "\n\tqueryattributes, queryedgeattributes, querynodeattributes,",
472 "\n\tqueryattributevalues, queryedgeattributevalues, querynodeattributevalues,",
473 "\n\tsetattributes, setedgeattributes, setnodeattributes,",
474 "\n\tshowname, write.",
NULL);
context used to convey information between commands and a renderer