САПР на Lazarus

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

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

Re: САПР на Lazarus

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

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

Re: САПР на Lazarus

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

"Я удалился", "Я изменился" - потребуют поиска себя в дереве. если из 5000 устройств разом изменится 500 - этот поиск съест весь выигрыш и превратит его в проигрыш.
Или придется хранить в примитивах их ноды в навигаторах. Что тоже непросто. примитив ниче о навигаторах не знает и знать недолжен
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 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
постоялец
 
Сообщения: 215
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: САПР на Lazarus

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

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

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

Re: САПР на Lazarus

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

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

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

Re: САПР на Lazarus

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

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

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

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

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

Re: САПР на Lazarus

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

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

Re: САПР на Lazarus

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

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

Re: САПР на Lazarus

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

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

Re: САПР на Lazarus

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

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


Как я понял, у тебя узлами есть. Значит верхний узел по какому то принципу подбирается. А значит обходить всех не надо, надо сначала обойти только верхние узлы и потом копаться в одном конкретном.
А по какому признаку происходит поиск?
Sharfik
постоялец
 
Сообщения: 477
Зарегистрирован: 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
долгожитель
 
Сообщения: 2275
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

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

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

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

Re: САПР на Lazarus

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

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

Re: САПР на Lazarus

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

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

По замечаниям появилась возможность относительного ввода координат в командную строку, декартовых и полярных:
@x,y
@x,y,z
@длина<угол
Сам никогда не пользовал, но некоторым оказывается надо
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 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
энтузиаст
 
Сообщения: 763
Зарегистрирован: 25.02.2016 12:10:20

Пред.След.

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

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

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

Рейтинг@Mail.ru