From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rick Frankel Subject: Re: Process diagrams with dot and some glue using Org-mode Date: Wed, 26 Jun 2013 14:25:04 -0400 Message-ID: <4c174089656ce0b08177f464325c4bf9@mail.rickster.com> References: <2013-06-26T17-08-48@devnull.Karl-Voit.at> <5b90a6852c7b87d077016cbb0479ff23@mail.rickster.com> <2013-06-26T18-59-53@devnull.Karl-Voit.at> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:46780) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UruOy-0005U4-7T for emacs-orgmode@gnu.org; Wed, 26 Jun 2013 14:25:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UruOv-0007st-5E for emacs-orgmode@gnu.org; Wed, 26 Jun 2013 14:25:08 -0400 Received: from [204.62.15.78] (port=36800 helo=mail.rickster.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UruOv-0007pZ-0E for emacs-orgmode@gnu.org; Wed, 26 Jun 2013 14:25:05 -0400 In-Reply-To: <2013-06-26T18-59-53@devnull.Karl-Voit.at> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: news1142@karl-voit.at Cc: emacs-orgmode@gnu.org On 2013-06-26 13:03, Karl Voit wrote: > * Rick Frankel wrote: > > Two things: > > 1. You don't need to write table parsing code, as passing in a > table as an argument to a code block will convert it to an > array. > t=[["a", 1], ["b", 2]] > > You're right, I totally forgot about this neat feature. > > However, the header information seems to get lost. This requires > hard-coded column content which is a minor drawback of this method. Just use `:colnames no': #+BEGIN_SRC python :var t=ptable :results value :colnames no return t #+END_SRC t=[["head1", "head2"], ["a", 1], ["b", 2]] return t Regardless, here's a hack which does what you want. Note to things: - it executes the dot code directly and uses the :file header argument for output, because you need the colnames of the graph table but not of the node table. - It requires you to specify the range on the node table #+HEADER: :var nodes=foobar-node-table[2:-1] #+HEADER: :var graph=foobar-graph-table #+BEGIN_SRC emacs-lisp :results file :file "./t.png" (org-babel-execute:dot (concat " digraph {" (mapconcat (lambda (x) (format "%s [label=\"%s\" shape=%s fillcolor=%s]" (car x) (nth 1 x) (if (string= "" (nth 2 x)) "box" (nth 2 x)) (if (string= "" (nth 3 x)) "none" (nth 3 x)))) nodes "\n") "\n" (let* ((to-nodes (car graph)) (len (length to-nodes))) (mapconcat (lambda (x) (let ((name (car x))) (mapconcat 'identity (loop with result = '() for i from 1 to len do (when (> (length (nth i x)) 0) (add-to-list 'result (format "%s -> %s [label=\"%s\"]\n" name (nth i to-nodes) (substring (nth i x) 0 -1)))) finally return result) "\n"))) (cdr graph) "")) "}") params) #+END_SRC And here's a simplier version which uses a graph table in the following format: #+name: foobar-graph | from | to | label | |------------+------------+-------| | S_start | S_fill | | | S_fill | S_send | | | S_send | S_complete | | | S_complete | S_fill | N | | S_complete | S_do | Y | | S_do | S_end | | #+HEADER: :var nodes=foobar-node-table graph=foobar-graph #+BEGIN_SRC emacs-lisp :file ./t2.png :colnames yes (org-babel-execute:dot (concat "digraph {\n" (mapconcat (lambda (x) (format "%s [label=\"%s\" shape=%s fillcolor=%s]" (car x) (nth 1 x) (if (string= "" (nth 2 x)) "box" (nth 2 x)) (if (string= "" (nth 3 x)) "none" (nth 3 x)))) nodes "\n") "\n" (mapconcat (lambda (x) (format "%s -> %s [taillabel=\"%s\"]" (car x) (nth 1 x) (nth 2 x))) graph "\n") "}\n") params) #+END_SRC