/************************************************************************ ** ** @file calculator.cpp ** @author Roman Telezhynskyi ** @date November 15, 2013 ** ** @brief ** @copyright ** This source code is part of the Valentine project, a pattern making ** program, whose allow create and modeling patterns of clothing. ** Copyright (C) 2013 Valentina project ** All Rights Reserved. ** ** Valentina is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** Valentina is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with Valentina. If not, see . ** *************************************************************************/ #include "calculator.h" #include #include "../widgets/vapplication.h" //--------------------------------------------------------------------------------------------------------------------- /** * @brief Calculator class constructor. * @param data pointer to a variable container. */ Calculator::Calculator(const VContainer *data) :QmuParser() { //String with all unique symbols for supported alpabets. // See script alphabets.py for generation and more information. const QString symbols = QStringLiteral("ցЀĆЈVӧĎАғΕĖӅИқΝĞơРңњΥĦШҫ̆جگĮаҳѕεشԶиһνԾрυلՆӝшËՎҔPÓՖXӛӟŞӣզhëծpóӞնxßվāŁЃֆĉЋCŬđ" "ҐГΒęҘЛΚŘġҠУGاհЫدԱҰгβطԹõлκKՁÀуςهՉÈыvیՑÐSOřӘћաőcӐթèkàѓżűðsķչøӥӔĀփїІĈЎґĐΗЖҙĘȚ" "ΟОҡĠآΧЦتЮұİزηжԸغοоÁՀقχцÉՈيюÑՐђӋіәťӆўáŠĺѐfөըnñŰӤӨӹոľЁրăЉŭċБӸēłΔҖЙŤěΜӜDСձģΤӰ" "ЩīņحҮбưԳصδHйԻŇμӲӴсՃمτƠщՋєLQŹՓŕÖYśÞaգĽæiŽիӓîqճöyջþĂօЄӦĊЌΑĒДҗјΙȘĚМΡéĵĢФūӚΩبĪ" "ЬүќαذԲдҷιظԺмρՂфÇωوՊьÏՒTŚĻJբdçժlïӪղtպӫAւąЇčŃЏĕӯЗΖEțŮĝПΞأĥĹЧΦثÆӳЯIسŲԵзζԽпξكՅ" "ÄчφNMՍӌяӢՕÔWÎŝÜџёźեägխoӒյôwĶBžսüЂĄև̈ЊČƏљΓВҕĔӮΛКĜΣТҥĤکЪƯخγвŅԴŪضλкԼĴσтÅՄنъÍՌR" "ӕՔZÝŜbåդﻩjíլļrӵմzýռپêЅքćچЍďӱҒЕůėژșΘØҚНğńءΠFҢХħΨҪЭųįҶرҲеԷňعθҺнԿفπÂхՇψÊэšՏÒU" "əÚѝŻşҤӑâeէŐımկòuշÕúտŔ"); // Defining identifier character sets DefineNameChars(QStringLiteral("0123456789_") + symbols); DefineOprtChars(symbols + QStringLiteral("+-*^/?<>=#!$%&|~'_")); // Add variables InitVariables(data); // Add unary operators DefinePostfixOprt(cm_Oprt, CmUnit); DefinePostfixOprt(mm_Oprt, MmUnit); DefinePostfixOprt(in_Oprt, InchUnit); } //--------------------------------------------------------------------------------------------------------------------- /** * @brief eval calculate formula. * @param formula string of formula. * @return value of formula. */ qreal Calculator::EvalFormula(const QString &formula) { SetExpr(formula); return Eval(); } //--------------------------------------------------------------------------------------------------------------------- void Calculator::InitVariables(const VContainer *data) { if (qApp->patternType() == Pattern::Standard) { DefineVar(data->SizeName(), data->size()); DefineVar(data->HeightName(), data->height()); } { const QHash *lengthLines = data->DataLengthLines(); QHash::const_iterator i = lengthLines->constBegin(); while (i != lengthLines->constEnd()) { DefineVar(i.key(), i.value()); ++i; } } { const QHash *lengthSplines = data->DataLengthSplines(); QHash::const_iterator i = lengthSplines->constBegin(); while (i != lengthSplines->constEnd()) { DefineVar(i.key(), i.value()); ++i; } } { const QHash *lengthArcs = data->DataLengthArcs(); QHash::const_iterator i = lengthArcs->constBegin(); while (i != lengthArcs->constEnd()) { DefineVar(i.key(), i.value()); ++i; } } { const QHash *lineAngles = data->DataLineAngles(); QHash::const_iterator i = lineAngles->constBegin(); while (i != lineAngles->constEnd()) { DefineVar(i.key(), i.value()); ++i; } } { const QHash *measurements = data->DataMeasurements(); QHash::const_iterator i = measurements->constBegin(); while (i != measurements->constEnd()) { if (qApp->patternType() == Pattern::Standard) { DefineVar(i.key(), i.value().GetValue(data->size(), data->height())); } else { DefineVar(i.key(), i.value().GetValue()); } ++i; } } { const QHash *increments = data->DataIncrements(); QHash::const_iterator i = increments->constBegin(); while (i != increments->constEnd()) { if (qApp->patternType() == Pattern::Standard) { DefineVar(i.key(), i.value().GetValue(data->size(), data->height())); } else { DefineVar(i.key(), i.value().GetValue()); } ++i; } } } //--------------------------------------------------------------------------------------------------------------------- qreal Calculator::CmUnit(qreal val) { qreal unit = val; switch(qApp->patternUnit()) { case Valentina::Mm: unit = val * 10.0; break; case Valentina::Cm: break; case Valentina::Inch: unit = val / 2.54; break; default: break; } return unit; } //--------------------------------------------------------------------------------------------------------------------- qreal Calculator::MmUnit(qreal val) { qreal unit = val; switch(qApp->patternUnit()) { case Valentina::Mm: break; case Valentina::Cm: unit = val / 10.0; break; case Valentina::Inch: unit = val / 25.4; break; default: break; } return unit; } //--------------------------------------------------------------------------------------------------------------------- qreal Calculator::InchUnit(qreal val) { qreal unit = val; switch(qApp->patternUnit()) { case Valentina::Mm: unit = val * 25.4; break; case Valentina::Cm: unit = val * 2.54; break; case Valentina::Inch: break; default: break; } return unit; }