Работа с текстми на листе с сохранением шрифта

Автор Sprinter500, 18.09.19, 12:21:00

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Sprinter500

Добрый день! Проблема долго оставалась не замеченной, так как стили шрифта (размер, шрифт, наклон) текста объектов совпадали с настройками в чертеже. Но если у какого текста нестандартный стиль, то при работе с ним стиль сбрасывается до настроек чертежа.

Вот пример кода:
                            IDrawingTexts drawingTexts = DrawingContainer.DrawingTexts;
                            if (drawingTexts != null)
                            {
                                if (cbTexts.Checked) ReplacesCount = drawingTexts.Count;
                                for (int j = 0; j < ReplacesCount; j++)
                                {
                                    IDrawingObject drawingObject = drawingTexts.DrawingText[j];
                                    if (drawingObject != null)
                                    {
                                        if (drawingObject.DrawingObjectType == DrawingObjectTypeEnum.ksDrDrawText)
                                        {
                                            IDrawingText drawingText = (IDrawingText)drawingObject;
                                            if (drawingText != null)
                                            {
                                                IText text = (IText)drawingText;
                                                if (text != null)
                                                {
                                                    text.Str = text.Str.Replace("A", "B");
                                                    drawingObject.Update();
                                                    drawingText = null;
                                                }
                                            }
                                        }
                                    }
                                    drawingObject = null;
                                }
                                drawingTexts = null;
                            }

Итак вопрос: Что надо в коде поменять, чтобы не происходил сброс стилей, чтобы сохранялось исходное оформление текста?

ТрындецЪ

Я тоже замечал эту проблему. Думаю, проблема исчезнет, если менять Str  не в IText, а добираться до каждой его компоненты ITextItem и менять Str в ней.
+ Благодарностей: 1

Sprinter500

Цитата: ТрындецЪ от 18.09.19, 12:36:35
Я тоже замечал эту проблему. Думаю, проблема исчезнет, если менять Str  не в IText, а добираться до каждой его компоненты ITextItem и менять Str в ней.

Попробовал сделать так:

                                                if (text != null)
                                                {
                                                    //text.Str = text.Str.Replace("A", "B");
                                                    //drawingObject.Update();
                                                    //drawingText = null;
                                                    for (int z=0; z<text.Count; z++)
                                                    {
                                                        ITextLine textLine = text.TextLine[z];
                                                        if (textLine != null)
                                                        {
                                                            for (int k=0; k<textLine.Count; k++)
                                                            {
                                                                ITextItem textItem = textLine.TextItem[k];
                                                                if (textItem != null)
                                                                {
                                                                    textItem.Str = textItem.Str.Replace("A", "B");
                                                                    drawingObject.Update();
                                                                }
                                                                textItem = null;
                                                            }
                                                        }
                                                        textLine = null;
                                                    }
                                                }

И вообще перестало работать. Хотя я наверно как-то неправильно до TextItem стал добираться

Sprinter500

Цитата: Sprinter500 от 18.09.19, 13:16:38
Попробовал сделать так:

                                                if (text != null)
                                                {
                                                    //text.Str = text.Str.Replace("A", "B");
                                                    //drawingObject.Update();
                                                    //drawingText = null;
                                                    for (int z=0; z<text.Count; z++)
                                                    {
                                                        ITextLine textLine = text.TextLine[z];
                                                        if (textLine != null)
                                                        {
                                                            for (int k=0; k<textLine.Count; k++)
                                                            {
                                                                ITextItem textItem = textLine.TextItem[k];
                                                                if (textItem != null)
                                                                {
                                                                    textItem.Str = textItem.Str.Replace("A", "B");
                                                                    drawingObject.Update();
                                                                }
                                                                textItem = null;
                                                            }
                                                        }
                                                        textLine = null;
                                                    }
                                                }

И вообще перестало работать. Хотя я наверно как-то неправильно до TextItem стал добираться


Попробовал на уровень выше подняться и только у Textline строку поменять:

textLine.Str = textLine.Str.Replace("A", "B");
drawingObject.Update();

Код снова заработал, но стиль текста все также до умолчательного (того что в настройках чертежа для данного объекта) сбрасывается

Sprinter500

Проблема решилась. Вариант с TextItem. Только нужно было TextItem.Update() вызвать. Ларчик просто открывался:

textItem.Str = textItem.Str.Replace("A", "B");
textItem.Update();
drawingObject.Update();
+ Благодарностей: 2

Sprinter500

А кто знает почему в стандартной библиотеке "Сервисные инструменты"   замена текста работает в десятки раз шустрее, чем если писать аналог с кодами как в примере выше?  Вот бы увидеть код замены текста в этой библиотеке, как они там все так хитро сделали?

P.S. Разница в скорости видна при работе с насыщенными чертежами, то есть стандартная библиотека просматривает и меняет все совпадения за пару секунд, а при работе из под собственного приложения - уходят минуты.