Тема: .NET - Удаление форматирования текста (2008-2009)

файл должен находится вот здесь: http://dwg.ru/dnl/4404
В .NET API 2008-09 у класса MText есть строковое свойство Text, которое не содержит форматирующих символов.

using System;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
namespace MtextUnformat
{
    public class Program
    {
        [CommandMethod("MTXTFORMATREMOVE",CommandFlags.UsePickSet | CommandFlags.Redraw |CommandFlags.Modal)]
        public static void RemoveFormatting()
        {
            Database db = HostApplicationServices.WorkingDatabase;
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            PromptSelectionResult psr = ed.SelectImplied();
            if (psr.Status != PromptStatus.OK)
            {
                PromptSelectionOptions pso = new PromptSelectionOptions();
                pso.MessageForAdding = "выделите многострочный текст";
                TypedValue[] values = { new TypedValue((int)DxfCode.Start, "MTEXT") };
                SelectionFilter sfilter = new SelectionFilter(values);
                psr = ed.GetSelection(pso,sfilter);
            }
            if (psr.Status == PromptStatus.OK)
            {
                Transaction trans = db.TransactionManager.StartTransaction();
                try
                {
                    BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForRead));
                    BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                    SelectionSet SS = psr.Value;
                    foreach (ObjectId id in SS.GetObjectIds())
                    {
                        MText mtxt = (MText)db.TransactionManager.GetObject(id, OpenMode.ForWrite, false, true);
                        mtxt.Contents = mtxt.Text; //Вот и весь алгоритм удаления форматирования в ObjectArx.NET API 2008-2009!
                    }
                    trans.Commit();
                    ed.Regen();
                }
                catch (System.Exception ex)
                {
                    ed.WriteMessage("Error: " + ex.Message);
                }
                finally
                {
                    trans.Dispose();
                }
            }
        }
    }
}

Привожу пример на IronPython (для запуска нужен PyAcad.NET , команда pyfile)

import clr
import System
from System.Collections.Generic import List
from Autodesk.AutoCAD.ApplicationServices import *
from  Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.AutoCAD.EditorInput import *
from  Autodesk.AutoCAD.Runtime import *
doc = Application.DocumentManager.MdiActiveDocument
ed = doc.Editor
db = doc.Database
def MTextUnformat():
    data = {}
    values = List[TypedValue]()
    values.Add(TypedValue(int(DxfCode.Start), "MTEXT"))
    sfilter = SelectionFilter(values.ToArray())
    opts = PromptSelectionOptions()
    opts.MessageForAdding = "выберите многострочный текст"
    res  = ed.GetSelection(opts, sfilter)
    if not res.Status == PromptStatus.OK:
        return
    SS = res.Value
    idarray = SS.GetObjectIds()
    tr = db.TransactionManager.StartTransaction()
    try:
        docLock = doc.LockDocument()
        for id in idarray:
            mtxt = tr.GetObject(id,OpenMode.ForWrite,True)
            mtxt.Contents = mtxt.Text
        tr.Commit()    
    finally:
        tr.Dispose()
        docLock.Dispose()
try:
    MTextUnformat()
except Exception,detail:
    print(detail)

Re: .NET - Удаление форматирования текста (2008-2009)

> Krasyn

mtxt.Contents = mtxt.Text;

работает как часы
~'J'~

Re: .NET - Удаление форматирования текста (2008-2009)

Извините, я обнаружил ошибку: надо добавить проверку, что объект является мультистрочным текстом.

MText mtxt = db.TransactionManager.GetObject(id, OpenMode.ForWrite, false, true) as  MText;
                        if (mtxt != null)
...

И вызов
ed.Regen();
совсем не нужен.
Вот исправленная версия:

using System;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
namespace MtextUnformat
{
    public class Program
    {
        [CommandMethod("MTXTFORMATREMOVE",CommandFlags.UsePickSet | CommandFlags.Redraw |CommandFlags.Modal)]
        public static void RemoveFormatting()
        {
            Database db = HostApplicationServices.WorkingDatabase;
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            PromptSelectionResult psr = ed.SelectImplied();
            if (psr.Status != PromptStatus.OK)
            {
                PromptSelectionOptions pso = new PromptSelectionOptions();
                pso.MessageForAdding = "выделите многострочный текст";
                TypedValue[] values = { new TypedValue((int)DxfCode.Start, "MTEXT") };
                SelectionFilter sfilter = new SelectionFilter(values);
                psr = ed.GetSelection(pso,sfilter);
            }
            if (psr.Status == PromptStatus.OK)
            {
                Transaction trans = db.TransactionManager.StartTransaction();
                try
                {
                    BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForRead));
                    BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                    SelectionSet SS = psr.Value;
                    foreach (ObjectId id in SS.GetObjectIds())
                    {
                        MText mtxt = db.TransactionManager.GetObject(id, OpenMode.ForWrite, false, true) as  MText;
                        if (mtxt != null)
                            mtxt.Contents = mtxt.Text; //Вот и весь алгоритм удаления форматирования в ObjectArx.NET API 2008-2009!
                    }
                    trans.Commit();
                    //ed.Regen();
                }
                catch (System.Exception ex)
                {
                    ed.WriteMessage("Error: " + ex.Message);
                }
                finally
                {
                    trans.Dispose();
                }
            }
        }
    }
}