Hello community,

here is the log from the commit of package analitza for openSUSE:Factory 
checked in at 2013-11-17 15:57:51
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/analitza (Old)
 and      /work/SRC/openSUSE:Factory/.analitza.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "analitza"

Changes:
--------
--- /work/SRC/openSUSE:Factory/analitza/analitza.changes        2013-10-03 
15:44:17.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.analitza.new/analitza.changes   2013-11-17 
15:57:52.000000000 +0100
@@ -1,0 +2,21 @@
+Sat Nov 16 17:47:45 UTC 2013 - [email protected]
+
+- Update to 4.11.90
+   * KDE 4.12 Beta 2 release
+   * See http://www.kde.org/announcements/announce-4.12-beta2.php
+
+-------------------------------------------------------------------
+Sat Nov  9 22:48:28 UTC 2013 - [email protected]
+
+- Update to 4.11.80
+   * KDE 4.12 Beta 1 release
+   * See http://www.kde.org/announcements/announce-4.12-beta1.php
+
+-------------------------------------------------------------------
+Sat Nov  2 15:01:14 UTC 2013 - [email protected]
+
+- Update to 4.11.3
+   * KDE 4.11.3 bugfix release
+   * See http://www.kde.org/announcements/announce-4.11.3.php
+
+-------------------------------------------------------------------

Old:
----
  analitza-4.11.2.tar.xz

New:
----
  analitza-4.11.90.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ analitza.spec ++++++
--- /var/tmp/diff_new_pack.fWRT2O/_old  2013-11-17 15:57:52.000000000 +0100
+++ /var/tmp/diff_new_pack.fWRT2O/_new  2013-11-17 15:57:52.000000000 +0100
@@ -21,7 +21,7 @@
 BuildRequires:  readline-devel
 BuildRequires:  pkgconfig(glu)
 Url:            https://projects.kde.org/projects/kde/kdeedu/analitza
-Version:        4.11.2
+Version:        4.11.90
 Release:        0
 BuildRequires:  xz
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build

++++++ analitza-4.11.2.tar.xz -> analitza-4.11.90.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitza/abstractlexer.cpp 
new/analitza-4.11.90/analitza/abstractlexer.cpp
--- old/analitza-4.11.2/analitza/abstractlexer.cpp      2013-06-28 
19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitza/abstractlexer.cpp     2013-10-30 
23:53:40.000000000 +0100
@@ -22,9 +22,9 @@
 #include <QStringList>
 #include "localize.h"
 
-QMap<QChar, int> initializeOperators()
+QHash<QChar, int> initializeOperators()
 {
-       QMap<QChar, int> operators;
+       QHash<QChar, int> operators;
        operators['+']=ExpressionTable::tAdd;
        operators['-']=ExpressionTable::tSub;
        operators['*']=ExpressionTable::tMul;
@@ -47,9 +47,9 @@
        return operators;
 }
 
-QMap<QString, int> initializeLongOperators()
+QHash<QString, int> initializeLongOperators()
 {
-       QMap<QString, int> longOperators;
+       QHash<QString, int> longOperators;
        longOperators["->"]=ExpressionTable::tLambda;
        longOperators[":="]=ExpressionTable::tAssig;
        longOperators[".."]=ExpressionTable::tLimits;
@@ -60,8 +60,8 @@
        return longOperators;
 }
 
-QMap<QChar, int> AbstractLexer::m_operators=initializeOperators();
-QMap<QString, int> AbstractLexer::m_longOperators=initializeLongOperators();
+QHash<QChar, int> AbstractLexer::m_operators=initializeOperators();
+QHash<QString, int> AbstractLexer::m_longOperators=initializeLongOperators();
 
 AbstractLexer::AbstractLexer(const QString &source)
        : current(-1, 0), m_source(source), m_lines(0), m_openPr(0), m_openCb(0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitza/abstractlexer.h 
new/analitza-4.11.90/analitza/abstractlexer.h
--- old/analitza-4.11.2/analitza/abstractlexer.h        2013-06-28 
19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitza/abstractlexer.h       2013-10-30 
23:53:40.000000000 +0100
@@ -21,7 +21,7 @@
 
 #include <QtCore/QString>
 #include <QtCore/QStringList>
-#include <QtCore/QMap>
+#include <QtCore/QHash>
 #include <QtCore/QQueue>
 #include "analitzaexport.h"
 
@@ -56,8 +56,8 @@
                int m_lines;
                int m_openPr, m_openCb;
                QQueue<TOKEN> m_tokens;
-               static QMap<QChar, int> m_operators;
-               static QMap<QString, int> m_longOperators;
+               static QHash<QChar, int> m_operators;
+               static QHash<QString, int> m_longOperators;
                virtual void getToken()=0;
                void printQueue(const QQueue<TOKEN>& q) const;
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitza/exp.g 
new/analitza-4.11.90/analitza/exp.g
--- old/analitza-4.11.2/analitza/exp.g  2013-06-28 19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitza/exp.g 2013-10-30 23:53:40.000000000 +0100
@@ -89,6 +89,7 @@
                int errorLineNumber() const { return m_errorLineNumber; }
                QStringList error() const { return m_err; }
                QString mathML() const { return m_exp; }
+               QStringList comments() const { return m_comments; }
 
        private:
                void reallocateStack();
@@ -102,6 +103,7 @@
                int m_errorLineNumber;
                QStringList m_err;
                QString m_exp;
+               QStringList m_comments;
 };
 
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitza/expressionparser.cpp 
new/analitza-4.11.90/analitza/expressionparser.cpp
--- old/analitza-4.11.2/analitza/expressionparser.cpp   2013-06-28 
19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitza/expressionparser.cpp  2013-10-30 
23:53:40.000000000 +0100
@@ -1,5 +1,5 @@
 
-#line 111 "exp.g"
+#line 113 "exp.g"
 
 
/*************************************************************************************
  *  Copyright (C) 2008 by Aleix Pol <[email protected]>                         
      *
@@ -69,6 +69,7 @@
         yytoken = lexer->lex();
                while(yytoken==tComment) {
                        //TODO: Add mathml comment
+                       m_comments.append(lexer->current.val);
                        yytoken = lexer->lex();
                }
                
@@ -92,171 +93,171 @@
           act = m_stateStack.at(m_tos++);
           switch (r) {
 
-#line 204 "exp.g"
+#line 207 "exp.g"
  case 0: 
-#line 205 "exp.g"
+#line 208 "exp.g"
  case 1: 
-#line 207 "exp.g"
+#line 210 "exp.g"
 
 case 2:
        m_exp = "<math>"+sym(1)+"</math>";
        break;
 
-#line 213 "exp.g"
- case 3: sym(1) = "<declare><ci>"+sym(1)+"</ci>"+sym(3)+"</declare>"; break; 
 #line 216 "exp.g"
+ case 3: sym(1) = "<declare><ci>"+sym(1)+"</ci>"+sym(3)+"</declare>"; break; 
+#line 219 "exp.g"
  case 4: 
-#line 217 "exp.g"
+#line 220 "exp.g"
  case 5: 
-#line 219 "exp.g"
+#line 222 "exp.g"
 
 case 6:
        sym(1) = lexer->current.val;
        break;
 
-#line 228 "exp.g"
+#line 231 "exp.g"
 
 case 9:
        sym(1) = "<ci>"+sym(1)+"</ci>";
        break;
 
-#line 237 "exp.g"
+#line 240 "exp.g"
 
 case 12:
        sym(1) = "<apply><selector />"+sym(3)+sym(1)+"</apply>";
        break;
 
-#line 244 "exp.g"
+#line 247 "exp.g"
 
 case 13:
        sym(1) = sym(2);
        break;
 
-#line 254 "exp.g"
+#line 257 "exp.g"
  case 18: sym(1)=sym(2); break; 
-#line 255 "exp.g"
+#line 258 "exp.g"
  case 19: sym(1)=funcToTag(sym(1)); break; 
-#line 257 "exp.g"
+#line 260 "exp.g"
  case 20: sym(1) = "<apply>"+sym(1)+sym(2)+"</apply>"; break; 
-#line 258 "exp.g"
+#line 261 "exp.g"
  case 21: sym(1) = "<apply>"+sym(1)+sym(3)+"</apply>"; break; 
-#line 259 "exp.g"
+#line 262 "exp.g"
  case 22: sym(1) = "<apply>"+sym(1)+       "</apply>"; break; 
-#line 261 "exp.g"
+#line 264 "exp.g"
  case 23: sym(1) = "<apply>"+sym(3)+sym(1)+"</apply>"; break; 
-#line 262 "exp.g"
+#line 265 "exp.g"
  case 24: sym(1) = "<apply>"+sym(3)+sym(1)+"</apply>"; break; 
-#line 269 "exp.g"
+#line 272 "exp.g"
 
 case 28:
        sym(1).prepend(sym(3));
        break;
 
-#line 276 "exp.g"
+#line 279 "exp.g"
 
 case 29:
        sym(1)=sym(3)+sym(5)+sym(1);
        break;
 
-#line 283 "exp.g"
+#line 286 "exp.g"
 
 case 30:
        
sym(1)=sym(3)+"<domainofapplication>"+sym(5)+"</domainofapplication>"+sym(1);
        break;
 
-#line 291 "exp.g"
+#line 294 "exp.g"
 
 case 31:
        sym(1) = '<'+sym(1)+" />";
        break;
 
-#line 298 "exp.g"
+#line 301 "exp.g"
 
 case 32:
        sym(1) = '<'+sym(1)+'>'+sym(3)+"</"+sym(1)+'>';
        break;
 
-#line 306 "exp.g"
+#line 309 "exp.g"
 
 case 33:
        sym(1) = "<lambda>"+sym(1)+sym(3)+"</lambda>";
        break;
 
-#line 314 "exp.g"
+#line 317 "exp.g"
 
 case 34:
        sym(1) = "<apply><minus />"+sym(2)+"</apply>";
        break;
 
-#line 321 "exp.g"
+#line 324 "exp.g"
 
 case 35:
        sym(1) = "<otherwise>"+sym(2)+"</otherwise>";
        break;
 
-#line 328 "exp.g"
+#line 331 "exp.g"
  case 36: sym(1) = "<apply><plus />"  +sym(1)+sym(3)+"</apply>"; break; 
-#line 329 "exp.g"
+#line 332 "exp.g"
  case 37: sym(1) = "<apply><minus />" +sym(1)+sym(3)+"</apply>"; break; 
-#line 330 "exp.g"
+#line 333 "exp.g"
  case 38: sym(1) = "<apply><times />" +sym(1)+sym(3)+"</apply>"; break; 
-#line 331 "exp.g"
+#line 334 "exp.g"
  case 39: sym(1) = "<apply><times />" +sym(1)+sym(2)+"</apply>"; break; 
-#line 332 "exp.g"
+#line 335 "exp.g"
  case 40: sym(1) = "<apply><divide />"+sym(1)+sym(3)+"</apply>"; break; 
-#line 333 "exp.g"
+#line 336 "exp.g"
  case 41: sym(1) = "<apply><power />" +sym(1)+sym(3)+"</apply>"; break; 
-#line 334 "exp.g"
+#line 337 "exp.g"
  case 42: sym(1) = "<apply><eq />"    +sym(1)+sym(3)+"</apply>"; break; 
-#line 335 "exp.g"
+#line 338 "exp.g"
  case 43: sym(1) = "<apply><leq />"   +sym(1)+sym(3)+"</apply>"; break; 
-#line 336 "exp.g"
+#line 339 "exp.g"
  case 44: sym(1) = "<apply><geq />"   +sym(1)+sym(3)+"</apply>"; break; 
-#line 337 "exp.g"
+#line 340 "exp.g"
  case 45: sym(1) = "<apply><lt />"    +sym(1)+sym(3)+"</apply>"; break; 
-#line 338 "exp.g"
+#line 341 "exp.g"
  case 46: sym(1) = "<apply><gt />"    +sym(1)+sym(3)+"</apply>"; break; 
-#line 339 "exp.g"
+#line 342 "exp.g"
  case 47: sym(1) = "<apply><neq />"   +sym(1)+sym(3)+"</apply>"; break; 
-#line 341 "exp.g"
+#line 344 "exp.g"
  case 48: sym(1) = "<piece>"+sym(3)+sym(1)+"</piece>"; break; 
-#line 346 "exp.g"
+#line 349 "exp.g"
 
 case 50:
        sym(1) += sym(3);
        break;
 
-#line 355 "exp.g"
+#line 358 "exp.g"
 
 case 52:
        sym(1) = sym(2);
        break;
 
-#line 362 "exp.g"
+#line 365 "exp.g"
 
 case 53:
        sym(1) = "<bvar><ci>"+sym(1)+"</ci></bvar>";
        break;
 
-#line 369 "exp.g"
+#line 372 "exp.g"
 
 case 54:
        sym(1) += sym(3);
        break;
 
-#line 376 "exp.g"
+#line 379 "exp.g"
 
 case 55:
        sym(1) += sym(3);
        break;
 
-#line 383 "exp.g"
+#line 386 "exp.g"
 
 case 56:
        sym(1) = 
"<uplimit>"+sym(3)+"</uplimit><downlimit>"+sym(1)+"</downlimit>";
        break;
 
-#line 389 "exp.g"
+#line 392 "exp.g"
 
                } // switch
                m_stateStack[m_tos] = nt_action(act, lhs[r] - TERMINAL_COUNT);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitza/expressionstream.cpp 
new/analitza-4.11.90/analitza/expressionstream.cpp
--- old/analitza-4.11.2/analitza/expressionstream.cpp   2013-06-28 
19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitza/expressionstream.cpp  2013-10-30 
23:53:40.000000000 +0100
@@ -47,11 +47,10 @@
                m_last += m_dev->readLine()+'\n';
                if(Expression::isCompleteExpression(m_last)) {
                        break;
-               } else if(m_dev->atEnd()) {
-                       m_interrupted = true;
-                       break;
                }
        }
+       m_dev->skipWhiteSpace();
+       m_interrupted = !Expression::isCompleteExpression(m_last);
        QString last = m_last.trimmed();
        return Analitza::Expression(last, Expression::isMathML(last));
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitza/operations.cpp 
new/analitza-4.11.90/analitza/operations.cpp
--- old/analitza-4.11.2/analitza/operations.cpp 2013-08-28 19:01:48.000000000 
+0200
+++ new/analitza-4.11.90/analitza/operations.cpp        2013-10-30 
23:53:40.000000000 +0100
@@ -21,6 +21,7 @@
 #include <math.h>
 
 #include <cmath>
+#include <complex>
 #include <kdemacros.h>
 
 #include "value.h"
@@ -57,8 +58,9 @@
                        oper->setValue(a - b);
                        break;
                case Operator::power:
-                       oper->setValue(b==2 ? a*a
-                                                               : pow(a, b));
+                       oper->setValue( b==2 ? a*a
+                                       : b<1 && b>-1 && a<0 ? 
pow(complex<double>(a), complex<double>(b)).real()
+                                                                : pow(a, b));
                        break;
                case Operator::rem:
                        if(KDE_ISLIKELY(floor(b)!=0.))
@@ -113,7 +115,7 @@
                        oper->setValue((a || b) && !(a&&b));
                        break;
                case Operator::implies:
-                       oper->setValue((a || !b));
+                       oper->setValue(a || !b);
                        break;
                case Operator::gcd:  {
                        //code by michael cane aka kiko :)
@@ -142,7 +144,9 @@
                        }
                        break;
                case Operator::root:
-                       oper->setValue(b==2.0 ? sqrt(a) : pow(a, 1.0/b));
+                       oper->setValue(                   b==2.0 ? sqrt(a)
+                                         : (b>1 || b<-1) && a<0 ? 
pow(complex<double>(a), complex<double>(1./b)).real()
+                                                                               
         : pow(a, 1.0/b));
                        break;
                default:
                        break;
@@ -214,23 +218,23 @@
                case Operator::arccot:
                        val->setValue(log(a+pow(a*a+1., 0.5)));
                        break;
-               case Operator::arcsinh:
-                       val->setValue(0.5*(log(1.+1./a)-log(1.-1./a)));
+               case Operator::arcsinh: //see 
http://en.wikipedia.org/wiki/Inverse_hyperbolic_function
+                       val->setValue(asinh(a));
                        break;
                case Operator::arccosh:
-                       val->setValue(log(a+sqrt(a-1.)*sqrt(a+1.)));
+                       val->setValue(acosh(a));
                        break;
                case Operator::arccsc:
                        val->setValue(1/asin(a));
                        break;
                case Operator::arccsch:
-                       val->setValue(1/(0.5*(log(1.+1./a)-log(1.-1./a))));
+                       val->setValue(log(1/a+sqrt(1/(a*a)+1)));
                        break;
                case Operator::arcsec:
                        val->setValue(1/(acos(a)));
                        break;
                case Operator::arcsech:
-                       val->setValue(1/(log(a+sqrt(a-1.)*sqrt(a+1.))));
+                       val->setValue(log(1/a+sqrt(1/a+1)*sqrt(1/a-1)));
                        break;
                case Operator::arctanh:
                        val->setValue(atanh(a));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitza/tests/analitzatest.cpp 
new/analitza-4.11.90/analitza/tests/analitzatest.cpp
--- old/analitza-4.11.2/analitza/tests/analitzatest.cpp 2013-08-28 
19:01:48.000000000 +0200
+++ new/analitza-4.11.90/analitza/tests/analitzatest.cpp        2013-10-30 
23:53:40.000000000 +0100
@@ -89,13 +89,15 @@
        QTest::newRow("lambda")  << "(x->x+2)(2)" << 4.;
        QTest::newRow("lambda2") << "(x->3*x^2)(1)" << 3.;
        QTest::newRow("lambda3") << "(x->x*sum(t:t=0..3))(2)" << 12.;
-       
+       QTest::newRow("imaginarypow") << "(-4)^(1/4)" << 1.;
+       QTest::newRow("imaginaryroot") << "root(-4, 4)" << 1.;
+
        //comprehension
        QTest::newRow("sum.2bvars") << "sum(x*y : (x, y)=1..3)" << 36.;
        QTest::newRow("sum.list") << "sum(x : x@list{1,5,44})" << 50.;
-       
+
        QTest::newRow("sum.sum") << "sum(sum(x : x=0..i) : i=0..10)" << 220.;
-       
+
        QTest::newRow("exists") << "exists(x : x@list{true,true,false})" << 1.;
        QTest::newRow("forall") << "forall(x : x@list{true,true,false})" << 0.;
 //     QTest::newRow("emptysum") << "sum(x : x@list{})" << 0.;
@@ -477,6 +479,12 @@
                QVERIFY(b.isCorrect());
        }
        QCOMPARE(evalResult.toString(), result);
+
+       QString script = expression.join("\n");
+       script+="\n\n\n";
+       QTextStream stream(&script);
+       a->importScript(&stream);
+       QVERIFY(a->isCorrect());
 }
 
 void AnalitzaTest::testTypeUncorrection()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitza/value.cpp 
new/analitza-4.11.90/analitza/value.cpp
--- old/analitza-4.11.2/analitza/value.cpp      2013-08-28 19:01:48.000000000 
+0200
+++ new/analitza-4.11.90/analitza/value.cpp     2013-10-30 23:53:40.000000000 
+0100
@@ -40,36 +40,6 @@
        return e->accept(this);
 }
 
-/*enum Cn::ValueFormat Cn::whatValueFormat(const QDomElement& val)
-{
-       enum ValueFormat ret= none;
-       QString tag = val.tagName();
-       if(tag == "cn"){ // a is a number
-               if(val.attribute("type","real") == "real")              ret = 
real;
-               else if(val.attribute("type") == "integer")             ret = 
integer;
-               else if(val.attribute("type") == "e-notation")          ret = 
real;
-               else if(val.attribute("type") == "rational")            ret = 
real;
-               else if(val.attribute("type") == "complex-cartesian")   ret = 
none;
-               else if(val.attribute("type") == "complex-polar")       ret = 
none;
-               else if(val.attribute("type") == "constant") {
-                       if(val.text() == "&pi;")                ret=real;
-                       else if (val.text() == "&ee;" || val.text() == 
"&ExponentialE;")        ret = real;
-                       else if (val.text() == "&true;")        ret = boolean;
-                       else if (val.text() == "&false;")       ret = boolean;
-                       else if (val.text() == "&gamma;")       ret = real;
-                       //else if (val.text() == "&ImagniaryI;")        ; 
//TODO: Not implemented 
-                       else if (val.text() == "&infin;")       ret=nan;
-                       else if (val.text() == "&NaN;")         ret=nan;
-               }
-       } else if(tag=="true")          ret = boolean;
-       else if(tag=="false")           ret = boolean;
-       else if(tag=="pi")              ret = real;
-       else if(tag=="exponentiale")    ret = real;
-       else if(tag=="eulergamma")      ret = real;
-       
-       return ret;
-}*/
-
 bool Cn::setValue(const QDomElement& val)
 {
 //     this->m_vformat=whatValueFormat(val);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitza/value.h 
new/analitza-4.11.90/analitza/value.h
--- old/analitza-4.11.2/analitza/value.h        2013-08-28 19:01:48.000000000 
+0200
+++ new/analitza-4.11.90/analitza/value.h       2013-10-30 23:53:40.000000000 
+0100
@@ -82,17 +82,17 @@
                inline double& rvalue() { return m_value; }
 
                /**
-                *      Returns the value as an int.
+                *      @returns the value as an int.
                 */
                int intValue() const { return 
static_cast<int>(std::floor(m_value)); }
 
                /**
-                *      Returns whether it is a boolean value or not.
+                *      @returns whether it is a boolean value or not.
                 */
                bool isBoolean() const { return m_format==Boolean; }
 
                /**
-                *      Returns whether it is a character value or not.
+                *      @returns whether it is a character value or not.
                 */
                bool isCharacter() const { return m_format==Char; }
 
@@ -112,32 +112,32 @@
 //             static enum ValueFormat whatValueFormat(const QDomElement&);
 
                /**
-                *      Returns whether it is an integer value or not.
+                *      @returns whether it is an integer value or not.
                 */
                bool isInteger() const { return std::floor(m_value)==m_value; }
 
                /**
-                *      Returns whether @p d is equal than this object.
+                *      @returns whether @p d is equal than this object.
                 */
                bool operator==(const Cn& d) const { return m_value==d.m_value; 
}
 
                /**
-                *      Returns whether @p d is less than this object.
+                *      @returns whether @p d is less than this object.
                 */
                bool operator<(const Cn& d) const { return m_value<d.m_value; }
 
                /**
-                *      Returns whether @p d is less than this object's value.
+                *      @returns whether @p d is less than this object's value.
                 */
                bool operator<(double d) const { return m_value<d; }
 
                /**
-                *      Returns whether @p d is less or equal than this object.
+                *      @returns whether @p d is less or equal than this object.
                 */
                bool operator<=(const Cn& d) const { return m_value<=d.m_value; 
}
 
                /**
-                *      Returns whether @p d is less or equal than this 
object's value.
+                *      @returns whether @p d is less or equal than this 
object's value.
                 */
                bool operator<=(double d) const { return m_value<=d; }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitza/variable.cpp 
new/analitza-4.11.90/analitza/variable.cpp
--- old/analitza-4.11.2/analitza/variable.cpp   2013-06-28 19:16:39.000000000 
+0200
+++ new/analitza-4.11.90/analitza/variable.cpp  2013-10-30 23:53:40.000000000 
+0100
@@ -55,14 +55,19 @@
 bool Ci::matches(const Object* exp, QMap<QString, const Object*>* found) const
 {
        bool ret=false;
-       if(found->contains(m_name)) {
-               const Object* v=found->value(m_name);
-               Q_ASSERT(v);
+       const Object* v=found->value(m_name);
+       if(v) {
                ret=AnalitzaUtils::equalTree(exp, v);
        } else {
+               Q_ASSERT(!found->contains(m_name));
                found->insert(m_name, exp);
                ret=true;
        }
 //     qDebug() << "maaatch" << toString() << exp->toString() << ret;
        return ret;
 }
+
+QString Ci::toHtml() const
+{
+       return QString("<span class='%1'>%2</span>").arg(m_function ? "func" : 
"var").arg(m_name);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitza/variable.h 
new/analitza-4.11.90/analitza/variable.h
--- old/analitza-4.11.2/analitza/variable.h     2013-08-28 19:01:48.000000000 
+0200
+++ new/analitza-4.11.90/analitza/variable.h    2013-10-30 23:53:40.000000000 
+0100
@@ -55,7 +55,7 @@
                QString toMathML() const;
                
                /** Returns the HTML representation of the variable */
-               QString toHtml() const { return QString("<span 
class='%1'>%2</span>").arg(m_function ? "func" : "var").arg(m_name); }
+               QString toHtml() const;
                
                virtual QString visit(ExpressionWriter*) const;
                virtual bool matches(const Object* pattern, QMap<QString, const 
Object*>* found) const;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitzagui/plotsview2d.cpp 
new/analitza-4.11.90/analitzagui/plotsview2d.cpp
--- old/analitza-4.11.2/analitzagui/plotsview2d.cpp     2013-06-28 
19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitzagui/plotsview2d.cpp    2013-10-30 
23:53:40.000000000 +0100
@@ -64,6 +64,11 @@
     this->setAutoFillBackground(false);
 }
 
+void PlotsView2D::showEvent(QShowEvent* ev)
+{
+       QWidget::showEvent(ev);
+}
+
 PlotsView2D::~PlotsView2D() {}
 
 void PlotsView2D::drawFunctions(QPaintDevice* pd)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitzagui/plotsview2d.h 
new/analitza-4.11.90/analitzagui/plotsview2d.h
--- old/analitza-4.11.2/analitzagui/plotsview2d.h       2013-08-28 
19:01:48.000000000 +0200
+++ new/analitza-4.11.90/analitzagui/plotsview2d.h      2013-10-30 
23:53:40.000000000 +0100
@@ -81,6 +81,8 @@
     
     void setSelectionModel(QItemSelectionModel* selection);
 
+       virtual void showEvent(QShowEvent* ev);
+
 public slots:
     /** Marks the image as dirty and repaints everything. */
     void forceRepaint() { valid=false; repaint(); }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/data/plots/3Ds.plots 
new/analitza-4.11.90/analitzaplot/data/plots/3Ds.plots
--- old/analitza-4.11.2/analitzaplot/data/plots/3Ds.plots       1970-01-01 
01:00:00.000000000 +0100
+++ new/analitza-4.11.90/analitzaplot/data/plots/3Ds.plots      2013-10-30 
23:53:40.000000000 +0100
@@ -0,0 +1,2 @@
+plane1 := (x, y, z)->(x+y+z)-1
+plane2 := (x, y, z)->(x+y+z)-5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/analitza-4.11.2/analitzaplot/data/plots/basic_curves.plots 
new/analitza-4.11.90/analitzaplot/data/plots/basic_curves.plots
--- old/analitza-4.11.2/analitzaplot/data/plots/basic_curves.plots      
2013-06-28 19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/data/plots/basic_curves.plots     
2013-10-30 23:53:40.000000000 +0100
@@ -1 +1,3 @@
 sinus := x->sin x
+something := x*x+y*y=7.9
+plane1 := (x, y, z)->(x+y+z)-1 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/data/plots/conics.plots 
new/analitza-4.11.90/analitzaplot/data/plots/conics.plots
--- old/analitza-4.11.2/analitzaplot/data/plots/conics.plots    1970-01-01 
01:00:00.000000000 +0100
+++ new/analitza-4.11.90/analitzaplot/data/plots/conics.plots   2013-10-30 
23:53:40.000000000 +0100
@@ -0,0 +1,2 @@
+para:=x->x*x
+div:=y->2.2/y
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/data/plots/polar.plots 
new/analitza-4.11.90/analitzaplot/data/plots/polar.plots
--- old/analitza-4.11.2/analitzaplot/data/plots/polar.plots     1970-01-01 
01:00:00.000000000 +0100
+++ new/analitza-4.11.90/analitzaplot/data/plots/polar.plots    2013-10-30 
23:53:40.000000000 +0100
@@ -0,0 +1,2 @@
+spiral // xaxaxaxaxa //:= q->q
+//cosa// circle := q->3.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/functiongraph.cpp 
new/analitza-4.11.90/analitzaplot/functiongraph.cpp
--- old/analitza-4.11.2/analitzaplot/functiongraph.cpp  2013-08-28 
19:01:48.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/functiongraph.cpp 2013-10-30 
23:53:40.000000000 +0100
@@ -141,6 +141,16 @@
     return ret;
 }
 
+void FunctionGraph::clearIntervals()
+{
+    m_functionGraph->clearIntervals();
+}
+
+bool FunctionGraph::hasIntervals() const
+{
+    return m_functionGraph->hasIntervals();
+}
+
 QStringList FunctionGraph::parameters() const
 {
     Q_ASSERT(m_functionGraph);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/functiongraph.h 
new/analitza-4.11.90/analitzaplot/functiongraph.h
--- old/analitza-4.11.2/analitzaplot/functiongraph.h    2013-08-28 
19:01:48.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/functiongraph.h   2013-10-30 
23:53:40.000000000 +0100
@@ -62,6 +62,8 @@
 
     QPair<double, double> interval(const QString &argname) const;
     bool setInterval(const QString &argname, double min, double max);
+    void clearIntervals();
+    bool hasIntervals() const;
     
     /** @returns the parameters that a function expects */
     QStringList parameters() const;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/analitza-4.11.2/analitzaplot/plotsdictionarymodel.cpp 
new/analitza-4.11.90/analitzaplot/plotsdictionarymodel.cpp
--- old/analitza-4.11.2/analitzaplot/plotsdictionarymodel.cpp   2013-06-28 
19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/plotsdictionarymodel.cpp  2013-10-30 
23:53:40.000000000 +0100
@@ -33,11 +33,6 @@
     , m_currentItem(-1)
 {
     setHorizontalHeaderLabels(QStringList() << i18nc("@title:column", "Name"));
-    
-    QStringList res = KGlobal::dirs()->findAllResources("data", 
"libanalitza/plots/*.plots");
-    foreach(const QString& f, res) {
-        createDictionary(f);
-    }
 }
 
 PlotsDictionaryModel::~PlotsDictionaryModel()
@@ -49,7 +44,6 @@
     if (device.open(QFile::ReadOnly | QFile::Text)) {
         QTextStream stream(&device);
         Analitza::ExpressionStream s(&stream);
-        
         while(!s.atEnd()) {
             Analitza::Expression expression(s.next());
             Q_ASSERT(expression.isCorrect());
@@ -68,6 +62,14 @@
         qWarning() << "couldn't open" << file;
 }
 
+void PlotsDictionaryModel::createAllDictionaries()
+{
+    QStringList res = KGlobal::dirs()->findAllResources("data", 
"libanalitza/plots/*.plots");
+    foreach(const QString& f, res) {
+        createDictionary(f);
+    }
+}
+
 PlotsModel* PlotsDictionaryModel::plotModel()
 {
     if(!m_plots) {
@@ -97,15 +99,25 @@
     m_plots->clear();
     if(m_currentItem<0)
         return;
-    
+
     QModelIndex idx = index(m_currentItem, 0);
     Analitza::Expression exp(idx.data(ExpressionRole).toString());
     PlotBuilder req = PlotsFactory::self()->requestPlot(exp, Dim2D);
-//     qDebug() << exp.toString();
-    Q_ASSERT(req.canDraw());
+
+    if (!req.canDraw()){ // preference is given to 2D
+        PlotBuilder req = PlotsFactory::self()->requestPlot(exp, Dim3D);
+        Q_ASSERT(req.canDraw());
+        m_plots->addPlot(req.create(Qt::blue, 
idx.data(Qt::DisplayRole).toString()));
+        return;
+    }
     m_plots->addPlot(req.create(Qt::blue, 
idx.data(Qt::DisplayRole).toString()));
 }
 
+Analitza::Dimension PlotsDictionaryModel::dimension()
+{
+    return 
Dimension(m_plots->index(0,0).data(PlotsModel::DimensionRole).toInt());
+}
+
 void PlotsDictionaryModel::setCurrentIndex(const QModelIndex& idx)
 {
     setCurrentRow(idx.row());
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/plotsdictionarymodel.h 
new/analitza-4.11.90/analitzaplot/plotsdictionarymodel.h
--- old/analitza-4.11.2/analitzaplot/plotsdictionarymodel.h     2013-06-28 
19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/plotsdictionarymodel.h    2013-10-30 
23:53:40.000000000 +0100
@@ -22,9 +22,8 @@
 
 #include <QStandardItemModel>
 #include <QPointer>
-
+#include  <analitzaplot/plottingenums.h>
 #include "analitzaplotexport.h"
-
 namespace Analitza
 {
 class PlotsModel;
@@ -45,14 +44,15 @@
     
     PlotsModel* plotModel();
     void createDictionary(const QString& path);
-    
+    void createAllDictionaries();
+    Analitza::Dimension dimension();
+
 public slots:
     ///convenience class for currentRow
     void setCurrentIndex(const QModelIndex& idx);
     
 private:
     void updatePlotsModel();
-    
     QPointer<PlotsModel> m_plots;
     int m_currentItem;
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/plotsfactory.cpp 
new/analitza-4.11.90/analitzaplot/plotsfactory.cpp
--- old/analitza-4.11.2/analitzaplot/plotsfactory.cpp   2013-08-28 
19:01:48.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/plotsfactory.cpp  2013-10-30 
23:53:40.000000000 +0100
@@ -33,6 +33,11 @@
        : m_vars(new Variables)
 {}
 
+PlotsFactory::~PlotsFactory()
+{
+       delete m_vars;
+}
+
 PlotsFactory* PlotsFactory::self()
 {
        return factoryInstance;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/plotsfactory.h 
new/analitza-4.11.90/analitzaplot/plotsfactory.h
--- old/analitza-4.11.2/analitzaplot/plotsfactory.h     2013-08-28 
19:01:48.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/plotsfactory.h    2013-10-30 
23:53:40.000000000 +0100
@@ -55,6 +55,7 @@
 {
     public:
         PlotsFactory();
+        virtual ~PlotsFactory();
         
         static PlotsFactory* self();
         PlotBuilder requestPlot(const Analitza::Expression& expresssion, 
Dimension dim, Variables* vars = 0) const;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/plotter3d.cpp 
new/analitza-4.11.90/analitzaplot/plotter3d.cpp
--- old/analitza-4.11.2/analitzaplot/plotter3d.cpp      2013-08-28 
19:01:48.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/plotter3d.cpp     2013-10-30 
23:53:40.000000000 +0100
@@ -60,6 +60,7 @@
     , m_scale(60)
     , m_currentAxisIndicator(InvalidAxis)
     , m_simpleRotation(false)
+    , m_referencePlaneColor(Qt::darkGray)
 {
     resetViewPrivate(QVector3D(-45, 0, -135));
 }
@@ -142,6 +143,10 @@
     renderGL();
 }
 
+// add overloaded functions which call the underlying OpenGL function
+inline void glMultMatrix(const GLfloat  *m) { glMultMatrixf(m); }
+inline void glMultMatrix(const GLdouble *m) { glMultMatrixd(m); }
+
 void Plotter3D::drawPlots()
 {
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -152,7 +157,7 @@
 
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
-    glMultMatrixd(m_rot.data());
+    glMultMatrix(m_rot.constData());
 
     // Object Drawing :
     glCallList(m_sceneObjects.value(Axes));
@@ -397,6 +402,14 @@
     renderGL();
 }
 
+inline QMatrix4x4 get_matrix(GLfloat *m)
+{
+    return QMatrix4x4(m[0],  m[1],  m[2],  m[3],
+                      m[4],  m[5],  m[6],  m[7],
+                      m[8],  m[9],  m[10], m[11],
+                      m[12], m[13], m[14], m[15]);
+}
+
 void Plotter3D::rotate(int dx, int dy)
 {
     GLdouble ax = -dy;
@@ -411,11 +424,11 @@
         m_rot.rotate(angle, m_rotFixed.normalized());
         renderGL();
     } else {
-        GLdouble matrix[16] = {0}; // model view matrix from current OpenGL 
state
+        GLfloat matrix[16] = {0}; // model view matrix from current OpenGL 
state
 
-        glGetDoublev(GL_MODELVIEW_MATRIX, matrix);
+        glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
 
-        QMatrix4x4 matrix4(matrix);
+        QMatrix4x4 matrix4(get_matrix(matrix));
         bool couldInvert;
         matrix4 = matrix4.inverted(&couldInvert);
 
@@ -737,6 +750,13 @@
     glEndList();
 }
 
+void Plotter3D::setReferencePlaneColor(const QColor& color)
+{
+    m_referencePlaneColor=color;
+    initRefPlanes();
+    renderGL();
+}
+
 void Plotter3D::initRefPlanes()
 {
     if (m_sceneObjects.contains(RefPlaneXY))
@@ -746,7 +766,7 @@
 
     glNewList(m_sceneObjects.value(RefPlaneXY), GL_COMPILE );
     glLineWidth(1);
-    glColor3ub(48, 48, 48);
+    
glColor3ub(m_referencePlaneColor.red(),m_referencePlaneColor.green(),m_referencePlaneColor.blue());
     glBegin( GL_LINES );
     glVertex3f(-150.0, 600.0, m_depth);
     glVertex3f(-150.0,-600.0, m_depth);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/analitza-4.11.2/analitzaplot/plotter3d.h 
new/analitza-4.11.90/analitzaplot/plotter3d.h
--- old/analitza-4.11.2/analitzaplot/plotter3d.h        2013-08-28 
19:01:48.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/plotter3d.h       2013-10-30 
23:53:40.000000000 +0100
@@ -115,7 +115,10 @@
         /** Hide the current indicator of the axis */
         void hideAxisHint();
 
-        /**  If the flag @p simplerot is true the rotation ignores any fixed 
or free direction */
+        /** Set the color of the grids of the reference plane in the 3D view */
+        void setReferencePlaneColor(const QColor &color);
+
+       /**  If the flag @p simplerot is true the rotation ignores any fixed or 
free direction */
         void setUseSimpleRotation(bool simplerot) { m_simpleRotation = 
simplerot; }
 
         /**  Get information about the current rotarion approach: if return 
true then rotation is simple. */
@@ -155,6 +158,7 @@
         bool m_simpleRotation;
         QVector3D m_simpleRotationVector;
         QVector3D m_lightpos;
+        QColor m_referencePlaneColor;
 };
 
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/analitza-4.11.2/analitzaplot/private/abstractfunctiongraph.cpp 
new/analitza-4.11.90/analitzaplot/private/abstractfunctiongraph.cpp
--- old/analitza-4.11.2/analitzaplot/private/abstractfunctiongraph.cpp  
2013-08-28 19:01:48.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/private/abstractfunctiongraph.cpp 
2013-10-30 23:53:40.000000000 +0100
@@ -37,9 +37,9 @@
     : AbstractMappingGraph()
     , m_resolution(200)
     , m_e(e)
-    , m_varsmod(v)
+    , m_varsmod(v ? new Variables(*v) : new Variables)
 {
-    analyzer = v ? new Analitza::Analyzer(v) : new Analitza::Analyzer;
+    analyzer = new Analitza::Analyzer(m_varsmod);
 
     Q_ASSERT(!m_e.isEquation());
     
@@ -59,6 +59,7 @@
 {
     qDeleteAll(m_argumentValues);
     delete analyzer;
+    delete m_varsmod;
 }
 
 Dimension AbstractFunctionGraph::spaceDimension() const
@@ -78,6 +79,7 @@
     Analitza::Expression exp = analyzer->expression();
     QVector<Analitza::Object*> prevStack = analyzer->runStack();
     delete analyzer;
+    delete m_varsmod;
     
     analyzer = new Analitza::Analyzer(variables);
     analyzer->setExpression(exp);
@@ -117,6 +119,12 @@
 {
     Q_ASSERT(analyzer->expression().bvarList().contains(argname));
     
+    if (min == Expression(Analitza::Cn("-inf")) && 
+        max == Expression(Analitza::Cn("inf")))
+    {
+        m_argumentIntervals[argname] = RealInterval(EndPoint(min), 
EndPoint(max));        
+    }
+    
     Analitza::Analyzer *intervalsAnalizer = new 
Analitza::Analyzer(analyzer->variables());
     intervalsAnalizer->setExpression(min);
     double min_val = intervalsAnalizer->calculate().toReal().value();
@@ -148,6 +156,11 @@
     return ret;
 }
 
+void AbstractFunctionGraph::clearIntervals()
+{
+    m_argumentIntervals.clear();
+}
+
 bool AbstractFunctionGraph::setInterval(const QString &argname, double min, 
double max)
 {
     Q_ASSERT(analyzer->expression().bvarList().contains(argname));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/analitza-4.11.2/analitzaplot/private/abstractfunctiongraph.h 
new/analitza-4.11.90/analitzaplot/private/abstractfunctiongraph.h
--- old/analitza-4.11.2/analitzaplot/private/abstractfunctiongraph.h    
2013-08-28 19:01:48.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/private/abstractfunctiongraph.h   
2013-10-30 23:53:40.000000000 +0100
@@ -77,6 +77,7 @@
     
     QPair<double, double> interval(const QString &argname) const;
     virtual bool setInterval(const QString &argname, double min, double max);
+    void clearIntervals();
     bool hasIntervals() const;
     
     virtual QStringList parameters() const = 0;
@@ -104,42 +105,31 @@
 class EndPoint
 {
 public:
-    EndPoint() : m_isInfinite(false)  {}
-    
-    //el owner de *analitza sera functiongraph ... no tiene sentido usar usar 
esta calse fuera de functiongraph
-    EndPoint(double value): m_isInfinite(false)
+    EndPoint() {}
+
+    EndPoint(double value)
     {
         setValue(value);
     }
 
-    EndPoint(const Analitza::Expression &expression) : m_isInfinite(false)
+    EndPoint(const Analitza::Expression &expression)
     {
         if (!setValue(expression))
             setValue(0.0);
     }
 
-    EndPoint(const EndPoint &other) : 
m_expressionValue(other.m_expressionValue), m_isInfinite(other.m_isInfinite)
+    EndPoint(const EndPoint &other) : 
m_expressionValue(other.m_expressionValue)
     {
         
     }
-
-    bool isInfinite() const 
-    {
-        return m_isInfinite;
-    }
     
-    void setInfinite(bool infinite) { m_isInfinite = infinite; }
-    
-    //no cambiar el exp de analyzer en setvalue por el costo ... solo cuando 
se quier calcular el value
-    //case evaluate = true
     Analitza::Expression value(Analitza::Analyzer *analyzer) const
     { 
-        analyzer->setExpression(m_expressionValue);
+        QString expstr = m_expressionValue.toString();
         
-        if (!m_isInfinite)
-            return analyzer->calculate();
-
-        return Analitza::Expression(Analitza::Cn("inf"));
+        analyzer->setExpression(m_expressionValue);
+            
+        return analyzer->calculate();
     }
 
     Analitza::Expression value() const
@@ -147,7 +137,6 @@
         return m_expressionValue;
     }
     
-    //no cambiar el exp de analyzer en setvalue por el costo ... solo cuando 
se quier calcular el value
     void setValue(double value)
     { 
         m_expressionValue = Analitza::Expression(Analitza::Cn(value)); 
@@ -169,28 +158,25 @@
     
     bool operator==(const EndPoint &other) const 
     { 
-        return m_expressionValue == other.m_expressionValue && m_isInfinite == 
other.m_isInfinite;
+        return m_expressionValue == other.m_expressionValue;
     }
     
     EndPoint operator=(const EndPoint& other) 
     {
         m_expressionValue = other.m_expressionValue;
-        m_isInfinite = other.m_isInfinite;
         
         return *this;
     }
 
 private:
     Analitza::Expression m_expressionValue;
-    bool m_isInfinite;
 };
 
 class RealInterval
 {
 public:
     RealInterval() {}
-    RealInterval(const EndPoint &lEndPoint, const EndPoint &hEndPoint) : 
m_lowEndPoint(lEndPoint), m_highEndPoint(hEndPoint) {
-    }
+    RealInterval(const EndPoint &lEndPoint, const EndPoint &hEndPoint) : 
m_lowEndPoint(lEndPoint), m_highEndPoint(hEndPoint) {}
     RealInterval(const RealInterval &other) : 
m_lowEndPoint(other.m_lowEndPoint), m_highEndPoint(other.m_highEndPoint) {}
 
     EndPoint lowEndPoint() const { return m_lowEndPoint; }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/analitza-4.11.2/analitzaplot/private/backends/cartesiancurve.cpp 
new/analitza-4.11.90/analitzaplot/private/backends/cartesiancurve.cpp
--- old/analitza-4.11.2/analitzaplot/private/backends/cartesiancurve.cpp        
2013-06-28 19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/private/backends/cartesiancurve.cpp       
2013-10-30 23:53:40.000000000 +0100
@@ -251,8 +251,19 @@
 
 void FunctionX::update(const QRectF& viewport)
 {
-    double l_lim=viewport.top()-.1, r_lim=viewport.bottom()+.1;
+    double l_lim=0, r_lim=0;
+    
+    if (!hasIntervals()) {
+        l_lim=viewport.left();
+        r_lim=viewport.right();
+    } else {
+        QPair< double, double> limits = interval(parameters().first());
+        l_lim = limits.first;
+        r_lim = limits.second;
+    }
+
     calculateValues(l_lim, r_lim);
+    
     for(int i=0; i<points.size(); i++) {
         QPointF p=points[i];
         points[i]=QPointF(p.y(), p.x());
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/analitza-4.11.2/analitzaplot/private/backends/cartesiansurface.cpp 
new/analitza-4.11.90/analitzaplot/private/backends/cartesiansurface.cpp
--- old/analitza-4.11.2/analitzaplot/private/backends/cartesiansurface.cpp      
2013-06-28 19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/private/backends/cartesiansurface.cpp     
2013-10-30 23:53:40.000000000 +0100
@@ -121,3 +121,35 @@
 
 REGISTER_SURFACE(Fxz)
 
+class Fyz : public AbstractSurface/*, static class? better macros FooClass*/
+{
+public:
+    CONSTRUCTORS(Fyz)
+    TYPE_NAME(I18N_NOOP("Surface x=F(y,z)"))
+    
EXPRESSION_TYPE(Analitza::ExpressionType(Analitza::ExpressionType::Lambda).addParameter(
+                        
Analitza::ExpressionType(Analitza::ExpressionType::Value)).addParameter(
+                        
Analitza::ExpressionType(Analitza::ExpressionType::Value)).addParameter(
+                        
Analitza::ExpressionType(Analitza::ExpressionType::Value)))
+    COORDDINATE_SYSTEM(Cartesian)
+    PARAMETERS(QStringList("y") << "z")
+    ICON_NAME("newfunction3d")
+    EXAMPLES(QStringList("y+z"))
+
+    QVector3D fromParametricArgs(double u, double v);
+    void update(const QVector3D & oppositecorner1, const QVector3D & 
oppositecorner2);
+};
+
+QVector3D Fyz::fromParametricArgs(double u, double v)
+{
+    arg("y")->setValue(u);
+    arg("z")->setValue(v);    
+    
+    return QVector3D(u,analyzer->calculateLambda().toReal().value(),v);
+}
+
+void Fyz::update(const QVector3D & oppositecorner1, const QVector3D & 
oppositecorner2)
+{
+    buildParametricSurface();
+}
+
+REGISTER_SURFACE(Fyz)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/analitza-4.11.2/analitzaplot/private/backends/implicitcurve.cpp 
new/analitza-4.11.90/analitzaplot/private/backends/implicitcurve.cpp
--- old/analitza-4.11.2/analitzaplot/private/backends/implicitcurve.cpp 
2013-06-28 19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/private/backends/implicitcurve.cpp        
2013-10-30 23:53:40.000000000 +0100
@@ -71,28 +71,22 @@
     points.clear();
     jumps.clear();
 
-    //TODO
-//     QPair<double, double> ix = interval("x");
-//     QPair<double, double> iy = interval("y");    
-//     double minx = ix.first;
-//     double maxx = ix.second;
-//     double miny = iy.first;
-//     double maxy = iy.second;
-//     
+    double minx = vp.left();
+    double maxx = vp.right();
+    double miny = vp.top();
+    double maxy = vp.bottom();
     
-    double minx = 0;
-    double maxx = 0;
-    double miny = 0;
-    double maxy = 0;
-    
-    if (!hasIntervals())
+    if (hasIntervals())
     {
-        minx = vp.left();
-        maxx = vp.right();
-        miny = vp.top();
-        maxy = vp.bottom();
-    }
+        QPair<double, double> intervalx = interval("x");
+        QPair<double, double> intervaly = interval("y");
 
+        minx = intervalx.first;
+        maxx = intervalx.second;
+        miny = intervaly.first;
+        maxy = intervaly.second;
+    }
+    
     setWorld(minx, maxx, miny, maxy);
     buildGeometry();
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/analitza-4.11.2/analitzaplot/private/backends/polarcurve.cpp 
new/analitza-4.11.90/analitzaplot/private/backends/polarcurve.cpp
--- old/analitza-4.11.2/analitzaplot/private/backends/polarcurve.cpp    
2013-06-28 19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/private/backends/polarcurve.cpp   
2013-10-30 23:53:40.000000000 +0100
@@ -71,7 +71,7 @@
         double pi_factor = qMax(qMax(qAbs(viewport.left()), 
qAbs(viewport.right())), 
                                 qMax(qAbs(viewport.bottom()), 
qAbs(viewport.top())));
 
-        pi_factor = qMax(pi_factor, 16.); // 16 steps at minimun
+        pi_factor = qMax(pi_factor, 16.); // 16 steps at minimum
 
         dlimit = -M_PI*pi_factor;
         ulimit =  M_PI*pi_factor;
@@ -84,11 +84,14 @@
         dlimit = limits.first;
         ulimit = limits.second;
         inv_res = (ulimit-dlimit)/(M_PI*M_PI*16);
-        
     }
     Q_ASSERT(inv_res!=0);
 
     double final=ulimit-inv_res;
+    if((final<0) != (inv_res<0)) {
+        inv_res *= -1;
+    }
+
     for(double th=dlimit; th<final; th+=inv_res) {
         p->setValue(th);
         double r = analyzer->calculateLambda().toReal().value();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/analitza-4.11.2/analitzaplot/private/backends/sphericalsurface.cpp 
new/analitza-4.11.90/analitzaplot/private/backends/sphericalsurface.cpp
--- old/analitza-4.11.2/analitzaplot/private/backends/sphericalsurface.cpp      
2013-06-28 19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/private/backends/sphericalsurface.cpp     
2013-10-30 23:53:40.000000000 +0100
@@ -114,7 +114,8 @@
 
 void SphericalSurface::update(const QVector3D & oppositecorner1, const 
QVector3D & oppositecorner2)
 {
-//     Q_UNUSED(viewport);
+    Q_UNUSED(oppositecorner1);
+    Q_UNUSED(oppositecorner2);
     buildParametricSurface();
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/analitza-4.11.2/analitzaplot/private/utils/marchingsquares.cpp 
new/analitza-4.11.90/analitzaplot/private/utils/marchingsquares.cpp
--- old/analitza-4.11.2/analitzaplot/private/utils/marchingsquares.cpp  
2013-06-28 19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/private/utils/marchingsquares.cpp 
2013-10-30 23:53:40.000000000 +0100
@@ -389,7 +389,7 @@
 void MarchingSquares::tipo01(QList<sArista2D> aristas)
 {
     
-    if (aristas.isEmpty()) return;
+    if (aristas.size()<2) return;
 
     QList<QPointF> triangulos;
 
@@ -444,48 +444,22 @@
 }
 void MarchingSquares::setWorld(double minx, double maxx, double miny, double 
maxy)
 {
-        sLimitesEspacio2D _esp;
+    sLimitesEspacio2D _esp;
 
-        double a = 4;
+    double a = 4;
 
-        _esp.minX = minx;
-        _esp.maxX = maxx;
-        _esp.minY = miny;
-        _esp.maxY = maxy;
+    _esp.minX = minx;
+    _esp.maxX = maxx;
+    _esp.minY = miny;
+    _esp.maxY = maxy;
 
-//         qDebug() << _esp.minX << _esp.maxX << _esp.minY << _esp.maxY;
-        
-        largo_mundo = 1;
+    largo_mundo = 1;
 
-//         qDebug() << largo_mundo;
-    //a mas pequenio el size se detectan las singularidades
+    // a mas pequenio el size se detectan las singularidades
     min_grid = qMin(fabs(maxx-minx), fabs(maxy-miny))/256;
-    
-    if (min_grid>0.05 && min_grid < 1)
-        min_grid = 0.05; // 0.05 es el minimo valor para la presicion
-            
-        mundo = _esp;
-
-///
-/*
-    sLimitesEspacio2D _esp;
 
-    double w = maxx-minx;
-    double h = maxy-miny;
-    
-    double presc = 0.1;
-    
-    _esp.minX = minx-presc*w;
-    _esp.maxX = maxx+presc*w;
-    _esp.minY = miny-presc*h;
-    _esp.maxY = maxy+presc*h;
-
-    //a mas pequenio el size se detectan las singularidades
-    min_grid = qMin(fabs(maxx-minx), fabs(maxy-miny))/256;
-    
     if (min_grid>0.05 && min_grid < 1)
         min_grid = 0.05; // 0.05 es el minimo valor para la presicion
-    
-    largo_mundo = 1;
-    mundo = _esp;*/
+
+    mundo = _esp;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/analitza-4.11.2/analitzaplot/tests/planecurvetest.cpp 
new/analitza-4.11.90/analitzaplot/tests/planecurvetest.cpp
--- old/analitza-4.11.2/analitzaplot/tests/planecurvetest.cpp   2013-08-28 
19:01:48.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/tests/planecurvetest.cpp  2013-10-30 
23:53:40.000000000 +0100
@@ -55,13 +55,28 @@
     QTest::newRow("fy-diag-line") << "y->y";
     QTest::newRow("vector-diag-line") << "t->vector{t,t}";
     QTest::newRow("simple-algebraic") << "x*x+y*y=3";
+    QTest::newRow("roots") << "y=root(x,y)";
+    QTest::newRow("polar") << "abs(sin(2*q)/sin(q/2))";
 }
 
 void PlaneCurveTest::testCorrect()
 {
     QFETCH(QString, input);
+    
+    PlotBuilder pb = PlotsFactory::self()->requestPlot(Expression(input), 
Dim2D);
 
-    QVERIFY(PlotsFactory::self()->requestPlot(Expression(input), 
Dim2D).canDraw());
+    QVERIFY(pb.canDraw());
+    if(pb.canDraw()) {
+        FunctionGraph* item = pb.create(Qt::green, "hola");
+        QVERIFY(item);
+        QVERIFY(item->isCorrect());
+        PlaneCurve* curve = dynamic_cast<PlaneCurve*>(item);
+        QVERIFY(curve);
+
+        curve->update(QRect(QPoint(-5, 7), QPoint(5, -7)));
+        curve->update(QRectF(-5,-5,10,10));
+        QVERIFY(item->isCorrect() && !curve->points().isEmpty());
+    }
 }
 
 void PlaneCurveTest::testIncorrect_data()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/analitza-4.11.2/analitzaplot/tests/plotsmodeltest.cpp 
new/analitza-4.11.90/analitzaplot/tests/plotsmodeltest.cpp
--- old/analitza-4.11.2/analitzaplot/tests/plotsmodeltest.cpp   2013-06-28 
19:16:39.000000000 +0200
+++ new/analitza-4.11.90/analitzaplot/tests/plotsmodeltest.cpp  2013-10-30 
23:53:40.000000000 +0100
@@ -90,6 +90,7 @@
         qDebug() << "errors:" << item->errors();
     QVERIFY(item->isCorrect());
     
+    item->update(QRect(QPoint(-5, 7), QPoint(5, -7)));
     item->update(QRectF(-5,-5,10,10)); // the viewport is in world coordinates 
(not screen coordinates)
     if(!item->isCorrect())
         qDebug() << "error" << item->errors();

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to