]> granicus.if.org Git - graphviz/commitdiff
Add support for 3d in the pos attribute
authorerg <devnull@localhost>
Tue, 22 Jul 2008 22:06:24 +0000 (22:06 +0000)
committererg <devnull@localhost>
Tue, 22 Jul 2008 22:06:24 +0000 (22:06 +0000)
lib/common/emit.c
lib/common/output.c
lib/common/types.h
lib/neatogen/neatoinit.c

index ae45d5e8a738298a3fba7c99bcea900472ec9cfb..c906f5b4efa3bbb14b7edaba241c33bc2a6ec963 100644 (file)
@@ -1000,7 +1000,11 @@ static void emit_begin_node(GVJ_t * job, node_t * n)
     obj->emit_state = EMIT_NDRAW;
 
     if (flags & GVRENDER_DOES_Z) {
-        obj->z = late_double(n, N_z, 0.0, -MAXFLOAT);
+        /* obj->z = late_double(n, N_z, 0.0, -MAXFLOAT); */
+       if (GD_odim(n->graph) >=3)
+            obj->z = POINTS(ND_pos(n)[2]);
+       else
+            obj->z = 0.0;
     }
     initObjMapData (job, ND_label(n), n);
     if ((flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS))
@@ -1490,8 +1494,14 @@ static void emit_begin_edge(GVJ_t * job, edge_t * e, char** styles)
     }
 
     if (flags & GVRENDER_DOES_Z) {
-        obj->tail_z= late_double(e->tail, N_z, 0.0, -1000.0);
-        obj->head_z= late_double(e->head, N_z, 0.0, -MAXFLOAT);
+        /* obj->tail_z = late_double(e->tail, N_z, 0.0, -1000.0); */
+        /* obj->head_z = late_double(e->head, N_z, 0.0, -MAXFLOAT); */
+       if (GD_odim(e->tail->graph) >=3) {
+            obj->tail_z = POINTS(ND_pos(e->tail)[2]);
+            obj->head_z = POINTS(ND_pos(e->head)[2]);
+       } else {
+            obj->tail_z = obj->head_z = 0.0;
+       }
     }
 
     if (flags & GVRENDER_DOES_LABELS) {
index aae761ff0950eb03f2399c8870e988d902b09fdc..d21da322a73e56e027fc0fba40190b3c9f82d794 100644 (file)
@@ -172,6 +172,7 @@ void attach_attrs_and_arrows(graph_t* g, int* sp, int* ep)
     node_t *n;
     edge_t *e;
     point pt;
+    int dim3 = (GD_odim(g) >= 3);
 
     e_arrows = s_arrows = 0;
     setYInvert(g);
@@ -197,7 +198,11 @@ void attach_attrs_and_arrows(graph_t* g, int* sp, int* ep)
     }
     safe_dcl(g, g, "bb", "", agraphattr);
     for (n = agfstnode(g); n; n = agnxtnode(g, n)) {
-       sprintf(buf, "%d,%d", ND_coord_i(n).x, YDIR(ND_coord_i(n).y));
+       if (dim3) {
+           sprintf(buf, "%d,%d,%d", ND_coord_i(n).x, YDIR(ND_coord_i(n).y), POINTS(ND_pos(n)[2]));
+       } else {
+           sprintf(buf, "%d,%d", ND_coord_i(n).x, YDIR(ND_coord_i(n).y));
+       }
        agset(n, "pos", buf);
        sprintf(buf, "%.2f", PS2INCH(ND_ht_i(n)));
        agxset(n, N_height->index, buf);
index 2f9e570d98ca0ae088ea21262798ecc5d11cad5f..2ee2b4f61e5b4338d7b3019ae44de0aad1fbd2af 100644 (file)
@@ -341,7 +341,8 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind;
        node_t **neato_nlist;
        int move;
        double **dist, **spring, **sum_t, ***t;
-       int ndim;
+       unsigned short ndim;
+       unsigned short odim;
 #endif
 #ifndef NEATO_ONLY
        /* to have subgraphs */
@@ -416,6 +417,7 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind;
 #define GD_n_cluster(g) (g)->u.n_cluster
 #define GD_n_nodes(g) (g)->u.n_nodes
 #define GD_ndim(g) (g)->u.ndim
+#define GD_odim(g) (g)->u.odim
 #define GD_neato_nlist(g) (g)->u.neato_nlist
 #define GD_nlist(g) (g)->u.nlist
 #define GD_nodesep(g) (g)->u.nodesep
index d788bd144a8df550c9e5c130631ff0fd4b67d84b..015ed106dda7bbf4a1985d02a8d3462c9cda0629 100644 (file)
@@ -640,19 +640,18 @@ int init_nop(Agraph_t * g, int adjust)
     return 0;
 }
 
-static void neato_init_graphn(Agraph_t * g, int dfltdim)
+static void neato_init_graph (Agraph_t * g)
 {
+    int outdim;
+
     setEdgeType (g, ET_LINE);
-    GD_ndim(g->root) = late_int(g, agfindattr(g, "dim"), dfltdim, 2);
+    outdim = late_int(g, agfindattr(g, "dimen"), 2, 2);
+    GD_ndim(g->root) = late_int(g, agfindattr(g, "dim"), outdim, 2);
     Ndim = GD_ndim(g->root) = MIN(GD_ndim(g->root), MAXDIM);
+    GD_odim(g->root) = MIN(outdim, Ndim);
     neato_init_node_edge(g);
 }
 
-static void neato_init_graph(Agraph_t * g)
-{
-    neato_init_graphn(g, 2);
-}
-
 static int neatoModel(graph_t * g)
 {
     char *p = agget(g, "model");