2010-07-05 16 views
6

Uso Graphviz (principalmente punto y fdp) para generar automáticamente algunos diagramas que necesito. Para estos diagramas necesito algunas puntas de flecha especiales que no forman parte de la colección estándar de flechas: un pequeño triángulo negro dentro de un gran triángulo blanco, y lo mismo con el triángulo negro apuntando hacia abajo.Cómo escribir puntas de flecha personalizadas en Graphviz

¿Cuál es la mejor manera de agregar tales puntas de flecha? No me importa piratear el código fuente, si es necesario. ¿Donde debería empezar?

Respuesta

3

Tienes que cambiar al código fuente para eso. Eche un vistazo a "lib/common/arrows.c". Usted encontrará que usted tiene que:

  • Añadir un # define como ARR_TYPE_YOURARROWNAME
  • añadir una entrada en Arrownames [] con el nombre que va a utilizar en el código de su flecha y la de definir.
  • escriba el prototipo de su función de flecha (consulte la fila 115), lea los puntos siguientes
  • agregue su función en la matriz Arrowtypes [] una entrada con la definición que escribió anteriormente, el ancho del lápiz, el nombre de su función de flecha que será algo así como arrow_type_yourarrowname
  • escribe tu propia función de flecha.

Con el fin de escribir su función de echar un vistazo a arrow_type_normal(), se tarda 6 parámetros: trabajo (que no tiene que preocuparse por esto, sólo lo utilizan como en esta función), dos puntos (' p 'y' u '), arrowsize, penwidth y flag. Si no le importa hacer diferentes versiones de su punta de flecha, o si desea ignorar los modificadores (flechas invertidas y similares) ignore el parámetro del indicador.

Luego, la función básicamente toma los dos puntos p y u (que son estructuras con atributos 'x' e 'y' en ellos) y los combina creando una matriz llamada a [] pasada a gvrender_polygon() que finalmente renderiza tu forma de flecha. arrow_type_normal() también lía con el ancho de la pluma y la flecha.

Resumiendo: prepare graphviz para aceptar el nombre de su flecha haciendo los primeros pasos y luego cree una función que creará la forma de flecha y que llamará a gvrender_polygon o gvrender_polyline (si lo desea).

No lo intenté todavía, pero debería funcionar.