[CommandMethod("TextStyleMap")]
public void mapTextStyles()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
PromptKeywordOptions pko
= new PromptKeywordOptions
(""); pko.Keywords.Add("Yes");
pko.Keywords.Add("No");
pko.AppendKeywordsToMessage = true;
pko.AllowNone = true;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
TextStyleTable tst = (TextStyleTable)tr.GetObject(db.TextStyleTableId, OpenMode.ForWrite);
Dictionary
<string, ObjectIdCollection
> styles
= new Dictionary
<string, ObjectIdCollection
>(); foreach (ObjectId id in tst)
{
TextStyleTableRecord tstr = (TextStyleTableRecord)tr.GetObject(id, OpenMode.ForRead);
styles
.Add(tstr
.Name,
new ObjectIdCollection
()); ed.WriteMessage("\nStyle: {0}", tstr.Name);
}
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
List
<string> unhandled
= new List
<string>(); List
<string> handled
= new List
<string>(); foreach (ObjectId btrId in bt)
{
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
foreach (ObjectId id in btr)
{
DBObject obj = tr.GetObject(id, OpenMode.ForRead);
Entity ent = obj as Entity;
if (ent == null) continue;
DBText text = ent as DBText;
if (text != null)
{
styles[text.TextStyleName].Add(text.ObjectId);
if (!handled.Contains(ent.GetRXClass().DxfName))
handled.Add(ent.GetRXClass().DxfName);
continue;
}
MText mtxt = obj as MText;
if (mtxt != null)
{
styles[mtxt.TextStyleName].Add(mtxt.ObjectId);
if (!handled.Contains(ent.GetRXClass().DxfName))
handled.Add(ent.GetRXClass().DxfName);
continue;
}
AttributeDefinition ad = ent as AttributeDefinition;
if (ad != null)
{
styles[ad.TextStyleName].Add(ad.ObjectId);
if (!handled.Contains(ent.GetRXClass().DxfName))
handled.Add(ent.GetRXClass().DxfName);
continue;
}
AttributeReference ar = ent as AttributeReference;
if (ar != null)
{
styles[ar.TextStyleName].Add(ar.ObjectId);
if (!handled.Contains(ent.GetRXClass().DxfName))
handled.Add(ent.GetRXClass().DxfName);
continue;
}
Dimension dim = ent as Dimension;
if (dim != null)
{
TextStyleTableRecord dimtstr = (TextStyleTableRecord)tr.GetObject(dim.TextStyleId, OpenMode.ForRead);
styles[dimtstr.Name].Add(dim.ObjectId);
if (!handled.Contains(ent.GetRXClass().DxfName))
handled.Add(ent.GetRXClass().DxfName);
continue;
}
MLeader mlead = ent as MLeader;
if (mlead != null)
{
TextStyleTableRecord dimtstr = (TextStyleTableRecord)tr.GetObject(mlead.TextStyleId, OpenMode.ForRead);
styles[dimtstr.Name].Add(mlead.ObjectId);
if (!handled.Contains(ent.GetRXClass().DxfName))
handled.Add(ent.GetRXClass().DxfName);
continue;
}
Leader lead = ent as Leader;
if (lead != null)
{
TextStyleTableRecord dimtstr = (TextStyleTableRecord)tr.GetObject(lead.TextStyleId, OpenMode.ForRead);
styles[dimtstr.Name].Add(lead.ObjectId);
if (!handled.Contains(ent.GetRXClass().DxfName))
handled.Add(ent.GetRXClass().DxfName);
continue;
}
if (!unhandled.Contains(ent.GetRXClass().DxfName))
unhandled.Add(ent.GetRXClass().DxfName);
}
}
ed.WriteMessage("\nHandled:");
foreach (string type in handled)
{
ed.WriteMessage("\n\t{0}", type);
}
ed.WriteMessage("\n\n");
ed.WriteMessage("\nUnhandled:");
foreach (string type in unhandled)
{
ed.WriteMessage("\n\t{0}", type);
}
ed.WriteMessage("\n\n");
foreach (string style in styles.Keys)
{
ed.WriteMessage("\n{0}: {1}", style, styles[style].Count);
}
foreach (ObjectId id in tst)
{
TextStyleTableRecord tstr = (TextStyleTableRecord)tr.GetObject(id, OpenMode.ForRead);
pko.Message = String.Format("\nStyle: {0}\nKeep this style?", tstr.Name);
PromptResult pr = ed.GetKeywords(pko);
if (pr.Status != PromptStatus.OK)
{
ed.WriteMessage("\n{0}", pr.Status);
return;
}
switch (pr.StringResult)
{
case "Yes":
break;
case "No":
try
{
PromptKeywordOptions pko1
= new PromptKeywordOptions
("\nReplace with: "); foreach (string style in styles.Keys)
{
if (style != tstr.Name)
{
pko1.Keywords.Add(style);
}
}
PromptResult pr1 = ed.GetKeywords(pko1);
if (pr1.Status != PromptStatus.OK)
{
ed.WriteMessage("\npr1 status: {0}", pr1.Status);
throw new System.Exception("eBadReplacementSelection"); }
ObjectId newStyleId = tst[pr1.StringResult];
foreach (ObjectId txtId in styles[tstr.Name])
{
DBObject obj = tr.GetObject(txtId, OpenMode.ForWrite);
Entity ent = obj as Entity;
if (ent == null) continue;
DBText text = ent as DBText;
if (text != null)
{
text.TextStyleId = newStyleId;
continue;
}
MText mtxt = obj as MText;
if (mtxt != null)
{
mtxt.TextStyleId = newStyleId;
continue;
}
AttributeDefinition ad = ent as AttributeDefinition;
if (ad != null)
{
ad.TextStyleId = newStyleId;
continue;
}
AttributeReference ar = ent as AttributeReference;
if (ar != null)
{
ar.TextStyleId = newStyleId;
continue;
}
Dimension dim = ent as Dimension;
if (dim != null)
{
dim.TextStyleId = newStyleId;
continue;
}
MLeader mlead = ent as MLeader;
if (mlead != null)
{
mlead.TextStyleId = newStyleId;
continue;
}
Leader lead = ent as Leader;
if (lead != null)
{
lead.TextStyleId = newStyleId;
continue;
}
ed.WriteMessage("\nType: {0} was not handled", ent.GetType());
}
if (db.Textstyle == tstr.ObjectId)
db.Textstyle = newStyleId;
styles.Remove(tstr.Name);
tstr.UpgradeOpen();
tstr.Erase();
}
catch (System.Exception e)
{
ed.WriteMessage("\nCould not erase {0}\nError: {1}", tstr.Name, e);
}
break;
default:
ed.WriteMessage("\nInvalid keyword error!");
break;
}
}
tr.Commit();
}
}