Тема: Удалить форматирование символов

Подскажите пож-та, как удалить форматирование символов МТекста в автокаде c помощью VB.net???

(изменено: fixo, 5 февраля 2013г. 16:55:23)

Re: Удалить форматирование символов

Посмотри здесь
http://through-the-interface.typepad.co … m-net.html
и еще здесь
http://www.theswamp.org/index.php?topic … #msg404003
и смотри комментарий ниже
Удачи,
:)

Re: Удалить форматирование символов

Спасибо!! Попробую разобраться.

Re: Удалить форматирование символов

надо разбираться с c#, а это туго, буду пробывать...

Re: Удалить форматирование символов

Роман Соколов пишет:

надо разбираться с c#, а это туго, буду пробывать...

Есть онлайн конвертеры VB.NET <-> C#. Например: http://www.developerfusion.com/tools/co … arp-to-vb/

Re: Удалить форматирование символов

Я бы посоветовал установить на компьютере
SharpDevelop 4.2 (он бесплатный ищи в Гугле)
постоянно пользуюсь трансляцией VB.NET <--> C#
там есть встроенная опция для этого в меню Tools

(изменено: fixo, 6 февраля 2013г. 11:37:45)

Re: Удалить форматирование символов

Такой код работает в 2010-м автокаде
(тестировал немного)

       public static ErrorStatus fixoGetEntity(Transaction tr, Editor ed, RXClass rx, string msg, out ObjectId id)
        {
            ErrorStatus es;
            Entity ent;
            id = ObjectId.Null;
            PromptEntityOptions peo = new PromptEntityOptions(msg);
            peo.SetRejectMessage("\nYou're missing, try again >>");
            peo.AddAllowedClass(typeof(Entity), false);
            PromptEntityResult res;
            res = ed.GetEntity(peo);
            if (res.Status != PromptStatus.OK)
                es = ErrorStatus.PointNotOnEntity;
            id = res.ObjectId;
            if (id == ObjectId.Null)
                es = ErrorStatus.NullObjectId;
            ent = tr.GetObject(id, OpenMode.ForRead, false) as Entity;
            if (ent.GetRXClass() != rx)
            {
                ed.WriteMessage("\n{0}Must be a \"{0}\" type of only!",rx.DxfName);
                es = ErrorStatus.NotThatKindOfClass;
            }
            if (ent == null)
                es = ErrorStatus.NotAnEntity;
            else es = ErrorStatus.OK;
            return es;
        }
        [CommandMethod("StripMtextFormat", "SUF", CommandFlags.UsePickSet | CommandFlags.Redraw)]
        public void StripMtextMethod()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            ObjectId id = ObjectId.Null;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                if (fixoGetEntity(tr, ed, RXClass.GetClass(typeof(MText)), "\nSelect MTEXT to strip format", out id) == ErrorStatus.OK)
                {
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

                    // get entity by direct cast
                    Entity ent = (Entity)tr.GetObject(id, OpenMode.ForRead);
                    if (id.ObjectClass.DxfName == "MTEXT")
                    {
                        MText mtx = ent as MText;
                        mtx.UpgradeOpen();
                        string newtxt = mtx.Text;
                        ed.WriteMessage("\nText: {0}\n", newtxt);
                        mtx.Contents = newtxt;
                        mtx.RecordGraphicsModified(true);

                    }

                    tr.Commit();
                }
            }
        }

Re: Удалить форматирование символов

Не, не получается! Но всё равно большое спасибо!

(изменено: Александр Ривилис, 6 февраля 2013г. 14:08:59)

Re: Удалить форматирование символов

Роман Соколов пишет:

Не, не получается! Но всё равно большое спасибо!

Что не получается?

Re: Удалить форматирование символов

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


   

MText mtx = ent as MText; 
   mtx.UpgradeOpen(); 
   string newtxt = mtx.Text; 
   ed.WriteMessage("\nText: {0}\n", newtxt); 
   mtx.Contents = newtxt; 

так понимаю нужно открыть МТекст в каком-то редакторе....тут и проблема..

Re: Удалить форматирование символов

Роман Соколов пишет:

так понимаю нужно открыть МТекст в каком-то редакторе....тут и проблема..

???

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Runtime

Namespace MTextEditing
    Public Class Commands
        <CommandMethod("SMF")> _
        Public Sub StripMTextFormatting()
            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor
            ' Указываем, что можно выбрать только MText
            Dim peo As New PromptEntityOptions(vbLf & "Выберите MText для удаления форматирования: ")
            peo.SetRejectMessage(vbLf & "это не MText.")
            peo.AddAllowedClass(GetType(MText), False)
            Dim per As PromptEntityResult = ed.GetEntity(peo)
            If per.Status <> PromptStatus.OK Then
                Return
            End If

            Dim tr As Transaction = doc.TransactionManager.StartTransaction()
            Using tr
                ' Нужно открыть MText для чтения
                Dim obj As DBObject = tr.GetObject(per.ObjectId, OpenMode.ForRead, False)
                Dim mt As MText = TryCast(obj, MText)
                If mt Is Nothing Then
                    Return
                End If
                ' Создаём объект текстового редактора для MText
                Dim te As TextEditor = TextEditor.CreateTextEditor(mt)
                If te Is Nothing Then
                    Return
                End If
                ' Просто выбираем всё и удаляем форматирование
                te.SelectAll()
                te.Selection.RemoveAllFormatting()
                ' Не забываем сохранить результаты 
                te.Close(TextEditor.ExitStatus.ExitSave)
                tr.Commit()
            End Using
        End Sub
    End Class
End Namespace

Re: Удалить форматирование символов

вырезка из кода:

Imports System.IO
Imports Autodesk.AutoCAD.Interop.Common
Imports Autodesk.AutoCAD.Interop
Imports System.Runtime.InteropServices
Imports System
Imports System.Diagnostics
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing
Imports System.Drawing.Printing

   Private Sub ToolStripMenuItem60_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem60.Click
        On Error GoTo end_prg
        Dim AcadApp As AcadApplication = Nothing
        Dim Activdoc As AcadDocument = Nothing
        Dim objSelSet, sloj As Object
        Dim varAttributes, vardynamicblockproperties, vartext As Object
        Dim ss As New Process
        Dim ss1, ttt As Object
        Dim obj As AcadObject
        Dim varInsertionpoint, varAttributes1 As Object
        Dim objSelSet1, ima, l As Object
        Dim objpointer As AcadEntity
        Dim dxfInt(0 To 4) As Short, dxfType(0 To 4) As Object
        Dim objSelCol, objSelCol1 As AcadSelectionSets
        ttt = 0

        ss = Process.GetProcessesByName("acad")(0)
        ss1 = ss.Id
        AppActivate(ss1)
        AcadApp = DirectCast(Marshal.GetActiveObject(progIDstr), AcadApplication)
        Activdoc = AcadApp.ActiveDocument

        Dim style As AcadTextStyle ' создание текстового стиля
        Dim style1 As AcadTextStyles
        style1 = Activdoc.TextStyles
        For i = 0 To style1.Count - 1
            If style1(i).name = "GS-GOST2304" Then
                ttt = 1
            End If
        Next
        If ttt = 0 Then
            style = Activdoc.TextStyles.Add("GS-GOST2304")
            style.fontFile = "cs_gost2304.shx"
            style.Width = 0.8
            style.ObliqueAngle = 0
            style.Height = 0
        End If ' создание текстового стиля



        Dim AcadApp1 As AcadBlocks
        Dim elem As AcadBlock
        Dim elem1 As Object

        AcadApp1 = Activdoc.Blocks
        ProgressBar1.Visible = True
        ProgressBar1.Minimum = 0
        ProgressBar1.Maximum = AcadApp1.Count
        ProgressBar1.Value = 0
        ProgressBar1.Step = 1
        ProgressBar1.PerformStep()
        For i = 0 To AcadApp1.Count - 1
            ProgressBar1.PerformStep()
            elem = AcadApp1.Item(i)
            If elem.Name.Contains("*U") = True Or elem.Name = "*Model_Space" Or elem.Name = "*Paper_Space" Then
                For y = 0 To elem.Count - 1
                    elem1 = elem.Item(y)
                    If elem1.ObjectName = "AcDbMText" Then
                        Dim text As AcadMText
                        elem1.stylename = "GS-GOST2304"
                    End If

                If elem1.ObjectName = "AcDbText" Then
                elem1.stylename = "GS-GOST2304"
                elem1.ScaleFactor = 0.8
                elem1.ObliqueAngle = 0
            End If

            If elem.Name <> "*Model_Space" And elem.Name <> "*Paper_Space" Then
                If elem1.ObjectName = "AcDbAttributeDefinition" Then
                    elem1.stylename = "GS-GOST2304"
                    elem1.ScaleFactor = 0.8
                    elem1.ObliqueAngle = 0
                End If
            End If
        Next
            End If
        Next

Re: Удалить форматирование символов

Ты делаешь внешний exe-файл, который запускает AutoCAD? Если да, то все примеры, приведенные выше, работать не будут - они работают только внутри dll-файлов, загружаемых внутрь AutoCAD (командой NETLOAD).

Re: Удалить форматирование символов

Да, именно так! Никак не могу "доапаться" до свойства Мтекста, которое отключает форматирование..

Re: Удалить форматирование символов

Роман Соколов пишет:

Никак не могу "доапаться" до свойства Мтекста, которое отключает форматирование..

Такого свойства нет. Так что только парсить MTEXT.
Например, так: https://www.caduser.ru/forum/topic43895.html

Re: Удалить форматирование символов

Александр Ривилис пишет:

Такого свойства нет. Так что только парсить MTEXT.

Либо, как вариант, пользоваться этим.

Re: Удалить форматирование символов

Да уж одно круче другого....)

(изменено: Hwd, 6 февраля 2013г. 16:33:09)

Re: Удалить форматирование символов

Роман Соколов пишет:

Да уж одно круче другого....)

В твоём случае, регексы - самый простой (и не сложный) вариант.