crossplatform.ru

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


  Ответ в Макро Анализатор для OpenCascade
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
JuryS1806 Дата 16.11.2009, 22:34
 
Цитата(vanner @ 16.11.2009, 11:23) *
Ты бы продумал архитектуру сначала, а потом писал. При таком подходе, как у тебя сейчас, добавление каждой новой команды будет превращаться в тяжелый труд.


А у меня в MainWindow свыше 300 акшонов описано, при том что все эти акшоны были связаны со слотами и проделывали такой путь по классам:

MainWindow -> DocumentCommon -> MDI -> View.
соответственно, от базовой программы, затем вычисляется активный документ, затем активный вид документа, затем уже движок OpenCascade.

Дурдом конечно, но MainWindow.cpp у меня состоял из 6500 строк.
А сейчас 1500 в связи с использованием макроанализатора.

Вот такая архитектура, а если вы имеете ввиду архитектуру OpenCascade, то там 600 Мб текстовой документации. Очень широкие возможности для программирования, множество классов и описаний, даже свои Strings и Integer, математика, геометрия и сопромат в одном месте ! И если все это использовать в полной мере, то это будет даже круче Rinoceros и уж тем более AutoCAD. Даже есть движение тел и вычисления инерций, расчеты столкновений и определение цвета покрытий, начиная с анализа медицинских ренген-снимков, заканчивая определением уровня конвекции на поверхности стали при плавке ! Сила натяжения электрических проводов при проектировании силовых линий !

Хочу доделать базовую часть без отклонения от стандартных функций и дать ее на использование всем желающим, а потом в закрытой части лицензии делать закосы под нужные виды деятельности.
vanner Дата 16.11.2009, 11:23
  Ты бы продумал архитектуру сначала, а потом писал. При таком подходе, как у тебя сейчас, добавление каждой новой команды будет превращаться в тяжелый труд.
JuryS1806 Дата 16.11.2009, 2:59
  Вот что получилось с использованием массивов ! Выкладываю свой 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("Результат: Сброшены параметры отображения на всех видах"));
}


JuryS1806 Дата 16.11.2009, 0:53
 
Цитата(Litkevich Yuriy @ 15.11.2009, 7:16) *


Хорошо.
JuryS1806 Дата 16.11.2009, 0:01
  :mellow: и вправду! буду признателен если поможете. Я не силен в программировании, зато знаю чего хочу и как это будет выглядеть.
Я вообще считаю, что командная консоль должна быть в любом приложении. Например, в том же GIMP'e или Photoshop'e не всегда легко указать конкретную точку или область с мышки. Другое дело с консоли ввести команду с аргументами. Я не думаю, что программа должна работать только в текстовом режиме, НО и таковой должен быть.

Я уже перестроил всю программму под свой макроанализатор. Любые события, слоты и акшоны работают через него, потому я и не хотел всяких неоднозначных выражений. все до безобразия просто.

Заранее благодарен за помощь.
Kagami Дата 15.11.2009, 9:47
  Ужас :) Слабо было обработку аргументов завернуть в цикл, а сами аргументы - в массив?
Litkevich Yuriy Дата 15.11.2009, 7:16
  JuryS1806, смотри тему Справка по кнопкам и тэгам форума
JuryS1806 Дата 14.11.2009, 23:44
  ВСЕМ ДОБРОГО ВРЕМЕНИ СУТОК ! вот что получилось у меня с анализатором команд, может кому пригодится. два дня тестировал, работает как часы.
Может быть у кого будут мысли по оптимизации такого кода. Он конечно колхозный, но очень четко работает !


Раскрывающийся текст
#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 // различие запятых и полностью рабочий русский язык ввода команд

ВООБЩЕМ, мне лично нравится, буду рад критике
JuryS1806 Дата 11.11.2009, 21:44
  А я даже не думал что какие-то готовые классы для этого есть ! Я тут уже начал описывать в матрицу все символы русские, английские и цифры с пробелами !
Что ж, буду пробовать ! Если еще кто пожелает помочь в поисках буду признателен.

И еще однозначно это будет круто по сравнению с использованием каких-нибудь python консолей, будет быстродейственно, с возможностью записи макросов, их загрузки, и т.д.
molchanoviv Дата 11.11.2009, 19:37
  с помощью QRegExp раздели строку. Ну или с помощью QString::split и первый элемент QStringList сделай Name а последующие art... Первый вариант предпочтительнее т.к. он отсеет неправильные строки, а во втором варианте придется еще и проверять.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 11.7.2025, 3:55