Create window table of variables
This commit is contained in:
parent
0b6311d4cd
commit
1cd249cc14
|
@ -19,7 +19,12 @@ SOURCES += main.cpp\
|
||||||
widgets/vgraphicssimpletextitem.cpp \
|
widgets/vgraphicssimpletextitem.cpp \
|
||||||
xml/vdomdocument.cpp \
|
xml/vdomdocument.cpp \
|
||||||
container/vpointf.cpp \
|
container/vpointf.cpp \
|
||||||
container/vcontainer.cpp
|
container/vcontainer.cpp \
|
||||||
|
tools/vtoolpoint.cpp \
|
||||||
|
container/calculator.cpp \
|
||||||
|
dialogs/dialogincrements.cpp \
|
||||||
|
container/vstandarttablecell.cpp \
|
||||||
|
container/vincrementtablerow.cpp
|
||||||
|
|
||||||
HEADERS += mainwindow.h \
|
HEADERS += mainwindow.h \
|
||||||
widgets/vmaingraphicsscene.h \
|
widgets/vmaingraphicsscene.h \
|
||||||
|
@ -29,10 +34,16 @@ HEADERS += mainwindow.h \
|
||||||
widgets/vgraphicssimpletextitem.h \
|
widgets/vgraphicssimpletextitem.h \
|
||||||
xml/vdomdocument.h \
|
xml/vdomdocument.h \
|
||||||
container/vpointf.h \
|
container/vpointf.h \
|
||||||
container/vcontainer.h
|
container/vcontainer.h \
|
||||||
|
tools/vtoolpoint.h \
|
||||||
|
container/calculator.h \
|
||||||
|
dialogs/dialogincrements.h \
|
||||||
|
container/vstandarttablecell.h \
|
||||||
|
container/vincrementtablerow.h
|
||||||
|
|
||||||
FORMS += mainwindow.ui \
|
FORMS += mainwindow.ui \
|
||||||
dialogs/dialogsinglepoint.ui
|
dialogs/dialogsinglepoint.ui \
|
||||||
|
dialogs/dialogincrements.ui
|
||||||
|
|
||||||
RESOURCES += \
|
RESOURCES += \
|
||||||
icon.qrc \
|
icon.qrc \
|
||||||
|
|
323
container/calculator.cpp
Normal file
323
container/calculator.cpp
Normal file
|
@ -0,0 +1,323 @@
|
||||||
|
#include "calculator.h"
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#define DELIMITER 1
|
||||||
|
#define VARIABLE 2
|
||||||
|
#define NUMBER 3
|
||||||
|
#define COMMAND 4
|
||||||
|
#define STRING 5
|
||||||
|
#define QUOTE 6
|
||||||
|
#define FINISHED 10
|
||||||
|
#define EOL 9
|
||||||
|
|
||||||
|
Calculator::Calculator(VContainer *data){
|
||||||
|
index = 0;
|
||||||
|
this->data = data;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal Calculator::eval(QString prog){
|
||||||
|
debugFormula.clear();
|
||||||
|
this->prog = prog;
|
||||||
|
qDebug()<<"Формула: "<<prog;
|
||||||
|
index = 0;
|
||||||
|
qreal result = get_exp();
|
||||||
|
QString str = QString(" = %1").arg(result, 0, 'f', 3);
|
||||||
|
debugFormula.append(str);
|
||||||
|
qDebug()<<"Результат:"<<debugFormula;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal Calculator::get_exp(){
|
||||||
|
qreal result = 0;
|
||||||
|
get_token();
|
||||||
|
if(token.isEmpty()) {
|
||||||
|
serror(2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
level2(&result);
|
||||||
|
putback(); /* возвращает последнюю считаную
|
||||||
|
лексему обратно во входной поток */
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Сложение или вычитание двух термов */
|
||||||
|
void Calculator::level2(qreal *result){
|
||||||
|
QChar op;
|
||||||
|
qreal hold;
|
||||||
|
|
||||||
|
level3(result);
|
||||||
|
while((op=token[0]) == '+' || op == '-') {
|
||||||
|
get_token();
|
||||||
|
level3(&hold);
|
||||||
|
arith(op,result,&hold);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Вычисление произведения или частного двух фвкторов */
|
||||||
|
void Calculator::level3(qreal *result){
|
||||||
|
QChar op;
|
||||||
|
qreal hold;
|
||||||
|
|
||||||
|
level4(result);
|
||||||
|
|
||||||
|
while((op = token[0]) == '*' || op == '/' || op == '%') {
|
||||||
|
get_token();
|
||||||
|
level4(&hold);
|
||||||
|
arith(op,result,&hold);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Обработка степени числа (целочисленной) */
|
||||||
|
void Calculator::level4(qreal *result){
|
||||||
|
qreal hold;
|
||||||
|
|
||||||
|
level5(result);
|
||||||
|
if(token[0] == '^') {
|
||||||
|
get_token();
|
||||||
|
level4(&hold);
|
||||||
|
arith('^', result, &hold);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Унарный + или - */
|
||||||
|
void Calculator::level5(qreal *result){
|
||||||
|
QChar op;
|
||||||
|
|
||||||
|
op = '\0';
|
||||||
|
if((token_type==DELIMITER) && token[0]=='+' || token[0]=='-') {
|
||||||
|
op = token[0];
|
||||||
|
get_token();
|
||||||
|
}
|
||||||
|
level6(result);
|
||||||
|
if(op != '\0')
|
||||||
|
unary(op, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Обработка выражения в круглых скобках */
|
||||||
|
void Calculator::level6(qreal *result){
|
||||||
|
if((token[0] == '(') && (token_type == DELIMITER)) {
|
||||||
|
get_token();
|
||||||
|
level2(result);
|
||||||
|
if(token[0] != ')')
|
||||||
|
serror(1);
|
||||||
|
get_token();
|
||||||
|
} else
|
||||||
|
primitive(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Определение значения переменной по ее имени */
|
||||||
|
void Calculator::primitive(qreal *result){
|
||||||
|
QString str;
|
||||||
|
switch(token_type) {
|
||||||
|
case VARIABLE:
|
||||||
|
*result = find_var(token);
|
||||||
|
str = QString("%1").arg(*result, 0, 'f', 3);
|
||||||
|
debugFormula.append(str);
|
||||||
|
get_token();
|
||||||
|
return;
|
||||||
|
case NUMBER:
|
||||||
|
*result = token.toDouble();
|
||||||
|
str = QString("%1").arg(*result, 0, 'f', 3);
|
||||||
|
debugFormula.append(str);
|
||||||
|
get_token();
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
serror(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Выполнение специфицированной арифметики */
|
||||||
|
void Calculator::arith(QChar o, qreal *r, qreal *h){
|
||||||
|
qreal t;//, ex;
|
||||||
|
|
||||||
|
switch(o.toLatin1()) {
|
||||||
|
case '-':
|
||||||
|
*r = *r-*h;
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
*r = *r+*h;
|
||||||
|
break;
|
||||||
|
case '*':
|
||||||
|
*r = *r * *h;
|
||||||
|
break;
|
||||||
|
case '/':
|
||||||
|
*r = (*r)/(*h);
|
||||||
|
break;
|
||||||
|
case '%':
|
||||||
|
t = (*r)/(*h);
|
||||||
|
*r = *r-(t*(*h));
|
||||||
|
break;
|
||||||
|
case '^':
|
||||||
|
*r = pow(*r, *h);
|
||||||
|
// ex =*r;
|
||||||
|
// if(*h==0) {
|
||||||
|
// *r = 1;
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// for(t=*h-1; t>0; --t)
|
||||||
|
// *r = (*r) * ex;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Изменение знака */
|
||||||
|
void Calculator::unary(QChar o, qreal *r){
|
||||||
|
if(o=='-')
|
||||||
|
*r = -(*r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Поиск значения переменной */
|
||||||
|
qreal Calculator::find_var(QString s){
|
||||||
|
bool ok = false;
|
||||||
|
qreal value = data->FindVar(s, &ok);
|
||||||
|
if(!ok){
|
||||||
|
serror(4); /* не переменная */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* выдать сообщение об ошибке */
|
||||||
|
void Calculator::serror(qint32 error){
|
||||||
|
QString e[]= {
|
||||||
|
"Синтаксическая ошибка",
|
||||||
|
"Непарные круглые скобки",
|
||||||
|
"Это не выражение",
|
||||||
|
"Предполагается символ равенства",
|
||||||
|
"Не переменная",
|
||||||
|
"Таблица меток переполнена",
|
||||||
|
"Дублирование меток",
|
||||||
|
"Неопределенная метка",
|
||||||
|
"Необходим оператор THEN",
|
||||||
|
"Необходим оператор TO",
|
||||||
|
"Уровень вложенности цикла FOR слишком велик",
|
||||||
|
"NEXT не соответствует FOR",
|
||||||
|
"Уровень вложенности GOSUB слишком велик",
|
||||||
|
"RETURN не соответствует GOSUB"
|
||||||
|
};
|
||||||
|
qDebug()<<e[error];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Поиск соответствия внутреннего формата для
|
||||||
|
текущей лексемы в таблице лексем.
|
||||||
|
*/
|
||||||
|
char Calculator::look_up(QString s){
|
||||||
|
QString p;
|
||||||
|
|
||||||
|
/* преобразование к нижнему регистру */
|
||||||
|
p = s;
|
||||||
|
p = p.toLower();
|
||||||
|
|
||||||
|
/* просматривается, если лексема обнаружена в
|
||||||
|
таблице */
|
||||||
|
/*
|
||||||
|
*у нас більше немає команд що потрібно опрацьовувати
|
||||||
|
*/
|
||||||
|
// if(commands.contains(p)){
|
||||||
|
// return commands[p];
|
||||||
|
// }
|
||||||
|
return 0; /* нераспознанная команда */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Возвращает "истину", если "c" разделитель */
|
||||||
|
bool Calculator::isdelim(QChar c){
|
||||||
|
if(StrChr(" ;,+-<>/*%^=()",c) || c=='\n' || c=='\r' || c=='\0')
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Возвращает 1, если "с" пробел или табуляция */
|
||||||
|
bool Calculator::iswhite(QChar c){
|
||||||
|
if(c==' ' || c=='\t')
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Calculator::get_token(){
|
||||||
|
QString *temp;
|
||||||
|
|
||||||
|
token_type=0; tok=0;
|
||||||
|
token.clear();
|
||||||
|
temp=&token;
|
||||||
|
|
||||||
|
if(prog[index]=='\0') { /* Конец файла */
|
||||||
|
token="\0";
|
||||||
|
tok=FINISHED;
|
||||||
|
token_type=DELIMITER;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(iswhite(prog[index])) ++index; /* пропуск пробелов */
|
||||||
|
|
||||||
|
if(prog[index]=='\r') { /* crtl */
|
||||||
|
++index; ++index;
|
||||||
|
tok= EOL; token='\r';
|
||||||
|
token.append('\n');token.append("\0");
|
||||||
|
token_type = DELIMITER;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(StrChr("+-*^/%=;(),><", prog[index])) { /* разделитель */
|
||||||
|
*temp=prog[index];
|
||||||
|
index++; /* переход на следующую позицию */
|
||||||
|
temp->append("\0");
|
||||||
|
token_type=DELIMITER;
|
||||||
|
debugFormula.append(token);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(prog[index]=='"') { /* строка в кавычках */
|
||||||
|
index++;
|
||||||
|
while(prog[index] != '"' && prog[index] != '\r'){
|
||||||
|
temp->append(prog[index]);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
if(prog[index]=='\r')
|
||||||
|
serror(1);
|
||||||
|
index++;temp->append("\0");
|
||||||
|
token_type=QUOTE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(prog[index].isDigit()) { /* число */
|
||||||
|
while(!isdelim(prog[index])){
|
||||||
|
temp->append(prog[index]);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
temp->append('\0');
|
||||||
|
token_type = NUMBER;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(prog[index].isPrint()) { /* переменная или команда */
|
||||||
|
while(!isdelim(prog[index])){
|
||||||
|
temp->append(prog[index]);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
token_type=STRING;
|
||||||
|
}
|
||||||
|
temp->append("\0");
|
||||||
|
|
||||||
|
/* Просматривается, если строка есть команда или переменная */
|
||||||
|
if(token_type==STRING) {
|
||||||
|
tok=look_up(token); /* преобразование во внутренний
|
||||||
|
формат */
|
||||||
|
if(!tok)
|
||||||
|
token_type = VARIABLE;
|
||||||
|
else token_type = COMMAND; /* это команда */
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Calculator::StrChr(QString string, QChar c){
|
||||||
|
return string.contains(c, Qt::CaseInsensitive);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Возвращает лексему обратно во входной поток */
|
||||||
|
void Calculator::putback(){
|
||||||
|
QString t;
|
||||||
|
t = token;
|
||||||
|
index = index - t.size();
|
||||||
|
}
|
148
container/calculator.h
Normal file
148
container/calculator.h
Normal file
|
@ -0,0 +1,148 @@
|
||||||
|
#ifndef CALCULATOR_H
|
||||||
|
#define CALCULATOR_H
|
||||||
|
|
||||||
|
#include <QtGlobal>
|
||||||
|
#include <QString>
|
||||||
|
#include <QMap>
|
||||||
|
#include <QLineF>
|
||||||
|
#include <QPointF>
|
||||||
|
#include "vcontainer.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The Calculator клас калькулятора формул лекал. Виконує розрахунок формул з підставлянням
|
||||||
|
* значеннь зміних.
|
||||||
|
*/
|
||||||
|
class Calculator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Calculator конструктор класу. Використовується при розрахунку лекала.
|
||||||
|
* @param data покажчик на контейнер змінних
|
||||||
|
*/
|
||||||
|
Calculator(VContainer *data);
|
||||||
|
/**
|
||||||
|
* @brief eval виконує розрахунок формули.
|
||||||
|
* @param prog рядко в якому зберігається формула.
|
||||||
|
* @return значення формули.
|
||||||
|
*/
|
||||||
|
qreal eval(QString prog);
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* @brief token теперішня лексема.
|
||||||
|
*/
|
||||||
|
QString token;
|
||||||
|
/**
|
||||||
|
* @brief tok внутрішне представлення лексеми.
|
||||||
|
*/
|
||||||
|
qint32 tok;
|
||||||
|
/**
|
||||||
|
* @brief token_type тип лексеми.
|
||||||
|
*/
|
||||||
|
qint32 token_type;
|
||||||
|
/**
|
||||||
|
* @brief prog рядок в якому зберігається формула.
|
||||||
|
*/
|
||||||
|
QString prog; /* Содержит анализируемое выражение */
|
||||||
|
/**
|
||||||
|
* @brief index номер символу в рядку формули.
|
||||||
|
*/
|
||||||
|
qint32 index; /* Индекс символа в строке*/
|
||||||
|
/**
|
||||||
|
* @brief data контейнер усіх змінних.
|
||||||
|
*/
|
||||||
|
VContainer *data;
|
||||||
|
/**
|
||||||
|
* @brief debugFormula рядок розшифрованої формули.
|
||||||
|
*/
|
||||||
|
QString debugFormula;
|
||||||
|
/**
|
||||||
|
* @brief get_exp виконує розрахунок формули.
|
||||||
|
* @return значення формули.
|
||||||
|
*/
|
||||||
|
qreal get_exp();
|
||||||
|
/**
|
||||||
|
* @brief get_token повертає наступну лексему.
|
||||||
|
*/
|
||||||
|
void get_token();/* Получить лексему */
|
||||||
|
/**
|
||||||
|
* @brief StrChr перевіряє чи символ належить рядку.
|
||||||
|
* @param string рядок
|
||||||
|
* @param c символ.
|
||||||
|
* @return true - належить рядку, false - не належить рядку.
|
||||||
|
*/
|
||||||
|
bool StrChr(QString string, QChar c);
|
||||||
|
/**
|
||||||
|
* @brief putback повертає зчитану лексему назад у потік.
|
||||||
|
*/
|
||||||
|
void putback();
|
||||||
|
/**
|
||||||
|
* @brief level2 метод додавання і віднімання двух термів.
|
||||||
|
* @param result результат операції.
|
||||||
|
*/
|
||||||
|
void level2(qreal *result);
|
||||||
|
/**
|
||||||
|
* @brief level3 метод множення, ділення, знаходження процентів.
|
||||||
|
* @param result результат операції.
|
||||||
|
*/
|
||||||
|
void level3(qreal *result);
|
||||||
|
/**
|
||||||
|
* @brief level4 метод знаходження степені двох чисел.
|
||||||
|
* @param result результат операції.
|
||||||
|
*/
|
||||||
|
void level4(qreal *result);
|
||||||
|
/**
|
||||||
|
* @brief level5 метод знаходження унарного плюса чи мінуса.
|
||||||
|
* @param result результат операції.
|
||||||
|
*/
|
||||||
|
void level5(qreal *result);
|
||||||
|
/**
|
||||||
|
* @brief level6 метод обробки виразу в круглих лапках.
|
||||||
|
* @param result результат операції.
|
||||||
|
*/
|
||||||
|
void level6(qreal *result);
|
||||||
|
/**
|
||||||
|
* @brief primitive метод визначення значення зміної по її імені.
|
||||||
|
* @param result результат операції.
|
||||||
|
*/
|
||||||
|
void primitive(qreal *result);
|
||||||
|
/**
|
||||||
|
* @brief arith виконання специфікованої арифметики. Результат записується в перший елемент.
|
||||||
|
* @param o знак операції.
|
||||||
|
* @param r перший елемент.
|
||||||
|
* @param h другий елемент.
|
||||||
|
*/
|
||||||
|
void arith(QChar o, qreal *r, qreal *h);
|
||||||
|
/**
|
||||||
|
* @brief unary метод зміни знаку.
|
||||||
|
* @param o символ знаку.
|
||||||
|
* @param r елемент.
|
||||||
|
*/
|
||||||
|
void unary(QChar o, qreal *r);
|
||||||
|
/**
|
||||||
|
* @brief find_var метод знаходить змінну за іменем.
|
||||||
|
* @param s ім'я змінної.
|
||||||
|
* @return значення зміної.
|
||||||
|
*/
|
||||||
|
qreal find_var(QString s);
|
||||||
|
void serror(qint32 error);
|
||||||
|
/**
|
||||||
|
* @brief look_up пошук відповідного внутрішнього формату для теперішньої лексеми в таблиці лексем. текущей лексемы в таблице лексем
|
||||||
|
* @param s ім'я лексеми.
|
||||||
|
* @return внутрішній номер лексеми.
|
||||||
|
*/
|
||||||
|
char look_up(QString s);
|
||||||
|
/**
|
||||||
|
* @brief isdelim повертає "істино", якщо с розділювач.
|
||||||
|
* @param c символ.
|
||||||
|
* @return розділювач, або ні.
|
||||||
|
*/
|
||||||
|
bool isdelim(QChar c);
|
||||||
|
/**
|
||||||
|
* @brief iswhite перевіряє чи с пробіл чи табуляція.
|
||||||
|
* @param c символ.
|
||||||
|
* @return так або ні.
|
||||||
|
*/
|
||||||
|
bool iswhite(QChar c);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CALCULATOR_H
|
|
@ -1,8 +1,12 @@
|
||||||
#include "vcontainer.h"
|
#include "vcontainer.h"
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include "../options.h"
|
||||||
|
|
||||||
VContainer::VContainer(){
|
VContainer::VContainer(){
|
||||||
_id = 0;
|
_id = 0;
|
||||||
|
SetSize(500);
|
||||||
|
SetGrowth(1760);
|
||||||
}
|
}
|
||||||
|
|
||||||
VPointF VContainer::GetPoint(qint64 id) const{
|
VPointF VContainer::GetPoint(qint64 id) const{
|
||||||
|
@ -15,12 +19,40 @@ VPointF VContainer::GetPoint(qint64 id) const{
|
||||||
return VPointF();
|
return VPointF();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VStandartTableCell VContainer::GetStandartTableCell(const QString &name) const{
|
||||||
|
if(standartTable.contains(name)){
|
||||||
|
return standartTable.value(name);
|
||||||
|
} else {
|
||||||
|
qCritical()<<"Не можу знайти змінну за імям = "<<name<<" в таблиці.";
|
||||||
|
throw"Не можу знайти змінну в стандартній таблиці вимірів за ім'ям.";
|
||||||
|
}
|
||||||
|
return VStandartTableCell();
|
||||||
|
}
|
||||||
|
|
||||||
|
VIncrementTableRow VContainer::GetIncrementTableRow(const QString& name) const{
|
||||||
|
if(incrementTable.contains(name)){
|
||||||
|
return incrementTable.value(name);
|
||||||
|
} else {
|
||||||
|
qCritical()<<"Не можу знайти змінну за імям = "<<name<<" в таблиці.";
|
||||||
|
throw"Не можу знайти змінну в таблиці прибавок за ім'ям.";
|
||||||
|
}
|
||||||
|
return VIncrementTableRow();
|
||||||
|
}
|
||||||
|
|
||||||
qint64 VContainer::AddPoint(const VPointF& point){
|
qint64 VContainer::AddPoint(const VPointF& point){
|
||||||
qint64 id = getNextId();
|
qint64 id = getNextId();
|
||||||
points[id] = point;
|
points[id] = point;
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VContainer::AddStandartTableCell(const QString& name, const VStandartTableCell& cell){
|
||||||
|
standartTable[name] = cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VContainer::AddIncrementTableRow(const QString& name, const VIncrementTableRow& cell){
|
||||||
|
incrementTable[name] = cell;
|
||||||
|
}
|
||||||
|
|
||||||
qint64 VContainer::getId(){
|
qint64 VContainer::getId(){
|
||||||
return _id;
|
return _id;
|
||||||
}
|
}
|
||||||
|
@ -30,6 +62,10 @@ qint64 VContainer::getNextId(){
|
||||||
return _id;
|
return _id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VContainer::RemoveIncrementTableRow(const QString& name){
|
||||||
|
incrementTable.remove(name);
|
||||||
|
}
|
||||||
|
|
||||||
void VContainer::UpdatePoint(qint64 id, const VPointF& point){
|
void VContainer::UpdatePoint(qint64 id, const VPointF& point){
|
||||||
points[id] = point;
|
points[id] = point;
|
||||||
if(id > _id){
|
if(id > _id){
|
||||||
|
@ -37,7 +73,152 @@ void VContainer::UpdatePoint(qint64 id, const VPointF& point){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VContainer::UpdateStandartTableCell(const QString& name, const VStandartTableCell& cell){
|
||||||
|
standartTable[name] = cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VContainer::UpdateIncrementTableRow(const QString& name, const VIncrementTableRow& cell){
|
||||||
|
incrementTable[name] = cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal VContainer::GetValueStandartTableCell(const QString& name) const{
|
||||||
|
VStandartTableCell cell = GetStandartTableCell(name);
|
||||||
|
qreal k_size = ( ( qreal ) (size()/10) - 50.0 ) / 2;
|
||||||
|
qreal k_growth = ( ( qreal ) (growth()/10) - 176.0 ) / 6;
|
||||||
|
qreal value = cell.GetBase() + k_size*cell.GetKsize() + k_growth*cell.GetKgrowth();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal VContainer::GetValueIncrementTableRow(const QString& name) const{
|
||||||
|
VIncrementTableRow cell = GetIncrementTableRow(name);
|
||||||
|
qreal k_size = ( ( qreal ) (size()/10) - 50.0 ) / 2;
|
||||||
|
qreal k_growth = ( ( qreal ) (growth()/10) - 176.0 ) / 6;
|
||||||
|
qreal value = cell.getBase() + k_size*cell.getKsize() + k_growth*cell.getKgrowth();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
void VContainer::Clear(){
|
void VContainer::Clear(){
|
||||||
_id = 0;
|
_id = 0;
|
||||||
points.clear();
|
points.clear();
|
||||||
|
standartTable.clear();
|
||||||
|
incrementTable.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void VContainer::ClearIncrementTable(){
|
||||||
|
incrementTable.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void VContainer::SetSize(qint32 size){
|
||||||
|
base["Сг"] = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VContainer::SetGrowth(qint32 growth){
|
||||||
|
base["Р"] = growth;
|
||||||
|
}
|
||||||
|
|
||||||
|
qint32 VContainer::size() const{
|
||||||
|
return base.value("Сг");
|
||||||
|
}
|
||||||
|
|
||||||
|
qint32 VContainer::growth() const{
|
||||||
|
return base.value("Р");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VContainer::IncrementTableContains(const QString& name){
|
||||||
|
return incrementTable.contains(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal VContainer::FindVar(const QString &name, bool *ok)const{
|
||||||
|
if(base.contains(name)){
|
||||||
|
*ok = true;
|
||||||
|
return base.value(name)/PrintDPI*25.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(standartTable.contains(name)){
|
||||||
|
*ok = true;
|
||||||
|
return GetValueStandartTableCell(name)/PrintDPI*25.4;
|
||||||
|
}
|
||||||
|
if(incrementTable.contains(name)){
|
||||||
|
*ok = true;
|
||||||
|
return GetValueIncrementTableRow(name)/PrintDPI*25.4;
|
||||||
|
}
|
||||||
|
*ok = false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VContainer::FillStandartTable(QTableWidget *table) const{
|
||||||
|
qint32 currentRow = -1;
|
||||||
|
QMapIterator<QString, VStandartTableCell> i(standartTable);
|
||||||
|
while (i.hasNext()) {
|
||||||
|
i.next();
|
||||||
|
VStandartTableCell cell = i.value();
|
||||||
|
currentRow++;
|
||||||
|
table->setRowCount ( standartTable.size() );
|
||||||
|
|
||||||
|
QTableWidgetItem *item = new QTableWidgetItem(QString(i.key()));
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
item->setFont(QFont("Times", 12, QFont::Bold));
|
||||||
|
table->setItem(currentRow, 0, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem(QString().setNum(GetValueStandartTableCell(i.key())));
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
table->setItem(currentRow, 1, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem(QString().setNum(cell.GetBase()));
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
table->setItem(currentRow, 2, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem(QString().setNum(cell.GetKsize()));
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
table->setItem(currentRow, 3, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem(QString().setNum(cell.GetKgrowth()));
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
table->setItem(currentRow, 4, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem(cell.GetDescription());
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
table->setItem(currentRow, 5, item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VContainer::FillIncrementTable(QTableWidget *table) const{
|
||||||
|
qint32 currentRow = -1;
|
||||||
|
QMapIterator<QString, VIncrementTableRow> i(incrementTable);
|
||||||
|
while (i.hasNext()) {
|
||||||
|
i.next();
|
||||||
|
VIncrementTableRow cell = i.value();
|
||||||
|
currentRow++;
|
||||||
|
table->setRowCount ( incrementTable.size() );
|
||||||
|
|
||||||
|
QTableWidgetItem *item = new QTableWidgetItem(QString(i.key()));
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
item->setFont(QFont("Times", 12, QFont::Bold));
|
||||||
|
item->setData(Qt::UserRole, cell.getId());
|
||||||
|
table->setItem(currentRow, 0, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem(QString().setNum(GetValueIncrementTableRow(i.key())));
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
// set the item non-editable (view only), and non-selectable
|
||||||
|
Qt::ItemFlags flags = item->flags();
|
||||||
|
flags &= ~(Qt::ItemIsSelectable | Qt::ItemIsEditable); // reset/clear the flag
|
||||||
|
item->setFlags(flags);
|
||||||
|
table->setItem(currentRow, 1, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem(QString().setNum(cell.getBase()));
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
table->setItem(currentRow, 2, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem(QString().setNum(cell.getKsize()));
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
table->setItem(currentRow, 3, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem(QString().setNum(cell.getKgrowth()));
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
table->setItem(currentRow, 4, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem(cell.getDescription());
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
table->setItem(currentRow, 5, item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,22 +2,46 @@
|
||||||
#define VCONTAINER_H
|
#define VCONTAINER_H
|
||||||
|
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
|
#include <QTableWidget>
|
||||||
|
|
||||||
#include "vpointf.h"
|
#include "vpointf.h"
|
||||||
|
#include "vstandarttablecell.h"
|
||||||
|
#include "vincrementtablerow.h"
|
||||||
|
|
||||||
class VContainer
|
class VContainer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
VContainer();
|
VContainer();
|
||||||
VPointF GetPoint(qint64 id) const;
|
VPointF GetPoint(qint64 id) const;
|
||||||
qint64 getId();
|
VStandartTableCell GetStandartTableCell(const QString& name) const;
|
||||||
qint64 AddPoint(const VPointF& point);
|
VIncrementTableRow GetIncrementTableRow(const QString& name) const;
|
||||||
void UpdatePoint(qint64 id, const VPointF& point);
|
qint64 getId();
|
||||||
void Clear();
|
qint64 AddPoint(const VPointF& point);
|
||||||
|
void AddStandartTableCell(const QString& name, const VStandartTableCell& cell);
|
||||||
|
void AddIncrementTableRow(const QString& name, const VIncrementTableRow &cell);
|
||||||
|
void UpdatePoint(qint64 id, const VPointF& point);
|
||||||
|
void UpdateStandartTableCell(const QString& name, const VStandartTableCell& cell);
|
||||||
|
void UpdateIncrementTableRow(const QString& name, const VIncrementTableRow& cell);
|
||||||
|
qreal GetValueStandartTableCell(const QString& name) const;
|
||||||
|
qreal GetValueIncrementTableRow(const QString& name) const;
|
||||||
|
void Clear();
|
||||||
|
void ClearIncrementTable();
|
||||||
|
void SetSize(qint32 size);
|
||||||
|
void SetGrowth(qint32 growth);
|
||||||
|
qint32 size() const;
|
||||||
|
qint32 growth() const;
|
||||||
|
qreal FindVar(const QString& name, bool *ok)const;
|
||||||
|
void FillStandartTable(QTableWidget *table) const;
|
||||||
|
void FillIncrementTable(QTableWidget *table) const;
|
||||||
|
bool IncrementTableContains(const QString& name);
|
||||||
|
qint64 getNextId();
|
||||||
|
void RemoveIncrementTableRow(const QString& name);
|
||||||
private:
|
private:
|
||||||
qint64 _id;
|
qint64 _id;
|
||||||
|
QMap<QString, qint32> base;
|
||||||
QMap<qint64, VPointF> points;
|
QMap<qint64, VPointF> points;
|
||||||
qint64 getNextId();
|
QMap<QString, VStandartTableCell> standartTable;
|
||||||
|
QMap<QString, VIncrementTableRow> incrementTable;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VCONTAINER_H
|
#endif // VCONTAINER_H
|
||||||
|
|
58
container/vincrementtablerow.cpp
Normal file
58
container/vincrementtablerow.cpp
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
#include "vincrementtablerow.h"
|
||||||
|
|
||||||
|
VIncrementTableRow::VIncrementTableRow(){
|
||||||
|
this->id = 0;
|
||||||
|
this->base = 0;
|
||||||
|
this->ksize = 0;
|
||||||
|
this->kgrowth = 0;
|
||||||
|
this->description = QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
VIncrementTableRow::VIncrementTableRow(qint64 id, qint32 base, qreal ksize, qreal kgrowth,
|
||||||
|
QString description){
|
||||||
|
this->id = id;
|
||||||
|
this->base = base;
|
||||||
|
this->ksize = ksize;
|
||||||
|
this->kgrowth = kgrowth;
|
||||||
|
this->description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString VIncrementTableRow::getDescription() const{
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VIncrementTableRow::setDescription(const QString &value){
|
||||||
|
description = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal VIncrementTableRow::getKgrowth() const{
|
||||||
|
return kgrowth;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VIncrementTableRow::setKgrowth(const qreal &value){
|
||||||
|
kgrowth = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal VIncrementTableRow::getKsize() const{
|
||||||
|
return ksize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VIncrementTableRow::setKsize(const qreal &value){
|
||||||
|
ksize = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
qint32 VIncrementTableRow::getBase() const{
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VIncrementTableRow::setBase(const qint32 &value){
|
||||||
|
base = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
qint64 VIncrementTableRow::getId() const{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VIncrementTableRow::setId(const qint64 &value){
|
||||||
|
id = value;
|
||||||
|
}
|
35
container/vincrementtablerow.h
Normal file
35
container/vincrementtablerow.h
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#ifndef VINCREMENTTABLEROW_H
|
||||||
|
#define VINCREMENTTABLEROW_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class VIncrementTableRow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
VIncrementTableRow();
|
||||||
|
VIncrementTableRow(qint64 id, qint32 base, qreal ksize, qreal kgrowth,
|
||||||
|
QString description = QString());
|
||||||
|
qint64 getId() const;
|
||||||
|
void setId(const qint64 &value);
|
||||||
|
|
||||||
|
qint32 getBase() const;
|
||||||
|
void setBase(const qint32 &value);
|
||||||
|
|
||||||
|
qreal getKsize() const;
|
||||||
|
void setKsize(const qreal &value);
|
||||||
|
|
||||||
|
qreal getKgrowth() const;
|
||||||
|
void setKgrowth(const qreal &value);
|
||||||
|
|
||||||
|
QString getDescription() const;
|
||||||
|
void setDescription(const QString &value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
qint64 id;
|
||||||
|
qint32 base;
|
||||||
|
qreal ksize;
|
||||||
|
qreal kgrowth;
|
||||||
|
QString description;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // VINCREMENTTABLEROW_H
|
31
container/vstandarttablecell.cpp
Normal file
31
container/vstandarttablecell.cpp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#include "vstandarttablecell.h"
|
||||||
|
|
||||||
|
VStandartTableCell::VStandartTableCell(){
|
||||||
|
base = 0;
|
||||||
|
ksize = 0;
|
||||||
|
kgrowth = 0;
|
||||||
|
description = QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
VStandartTableCell::VStandartTableCell(qint32 base, qreal ksize, qreal kgrowth, QString description){
|
||||||
|
this->base = base;
|
||||||
|
this->ksize = ksize;
|
||||||
|
this->kgrowth = kgrowth;
|
||||||
|
this->description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
qint32 VStandartTableCell::GetBase() const{
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal VStandartTableCell::GetKsize() const{
|
||||||
|
return ksize;
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal VStandartTableCell::GetKgrowth() const{
|
||||||
|
return kgrowth;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString VStandartTableCell::GetDescription() const{
|
||||||
|
return description;
|
||||||
|
}
|
22
container/vstandarttablecell.h
Normal file
22
container/vstandarttablecell.h
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#ifndef VSTANDARTTABLECELL_H
|
||||||
|
#define VSTANDARTTABLECELL_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class VStandartTableCell
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
VStandartTableCell();
|
||||||
|
VStandartTableCell(qint32 base, qreal ksize, qreal kgrowth, QString description = QString());
|
||||||
|
qint32 GetBase() const;
|
||||||
|
qreal GetKsize() const;
|
||||||
|
qreal GetKgrowth() const;
|
||||||
|
QString GetDescription() const;
|
||||||
|
private:
|
||||||
|
qint32 base;
|
||||||
|
qreal ksize;
|
||||||
|
qreal kgrowth;
|
||||||
|
QString description;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // VSTANDARTTABLECELL_H
|
267
dialogs/dialogincrements.cpp
Normal file
267
dialogs/dialogincrements.cpp
Normal file
|
@ -0,0 +1,267 @@
|
||||||
|
#include "dialogincrements.h"
|
||||||
|
#include "ui_dialogincrements.h"
|
||||||
|
#include <QHeaderView>
|
||||||
|
#include <QCloseEvent>
|
||||||
|
|
||||||
|
#include "../container/vincrementtablerow.h"
|
||||||
|
|
||||||
|
DialogIncrements::DialogIncrements(VContainer *data, VDomDocument *doc, QWidget *parent) :
|
||||||
|
QDialog(parent), ui(new Ui::DialogIncrements){
|
||||||
|
ui->setupUi(this);
|
||||||
|
this->data = data;
|
||||||
|
this->doc = doc;
|
||||||
|
ui->tableWidgetStandart->resizeColumnsToContents();
|
||||||
|
ui->tableWidgetStandart->resizeRowsToContents();
|
||||||
|
ui->tableWidgetStandart->verticalHeader()->setDefaultSectionSize(20);
|
||||||
|
ui->tableWidgetStandart->setHorizontalHeaderItem(0, new QTableWidgetItem("Позначення"));
|
||||||
|
ui->tableWidgetStandart->setHorizontalHeaderItem(1, new QTableWidgetItem("Розрах. знач."));
|
||||||
|
ui->tableWidgetStandart->setHorizontalHeaderItem(2, new QTableWidgetItem("Базове знач."));
|
||||||
|
ui->tableWidgetStandart->setHorizontalHeaderItem(3, new QTableWidgetItem("В розмірі"));
|
||||||
|
ui->tableWidgetStandart->setHorizontalHeaderItem(4, new QTableWidgetItem("В рості"));
|
||||||
|
ui->tableWidgetStandart->setHorizontalHeaderItem(5, new QTableWidgetItem("Опис"));
|
||||||
|
ui->tableWidgetIncrement->resizeColumnsToContents();
|
||||||
|
ui->tableWidgetIncrement->resizeRowsToContents();
|
||||||
|
ui->tableWidgetIncrement->verticalHeader()->setDefaultSectionSize(20);
|
||||||
|
ui->tableWidgetIncrement->setHorizontalHeaderItem(0, new QTableWidgetItem("Позначення"));
|
||||||
|
ui->tableWidgetIncrement->setHorizontalHeaderItem(1, new QTableWidgetItem("Розрах. знач."));
|
||||||
|
ui->tableWidgetIncrement->setHorizontalHeaderItem(2, new QTableWidgetItem("Базове знач."));
|
||||||
|
ui->tableWidgetIncrement->setHorizontalHeaderItem(3, new QTableWidgetItem("В розмірі"));
|
||||||
|
ui->tableWidgetIncrement->setHorizontalHeaderItem(4, new QTableWidgetItem("В рості"));
|
||||||
|
ui->tableWidgetIncrement->setHorizontalHeaderItem(5, new QTableWidgetItem("Опис"));
|
||||||
|
FillStandartTable();
|
||||||
|
FillIncrementTable();
|
||||||
|
|
||||||
|
connect(ui->toolButtonAdd, &QPushButton::clicked, this, &DialogIncrements::clickedToolButtonAdd);
|
||||||
|
connect(ui->toolButtonRemove, &QPushButton::clicked, this,
|
||||||
|
&DialogIncrements::clickedToolButtonRemove);
|
||||||
|
|
||||||
|
connect(this, &DialogIncrements::FullUpdateTree, this->doc, &VDomDocument::FullUpdateTree);
|
||||||
|
connect(this, &DialogIncrements::haveLiteChange, this->doc, &VDomDocument::haveLiteChange);
|
||||||
|
connect(this->doc, &VDomDocument::FullUpdateFromFile, this,
|
||||||
|
&DialogIncrements::FullUpdateFromFile);
|
||||||
|
|
||||||
|
QPushButton *bOk = ui->buttonBox->button(QDialogButtonBox::Ok);
|
||||||
|
connect(bOk, &QPushButton::clicked, this, &DialogIncrements::clickedButtonOk);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogIncrements::FillStandartTable(){
|
||||||
|
data->FillStandartTable(ui->tableWidgetStandart);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogIncrements::FillIncrementTable(){
|
||||||
|
data->FillIncrementTable(ui->tableWidgetIncrement);
|
||||||
|
if(ui->tableWidgetIncrement->rowCount()>0){
|
||||||
|
ui->toolButtonRemove->setEnabled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogIncrements::FullUpdateFromFile(){
|
||||||
|
disconnect(ui->tableWidgetIncrement, &QTableWidget::cellChanged, this,
|
||||||
|
&DialogIncrements::cellChanged);
|
||||||
|
ui->tableWidgetStandart->clear();
|
||||||
|
ui->tableWidgetStandart->setHorizontalHeaderItem(0, new QTableWidgetItem("Позначення"));
|
||||||
|
ui->tableWidgetStandart->setHorizontalHeaderItem(1, new QTableWidgetItem("Розрах. знач."));
|
||||||
|
ui->tableWidgetStandart->setHorizontalHeaderItem(2, new QTableWidgetItem("Базове знач."));
|
||||||
|
ui->tableWidgetStandart->setHorizontalHeaderItem(3, new QTableWidgetItem("В розмірі"));
|
||||||
|
ui->tableWidgetStandart->setHorizontalHeaderItem(4, new QTableWidgetItem("В рості"));
|
||||||
|
ui->tableWidgetStandart->setHorizontalHeaderItem(5, new QTableWidgetItem("Опис"));
|
||||||
|
ui->tableWidgetIncrement->clear();
|
||||||
|
ui->tableWidgetIncrement->setHorizontalHeaderItem(0, new QTableWidgetItem("Позначення"));
|
||||||
|
ui->tableWidgetIncrement->setHorizontalHeaderItem(1, new QTableWidgetItem("Розрах. знач."));
|
||||||
|
ui->tableWidgetIncrement->setHorizontalHeaderItem(2, new QTableWidgetItem("Базове знач."));
|
||||||
|
ui->tableWidgetIncrement->setHorizontalHeaderItem(3, new QTableWidgetItem("В розмірі"));
|
||||||
|
ui->tableWidgetIncrement->setHorizontalHeaderItem(4, new QTableWidgetItem("В рості"));
|
||||||
|
ui->tableWidgetIncrement->setHorizontalHeaderItem(5, new QTableWidgetItem("Опис"));
|
||||||
|
FillStandartTable();
|
||||||
|
FillIncrementTable();
|
||||||
|
connect(ui->tableWidgetIncrement, &QTableWidget::cellChanged, this,
|
||||||
|
&DialogIncrements::cellChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogIncrements::clickedToolButtonAdd(){
|
||||||
|
disconnect(ui->tableWidgetIncrement, &QTableWidget::cellChanged, this,
|
||||||
|
&DialogIncrements::cellChanged);
|
||||||
|
ui->tableWidgetIncrement->setFocus(Qt::OtherFocusReason);
|
||||||
|
qint32 currentRow = ui->tableWidgetIncrement->rowCount();
|
||||||
|
ui->tableWidgetIncrement->insertRow( currentRow );
|
||||||
|
|
||||||
|
qint32 num = 1;
|
||||||
|
QString name;
|
||||||
|
do{
|
||||||
|
name = QString("Позначення %1").arg(num);
|
||||||
|
num++;
|
||||||
|
}while(data->IncrementTableContains(name));
|
||||||
|
|
||||||
|
qint64 id = data->getNextId();
|
||||||
|
qint32 base = 0;
|
||||||
|
qreal ksize = 0;
|
||||||
|
qreal kgrowth = 0;
|
||||||
|
QString description = QString("Опис");
|
||||||
|
VIncrementTableRow incrementRow = VIncrementTableRow(id, base, ksize, kgrowth, description);
|
||||||
|
data->AddIncrementTableRow(name, incrementRow);
|
||||||
|
|
||||||
|
AddIncrementToFile(id, name, base, ksize, kgrowth, description);
|
||||||
|
|
||||||
|
QTableWidgetItem *item = new QTableWidgetItem(name);
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
item->setFont(QFont("Times", 12, QFont::Bold));
|
||||||
|
item->setData(Qt::UserRole, id);
|
||||||
|
ui->tableWidgetIncrement->setItem(currentRow, 0, item);
|
||||||
|
ui->tableWidgetIncrement->setCurrentCell(currentRow, 0, QItemSelectionModel::ClearAndSelect);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem("0");
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
// set the item non-editable (view only), and non-selectable
|
||||||
|
Qt::ItemFlags flags = item->flags();
|
||||||
|
flags &= ~(Qt::ItemIsSelectable | Qt::ItemIsEditable); // reset/clear the flag
|
||||||
|
item->setFlags(flags);
|
||||||
|
ui->tableWidgetIncrement->setItem(currentRow, 1, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem("0");
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
ui->tableWidgetIncrement->setItem(currentRow, 2, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem("0");
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
ui->tableWidgetIncrement->setItem(currentRow, 3, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem("0");
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
ui->tableWidgetIncrement->setItem(currentRow, 4, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem("Опис");
|
||||||
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
|
ui->tableWidgetIncrement->setItem(currentRow, 5, item);
|
||||||
|
|
||||||
|
ui->toolButtonRemove->setEnabled(true);
|
||||||
|
connect(ui->tableWidgetIncrement, &QTableWidget::cellChanged, this,
|
||||||
|
&DialogIncrements::cellChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogIncrements::clickedToolButtonRemove(){
|
||||||
|
disconnect(ui->tableWidgetIncrement, &QTableWidget::cellChanged, this,
|
||||||
|
&DialogIncrements::cellChanged);
|
||||||
|
QTableWidgetItem *item = ui->tableWidgetIncrement->currentItem();
|
||||||
|
qint32 row = item->row();
|
||||||
|
QTableWidgetItem *itemName = ui->tableWidgetIncrement->item(row, 0);
|
||||||
|
data->RemoveIncrementTableRow(itemName->text());
|
||||||
|
qint64 id = qvariant_cast<qint64>(item->data(Qt::UserRole));
|
||||||
|
QDomElement domElement = doc->elementById(QString().setNum(id));
|
||||||
|
if(domElement.isElement()){
|
||||||
|
QDomNodeList list = doc->elementsByTagName("increments");
|
||||||
|
list.at(0).removeChild(domElement);
|
||||||
|
}
|
||||||
|
ui->tableWidgetIncrement->removeRow(row);
|
||||||
|
if(ui->tableWidgetIncrement->rowCount() == 0){
|
||||||
|
ui->toolButtonRemove->setEnabled(false);
|
||||||
|
}
|
||||||
|
connect(ui->tableWidgetIncrement, &QTableWidget::cellChanged, this,
|
||||||
|
&DialogIncrements::cellChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogIncrements::AddIncrementToFile(quint64 id, QString name, qint32 base, qreal ksize,
|
||||||
|
qreal kgrowth, QString description){
|
||||||
|
QDomNodeList list = doc->elementsByTagName("increments");
|
||||||
|
QDomElement element = doc->createElement("increment");
|
||||||
|
|
||||||
|
QDomAttr drawAttr = doc->createAttribute("id");
|
||||||
|
drawAttr.setValue(QString().setNum(id));
|
||||||
|
element.setAttributeNode(drawAttr);
|
||||||
|
|
||||||
|
drawAttr = doc->createAttribute("name");
|
||||||
|
drawAttr.setValue(name);
|
||||||
|
element.setAttributeNode(drawAttr);
|
||||||
|
|
||||||
|
drawAttr = doc->createAttribute("base");
|
||||||
|
drawAttr.setValue(QString().setNum(base));
|
||||||
|
element.setAttributeNode(drawAttr);
|
||||||
|
|
||||||
|
drawAttr = doc->createAttribute("ksize");
|
||||||
|
drawAttr.setValue(QString().setNum(ksize));
|
||||||
|
element.setAttributeNode(drawAttr);
|
||||||
|
|
||||||
|
drawAttr = doc->createAttribute("kgrowth");
|
||||||
|
drawAttr.setValue(QString().setNum(kgrowth));
|
||||||
|
element.setAttributeNode(drawAttr);
|
||||||
|
|
||||||
|
drawAttr = doc->createAttribute("description");
|
||||||
|
drawAttr.setValue(description);
|
||||||
|
element.setAttributeNode(drawAttr);
|
||||||
|
|
||||||
|
list.at(0).appendChild(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogIncrements::cellChanged ( qint32 row, qint32 column ){
|
||||||
|
QTableWidgetItem *item;
|
||||||
|
QTableWidgetItem *itemName;
|
||||||
|
qint64 id;
|
||||||
|
QDomElement domElement;
|
||||||
|
switch(column) {
|
||||||
|
case 0:
|
||||||
|
item = ui->tableWidgetIncrement->item(row, 0);
|
||||||
|
id = qvariant_cast<qint64>(item->data(Qt::UserRole));
|
||||||
|
domElement = doc->elementById(QString().setNum(id));
|
||||||
|
if(domElement.isElement()){
|
||||||
|
domElement.setAttribute("name", item->text());
|
||||||
|
data->ClearIncrementTable();
|
||||||
|
emit FullUpdateTree();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
itemName = ui->tableWidgetIncrement->item(row, 0);
|
||||||
|
item = ui->tableWidgetIncrement->item(row, column);
|
||||||
|
id = qvariant_cast<qint64>(itemName->data(Qt::UserRole));
|
||||||
|
domElement = doc->elementById(QString().setNum(id));
|
||||||
|
if(domElement.isElement()){
|
||||||
|
domElement.setAttribute("base", item->text().toDouble());
|
||||||
|
emit FullUpdateTree();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
itemName = ui->tableWidgetIncrement->item(row, 0);
|
||||||
|
item = ui->tableWidgetIncrement->item(row, column);
|
||||||
|
id = qvariant_cast<qint64>(itemName->data(Qt::UserRole));
|
||||||
|
domElement = doc->elementById(QString().setNum(id));
|
||||||
|
if(domElement.isElement()){
|
||||||
|
domElement.setAttribute("ksize", item->text().toDouble());
|
||||||
|
emit FullUpdateTree();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
itemName = ui->tableWidgetIncrement->item(row, 0);
|
||||||
|
item = ui->tableWidgetIncrement->item(row, column);
|
||||||
|
id = qvariant_cast<qint64>(itemName->data(Qt::UserRole));
|
||||||
|
domElement = doc->elementById(QString().setNum(id));
|
||||||
|
if(domElement.isElement()){
|
||||||
|
domElement.setAttribute("kgrowth", item->text().toDouble());
|
||||||
|
emit FullUpdateTree();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
itemName = ui->tableWidgetIncrement->item(row, 0);
|
||||||
|
item = ui->tableWidgetIncrement->item(row, column);
|
||||||
|
id = qvariant_cast<qint64>(itemName->data(Qt::UserRole));
|
||||||
|
domElement = doc->elementById(QString().setNum(id));
|
||||||
|
if(domElement.isElement()){
|
||||||
|
domElement.setAttribute("description", item->text());
|
||||||
|
VIncrementTableRow incr = data->GetIncrementTableRow(itemName->text());
|
||||||
|
incr.setDescription(item->text());
|
||||||
|
data->UpdateIncrementTableRow(itemName->text(), incr);
|
||||||
|
emit haveLiteChange();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogIncrements::closeEvent ( QCloseEvent * event ){
|
||||||
|
emit closedActionTable();
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogIncrements::clickedButtonOk(){
|
||||||
|
emit closedActionTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
DialogIncrements::~DialogIncrements(){
|
||||||
|
delete ui;
|
||||||
|
}
|
43
dialogs/dialogincrements.h
Normal file
43
dialogs/dialogincrements.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
#ifndef DIALOGINCREMENTS_H
|
||||||
|
#define DIALOGINCREMENTS_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QPushButton>
|
||||||
|
|
||||||
|
#include "../container/vcontainer.h"
|
||||||
|
#include "../xml/vdomdocument.h"
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class DialogIncrements;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DialogIncrements : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit DialogIncrements(VContainer *data, VDomDocument *doc, QWidget *parent = 0);
|
||||||
|
~DialogIncrements();
|
||||||
|
public slots:
|
||||||
|
void clickedToolButtonAdd();
|
||||||
|
void clickedToolButtonRemove();
|
||||||
|
void cellChanged ( qint32 row, qint32 column );
|
||||||
|
void FullUpdateFromFile();
|
||||||
|
void clickedButtonOk();
|
||||||
|
signals:
|
||||||
|
void FullUpdateTree();
|
||||||
|
void haveLiteChange();
|
||||||
|
void closedActionTable();
|
||||||
|
protected:
|
||||||
|
void closeEvent ( QCloseEvent * event );
|
||||||
|
private:
|
||||||
|
Ui::DialogIncrements *ui;
|
||||||
|
VContainer *data;
|
||||||
|
VDomDocument *doc;
|
||||||
|
void FillStandartTable();
|
||||||
|
void FillIncrementTable();
|
||||||
|
void AddIncrementToFile(quint64 id, QString name, qint32 base, qreal ksize, qreal kgrowth,
|
||||||
|
QString description);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DIALOGINCREMENTS_H
|
366
dialogs/dialogincrements.ui
Normal file
366
dialogs/dialogincrements.ui
Normal file
|
@ -0,0 +1,366 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>DialogIncrements</class>
|
||||||
|
<widget class="QDialog" name="DialogIncrements">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>681</width>
|
||||||
|
<height>422</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Dialog</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QTabWidget" name="tabWidget">
|
||||||
|
<property name="tabPosition">
|
||||||
|
<enum>QTabWidget::North</enum>
|
||||||
|
</property>
|
||||||
|
<property name="currentIndex">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="tabStandart">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Табличні розміри</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QTableWidget" name="tableWidgetStandart">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="editTriggers">
|
||||||
|
<set>QAbstractItemView::NoEditTriggers</set>
|
||||||
|
</property>
|
||||||
|
<property name="alternatingRowColors">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="selectionMode">
|
||||||
|
<enum>QAbstractItemView::SingleSelection</enum>
|
||||||
|
</property>
|
||||||
|
<property name="selectionBehavior">
|
||||||
|
<enum>QAbstractItemView::SelectRows</enum>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<attribute name="horizontalHeaderCascadingSectionResizes">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderDefaultSectionSize">
|
||||||
|
<number>95</number>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderMinimumSectionSize">
|
||||||
|
<number>25</number>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderShowSortIndicator" stdset="0">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderStretchLastSection">
|
||||||
|
<bool>true</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="verticalHeaderVisible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="verticalHeaderDefaultSectionSize">
|
||||||
|
<number>45</number>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="verticalHeaderMinimumSectionSize">
|
||||||
|
<number>8</number>
|
||||||
|
</attribute>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Позначення</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Розраховане знач.</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Базове знач.</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>В розмірах</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>В ростах</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Опис</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tabIncrements">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Прибавки</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0" colspan="3">
|
||||||
|
<widget class="QTableWidget" name="tableWidgetIncrement">
|
||||||
|
<property name="alternatingRowColors">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="selectionMode">
|
||||||
|
<enum>QAbstractItemView::SingleSelection</enum>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<attribute name="horizontalHeaderCascadingSectionResizes">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderDefaultSectionSize">
|
||||||
|
<number>95</number>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderMinimumSectionSize">
|
||||||
|
<number>17</number>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderShowSortIndicator" stdset="0">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderStretchLastSection">
|
||||||
|
<bool>true</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="verticalHeaderVisible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="verticalHeaderDefaultSectionSize">
|
||||||
|
<number>45</number>
|
||||||
|
</attribute>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Позначення</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Розраховане знач.</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Базове знач.</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>В розмірах</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>В ростах</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Опис</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QToolButton" name="toolButtonAdd">
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset theme="list-add">
|
||||||
|
<normaloff/>
|
||||||
|
</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QToolButton" name="toolButtonRemove">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset theme="list-remove">
|
||||||
|
<normaloff/>
|
||||||
|
</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tab_3">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Лінії</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_3">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QTableWidget" name="tableWidget">
|
||||||
|
<property name="editTriggers">
|
||||||
|
<set>QAbstractItemView::NoEditTriggers</set>
|
||||||
|
</property>
|
||||||
|
<attribute name="horizontalHeaderCascadingSectionResizes">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderDefaultSectionSize">
|
||||||
|
<number>137</number>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderStretchLastSection">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="verticalHeaderVisible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Лінія</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Довжина лінії</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tab_4">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Сплайни</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_4">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QTableWidget" name="tableWidget_2">
|
||||||
|
<property name="editTriggers">
|
||||||
|
<set>QAbstractItemView::NoEditTriggers</set>
|
||||||
|
</property>
|
||||||
|
<attribute name="horizontalHeaderCascadingSectionResizes">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderDefaultSectionSize">
|
||||||
|
<number>137</number>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderStretchLastSection">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="verticalHeaderVisible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Сплайн</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Довжина сплайну</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tab_5">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Дуги</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_5">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QTableWidget" name="tableWidget_3">
|
||||||
|
<property name="editTriggers">
|
||||||
|
<set>QAbstractItemView::NoEditTriggers</set>
|
||||||
|
</property>
|
||||||
|
<attribute name="horizontalHeaderCascadingSectionResizes">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderDefaultSectionSize">
|
||||||
|
<number>137</number>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderStretchLastSection">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="verticalHeaderVisible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Дуга</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Довжина дуги</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Ok</set>
|
||||||
|
</property>
|
||||||
|
<property name="centerButtons">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>DialogIncrements</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>248</x>
|
||||||
|
<y>254</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>157</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>DialogIncrements</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>316</x>
|
||||||
|
<y>260</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>286</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
1
icon.qrc
1
icon.qrc
|
@ -7,5 +7,6 @@
|
||||||
<file>icon/32x32/arrow_cursor.png</file>
|
<file>icon/32x32/arrow_cursor.png</file>
|
||||||
<file>icon/32x32/new_draw.png</file>
|
<file>icon/32x32/new_draw.png</file>
|
||||||
<file>icon/32x32/option_draw.png</file>
|
<file>icon/32x32/option_draw.png</file>
|
||||||
|
<file>icon/32x32/table.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|
BIN
icon/32x32/table.png
Normal file
BIN
icon/32x32/table.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
129
mainwindow.cpp
129
mainwindow.cpp
|
@ -38,8 +38,10 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||||
connect(ui->actionSave, &QAction::triggered, this, &MainWindow::triggeredActionSave);
|
connect(ui->actionSave, &QAction::triggered, this, &MainWindow::triggeredActionSave);
|
||||||
connect(ui->actionOpen, &QAction::triggered, this, &MainWindow::triggeredActionOpen);
|
connect(ui->actionOpen, &QAction::triggered, this, &MainWindow::triggeredActionOpen);
|
||||||
connect(ui->actionNew, &QAction::triggered, this, &MainWindow::triggeredActionNew);
|
connect(ui->actionNew, &QAction::triggered, this, &MainWindow::triggeredActionNew);
|
||||||
|
connect(ui->actionTable, &QAction::triggered, this, &MainWindow::triggeredActionTable);
|
||||||
|
|
||||||
data = new VContainer;
|
data = new VContainer;
|
||||||
|
CreateManTableIGroup ();
|
||||||
|
|
||||||
doc = new VDomDocument(data);
|
doc = new VDomDocument(data);
|
||||||
doc->CreateEmptyFile();
|
doc->CreateEmptyFile();
|
||||||
|
@ -87,12 +89,7 @@ void MainWindow::triggeredActionNewDraw(){
|
||||||
if ( index != -1 ) { // -1 for not found
|
if ( index != -1 ) { // -1 for not found
|
||||||
comboBoxDraws->setCurrentIndex(index);
|
comboBoxDraws->setCurrentIndex(index);
|
||||||
}
|
}
|
||||||
ui->actionSaveAs->setEnabled(true);
|
SetEnableWidgets(true);
|
||||||
ui->actionDraw->setEnabled(true);
|
|
||||||
ui->actionDetails->setEnabled(true);
|
|
||||||
ui->toolButtonSinglePoint->setEnabled(true);
|
|
||||||
ui->actionOptionDraw->setEnabled(true);
|
|
||||||
ui->actionSave->setEnabled(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::triggeredOptionDraw(){
|
void MainWindow::triggeredOptionDraw(){
|
||||||
|
@ -179,11 +176,14 @@ void MainWindow::ToolBarOption(){
|
||||||
QStringList list;
|
QStringList list;
|
||||||
list << "104"<<"110"<<"116"<<"122"<<"128"<<"134"<<"140"<<"146"<<"152"<<"158"<<"164"<<"170"<<"176"
|
list << "104"<<"110"<<"116"<<"122"<<"128"<<"134"<<"140"<<"146"<<"152"<<"158"<<"164"<<"170"<<"176"
|
||||||
<< "182" << "188";
|
<< "182" << "188";
|
||||||
QComboBox* comboBoxGrow = new QComboBox;
|
QComboBox *comboBoxGrow = new QComboBox;
|
||||||
comboBoxGrow->clear();
|
comboBoxGrow->clear();
|
||||||
comboBoxGrow->addItems(list);
|
comboBoxGrow->addItems(list);
|
||||||
comboBoxGrow->setCurrentIndex(12);
|
comboBoxGrow->setCurrentIndex(12);
|
||||||
ui->toolBarOption->addWidget(comboBoxGrow);
|
ui->toolBarOption->addWidget(comboBoxGrow);
|
||||||
|
connect(comboBoxGrow,
|
||||||
|
static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged),
|
||||||
|
this, &MainWindow::ChangedGrowth);
|
||||||
|
|
||||||
QLabel * labelSize = new QLabel;
|
QLabel * labelSize = new QLabel;
|
||||||
labelSize->setText(" Розмір: ");
|
labelSize->setText(" Розмір: ");
|
||||||
|
@ -191,11 +191,14 @@ void MainWindow::ToolBarOption(){
|
||||||
|
|
||||||
list.clear();
|
list.clear();
|
||||||
list << "28"<<"30"<<"32"<<"34"<<"36"<<"38"<<"40"<<"42"<<"44"<<"46"<<"48"<<"50" << "52" << "54" << "56";
|
list << "28"<<"30"<<"32"<<"34"<<"36"<<"38"<<"40"<<"42"<<"44"<<"46"<<"48"<<"50" << "52" << "54" << "56";
|
||||||
QComboBox* comboBoxSize = new QComboBox;
|
QComboBox *comboBoxSize = new QComboBox;
|
||||||
comboBoxSize->clear();
|
comboBoxSize->clear();
|
||||||
comboBoxSize->addItems(list);
|
comboBoxSize->addItems(list);
|
||||||
comboBoxSize->setCurrentIndex(11);
|
comboBoxSize->setCurrentIndex(11);
|
||||||
ui->toolBarOption->addWidget(comboBoxSize);
|
ui->toolBarOption->addWidget(comboBoxSize);
|
||||||
|
connect(comboBoxSize,
|
||||||
|
static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged),
|
||||||
|
this, &MainWindow::ChangedSize);
|
||||||
|
|
||||||
ui->toolBarOption->addSeparator();
|
ui->toolBarOption->addSeparator();
|
||||||
|
|
||||||
|
@ -218,6 +221,9 @@ void MainWindow::ToolBarDraws(){
|
||||||
|
|
||||||
ui->toolBarDraws->addAction(ui->actionOptionDraw);
|
ui->toolBarDraws->addAction(ui->actionOptionDraw);
|
||||||
ui->actionOptionDraw->setEnabled(false);
|
ui->actionOptionDraw->setEnabled(false);
|
||||||
|
|
||||||
|
ui->toolBarDraws->addAction(ui->actionTable);
|
||||||
|
ui->actionTable->setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::currentDrawChanged( int index ){
|
void MainWindow::currentDrawChanged( int index ){
|
||||||
|
@ -356,10 +362,12 @@ void MainWindow::triggeredActionOpen(){
|
||||||
disconnect(comboBoxDraws, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
disconnect(comboBoxDraws, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
||||||
this, &MainWindow::currentDrawChanged);
|
this, &MainWindow::currentDrawChanged);
|
||||||
doc->Parse(Document::FullParse, scene, comboBoxDraws);
|
doc->Parse(Document::FullParse, scene, comboBoxDraws);
|
||||||
|
CreateManTableIGroup ();
|
||||||
connect(comboBoxDraws, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
connect(comboBoxDraws, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
||||||
this, &MainWindow::currentDrawChanged);
|
this, &MainWindow::currentDrawChanged);
|
||||||
ui->actionSave->setEnabled(true);
|
ui->actionSave->setEnabled(true);
|
||||||
ui->actionSaveAs->setEnabled(true);
|
ui->actionSaveAs->setEnabled(true);
|
||||||
|
ui->actionTable->setEnabled(true);
|
||||||
QString nameDraw = doc->GetNameActivDraw();
|
QString nameDraw = doc->GetNameActivDraw();
|
||||||
qint32 index = comboBoxDraws->findText(nameDraw);
|
qint32 index = comboBoxDraws->findText(nameDraw);
|
||||||
if ( index != -1 ) { // -1 for not found
|
if ( index != -1 ) { // -1 for not found
|
||||||
|
@ -375,6 +383,7 @@ void MainWindow::triggeredActionNew(){
|
||||||
setWindowTitle("Valentina");
|
setWindowTitle("Valentina");
|
||||||
data->Clear();
|
data->Clear();
|
||||||
doc->clear();
|
doc->clear();
|
||||||
|
CreateManTableIGroup ();
|
||||||
CanselTool();
|
CanselTool();
|
||||||
comboBoxDraws->clear();
|
comboBoxDraws->clear();
|
||||||
fileName.clear();
|
fileName.clear();
|
||||||
|
@ -389,6 +398,110 @@ void MainWindow::haveChange(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::CreateManTableIGroup () const{
|
||||||
|
data->AddStandartTableCell("Pkor", VStandartTableCell(84, 0, 3));
|
||||||
|
data->AddStandartTableCell("Pkor", VStandartTableCell(84, 0, 3));
|
||||||
|
data->AddStandartTableCell("Vtos", VStandartTableCell(1450, 2, 51));
|
||||||
|
data->AddStandartTableCell("Vtosh", VStandartTableCell(1506, 2, 54));
|
||||||
|
data->AddStandartTableCell("Vpt", VStandartTableCell(1438, 3, 52));
|
||||||
|
data->AddStandartTableCell("Vst", VStandartTableCell(1257, -1, 49));
|
||||||
|
data->AddStandartTableCell("Vlt", VStandartTableCell(1102, 0, 43));
|
||||||
|
data->AddStandartTableCell("Vk", VStandartTableCell(503, 0, 22));
|
||||||
|
data->AddStandartTableCell("Vsht", VStandartTableCell(1522, 2, 54));
|
||||||
|
data->AddStandartTableCell("Vzy", VStandartTableCell(1328, 0, 49));
|
||||||
|
data->AddStandartTableCell("Vlop", VStandartTableCell(1320, 0, 49));
|
||||||
|
data->AddStandartTableCell("Vps", VStandartTableCell(811, -1, 36));
|
||||||
|
data->AddStandartTableCell("Osh", VStandartTableCell(404,8, 2));
|
||||||
|
data->AddStandartTableCell("OgI", VStandartTableCell(1034, 36, 4));
|
||||||
|
data->AddStandartTableCell("OgII", VStandartTableCell(1044, 38, 2));
|
||||||
|
data->AddStandartTableCell("OgIII", VStandartTableCell(1000, 40, 0));
|
||||||
|
data->AddStandartTableCell("Ot", VStandartTableCell(780, 40, 0));
|
||||||
|
data->AddStandartTableCell("Ob", VStandartTableCell(984, 30, 10));
|
||||||
|
data->AddStandartTableCell("ObI", VStandartTableCell(964, 24, 12));
|
||||||
|
data->AddStandartTableCell("Obed", VStandartTableCell(566, 18, 6));
|
||||||
|
data->AddStandartTableCell("Ok", VStandartTableCell(386, 8, 8));
|
||||||
|
data->AddStandartTableCell("Oi", VStandartTableCell(380, 8, 6));
|
||||||
|
data->AddStandartTableCell("Osch", VStandartTableCell(234, 4, 4));
|
||||||
|
data->AddStandartTableCell("Os", VStandartTableCell(350, 2, 8));
|
||||||
|
data->AddStandartTableCell("Dsb", VStandartTableCell(1120, 0, 44));
|
||||||
|
data->AddStandartTableCell("Dsp", VStandartTableCell(1110, 0, 43));
|
||||||
|
data->AddStandartTableCell("Dn", VStandartTableCell(826, -3, 37));
|
||||||
|
data->AddStandartTableCell("Dps", VStandartTableCell(316, 4, 7));
|
||||||
|
data->AddStandartTableCell("Dpob", VStandartTableCell(783, 14, 15));
|
||||||
|
data->AddStandartTableCell("Ds", VStandartTableCell(260, 1, 6));
|
||||||
|
data->AddStandartTableCell("Op", VStandartTableCell(316, 12, 0));
|
||||||
|
data->AddStandartTableCell("Ozap", VStandartTableCell(180, 4, 0));
|
||||||
|
data->AddStandartTableCell("Pkis", VStandartTableCell(250, 4, 0));
|
||||||
|
data->AddStandartTableCell("SHp", VStandartTableCell(160, 1, 4));
|
||||||
|
data->AddStandartTableCell("Dlych", VStandartTableCell(500, 2, 15));
|
||||||
|
data->AddStandartTableCell("Dzap", VStandartTableCell(768, 2, 24));
|
||||||
|
data->AddStandartTableCell("DIIIp", VStandartTableCell(970, 2, 29));
|
||||||
|
data->AddStandartTableCell("Vprp", VStandartTableCell(214, 3, 3));
|
||||||
|
data->AddStandartTableCell("Vg", VStandartTableCell(262, 8, 3));
|
||||||
|
data->AddStandartTableCell("Dtp", VStandartTableCell(460, 7, 9));
|
||||||
|
data->AddStandartTableCell("Dp", VStandartTableCell(355, 5, 5));
|
||||||
|
data->AddStandartTableCell("Vprz", VStandartTableCell(208, 3, 5));
|
||||||
|
data->AddStandartTableCell("Dts", VStandartTableCell(438, 2, 10));
|
||||||
|
data->AddStandartTableCell("DtsI", VStandartTableCell(469, 2, 10));
|
||||||
|
data->AddStandartTableCell("Dvcht", VStandartTableCell(929, 9, 19));
|
||||||
|
data->AddStandartTableCell("SHg", VStandartTableCell(370, 14, 4));
|
||||||
|
data->AddStandartTableCell("Cg", VStandartTableCell(224, 6, 0));
|
||||||
|
data->AddStandartTableCell("SHs", VStandartTableCell(416, 10, 2));
|
||||||
|
data->AddStandartTableCell("dpzr", VStandartTableCell(121, 6, 0));
|
||||||
|
data->AddStandartTableCell("Ogol", VStandartTableCell(576, 4, 4));
|
||||||
|
data->AddStandartTableCell("Ssh1", VStandartTableCell(205, 5, 0));
|
||||||
|
data->AddStandartTableCell("St", VStandartTableCell(410, 20, 0));
|
||||||
|
data->AddStandartTableCell("Drzap", VStandartTableCell(594, 3, 19));
|
||||||
|
data->AddStandartTableCell("DbII", VStandartTableCell(1020, 0, 44));
|
||||||
|
data->AddStandartTableCell("Sb", VStandartTableCell(504, 15, 4));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::ChangedSize(const QString & text){
|
||||||
|
qint32 size = text.toInt();
|
||||||
|
data->SetSize(size*10);
|
||||||
|
doc->FullUpdateTree();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::ChangedGrowth(const QString &text){
|
||||||
|
qint32 growth = text.toInt();
|
||||||
|
data->SetGrowth(growth*10);
|
||||||
|
doc->FullUpdateTree();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::SetEnableWidgets(bool enable){
|
||||||
|
ui->actionSaveAs->setEnabled(enable);
|
||||||
|
ui->actionDraw->setEnabled(enable);
|
||||||
|
ui->actionDetails->setEnabled(enable);
|
||||||
|
ui->toolButtonSinglePoint->setEnabled(enable);
|
||||||
|
ui->actionOptionDraw->setEnabled(enable);
|
||||||
|
ui->actionSave->setEnabled(enable);
|
||||||
|
ui->actionTable->setEnabled(enable);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::triggeredActionTable(bool checked){
|
||||||
|
if(checked){
|
||||||
|
dialogTable = new DialogIncrements(data, doc, 0);
|
||||||
|
connect(dialogTable, &DialogIncrements::closedActionTable, this,
|
||||||
|
&MainWindow::closedActionTable);
|
||||||
|
dialogTable->show();
|
||||||
|
} else {
|
||||||
|
ui->actionTable->setChecked(true);
|
||||||
|
dialogTable->activateWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::closedActionTable(){
|
||||||
|
ui->actionTable->setChecked(false);
|
||||||
|
delete dialogTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::closeEvent ( QCloseEvent * event ){
|
||||||
|
if(ui->actionTable->isChecked()==true){
|
||||||
|
delete dialogTable;
|
||||||
|
}
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow(){
|
MainWindow::~MainWindow(){
|
||||||
CanselTool();
|
CanselTool();
|
||||||
delete ui;
|
delete ui;
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
#include "widgets/vmaingraphicsscene.h"
|
#include "widgets/vmaingraphicsscene.h"
|
||||||
#include "dialogs/dialogsinglepoint.h"
|
#include "dialogs/dialogsinglepoint.h"
|
||||||
|
#include "dialogs/dialogincrements.h"
|
||||||
#include "tools/vtoolsimplepoint.h"
|
#include "tools/vtoolsimplepoint.h"
|
||||||
#include "xml/vdomdocument.h"
|
#include "xml/vdomdocument.h"
|
||||||
#include "container/vcontainer.h"
|
#include "container/vcontainer.h"
|
||||||
|
@ -46,9 +47,14 @@ public slots:
|
||||||
void triggeredActionOpen();
|
void triggeredActionOpen();
|
||||||
void triggeredActionNew();
|
void triggeredActionNew();
|
||||||
void haveChange();
|
void haveChange();
|
||||||
|
void ChangedSize(const QString &text);
|
||||||
|
void ChangedGrowth(const QString & text);
|
||||||
|
void triggeredActionTable(bool checked);
|
||||||
|
void closedActionTable();
|
||||||
protected:
|
protected:
|
||||||
virtual void keyPressEvent ( QKeyEvent * event );
|
virtual void keyPressEvent ( QKeyEvent * event );
|
||||||
virtual void showEvent( QShowEvent *event );
|
virtual void showEvent( QShowEvent *event );
|
||||||
|
virtual void closeEvent ( QCloseEvent * event );
|
||||||
private:
|
private:
|
||||||
Ui::MainWindow *ui;
|
Ui::MainWindow *ui;
|
||||||
Tools::Enum tool;
|
Tools::Enum tool;
|
||||||
|
@ -57,6 +63,7 @@ private:
|
||||||
QLabel *helpLabel;
|
QLabel *helpLabel;
|
||||||
bool isInitialized;
|
bool isInitialized;
|
||||||
DialogSinglePoint *dialogSinglePoint;
|
DialogSinglePoint *dialogSinglePoint;
|
||||||
|
DialogIncrements *dialogTable;
|
||||||
VDomDocument *doc;
|
VDomDocument *doc;
|
||||||
VContainer *data;
|
VContainer *data;
|
||||||
QComboBox *comboBoxDraws;
|
QComboBox *comboBoxDraws;
|
||||||
|
@ -66,6 +73,8 @@ private:
|
||||||
void ToolBarDraws();
|
void ToolBarDraws();
|
||||||
void CanselTool();
|
void CanselTool();
|
||||||
void ArrowTool();
|
void ArrowTool();
|
||||||
|
void CreateManTableIGroup () const;
|
||||||
|
void SetEnableWidgets(bool enable);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
|
|
@ -447,6 +447,18 @@
|
||||||
<string>Змінити ім'я креслення</string>
|
<string>Змінити ім'я креслення</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionTable">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="icon.qrc">
|
||||||
|
<normaloff>:/icon/32x32/table.png</normaloff>:/icon/32x32/table.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Таблиці змінних</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11"/>
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
195
tools/vtoolpoint.cpp
Normal file
195
tools/vtoolpoint.cpp
Normal file
|
@ -0,0 +1,195 @@
|
||||||
|
#include "vtoolpoint.h"
|
||||||
|
#include <QPen>
|
||||||
|
#include <QBrush>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QGraphicsItem>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#include "../options.h"
|
||||||
|
#include "../container/vpointf.h"
|
||||||
|
|
||||||
|
VToolPoint::VToolPoint(VDomDocument *doc, VContainer *data, qint64 id,
|
||||||
|
QGraphicsItem *parent):QGraphicsEllipseItem(parent){
|
||||||
|
this->doc = doc;
|
||||||
|
this->data = data;
|
||||||
|
radius = 1.5*PrintDPI/25.4;
|
||||||
|
this->id = id;
|
||||||
|
nameActivDraw = doc->GetNameActivDraw();
|
||||||
|
//create circle
|
||||||
|
VPointF point = data->GetPoint(id);
|
||||||
|
QRectF rec = QRectF(point.x(), point.y(), radius*2, radius*2);
|
||||||
|
rec.translate(point.x()-rec.center().x(), point.y()-rec.center().y());
|
||||||
|
this->setRect(rec);
|
||||||
|
this->setPen(QPen(Qt::black, widthHairLine));
|
||||||
|
this->setBrush(QBrush(Qt::NoBrush));
|
||||||
|
this->setFlag(QGraphicsItem::ItemIsSelectable, true);
|
||||||
|
|
||||||
|
//Тексто мітка точки
|
||||||
|
namePoint = new VGraphicsSimpleTextItem(point.name(), this);
|
||||||
|
rec = this->rect();
|
||||||
|
namePoint->setPos(QPointF(rec.center().x()+point.mx(), rec.center().y()+point.my()));
|
||||||
|
connect(namePoint, &VGraphicsSimpleTextItem::NameChangePosition, this,
|
||||||
|
&VToolPoint::NameChangePosition);
|
||||||
|
|
||||||
|
//Лінія, що з'єднує точку і мітку
|
||||||
|
QRectF nameRec = namePoint->sceneBoundingRect();
|
||||||
|
QPointF p1, p2;
|
||||||
|
LineIntersectCircle(rec.center(), radius, QLineF(rec.center(), nameRec.center()), p1, p2);
|
||||||
|
QPointF pRec = LineIntersectRect(nameRec, QLineF(rec.center(), nameRec.center()));
|
||||||
|
line = new QGraphicsLineItem(QLineF(p1, pRec), this);
|
||||||
|
line->setFlag(QGraphicsItem::ItemStacksBehindParent, true);
|
||||||
|
if(QLineF(p1, pRec).length() <= 4*PrintDPI/25.4){
|
||||||
|
line->setVisible(false);
|
||||||
|
} else {
|
||||||
|
line->setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(this->doc, &VDomDocument::ChangedActivDraw, this, &VToolPoint::ChangedActivDraw);
|
||||||
|
connect(this->doc, &VDomDocument::ChangedNameDraw, this, &VToolPoint::ChangedNameDraw);
|
||||||
|
connect(this, &VToolPoint::haveLiteChange, this->doc, &VDomDocument::haveLiteChange);
|
||||||
|
connect(this->doc, &VDomDocument::FullUpdateFromFile, this, &VToolPoint::FullUpdateFromFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VToolPoint::NameChangePosition(const QPointF pos){
|
||||||
|
VPointF point = data->GetPoint(id);
|
||||||
|
QRectF rec = this->rect();
|
||||||
|
point.setMx(pos.x() - rec.center().x());
|
||||||
|
point.setMy(pos.y() - rec.center().y());
|
||||||
|
RefreshLine();
|
||||||
|
LiteUpdateFromGui(point.name(), point.mx(), point.my());
|
||||||
|
data->UpdatePoint(id, point);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Взято з сайту http://hardfire.ru/cross_line_circle
|
||||||
|
*/
|
||||||
|
qint32 VToolPoint::LineIntersectCircle(QPointF center, qreal radius, QLineF line, QPointF &p1,
|
||||||
|
QPointF &p2) const{
|
||||||
|
const qreal eps = 1e-8;
|
||||||
|
//коефіцієнти для рівняння відрізку
|
||||||
|
qreal a = line.p2().y() - line.p1().y();
|
||||||
|
qreal b = line.p1().x() - line.p2().x();
|
||||||
|
// В даному випадку не використовується.
|
||||||
|
//qreal c = - a * line.p1().x() - b * line.p1().y();
|
||||||
|
// проекция центра окружности на прямую
|
||||||
|
QPointF p = ClosestPoint (line, center);
|
||||||
|
// сколько всего решений?
|
||||||
|
qint32 flag = 0;
|
||||||
|
qreal d = QLineF (center, p).length();
|
||||||
|
if (qAbs (d - radius) <= eps){
|
||||||
|
flag = 1;
|
||||||
|
} else {
|
||||||
|
if (radius > d){
|
||||||
|
flag = 2;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// находим расстояние от проекции до точек пересечения
|
||||||
|
qreal k = sqrt (radius * radius - d * d);
|
||||||
|
qreal t = QLineF (QPointF (0, 0), QPointF (b, - a)).length();
|
||||||
|
// добавляем к проекции векторы направленные к точкам пеерсечения
|
||||||
|
p1 = add_vector (p, QPointF (0, 0), QPointF (- b, a), k / t);
|
||||||
|
p2 = add_vector (p, QPointF (0, 0), QPointF (b, - a), k / t);
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Добавление вектора к точке
|
||||||
|
* Взято з сайту http://hardfire.ru/add_vector
|
||||||
|
*/
|
||||||
|
QPointF VToolPoint::add_vector (QPointF p, QPointF p1, QPointF p2, qreal k) const{
|
||||||
|
return QPointF (p.x() + (p2.x() - p1.x()) * k, p.y() + (p2.y() - p1.y()) * k);
|
||||||
|
}
|
||||||
|
|
||||||
|
QPointF VToolPoint::ClosestPoint(QLineF line, QPointF p) const{
|
||||||
|
QLineF lineP2pointFrom = QLineF(line.p2(), p);
|
||||||
|
qreal angle = 180-line.angleTo(lineP2pointFrom)-90;
|
||||||
|
QLineF pointFromlineP2 = QLineF(p, line.p2());
|
||||||
|
pointFromlineP2.setAngle(pointFromlineP2.angle()+angle);
|
||||||
|
QPointF point;
|
||||||
|
QLineF::IntersectType type = pointFromlineP2.intersect(line,&point);
|
||||||
|
if ( type == QLineF::BoundedIntersection ){
|
||||||
|
return point;
|
||||||
|
} else{
|
||||||
|
if ( type == QLineF::NoIntersection || type == QLineF::UnboundedIntersection ){
|
||||||
|
Q_ASSERT_X(type != QLineF::BoundedIntersection, Q_FUNC_INFO, "Немає точки перетину.");
|
||||||
|
return point;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return point;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPointF VToolPoint::LineIntersectRect(QRectF rec, QLineF line) const{
|
||||||
|
qreal x1, y1, x2, y2;
|
||||||
|
rec.getCoords(&x1, &y1, &x2, &y2);
|
||||||
|
QPointF point;
|
||||||
|
QLineF::IntersectType type = line.intersect(QLineF(QPointF(x1,y1), QPointF(x1,y2)),&point);
|
||||||
|
if ( type == QLineF::BoundedIntersection ){
|
||||||
|
return point;
|
||||||
|
}
|
||||||
|
type = line.intersect(QLineF(QPointF(x1,y1), QPointF(x2,y1)),&point);
|
||||||
|
if ( type == QLineF::BoundedIntersection ){
|
||||||
|
return point;
|
||||||
|
}
|
||||||
|
type = line.intersect(QLineF(QPointF(x1,y2), QPointF(x2,y2)),&point);
|
||||||
|
if ( type == QLineF::BoundedIntersection ){
|
||||||
|
return point;
|
||||||
|
}
|
||||||
|
type = line.intersect(QLineF(QPointF(x2,y1), QPointF(x2,y2)),&point);
|
||||||
|
if ( type == QLineF::BoundedIntersection ){
|
||||||
|
return point;
|
||||||
|
}
|
||||||
|
Q_ASSERT_X(type != QLineF::BoundedIntersection, Q_FUNC_INFO, "Немає точки перетину.");
|
||||||
|
return point;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VToolPoint::RefreshLine(){
|
||||||
|
QRectF nameRec = namePoint->sceneBoundingRect();
|
||||||
|
QPointF p1, p2;
|
||||||
|
QRectF rec = this->rect();
|
||||||
|
LineIntersectCircle(rec.center(), radius, QLineF(rec.center(), nameRec.center()), p1, p2);
|
||||||
|
QPointF pRec = LineIntersectRect(nameRec, QLineF(rec.center(), nameRec.center()));
|
||||||
|
line->setLine(QLineF(p1, pRec));
|
||||||
|
if(QLineF(p1, pRec).length() <= 4*PrintDPI/25.4){
|
||||||
|
line->setVisible(false);
|
||||||
|
} else {
|
||||||
|
line->setVisible(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VToolPoint::LiteUpdateFromGui(const QString& name, qreal mx, qreal my){
|
||||||
|
QDomElement domElement = doc->elementById(QString().setNum(id));
|
||||||
|
if(domElement.isElement()){
|
||||||
|
domElement.setAttribute("name", name);
|
||||||
|
domElement.setAttribute("mx", QString().setNum(mx/PrintDPI*25.4));
|
||||||
|
domElement.setAttribute("my", QString().setNum(my/PrintDPI*25.4));
|
||||||
|
emit haveLiteChange();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VToolPoint::ChangedNameDraw(const QString oldName, const QString newName){
|
||||||
|
if(nameActivDraw == oldName){
|
||||||
|
nameActivDraw = newName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VToolPoint::ChangedActivDraw(const QString newName){
|
||||||
|
if(nameActivDraw == newName){
|
||||||
|
this->setPen(QPen(Qt::black, widthHairLine));
|
||||||
|
this->setFlag(QGraphicsItem::ItemIsSelectable, true);
|
||||||
|
namePoint->setFlag(QGraphicsItem::ItemIsMovable, true);
|
||||||
|
namePoint->setFlag(QGraphicsItem::ItemIsSelectable, true);
|
||||||
|
namePoint->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
|
||||||
|
namePoint->setBrush(QBrush(Qt::black));
|
||||||
|
line->setPen(QPen(Qt::black, widthHairLine));
|
||||||
|
} else {
|
||||||
|
this->setPen(QPen(Qt::gray, widthHairLine));
|
||||||
|
this->setFlag(QGraphicsItem::ItemIsSelectable, false);
|
||||||
|
namePoint->setFlag(QGraphicsItem::ItemIsMovable, false);
|
||||||
|
namePoint->setFlag(QGraphicsItem::ItemIsSelectable, false);
|
||||||
|
namePoint->setFlag(QGraphicsItem::ItemSendsGeometryChanges, false);
|
||||||
|
namePoint->setBrush(QBrush(Qt::gray));
|
||||||
|
line->setPen(QPen(Qt::gray, widthHairLine));
|
||||||
|
}
|
||||||
|
}
|
50
tools/vtoolpoint.h
Normal file
50
tools/vtoolpoint.h
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
#ifndef VTOOLPOINT_H
|
||||||
|
#define VTOOLPOINT_H
|
||||||
|
|
||||||
|
#include <QGraphicsEllipseItem>
|
||||||
|
#include <QGraphicsLineItem>
|
||||||
|
|
||||||
|
#include "../widgets/vgraphicssimpletextitem.h"
|
||||||
|
#include "../container/vcontainer.h"
|
||||||
|
#include "../xml/vdomdocument.h"
|
||||||
|
|
||||||
|
namespace Tool{
|
||||||
|
enum Enum
|
||||||
|
{
|
||||||
|
FromGui,
|
||||||
|
FromFile
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class VToolPoint: public QObject, public QGraphicsEllipseItem
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
VToolPoint(VDomDocument *doc, VContainer *data, qint64 id, QGraphicsItem * parent = 0);
|
||||||
|
public slots:
|
||||||
|
void NameChangePosition(const QPointF pos);
|
||||||
|
virtual void ChangedActivDraw(const QString newName);
|
||||||
|
virtual void FullUpdateFromFile()=0;
|
||||||
|
void ChangedNameDraw(const QString oldName, const QString newName);
|
||||||
|
signals:
|
||||||
|
void haveLiteChange();
|
||||||
|
protected:
|
||||||
|
qreal radius;
|
||||||
|
VDomDocument *doc;
|
||||||
|
VContainer *data;
|
||||||
|
VGraphicsSimpleTextItem *namePoint;
|
||||||
|
QGraphicsLineItem *line;
|
||||||
|
qint64 id;
|
||||||
|
QString nameActivDraw;
|
||||||
|
virtual void AddToFile()=0;
|
||||||
|
void RefreshLine();
|
||||||
|
private:
|
||||||
|
qint32 LineIntersectCircle(QPointF center, qreal radius, QLineF line, QPointF &p1,
|
||||||
|
QPointF &p2) const;
|
||||||
|
QPointF LineIntersectRect(QRectF rec, QLineF line) const;
|
||||||
|
QPointF ClosestPoint(QLineF line, QPointF p) const;
|
||||||
|
QPointF add_vector (QPointF p, QPointF p1, QPointF p2, qreal k) const;
|
||||||
|
void LiteUpdateFromGui(const QString& name, qreal mx, qreal my);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // VTOOLPOINT_H
|
|
@ -12,173 +12,25 @@
|
||||||
#include "../dialogs/dialogsinglepoint.h"
|
#include "../dialogs/dialogsinglepoint.h"
|
||||||
|
|
||||||
VToolSimplePoint::VToolSimplePoint (VDomDocument *doc, VContainer *data, qint64 id, Tool::Enum typeCreation,
|
VToolSimplePoint::VToolSimplePoint (VDomDocument *doc, VContainer *data, qint64 id, Tool::Enum typeCreation,
|
||||||
QGraphicsItem * parent ):QGraphicsEllipseItem(parent){
|
QGraphicsItem * parent ):VToolPoint(doc, data, id, parent){
|
||||||
InitializeSimplePoint(doc, data, id);
|
|
||||||
if(typeCreation == Tool::FromGui){
|
|
||||||
AddSimplePointToFile();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void VToolSimplePoint::InitializeSimplePoint(VDomDocument *doc, VContainer *data, qint64 id){
|
|
||||||
ignoreContextMenuEvent = false;//don't ignore context menu events;
|
ignoreContextMenuEvent = false;//don't ignore context menu events;
|
||||||
this->doc = doc;
|
|
||||||
this->data = data;
|
|
||||||
radius = 1.5*PrintDPI/25.4;
|
|
||||||
this->id = id;
|
|
||||||
nameActivDraw = doc->GetNameActivDraw();
|
|
||||||
//create circle
|
|
||||||
VPointF point = data->GetPoint(id);
|
|
||||||
QRectF rec = QRectF(point.x(), point.y(), radius*2, radius*2);
|
|
||||||
rec.translate(point.x()-rec.center().x(), point.y()-rec.center().y());
|
|
||||||
this->setRect(rec);
|
|
||||||
this->setPen(QPen(Qt::black, widthHairLine));
|
|
||||||
this->setBrush(QBrush(Qt::NoBrush));
|
|
||||||
this->setFlag(QGraphicsItem::ItemIsSelectable, true);
|
|
||||||
|
|
||||||
//Тексто мітка точки
|
|
||||||
namePoint = new VGraphicsSimpleTextItem(point.name(), this);
|
|
||||||
rec = this->rect();
|
|
||||||
namePoint->setPos(QPointF(rec.center().x()+point.mx(), rec.center().y()+point.my()));
|
|
||||||
connect(namePoint, &VGraphicsSimpleTextItem::NameChangePosition, this,
|
|
||||||
&VToolSimplePoint::NameChangePosition);
|
|
||||||
|
|
||||||
//Лінія, що з'єднує точку і мітку
|
|
||||||
QRectF nameRec = namePoint->sceneBoundingRect();
|
|
||||||
QPointF p1, p2;
|
|
||||||
LineIntersectCircle(rec.center(), radius, QLineF(rec.center(), nameRec.center()), p1, p2);
|
|
||||||
QPointF pRec = LineIntersectRect(nameRec, QLineF(rec.center(), nameRec.center()));
|
|
||||||
line = new QGraphicsLineItem(QLineF(p1, pRec), this);
|
|
||||||
line->setFlag(QGraphicsItem::ItemStacksBehindParent, true);
|
|
||||||
if(QLineF(p1, pRec).length() <= 4*PrintDPI/25.4){
|
|
||||||
line->setVisible(false);
|
|
||||||
} else {
|
|
||||||
line->setVisible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
connect(this->doc, &VDomDocument::ChangedActivDraw, this, &VToolSimplePoint::ChangedActivDraw);
|
|
||||||
connect(this->doc, &VDomDocument::ChangedNameDraw, this, &VToolSimplePoint::ChangedNameDraw);
|
|
||||||
connect(this, &VToolSimplePoint::FullUpdateTree, this->doc, &VDomDocument::FullUpdateTree);
|
connect(this, &VToolSimplePoint::FullUpdateTree, this->doc, &VDomDocument::FullUpdateTree);
|
||||||
connect(this, &VToolSimplePoint::haveLiteChange, this->doc, &VDomDocument::haveLiteChange);
|
if(typeCreation == Tool::FromGui){
|
||||||
connect(this->doc, &VDomDocument::FullUpdateFromFile, this, &VToolSimplePoint::FullUpdateFromFile);
|
AddToFile();
|
||||||
}
|
|
||||||
|
|
||||||
void VToolSimplePoint::NameChangePosition(const QPointF pos){
|
|
||||||
VPointF point = data->GetPoint(id);
|
|
||||||
QRectF rec = this->rect();
|
|
||||||
point.setMx(pos.x() - rec.center().x());
|
|
||||||
point.setMy(pos.y() - rec.center().y());
|
|
||||||
RefreshLine();
|
|
||||||
LiteUpdateFromGui(point.name(), point.mx(), point.my());
|
|
||||||
data->UpdatePoint(id, point);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Взято з сайту http://hardfire.ru/cross_line_circle
|
|
||||||
*/
|
|
||||||
qint32 VToolSimplePoint::LineIntersectCircle(QPointF center, qreal radius, QLineF line, QPointF &p1,
|
|
||||||
QPointF &p2) const{
|
|
||||||
const qreal eps = 1e-8;
|
|
||||||
//коефіцієнти для рівняння відрізку
|
|
||||||
qreal a = line.p2().y() - line.p1().y();
|
|
||||||
qreal b = line.p1().x() - line.p2().x();
|
|
||||||
// В даному випадку не використовується.
|
|
||||||
//qreal c = - a * line.p1().x() - b * line.p1().y();
|
|
||||||
// проекция центра окружности на прямую
|
|
||||||
QPointF p = ClosestPoint (line, center);
|
|
||||||
// сколько всего решений?
|
|
||||||
qint32 flag = 0;
|
|
||||||
qreal d = QLineF (center, p).length();
|
|
||||||
if (qAbs (d - radius) <= eps){
|
|
||||||
flag = 1;
|
|
||||||
} else {
|
|
||||||
if (radius > d){
|
|
||||||
flag = 2;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// находим расстояние от проекции до точек пересечения
|
|
||||||
qreal k = sqrt (radius * radius - d * d);
|
|
||||||
qreal t = QLineF (QPointF (0, 0), QPointF (b, - a)).length();
|
|
||||||
// добавляем к проекции векторы направленные к точкам пеерсечения
|
|
||||||
p1 = add_vector (p, QPointF (0, 0), QPointF (- b, a), k / t);
|
|
||||||
p2 = add_vector (p, QPointF (0, 0), QPointF (b, - a), k / t);
|
|
||||||
return flag;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Добавление вектора к точке
|
|
||||||
* Взято з сайту http://hardfire.ru/add_vector
|
|
||||||
*/
|
|
||||||
QPointF VToolSimplePoint::add_vector (QPointF p, QPointF p1, QPointF p2, qreal k) const{
|
|
||||||
return QPointF (p.x() + (p2.x() - p1.x()) * k, p.y() + (p2.y() - p1.y()) * k);
|
|
||||||
}
|
|
||||||
|
|
||||||
QPointF VToolSimplePoint::ClosestPoint(QLineF line, QPointF p) const{
|
|
||||||
QLineF lineP2pointFrom = QLineF(line.p2(), p);
|
|
||||||
qreal angle = 180-line.angleTo(lineP2pointFrom)-90;
|
|
||||||
QLineF pointFromlineP2 = QLineF(p, line.p2());
|
|
||||||
pointFromlineP2.setAngle(pointFromlineP2.angle()+angle);
|
|
||||||
QPointF point;
|
|
||||||
QLineF::IntersectType type = pointFromlineP2.intersect(line,&point);
|
|
||||||
if ( type == QLineF::BoundedIntersection ){
|
|
||||||
return point;
|
|
||||||
} else{
|
|
||||||
if ( type == QLineF::NoIntersection || type == QLineF::UnboundedIntersection ){
|
|
||||||
Q_ASSERT_X(type != QLineF::BoundedIntersection, Q_FUNC_INFO, "Немає точки перетину.");
|
|
||||||
return point;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return point;
|
|
||||||
}
|
|
||||||
|
|
||||||
QPointF VToolSimplePoint::LineIntersectRect(QRectF rec, QLineF line) const{
|
|
||||||
qreal x1, y1, x2, y2;
|
|
||||||
rec.getCoords(&x1, &y1, &x2, &y2);
|
|
||||||
QPointF point;
|
|
||||||
QLineF::IntersectType type = line.intersect(QLineF(QPointF(x1,y1), QPointF(x1,y2)),&point);
|
|
||||||
if ( type == QLineF::BoundedIntersection ){
|
|
||||||
return point;
|
|
||||||
}
|
|
||||||
type = line.intersect(QLineF(QPointF(x1,y1), QPointF(x2,y1)),&point);
|
|
||||||
if ( type == QLineF::BoundedIntersection ){
|
|
||||||
return point;
|
|
||||||
}
|
|
||||||
type = line.intersect(QLineF(QPointF(x1,y2), QPointF(x2,y2)),&point);
|
|
||||||
if ( type == QLineF::BoundedIntersection ){
|
|
||||||
return point;
|
|
||||||
}
|
|
||||||
type = line.intersect(QLineF(QPointF(x2,y1), QPointF(x2,y2)),&point);
|
|
||||||
if ( type == QLineF::BoundedIntersection ){
|
|
||||||
return point;
|
|
||||||
}
|
|
||||||
Q_ASSERT_X(type != QLineF::BoundedIntersection, Q_FUNC_INFO, "Немає точки перетину.");
|
|
||||||
return point;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VToolSimplePoint::ChangedActivDraw(const QString newName){
|
void VToolSimplePoint::ChangedActivDraw(const QString newName){
|
||||||
if(nameActivDraw == newName){
|
if(nameActivDraw == newName){
|
||||||
this->setPen(QPen(Qt::black, widthHairLine));
|
VToolPoint::ChangedActivDraw(newName);
|
||||||
this->setFlag(QGraphicsItem::ItemIsSelectable, true);
|
|
||||||
namePoint->setFlag(QGraphicsItem::ItemIsMovable, true);
|
|
||||||
namePoint->setFlag(QGraphicsItem::ItemIsSelectable, true);
|
|
||||||
namePoint->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
|
|
||||||
namePoint->setBrush(QBrush(Qt::black));
|
|
||||||
line->setPen(QPen(Qt::black, widthHairLine));
|
|
||||||
ignoreContextMenuEvent = false;
|
ignoreContextMenuEvent = false;
|
||||||
} else {
|
} else {
|
||||||
this->setPen(QPen(Qt::gray, widthHairLine));
|
VToolPoint::ChangedActivDraw(newName);
|
||||||
this->setFlag(QGraphicsItem::ItemIsSelectable, false);
|
|
||||||
namePoint->setFlag(QGraphicsItem::ItemIsMovable, false);
|
|
||||||
namePoint->setFlag(QGraphicsItem::ItemIsSelectable, false);
|
|
||||||
namePoint->setFlag(QGraphicsItem::ItemSendsGeometryChanges, false);
|
|
||||||
namePoint->setBrush(QBrush(Qt::gray));
|
|
||||||
line->setPen(QPen(Qt::gray, widthHairLine));
|
|
||||||
ignoreContextMenuEvent = true;
|
ignoreContextMenuEvent = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VToolSimplePoint::AddSimplePointToFile() const{
|
void VToolSimplePoint::AddToFile(){
|
||||||
VPointF point = data->GetPoint(id);
|
VPointF point = data->GetPoint(id);
|
||||||
QDomElement domElement = doc->createElement("point");
|
QDomElement domElement = doc->createElement("point");
|
||||||
|
|
||||||
|
@ -219,16 +71,6 @@ void VToolSimplePoint::AddSimplePointToFile() const{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VToolSimplePoint::LiteUpdateFromGui(const QString& name, qreal mx, qreal my){
|
|
||||||
QDomElement domElement = doc->elementById(QString().setNum(id));
|
|
||||||
if(domElement.isElement()){
|
|
||||||
domElement.setAttribute("name", name);
|
|
||||||
domElement.setAttribute("mx", QString().setNum(mx/PrintDPI*25.4));
|
|
||||||
domElement.setAttribute("my", QString().setNum(my/PrintDPI*25.4));
|
|
||||||
emit haveLiteChange();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void VToolSimplePoint::FullUpdateFromGui(const QString &name, qreal x, qreal y){
|
void VToolSimplePoint::FullUpdateFromGui(const QString &name, qreal x, qreal y){
|
||||||
QDomElement domElement = doc->elementById(QString().setNum(id));
|
QDomElement domElement = doc->elementById(QString().setNum(id));
|
||||||
if(domElement.isElement()){
|
if(domElement.isElement()){
|
||||||
|
@ -239,12 +81,6 @@ void VToolSimplePoint::FullUpdateFromGui(const QString &name, qreal x, qreal y){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VToolSimplePoint::ChangedNameDraw(const QString oldName, const QString newName){
|
|
||||||
if(nameActivDraw == oldName){
|
|
||||||
nameActivDraw = newName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void VToolSimplePoint::contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ){
|
void VToolSimplePoint::contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ){
|
||||||
if(!ignoreContextMenuEvent){
|
if(!ignoreContextMenuEvent){
|
||||||
QMenu menu;
|
QMenu menu;
|
||||||
|
@ -285,17 +121,3 @@ void VToolSimplePoint::FullUpdateFromFile(){
|
||||||
|
|
||||||
RefreshLine();
|
RefreshLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VToolSimplePoint::RefreshLine(){
|
|
||||||
QRectF nameRec = namePoint->sceneBoundingRect();
|
|
||||||
QPointF p1, p2;
|
|
||||||
QRectF rec = this->rect();
|
|
||||||
LineIntersectCircle(rec.center(), radius, QLineF(rec.center(), nameRec.center()), p1, p2);
|
|
||||||
QPointF pRec = LineIntersectRect(nameRec, QLineF(rec.center(), nameRec.center()));
|
|
||||||
line->setLine(QLineF(p1, pRec));
|
|
||||||
if(QLineF(p1, pRec).length() <= 4*PrintDPI/25.4){
|
|
||||||
line->setVisible(false);
|
|
||||||
} else {
|
|
||||||
line->setVisible(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,56 +1,28 @@
|
||||||
#ifndef VTOOLSIMPLEPOINT_H
|
#ifndef VTOOLSIMPLEPOINT_H
|
||||||
#define VTOOLSIMPLEPOINT_H
|
#define VTOOLSIMPLEPOINT_H
|
||||||
|
|
||||||
#include <QGraphicsEllipseItem>
|
|
||||||
#include <QGraphicsLineItem>
|
|
||||||
|
|
||||||
#include "../widgets/vgraphicssimpletextitem.h"
|
|
||||||
#include "../container/vcontainer.h"
|
#include "../container/vcontainer.h"
|
||||||
#include "../xml/vdomdocument.h"
|
#include "../xml/vdomdocument.h"
|
||||||
|
#include "vtoolpoint.h"
|
||||||
|
|
||||||
namespace Tool{
|
class VToolSimplePoint : public VToolPoint
|
||||||
enum Enum
|
|
||||||
{
|
|
||||||
FromGui,
|
|
||||||
FromFile
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
class VToolSimplePoint : public QObject, public QGraphicsEllipseItem
|
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
VToolSimplePoint (VDomDocument *doc, VContainer *data, qint64 id,
|
VToolSimplePoint (VDomDocument *doc, VContainer *data, qint64 id,
|
||||||
Tool::Enum typeCreation, QGraphicsItem * parent = 0 );
|
Tool::Enum typeCreation, QGraphicsItem * parent = 0 );
|
||||||
public slots:
|
public slots:
|
||||||
void NameChangePosition(const QPointF pos);
|
virtual void ChangedActivDraw(const QString newName);
|
||||||
void ChangedActivDraw(const QString newName);
|
virtual void FullUpdateFromFile();
|
||||||
void ChangedNameDraw(const QString oldName, const QString newName);
|
|
||||||
void FullUpdateFromFile();
|
|
||||||
signals:
|
signals:
|
||||||
void FullUpdateTree();
|
void FullUpdateTree();
|
||||||
void haveLiteChange();
|
|
||||||
protected:
|
protected:
|
||||||
virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event );
|
virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event );
|
||||||
|
virtual void AddToFile();
|
||||||
private:
|
private:
|
||||||
qreal radius;
|
|
||||||
VDomDocument *doc;
|
|
||||||
VContainer *data;
|
|
||||||
VGraphicsSimpleTextItem *namePoint;
|
|
||||||
QGraphicsLineItem *line;
|
|
||||||
qint64 id;
|
|
||||||
QString nameActivDraw;
|
|
||||||
bool ignoreContextMenuEvent;
|
bool ignoreContextMenuEvent;
|
||||||
qint32 LineIntersectCircle(QPointF center, qreal radius, QLineF line, QPointF &p1,
|
|
||||||
QPointF &p2) const;
|
|
||||||
QPointF LineIntersectRect(QRectF rec, QLineF line) const;
|
|
||||||
QPointF ClosestPoint(QLineF line, QPointF p) const;
|
|
||||||
QPointF add_vector (QPointF p, QPointF p1, QPointF p2, qreal k) const;
|
|
||||||
void AddSimplePointToFile() const;
|
|
||||||
void LiteUpdateFromGui(const QString& name, qreal mx, qreal my);
|
|
||||||
void FullUpdateFromGui(const QString& name, qreal x, qreal y);
|
void FullUpdateFromGui(const QString& name, qreal x, qreal y);
|
||||||
void InitializeSimplePoint(VDomDocument *doc, VContainer *data, qint64 id);
|
|
||||||
void RefreshLine();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VTOOLSIMPLEPOINT_H
|
#endif // VTOOLSIMPLEPOINT_H
|
||||||
|
|
|
@ -61,6 +61,8 @@ void VDomDocument::CreateEmptyFile(){
|
||||||
this->appendChild(domElement);
|
this->appendChild(domElement);
|
||||||
QDomNode xmlNode = this->createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
|
QDomNode xmlNode = this->createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
|
||||||
this->insertBefore(xmlNode, this->firstChild());
|
this->insertBefore(xmlNode, this->firstChild());
|
||||||
|
QDomElement incrElement = this->createElement("increments");
|
||||||
|
domElement.appendChild(incrElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VDomDocument::CheckNameDraw(const QString& name) const{
|
bool VDomDocument::CheckNameDraw(const QString& name) const{
|
||||||
|
@ -229,8 +231,35 @@ void VDomDocument::Parse(Document::Enum parse, VMainGraphicsScene *scene, QCombo
|
||||||
AddNewDraw(domElement, comboBoxDraws);
|
AddNewDraw(domElement, comboBoxDraws);
|
||||||
}
|
}
|
||||||
ParseDrawElement(scene, domElement, parse);
|
ParseDrawElement(scene, domElement, parse);
|
||||||
domNode = domNode.nextSibling();
|
}
|
||||||
continue;
|
if(domElement.tagName()=="increments"){
|
||||||
|
ParseIncrementsElement(domElement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
domNode = domNode.nextSibling();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VDomDocument::ParseIncrementsElement(const QDomNode &node){
|
||||||
|
QDomNode domNode = node.firstChild();
|
||||||
|
while(!domNode.isNull()){
|
||||||
|
if(domNode.isElement()){
|
||||||
|
QDomElement domElement = domNode.toElement();
|
||||||
|
if(!domElement.isNull()){
|
||||||
|
if(domElement.tagName() == "increment"){
|
||||||
|
QString name,desc;
|
||||||
|
qint32 base;
|
||||||
|
qreal ksize, kgrowth;
|
||||||
|
qint64 id;
|
||||||
|
id = domElement.attribute("id", "").toLongLong();
|
||||||
|
name = domElement.attribute("name", "");
|
||||||
|
base = domElement.attribute("base","").toInt();
|
||||||
|
ksize = domElement.attribute("ksize","").toDouble();
|
||||||
|
kgrowth = domElement.attribute("kgrowth","").toDouble();
|
||||||
|
desc = domElement.attribute("description","");
|
||||||
|
data->AddIncrementTableRow(name,
|
||||||
|
VIncrementTableRow(id, base, ksize, kgrowth, desc));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -263,6 +292,7 @@ void VDomDocument::AddNewDraw(const QDomElement& node, QComboBox *comboBoxDraws)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
comboBoxDraws->addItem(name, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,7 @@ private:
|
||||||
Document::Enum parse);
|
Document::Enum parse);
|
||||||
void ParsePointElement(VMainGraphicsScene *scene, const QDomElement& domElement,
|
void ParsePointElement(VMainGraphicsScene *scene, const QDomElement& domElement,
|
||||||
Document::Enum parse, const QString &type);
|
Document::Enum parse, const QString &type);
|
||||||
|
void ParseIncrementsElement(const QDomNode& node);
|
||||||
void AddNewDraw(const QDomElement &node, QComboBox *comboBoxDraws)const;
|
void AddNewDraw(const QDomElement &node, QComboBox *comboBoxDraws)const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user