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.
Besoin d'un développement spécifique pour AutoCAD ?
Développement de compléments à AutoCAD et aux autres logiciels Autodesk (AutoCAD Electrical, AutoCAD Mechanical, Inventor, Revit, Vault, Navisworks...). C#/VB/.NET, C++/ObjectARX, AutoLISP, VBA.
Migration de vos projets VBA en .NET, intégration RealDWG dans vos applications, développement sur plateforme AutoCAD OEM et Inventor OEM.
Assistance technique AutoCAD, Inventor, Revit, Vault.
Maxence DELANNOY - Tél. : 06.46.40.75.66 - maxence.delannoy@wiip.fr
|
Add new comment