%% bondgraph.sty
%% Copyright (c) 2010, Jean-Francois Dupuis
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
% 
% The Current Maintainer of this work is Jean-Francois Dupuis.
%
% This work consists of the files bondgraph.sty, bondgraph_arrows.tex 
% and bondgraph_example.tex.


% The Defines commands to draw bond graph using the graph layout tools
% TikZ and PGF.

\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{bondgraph}[2010/06/04 v1.0]
\RequirePackage{tikz}
\RequirePackage{ifthen}

\usepgflibrary{arrows}
\usetikzlibrary{positioning}

% % Arrow definition
\pgfarrowsdeclarecombine[\pgflinewidth]
{combined}{combined}{left to}{left to}{|}{|}%

\tikzstyle{outbond}=[-left to]
\tikzstyle{inbond}=[left to-]
\tikzstyle{outbonde}=[-combined]
\tikzstyle{inbonde}=[combined-]
\tikzstyle{outbondf}=[|-left to]
\tikzstyle{inbondf}=[left to-|]



%usefull command
\newcommand{\bondleft}[2]{ 
\begin{tikzpicture}[auto,baseline]
\draw [left to-] (0pt,0.7ex) to node {\scriptsize$\textstyle #1$} node [swap] {\scriptsize$\textstyle #2$} (3ex,0.7ex);
\end{tikzpicture}
}

\newcommand{\bondright}[2]{ 
\begin{tikzpicture}[auto,baseline]
\draw [-left to] (0pt,0.7ex) to node {\scriptsize$\textstyle #1$} node [swap] {\scriptsize$\textstyle #2$} (3ex,0.7ex);
\end{tikzpicture}
}

\newcommand{\bondrighte}[2]{
\begin{tikzpicture}[auto,baseline]
\draw[-combined] (0pt,0.7ex) to node {\scriptsize$\textstyle #1$} node [swap] {\scriptsize$\textstyle #2$} (3ex,0.7ex);
\end{tikzpicture}
}
\newcommand{\bondrightf}[2]{
\begin{tikzpicture}[auto,baseline]
\draw[|-left to] (0pt,0.7ex) to node {\scriptsize$\textstyle #1$} node [swap] {\scriptsize$\textstyle #2$} (3ex,0.7ex);
\end{tikzpicture}
}
\newcommand{\bondlefte}[2]{
\begin{tikzpicture}[auto, baseline]
\draw[combined-] (0pt,0.7ex) to node {\scriptsize$\textstyle #1$} node [swap] {\scriptsize$\textstyle #2$} (3ex,0.7ex);
\end{tikzpicture}
}
\newcommand{\bondleftf}[2]{
\begin{tikzpicture}[auto, baseline]
\draw[left to-|] (0pt,0.7ex) to node {\scriptsize$\textstyle #1$} node [swap] {\scriptsize$\textstyle #2$} (3ex,0.7ex);
\end{tikzpicture}
}

% % % Style definition

\tikzstyle{nodemodpoint}=[
	% The shape:
	rectangle,
	% The size:
	minimum size=6mm,
	% The border:
	very thick,
	draw=red!50!black!50, % 50% red and 50% black, and that mixed with 50% white
	% The filling:
	top color=white, % a shading that is white at the top...
	bottom color=red!50!black!20, % and something else at the bottom
	% Font
	%font=\itshape,
	% Seperation
	outer sep=2pt
]

\tikzstyle{bondmodpoint}=[
	% The shape:
	rectangle,
	% The size:
	minimum size=2.5mm,
	% The border:
	very thick,
	draw=red!50!black!50, % 50% red and 50% black, and that mixed with 50% white
	% Seperation
	outer sep=2pt
]

\tikzstyle{newelement}=[
	color=red!50!black!75,
	thick
]


% % Bond graph creation command

\newcommand{\bgComponentNoBond} [2] {
	%1 Node style
	%2 Node reference name
	%3 Node displayed name
	\node (#1) {#2};
}

\newcommand{\bgComponent} [6] {
	%1 Node style
	%2 Node reference
	%3 Node name
	%4 Position
	%5 Position reference
	%6 Bond style
	\node [#1] (#2) [#4 #5] {#3}
	edge [#6]  (#5);
}

\newcommand{\bgComponentWithBondLabel} [9] {
	%1 Node style
	%2 Node reference
	%3 Node name
	%4 Position
	%5 Position reference
	%6 Bond style
	%7 Label style
	%8 Effort label name
	%9 Flow label name
	\ifthenelse{\equal{#4}{right of=}\or\equal{#4}{left of=}}%
	{ %Place label above and below
	\node [#1] (#2) [#4 #5] {#3}
		edge [#6]  node  [#7] [above]{#8} node  [#7] [below]{#9} (#5);
	}{ %Place labels left and right
	\node [#1] (#2) [#4 #5] {#3}
		edge [#6]  node  [#7] [left]{#8} node  [#7] [right]{#9} (#5);
}
}

\newcommand{\bgComponentWithPosBondLabel} [9] {
	%1 Node style
	%2 Node reference
	%3 Node name
	%4 Position
	%5 Position reference
	%6 Bond style
	%7 Label style
	%8 Label position
	%9 Label name
	\node [#1] (#2) [#4 #5] {#3}
	edge [#6]  node  [#7] [#8]{#9} (#5);
}

\newcommand{\bgComponentWithBondMarkup} [7] {
	%1 Node style
	%2 Node reference
	%3 Node name
	%4 Position
	%5 Position reference
	%6 Bond style
	%7 Markup style
	\node [#1] (#2) [#4 #5] {#3}
		edge [#6] node [#7] {} (#5);
}

\newcommand{\bgComponentWithBondMarkupTagged} [8] {
	%1 Node style
	%2 Node reference
	%3 Node name
	%4 Position
	%5 Position reference
	%6 Bond style
	%7 Markup style
	%8 Tag
	\ifthenelse{\equal{#4}{right of=}\or\equal{#4}{left of=}}%
	{ %Place label above and below
		\node [#1] (#2) [#4 #5] {#3}
			edge [#6] node [font=\scriptsize,above=0.75ex]{#8} node [#7] {} (#5);
	}{ %Place labels left and right
		\node [#1] (#2) [#4 #5] {#3}
			edge [#6] node [font=\scriptsize, left=0.75ex]{#8} node [#7] {} (#5);
	}
}