Changeset 610


Ignore:
Timestamp:
09/05/16 03:39:14 (8 years ago)
Author:
Maciej Komosinski
Message:
  • Introduced levels of checking the validity of a Model
  • If a Joint is too long, print how much it exceeds the maximum allowed length
Location:
cpp/frams/model
Files:
2 edited

Legend:

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

    r546 r610  
    511511}
    512512
    513 int Model::close()
     513int Model::close(bool building_live_model)
    514514{
    515515        if (buildstatus != building)
    516516                logPrintf("Model", "close", LOG_WARN, "Unexpected close() - no open()");
    517         if (internalcheck(1) > 0)
     517        if (internalcheck(building_live_model ? LIVE_CHECK : FINAL_CHECK) > 0)
    518518        {
    519519                buildstatus = valid;
     
    543543int Model::validate()
    544544{
    545         return internalcheck(0);
     545        return internalcheck(EDITING_CHECK);
    546546}
    547547
     
    899899}
    900900
    901 int Model::internalcheck(int final)
     901int Model::internalcheck(CheckType check)
    902902{
    903903        Part *p;
     
    997997                                else
    998998                                { // abs.positioning -> calc. delta
    999                                         if (final)
     999                                        if (check!=EDITING_CHECK)
    10001000                                        {
    10011001                                                // calc orient delta
     
    10121012                                        }
    10131013                                }
    1014                                 if (final)
     1014                                if (check!=LIVE_CHECK)
    10151015                                {
    10161016                                        if (j->shape != Joint::SHAPE_FIXED)
     
    10191019                                                {
    10201020                                                        ret = 0;
    1021                                                         logPrintf("Model", "internalCheck", LOG_ERROR, "Joint #%d too long%s", i, nameForErrors().c_str());
     1021                                                        logPrintf("Model", "internalCheck", LOG_ERROR, "Joint #%d too long (its length %g exceeds allowed %g)%s", i, j->d(), getMaxJoint().d.x, nameForErrors().c_str());
    10221022                                                }
    10231023                                        }
  • cpp/frams/model/model.h

    r546 r610  
    120120public:
    121121        enum ShapeType { SHAPE_UNKNOWN, SHAPE_ILLEGAL, SHAPE_BALL_AND_STICK, SHAPE_SOLIDS };
     122        /// used in internalCheck()
     123        enum CheckType {
     124         EDITING_CHECK, ///< Used in Model::validate(). Default validation - does not modify elements of the Model.
     125         FINAL_CHECK,   ///< Used in Model::close() when a Model is built from a genotype. Like EDITING_CHECK, but also calculates Joint::d and Joint::rot.
     126         LIVE_CHECK     ///< used in Model::close() when a Model is built from a Creature. Like FINAL_CHECK but does not limit joint length which could make some liveModels invalid.
     127        };
    122128protected:
    123129        ShapeType shape;
     
    125131        void updateNeuroRefno(); // set Neuro::refno for all neurons
    126132        SString nameForErrors() const;
    127         int internalcheck(int final);
     133        int internalcheck(CheckType check);
    128134
    129135        void moveNeuro(int oldpos, int newpos);
     
    304310        /// It also calls "validate" with all side effects.
    305311        /// @return > 0 means "valid"
    306         int close();
     312        int close(bool building_live_model=false);
    307313
    308314        /// Enable model building.
Note: See TracChangeset for help on using the changeset viewer.