Работа с SVG на мнемосхемах

Стартовая страница Форумы Разработка и интеграция Работа с SVG на мнемосхемах

Просмотр 15 сообщений - с 31 по 45 (из 52 всего)
  • Автор
    Записи
  • #15447
    manjey73
    Участник

    Стандартные классы на потом (одна из задач).
    Для изменения цвета вполне сгодится наверное и svg.dll, раз она уже есть.

    Не пойму как сделать в рамках кода ScadaSchemeCommon чтобы сперва происходила загрузка в память, а при вызове окна выбора файла картинки происходила обработка согласно параметрам с отображением в превью и потом сохранение.
    Чтобы все через MemoryStream шло. Хотя бы для начала…

    примерно так

    1. жмем «Внешний вид» — «Изображение» и вызываем окно «Изображения»
    2. в этот момент считывается в память картинка с одновременным чтение настроек из файла
    3. меняем цвета на нужные
    4. выбираем картинку и она вставляется на мнемосхему с отличными от оригинала цветами, прописанными в файле SVG

    Примерное место я нашел, но не пойму как прочесть в память, в нее же сохранить и опять вычитать из памяти ????

    #15448
    manjey73
    Участник

    что стандартные, что svg.dll, без разницы, надо как-то с MemoryStream работать.

    Предполагается что файл SVG будет единственным. Открыли — отобразилось в превью, что в файле. Изменяем — в преью отображаются изменения, Выбрали — вставилось на Мнемосхему.

    Так как на мнемосхему вставляется не код, то изменяться картинка на мнемосхеме не будет до тех пор, пока мы не зайдем в Редактор и снова не выберем картинку, я правильно понял логику ?

    А уже потом, если подобный механизм заработает, можно добавить и свойства для картинок, к которым можно будет прикручивать входные каналы и менять их свойства. Но тогда картинка уже должна быть вставлена как код html или как-то еще…
    Сейчас если правильно понимаю, можно это делать меняя картинки и только…

    • Ответ изменён 6 лет, 5 месяцев назад пользователем manjey73.
    • Ответ изменён 6 лет, 5 месяцев назад пользователем manjey73.
    #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";
                }
    

    Почему в записанном файле цвет заливки поменялся, а в отображении НЕТ ???? что не так с потоками, я ведь и в файл и в поток записываю одинаково ????

    #15453
    manjey73
    Участник

    И да, перед отрисовкой source = svgDocument.Draw(); скопировал в строку
    svgDocument.GetXML(); и вижу что в XML код цвета заливки заменен

    #15454
    manjey73
    Участник

    Михаил, где участок кода, где происходит вставка картинки на мнемосхему ?

    Интересует откуда в коде берется буфер Image.Data при вставке

    • Ответ изменён 6 лет, 5 месяцев назад пользователем manjey73.
    #15456
    manjey73
    Участник

    Или точнее где при вставке считывается этот буфер

    #15457
    manjey73
    Участник

    Только превью и сделано через одно место

    Вопрос где отправка картинки именно на мнемосхему ? В первью уже измененный фон на лету…

    • Ответ изменён 6 лет, 5 месяцев назад пользователем manjey73.
    • Ответ изменён 6 лет, 5 месяцев назад пользователем manjey73.
    #15460
    Mikhail
    Модератор

    Вставка изображения в саму схему происходит здесь.

    #15461
    Mikhail
    Модератор

    Я могу объяснить, что делается в той или иной части кода. Или объяснить, где найти какое-то действие. Но как сделать такую нестандартную вещь придётся разбираться самостоятельно, т.к. у меня нет готового рецепта.

    #15462
    Mikhail
    Модератор

    Пожалуй, я бы рекомендовал реализовать свой редактор для работы SVG, не изменяя существующий диалог изображений. И прикрепить его как редактор для свойства компонента, чтобы он вызывался из Property Grid. Потому что в результате появится отдельная версия Редактора, которую будет сложно поддерживать.

    #15463
    manjey73
    Участник

    Михаил, вы можете изменить код так, чтобы из ImageListItem можно было изменить размер байтового массива Image.Data ? если это можно сделать малой кровью сейчас, думаю этого будет достаточно для дальнейших манипуляций. У меня не получилось это сделать. в данном случае я просто подменил буфер другим, но вставка на мнемосхему видимо как происходила из Image.Data так и происходит.

    У меня опыта не хватит сделать отдельный редактор SVG, это больше по вашей части. К тому же я сделаю различные испытания и просто отдам вам код, который вы окультурите и вставите в существующий редактор. Этого было бы достаточно.

    При опытах выяснилось, что svg.dll открывая файл svg добавляет свои параметры и служебные строки. А размер привязанного байтового буфера зависит от размера FileStream и никак его изменить нельзя (по крайней мере у меня не получилось)… И моего опыта даже тут недостаточно.

    з.ы. сильно не копал svg.dll но похоже на его основе можно сделать редактор примитивов в будущем.

    • Ответ изменён 6 лет, 5 месяцев назад пользователем manjey73.
    #15465
    manjey73
    Участник

    Вставка не в этом месте или я чего-то не понимаю.

    Сперва мы устанавливаем окно «Динамический рисунок», он пустой
    Открываем Свойства, выбираем картинку, она отображается в превью, окно «Динамисеского рисунка» так же пустое. И только после нажатия «Выбрать», рисунок вставляется в мнемосхему.

    По крайней мере так вроде происходит с svg

    #15466
    manjey73
    Участник

    Чтобы редактор или обработчик параметров прикрутить к существующему, нужно чтобы можно было изменить данные картинки в ImageListItem и она в файл мнемосхемы сохранилась уже как новая.

    Нужен либо промежуточный буфер для SVG (XML данных) и потом после редактирования из PropertyGrid обновление этих данных. Либо возможность изменения размера Image.Data при редактировании и далее код отслеживания изменений я так понимаю есть.

    • Ответ изменён 6 лет, 5 месяцев назад пользователем manjey73.
    #15469
    manjey73
    Участник

    Есть поток на массив байт изображения Image.Data, который привязан к списку вставленной картинки. Вот нужна возможность изменить размер этого массива, чтобы потом в него записать новое изображение.
    Далее мы меняем уникальное имя в Списке изображений и можем снова открывать файл оригинала…

    Но вот никак не могу добиться как изменить этот чертов размер массива из кода ImageListItem. Куда и где копать, чтобы этого добиться ?

    #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.
Просмотр 15 сообщений - с 31 по 45 (из 52 всего)
  • Для ответа в этой теме необходимо авторизоваться.