crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Макро Анализатор для OpenCascade
JuryS1806
  опции профиля:
сообщение 11.11.2009, 18:17
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 93
Регистрация: 21.10.2009
Из: Нижний Новгород
Пользователь №: 1168

Спасибо сказали: 9 раз(а)




Репутация:   0  


Так вот, уже год я занимаюсь написанием программы для рисования параметрических объектов. Сейчас активно создаю конзоль, которая будет анализировать команды.

http://depositfiles.com/files/9jq412vcg

Вот что получилось на данный момент.
Если у кого есть свободное время, можем объединить силы.

Сейчас все акшоны и события переделываю под собственную консоль. такой командный интерпретатор получается. :rolleyes:
И работает здорово. К тому же я делаю команды не только на буржуйском языке, а также на отечественном, к примеру для того чтобы
создать новый документ можно через меню Файл, Новый; или Ctrl+N; или ввести команду new; или ввести команду новый. Но самое важное теперь то, что эти команды
и при использовании меню проходят через макроанализатор!
Думаю еще через годик программа будет бомбой, по сравнению с FreeCad и QCad тем более

Хочу спросить как можно на Qt например реализовать такую вещь:
ввожу в QLineEdit строку содержания: линия 0 0 0 100 200 300
или на буржуйском языке line 0 0 0 100 200 300
Так вот, как можно анализировать такую команду, чтобы на выходе из QString было:

QString Name = line
int art1 = 0
int art2 = 0
int art3 = 0
int art4 = 100
int art5 = 200
int art6 = 300

Я понимаю что вопрос делетантский, но прошу помочь. К тому же думаю что не совсем актуально использовать сейчас goto. И путать исходный код макроанализатора.
Спасибо за помощь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
JuryS1806
  опции профиля:
сообщение 16.11.2009, 2:59
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 93
Регистрация: 21.10.2009
Из: Нижний Новгород
Пользователь №: 1168

Спасибо сказали: 9 раз(а)




Репутация:   0  


Вот что получилось с использованием массивов ! Выкладываю свой MacroAnalize.cpp

MacroAnalize
#include "AnalizeMacro.h"
#include "mainwindow.h"
#include <DocumentCommon.h>
#include <QCoreApplication>
#include <QMessageBox>

MacroAnalizer::MacroAnalizer(QString Text)
{
        QString Fixed; //фиксированная часть команды
        QString Param; //параметрическая часть команды
        QString arg[9];
        QStringList TestForParam;

//Базовая обработка строки
        Text=Text.toLower(); //нижний регистр строки
        Text=Text.simplified(); // Убираю повторяющиеся пробелы, пробелы в начале и конце строки

//ПЕРВЫЙ ПРОХОД. ПЫТАЮСЬ НАЙТИ ПОЯСНЕНИЯ. ИГНОРИРУЮ ПРАВУЮ ЧАСТЬ.
TestForParam = Text.split("//");

if (!TestForParam.isEmpty())  // Если обнаружился знак начала пояснения
{
    Text = TestForParam.first();     //тогда тестирую левую часть выражения
}

//ВТОРОЙ ПРОХОД. РАЗДЕЛЯЮ ОСНОВНУЮ КОМАНДУ ОТ ПАРАМЕТРОВ КОМАНДЫ.
TestForParam.clear();
TestForParam = Text.split(QRegExp("\\s+"));

if (!TestForParam.isEmpty())  // Если обнаружился пробел, тогда работаю с левой и правой частью
{
    Fixed = TestForParam.first();     //фиксированная часть
QStringList ::const_iterator i;
for (i = TestForParam.constBegin()+1; i != TestForParam.constEnd(); ++i)  Param += " " + (*i);
}

Fixed=Fixed.simplified(); // Убираю повторяющиеся пробелы, пробелы в начале и конце строки


if ((!Fixed.isEmpty())&&(!Param.isEmpty()))
{
        addNewHistrory(trUtf8("Команда: ")+Fixed+trUtf8(". Параметры: ")+Param);
}
if ((!Fixed.isEmpty())&&(Param.isEmpty()))
{
       addNewHistrory(trUtf8("Команда: ")+Fixed);
}


//ОТРАБАТЫВАЮ ПАРАМЕТРЫ КОМАНДЫ
if (!Param.isNull()) // ЕСЛИ У КОМАНДЫ ЕСТЬ ПАРАМЕТРЫ
{
Param=Param.simplified(); // Убираю повторяющиеся пробелы, пробелы в начале и конце строки

TestForParam.clear();
TestForParam = Param.split(QRegExp("\\s+"));

if (!TestForParam.isEmpty())  // Если обнаружился пробел, тогда разделяю параметры на части
{
    for (int i = 0; i < TestForParam.size(); ++i)
{
          arg[i]=TestForParam.at(i);
}

}

if (arg[1].isNull()) // Аргумент 2 пустой, возможно запись из одного аргумента, разделенного запятыми
{
TestForParam.clear();
TestForParam = Param.split(","); //разбиваю строку по запятым
            if (TestForParam.isEmpty()) //если ничего не разбилось
        {
                arg[0]=Param;
        }
            if (!TestForParam.isEmpty()) //нашел запятые и разбил на множество аргументов
        {
     for (int i = 0; i < TestForParam.size(); ++i)
            {
                  arg[i]=TestForParam.at(i);
            }
        }
    }
}

if (((Fixed==tr("new"))||(Fixed==trUtf8("новый")))&&(arg[0].isNull())) { createNewDoc(); } //команда новый без аргументов

if (((Fixed==tr("quit"))||(Fixed==trUtf8("выход")))&&(arg[0].isNull())) { quit(); } //команда выход без аргументов

if ((Fixed==tr("about"))||(Fixed==trUtf8("программа"))) { aboutGUI(); } //О программе

if ((Fixed==tr("ver"))||(Fixed==trUtf8("версия"))) { version(); } //версия

if (((Fixed==trUtf8("показать"))&&(arg[0]==trUtf8("все"))&&arg[1].isNull())||((Fixed==tr("fit"))&&(arg[0]==tr("all"))&&arg[1].isNull()) ){ FitAll(); }
                                                                   //показать все на всех видах
if (((Fixed==trUtf8("показать"))&&(arg[0]==trUtf8("все"))&&(arg[1]==trUtf8("тек")))||((Fixed==tr("fit"))&&(arg[0]==tr("all"))&&(arg[1]==tr("cur"))) ) { FitAllCur(); }
                                                                   //показать все на текущем виде
if (((Fixed==trUtf8("показ"))&&(arg[0]==trUtf8("выдел"))&&arg[1].isNull())||((Fixed==tr("view"))&&(arg[0]==tr("sel"))&&arg[1].isNull()) ){ ViewSelected(); }
                                                                   //показать выделенную область
if ((Fixed==tr("loop"))||(Fixed==trUtf8("линза"))) { loop(); } //Приближение/отдаление

if ((Fixed==tr("panorama"))||(Fixed==trUtf8("панорама"))) { localPan(); } //Панорама

if ((Fixed==tr("globpan"))||(Fixed==trUtf8("глобпан"))) { globPan(); } //Глобальная Панорама

if ((Fixed==tr("rotate"))||(Fixed==trUtf8("поворот"))) { rotate(); } //Динамическое вращение

if (((Fixed==trUtf8("сброс"))&&(arg[0]==trUtf8("тек"))&&arg[1].isNull())||((Fixed==tr("reset"))&&(arg[0]==tr("cur"))&&arg[1].isNull()) ){ resetcur(); }
                                                                    //Сброс параметров отображения тек вида
if (((Fixed==trUtf8("сброс"))&&(arg[0]==trUtf8("все"))&&arg[1].isNull())||((Fixed==tr("reset"))&&(arg[0]==tr("all"))&&arg[1].isNull()) ){ resetall(); }
                                                                    //Сброс параметров отображения всех видов


}

void MacroAnalizer::addNewHistrory(QString HisText)
{
    MainWindow::addNewHistoryText(HisText);
}

void MacroAnalizer::createNewDoc()
{
    MainWindow* application = MainWindow::getApplication();
    int Numbertest=MainWindow::getDocNum();
//    DocumentCommon* aDoc = new DocumentCommon( ++Numbertest, application );
    new DocumentCommon( ++Numbertest, application );
    MainWindow::addNewDocNum();
    addNewHistrory(trUtf8("Результат: Создан новый чертеж. Вид по умолчанию: Аксонометрия"));
}

void MacroAnalizer::quit()
{
     QCoreApplication::quit();
}

void MacroAnalizer::aboutGUI()
{
    MainWindow* application = MainWindow::getApplication();
    QMessageBox::about(application, trUtf8("Пробую..."),
                             trUtf8("<p>После<b> написания основного кода программы</b> я сделаю больше "
                                "иконок, русурсов и картинок сюда..."));
    addNewHistrory(trUtf8("Результат: Вывод информации о системе в графическом режиме."));
}

void MacroAnalizer::version()
{
    MainWindow::addNewHistoryText(trUtf8("Система проектирования ОБЪЕМНИК 3D"));
    MainWindow::addNewHistoryText(trUtf8("Все авторские права защищены. Разработчик: Синицын Ю.Ю."));
}

void MacroAnalizer::FitAll()
{
QWorkspace* Space = MainWindow::getWorkspace();
DocumentCommon* doc = ((MDIWindow*) Space->activeWindow())->getDocument();
doc->fitAllDOC();
addNewHistrory(trUtf8("Результат: Все объекты видны на всех видах"));
}

void MacroAnalizer::FitAllCur()
{
QWorkspace* Space = MainWindow::getWorkspace();
DocumentCommon* doc = ((MDIWindow*) Space->activeWindow())->getDocument();
doc->ViewFitAllCurDOC();
addNewHistrory(trUtf8("Результат: Все объекты видны на текущем виде"));
}

void MacroAnalizer::ViewSelected()
{
QWorkspace* Space = MainWindow::getWorkspace();
DocumentCommon* doc = ((MDIWindow*) Space->activeWindow())->getDocument();
doc->fitAreaDOC();
addNewHistrory(trUtf8("Результат: Выбран режим показа выделенного участка"));
}

void MacroAnalizer::loop()
{
QWorkspace* Space = MainWindow::getWorkspace();
DocumentCommon* doc = ((MDIWindow*) Space->activeWindow())->getDocument();
doc->zoomDOC();
addNewHistrory(trUtf8("Результат: Выбран режим Приблизить/Отдалить"));
}

void MacroAnalizer::localPan()
{
QWorkspace* Space = MainWindow::getWorkspace();
DocumentCommon* doc = ((MDIWindow*) Space->activeWindow())->getDocument();
doc->panDOC();
addNewHistrory(trUtf8("Результат: Динамическая панорама"));
}

void MacroAnalizer::globPan()
{
QWorkspace* Space = MainWindow::getWorkspace();
DocumentCommon* doc = ((MDIWindow*) Space->activeWindow())->getDocument();
doc->globalPanDOC();
addNewHistrory(trUtf8("Результат: Глобальная панорама"));
}

void MacroAnalizer::rotate()
{
QWorkspace* Space = MainWindow::getWorkspace();
DocumentCommon* doc = ((MDIWindow*) Space->activeWindow())->getDocument();
doc->rotationDOC();
addNewHistrory(trUtf8("Результат: Режим динамического вращения"));
}

void MacroAnalizer::resetcur()
{
QWorkspace* Space = MainWindow::getWorkspace();
DocumentCommon* doc = ((MDIWindow*) Space->activeWindow())->getDocument();
doc->ResetCurDOC();
addNewHistrory(trUtf8("Результат: Сброшены параметры отображения для текущего вида"));
}

void MacroAnalizer::resetall()
{
QWorkspace* Space = MainWindow::getWorkspace();
DocumentCommon* doc = ((MDIWindow*) Space->activeWindow())->getDocument();
doc->ResetDOC();
addNewHistrory(trUtf8("Результат: Сброшены параметры отображения на всех видах"));
}


Причина редактирования: плохо справку прочитал ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vanner
  опции профиля:
сообщение 16.11.2009, 11:23
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 27.8.2009
Пользователь №: 1025

Спасибо сказали: 1 раз(а)




Репутация:   0  


Ты бы продумал архитектуру сначала, а потом писал. При таком подходе, как у тебя сейчас, добавление каждой новой команды будет превращаться в тяжелый труд.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 14:08