Стартовая страница › Форумы › Разработка и интеграция › Работа с SVG на мнемосхемах
- В этой теме 51 ответ, 3 участника, последнее обновление 6 лет, 5 месяцев назад сделано
manjey73.
-
АвторЗаписи
-
24.03.2020 в 17:49 #15447
manjey73УчастникСтандартные классы на потом (одна из задач).
Для изменения цвета вполне сгодится наверное и svg.dll, раз она уже есть.Не пойму как сделать в рамках кода ScadaSchemeCommon чтобы сперва происходила загрузка в память, а при вызове окна выбора файла картинки происходила обработка согласно параметрам с отображением в превью и потом сохранение.
Чтобы все через MemoryStream шло. Хотя бы для начала…примерно так
1. жмем «Внешний вид» — «Изображение» и вызываем окно «Изображения»
2. в этот момент считывается в память картинка с одновременным чтение настроек из файла
3. меняем цвета на нужные
4. выбираем картинку и она вставляется на мнемосхему с отличными от оригинала цветами, прописанными в файле SVGПримерное место я нашел, но не пойму как прочесть в память, в нее же сохранить и опять вычитать из памяти ????
24.03.2020 в 17:51 #15448
manjey73Участникчто стандартные, что svg.dll, без разницы, надо как-то с MemoryStream работать.
Предполагается что файл SVG будет единственным. Открыли — отобразилось в превью, что в файле. Изменяем — в преью отображаются изменения, Выбрали — вставилось на Мнемосхему.
Так как на мнемосхему вставляется не код, то изменяться картинка на мнемосхеме не будет до тех пор, пока мы не зайдем в Редактор и снова не выберем картинку, я правильно понял логику ?
А уже потом, если подобный механизм заработает, можно добавить и свойства для картинок, к которым можно будет прикручивать входные каналы и менять их свойства. Но тогда картинка уже должна быть вставлена как код html или как-то еще…
Сейчас если правильно понимаю, можно это делать меняя картинки и только…25.03.2020 в 13:31 #15452
manjey73Участникprivate void LoadImage() { if (Image == null || Image.Data == null) { source = null; } else if (IsSvg) { MemoryStream initStream = new MemoryStream(Image.Data); SvgDocument isvgDocument = SvgDocument.Open<SvgDocument>(initStream); // Тут нахожу нужный элемент и меняю ему цвет заливки на красный isvgDocument.Children[1].Children[0].Children[0].Fill = new SvgColourServer(Color.Red); // ------------------------------- using (MemoryStream memStream = new MemoryStream()) // (Image.Data) { isvgDocument.Write(memStream); // записал в поток памяти memStream.Position = 0; memStream.Seek(0, SeekOrigin.Begin); SvgDocument svgDocument = SvgDocument.Open<SvgDocument>(memStream); svgDocument.Write("d:/temp/Test_vn1.svg"); // записал в файл source = svgDocument.Draw(); DataSize = (int)memStream.Length; } initStream.Close(); // Закрыл свой поток ImageSize = new Size(source.Width, source.Height); Format = "Svg"; }Почему в записанном файле цвет заливки поменялся, а в отображении НЕТ ???? что не так с потоками, я ведь и в файл и в поток записываю одинаково ????
25.03.2020 в 13:41 #15453
manjey73УчастникИ да, перед отрисовкой source = svgDocument.Draw(); скопировал в строку
svgDocument.GetXML(); и вижу что в XML код цвета заливки заменен25.03.2020 в 16:45 #15454
manjey73УчастникМихаил, где участок кода, где происходит вставка картинки на мнемосхему ?
Интересует откуда в коде берется буфер Image.Data при вставке
-
Ответ изменён 6 лет, 5 месяцев назад пользователем
manjey73.
25.03.2020 в 16:53 #15456
manjey73УчастникИли точнее где при вставке считывается этот буфер
25.03.2020 в 17:10 #15457
manjey73Участник25.03.2020 в 17:52 #1546025.03.2020 в 17:54 #15461
MikhailМодераторЯ могу объяснить, что делается в той или иной части кода. Или объяснить, где найти какое-то действие. Но как сделать такую нестандартную вещь придётся разбираться самостоятельно, т.к. у меня нет готового рецепта.
25.03.2020 в 17:57 #15462
MikhailМодераторПожалуй, я бы рекомендовал реализовать свой редактор для работы SVG, не изменяя существующий диалог изображений. И прикрепить его как редактор для свойства компонента, чтобы он вызывался из Property Grid. Потому что в результате появится отдельная версия Редактора, которую будет сложно поддерживать.
25.03.2020 в 20:14 #15463
manjey73УчастникМихаил, вы можете изменить код так, чтобы из ImageListItem можно было изменить размер байтового массива Image.Data ? если это можно сделать малой кровью сейчас, думаю этого будет достаточно для дальнейших манипуляций. У меня не получилось это сделать. в данном случае я просто подменил буфер другим, но вставка на мнемосхему видимо как происходила из Image.Data так и происходит.
У меня опыта не хватит сделать отдельный редактор SVG, это больше по вашей части. К тому же я сделаю различные испытания и просто отдам вам код, который вы окультурите и вставите в существующий редактор. Этого было бы достаточно.
При опытах выяснилось, что svg.dll открывая файл svg добавляет свои параметры и служебные строки. А размер привязанного байтового буфера зависит от размера FileStream и никак его изменить нельзя (по крайней мере у меня не получилось)… И моего опыта даже тут недостаточно.
з.ы. сильно не копал svg.dll но похоже на его основе можно сделать редактор примитивов в будущем.
-
Ответ изменён 6 лет, 5 месяцев назад пользователем
manjey73.
25.03.2020 в 20:31 #15465
manjey73УчастникВставка не в этом месте или я чего-то не понимаю.
Сперва мы устанавливаем окно «Динамический рисунок», он пустой
Открываем Свойства, выбираем картинку, она отображается в превью, окно «Динамисеского рисунка» так же пустое. И только после нажатия «Выбрать», рисунок вставляется в мнемосхему.По крайней мере так вроде происходит с svg
26.03.2020 в 09:46 #15466
manjey73УчастникЧтобы редактор или обработчик параметров прикрутить к существующему, нужно чтобы можно было изменить данные картинки в ImageListItem и она в файл мнемосхемы сохранилась уже как новая.
Нужен либо промежуточный буфер для SVG (XML данных) и потом после редактирования из PropertyGrid обновление этих данных. Либо возможность изменения размера Image.Data при редактировании и далее код отслеживания изменений я так понимаю есть.
-
Ответ изменён 6 лет, 5 месяцев назад пользователем
manjey73.
26.03.2020 в 12:39 #15469
manjey73УчастникЕсть поток на массив байт изображения Image.Data, который привязан к списку вставленной картинки. Вот нужна возможность изменить размер этого массива, чтобы потом в него записать новое изображение.
Далее мы меняем уникальное имя в Списке изображений и можем снова открывать файл оригинала…Но вот никак не могу добиться как изменить этот чертов размер массива из кода ImageListItem. Куда и где копать, чтобы этого добиться ?
26.03.2020 в 14:52 #15471
manjey73УчастникТакс, победил я эту штуку, но потом надо будет как-то подумать, чтобы при отсутствии изменений в ProperyGrid не отрабатывал лишний код, только когда что-то будем менять…
else if (IsSvg) { MemoryStream imageStream = new MemoryStream(); using (MemoryStream memStream = new MemoryStream(Image.Data)) { SvgDocument svgDocument = SvgDocument.Open<SvgDocument>(memStream); // Тут проверяем наличие разрешенных изменений, формируем PropGrid для этого и т.д. svgDocument.Write(imageStream); // записываем в новый поток и узнаем длину } Image.Data = new byte[imageStream.Length]; Image.Data = imageStream.ToArray(); // копируем новые данные в массив imageStream.Flush(); imageStream.Close();И далее по тексту кода. Теперь надо прикручивать механизмы проверки разрешенных изменений и т.д.
-
Ответ изменён 6 лет, 5 месяцев назад пользователем
manjey73.
-
Ответ изменён 6 лет, 5 месяцев назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.
