There are many ways to get all objects from db
Here is what you can to use, expand functionality
to your suit:
[CommandMethod("gall")]
public void GetAllFromDb()
{
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
ObjectIdCollection ids = new ObjectIdCollection();
using (Transaction tr = db.TransactionManager.StartOpenCloseTransaction())
{
for (long i = 0; i < db.Handseed.Value; i++)
{
ObjectId id = ObjectId.Null;
db.TryGetObjectId(new Handle(i), out id);
if (id != ObjectId.Null && !id.IsErased) ids.Add(id);
}
foreach (ObjectId id in ids)
{
DBObject obj = tr.GetObject(id, OpenMode.ForRead, false) as DBObject;
ed.WriteMessage("\nType of:\t{0}\t{1}\n", obj.GetRXClass().DxfName,id);
}
}
}
~'J'~
thanks a lot, let me try it
This code is working fine , no problem on that, but what i'm looking for is, how i can get all the objects user does, because i need to export all objects (lines, circles...etc) and in the xml, I will export all properties of those objects (air, length...etc)
thanks a lot of help
In this case better yet to use datextraction methods,
search for this on google or on "through the interface" web page:
http://through-the-interface.typepad.com/
there is an example in there
~'J'~
Here is my old code I've grabbed from Kean Walmsley
See if this helps
#region "System"
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Data;
using System.Timers;
using System.Windows.Forms;
#endregion
#region "AutoCAD Imports"
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DataExtraction;
#endregion
//--------------------------------------------------//
//' based on Kean Walmsley's example from there:
//' http://through-the-interface.typepad.com/through_the_interface/2008/04/extracting-data.html
[CommandMethod("extdata")]
public void ExtractData()
{
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
double starttime = 0;
double endtime = 0;
System.Windows.Forms.OpenFileDialog dialog = new System.Windows.Forms.OpenFileDialog();
dialog.CheckPathExists = true;
dialog.CheckPathExists = true;
dialog.DefaultExt = "dwg";
dialog.DereferenceLinks = true;
dialog.Multiselect = false;
dialog.Filter = "Drawing (*.dwg)|*.dwg|All files (*.*)|*.*";
dialog.Title = "Select drawing";
dialog.FilterIndex = 1;
if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.OK)
{
return;
}
string fname = dialog.FileName;
System.Timers.Timer _timer = new System.Timers.Timer();
_timer.Interval = 1000;
_timer.Start();
starttime = DateTime.Now.TimeOfDay.TotalMilliseconds;
try
{
//------------------------------------------------------------------------------------------------------
// following datatable easy to write to the any data file (Excel, Access etc)
System.Data.DataTable dataTable = extractLinesAndTexts(fname);
_timer.Stop();
//------------------------------------------------------------------------------------------------------
endtime = DateTime.Now.TimeOfDay.TotalMilliseconds;
//' write data to Lines.xml in the Debug folder
dataTable.WriteXml("LinesAndTexts.xml");
ed.WriteMessage("\nElapsed time: {0:f2} milliseconds" + "\n" + "Found {1} objects\n" , endtime - starttime, dataTable.Rows.Count);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString() + "\n" + ex.StackTrace);
}
//' Display the file
Process.Start("LinesAndTexts.xml", null);
}
public System.Data.DataTable extractLinesAndTexts(string fname)
{
System.Data.DataTable dataTable = new System.Data.DataTable();
System.Data.DataTable blkTable = new System.Data.DataTable();
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
List<string> tags = new List<string>();
if (!System.IO.File.Exists(fname))
{
ed.WriteMessage("\nDrawing file does not exist.\n");
return null;
}
IDxExtractionSettings es = new DxExtractionSettings();
IDxDrawingDataExtractor de = es.DrawingDataExtractor;
de.Settings.ExtractFlags = ExtractFlags.None | ExtractFlags.ModelSpaceOnly;
de.Settings.ExtractFlags = ExtractFlags.ExtractBlockOnly;
//'Or ExtractFlags.ModelSpaceOnly
IDxFileReference fr = new DxFileReference(Path.GetDirectoryName(fname), fname);
de.Settings.DrawingList.AddFile(fr);
// Scan the drawing for object types & their properties
de.DiscoverTypesAndProperties(Path.GetDirectoryName(fname));
List<IDxTypeDescriptor> types = de.DiscoveredTypesAndProperties;
// Select all the types and properties for extraction
// by adding them one-by-one to these two lists
List<string> selTypes = new List<string>();
List<string> selProps = new List<string>();
foreach (IDxTypeDescriptor type in types)
{
selTypes.Add(type.GlobalName);
foreach (IDxPropertyDescriptor pr in type.Properties)
{
if (!selProps.Contains(pr.GlobalName))
{
selProps.Add(pr.GlobalName);
}
}
}
de.Settings.SetSelectedTypesAndProperties(types, selTypes, selProps);
// Now perform the extraction itself
de.ExtractData(Path.GetDirectoryName(fname));
// Get the results of the extraction
dataTable = de.ExtractedData;
if (dataTable.Rows.Count > 0)
{
dataTable.TableName = "LinesAndTexts";
DataRow[] selrows = dataTable.Select("AcDxObjectTypeGlobalName Like '%Line' Or AcDxObjectTypeGlobalName Like '%Text' Or AcDxObjectTypeGlobalName Like '%MText'");
blkTable = dataTable.Clone();
foreach (DataRow dr in selrows)
{
blkTable.ImportRow(dr);
}
//' commented code lines is just for populating a form listBox control:
//Dim columns As String() = New String() {"AcDxObjectTypeName"}
//Dim dvw As DataView = blkTable.DefaultView
//distinctTable = dvw.ToTable(False, columns)
//Dim bnames As New List(Of String)()
//For Each dr As System.Data.DataRow In distinctTable.Rows
// Dim bname As String = dr(0).ToString()
// If Not bnames.Contains(bname) Then
// bnames.Add(bname)
// End If
//Next
//Me.lst.DataSource = bnames'' <-- to fill ListBox only
//lst.SelectedIndex = -1'' <-- set selected items to nothing
}
return blkTable;
}
~'J'~