Again...
The recursive way allows to get the tree structure but using XrefGraphNode.Database doesn't allows to get an unresolved node children .
So I mixed the two previous ways, and write the result in an Xml file.
using System.Text;
using System.Xml;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using acadApp = Autodesk.AutoCAD.ApplicationServices.Application;
namespace XrefSample
{
public class XrefToXml
{
[CommandMethod("XR2XML")]
public static void XrefListToXml()
{
Document doc = acadApp.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
XrefGraph xrg = db.GetHostDwgXrefGraph(true);
using (GraphNodeCollection gnc = new GraphNodeCollection())
{
for (int i = 0; i < xrg.NumNodes; i++)
{
gnc.Add(xrg.GetXrefNode(i));
}
string dwgName = doc.Name;
string xmlName = dwgName.Substring(0, dwgName.LastIndexOf('.')) + ".xml";
XmlTextWriter writer = new XmlTextWriter(xmlName, Encoding.UTF8);
try
{
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement("host");
writer.WriteAttributeString("path", dwgName);
using (Transaction tr = db.TransactionManager.StartTransaction())
{
for (int i = 1; i < xrg.NumNodes; i++)
{
XrefGraphNode xrgn = xrg.GetXrefNode(i);
if (!xrgn.IsNested)
writeXmlElement(tr, writer, xrgn, xrg, gnc);
}
}
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Flush();
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
{
ed.WriteMessage("\nAutoCAD error: " + ex.Message + "\n" + ex.StackTrace);
}
catch (System.Exception ex)
{
ed.WriteMessage("\nSystem error: " + ex.Message + "\n" + ex.StackTrace);
}
finally
{
writer.Close();
}
}
}
private static void writeXmlElement(Transaction tr, XmlTextWriter writer, XrefGraphNode xrgn, XrefGraph xrg, GraphNodeCollection gnc)
{
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(xrgn.BlockTableRecordId, OpenMode.ForRead);
writer.WriteStartElement("xref");
writer.WriteAttributeString("path", btr.PathName);
writer.WriteAttributeString("status", getStatus(btr));
for (int i = 0; i < xrgn.NumOut; i++)
{
writeXmlElement(tr, writer, xrg.GetXrefNode(gnc.IndexOf(xrgn.Out(i))), xrg, gnc);
}
writer.WriteEndElement();
}
private static string getStatus(BlockTableRecord btr)
{
switch (btr.XrefStatus)
{
case XrefStatus.FileNotFound:
return "File not found";
case XrefStatus.Resolved:
return "Resolved";
case XrefStatus.Unloaded:
return "Unloaded";
case XrefStatus.Unreferenced:
return "Unreferenced";
default:
return "Unresolved";
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<host path="F:\DAO\Dessins\Theatre\Plan.dwg">
<xref path="F:\DAO\Dessins\Theatre\Rotonde.dwg" status="Resolved">
<xref path="F:\DAO\Dessins\Theatre\Mobilier.dwg" status="Resolved" />
</xref>
<xref path="F:\DAO\Dessins\Theatre\Theatre.DWG" status="Resolved">
<xref path="F:\DAO\Dessins\Theatre\Plateau.dwg" status="Resolved" />
<xref path="F:\DAO\Dessins\Theatre\Equipement.dwg" status="Unloaded">
<xref path="F:\DAO\Dessins\Theatre\Perches.dwg" status="Unreferenced" />
<xref path="F:\DAO\Dessins\Theatre\Passerelles.dwg" status="Resolved" />
</xref>
</xref>
<xref path="F:\DAO\Dessins\Theatre\Detail.dwg" status="Resolved">
<xref path="F:\DAO\Dessins\Theatre\Passerelles.dwg" status="Resolved" />
</xref>
</host>