Comment écrire des pointes de flèche personnalisés dans Graphviz

J'utilise Graphviz (principalement le dot et le fdp) pour générer automatiquement des diagrammes que j'ai besoin. J'ai besoin de quelques têtes de flèche spéciales qui ne font pas partie de la collection standard de flèches pour ces schémas : un petit triangle noir à l'intérieur d'un triangle blanc grand et même avec le triangle noir pointant vers le bas.

Quel est le meilleur moyen d'ajouter des pointes de flèche ? Je ne crains pas le code source, le piratage si nécessaire. Par où dois-je commencer ?

répondre #1

Vous devez changer de code source pour cela. Jetez un oeil à « lib/common/arrows.c ». Vous trouverez que vous devez :

  • Ajouter un # définir comme ARR_TYPE_YOURARROWNAME
  • Ajouter une entrée dans [] Arrownames avec le nom que vous utiliserez dans le code pour votre flèche et la définir.
  • écrire le prototype de votre fonction de la flèche (voir autour de ligne 115), lisez les points ci-dessous
  • Ajoutez votre fonction dans le tableau [] Arrowtypes une entrée avec la définition que vous avez écrit précédemment, la largeur du stylet, le nom de votre fonction de flèche qui sera quelque chose comme arrow_type_yourarrowname
  • écrire votre propre fonction de la flèche.

Afin d'écrire votre prise de fonction un oeil à arrow_type_normal(), il faut 6 paramètres : emploi (vous n'avez pas se soucier de cela, il suffit d'utiliser ça dans cette fonction), deux points ("p" et "u"), arrowsize, penwidth et pavillon. Si vous n'aimez pas faire des versions différentes de votre pointe de flèche, ou si vous souhaitez ignorer les modificateurs (flèches inversées et autres) ignorent le paramètre flag.

Ensuite, la fonction prend essentiellement les deux points p et u (qui sont des structures par « x » et « y » attributs dedans) et les combine créant un tableau appelé un [] passé à gvrender_polygon() qui rendra enfin votre forme de flèche. arrow_type_normal() aussi plaisante pas avec le penwidth et arrowwidth.

Résumé : préparer graphviz pour accepter votre flèche nom faisant ensuite les premiers pas, créez une fonction qui va créer la forme de flèche et qui appelle gvrender_polygon ou gvrender_polyline (si vous le souhaitez).

Je n'ai pas essayé encore, mais cela devrait fonctionner.


Tags lesen

  
 
logo_banner