Extraire tous les textes d'un dessin AutoCAD

En théorie, c'est faisable avec la commande EXTRACTDONNEES mais le problème c'est que les codes de formatages sont inclus dans les chaînes extraites. Voici donc le code d'une petite commande en C#/.NET :

[CommandMethod("WIIPEXTRACTTEXT")]
public void ExtractText()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;

    PromptSelectionResult psr = ed.SelectAll(new SelectionFilter(new[]
    {
        new TypedValue((int) DxfCode.Operator, "<OR"),
        new TypedValue((int) DxfCode.Start, 
          RXObject.GetClass(typeof (MText)).DxfName),
        new TypedValue((int) DxfCode.Start, 
          RXObject.GetClass(typeof (DBText)).DxfName),
        new TypedValue((int) DxfCode.Operator, "OR>")
    }));

    if (PromptStatus.Cancel == psr.Status) return;

    string txtFileName = Path.ChangeExtension(doc.Name, ".txt");
    var hashSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
    using (var sw = new StreamWriter(new FileStream(txtFileName,
      FileMode.OpenOrCreate, FileAccess.Write), Encoding.Default))
    using (Transaction tr = db.TransactionManager.StartOpenCloseTransaction())
    {
        var regex = new Regex(@"^[0-9\.-]+$", RegexOptions.Compiled);
        foreach (SelectedObject so in psr.Value)
        {
            var dbo = tr.GetObject(so.ObjectId, OpenMode.ForRead);

            string text = null;

            var mtext = dbo as MText;
            if (null != mtext)
                text = mtext.Text.Trim();

            var dbText = dbo as DBText;
            if (null != dbText)
                text = dbText.TextString.Trim();

            if (string.IsNullOrEmpty(text)) continue;

            string[] lines = text.Split(new[] { "\r\n", "\n" },
              StringSplitOptions.RemoveEmptyEntries);
            foreach (string line in lines)
            {
                // Ignore les lignes ne contenant que des chiffres
                if (regex.IsMatch(line)) continue;

                if (hashSet.Contains(line)) continue;

                hashSet.Add(line);

                sw.WriteLine(line);
            }
        }
        tr.Commit();
    }
    Process.Start("notepad.exe", txtFileName);
}

Les doublons, ainsi que les lignes ne contenant que du texte sont ignorées. Le fichier résultant est encodé avec le jeu de caractère ANSI.

Seul les textes (multiples ou à une seule ligne) sont pris en compte. Les attributs sont ignorés.

Etiquettes:

Add new comment