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
  опции профиля:
сообщение 14.11.2009, 23:44
Сообщение #2


Студент
*

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

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




Репутация:   0  


ВСЕМ ДОБРОГО ВРЕМЕНИ СУТОК ! вот что получилось у меня с анализатором команд, может кому пригодится. два дня тестировал, работает как часы.
Может быть у кого будут мысли по оптимизации такого кода. Он конечно колхозный, но очень четко работает !


Раскрывающийся текст
#include "AnalizeMacro.h"
#include "mainwindow.h"
#include <DocumentCommon.h>

MacroAnalizer::MacroAnalizer(QString Text)
{
        QString Tested1; //текст после отсечения пояснений
        QString Tested2; //тестируемые параметры команды
        QString Fixed; //фиксированная часть команды
        QString arg1;
        QString arg2;
        QString arg3;
        QString arg4;
        QString arg5;
        QString arg6;
        QString arg7;
        QString arg8;
        QString arg9;
        QString arg10;

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

//ПЕРВЫЙ ПРОХОД. ПЫТАЮСЬ НАЙТИ ПОЯСНЕНИЯ. ИГНОРИРУЮ ПРАВУЮ ЧАСТЬ.

        QStringList TestForIgn = Text.split("//");

if (TestForIgn.isEmpty())  // Если не обнаружился знак начала пояснения
{
    Tested1 = Text;     //тогда продолжаю тестировать
}
if (!TestForIgn.isEmpty())  // Если обнаружился знак начала пояснения
{
    Tested1 = TestForIgn.first();     //тогда тестирую левую часть выражения
}
Tested1=Tested1.simplified();
//ВТОРОЙ ПРОХОД. РАЗДЕЛЯЮ ОСНОВНУЮ КОМАНДУ ОТ ПАРАМЕТРОВ КОМАНДЫ.

        QStringList TestForSpace = Tested1.split(QRegExp("\\s+"));

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

Fixed=Fixed.simplified();


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

//ОТРАБАТЫВАЮ ПАРАМЕТРЫ КОМАНДЫ
if (!Tested2.isNull()) // ЕСЛИ У КОМАНДЫ ЕСТЬ ПАРАМЕТРЫ
{

{ Tested2=Tested2.simplified(); }
        QStringList TestArgForSpace = Tested2.split(QRegExp("\\s+"));

if (!TestArgForSpace.isEmpty())  // Если обнаружился пробел, тогда разделяю параметры на части
{
    for (int i = 0; i < TestArgForSpace.size(); ++i)
{
        if (i==0) { arg1=TestArgForSpace.at(0); }
        if (i==1) { arg2=TestArgForSpace.at(1); }
        if (i==2) { arg3=TestArgForSpace.at(2); }
        if (i==3) { arg4=TestArgForSpace.at(3); }
        if (i==4) { arg5=TestArgForSpace.at(4); }
        if (i==5) { arg6=TestArgForSpace.at(5); }
        if (i==6) { arg7=TestArgForSpace.at(6); }
        if (i==7) { arg8=TestArgForSpace.at(7); }
        if (i==8) { arg9=TestArgForSpace.at(8); }
        if (i==9) { arg10=TestArgForSpace.at(9); }
        if (i>9) { addNewHistrory(trUtf8("Количество параметров команды превышает 10."
                                          "Обратитесь к разработчику системы для увеличения числа параметров.")); }
}

}

if (arg2.isNull()) // Аргумент 2 пустой, возможно запись из одного аргумента, разделенного запятыми
{
        QStringList TestArgForZP = Tested2.split(","); //разбиваю строку по запятым
            if (TestArgForZP.isEmpty()) //если ничего не разбилось
        {
                arg1=Tested2;
        }
            if (!TestArgForZP.isEmpty()) //нашел запятые и разбил на множество аргументов
        {
     for (int i = 0; i < TestArgForZP.size(); ++i)
            {
                if (i==0) { arg1=TestArgForZP.at(0); }
                if (i==1) { arg2=TestArgForZP.at(1); }
                if (i==2) { arg3=TestArgForZP.at(2); }
                if (i==3) { arg4=TestArgForZP.at(3); }
                if (i==4) { arg5=TestArgForZP.at(4); }
                if (i==5) { arg6=TestArgForZP.at(5); }
                if (i==6) { arg7=TestArgForZP.at(6); }
                if (i==7) { arg8=TestArgForZP.at(7); }
                if (i==8) { arg9=TestArgForZP.at(8); }
                if (i==9) { arg10=TestArgForZP.at(9); }
                if (i>9) { addNewHistrory(trUtf8("Количество параметров команды превышает 10."
                                                  "Обратитесь к разработчику системы для увеличения числа параметров.")); }
            }
        }
    }
}

//ПРОВЕРКА !СНЕСТИ ПОТОМ
       addNewHistrory(trUtf8("Арг1: ")+arg1+trUtf8(" Арг2: ")+arg2+trUtf8(" Арг3: ")+arg3+trUtf8(" Арг4: ")+
       arg4+trUtf8(" Арг5: ")+arg5+trUtf8(" Арг6: ")+arg6+trUtf8(" Арг7: ")+arg7+trUtf8(" Арг8: ")+
       arg8+trUtf8(" Арг9: ")+arg9+trUtf8(" Арг10: ")+arg10);
//ПРОВЕРКА !СНЕСТИ ПОТОМ

//        if (Text==tr("new")) { MacroAnalizer::createNewDoc(); }
//        if (Text==trUtf8("новый")) { MacroAnalizer::createNewDoc(); }


}


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

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


Теперь можно вводить команды:
линия 1231 112 121 // то что будет в пояснении игнорируется
line 123,123,123 // пробелы лишние стираются
LiNe 120 123 124 // исправляется регистр букв
ЛиниЯ 1231 1231 1231 // различие запятых и полностью рабочий русский язык ввода команд

ВООБЩЕМ, мне лично нравится, буду рад критике

Сообщение отредактировал Litkevich Yuriy - 15.11.2009, 7:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




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