Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/35: Рейтинг темы: голосов - 35, средняя оценка - 4.80
5 / 5 / 3
Регистрация: 19.01.2013
Сообщений: 56
1

Программа для построения блок схем

01.04.2013, 01:03. Показов 6786. Ответов 22
Метки нет (Все метки)

Хочу чисто проконсультироваться у специалистов, насколько сложно будет создать такую программу, ибо сам новичок в программировании, ибо сделал\зарелизил всего 1 программу (на c++ builder6).

Есть вот такой "скрипт", точнее исходник с 3д эдитора уровней Valve Hammer Editor (Half-life 2).
Пример: Здесь представлены два logic relay. Задача новой программы взять этот скрипт, и начертить блок схему логики (пример схемы прикреплен).
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
entity \\объявление энтити (так мы их и называем, от англ entity).
{
    "id" "2"
    "classname" "logic_relay"    \\тип энтити 
    "spawnflags" "2"
    "StartDisabled" "0"
    "targetname" "example_logic_relay_01"    \\имя энтити
    connections
    {
        "OnTrigger" "example_logic_relay_02 Trigger 0-1"    \\связи этой энтити с другими.
    }
    "origin" "-32 128 0"  //координаты расположения энтити в пространстве (x y z). Нам нужно только x и y
    editor
    {
        "color" "220 30 220"
        "visgroupshown" "1"
        "visgroupautoshown" "1"
        "logicalpos" "[0 0]"
    }
}
entity
{
    "id" "11"
    "classname" "logic_relay"
    "spawnflags" "2"
    "StartDisabled" "0"
    "targetname" "example_logic_relay_02"
    connections
    {
        "OnTrigger" "example_logic_relay_01 Disable 0-1"
    }
    "origin" "0 128 0"
    editor
    {
        "color" "220 30 220"
        "visgroupshown" "1"
        "visgroupautoshown" "1"
        "logicalpos" "[0 0]"
    }
}

Захотел написать программу, ибо вручную чертить алгоритмы на 2000 элементов.. это сколько ватманов нужно (если на печать), а сколько времени.. пфф.
2000 элементов это примерно 700 строк кода (для сравнения. Это пальцем в небо).

Задача программы:
  • Расставить 2 блока (2 реле) (координаты x и y со скрипта, параметр "origin")
  • написать имя в них (параметр "targetname")
  • написать класс возле них(параметр "classname")
  • провести стрелки связей (все что в блоке connections)
  • написать имена связей

Допустим я смогу создать обработчик этого скрипта, но я не знаю как создать это ограниченное пространство (размером 32768х32768) с увеличением\приближением и как в нем спавнить (создавать) эти блоки. Ну и связывать их линиями.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Миниатюры
Программа для построения блок схем   Программа для построения блок схем  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2013, 01:03
Ответы с готовыми решениями:

Программа для построения схем
Подскажите, есть ли на C++ Builder возможность сделать программу с областью, на которую можно...

Графический редактор, специализированный для построения схем электрических принципиальных
мне очень нужна помощь. мне нужно: разработать программу графический редактор специализирован на...

Программа для рисования схем
Нужна программа для рисования в ней кружков, дуг, и линий. Это для разработки схем. В этой...

Программа для построения блок схем
может у кого нибудь есть прога в которую загружаешь код программы и она выводит уже блок схему...

22
Эксперт С++
8372 / 6108 / 613
Регистрация: 10.12.2010
Сообщений: 28,516
Записей в блоге: 30
01.04.2013, 02:36 2
Прикрутить OpenGL к Builder и вперед ... маслать в OpenGL.
Ну опять же что там за скрип? что за язык ? Как я понимаю парсить придется вручную ?

Добавлено через 4 минуты
Цитата Сообщение от Stridemann Посмотреть сообщение
Захотел написать программу, ибо вручную чертить алгоритмы на 2000 элементов.. это сколько ватманов нужно (если на печать), а сколько времени.. пфф.
2000 элементов это примерно 700 строк кода (для сравнения. Это пальцем в небо).
Как по мне изучение выяснение того что нужно и что можно,нужного материала, написание самой программы + отладка может занять куда больше времени.

А нельзя эту задачу решить с помощью профессиональных программ типа AutoCad ?

И что-то мне подсказывает что такую задачу легче решить в Qt, а не в Builder
1
5 / 5 / 3
Регистрация: 19.01.2013
Сообщений: 56
01.04.2013, 03:47  [ТС] 3
Цитата Сообщение от Avazart Посмотреть сообщение
Ну опять же что там за скрип? что за язык ? Как я понимаю парсить придется вручную ?
Да для эдитора же. Там свой, какой Valve придумали..

Цитата Сообщение от Avazart Посмотреть сообщение
Как по мне изучение выяснение того что нужно и что можно,нужного материала, написание самой программы + отладка может занять куда больше времени.
Согласен.

Почему блок схемы, потому что всё наглядно видно и сразу можно просчитать весь алгоритм работы. Это не с++, как всё на ладони, а приходится открывать каждый элемент и смотреть свойства.. (скрин)
Я черчу в программе Dia. (скрин) Была мечта начертить всю логику этой системы и со стороны посмотреть.. Эх.


Цитата Сообщение от Avazart Посмотреть сообщение
А нельзя эту задачу решить с помощью профессиональных программ типа AutoCad ?
Нет. Если бы экспортировать геометрию уровня, то можно было бы. А логические элементы не експортируются.

Ладно, спасибо за совет.



Хотя стойте.. ЗАЧЕМ мне делать свою программу для рендеринга этой диаграмы если можно сделать программу для конвертации данных? Скрипт кидаем в программу, программа конвертирует в формат для другой программы для черчения (Autocad, Dia, Visio и т. д.). В программе Dia есть импорт многих файлов..

Можно взять и конвертировать в xml. Там сразу хоть в Microsoft Visio открыть, хоть в Dia. Код вроде бы понятный.. (скрин).
Может осилю. Посмотрим..
0
Миниатюры
Программа для построения блок схем   Программа для построения блок схем   Программа для построения блок схем  

Программа для построения блок схем  
Эксперт С++
8372 / 6108 / 613
Регистрация: 10.12.2010
Сообщений: 28,516
Записей в блоге: 30
01.04.2013, 04:05 4
Цитата Сообщение от Stridemann Посмотреть сообщение
Да для эдитора же. Там свой, какой Valve придумали..
Ну если проблема только в разборе скрипта, то стоит поискать описание этого Valve, может есть какая то дока, а если повезет может парсер.

Добавлено через 1 минуту
Это из той оперы :
https://developer.valvesoftwar... gic_script
https://developer.valvesoftwar... pon_script ?
0
5 / 5 / 3
Регистрация: 19.01.2013
Сообщений: 56
01.04.2013, 04:15  [ТС] 5
Цитата Сообщение от Avazart Посмотреть сообщение
Ну если проблема только в разборе скрипта, то стоит поискать описание этого Valve, может есть какая то дока, а если повезет может парсер.
Valve это компания которая контру и халф лайф сделали)

Доку нашел. Прекрасный док на англ https://developer.valvesoftwar... umentation
На досуге почитаю.. Парсер сам сделаю (попытаюсь).

Нужно как-то сделать цикл, который будет по очереди брать каждую часть кода (типа структуру entity) и разбирать его.

Я пока даже не знаю как сделать если есть в коде строка "classname" "logic_relay", то как мне забив в функцию слово classname получить (скажем в TEdit1) его значение logic_relay
Подскажите пожалуйста..

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Это из той оперы :
>>Logic_script
Нет, это скрипты nut которые запускаются энтитями для выполнения какой-то задачи
>>Weapon_script
Это вообще c++ программирование оружия в исходном коде.
0
Эксперт С++
8372 / 6108 / 613
Регистрация: 10.12.2010
Сообщений: 28,516
Записей в блоге: 30
01.04.2013, 04:20 6
Цитата Сообщение от Stridemann Посмотреть сообщение
Доку нашел. Прекрасный док на англ https://developer.valvesoftwar... umentation
Ну тогда теперь стоит определится что использовать для написания парсера.
1
5 / 5 / 3
Регистрация: 19.01.2013
Сообщений: 56
14.04.2013, 04:30  [ТС] 7
Я конечно не силен в программировании, тем не менее парсер сделать получилось..

Короче на данный момент парсер открывает любой скрипт, ищет нужные строки с именем энтити, присваивает рисунок, задает положение и т. д. и пишет в формат svg. Да, именно он, формат векторной графики. С ним легче всего работать.
В принципе нормально всё конвертирует, и расставляет правильно. НО. По завершении работы она выдает ошибку List out of bounds (55934). Кто может сказать почему?
Вот код:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
String w=Edit1->Text;
String h=Edit4->Text;
 
  for (int i = 0; i < Memo1->Lines->Count; i++)
  {
    if (src->Strings[i].Pos(cn) > 0)
    {
        String clname(src->Strings[i].SubString(src->Strings[i].Pos(cn)+13,src->Strings[i].Length()));
        clname= clname.SubString(0,clname.Length()-1);
 
        if(clname==relay){
        img = "file:///C:/editor_tex/logic_relay.png";
        }
        else if(clname==branch){
        img = "file:///C:/editor_tex/logic_branch.png";
        }
        else if(clname==lcase){
        img = "file:///C:/editor_tex/logic_case.png";
        }
        else if(clname==compare){
        img = "file:///C:/editor_tex/logic_compare.png";
        }
        else if(clname==counter){
        img = "file:///C:/editor_tex/math_counter.png";
        }
        else
        img = "file:///C:/editor_tex/obsolete.png";
    }
        if (src->Strings[i].Pos(coord) > 0)
    {
    String cordxyz(src->Strings[i].SubString(src->Strings[i].Pos(coord)+10,src->Strings[i].Length()));
    cordxyz= cordxyz.SubString(0,cordxyz.Length()-1);
 
        TSysCharSet bchars;
        bchars << ' ';
        AnsiString S = cordxyz;
        list->Text= WrapText(S,"\n",bchars,0);
        String x = list->Strings[0];
        x = StringReplace(x,"-","",TReplaceFlags()<<rfReplaceAll);
        String y = list->Strings[1];
        y = StringReplace(y,"-","",TReplaceFlags()<<rfReplaceAll);
 
    Memo2->Lines->Add("    <image x=\"" +x +"\" y=\"" +y +"\" width=\"" +w +"\" height= \"" +h +"\" xlink:href=\"" +img +"\"/>");
   }
  }
  delete src;
  delete list;
//  Memo2->Lines->Add("</svg>");
}
0
Миниатюры
Программа для построения блок схем   Программа для построения блок схем   Программа для построения блок схем  

Эксперт С++
8372 / 6108 / 613
Регистрация: 10.12.2010
Сообщений: 28,516
Записей в блоге: 30
14.04.2013, 04:38 8
Цитата Сообщение от Stridemann Посмотреть сообщение
По завершении работы она выдает ошибку List out of bounds (55934). Кто может сказать почему?
Да это выход за границы строки и списка строк...
Проверяй индексы строк в коде...

Добавлено через 3 минуты
C++
1
2
3
4
 String cordxyz(
     src->Strings[i].SubString(src->Strings[i].Pos(coord)+10,
                                           src->Strings[i].Length() )
    );
Тут опасно - ибо если Pos() не найдет подстроку возвратит значение = -1
0
5 / 5 / 3
Регистрация: 19.01.2013
Сообщений: 56
14.04.2013, 05:01  [ТС] 9
Цитата Сообщение от Avazart Посмотреть сообщение
String cordxyz(src->Strings[i].SubString(src->Strings[i].Pos(coord)+10,src->Strings[i].Length() ));

Тут опасно - ибо если Pos() не найдет подстроку возвратит значение = -1
Ну правильно.. Для этого я и сделал проверку строкой выше..
C
1
 if (src->Strings[i].Pos(coord) > 0)
Оно очень редко ее находит.. это же цикл. А если находит- то выполняет код в ифе.

Я таки думаю что это с TStringList проблема. Уже были с ним терки..

И да, я не могу отредактировать пост выше ибо не скопировал объявления..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
String cn = "\"classname\" \"";
String relay = "logic_relay";
String branch = "logic_branch";
String lcase = "logic_case";
String compare = "logic_compare";
String counter = "math_counter";
String img;
String entname;
String coord = "\"origin\" \"";
String space = " ";
String Txt = Memo1->Text;
TStringList *src = new TStringList();
TStringList *list = new TStringList();
src->Text= Txt;
 
int y=1;
String w=Edit1->Text;
String h=Edit4->Text;
0
5 / 5 / 3
Регистрация: 19.01.2013
Сообщений: 56
14.04.2013, 05:35  [ТС] 10
Цитата Сообщение от Avazart Посмотреть сообщение
String cordxyz(src->Strings[i].SubString(src->Strings[i].Pos(coord)+10,src->Strings[i].Length() ));

Тут опасно - ибо если Pos() не найдет подстроку возвратит значение = -1
Ну правильно.. Для этого я и сделал проверку строкой выше..
C
1
 if (src->Strings[i].Pos(coord) > 0)
Оно очень редко ее находит.. это же цикл. А если находит- то выполняет код в ифе.

Я таки думаю что это с TStringList проблема. Уже были с ним терки..

И да, я не могу отредактировать пост выше ибо не скопировал объявления..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
String cn = "\"classname\" \"";
String relay = "logic_relay";
String branch = "logic_branch";
String lcase = "logic_case";
String compare = "logic_compare";
String counter = "math_counter";
String img;
String entname;
String coord = "\"origin\" \"";
String space = " ";
String Txt = Memo1->Text;
TStringList *src = new TStringList();
TStringList *list = new TStringList();
src->Text= Txt;
 
int y=1;
String w=Edit1->Text;
String h=Edit4->Text;

Добавлено через 6 минут
Похоже нашел ошибку..

ПРОСТО БРЕД. Код захлебывался (и выдавал ошибку) потому что нужно было сделать ШИРЕ Memo1 ! Бред.. (оно грузит в него с Memo1)
Методом исключения нашел.. Оно не любит когда в одну строку не влазит..
0
LK
Заблокирован
14.04.2013, 12:49 11
и никакой это не бред, в мемо появилась новая строка, все правильно
0
Эксперт С++
8372 / 6108 / 613
Регистрация: 10.12.2010
Сообщений: 28,516
Записей в блоге: 30
14.04.2013, 16:42 12
Цитата Сообщение от Stridemann Посмотреть сообщение
потому что нужно было сделать ШИРЕ Memo1 ! Бред..
Конечно бред ибо не в этом дело..
0
5 / 5 / 3
Регистрация: 19.01.2013
Сообщений: 56
14.04.2013, 19:02  [ТС] 13
Цитата Сообщение от Avazart Посмотреть сообщение
Конечно бред ибо не в этом дело..
Да ладно.. А вот пару скринов. Грузится огромный файл (с него берется и обрабатывается примерно 2600 комманд) и обрабатывается бе проблем (скрин1). Во втором просто берем строку и сдвигаем чтобы она перепрыгнула на след строку (получается длина строки больше ширины строки в мемо)- при обработке ошибка, до конца не обрабатывает, хотя эти измененные строки оно должно без проблем пройти.
Хотя нет, до конца оно обрабатывает всё. Просто в конце не добавляет окончание файла </svg>

Видимо нужно сделать проверку длины строки. Если она больше чем длина строки в memo1 то просто не обрабатывать эти строки. (Это я так понял). Ничего мы не теряем с этих исключенных строк.
0
Миниатюры
Программа для построения блок схем   Программа для построения блок схем  
LK
Заблокирован
14.04.2013, 19:18 14
для обработки используйте стринглист, мемо - для отображения, нечего наступать на все те же грабли и/или изобретать лесипед
1
Эксперт С++
8372 / 6108 / 613
Регистрация: 10.12.2010
Сообщений: 28,516
Записей в блоге: 30
14.04.2013, 19:23 15
Цитата Сообщение от Stridemann Посмотреть сообщение
о втором просто берем строку и сдвигаем чтобы она перепрыгнула на след строку (получается длина строки больше ширины строки в мемо)- при обработке ошибка
Значит это действие реализовано неправильно ...

Код запутан, так что вникать в него нет желания ...
0
5 / 5 / 3
Регистрация: 19.01.2013
Сообщений: 56
14.04.2013, 19:56  [ТС] 16
Цитата Сообщение от LK Посмотреть сообщение
для обработки используйте стринглист, мемо - для отображения, нечего наступать на все те же грабли и/или изобретать лесипед
Да я так и думал.. Только потом мысля проскочила что в эдит нужно будет редактировать..

Ладно, всё понятно, спасибо.
0
Эксперт С++
8372 / 6108 / 613
Регистрация: 10.12.2010
Сообщений: 28,516
Записей в блоге: 30
14.04.2013, 20:10 17
TStringList не особо изменит дело ...
0
5 / 5 / 3
Регистрация: 19.01.2013
Сообщений: 56
14.04.2013, 20:19  [ТС] 18
Цитата Сообщение от Avazart Посмотреть сообщение
TStringList не особо изменит дело ...
Ну а как тут делать правильно? Хоть намекните)
Пробовал сразу грузить с файла в стригнглист..

Мало того что ошибка старая и вообще не обрабатывает, но и бывает вплоть до access violation at address..
0
Эксперт С++
8372 / 6108 / 613
Регистрация: 10.12.2010
Сообщений: 28,516
Записей в блоге: 30
14.04.2013, 20:21 19
Не использовать VCL там размеры ограничены ...
0
5 / 5 / 3
Регистрация: 19.01.2013
Сообщений: 56
15.04.2013, 13:50  [ТС] 20
А можете подсказать как в String'е убирать символы? Например в нем есть к примеру такие данные: cube%"_pick_test_branch_1№$\* Нужно убрать всё кроме cube_pick_test_branch_1, то есть разрешить только цифры, буквы (и несколько простых символов типа: _ - @ &). (если сложно, то разрешить только цифры и латинск алф).

Это сложно сделать? (я могу сделать, но это делать проверку в цикле каждого символа, может как-то быстрее можно?)

Просто не открывается мой .svg файл из за ошибок со спец символами.
А то бывают символы что даже в блокноте не видны (в notepad++ видны, прикрепил скрин).
0
Миниатюры
Программа для построения блок схем  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2013, 13:50

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Есть ли программы для построения блок-схем по коду с++?
есть ли программы для построения блок-схем по коду с++?

Программа для составления блок схем
Кто нибудь дайте программу для составления несложных блок схем для с++

Программа для автоматического рисования блок-схем по коду
Может кто то может подсказать программу для автоматической рисование блок схем.Что в нее загружаешь...

Нужна программа рисования блок-схем
Может у кого есть программа которая рисует блок-схему по коду С++? Очень нада

Составление блок схем для кода
Приветствую всех. Может кто составить 2 блок схемы вот по этим кодам (я что-то не очень силен в их...

Софт для составления блок-схем
Посоветуйте программу для составления блок-схем


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.