Unverified Commit 93548bf1 authored by Merwane Bouri's avatar Merwane Bouri
Browse files
parents 16baf339 3749517c
Pipeline #79370 canceled with stage
...@@ -115,13 +115,20 @@ ...@@ -115,13 +115,20 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="minimum">
<number>1</number>
</property>
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QSpinBox" name="simSpeedSpinbox"/> <widget class="QSpinBox" name="simSpeedSpinbox">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item> </item>
</layout> </layout>
</item> </item>
......
...@@ -34,6 +34,8 @@ private slots: ...@@ -34,6 +34,8 @@ private slots:
void loadStateID(unsigned int); // La fonction idPath permet de parcourir la liste des états et d'avoir un affiche du nom et de la couleur sur l'interface void loadStateID(unsigned int); // La fonction idPath permet de parcourir la liste des états et d'avoir un affiche du nom et de la couleur sur l'interface
void pickColor(); void pickColor();
void on_state_label_textEdited(const QString &arg1);
private: private:
Ui::ColorLabel *ui; Ui::ColorLabel *ui;
Alphabet a; Alphabet a;
......
...@@ -16,6 +16,7 @@ Cette classe représente le widget utilisé pour l'affichage et l'interaction av ...@@ -16,6 +16,7 @@ Cette classe représente le widget utilisé pour l'affichage et l'interaction av
#include <QFrame> #include <QFrame>
#include <QGraphicsView> #include <QGraphicsView>
#include <QLabel>
#include <QGraphicsRectItem> #include <QGraphicsRectItem>
...@@ -156,6 +157,7 @@ private: ...@@ -156,6 +157,7 @@ private:
void select_all(); void select_all();
void click_on(Coord coord); void click_on(Coord coord);
void update_current_mouse_pos(Coord coord);
const QPixmap &grid_pixmap() const; const QPixmap &grid_pixmap() const;
...@@ -173,7 +175,9 @@ private: ...@@ -173,7 +175,9 @@ private:
History m_undo_history; History m_undo_history;
QImage m_grid_image; QImage m_grid_image;
QPixmap m_grid_pixmap; QPixmap m_grid_pixmap;
QLabel* m_mouse_pos_label;
Grid m_grid; Grid m_grid;
Coord m_last_mouse_pos;
bool m_in_toggle_mode; bool m_in_toggle_mode;
std::vector<std::pair<unsigned, unsigned>> m_toggle_states; std::vector<std::pair<unsigned, unsigned>> m_toggle_states;
std::vector<QGraphicsRectItem*> m_selection_rects; std::vector<QGraphicsRectItem*> m_selection_rects;
......
...@@ -59,8 +59,6 @@ private slots: ...@@ -59,8 +59,6 @@ private slots:
//! \brief Créer une nouvelle grille ayant des états aléatoire //! \brief Créer une nouvelle grille ayant des états aléatoire
void on_randomPatternButton_clicked(); void on_randomPatternButton_clicked();
void on_nbrStatesComboBox_currentTextChanged(const QString &arg1);
//! \brief Applique l'état sélectionné aux cellules sélectionnées de la GridView //! \brief Applique l'état sélectionné aux cellules sélectionnées de la GridView
void on_drawCellButton_clicked(); void on_drawCellButton_clicked();
...@@ -113,16 +111,28 @@ private: ...@@ -113,16 +111,28 @@ private:
//! \brief Charge la grille depuis une image. //! \brief Charge la grille depuis une image.
void load_from_image(); void load_from_image();
//! \brief Charge un nouvel alphabet et met à jour l'UI.
void ui_update_alphabet(const Alphabet& alph); void ui_update_alphabet(const Alphabet& alph);
//! \brief Essaie de charger l'état de l'application si il a été sauvegardé.
//! \returns True si le chargement a été réussi, false sinon.
bool try_load_saved_state();
//! \brief Sauvegarde la configuration actuelle. //! \brief Sauvegarde la configuration actuelle.
void save_grid_configuration(); void save_grid_configuration();
//! \brief Charge une configuration liée au modèle donné. //! \brief Charge une configuration liée au modèle donné.
void load_grid_configuration(); void load_grid_configuration(const QJsonObject &configuration);
//! \brief Retourne le modèle par défaut à charger //! \brief Retourne le modèle par défaut à charger
QJsonObject default_model() const; QJsonObject default_model() const;
//! \brief Retourne la configuration par défaut à charger
QJsonObject default_configuration() const;
protected:
void closeEvent(QCloseEvent* e) override;
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
Simulation simulation; Simulation simulation;
......
...@@ -16,22 +16,24 @@ class NeighborhoodDialog : public QDialog ...@@ -16,22 +16,24 @@ class NeighborhoodDialog : public QDialog
Coord currentPoint; Coord currentPoint;
public: public:
explicit NeighborhoodDialog(QWidget *parent = nullptr); explicit NeighborhoodDialog(Neighborhood& n, QWidget *parent = nullptr);
~NeighborhoodDialog(); ~NeighborhoodDialog();
void ResizeCreateGrid(int x, int y, Neighborhood& n);
//! \brief Retourne le voisinage
Neighborhood* getVoisinage() const;
GridView& getGridView() const ;
public slots: public slots:
Neighborhood& getNeighborhood() const; Neighborhood* getNeighborhood() const;
protected: protected:
void done(int r); void done(int r);
private slots: private slots:
void on_validateGridDim_2_clicked();
void on_heightSpinBox_2_valueChanged(int arg1);
void on_widthSpinBox_2_valueChanged(int arg1);
private: private:
Ui::NeighborhoodDialog *ui; Ui::NeighborhoodDialog *ui;
}; };
......
...@@ -17,7 +17,8 @@ Contient la classe de la règle de Moore (semblable à VonNeumann avec les diago ...@@ -17,7 +17,8 @@ Contient la classe de la règle de Moore (semblable à VonNeumann avec les diago
//! \brief Voisinage de Moore. //! \brief Voisinage de Moore.
class mooreNeighborhoodRule : public NeighborhoodRule class mooreNeighborhoodRule : public NeighborhoodRule
{ {
NeighborhoodFormat format; mutable NeighborhoodFormat format;
mutable int current_format_radius;
public: public:
mooreNeighborhoodRule(int _radius = 1); mooreNeighborhoodRule(int _radius = 1);
...@@ -29,6 +30,9 @@ public: ...@@ -29,6 +30,9 @@ public:
//! \return Retourne les formats de voisinage possible dans un std::vector. //! \return Retourne les formats de voisinage possible dans un std::vector.
std::vector<NeighborhoodFormat> getFormats() const; std::vector<NeighborhoodFormat> getFormats() const;
private:
void update_format() const;
private: private:
//! \brief Rayon du voisinage (en nombre de cellule) //! \brief Rayon du voisinage (en nombre de cellule)
DEFINE_CONFIGURABLE_PROPERTY(IntegerProperty, radius, "Radius", 1); DEFINE_CONFIGURABLE_PROPERTY(IntegerProperty, radius, "Radius", 1);
......
...@@ -17,7 +17,8 @@ Contient la classe de la règle de Von Neumann. ...@@ -17,7 +17,8 @@ Contient la classe de la règle de Von Neumann.
//! \brief Voisinage de Von Neumann. //! \brief Voisinage de Von Neumann.
class vonNeumannNeighborhoodRule : public NeighborhoodRule class vonNeumannNeighborhoodRule : public NeighborhoodRule
{ {
NeighborhoodFormat format; mutable NeighborhoodFormat format;
mutable int current_format_radius;
public: public:
vonNeumannNeighborhoodRule(int _radius = 1); vonNeumannNeighborhoodRule(int _radius = 1);
...@@ -29,6 +30,9 @@ public: ...@@ -29,6 +30,9 @@ public:
//! \return Retourne les formats de voisinage possible dans un std::vector. //! \return Retourne les formats de voisinage possible dans un std::vector.
std::vector<NeighborhoodFormat> getFormats() const; std::vector<NeighborhoodFormat> getFormats() const;
private:
void update_format() const;
private: private:
//! \brief Rayon du voisinage (en nombre de cellule) //! \brief Rayon du voisinage (en nombre de cellule)
DEFINE_CONFIGURABLE_PROPERTY(IntegerProperty, radius, "Radius", 1); DEFINE_CONFIGURABLE_PROPERTY(IntegerProperty, radius, "Radius", 1);
......
...@@ -46,10 +46,10 @@ public: ...@@ -46,10 +46,10 @@ public:
//! \return Retourne les formats de voisinage possible dans un std::vector. //! \return Retourne les formats de voisinage possible dans un std::vector.
virtual std::vector<NeighborhoodFormat> getFormats() const = 0; virtual std::vector<NeighborhoodFormat> getFormats() const = 0;
//! \brief Fait avancer l'état de la règle de voisinage d'une génération //! \brief Change le numéro de génération de la règle de voisinage d'une génération
// Fait avancer l'état de la règle de voisinage d'une génération. Cette fonction est utilisée pour les voisinages tels que celui de Margolus, qui dépendent de la parité de la génération actuelle. //! Fait avancer ou reculer l'état de la règle de voisinage d'une génération. Cette fonction est utilisée pour les voisinages tels que celui de Margolus, qui dépendent de la parité de la génération actuelle.
// \remark L'implémentation par défaut ne fait rien. //! \remark L'implémentation par défaut ne fait rien.
virtual void step() {} virtual void update_generation(unsigned gen) {}
}; };
#endif // NEIGHBORHOODRULE_HPP #endif // NEIGHBORHOODRULE_HPP
...@@ -16,6 +16,7 @@ Fichier contenant diverses classes filles de PropertyVisitor permettant l'affich ...@@ -16,6 +16,7 @@ Fichier contenant diverses classes filles de PropertyVisitor permettant l'affich
#include <QVariant> #include <QVariant>
#include "property.hpp" #include "property.hpp"
#include "neighborhoodDialog.hpp"
//! \brief Exception lancée lors d'une erreur liée aux visiteurs de propriétés. //! \brief Exception lancée lors d'une erreur liée aux visiteurs de propriétés.
class PropertyVisitorException : public std::exception class PropertyVisitorException : public std::exception
...@@ -51,6 +52,7 @@ private: ...@@ -51,6 +52,7 @@ private:
QWidget* current_widget(); QWidget* current_widget();
void push_array_widget(const Property& prop); void push_array_widget(const Property& prop);
QWidget *pop_widget(); QWidget *pop_widget();
NeighborhoodDialog* neighborhoodDialog;
private: private:
void visit(StringProperty& str); void visit(StringProperty& str);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
\brief Structure \brief Structure
Fichier contenant la classe Structure, représentant un ensemble de cellules constituant une structure. Fichier contenant la classe Structure, représentant un ensemble de cellules constituant une structure.
**/ **/
#ifndef STRUCTURE_HPP #ifndef STRUCTURE_HPP
#define STRUCTURE_HPP #define STRUCTURE_HPP
...@@ -18,13 +18,13 @@ Fichier contenant la classe Structure, représentant un ensemble de cellules con ...@@ -18,13 +18,13 @@ Fichier contenant la classe Structure, représentant un ensemble de cellules con
#include "coord.hpp" #include "coord.hpp"
/** /**
\class Structure \class Structure
\brief Représente une structure \brief Représente une structure
Cette classe permet de représenter un ensemble de cellules constituant une structure, comme un oscillateur ou un glider. Cette classe permet de représenter un ensemble de cellules constituant une structure, comme un oscillateur ou un glider.
**/ **/
class Structure class Structure
{ {
public: public:
//! Titre de la structure //! Titre de la structure
...@@ -40,7 +40,10 @@ public: ...@@ -40,7 +40,10 @@ public:
public: public:
//! \brief Constructeur par défaut, représente une structure vide. //! \brief Constructeur par défaut, représente une structure vide.
Structure() = default; Structure()
{
top_left = {0, 0};
}
//! \brief Constructeur acceptant deux itérateurs en argument, pointant vers des std::pair de coordonées et de valeur d'état. Appelle 'load<It>(begin, end)'. //! \brief Constructeur acceptant deux itérateurs en argument, pointant vers des std::pair de coordonées et de valeur d'état. Appelle 'load<It>(begin, end)'.
//! \pre It doit pointer vers un std::pair<Coord, int>. //! \pre It doit pointer vers un std::pair<Coord, int>.
...@@ -56,12 +59,13 @@ public: ...@@ -56,12 +59,13 @@ public:
void load(It begin, It end) void load(It begin, It end)
{ {
static_assert (std::is_same<typename std::remove_reference<decltype(*begin)>::type, std::pair<Coord, unsigned>>::value || static_assert (std::is_same<typename std::remove_reference<decltype(*begin)>::type, std::pair<Coord, unsigned>>::value ||
std::is_same<typename std::remove_reference<decltype(*begin)>::type, std::pair<const Coord, unsigned>>::value, std::is_same<typename std::remove_reference<decltype(*begin)>::type, std::pair<const Coord, unsigned>>::value,
"Iterator value type must be std::pair<Coord, unsigned>"); "Iterator value type must be std::pair<Coord, unsigned>");
int min_x, min_y, max_x, max_y; int min_x, min_y, max_x, max_y;
min_x = min_y = std::numeric_limits<int>::max(); min_x = min_y = std::numeric_limits<int>::max();
max_x = max_y = std::numeric_limits<int>::min(); max_x = max_y = std::numeric_limits<int>::min();
bool empty = true;
// Première passe pour calculer les positions minimales et maximales // Première passe pour calculer les positions minimales et maximales
for (auto it = begin; it != end; ++it) for (auto it = begin; it != end; ++it)
{ {
...@@ -69,13 +73,20 @@ public: ...@@ -69,13 +73,20 @@ public:
if (it->second == 0) if (it->second == 0)
continue; continue;
empty = false;
if (it->first.x > max_x) max_x = it->first.x; if (it->first.x > max_x) max_x = it->first.x;
if (it->first.x < min_x) min_x = it->first.x; if (it->first.x < min_x) min_x = it->first.x;
if (it->first.y > max_y) max_y = it->first.y; if (it->first.y > max_y) max_y = it->first.y;
if (it->first.y < min_y) min_y = it->first.y; if (it->first.y < min_y) min_y = it->first.y;
} }
top_left.x = min_x; top_left.y = min_y; if (empty)
top_left = {0, 0};
else
{
top_left.x = min_x; top_left.y = min_y;
}
m_width = max_x - min_x + 1; m_width = max_x - min_x + 1;
m_height = max_y - min_y + 1; m_height = max_y - min_y + 1;
......
{
"alphabet": [
{
"color": [
255,
255,
0
],
"name": "0"
},
{
"color": [
255,
215,
135
],
"name": "1"
},
{
"color": [
255,
170,
0
],
"name": "2"
},
{
"color": [
255,
0,
0
],
"name": "3"
}
],
"author": "JM",
"date": "dim. juin 6 2021",
"desc": "Automate cellulaire de Griffeath.",
"neighborhood_data": {
"radius": 1
},
"neighborhood_name": "Moore",
"title": "griffeath",
"transition_data": {
"rule_string": "i, (i+1)%4:[3..*] -> (i+1)%4"
},
"transition_name": "Totalistic rulestring"
}
{
"alphabet": [
{
"color": [
255,
255,
255
],
"name": "Dead"
},
{
"color": [
0,
0,
255
],
"name": "Alive"
}
],
"author": "JM",
"date": "jeu. juin 3 2021",
"desc": "Langston's Loops.\n!!CORRIGER L'ALPHABET!!",
"neighborhood_data": {
"radius": 1
},
"neighborhood_name": "Von Neumann",
"title": "langston_loops",
"transition_data": {
"rule_string": "rotate4\n0,0,0,0,0->0\n0,0,0,0,1->2\n0,0,0,0,2->0\n0,0,0,0,3->0\n0,0,0,0,5->0\n0,0,0,0,6->3\n0,0,0,0,7->1\n0,0,0,1,1->2\n0,0,0,1,2->2\n0,0,0,1,3->2\n0,0,0,2,1->2\n0,0,0,2,2->0\n0,0,0,2,3->0\n0,0,0,2,6->2\n0,0,0,2,7->2\n0,0,0,3,2->0\n0,0,0,5,2->5\n0,0,0,6,2->2\n0,0,0,7,2->2\n0,0,1,0,2->2\n0,0,1,1,2->0\n0,0,2,0,2->0\n0,0,2,0,3->0\n0,0,2,0,5->0\n0,0,2,1,2->5\n0,0,2,2,2->0\n0,0,2,3,2->2\n0,0,5,2,2->2\n0,1,2,3,2->1\n0,1,2,4,2->1\n0,1,2,5,2->5\n0,1,2,6,2->1\n0,1,2,7,2->1\n0,1,2,7,5->1\n0,1,4,2,2->1\n0,1,4,3,2->1\n0,1,4,4,2->1\n0,1,4,7,2->1\n0,1,6,2,5->1\n0,1,7,2,2->1\n0,1,7,2,5->5\n0,1,7,5,2->1\n0,1,7,6,2->1\n0,1,7,7,2->1\n0,2,5,2,7->1\n1,0,0,0,1->1\n1,0,0,0,6->1\n1,0,0,0,7->7\n1,0,0,1,1->1\n1,0,0,1,2->1\n1,0,0,2,1->1\n1,0,0,2,4->4\n1,0,0,2,7->7\n1,0,0,5,1->1\n1,0,1,0,1->1\n1,0,1,1,1->1\n1,0,1,2,4->4\n1,0,1,2,7->7\n1,0,2,0,2->6\n1,0,2,1,2->1\n1,0,2,2,1->1\n1,0,2,2,4->4\n1,0,2,2,6->3\n1,0,2,2,7->7\n1,0,2,3,2->7\n1,0,2,4,2->4\n1,0,2,6,2->6\n1,0,2,6,4->4\n1,0,2,6,7->7\n1,0,2,7,1->0\n1,0,2,7,2->7\n1,0,5,4,2->7\n1,1,1,1,2->1\n1,1,1,2,2->1\n1,1,1,2,4->4\n1,1,1,2,5->1\n1,1,1,2,6->1\n1,1,1,2,7->7\n1,1,1,5,2->2\n1,1,2,1,2->1\n1,1,2,2,2->1\n1,1,2,2,4->4\n1,1,2,2,5->1\n1,1,2,2,7->7\n1,1,2,3,2->1\n1,1,2,4,2->4\n1,1,2,6,2->1\n1,1,2,7,2->7\n1,1,3,2,2->1\n1,2,2,2,4->4\n1,2,2,2,7->7\n1,2,2,4,3->4\n1,2,2,5,4->7\n1,2,3,2,4->4\n1,2,3,2,7->7\n1,2,4,2,5->5\n1,2,4,2,6->7\n1,2,5,2,7->5\n2,0,0,0,1->2\n2,0,0,0,2->2\n2,0,0,0,4->2\n2,0,0,0,7->1\n2,0,0,1,2->2\n2,0,0,1,5->2\n2,0,0,2,1->2\n2,0,0,2,2->2\n2,0,0,2,3->2\n2,0,0,2,4->2\n2,0,0,2,5->0\n2,0,0,2,6->2\n2,0,0,2,7->2\n2,0,0,3,2->6\n2,0,0,4,2->3\n2,0,0,5,1->7\n2,0,0,5,2->2\n2,0,0,5,7->5\n2,0,0,7,2->2\n2,0,1,0,2->2\n2,0,1,1,2->2\n2,0,1,2,2->2\n2,0,1,4,2->2\n2,0,1,7,2->2\n2,0,2,0,2->2\n2,0,2,0,3->2\n2,0,2,0,5->2\n2,0,2,0,7->3\n2,0,2,1,2->2\n2,0,2,1,5->2\n2,0,2,2,1->2\n2,0,2,2,2->2\n2,0,2,2,7->2\n2,0,2,3,2->1\n2,0,2,4,2->2\n2,0,2,4,5->2\n2,0,2,5,2->0\n2,0,2,5,5->2\n2,0,2,6,2->2\n2,0,2,7,2->2\n2,0,3,1,2->2\n2,0,3,2,1->6\n2,0,3,2,2->6\n2,0,3,4,2->2\n2,0,4,2,2->2\n2,0,5,1,2->2\n2,0,5,2,1->2\n2,0,5,2,2->2\n2,0,5,5,2->1\n2,0,5,7,2->5\n2,0,6,2,2->2\n2,0,6,7,2->2\n2,0,7,1,2->2\n2,0,7,2,2->2\n2,0,7,4,2->2\n2,0,7,7,2->2\n2,1,1,2,2->2\n2,1,1,2,6->1\n2,1,2,2,2->2\n2,1,2,2,4->2\n2,1,2,2,6->2\n2,1,2,2,7->2\n2,1,4,2,2->2\n2,1,5,2,2->2\n2,1,6,2,2->2\n2,1,7,2,2->2\n2,2,2,2,7->2\n2,2,2,4,4->2\n2,2,2,4,6->2\n2,2,2,7,6->2\n2,2,2,7,7->2\n3,0,0,0,1->3\n3,0,0,0,2->2\n3,0,0,0,4->1\n3,0,0,0,7->6\n3,0,0,1,2->3\n3,0,0,4,2->1\n3,0,0,6,2->2\n3,0,1,0,2->1\n3,0,1,2,2->0\n3,0,2,5,1->1\n4,0,1,1,2->0\n4,0,1,2,2->0\n4,0,1,2,5->0\n4,0,2,1,2->0\n4,0,2,2,2->1\n4,0,2,3,2->6\n4,0,2,5,2->0\n4,0,3,2,2->1\n5,0,0,0,2->2\n5,0,0,2,1->5\n5,0,0,2,2->5\n5,0,0,2,3->2\n5,0,0,2,7->2\n5,0,0,5,2->0\n5,0,2,0,2->2\n5,0,2,1,2->2\n5,0,2,1,5->2\n5,0,2,2,2->0\n5,0,2,2,4->4\n5,0,2,7,2->2\n5,1,2,1,2->2\n5,1,2,2,2->0\n5,1,2,4,2->2\n5,1,2,7,2->2\n6,0,0,0,1->1\n6,0,0,0,2->1\n6,0,2,1,2->0\n6,1,2,1,2->5\n6,1,2,1,3->1\n6,1,2,2,2->5\n7,0,0,0,7->7\n7,0,1,1,2->0\n7,0,1,2,2->0\n7,0,1,2,5->0\n7,0,2,1,2->0\n7,0,2,2,2->1\n7,0,2,2,5->1\n7,0,2,3,2->1\n7,0,2,5,2->5\n7,0,2,7,2->0"
},
"transition_name": "Non isotropic rulestring"
}
{
"alphabet": [
{
"color": [
0,
0,
0
],
"name": "Background"
},
{
"color": [
0,
0,
255
],
"name": "Core"
},
{
"color": [
255,
0,
0
],
"name": "Sheath"
},
{
"color": [
0,
170,
0
],
"name": "Green"
},
{
"color": [
255,
255,
0
],
"name": "Yellow"
},
{
"color": [
255,
85,
255
],
"name": "Pink"
},
{
"color": [
255,
255,
255
],
"name": "White"
},
{
"color": [
0,
255,
255
],
"name": "Cyan"
}
],
"author": "JM",
"date": "dim. juin 6 2021",
"desc": "",
"neighborhood_data": {
"radius": 1
},
"neighborhood_name": "Von Neumann",
"title": "langton",
"transition_data": {
"rule_string": "rotate4\n0,0,0,0,0->0\n0,0,1,0,0->2\n0,0,2,0,0->0\n0,0,3,0,0->0\n0,0,5,0,0->0\n0,0,6,0,0->3\n0,0,7,0,0->1\n0,0,1,0,1->2\n0,0,2,0,1->2\n0,0,3,0,1->2\n0,0,1,0,2->2\n0,0,2,0,2->0\n0,0,3,0,2->0\n0,0,6,0,2->2\n0,0,7,0,2->2\n0,0,2,0,3->0\n0,0,2,0,5->5\n0,0,2,0,6->2\n0,0,2,0,7->2\n0,0,2,1,0->2\n0,0,2,1,1->0\n0,0,2,2,0->0\n0,0,3,2,0->0\n0,0,5,2,0->0\n0,0,2,2,1->5\n0,0,2,2,2->0\n0,0,2,2,3->2\n0,0,2,5,2->2\n0,1,2,2,3->1\n0,1,2,2,4->1\n0,1,2,2,5->5\n0,1,2,2,6->1\n0,1,2,2,7->1\n0,1,5,2,7->1\n0,1,2,4,2->1\n0,1,2,4,3->1\n0,1,2,4,4->1\n0,1,2,4,7->1\n0,1,5,6,2->1\n0,1,2,7,2->1\n0,1,5,7,2->5\n0,1,2,7,5->1\n0,1,2,7,6->1\n0,1,2,7,7->1\n0,2,7,5,2->1\n1,0,1,0,0->1\n1,0,6,0,0->1\n1,0,7,0,0->7\n1,0,1,0,1->1\n1,0,2,0,1->1\n1,0,1,0,2->1\n1,0,4,0,2->4\n1,0,7,0,2->7\n1,0,1,0,5->1\n1,0,1,1,0->1\n1,0,1,1,1->1\n1,0,4,1,2->4\n1,0,7,1,2->7\n1,0,2,2,0->6\n1,0,2,2,1->1\n1,0,1,2,2->1\n1,0,4,2,2->4\n1,0,6,2,2->3\n1,0,7,2,2->7\n1,0,2,2,3->7\n1,0,2,2,4->4\n1,0,2,2,6->6\n1,0,4,2,6->4\n1,0,7,2,6->7\n1,0,1,2,7->0\n1,0,2,2,7->7\n1,0,2,5,4->7\n1,1,2,1,1->1\n1,1,2,1,2->1\n1,1,4,1,2->4\n1,1,5,1,2->1\n1,1,6,1,2->1\n1,1,7,1,2->7\n1,1,2,1,5->2\n1,1,2,2,1->1\n1,1,2,2,2->1\n1,1,4,2,2->4\n1,1,5,2,2->1\n1,1,7,2,2->7\n1,1,2,2,3->1\n1,1,2,2,4->4\n1,1,2,2,6->1\n1,1,2,2,7->7\n1,1,2,3,2->1\n1,2,4,2,2->4\n1,2,7,2,2->7\n1,2,3,2,4->4\n1,2,4,2,5->7\n1,2,4,3,2->4\n1,2,7,3,2->7\n1,2,5,4,2->5\n1,2,6,4,2->7\n1,2,7,5,2->5\n2,0,1,0,0->2\n2,0,2,0,0->2\n2,0,4,0,0->2\n2,0,7,0,0->1\n2,0,2,0,1->2\n2,0,5,0,1->2\n2,0,1,0,2->2\n2,0,2,0,2->2\n2,0,3,0,2->2\n2,0,4,0,2->2\n2,0,5,0,2->0\n2,0,6,0,2->2\n2,0,7,0,2->2\n2,0,2,0,3->6\n2,0,2,0,4->3\n2,0,1,0,5->7\n2,0,2,0,5->2\n2,0,7,0,5->5\n2,0,2,0,7->2\n2,0,2,1,0->2\n2,0,2,1,1->2\n2,0,2,1,2->2\n2,0,2,1,4->2\n2,0,2,1,7->2\n2,0,2,2,0->2\n2,0,3,2,0->2\n2,0,5,2,0->2\n2,0,7,2,0->3\n2,0,2,2,1->2\n2,0,5,2,1->2\n2,0,1,2,2->2\n2,0,2,2,2->2\n2,0,7,2,2->2\n2,0,2,2,3->1\n2,0,2,2,4->2\n2,0,5,2,4->2\n2,0,2,2,5->0\n2,0,5,2,5->2\n2,0,2,2,6->2\n2,0,2,2,7->2\n2,0,2,3,1->2\n2,0,1,3,2->6\n2,0,2,3,2->6\n2,0,2,3,4->2\n2,0,2,4,2->2\n2,0,2,5,1->2\n2,0,1,5,2->2\n2,0,2,5,2->2\n2,0,2,5,5->1\n2,0,2,5,7->5\n2,0,2,6,2->2\n2,0,2,6,7->2\n2,0,2,7,1->2\n2,0,2,7,2->2\n2,0,2,7,4->2\n2,0,2,7,7->2\n2,1,2,1,2->2\n2,1,6,1,2->1\n2,1,2,2,2->2\n2,1,4,2,2->2\n2,1,6,2,2->2\n2,1,7,2,2->2\n2,1,2,4,2->2\n2,1,2,5,2->2\n2,1,2,6,2->2\n2,1,2,7,2->2\n2,2,7,2,2->2\n2,2,4,2,4->2\n2,2,6,2,4->2\n2,2,6,2,7->2\n2,2,7,2,7->2\n3,0,1,0,0->3\n3,0,2,0,0->2\n3,0,4,0,0->1\n3,0,7,0,0->6\n3,0,2,0,1->3\n3,0,2,0,4->1\n3,0,2,0,6->2\n3,0,2,1,0->1\n3,0,2,1,2->0\n3,0,1,2,5->1\n4,0,2,1,1->0\n4,0,2,1,2->0\n4,0,5,1,2->0\n4,0,2,2,1->0\n4,0,2,2,2->1\n4,0,2,2,3->6\n4,0,2,2,5->0\n4,0,2,3,2->1\n5,0,2,0,0->2\n5,0,1,0,2->5\n5,0,2,0,2->5\n5,0,3,0,2->2\n5,0,7,0,2->2\n5,0,2,0,5->0\n5,0,2,2,0->2\n5,0,2,2,1->2\n5,0,5,2,1->2\n5,0,2,2,2->0\n5,0,4,2,2->4\n5,0,2,2,7->2\n5,1,2,2,1->2\n5,1,2,2,2->0\n5,1,2,2,4->2\n5,1,2,2,7->2\n6,0,1,0,0->1\n6,0,2,0,0->1\n6,0,2,2,1->0\n6,1,2,2,1->5\n6,1,3,2,1->1\n6,1,2,2,2->5\n7,0,7,0,0->7\n7,0,2,1,1->0\n7,0,2,1,2->0\n7,0,5,1,2->0\n7,0,2,2,1->0\n7,0,2,2,2->1\n7,0,5,2,2->1\n7,0,2,2,3->1\n7,0,2,2,5->5\n7,0,2,2,7->0"
},
"transition_name": "Non isotropic rulestring"
}
{
"author": "JM",
"cells": [
{
"state": 2,
"x": 1,
"y": 0
},
{
"state": 2,
"x": 2,
"y": 0
},
{
"state": 2,
"x": 3,
"y": 0
},
{
"state": 2,
"x": 4,
"y": 0
},
{
"state": 2,
"x": 5,
"y": 0
},
{
"state": 2,
"x": 6,