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

Olga94
отредактировано 14 Jan Раздел: API

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

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

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

Тэги темы:

Ответы

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

  • Olga94
    отредактировано 15 Jan

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

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

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

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

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

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

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

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

  • Olga94
    отредактировано 16 Jan

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

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

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

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

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

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

  • Olga94
    отредактировано 16 Jan

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

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

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

    Есть чертёж с 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;

  • Спасибо,

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

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

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

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

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