САПР на Lazarus

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Re: САПР на Lazarus

Сообщение Sharfik » 13.10.2017 16:24:24

Обработчик сообщений делай "Я добавился", "Я удалился", "Я изменился". Хотя при первом открытии будет все равно тормозить. Нужно еще на горячую перед раскрытием узла подгружать его составляющие.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 759
Зарегистрирован: 20.07.2013 01:04:30

Re: САПР на Lazarus

Сообщение zub » 13.10.2017 17:15:54

"Я удалился", "Я изменился" - потребуют поиска себя в дереве. если из 5000 устройств разом изменится 500 - этот поиск съест весь выигрыш и превратит его в проигрыш.
Или придется хранить в примитивах их ноды в навигаторах. Что тоже непросто. примитив ниче о навигаторах не знает и знать недолжен
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение serbod » 13.10.2017 17:35:26

10К узлов это не так уж и много. Я использую TVirtualStringTree, где принудительно обновляется только список узлов, а видимые данные (названия, иконки, цвета) определяются только при отрисовке, через OnGetText, OnGetImageIndex, OnGetHint, OnBeforeCellPaint и т.д, где из поля Data узла получаем его объект. Для обновления визуального дерева достаточно сделать Invalidate()

Заполнение 15К узлов занимает мелкую долю секунды и выполняется по таймеру 2 раза в секунду, проц не грузит.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: САПР на Lazarus

Сообщение zub » 13.10.2017 17:44:55

>>Заполнение 15К узлов занимает мелкую долю секунды и выполняется по таймеру 2 раза в секунду, проц не грузит.
У меня заполнение проходит после добавления примитива в БД чертежа, или после изменения примитива. Чертишь мышкой, а она (мышка) при добавлении примитива на еле заметную долю секунды подвисает-дергается, неудобно.

Сама прорисовка дерева проходит незаметно. "Проблема" с подходом в лоб - перестройка дерева по любому чиху
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение serbod » 13.10.2017 18:06:45

Сделай очередь действий (команд) и обработчик по таймеру или в отдельном потоке. Тогда ты можешь "откладывать" действия и обрабатывать их не сразу, а во время простоя (по таймеру) или в фоновом процессе. Как приятный бонус - появляется возможность вести журнал действий, делать отмену. У меня действия текстовые, как в командной строке - быстродействия хватает с избытком и никаких проблем с передачей и хранением.

Или используй стандартные команды-сообщения PostMessage(), по крайней мере они не будут тормозить GUI.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: САПР на Lazarus

Сообщение Sharfik » 13.10.2017 20:39:20

zub писал(а):"Я удалился", "Я изменился" - потребуют поиска себя в дереве. если из 5000 устройств разом изменится 500 - этот поиск съест весь выигрыш и превратит его в проигрыш.
Или придется хранить в примитивах их ноды в навигаторах. Что тоже непросто. примитив ниче о навигаторах не знает и знать недолжен

Неправильно ты шеф мыслишь.
Устройство изменяется не само, а по команде пользователя. При выполнении команды в конце действий дописываешь обращение к функции SendNotify(Кто,ЧтоСделал)
Навигатор когда создается, то добавляет себя в список получателей оповещений. Дальше SendNotify при боработке рассылает всем зарегестрированным получателям информацию. А вот что с ней делать уже каждый решает сам. Либо перерисовывать полностью себя, либо найти виновника и "наказать" персонально.

У меня в проекте менеджера данных каждая таблица имеет такой список "Получателей" и когда очередной TVirtualStringTree появляется в проекте он обновляется через такие уведомления. Единственно что данные как и сказал serbod - отрисовываются по факту состояния в памяти.

У Нанокад Электро беда была такая, в одном месте название поменяешь группы, а в другом окне оно как раньше отображается.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 759
Зарегистрирован: 20.07.2013 01:04:30

Re: САПР на Lazarus

Сообщение zub » 13.10.2017 22:47:32

>>Неправильно ты шеф мыслишь.
Я мыслю абсолютно также как ты расписал.
До момента:
>>Либо перерисовывать полностью себя, либо найти виновника и "наказать" персонально.
только не перерисовывать, а пересоздавать
Вот в наше TЧетоТамTree пришло извещение что вот этот TObject изменился. И нам нам надо изменить\переместить\персоздать асоциированную с этим TObject ноду.
Но перед этим эту ноду надо найти.
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение serbod » 14.10.2017 00:18:32

Делай обновление по таймеру, а не сразу после действия. Тогда у тебя десятки и сотни действий разом обновятся, а не будут каждое поочереди тупить.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: САПР на Lazarus

Сообщение zub » 14.10.2017 00:27:46

Да, оновление будет в онидле и только для видимого.
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение Sharfik » 14.10.2017 01:02:48

zub писал(а):Я мыслю абсолютно также как ты расписал.
До момента:
>>Либо перерисовывать полностью себя, либо найти виновника и "наказать" персонально.
только не перерисовывать, а пересоздавать
Вот в наше TЧетоТамTree пришло извещение что вот этот TObject изменился. И нам нам надо изменить\переместить\персоздать асоциированную с этим TObject ноду.
Но перед этим эту ноду надо найти.


Как я понял, у тебя узлами есть. Значит верхний узел по какому то принципу подбирается. А значит обходить всех не надо, надо сначала обойти только верхние узлы и потом копаться в одном конкретном.
А по какому признаку происходит поиск?
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 759
Зарегистрирован: 20.07.2013 01:04:30

Re: САПР на Lazarus

Сообщение zub » 14.10.2017 01:43:57

На данный момент у меня 2 настройки группировки - по префиксу и базовому имени. Если их выключить узлов не будет, или если пользователь не использует префиксы а тупо сразу вбивает требуемое имя - узлов тоже небудет. Такчто на узлы лучше не надеется.
В нодах у меня хранится адрес и имя соответствующего устройства (на имя надежды нет, т.к. одноименные устройства не запрещены), поэтому оптимально наверно будет дополнительно хранить мапу соответствий адрес устройства -> нода c быстрым двоичным поиском. Но это снова серъезные расходы на пересоздание

ИМХО адрес ноды лучше всего хранить в примитиве

Добавлено спустя 11 минут 42 секунды:
https://imgur.com/a/KCyx7

Добавлено спустя 24 секунды:
Гебольшое пояснение по группировкам. на "чертеже" 16 "шкафов" с префиксамии от 1 до 4, базовыми именами ША, ШУ и суфиксами от 1 до 4. обозначение шкафов формируется как префикс+базовое имя+суфикс. Доступны группировки по префиксу и базовому имени, но они могут быть выключены и "дерево" становится линейным "списком"
Последний раз редактировалось zub 14.10.2017 02:07:20, всего редактировалось 4 раз(а).
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение vitaly_l » 14.10.2017 01:56:41

zub писал(а):"Проблема" с подходом в лоб - перестройка дерева по любому чиху

Нет ну вот же (выше) правильная Ваша мысль, её нужно доработать и всё получится. А вообще, наиболее простой метод (от художников), нарисуйте схему, чтобы все поняли суть задачи, т.к. кто-то помнится забыл отключить вангинатор и он перегрелся.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: САПР на Lazarus

Сообщение ElectroGuard » 14.10.2017 11:44:03

Да, нужно что-то типа схемы, что бы суть проблемы была понятна, может что-то придумается. Из того, что я вижу, нужно каким-то образом существенно уменьшить количество обрабатываемых данных. Не видя общей картины проблемы, сложно говорить о решении.
ElectroGuard
новенький
 
Сообщения: 71
Зарегистрирован: 03.06.2016 12:10:22

Re: САПР на Lazarus

Сообщение zub » 14.10.2017 15:43:54

Отложеная перестройка дерева проблему решает. Поэтому пока оставлю "навигаторов" как есть.

По замечаниям появилась возможность относительного ввода координат в командную строку, декартовых и полярных:
@x,y
@x,y,z
@длина<угол
Сам никогда не пользовал, но некоторым оказывается надо
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение olegy123 » 16.10.2017 08:04:35

zub писал(а):"Я удалился", "Я изменился" - потребуют поиска себя в дереве. если из 5000 устройств разом изменится 500 - этот поиск съест весь выигрыш и превратит его в проигрыш.
Или придется хранить в примитивах их ноды в навигаторах. Что тоже непросто. примитив ниче о навигаторах не знает и знать недолжен
Zub еще не разу не прфилировал свою программу?
что за безобразие?! это возмутительно?! как это низко..

Zub - компутер так устроен, что у него в каждую секунду что-то меняется, что-то на что-то складывается, делится или умножается.. ищется и сравнивается тоже.И ему нужно работать с большими таблицами. Как проигрывается HD/2K/4K видео..там по 24/30/60/120 раз нужно рефрешить цвета в большой матрице. Да еще гонять по шине - более 26мб болше 30 раз в секунду.

15К устройств - это не так много..

профилирование тебе откроет где процик упахивается, может за зря.

Добавлено спустя 35 минут 46 секунд:
zub писал(а):Да, оновление будет в онидле и только для видимого.

Плохой вариант.
Вытащи рефреш в отдельный поток. тем самым скорость отрисовки вообще не будет зависеть от скорости в главном потоке.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Пред.След.

Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32

Рейтинг@Mail.ru