diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index 6ec31a3c67e0128aaf7ec3bf50099ece94d57901..cb40b0189eff1dad5a457a1aca5621760f12916c 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -97,35 +97,68 @@ simulation results to model data. #+name: graph-architecture #+header: :results drawer #+header: :exports results -#+header: :post attr_wrap(width="9cm", data=*this*, name="graph-architecture", caption="Pamhyr2 Model/View architecture scheme (inspired by Qt Model/View architecture [[https://doc.qt.io/qt-5/model-view-programming.html]])", float="t") +#+header: :post attr_wrap(width="12cm", data=*this*, name="graph-architecture", caption="Pamhyr2 Model/View architecture scheme (inspired by Qt Model/View architecture [[https://doc.qt.io/qt-5/model-view-programming.html]])", float="t") #+begin_src dot :file "images/graph-architecture.png" :cache no digraph { bgcolor="transparent"; node[colorscheme=set19,shape=box,style="filled",fillcolor=white]; + edge[colorscheme=set19,color=0]; + + root[style=invis]; + + subgraph cluster0 { + label="File System" + style=dashed; + + save[label="Pamhyr save",fillcolor="9",shape=note]; + sbin[label="Solver binary",fillcolor="9",shape=note]; + configfile[label="Pamhyr configuration file",fillcolor="9",shape=note]; + } - save[label="Pamhyr save",fillcolor="9",shape=note]; - model[label="Model",fillcolor="2"]; - view[label="View",fillcolor="1"]; - delegate[label="Delegate",fillcolor="3"]; - action[label="Action",fillcolor="3"]; - solver[label="Solver",fillcolor="6"]; - undocommand[label="Command",fillcolor="4"]; user[label="User",shape=ellipse]; - model -> save[label="Save"]; - save -> model[label="Load"]; + subgraph cluster1 { + label="Pamhyr2"; + + config[label="Configuration",fillcolor="5"]; + model[label="Model",fillcolor="2"]; + view[label="View",fillcolor="1"]; + delegate[label="Delegate",fillcolor="3"]; + action[label="Action",fillcolor="3"]; + solver[label="Solver",fillcolor="6"]; + undocommand[label="Command",fillcolor="4"]; + } + + root -> model[style=invis]; + root -> config[style=invis]; + + model -> save[dir=both,label="Save/Load"]; + config -> configfile[dir=both,label="Save/Load"]; + + undocommand -> solver[style=invis]; + action -> solver[style=invis]; + delegate -> solver[style=invis]; model -> view[label="Rendering"]; view -> delegate[label="Rendering"]; delegate -> undocommand[label="Create"]; - action -> undocommand[label="Create"]; + action -> undocommand[label="Create/use"]; action -> solver[label="Run"]; - solver -> model[label="Add results"]; + solver -> model[dir=both,label="Export/Results",labelangle=0,labelfloat=true,constraint=true]; + solver -> sbin[dir=both,label="Execute/Results"]; undocommand -> model[label="Modify"]; view -> user[label="Vizualize"]; user -> delegate[label="Modify"]; - user -> action[label="Activate"]; + user -> action[label="Triggere"]; + + config -> solver[label="Create",style=dashed,labelfloat=true,constraint=true]; + //model -> config[style=invis]; + config -> model[style=invis]; + delegate -> action[style=invis]; + save -> configfile[style=invis]; + root -> solver[style=invis]; + user -> solver[style=invis]; } #+end_src @@ -134,6 +167,12 @@ All the model source code are in the directory {{{file(src/Model)}}} delegate and command are in {{{file(src/View)}}} (see section [[View]]). Solvers classes are in {{{file(src/Solver)}}} (see section [[Solver]]). +The following sub section show examples of main {{{pamhyr}}} internal +class for view componants, but this documentation is not exhaustive, +be free to watch existing code for more details and examples. In, +addition some features are not factorise and must be implemented from +scratch (directly with Qt for example). + [fn:qt-mv] The Qt Model/View documentation web page: https://doc.qt.io/qt-5/model-view-programming.html @@ -419,7 +458,7 @@ A abstract class PamhyrModelDict is available and provide some of basic methods for object dictionary in Model. This class is like PamhyrModelList but use a dictionary instead of list. -** TODO View +** View Pamhyr2 use Qt as graphical user interface library with the application "Qt designer" for windows or widget creation (see [[UI file]]) @@ -593,6 +632,8 @@ action. In PamhyrWindow (and PamhyrDialog) the undo stack is automatically create if the option ="undo"= is activate at window creation, this stack is accessible at =self._undo_stack=. +#+NAME: undo-cmd-push +#+CAPTION: Example of UndoCommand push into an undo stack. #+begin_src python :python python3 :results output :noweb yes self._undo_stack.push( AddNodeCommand( @@ -633,18 +674,128 @@ data has changed. ** TODO Solver +#+name: graph-multi-solver +#+header: :results drawer +#+header: :exports results +#+header: :post attr_wrap(width="12cm", data=*this*, name="graph-multi-solver", caption="Scheme of multiple solver configured, one Rubarbe solver and two Mage solver with one on local machine and one on a distant machine accessed over ssh", float="t") +#+begin_src dot :file "images/graph-multi-solver.png" :cache no + digraph { + bgcolor="transparent"; + node[colorscheme=set19,shape=box,style="filled",fillcolor=9]; + edge[colorscheme=set19,color=0]; + + subgraph cluster00 { + label="User personal computer"; + style=solid; + + subgraph cluster0 { + label="Pamhyr2"; + style=solid; + + // subgraph cluster01 { + // label="Core"; + //model[label="Model", fillcolor=2]; + //view[label="View", fillcolor=1]; + config[label="Configuration", fillcolor=5]; + + // view -> model -> view; + // } + + subgraph cluster02 { + label="Solver"; + style=dashed; + subgraph cluster021 { + label="Solver Classes"; + classSolverM7[label="Mage7", fillcolor=6]; + classSolverM8[label="Mage8", fillcolor=6]; + classSolverR[label="RubarBE", fillcolor=6]; + } + //classSolverX[label="Solver X Binding", fillcolor=6]; + + subgraph cluster022 { + label="Solver Object"; + solverM[label="Mage", fillcolor=6]; + solverM2[label="Mage over ssh", fillcolor=6]; + solverR[label="RubarBE", fillcolor=6]; + //solverX[label="Solver X", fillcolor=6]; + } + + classSolverM8 -> solverM [style=dashed]; + classSolverM8 -> solverM2[style=dashed]; + classSolverR -> solverR[style=dashed]; + //classSolverX -> solverX[style=dashed]; + } + + //config -> solverM[style="dotted"]; + //config -> solverR[style="dotted"]; + //config -> solverX[style="dotted"]; + + //model -> solverM; + //model -> solverM2; + //model -> solverR; + //model -> solverX; + } + + subgraph cluster1 { + label="File System"; + style=dashed; + + mage[label="Mage Binary",shape=note]; + //X[label="Solver X Binary"]; + rubarbe[label="RubarBE Binary",shape=note]; + ssh[label="ssh",shape=note]; + } + } + + //config -> X[style=invis]; + //model -> config[style=invis]; + config -> solverM[label="",constraint=true]; + //config -> solverX[label="",constraint=true]; + config -> solverR[label="",constraint=true]; + config -> solverM2[label="",constraint=true]; + + subgraph cluster2 { + label="Distant server"; + style=solid; + + sshd[label="sshd"]; + + subgraph cluster21 { + label="File System"; + style=dashed; + + mage2[label="Mage Binary",shape=note]; + } + } + + solverM -> mage[label="", color=1]; + mage -> solverM[label="", color=2]; + + //solverX -> X[label="", color=1]; + //X -> solverX[label="", color=2]; + + solverR -> rubarbe[label="", color=1]; + rubarbe -> solverR[label="", color=2]; + + solverM2 -> ssh -> sshd -> mage2[label="", color=1]; + mage2 -> sshd -> ssh -> solverM2[label="", color=2]; + } +#+end_src + + #+name: graph-pipeline #+header: :results drawer #+header: :exports results -#+header: :post attr_wrap(width="12cm", data=*this*, name="graph-pipeline", caption="Pamhyr2 solver execution pipeline architecture scheme", float="t") +#+header: :post attr_wrap(width="10cm", data=*this*, name="graph-pipeline", caption="Pamhyr2 solver execution pipeline architecture scheme", float="t") #+begin_src dot :file "images/graph-pipeline.png" :cache no digraph { bgcolor="transparent"; node[colorscheme=set19,shape=box,style="filled",fillcolor=9]; + edge[colorscheme=set19,color=0]; subgraph cluster0 { label="Pamhyr2" - config[label="Config",fillcolor=5]; + config[label="Configuration",fillcolor=5]; model[label="Model",fillcolor=2]; obj[label="Solver",fillcolor=6]; results[label="Results",fillcolor=2]; @@ -658,18 +809,86 @@ data has changed. obj -> model[style="dashed"]; subgraph cluster1{ - label="System"; + label="File System"; + style=dashed; in[label="Solver input files",shape=note]; out[label="Solver output files",shape=note]; bin[label="Solver binary",shape=note]; } - obj -> in[label="Write (1)"]; - obj -> bin[label="Execute (2)"]; - bin -> in[label="Read (2.1)"]; - bin -> out[label="Write (2.2)"]; - obj -> results[label="Create (3)"]; - obj -> out[label="Read (3.1)"]; + obj -> in[label="Write (1)",color=1]; + obj -> bin[label="Execute (2)",color=1]; + bin -> in[label="Read (2.1)",color=1]; + bin -> out[label="Write (2.2)",color=2]; + obj -> results[label="Create (3)",color=2]; + obj -> out[label="Read (3.1)", color=2]; + view -> model[style="dashed"]; + view -> results[style="dashed"]; + } +#+end_src + +#+name: graph-pipeline-generic +#+header: :results drawer +#+header: :exports results +#+header: :post attr_wrap(width="12cm", data=*this*, name="graph-pipeline-generic", caption="Pamhyr2 generic solver execution pipeline architecture scheme", float="t") +#+begin_src dot :file "images/graph-pipeline-generic.png" :cache no + digraph { + bgcolor="transparent"; + node[colorscheme=set19,shape=box,style="filled",fillcolor=9]; + edge[colorscheme=set19,color=0]; + + subgraph cluster0 { + label="Pamhyr2" + config[label="Configuration",fillcolor=5]; + model[label="Model",fillcolor=2]; + obj[label="Generic solver",fillcolor=6]; + results[label="Results",fillcolor=2]; + view[label="View",fillcolor=1]; + + results -> model[style="dashed"]; + results -> obj[style="dashed"]; + } + + config -> obj[label=""]; + obj -> model[style="dashed"]; + + subgraph cluster1{ + label="File System"; + style=dashed; + + gin[label="Generic input file", shape=note,fillcolor=white]; + ibin[label="Input formater", shape=note]; + in[label="Solver input files",shape=note,fillcolor=white]; + out[label="Solver output files",shape=note,fillcolor=white]; + gout[label="Generic results file",shape=note,fillcolor=white]; + obin[label="Output formater", shape=note]; + bin[label="Solver binary",shape=note]; + } + + gin -> ibin[style=invis]; + ibin -> bin -> obin[style=invis]; + in -> bin[style=invis]; + obin -> gout[style=invis]; + + // Input format + obj -> gin[label="Write (1)",color=1]; + obj -> ibin[label="Execute (2)",color=1,style=dashed]; + ibin -> gin[label="Read (2.1)",color=1]; + ibin -> in[label="Write (2.2)",color=1]; + + // Solve + obj -> bin[label="Execute (3)",color=1,style=dashed]; + bin -> in[label="Read (3.1)",color=1]; + bin -> out[label="Write (3.2)",color=2]; + + // Output format + obj -> obin[label="Execute (4)",color=2,style=dashed]; + obin -> out[label="Read (4.1)",color=2]; + obin -> gout[label="Write (4.2)",color=2]; + + // Read results + obj -> results[label="Create (5)",color=2]; + obj -> gout[label="Read (5.1)", color=2]; view -> model[style="dashed"]; view -> results[style="dashed"]; }