crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 19.4.2024, 14:46