Перейти к содержанию

Net Api, Multicad. Конвертация RTF в строку


Рекомендуемые сообщения

Получаю текстовые свойства объекта MC (форматка)

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

 

McPropertySource mcFrmPropSource = idMcObj.GetObject()?.Cast<McPropertySource>();
McProperties mcFrmProps = mcFrmPropSource.ObjectProperties;
string sDesignation = mcFrmProps["Designation"].ToString();

 

вернет="{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0\\fnil\\fcharset0 CS Standard;}}\r\n\\fs17  \\v\\embo\\impr <ref id=\"4241934004\">\\v0\\embo0 02919-11544-\\u1040?\\u1058?\\u1061?\\v\\embo </ref>\\v0\\embo0\\impr0  .\\u1042?7\\par\r\n}"

 

Через McCOM есть возможность  получить, как

форматированный текст: Name1 = ObjMC("Designation")
так и его значение неформатированной строкой  Name2 = ObjMC("Designation").Raw

-----------------

Собственно вопрос, как средствами NET API конвертировать строку из RTF в простой текст?

 

Ссылка на сообщение
Поделиться на другие сайты
4 часа назад, doctorraz сказал:

как средствами NET API конвертировать строку из RTF в простой текст?

rtf--> plain text

string inStr = @"{\rtf1 Привет!\par{\i Это}некийотформатированный {\b текст}.\par}";
Multicad.Text.RTF.Node nd = Multicad.Text.RTF.Node.Parse(inStr);
string outStr = nd.PlainText;

вообще м.б. правильно сперва

McProperty prop = mcFrmProps.GetProperty("Designation");

а потом почитать что да как в McProperty

Ссылка на сообщение
Поделиться на другие сайты
15 часов назад, Ivanco сказал:

rtf--> plain text

Спасибо

так переваривает любой текст

 Multicad.Text.RTF.Node nd = Multicad.Text.RTF.Node.ForceParse(sDesignation);

 

upd

15 часов назад, Ivanco сказал:

вообще м.б. правильно сперва

McProperty prop = mcFrmProps.GetProperty("Designation");


McProperty prop = mcFrmProps.GetProperty("Designation");

а потом почитать что да как в McProperty

 

Спасибо. Ты таки направил меня по тому пути.

 

GetProperty надо отдельно получать GetValue это время, получается в два раза дольше (00:00:12.5768325), чем пример выше (00:00:07.4846668)

sDesignation =(string) mcProperties.GetProperty("Designation").GetValue();

но таки есть быстрое свойство, работает очень быстро (00:00:03.9139507)

sDesignation =(string) mcProperties.GetValueEx("Designation", null);

миллион итераций одного свойства

ЗЫ чуть в Designation дырку не протер))))

если нужно не только значение но и другие параметры свойства, то 

List<McProperty> mcPropertyList = mcProperties.GetProps();
sDesignation =(string) mcPropertyList.Find(item => item.Name == "Designation").GetValue();

без генерации листа 00:00:09.2640888

 

Спойлер

/// <summary>
        /// Тест способов получения свойств
        /// </summary>
        [Trt.CommandMethod("drz-FrmtProps")]
        public void TestFrmtProps()
        {
            App.Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;

            int icCunter = 1000000;

            McObjectId mcObjectId = McObjectManager.SelectObject("\nВыберите формат: ");
            McFormat mcFormat = mcObjectId.GetObject()?.Cast<McFormat>();
            McPropertySource mcPropertySource = mcObjectId.GetObject()?.Cast<McPropertySource>();
            McProperties mcProperties = mcPropertySource.ObjectProperties;

            //  List
            List<McProperty> mcPropertyList = mcProperties.GetProps();

            string sDesignation;

            //прямой доступ  00:00:07.4846668
            Stopwatch s = Stopwatch.StartNew();
            for (int i = 0; i < icCunter; i++)
            {
                sDesignation = (string)mcProperties["Designation"];
            }
            s.Stop();
            ed.WriteMessage("\nDesignation {0}",
                s.Elapsed
                );

            s.Restart();
            //через свойство 00:00:12.5768325
            for (int i = 0; i < icCunter; i++)
            {
                sDesignation = (string)mcProperties.GetProperty("Designation").GetValue();
            }
            s.Stop();
            ed.WriteMessage("\nGetProperty {0}",
                s.Elapsed
                );

            s.Restart();
            //через быстрое свойство 00:00:03.9139507
            for (int i = 0; i < icCunter; i++)
            {
                sDesignation = (string)mcProperties.GetValueEx("Designation", null);
            }
            s.Stop();
            ed.WriteMessage("\nGetValueEx {0}",
                s.Elapsed
                );

            s.Restart();
            //через List 00:00:09.2640888
            for (int i = 0; i < icCunter; i++)
            {
                sDesignation = (string)mcPropertyList.Find(item => item.Name == "Designation").GetValue();
            }
            s.Stop();
            ed.WriteMessage("\nList {0}",
                s.Elapsed
                );
        }

 

 

Изменено пользователем doctorraz
Ссылка на сообщение
Поделиться на другие сайты
9 часов назад, doctorraz сказал:

 

  Если вдруг кому интересно, исходник теста. (Палкой тыкал в форматку) (Показать контент)

/// <summary> /// Тест способов получения свойств /// </summary> [Trt.CommandMethod("drz-FrmtProps")] public void TestFrmtProps() { App.Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; int icCunter = 1000000; McObjectId mcObjectId = McObjectManager.SelectObject("\nВыберите формат: "); McFormat mcFormat = mcObjectId.GetObject()?.Cast<McFormat>(); McPropertySource mcPropertySource = mcObjectId.GetObject()?.Cast<McPropertySource>(); McProperties mcProperties = mcPropertySource.ObjectProperties; // List List<McProperty> mcPropertyList = mcProperties.GetProps(); string sDesignation; //прямой доступ 00:00:07.4846668 Stopwatch s = Stopwatch.StartNew(); for (int i = 0; i < icCunter; i++) { sDesignation = (string)mcProperties["Designation"]; } s.Stop(); ed.WriteMessage("\nDesignation {0}", s.Elapsed ); s.Restart(); //через свойство 00:00:12.5768325 for (int i = 0; i < icCunter; i++) { sDesignation = (string)mcProperties.GetProperty("Designation").GetValue(); } s.Stop(); ed.WriteMessage("\nGetProperty {0}", s.Elapsed ); s.Restart(); //через быстрое свойство 00:00:03.9139507 for (int i = 0; i < icCunter; i++) { sDesignation = (string)mcProperties.GetValueEx("Designation", null); } s.Stop(); ed.WriteMessage("\nGetValueEx {0}", s.Elapsed ); s.Restart(); //через List 00:00:09.2640888 for (int i = 0; i < icCunter; i++) { sDesignation = (string)mcPropertyList.Find(item => item.Name == "Designation").GetValue(); } s.Stop(); ed.WriteMessage("\nList {0}", s.Elapsed ); }





/// <summary>
        /// Тест способов получения свойств
        /// </summary>
        [Trt.CommandMethod("drz-FrmtProps")]
        public void TestFrmtProps()
        {
            App.Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;

            int icCunter = 1000000;

            McObjectId mcObjectId = McObjectManager.SelectObject("\nВыберите формат: ");
            McFormat mcFormat = mcObjectId.GetObject()?.Cast<McFormat>();
            McPropertySource mcPropertySource = mcObjectId.GetObject()?.Cast<McPropertySource>();
            McProperties mcProperties = mcPropertySource.ObjectProperties;

            //  List
            List<McProperty> mcPropertyList = mcProperties.GetProps();

            string sDesignation;

            //прямой доступ  00:00:07.4846668
            Stopwatch s = Stopwatch.StartNew();
            for (int i = 0; i < icCunter; i++)
            {
                sDesignation = (string)mcProperties["Designation"];
            }
            s.Stop();
            ed.WriteMessage("\nDesignation {0}",
                s.Elapsed
                );

            s.Restart();
            //через свойство 00:00:12.5768325
            for (int i = 0; i < icCunter; i++)
            {
                sDesignation = (string)mcProperties.GetProperty("Designation").GetValue();
            }
            s.Stop();
            ed.WriteMessage("\nGetProperty {0}",
                s.Elapsed
                );

            s.Restart();
            //через быстрое свойство 00:00:03.9139507
            for (int i = 0; i < icCunter; i++)
            {
                sDesignation = (string)mcProperties.GetValueEx("Designation", null);
            }
            s.Stop();
            ed.WriteMessage("\nGetValueEx {0}",
                s.Elapsed
                );

            s.Restart();
            //через List 00:00:09.2640888
            for (int i = 0; i < icCunter; i++)
            {
                sDesignation = (string)mcPropertyList.Find(item => item.Name == "Designation").GetValue();
            }
            s.Stop();
            ed.WriteMessage("\nList {0}",
                s.Elapsed
                );
        }

 

 

интересно. глянул.
незнаю зачем все фокусы с замерами быстродействия.
но если скорость не критична, возможно стоит выбирать самый ПОНЯТНЫЙ код, окупиться в будущем).
с моей точки зрения самая понятная конструкция:
 

sDesignation = (string)mcProperties.GetProperty("Designation").GetValue();
            

 

Изменено пользователем Ivanco
Ссылка на сообщение
Поделиться на другие сайты
1 час назад, Ivanco сказал:

незнаю зачем все фокусы с замерами быстродействия

Хех, эт шиза у меня такая..

На самом деле скорость подготовки данных в деле печати не сильно критична (нанопечать даже в пдф, процесс весьма небыстрый)

Для  себя тестил, собрать практически все поля и свойства с тысячи форматок, в одном файле по времени около 0,003 сек!!!

1 час назад, Ivanco сказал:

возможно стоит выбирать самый ПОНЯТНЫЙ код, окупиться в будущем).

Имха по ситуации действую, если мне нужно только значение, то GetValueEx самое, то.

Если кроме значения, мне нужны другие характеристики конкретного свойства, то конечно удобней всего GetProperty.

Если надо пройти по всем свойствам и отобрать по признаку (например что это ячейка комментарий таблицы), тут List весьма удобен .

Вот с GetPropertyes пока не разобрался, как извлекать поля(((в примере его нет

 

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Расскажите друзьям

    Нравится Официальный форум компании Нанософт? Расскажите друзьям!
×
×
  • Создать...