Пользовательское форматирование многострочного текста

Здравствуйте Уважаемые специалисты NanoCAD!

Подскажите пожалуйста, как кроме макроса lisp (*StripMtext) можно сбросить выполненные через редактор МТекста пользовательские настройки иные чем в стиле для большого количества МТекстов?

Может кто-то пробовал через excel-vba или др.

Да практически никак. Либо программно (лиспом / NET / VBS …), либо заходить в каждый MText и руками сносить форматирование.

Подскажите пожалуйста, как вывести свойство ObliqueAngle для измененного мультитекста (не текстового стиля)? Только через число в Textstring (например, {\Q15.0000;Пример1})?

Если есть возможность использовать .net, и формат {\Q15.0000;Пример1} устраивает, то можно использовать свойство Contents для MText. Вот пример кода:

изображение.png

Если в чертеже есть несколько многострочных текстов :

изображение.png

То вызов функции выдаст следующее:

изображение.png

Подскажите пожалуйста, как вывести свойство ObliqueAngle для измененного мультитекста (не текстового стиля)? Только через число в Textstring (например, {\Q15.0000;Пример1})?

Я бы попытался анализировать текст на предмет наличия “\Q” и следующего за ним “;”. Вопрос в том, что надо выводить, если в тексте будет нечто типа {\Q15.0000;Пример}{\Q17.2800;1} ? :slight_smile:

Я бы попытался анализировать текст на предмет наличия “\Q” и следующего за ним “;”. Вопрос в том, что надо выводить, если в тексте будет нечто типа {\Q15.0000;Пример}{\Q17.2800;1} ? :slight_smile:

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

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

А какая вообще стоит цель?

Т.е. если есть текст из двух слов, в котором первое слово имеет наклон 10, а второе 20, то что в итоге хочется получить как результат выполнения кода?

\Q может встретиться как текст, а не “ключ”?

“\Q” будет только как ключ. Если в самом тексте будет “\Q”, то в Contents он будет экранированным записан как “\\Q”.

Условно строка “{\Q Ещё какой-то текст” с наклоном в 15 будет выглядеть следующим образом:

{\Q15.0000;\{\\Q Ещё какой-то текст}

Это можно регулярным выражением всё обработать.

Но это всё-равно не отвечает на вопрос - что нам в итоге надо сделать? Вывести для каждого найденного текстового поля наличие/отсутствие в нём наклона? Обнулить во всех найденных текстах наклон? Или ещё что-то?

Найти, показать угол и обнулить

Можно Вас попросить показать как выглядит “шаблон выражения” для мультитекста (с параметрами форматирования разными - наклон, сжатие, жирный, …)

Ну если на скорую руку, то можно вот так:

Есть чертёж с 2 мтекстами:

В первом мтексте 2 строки, каждая строка со своим наклоном и обманка в виде “ключа” в самом тексте.

Во втором мтексте 3 разных наклона.

После выполнения кода вот что мы получаем:

И вот что получаем в консоли:

Вроде и наклоны везде убрали и на \Q в тексте не повелись и все наклоны в консоль вывели.

Вот функция:

   [CommandMethod("MTextContent")]
    public static void MTextContent()
    {
        using (Transaction trans = HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
        {
            BlockTable bt = (BlockTable)trans.GetObject(HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.BlockTableId, OpenMode.ForWrite);
            foreach (ObjectId btrId in bt)
            {
                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(btrId, OpenMode.ForWrite);
                foreach (ObjectId entId in btr)
                {
                    if (entId.ObjectClass.DxfName == "MTEXT")
                    {
                        MText mText = (MText)trans.GetObject(entId, OpenMode.ForWrite);
                        HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nНайдена строка: {0}", mText.Text);
                        HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nЕё контент: {0}", mText.Contents);
                        string pattern = @"(?<!\\)\\Q\d+\.\d+;";
                        foreach (Match match in Regex.Matches(mText.Contents, pattern))
                        {
                            HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"В ней использовался наклон: {match.Value.Replace(@"\Q","")}");
                        }                            
                        mText.Contents = Regex.Replace(mText.Contents, pattern, @"\Q00.0000;");                                                       
                    }
                }
            }
            trans.Commit();
        }
    }

Спасибо, поизучаю

как вариант

sDesignation;//форматированный текст

Multicad.Text.RTF.Node nd;

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

как вариант

sDesignation;//форматированный текст

Multicad.Text.RTF.Node nd;

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

Спасибо,

у меня к сожалению нет библиотек MultiCAD

Спасибо,

у меня к сожалению нет библиотек MultiCAD

Вот библиотеки мультикада + справка по ним. Справка, правда, откровенно паршивая.

А вообще, в нанокаде почти все надстроечные пакеты типа СПДС, механика, nPlat и прочего используют в своей работе библиотеки мультикада. Так что если нанокад не голый, то можно эти библиотеки поискать в c:\Program Files\anosoft
anoCAD x64 XX\bin_nPlat\, c:\Program Files\anosoft
anoCAD x64 XX\anoSPDS\bin\ и так далее.

Спасибо,

у меня к сожалению нет библиотек MultiCAD

На нет и суда нет((

Но они у тебя есть, если делала полную установку

На нет и суда нет((

Но они у тебя есть, если делала полную установку

Спасибо!