Message 1 of 5
FDO object properties through GetEntity
Not applicable
07-04-2011
05:28 AM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hi all! I have some trouble - now I developing some library for Autocad Civil 3D 2011: we are have connect to MS SQL Server base with some tables - it's our layers with geometry and some other columns. When user press button on our panel - we have opportunity select one FDO object on our map. After this our library will show layer name of selected object and names and values of other columns in table of selected object:
[CommandMethod("SHOWPROP")]
public static void ShowProperties()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
MgFeatureReader reader = null;
try
{
// Ask the user to select FDO object
PromptEntityOptions peo =
new PromptEntityOptions("\nSelect FDO object");
peo.SetRejectMessage("\nMust be a FDO object.");
peo.AllowNone = false;
PromptEntityResult per = ed.GetEntity(peo);
if (per.Status != PromptStatus.OK)
return;
ObjectId srcId = per.ObjectId;
Transaction tr =
doc.TransactionManager.StartTransaction();
using (tr)
{
AcMapMap currentMap = AcMapMap.GetCurrentMap();
MgLayerCollection LayerCol = currentMap.GetLayers();
Autodesk.Gis.Map.Platform.AcMapLayer maplayer=null;
if (per.ObjectId != ObjectId.Null)
{
DBObject obj = tr.GetObject(per.ObjectId, OpenMode.ForRead);
if (obj != null)
{
ed.WriteMessage("\n" + "Type: " + obj.GetType().ToString());
ed.WriteMessage("\n" + "RXClassName: " + obj.GetRXClass().Name.ToString());
ed.WriteMessage("\n" + obj.Database.GeoDataObject.ToString());
Entity ent = (Entity)tr.GetObject(srcId, OpenMode.ForRead);
ed.WriteMessage("\n" + AcMapFeatureEntityService.GetLayer(per.ObjectId).ToString());
maplayer = AcMapFeatureEntityService.GetLayer(per.ObjectId);
ed.WriteMessage("\n" + "Layer name: " + maplayer.Name);
ed.WriteMessage("\n" + "Layer: " + maplayer.FeatureClassName.ToString());
//I don't know how initialize reader :(
//reader = ?????
MgClassDefinition classDef = maplayer.GetClassDefinition();
MgPropertyDefinitionCollection propertyDefs = classDef.GetProperties();
foreach (MgPropertyDefinition propertyDef in propertyDefs)
{
if (propertyDef.Name != ClassSystemProperties.SessionId)
{
switch (propertyDef.GetPropertyType())
{
case MgFeaturePropertyType.DataProperty:
MgDataPropertyDefinition dataProp = propertyDef as MgDataPropertyDefinition;
if (dataProp != null)
{
// Set default value.
string value = "(null)";
// Reads the value from featureReader according to DataType.
switch (dataProp.GetDataType())
{
case MgPropertyType.String:
//Next string not work :(
//value = reader.GetString(propertyDef.Name);
break;
case MgPropertyType.Double:
//Next string not work :(
//value = reader.GetDouble(propertyDef.Name).ToString();
break;
case MgPropertyType.Int16:
//Next string not work :(
//value = reader.GetInt16(propertyDef.Name).ToString();
break;
case MgPropertyType.Int32:
//Next string not work :(
//value = reader.GetInt32(propertyDef.Name).ToString();
break;
case MgPropertyType.Int64:
//Next string not work :(
//value = reader.GetInt64(propertyDef.Name).ToString();
break;
case MgPropertyType.Boolean:
//Next string not work :(
//value = reader.GetBoolean(propertyDef.Name).ToString();
break;
default:
break;
}
//Util.PrintLn(propertyDef.Name + " = " + value);
ed.WriteMessage("\n" + propertyDef.Name + " = " + value);
}
break;
case MgFeaturePropertyType.AssociationProperty:
break;
default:
break;
}
}
}
}
}
tr.Commit();
}
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
{
ed.WriteMessage("\nException: {0}", ex.Message);
}
}
I know - somebody will say - "see Feature Inspector code in ObjectARX SDK!" but this example not suitable for this case. I do not have selected area on my map and old ideas for initialize FeatureReader not work 😞 Please, help somebody.
P.S. Sorry for my English