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
#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 |
|
и вправду! буду признателен если поможете. Я не силен в программировании, зато знаю чего хочу и как это будет выглядеть. Я вообще считаю, что командная консоль должна быть в любом приложении. Например, в том же 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... Первый вариант предпочтительнее т.к. он отсеет неправильные строки, а во втором варианте придется еще и проверять. |
Просмотр темы полностью (откроется в новом окне) |
|