From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric S Fraga Subject: Re: Process diagrams with dot and some glue using Org-mode Date: Wed, 26 Jun 2013 17:40:09 +0100 Message-ID: <87sj04keqe.fsf@ucl.ac.uk> References: <2013-06-26T17-08-48@devnull.Karl-Voit.at> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:56836) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UrtiB-0006Tp-Vh for emacs-orgmode@gnu.org; Wed, 26 Jun 2013 13:40:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UrtiA-0007UW-2q for emacs-orgmode@gnu.org; Wed, 26 Jun 2013 13:40:55 -0400 Received: from co9ehsobe003.messaging.microsoft.com ([207.46.163.26]:52228 helo=co9outboundpool.messaging.microsoft.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Urti9-0007T2-KZ for emacs-orgmode@gnu.org; Wed, 26 Jun 2013 13:40:53 -0400 In-Reply-To: <2013-06-26T17-08-48@devnull.Karl-Voit.at> (Karl Voit's message of "Wed, 26 Jun 2013 17:23:03 +0200") 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: Karl Voit Cc: news1142@Karl-Voit.at, emacs-orgmode@gnu.org --=-=-= Content-Type: text/plain Hi Karl, Karl Voit writes: > I was looking for a reasonable simple method to define processes and > work-flows within Org-mode. My research did not result in anything > existing I found useful. Therefore, I started to read about dot[1] > and found [2]. > > I would like to define my diagram with the following two tables: one > for the node definitions and one for the interconnections between > notes. The syntax should be pretty self-explanatory (or at least I > hope so): [...] > The question is: is somebody with decent ELISP knowledge able to > implement the missing method? :-) I did something simple for generating graphs but without an adjacency type of matrix as you have defined and without the special types of edges. So, quite limited with respect to what you want. In any case, I've attached what I played with a while ago in the hope that maybe some of it proves useful. What I did taxed my abilities in emacs lisp so I won't be able to help much in adapting it to what you want... eric -- : Eric S Fraga (0xFFFCF67D), Emacs 24.3.50.1, Org release_8.0.3-193-g334581 --=-=-= Content-Type: text/x-org Content-Disposition: attachment; filename="businessprocess.org" * preamble #+TITLE: businessprocess.org #+AUTHOR: Eric S Fraga #+EMAIL: e.fraga@ucl.ac.uk #+DATE: 2010-11-15 Mon #+DESCRIPTION: cf. #+KEYWORDS: #+LANGUAGE: en #+OPTIONS: H:3 num:t toc:t \n:nil @:t ::t |:t ^:t -:t f:t *:t <:t #+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc #+INFOJS_OPT: view:nil toc:nil ltoc:t mouse:underline buttons:0 path:http://orgmode.org/org-info.js #+EXPORT_SELECT_TAGS: export #+EXPORT_EXCLUDE_TAGS: noexport #+LINK_UP: #+LINK_HOME: #+XSLT: * The problem Look at [[gnus:nnmaildir%2BUCL:lists#87bp5sacnf.fsf@bunting.net.au][this email]]. * the table #+tblname: processtable | Step | Description | Next Steps | | |-------------+-------------------------------------------------------------------------+-------------+-------| | Begin | Begin the process | Choice1 | | | Choice1 | Decide if we are big or small. | Big | Small | | Big | If we are big then do big things | End | | | Small | If we are small then figure out if we are really small or possibly big. | ReallySmall | Big | | ReallySmall | Yes we are really small | End | | | End | The end. | | | |-------------+-------------------------------------------------------------------------+-------------+-------| * the elisp code #+source: esf/business-process #+begin_src emacs-lisp :results value raw :exports results (defun esf/generate-business-process-graph (table name file) (let ((entries (nthcdr 2 table)) (output (format "digraph %s {" name)) ) (message "Initial: %s\n" table) (message "Entries: %s\n" entries) ;; we need to do two iterations through the table, one to define ;; the nodes and then one to connect them. (setq savedentries entries) ;for second iteration (while entries (let ((entry (first entries))) (if (listp entry) (let ((step (first entry)) (description (nth 1 entry)) ) (setq output (format "%s\n %s [label=\"%s\"];" output step description)) ) ) (setq entries (cdr entries)) ) ) (setq entries savedentries) (while entries (let ((entry (first entries))) (if (listp entry) (let ((from (first entry)) (nextsteps (cdr (cdr entry))) ) (message "Nextsteps: %s\n" nextsteps) (while nextsteps (let ((to (first nextsteps))) (if to (if (not (string= to "")) (setq output (format "%s\n %s -> %s;" output from to)))) (setq nextsteps (cdr nextsteps)) ) ) ) ) (setq entries (cdr entries)) ) ) ; end while entries left (format "#+begin_src dot :results file :file %s :exports results %s } ,#+end_src\n" file output) ) ) (esf/generate-business-process-graph table name file) #+end_src * the graph #+call: esf/business-process(table=processtable, file="business.pdf", name="process") :results value raw #+results: esf/business-process(table=processtable, file="business.pdf", name="process") #+begin_src dot :results file :file business.pdf :exports results digraph process { Begin [label="Begin the process"]; Choice1 [label="Decide if we are big or small."]; Big [label="If we are big then do big things"]; Small [label="If we are small then figure out if we are really small or possibly big."]; ReallySmall [label="Yes we are really small"]; End [label="The end."]; Begin -> Choice1; Choice1 -> Big; Choice1 -> Small; Big -> End; Small -> ReallySmall; Small -> Big; ReallySmall -> End; } #+end_src #+results: [[file:business.pdf]] --=-=-=--