All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Types | Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions
DinverCore::SimpleCondition Class Reference

A simple condition p1<a*p2+b. More...

#include <SimpleCondition.h>

Inheritance diagram for DinverCore::SimpleCondition:
DinverCore::AbstractCondition QGpCoreTools::XMLClass

List of all members.

Public Types

enum  Type { NoCondition, LessThan, GreaterThan }

Public Member Functions

virtual bool adjustRanges ()
virtual void getLimits (int paramIndex, double &min, double &max) const
virtual void humanInfo () const
virtual bool operator== (const AbstractCondition &o) const
 SimpleCondition (Parameter *p1, Type type, double factor, Parameter *p2, double constant)
virtual const QString & xml_tagName () const

Static Public Member Functions

static Type fromString (QString t, bool &ok)
static QString toString (Type t)

Static Public Attributes

static const QString xmlSimpleConditionTag = "SimpleCondition"

Protected Member Functions

virtual uint internalChecksum () const
virtual XMLMember xml_member (XML_MEMBER_ARGS)
virtual bool xml_setProperty (XML_SETPROPERTY_ARGS)
virtual void xml_writeProperties (XML_WRITEPROPERTIES_ARGS) const

Detailed Description

A simple condition p1<a*p2+b.


Member Enumeration Documentation

Enumerator:
NoCondition 
LessThan 
GreaterThan 

Constructor & Destructor Documentation

DinverCore::SimpleCondition::SimpleCondition ( Parameter p1,
Type  type,
double  factor,
Parameter p2,
double  constant 
)

Define a condition between p1 and p2.

Order of arguments should be read as:

p1 LessThan or GreaterThan (type) factor times p2 plus constant

References DinverCore::AbstractCondition::addParameter(), and TRACE.

{
  TRACE;
  addParameter(p1);
  addParameter(p2);
  _type=type;
  _factor=factor;
  _constant=constant;
}

Member Function Documentation

Return true if original ranges of parameter are touched. Ranges can be reduced, never enlarged

Reimplemented from DinverCore::AbstractCondition.

References getLimits(), GreaterThan, LessThan, DinverCore::Parameter::maximum(), DinverCore::Parameter::minimum(), NoCondition, DinverCore::AbstractCondition::parameter(), DinverCore::Parameter::setMaximum(), DinverCore::Parameter::setMinimum(), DinverCore::Parameter::setRealValue(), and TRACE.

{
  TRACE;
  double min, max;
  bool modified=false;
  switch (_type) {
  case LessThan: {
      min=-1e99;
      parameter(0).setRealValue(parameter(0).minimum());
      getLimits(1, min, max);
      Parameter& p1=parameter(1);
      if(p1.minimum()<min) {
        p1.setMinimum(min);
        modified=true;
      }
      max=1e99;
      parameter(1).setRealValue(parameter(1).maximum());
      getLimits(0, min, max);
      Parameter& p0=parameter(0);
      if(p0.maximum()>max) {
        p0.setMaximum(max);
        modified=true;
      }
    }
    break;
  case GreaterThan: {
      max=1e99;
      parameter(0).setRealValue(parameter(0).maximum());
      getLimits(1, min, max);
      Parameter& p1=parameter(1);
      if(p1.maximum()>max) {
        p1.setMaximum(max);
        modified=true;
      }
      min=-1e99;
      parameter(1).setRealValue(parameter(1).minimum());
      getLimits(0, min, max);
      Parameter& p0=parameter(0);
      if(p0.minimum()<min) {
        p0.setMinimum(min);
        modified=true;
      }
    }
    break;
  case NoCondition:
    break;
  }
  return modified;
}
SimpleCondition::Type DinverCore::SimpleCondition::fromString ( QString  t,
bool &  ok 
) [static]

References GreaterThan, LessThan, and NoCondition.

Referenced by xml_setProperty().

{
  if(!t.isEmpty()) {
    switch(t[0].unicode()) {
    case 'L':
      if(t=="LessThan") {
        return LessThan;
      }
      break;
    case 'G':
      if(t=="GreaterThan") {
        return GreaterThan;
      }
      break;
    case 'N':
      if(t=="NoCondition") {
        return NoCondition;
      }
      break;
    default:
      break;
    }
  }
  ok=false;
  return NoCondition;
}
void DinverCore::SimpleCondition::getLimits ( int  paramIndex,
double &  min,
double &  max 
) const [inline, virtual]

Adjust min or/and max to fulfill the condition. paramIndex must be 0 or 1.

Implements DinverCore::AbstractCondition.

References GreaterThan, LessThan, NoCondition, DinverCore::AbstractCondition::parameter(), DinverCore::Parameter::realValue(), and TRACE.

Referenced by adjustRanges().

{
  TRACE;
  double threshold;
  switch (paramIndex) {
  case 0:
    threshold=_factor * parameter(1).realValue() + _constant;
    switch (_type) {
    case LessThan:
      if(threshold < max) {
        max=threshold;
      }
      break;
    case GreaterThan:
      if(threshold > min) {
        min=threshold;
      }
      break;
    case NoCondition:
      break;
    }
    break;
  default:
    threshold=parameter(0).realValue() - _constant;
    switch (_type) {
    case LessThan:
      if(threshold > _factor * min) {
        if(_factor==1.0)
          min=threshold;
        else
          min=threshold/_factor;
      }
      break;
    case GreaterThan:
      if(threshold < _factor * max) {
        if(_factor==1.0)
          max=threshold;
        else
          max=threshold/_factor;
      }
      break;
    case NoCondition:
      break;
    }
    break;
  }
}
void DinverCore::SimpleCondition::humanInfo ( ) const [virtual]

Print human readable information about condition to stream.

Implements DinverCore::AbstractCondition.

References LessThan, DinverCore::Parameter::name(), DinverCore::AbstractCondition::parameter(), and TRACE.

{
  TRACE;
  App::stream() << "        " << parameter(0).name() << " " << (_type==LessThan ? "<" : ">" ) << " ";
  if(_factor!=1.0)
    App::stream() << _factor << "*";
  App::stream() << parameter(1).name();
  if(_constant > 0)
    App::stream() << "+" << _constant;
  else if(_constant < 0)
    App::stream() << _constant;
  App::stream() << "\n";
}
uint DinverCore::SimpleCondition::internalChecksum ( ) const [protected, virtual]

Return a number that uniquely identify this condition

Implements DinverCore::AbstractCondition.

References DinverCore::qHash(), and TRACE.

{
  TRACE;
  uint cs=0;
  cs += qHash(( qint64) _factor);
  cs += qHash(( qint64) _constant);
  cs += _type + 1;
  return cs;
}
bool DinverCore::SimpleCondition::operator== ( const AbstractCondition o) const [virtual]

Reimplemented from DinverCore::AbstractCondition.

References TRACE, DinverCore::AbstractCondition::xml_tagName(), and xml_tagName().

{
  TRACE;
  if(xml_tagName()==o.xml_tagName()) {
    const SimpleCondition& sc=static_cast<const SimpleCondition&>(o);
    return _type==sc._type &&
          _factor==sc._factor &&
          _constant==sc._constant &&
          AbstractCondition::operator==(o);
  } else return false;
}

References GreaterThan, LessThan, and NoCondition.

Referenced by xml_writeProperties().

{
  switch(t) {
  case LessThan:
    break;
  case GreaterThan:
    return "GreaterThan";
  case NoCondition:
    return "NoCondition";
  }
  return "LessThan";
}

Re-implement this function to offer XML restore (children and properties) support to your class.

From tag and map (with contains the attibute value) return a unique identifier under the format of a XMLMember. XMLMember is initialized with 3 types of contructors:

  • An integer: id number of a property
  • A XMLClass * : a child of this object identified by tag
  • Default constructor: error, unknow child or property

Map of attributes can be inspected in this way (can be achived also in xml_setProperty()):

    static const QString tmp("childrenName");
    XMLRestoreAttributeIterator it=map.find(tmp);
    if(it!=map.end()) {
      // found attribute "childrenName"
    }

If the map of attributes is not used:

    Q_UNUSED(attributes);
    if(tag=="x1") return XMLMember(0);
    else if(tag=="y1") return XMLMember(1);
    else if(tag=="x2") return XMLMember(2);
    else if(tag=="y2") return XMLMember(3);
    else return XMLMember(XMLMember::Unknown);

Arithmetic operations + and - apply to XMLMember to avoid confusion of property id numbers between inherited objects. Offset 3 corresponds to the number of properties defined in this object.

    if(tag=="anInteger") return XMLMember(0);
    else if(tag=="aString") return XMLMember(1);
    else if(tag=="aDouble") return XMLMember(2);
    return AbstractLine::xml_member(tag, attributes, context)+3;

For the arguments of this function use Macro XML_MEMBER_ARGS.

Reimplemented from DinverCore::AbstractCondition.

References TRACE.

{
  TRACE;
  if(tag=="factor" )
    return XMLMember(0);
  else if(tag=="constant" )
    return XMLMember(1);
  else if(tag=="type" )
    return XMLMember(2);
  else
    return SimpleCondition::xml_member(tag, attributes, context)+3;
}

Re-implement this function to offer XML restore properties support to your class.

From memberID set the corresponding property with value content. The map of attributes is given as a supplementary information (not useful in all cases).

For a general case:

  Q_UNUSED(attributes);
  double val=content.toDouble();
  switch (memberID) {
  case 0:
    _x1=val;
    return true;
  case 1:
    _y1=val;
    return true;
  case 2:
    _x2=val;
    return true;
  case 3:
    _y2=val;
    return true;
  default:
    return false;
  }

For classes inheriting other classes (see also xml_member())

  switch (memberID) {
  case 0:
    _anInteger=content.toString();
    return true;
  case 1:
    _aString=content.toInt();
    return true;
  case 2:
    _aDouble=content.toDouble();
    return true;
  default:
    return AbstractLine::xml_setProperty(memberID-3, map, content);

For the arguments of this function use Macro XML_SETPROPERTY_ARGS.

Reimplemented from DinverCore::AbstractCondition.

References fromString(), and TRACE.

{
  TRACE;
  switch (memberID) {
  case 0:
    _factor=content.toDouble();
    return true;
  case 1:
    _constant=content.toDouble();
    return true;
  case 2: {
      bool ok=true;
      _type=fromString(content.toString(), ok);
      return ok;
    }
  default:
    return AbstractCondition::xml_setProperty(memberID-3, tag, attributes, content, context);
  }
}
virtual const QString& DinverCore::SimpleCondition::xml_tagName ( ) const [inline, virtual]

Reimplemented from DinverCore::AbstractCondition.

Referenced by operator==().

Reimplemented from DinverCore::AbstractCondition.

References toString(), TRACE, and QGpCoreTools::XMLClass::writeProperty().

{
  TRACE;
  Q_UNUSED(context);
  writeProperty(s, "type", toString(_type));
  writeProperty(s, "factor", _factor);
  writeProperty(s, "constant", _constant);
}

Member Data Documentation

const QString DinverCore::SimpleCondition::xmlSimpleConditionTag = "SimpleCondition" [static]

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines