Ignore:
Timestamp:
06/23/16 00:15:59 (8 years ago)
Author:
Maciej Komosinski
Message:

Code formatting

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpp/frams/model/model.h

    r495 r522  
    1818//#define EASYMAPDEBUG
    1919
    20 enum ModelBuildStatus {empty,building,invalid,valid};
     20enum ModelBuildStatus { empty, building, invalid, valid };
    2121
    2222class MultiMap;
     
    2525
    2626/**
    27     "Model" is the skeleton of the Framsticks creature.
    28     This object can be used for 2 purposes:
    29      - you can build a creature from any supported Framsticks genotype
    30     format
    31      - or generate low level f0 genotype from existing construct.
    32 
    33     In both cases you have access to geometry and neuron net data.
    34     Using this standard class assures compatibility and good
    35     integration with core Framsticks engine.
    36 
    37     Model contains 3 kinds of objects:
    38     - Parts (class Part).
    39     - Joints (class Joint). Each Joint is connected with 2 Parts. (@see Joint::attachToParts()).
    40     - Neurons (class Neuro). Neuron can have 0 or more inputs - other neurons. (@see Neuro::addInput()).
    41       Each Neuron can be located on the physical structure, i.e. it can ba attached to Part or Joint
    42       (@see Neuro::attachToPart(), Neuro::attachToJoint()).
    43 
    44 \f[(dot)
    45 digraph Model
    46  {
    47   Joint1; Joint2;
    48   node [ shape=box ]
    49   Part1; Part2; Part3;
    50   Joint1 -> Part1; Joint1 -> Part2; Joint2 -> Part2; Joint2 -> Part3
    51   node [ shape=diamond ]
    52   Neuro1 -> Neuro2; Neuro1 -> Neuro3; Neuro2 -> Neuro2; Neuro3 -> Neuro2;
    53   Neuro1 -> Part1; Neuro2 -> Joint2;
    54  }
    55 \f]
    56 */
    57 
    58 class Model: public DestrBase
     27        "Model" is the skeleton of the Framsticks creature.
     28        This object can be used for 2 purposes:
     29        - you can build a creature from any supported Framsticks genotype
     30        format
     31        - or generate low level f0 genotype from existing construct.
     32
     33        In both cases you have access to geometry and neuron net data.
     34        Using this standard class assures compatibility and good
     35        integration with core Framsticks engine.
     36
     37        Model contains 3 kinds of objects:
     38        - Parts (class Part).
     39        - Joints (class Joint). Each Joint is connected with 2 Parts. (@see Joint::attachToParts()).
     40        - Neurons (class Neuro). Neuron can have 0 or more inputs - other neurons. (@see Neuro::addInput()).
     41        Each Neuron can be located on the physical structure, i.e. it can ba attached to Part or Joint
     42        (@see Neuro::attachToPart(), Neuro::attachToJoint()).
     43
     44        \f[(dot)
     45        digraph Model
     46        {
     47        Joint1; Joint2;
     48        node [ shape=box ]
     49        Part1; Part2; Part3;
     50        Joint1 -> Part1; Joint1 -> Part2; Joint2 -> Part2; Joint2 -> Part3
     51        node [ shape=diamond ]
     52        Neuro1 -> Neuro2; Neuro1 -> Neuro3; Neuro2 -> Neuro2; Neuro3 -> Neuro2;
     53        Neuro1 -> Part1; Neuro2 -> Joint2;
     54        }
     55        \f]
     56        */
     57
     58class Model : public DestrBase
    5959{
    60   protected:
    61 Geno geno,f0geno;
    62 char modelfromgenotype;
    63 char f0genoknown;
    64 /// make model map in build()
    65 bool autobuildmaps;
    66 /// valid if build from f0 genotype
    67 int f0errorposition;
    68 /// valid if build from f0 genotype
    69 int f0warnposition;
    70 
    71 ModelBuildStatus buildstatus;
    72 /// NULL if the map is not (yet) created
    73 MultiMap *map,*f0map;
    74 
    75 SList parts,joints,neurons;
    76 char partmappingchanged;
     60protected:
     61        Geno geno, f0geno;
     62        char modelfromgenotype;
     63        char f0genoknown;
     64        /// make model map in build()
     65        bool autobuildmaps;
     66        /// valid if build from f0 genotype
     67        int f0errorposition;
     68        /// valid if build from f0 genotype
     69        int f0warnposition;
     70
     71        ModelBuildStatus buildstatus;
     72        /// NULL if the map is not (yet) created
     73        MultiMap *map, *f0map;
     74
     75        SList parts, joints, neurons;
     76        char partmappingchanged;
    7777
    7878#ifdef MODEL_V1_COMPATIBLE
    79 /** NeuroCount value.
    80     compatibility_neurocount = -1 if its value is unknown and the layout is not compatible
    81     @see reorderToOldLayout()
    82 */
    83 int oldneurocount;
    84 char oldconnections;
    85 
    86 /** calculate oldNeuroCount */
    87 void calcOldNeuroCount();
    88 /** some new calls can invalidate old compatibility data */
    89 void invalidateOldNeuroCount() {oldneurocount=-1;}
    90 /**
    91    for compatibility with old NeuroClass the layout of Neurons
    92    is changed when old 'Neuro' accessing methods are in use.
    93    Neurons:
    94    0 .. compatibility_neurocount-1                : old Neurons (class "N")
    95    compatibility_neurocount .. neurons.size()-1   : other units
    96 */
    97 int reorderToOldLayout();
    98 
    99 /** check if compatibility should be preserved */
    100 int hasOldNeuroLayout() {return oldneurocount>=0;}
    101 
    102 /** add inputs to the old "-" units.
    103     @return 1=ok, 0=invalid input detected  */
    104 int addOldConnectionsInputs();
     79        /** NeuroCount value.
     80                compatibility_neurocount = -1 if its value is unknown and the layout is not compatible
     81                @see reorderToOldLayout()
     82                */
     83        int oldneurocount;
     84        char oldconnections;
     85
     86        /** calculate oldNeuroCount */
     87        void calcOldNeuroCount();
     88        /** some new calls can invalidate old compatibility data */
     89        void invalidateOldNeuroCount() {oldneurocount=-1;}
     90        /**
     91           for compatibility with old NeuroClass the layout of Neurons
     92           is changed when old 'Neuro' accessing methods are in use.
     93           Neurons:
     94           0 .. compatibility_neurocount-1                : old Neurons (class "N")
     95           compatibility_neurocount .. neurons.size()-1   : other units
     96           */
     97        int reorderToOldLayout();
     98
     99        /** check if compatibility should be preserved */
     100        int hasOldNeuroLayout() {return oldneurocount>=0;}
     101
     102        /** add inputs to the old "-" units.
     103                @return 1=ok, 0=invalid input detected  */
     104        int addOldConnectionsInputs();
    105105#endif
    106106
    107 void internalCopy(const Model &mod);
    108 
    109 /// make the model from current genotype
    110 void build();
    111 
    112 friend class NeuroNetFactory;
    113 friend class VisualModel;
    114 friend class GLVisualModel;
    115 friend class Creature;
    116 friend class PartBase;
    117 
    118 int checklevel;
    119 
    120   public:
    121 enum Shape {SHAPE_UNKNOWN,SHAPE_ILLEGAL,SHAPE_OLD,SHAPE_NEW};
    122   protected:
    123 Shape shape;
    124 
    125 void updateNeuroRefno(); // set Neuro::refno for all neurons
    126 SString nameForErrors() const;
    127 int internalcheck(int final);
    128 
    129 void moveNeuro(int oldpos,int newpos);
    130 
    131 void init(const Geno &srcgen);
    132 void init();
    133 
    134 void delMap();
    135 void delF0Map();
    136 void initMap();
    137 void initF0Map();
     107        void internalCopy(const Model &mod);
     108
     109        /// make the model from current genotype
     110        void build();
     111
     112        friend class NeuroNetFactory;
     113        friend class VisualModel;
     114        friend class GLVisualModel;
     115        friend class Creature;
     116        friend class PartBase;
     117
     118        int checklevel;
    138119
    139120public:
    140 /** get current model state.
    141 \f[(dot)
    142 digraph M
    143  {
    144  node [fontsize=12]
    145  edge [fontsize=10]
    146  building [label="building = can be modified"]
    147  valid -> building [label="open()"]
    148  building -> valid [label="close()"]
    149  invalid -> building [label="open()"]
    150  building -> invalid [label="close() [failed]"]
    151  empty -> building [label="open()"]
    152  }
    153 \f]
    154 */
    155 ModelBuildStatus getStatus() const {return buildstatus;}
    156 int isValid() const {return buildstatus==valid;}
    157 int getErrorPosition(bool includingwarnings=false);
    158 Shape getShape() {return shape;}
    159 
    160 void updateRefno(); // set ::refno for all elements
    161 
    162 /// The bounding box size. Valid if the model is valid. Read only.
    163 Pt3D size;
    164 
    165 SString vis_style;
    166 double startenergy;
    167 Callback delmodel_list;
    168 ModelUserTags userdata;
    169 
    170 /// Create empty model with invalid empty genotype
    171 Model();
    172 
    173 /** Create a model based on provided genotype
    174    @param buildmaps if not 0, generate mapping information for the model.
    175    default is 0, because mapping uses additional time and memory.
    176    @see getMap()
    177  */
    178 Model(const Geno &src,bool buildmaps=false);
    179 Model(const Model &mod,bool buildmaps=false);
    180 /** duplicate the model.
    181     the resulting object's status is 'building' (opened).
    182     @see getStatus()
    183  */
    184 void operator=(const Model &source);
    185 
    186 /** move all elements from 'source' into our model object.
    187     'source' becomes empty after this operation.
    188     the model will be opened if it is not already open.
    189     @see addElementsFrom(const Model &source);
    190  */
    191 void moveElementsFrom(Model &source);
    192 
    193 /** copy all elements from 'source' into our model object
    194     without affecting the 'source'.
    195     the model will be opened if it is not already open.
    196     @see moveElementsFrom(Model &source);
    197  */
    198 void addElementsFrom(const Model &source)
    199 {Model m(source); moveElementsFrom(m);}
    200 
    201 void operator+=(const Model &source)
    202 {addElementsFrom(source);}
    203 
    204 ~Model();
    205 
    206 /** @return source genotype.
    207     @warn source genotype will not automatically change
    208     when the model is modified. this behaviour is inconsistent
    209     with the previous release. use getF0Geno() if you need
    210     the updated genotype.
    211     @see getF0Geno(), setGeno()
    212 */
    213 const Geno &getGeno() const;
    214 
    215 /// change source genotype
    216 void setGeno(const Geno& newgeno);
    217 
    218 /** @return f0 genotype - generated from current model state
    219     don't use between open()-close()
    220 */
    221 const Geno getF0Geno();
    222 
    223 /// make f0 genotype from current construction (low level version of getF0Geno)
    224 void makeGeno(Geno &,MultiMap *map=0,bool handle_defaults=true);
    225 
    226 /** @return Mapping from source genotype (0-based position in text) to model elements reference numbers.
    227     Read about how mappings work: http://www.framsticks.com/files/common/GeneticMappingsInArtificialGenomes.pdf
    228     The map can be empty if the mapping hasn't been requested earlier (in constructor)
    229     or the converters don't support mapping.
    230     If you create or modify the model using singleStepBuild() or direct manipulation
    231     the map will be not changed or created automatically - it is your responsibility.
    232     @see Model(const Geno &src,int buildmaps=0), singleStepBuild(), PartBase::addMapping()
    233     @see clearMap()
    234     @see convmap
    235 
    236 */
    237 MultiMap &getMap();
    238 
    239 /** Read about how mappings work: http://www.framsticks.com/files/common/GeneticMappingsInArtificialGenomes.pdf
    240     @return mapping from f0 genotype (0-based position in text) to model elements reference numbers
    241  */
    242 const MultiMap &getF0Map();
    243 
    244 /** discard all mapping information for this model.
    245     getMap().clear() also works, but it doesn't remove mappings from model elements.
    246     If there are any mappings, they will be incorporated into model map during close().
    247     @see close(), getMap(), PartBase::clearMapping()
    248  */
    249 void clearMap();
    250 
    251 /** Generate mapping from the current genotype to the f0 genotype.
    252     This works only if both current and f0 maps are already known.
    253     Read about how mappings work: http://www.framsticks.com/files/common/GeneticMappingsInArtificialGenomes.pdf
    254     @see convmap
    255 */
    256 void getCurrentToF0Map(MultiMap& m);
    257 
    258 void setValidationLevel(int level)
    259         {checklevel=level;}
    260 
    261 /// calculate location of the new part connected to the existing one
    262 /// using delta option
    263 Pt3D whereDelta(const Part& start,const Pt3D& rot, const Pt3D& delta);
    264 
    265 /// create the whole model from scratch, using current genotype
    266 void rebuild(bool buildmaps);
    267 
    268 /// setGeno(newgeno); rebuild();
    269 void rebuild(const Geno& newgeno,bool buildmaps) {setGeno(newgeno); rebuild(buildmaps);}
    270 
    271 /// reuse current model object but discard all model data
    272 void clear();
    273 
    274 /** Execute single line of <B>f0</B> genotype.
    275     Return value is non-negative reference number of the created item,
    276     or negative value. reference number can be used to access
    277     the item using getPart(int), getJoint(int) and getNeuroItem(int) methods.
    278     @param line_num optional line number used in error messages
    279     @param srcrange source genotype range which will be mapped to this element
    280 */
    281 int singleStepBuild(const SString &singleline,int line_num,const MultiRange* srcrange=NULL);
    282 /** Execute single line of <B>f0</B> genotype - compatiblity variant */
    283 int singleStepBuild(const SString &singleline,const MultiRange* srcrange=NULL);
    284 /** Execute single line of <B>f0</B> genotype - low level variant, used by Model::build(), error messages returned as string instead of calling logger */
    285 int singleStepBuildNoLog(const SString &singleline,SString& error_message,const MultiRange* srcrange=0);
    286 
    287 /// separate build stages (for future use)
    288 void checkpoint();
    289 
    290 /// call resetDelta() on all joints
    291 void resetAllDelta();
    292 
    293 /// call useDelta() on all joints
    294 void useAllDelta(bool yesno);
    295 
    296 /// Final validity check of the model, all model data has to be available at this point.
    297 /// If the model was modified, the genotype will be also updated.
    298 /// It also calls "validate" with all side effects.
    299 /// @return > 0 means "valid"
    300 int close();
    301 
    302 /// Enable model building.
    303 /// You should use it if you need to create new model, modify the model after close
    304 /// or modify the model created from the genotype.
    305 /// Between open() and close() the model is not fully usable.
    306 void open();
    307 
    308 /// Current model written as f0 genotype while building
    309 /// (not cached, not validated, probably unusable and bad if used before close(). But good for debugging.)
    310 Geno rawGeno();
    311 
    312 /// partial validity check - you can use this call
    313 /// anytime between open - close.
    314 /// this function will check (and repair)
    315 /// - part-joint-neuro connections
    316 /// - model geometry (if "delta option" was used)
    317 /// - physical/biological limits
    318 /// @return 1 = valid
    319 /// @return 0 = invalid
    320 /// validate doesn't make the model fully usable (for simulation)
    321 /// you still need to use close if you have changed anything
    322 int validate();
    323 
    324 int getPartCount() const;
    325 /// you can access parts 0 .. getPartCount()-1.
    326 Part *getPart(int i) const;
    327 
    328 int getJointCount() const;
    329 /// you can access joints 0 .. getJointCount()-1.
    330 Joint *getJoint(int i) const;
    331 
    332 int getNeuroCount() const;
    333 int getConnectionCount() const;
    334 /// you can access neurons 0 .. getNeuroCount()-1.
    335 Neuro *getNeuro(int i) const;
     121        enum Shape { SHAPE_UNKNOWN, SHAPE_ILLEGAL, SHAPE_OLD, SHAPE_NEW };
     122protected:
     123        Shape shape;
     124
     125        void updateNeuroRefno(); // set Neuro::refno for all neurons
     126        SString nameForErrors() const;
     127        int internalcheck(int final);
     128
     129        void moveNeuro(int oldpos, int newpos);
     130
     131        void init(const Geno &srcgen);
     132        void init();
     133
     134        void delMap();
     135        void delF0Map();
     136        void initMap();
     137        void initF0Map();
     138
     139public:
     140        /** get current model state.
     141        \f[(dot)
     142        digraph M
     143        {
     144        node [fontsize=12]
     145        edge [fontsize=10]
     146        building [label="building = can be modified"]
     147        valid -> building [label="open()"]
     148        building -> valid [label="close()"]
     149        invalid -> building [label="open()"]
     150        building -> invalid [label="close() [failed]"]
     151        empty -> building [label="open()"]
     152        }
     153        \f]
     154        */
     155        ModelBuildStatus getStatus() const { return buildstatus; }
     156        int isValid() const { return buildstatus == valid; }
     157        int getErrorPosition(bool includingwarnings = false);
     158        Shape getShape() { return shape; }
     159
     160        void updateRefno(); // set ::refno for all elements
     161
     162        /// The bounding box size. Valid if the model is valid. Read only.
     163        Pt3D size;
     164
     165        SString vis_style;
     166        double startenergy;
     167        Callback delmodel_list;
     168        ModelUserTags userdata;
     169
     170        /// Create empty model with invalid empty genotype
     171        Model();
     172
     173        /** Create a model based on provided genotype
     174           @param buildmaps if not 0, generate mapping information for the model.
     175           default is 0, because mapping uses additional time and memory.
     176           @see getMap()
     177           */
     178        Model(const Geno &src, bool buildmaps = false);
     179        Model(const Model &mod, bool buildmaps = false);
     180        /** duplicate the model.
     181                the resulting object's status is 'building' (opened).
     182                @see getStatus()
     183                */
     184        void operator=(const Model &source);
     185
     186        /** move all elements from 'source' into our model object.
     187                'source' becomes empty after this operation.
     188                the model will be opened if it is not already open.
     189                @see addElementsFrom(const Model &source);
     190                */
     191        void moveElementsFrom(Model &source);
     192
     193        /** copy all elements from 'source' into our model object
     194                without affecting the 'source'.
     195                the model will be opened if it is not already open.
     196                @see moveElementsFrom(Model &source);
     197                */
     198        void addElementsFrom(const Model &source)
     199        {
     200                Model m(source); moveElementsFrom(m);
     201        }
     202
     203        void operator+=(const Model &source)
     204        {
     205                addElementsFrom(source);
     206        }
     207
     208        ~Model();
     209
     210        /** @return source genotype.
     211                @warn source genotype will not automatically change
     212                when the model is modified. this behaviour is inconsistent
     213                with the previous release. use getF0Geno() if you need
     214                the updated genotype.
     215                @see getF0Geno(), setGeno()
     216                */
     217        const Geno &getGeno() const;
     218
     219        /// change source genotype
     220        void setGeno(const Geno& newgeno);
     221
     222        /** @return f0 genotype - generated from current model state
     223                don't use between open()-close()
     224                */
     225        const Geno getF0Geno();
     226
     227        /// make f0 genotype from current construction (low level version of getF0Geno)
     228        void makeGeno(Geno &, MultiMap *map = 0, bool handle_defaults = true);
     229
     230        /** @return Mapping from source genotype (0-based position in text) to model elements reference numbers.
     231                Read about how mappings work: http://www.framsticks.com/files/common/GeneticMappingsInArtificialGenomes.pdf
     232                The map can be empty if the mapping hasn't been requested earlier (in constructor)
     233                or the converters don't support mapping.
     234                If you create or modify the model using singleStepBuild() or direct manipulation
     235                the map will be not changed or created automatically - it is your responsibility.
     236                @see Model(const Geno &src,int buildmaps=0), singleStepBuild(), PartBase::addMapping()
     237                @see clearMap()
     238                @see convmap
     239
     240                */
     241        MultiMap &getMap();
     242
     243        /** Read about how mappings work: http://www.framsticks.com/files/common/GeneticMappingsInArtificialGenomes.pdf
     244                @return mapping from f0 genotype (0-based position in text) to model elements reference numbers
     245                */
     246        const MultiMap &getF0Map();
     247
     248        /** discard all mapping information for this model.
     249                getMap().clear() also works, but it doesn't remove mappings from model elements.
     250                If there are any mappings, they will be incorporated into model map during close().
     251                @see close(), getMap(), PartBase::clearMapping()
     252                */
     253        void clearMap();
     254
     255        /** Generate mapping from the current genotype to the f0 genotype.
     256                This works only if both current and f0 maps are already known.
     257                Read about how mappings work: http://www.framsticks.com/files/common/GeneticMappingsInArtificialGenomes.pdf
     258                @see convmap
     259                */
     260        void getCurrentToF0Map(MultiMap& m);
     261
     262        void setValidationLevel(int level)
     263        {
     264                checklevel = level;
     265        }
     266
     267        /// calculate location of the new part connected to the existing one
     268        /// using delta option
     269        Pt3D whereDelta(const Part& start, const Pt3D& rot, const Pt3D& delta);
     270
     271        /// create the whole model from scratch, using current genotype
     272        void rebuild(bool buildmaps);
     273
     274        /// setGeno(newgeno); rebuild();
     275        void rebuild(const Geno& newgeno, bool buildmaps) { setGeno(newgeno); rebuild(buildmaps); }
     276
     277        /// reuse current model object but discard all model data
     278        void clear();
     279
     280        /** Execute single line of <B>f0</B> genotype.
     281                Return value is non-negative reference number of the created item,
     282                or negative value. reference number can be used to access
     283                the item using getPart(int), getJoint(int) and getNeuroItem(int) methods.
     284                @param line_num optional line number used in error messages
     285                @param srcrange source genotype range which will be mapped to this element
     286                */
     287        int singleStepBuild(const SString &singleline, int line_num, const MultiRange* srcrange = NULL);
     288        /** Execute single line of <B>f0</B> genotype - compatiblity variant */
     289        int singleStepBuild(const SString &singleline, const MultiRange* srcrange = NULL);
     290        /** Execute single line of <B>f0</B> genotype - low level variant, used by Model::build(), error messages returned as string instead of calling logger */
     291        int singleStepBuildNoLog(const SString &singleline, SString& error_message, const MultiRange* srcrange = 0);
     292
     293        /// separate build stages (for future use)
     294        void checkpoint();
     295
     296        /// call resetDelta() on all joints
     297        void resetAllDelta();
     298
     299        /// call useDelta() on all joints
     300        void useAllDelta(bool yesno);
     301
     302        /// Final validity check of the model, all model data has to be available at this point.
     303        /// If the model was modified, the genotype will be also updated.
     304        /// It also calls "validate" with all side effects.
     305        /// @return > 0 means "valid"
     306        int close();
     307
     308        /// Enable model building.
     309        /// You should use it if you need to create new model, modify the model after close
     310        /// or modify the model created from the genotype.
     311        /// Between open() and close() the model is not fully usable.
     312        void open();
     313
     314        /// Current model written as f0 genotype while building
     315        /// (not cached, not validated, probably unusable and bad if used before close(). But good for debugging.)
     316        Geno rawGeno();
     317
     318        /// partial validity check - you can use this call
     319        /// anytime between open - close.
     320        /// this function will check (and repair)
     321        /// - part-joint-neuro connections
     322        /// - model geometry (if "delta option" was used)
     323        /// - physical/biological limits
     324        /// @return 1 = valid
     325        /// @return 0 = invalid
     326        /// validate doesn't make the model fully usable (for simulation)
     327        /// you still need to use close if you have changed anything
     328        int validate();
     329
     330        int getPartCount() const;
     331        /// you can access parts 0 .. getPartCount()-1.
     332        Part *getPart(int i) const;
     333
     334        int getJointCount() const;
     335        /// you can access joints 0 .. getJointCount()-1.
     336        Joint *getJoint(int i) const;
     337
     338        int getNeuroCount() const;
     339        int getConnectionCount() const;
     340        /// you can access neurons 0 .. getNeuroCount()-1.
     341        Neuro *getNeuro(int i) const;
    336342
    337343#ifdef MODEL_V1_COMPATIBLE
    338 /* compatibility calls for accessing old Neuro objects */
    339 
    340 /// @deprecated Neuro class will be removed soon
    341 /// @see compat
    342 int old_getNeuroCount();
    343 /// you can access neurons 0 .. getNeuroCount()-1.
    344 /// @deprecated Neuro class will be removed soon
    345 Neuro *old_getNeuro(int i);
    346 /// @see addNewNeuro, addNeuro
    347 /// @deprecated Neuro class will be removed soon
    348 Neuro *old_addNewNeuro();
    349 /// @return neuro index or -1 if not found
    350 /// @deprecated Neuro class will be removed soon
    351 int old_findNeuro(Neuro* n);
     344        /* compatibility calls for accessing old Neuro objects */
     345
     346        /// @deprecated Neuro class will be removed soon
     347        /// @see compat
     348        int old_getNeuroCount();
     349        /// you can access neurons 0 .. getNeuroCount()-1.
     350        /// @deprecated Neuro class will be removed soon
     351        Neuro *old_getNeuro(int i);
     352        /// @see addNewNeuro, addNeuro
     353        /// @deprecated Neuro class will be removed soon
     354        Neuro *old_addNewNeuro();
     355        /// @return neuro index or -1 if not found
     356        /// @deprecated Neuro class will be removed soon
     357        int old_findNeuro(Neuro* n);
    352358#endif
    353359
    354 /** create new Part and add it to the model. @see addPart()  */
    355 Part *addNewPart(Part::Shape shape=Part::SHAPE_DEFAULT) {return addPart(new Part(shape));}
    356 /** create new Joint and add it to the model. @see addJoint() */
    357 Joint *addNewJoint(Part *p1=NULL,Part *p2=NULL,Joint::Shape shape=Joint::SHAPE_DEFAULT) { Joint *j=addJoint(new Joint()); j->shape=shape; if ((p1!=NULL)&&(p2!=NULL)) j->attachToParts(p1,p2); return j;}
    358 /** create new Neuro and add it to the model. @see addNeuro() */
    359 Neuro *addNewNeuro() {return addNeuro(new Neuro());}
    360 
    361 /** add p to the model. p->refno is adjusted. @return the Part just added (==p). */
    362 Part *addPart(Part *p);
    363 /** add j to the model. j->refno is adjusted. @return the Joint just added (==j). */
    364 Joint *addJoint(Joint *j);
    365 /** add n to the model. n->refno is adjusted. @return the Neuro just added (==n). */
    366 Neuro *addNeuro(Neuro *n);
    367 
    368 /** remove the part from model.
    369     @param removeattachedjoints if not 0 -> remove all joints connected with this part
    370     @param removeattachedneurons if not 0 -> remove neurons attached to this part */
    371 void removePart(int partindex,int removeattachedjoints=1,int removeattachedneurons=1);
    372 
    373 /** remove the joint from model.
    374     @param removeattachedneurons if not 0 -> remove neurons attached to this joint */
    375 void removeJoint(int jointindex,int removeattachedneurons=1);
    376 
    377 /** remove the neuron from model.
    378     @param removereferences if true -> look for references to this neuron
    379     (i.e. connections from other neurons) and remove them as well */
    380 void removeNeuro(int neuroindex,bool removereferences=true);
    381 
    382 void removeNeuros(SList &nlist);
    383 
    384 /// @return part index or -1 if not found in the model
    385 int findPart(Part* p);
    386 /// @return joint index or -1 if not found in the model
    387 int findJoint(Joint* j);
    388 /// @return neuro index or -1 if not found in the model
    389 int findNeuro(Neuro* nu);
    390 /// @return joint index or -1 if not found in the model
    391 int findJoint(Part *p1, Part *p2);
    392 
    393 /** make the list of neuros satisfying given search criteria: classname,part,joint
    394     @param result objects will be appended here
    395     @return number of objects found  */
    396 int findNeuros(SList& result,const char* classname=0,const Part* part=0,const Joint* joint=0);
    397 
    398 /** search for joints connected to the part
    399     @param result objects will be appended here
    400     @return number of objects found  */
    401 int findJoints(SList& result,const Part* part=0);
    402 
    403 void disturb(double amount);
    404 void move(const Pt3D& shift);
    405 /// rotate around the origin (move-rotate-move to rotate around arbitrary point)
    406 void rotate(const Orient& rotation);
    407 /// rotate around the origin (move-rotate-move to rotate around arbitrary point)
    408 void rotate(const Pt3D& angles) {Orient o=Orient_1; o.rotate(angles); rotate(o);}
    409 
    410 /// build this model using new shapes, based on the provided model that uses old shapes. See also shapeconvert.cpp.
    411 void buildUsingNewShapes(const Model& src_old_shapes, Part::Shape default_shape = Part::SHAPE_CYLINDER, float thickness = 0.2);
     360        /** create new Part and add it to the model. @see addPart()  */
     361        Part *addNewPart(Part::Shape shape = Part::SHAPE_DEFAULT) { return addPart(new Part(shape)); }
     362        /** create new Joint and add it to the model. @see addJoint() */
     363        Joint *addNewJoint(Part *p1 = NULL, Part *p2 = NULL, Joint::Shape shape = Joint::SHAPE_DEFAULT) { Joint *j = addJoint(new Joint()); j->shape = shape; if ((p1 != NULL) && (p2 != NULL)) j->attachToParts(p1, p2); return j; }
     364        /** create new Neuro and add it to the model. @see addNeuro() */
     365        Neuro *addNewNeuro() { return addNeuro(new Neuro()); }
     366
     367        /** add p to the model. p->refno is adjusted. @return the Part just added (==p). */
     368        Part *addPart(Part *p);
     369        /** add j to the model. j->refno is adjusted. @return the Joint just added (==j). */
     370        Joint *addJoint(Joint *j);
     371        /** add n to the model. n->refno is adjusted. @return the Neuro just added (==n). */
     372        Neuro *addNeuro(Neuro *n);
     373
     374        /** remove the part from model.
     375                @param removeattachedjoints if not 0 -> remove all joints connected with this part
     376                @param removeattachedneurons if not 0 -> remove neurons attached to this part */
     377        void removePart(int partindex, int removeattachedjoints = 1, int removeattachedneurons = 1);
     378
     379        /** remove the joint from model.
     380                @param removeattachedneurons if not 0 -> remove neurons attached to this joint */
     381        void removeJoint(int jointindex, int removeattachedneurons = 1);
     382
     383        /** remove the neuron from model.
     384                @param removereferences if true -> look for references to this neuron
     385                (i.e. connections from other neurons) and remove them as well */
     386        void removeNeuro(int neuroindex, bool removereferences = true);
     387
     388        void removeNeuros(SList &nlist);
     389
     390        /// @return part index or -1 if not found in the model
     391        int findPart(Part* p);
     392        /// @return joint index or -1 if not found in the model
     393        int findJoint(Joint* j);
     394        /// @return neuro index or -1 if not found in the model
     395        int findNeuro(Neuro* nu);
     396        /// @return joint index or -1 if not found in the model
     397        int findJoint(Part *p1, Part *p2);
     398
     399        /** make the list of neuros satisfying given search criteria: classname,part,joint
     400                @param result objects will be appended here
     401                @return number of objects found  */
     402        int findNeuros(SList& result, const char* classname = 0, const Part* part = 0, const Joint* joint = 0);
     403
     404        /** search for joints connected to the part
     405                @param result objects will be appended here
     406                @return number of objects found  */
     407        int findJoints(SList& result, const Part* part = 0);
     408
     409        void disturb(double amount);
     410        void move(const Pt3D& shift);
     411        /// rotate around the origin (move-rotate-move to rotate around arbitrary point)
     412        void rotate(const Orient& rotation);
     413        /// rotate around the origin (move-rotate-move to rotate around arbitrary point)
     414        void rotate(const Pt3D& angles) { Orient o = Orient_1; o.rotate(angles); rotate(o); }
     415
     416        /// build this model using new shapes, based on the provided model that uses old shapes. See also shapeconvert.cpp.
     417        void buildUsingNewShapes(const Model& src_old_shapes, Part::Shape default_shape = Part::SHAPE_CYLINDER, float thickness = 0.2);
    412418
    413419#ifdef EASYMAPDEBUG
    414 static int partToMap(int i) {return 0+i;}
    415 static int jointToMap(int i) {return 10+i;}
    416 static int neuroToMap(int i) {return 20+i;}
    417 static int mapToPart(int i) {return i-0;}
    418 static int mapToJoint(int i) {return i-10;}
    419 static int mapToNeuro(int i) {return i-20;}
     420        static int partToMap(int i) {return 0+i;}
     421        static int jointToMap(int i) {return 10+i;}
     422        static int neuroToMap(int i) {return 20+i;}
     423        static int mapToPart(int i) {return i-0;}
     424        static int mapToJoint(int i) {return i-10;}
     425        static int mapToNeuro(int i) {return i-20;}
    420426#else
    421 static int partToMap(int i) {return 0x10000000+i;}
    422 static int jointToMap(int i) {return 0x20000000+i;}
    423 static int neuroToMap(int i) {return 0x30000000+i;}
    424 static int mapToPart(int i) {return i-0x10000000;}
    425 static int mapToJoint(int i) {return i-0x20000000;}
    426 static int mapToNeuro(int i) {return i-0x30000000;}
     427        static int partToMap(int i) { return 0x10000000 + i; }
     428        static int jointToMap(int i) { return 0x20000000 + i; }
     429        static int neuroToMap(int i) { return 0x30000000 + i; }
     430        static int mapToPart(int i) { return i - 0x10000000; }
     431        static int mapToJoint(int i) { return i - 0x20000000; }
     432        static int mapToNeuro(int i) { return i - 0x30000000; }
    427433#endif
    428434
    429 static void makeGenToGenMap(MultiMap& result,const MultiMap& gen1tomodel,const MultiMap& gen2tomodel);
    430 
    431 ///////////////////////////
    432 
    433 static Part& getMinPart();
    434 static Part& getMaxPart();
    435 static Part& getDefPart();
    436 static Joint& getMinJoint();
    437 static Joint& getMaxJoint();
    438 static Joint& getDefJoint();
    439 static Neuro& getMinNeuro();
    440 static Neuro& getMaxNeuro();
    441 static Neuro& getDefNeuro();
     435        static void makeGenToGenMap(MultiMap& result, const MultiMap& gen1tomodel, const MultiMap& gen2tomodel);
     436
     437        ///////////////////////////
     438
     439        static Part& getMinPart();
     440        static Part& getMaxPart();
     441        static Part& getDefPart();
     442        static Joint& getMinJoint();
     443        static Joint& getMaxJoint();
     444        static Joint& getDefJoint();
     445        static Neuro& getMinNeuro();
     446        static Neuro& getMaxNeuro();
     447        static Neuro& getDefNeuro();
    442448};
    443449
Note: See TracChangeset for help on using the changeset viewer.