Jump to content

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


Recommended Posts

Получаю текстовые свойства объекта 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 в простой текст?

 

Link to comment
Share on other sites

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

  • Like 1
  • Thanks 1
Link to comment
Share on other sites

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
                );
        }

 

 

Edited by doctorraz
  • Like 2
Link to comment
Share on other sites

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();
            

 

Edited by Ivanco
  • Like 1
Link to comment
Share on other sites

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

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

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

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

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

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

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

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

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

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

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

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...