This example shows how to add, modify, and remove custom data from a Circle.
//-------------------------------------------------------------- //Preconditions: // 1. Create a C# Windows console project. // 2. Copy and paste this example into the C# IDE. // 3. Add a reference to: // install_dir\APISDK\tlb\DraftSight.Interop.dsAutomation.dll // 4. Add references to System and System.Windows.Forms. // 5. Open the Immediate window. // 6. Start DraftSight and open a document. // 7. Click Start Debugging. // //Postconditions: // 1. Circle is constructed. // 2. Custom data is added to, modified, and removed from // the Circle. // 3. Examine the Immediate window to verify. //---------------------------------------------------------------- using System; using System.Runtime.InteropServices; using System.Windows.Forms; using System.Diagnostics; using DraftSight.Interop.dsAutomation;
namespace SetAndGetXData { class Program { private static DraftSight.Interop.dsAutomation.Application dsApp;
static void Main(string[] args) { //Connect to DraftSight application dsApp = (DraftSight.Interop.dsAutomation.Application)Marshal.GetActiveObject("DraftSight.Application"); dsApp.AbortRunningCommand(); // abort any command currently running in DraftSight to avoid nested commands
//Get active document Document dsDoc = dsApp.GetActiveDocument(); if (null == dsDoc) { MessageBox.Show("There are no open documents in DraftSight."); return; }
//Get model space Model dsModel = dsDoc.GetModel();
//Get sketch manager SketchManager dsSketchMgr = dsModel.GetSketchManager();
//Draw a Circle double centerX = 1, centerY = 1, centerZ = 0; double radius = 5; Circle dsCircle = dsSketchMgr.InsertCircle(centerX, centerY, centerZ, radius);
//Zoom to fit dsApp.Zoom(dsZoomRange_e.dsZoomRange_Fit, null, null);
//Add custom data to the Circle string applicationName = "CircleApp"; AddCustomDataToCircle(dsCircle, applicationName);
Debug.Print(Environment.NewLine + "Circle custom data..." + Environment.NewLine);
//Print custom data PrintCustomDataInfo(dsCircle.GetCustomData(applicationName));
//Change custom data CustomData dsCustomData = dsCircle.GetCustomData(applicationName); ChangeCustomData(dsCustomData);
//Apply the changed custom data to the Circle dsCircle.SetCustomData(applicationName, dsCustomData);
Debug.Print(Environment.NewLine + "Custom data changed..." + Environment.NewLine);
//Print custom data after changing it PrintCustomDataInfo(dsCircle.GetCustomData(applicationName));
//Remove all string values from custom data dsCustomData = dsCircle.GetCustomData(applicationName); DeleteStringDataFromCustomData(dsCustomData, dsCustomDataType_e.dsCustomDataType_String);
//Apply the changed custom data to the Circle dsCircle.SetCustomData(applicationName, dsCustomData);
Debug.Print(Environment.NewLine + "Removed all string values from custom data..." + Environment.NewLine);
//Print custom data after removing elements PrintCustomDataInfo(dsCircle.GetCustomData(applicationName));
//Delete custom data from the Circle dsCircle.DeleteCustomData(applicationName);
Debug.Print(Environment.NewLine + "The custom data for the circle is removed..." + Environment.NewLine);
//Print custom data after removing it from the Circle PrintCustomDataInfo(dsCircle.GetCustomData(applicationName));
}
private static void AddCustomDataToCircle(Circle dsCircle, string applicationName) { //Get custom data for the Circle CustomData dsCustomData = dsCircle.GetCustomData(applicationName);
//Clear existing custom data dsCustomData.Empty();
//Get the index int index = dsCustomData.GetDataCount();
//Add a description of the Circle as a string value to the custom data int markerForString = 1000; dsCustomData.InsertStringData(index, markerForString, "Circle entity");
//Get the next index index = dsCustomData.GetDataCount();
//Add custom data section to custom data CustomData dsInnerCustomData = dsCustomData.InsertCustomData(index);
//Get the next index index = dsInnerCustomData.GetDataCount();
//Get the center point of the Circle //and add it as point data to the custom data int markerForPoint = 1011; double centerX, centerY, centerZ; dsCircle.GetCenter(out centerX, out centerY, out centerZ); dsInnerCustomData.InsertPointData(index, markerForPoint, centerX, centerY, centerZ);
//Get the next index index = dsInnerCustomData.GetDataCount();
//Get the radius of the Circle //and add it as double data to the custom data int markerForDouble = 1040; double doubleValue = dsCircle.Radius; dsInnerCustomData.InsertDoubleData(index, markerForDouble, doubleValue);
//Get the next index index = dsInnerCustomData.GetDataCount();
//Add the layer name of Circle as layer name data //to custom data dsInnerCustomData.InsertLayerName(index, dsCircle.Layer);
//Get the next index index = dsInnerCustomData.GetDataCount();
//Add the name of the LineStyle of the Circle //as a string data to custom data dsInnerCustomData.InsertStringData(index, markerForString, dsCircle.LineStyle);
//Get the next index index = dsInnerCustomData.GetDataCount();
//Add Int16 data to custom data int markerForInt16 = 1070; Int16 intValue = 5; dsInnerCustomData.InsertInteger16Data(index, markerForInt16, intValue);
//Get the next index index = dsInnerCustomData.GetDataCount();
//Add Int32 data to custom data int markerForInt32 = 1071; Int32 int32Value = 7; dsInnerCustomData.InsertInteger32Data(index, markerForInt32, int32Value);
//Get the next index index = dsInnerCustomData.GetDataCount();
//Add the handle of the Circle as handle data to custom data dsInnerCustomData.InsertHandle(index, dsCircle.Handle);
//Get the next index index = dsInnerCustomData.GetDataCount();
//Add binary data to custom data byte[] binaryDataArray = new byte[] { 0, 1, 0, 1 }; dsInnerCustomData.InsertByteData(index, binaryDataArray);
//Set custom data dsCircle.SetCustomData(applicationName, dsCustomData); }
private static void DeleteStringDataFromCustomData(CustomData dsCustomData, dsCustomDataType_e dataType) { //Get custom data count int count = dsCustomData.GetDataCount();
for (int index = count - 1; index >= 0; --index) { //Get custom data type dsCustomDataType_e customDataType; dsCustomData.GetDataType(index, out customDataType);
if (customDataType == dataType) { //Delete custom data element dsCustomData.Delete(index); }
if (customDataType == dsCustomDataType_e.dsCustomDataType_CustomData) { //Get inner custom data CustomData dsInnerCustomData; dsCustomData.GetCustomData(index, out dsInnerCustomData);
DeleteStringDataFromCustomData(dsInnerCustomData, dataType); } } }
private static void ChangeCustomData(CustomData dsCustomData) { //Get custom data count int count = dsCustomData.GetDataCount();
for (int index = 0; index < count; ++index) { //Get custom data type dsCustomDataType_e dataType; dsCustomData.GetDataType(index, out dataType);
switch (dataType) { case dsCustomDataType_e.dsCustomDataType_BinaryData: { //Get binary data from custom data byte[] binaryDataArray = (byte[])dsCustomData.GetByteData(index);
//Check if binary data is not empty if (null != binaryDataArray) { for (int i = 0; i < binaryDataArray.Length; ++i) { binaryDataArray[i]++; }
//Set the updated binary data to custom data dsCustomData.SetByteData(index, binaryDataArray); }
break; } case dsCustomDataType_e.dsCustomDataType_CustomData: { //Get the inner custom data CustomData dsInnerCustomData; dsCustomData.GetCustomData(index, out dsInnerCustomData);
ChangeCustomData(dsInnerCustomData);
break; } case dsCustomDataType_e.dsCustomDataType_Double: { //Get double custom data double doubleValue; dsCustomData.GetDoubleData(index, out doubleValue);
//Change double value doubleValue += 1;
//Set the updated double value to custom data dsCustomData.SetDoubleData(index, doubleValue);
break; } case dsCustomDataType_e.dsCustomDataType_Integer16: { //Get Int16 custom data int intValue; dsCustomData.GetInteger16Data(index, out intValue);
//Change Int16 value intValue++;
//Set the updated Int16 value to custom data dsCustomData.SetInteger16Data(index, intValue);
break; } case dsCustomDataType_e.dsCustomDataType_Integer32: { //Get Int32 custom data Int32 intValue; dsCustomData.GetInteger32Data(index, out intValue);
//Change Int32 value intValue++;
//Set the updated Int32 value to custom data dsCustomData.SetInteger32Data(index, intValue);
break; } case dsCustomDataType_e.dsCustomDataType_Point: { //Get point custom data double x, y, z; dsCustomData.GetPointData(index, out x, out y, out z);
//Change point coordinates x += 2; y += 2; z += 2;
//Set the updated point coordinates to custom data dsCustomData.SetPointData(index, x, y, z);
break; } case dsCustomDataType_e.dsCustomDataType_String: { //Get string custom data string stringValue; dsCustomData.GetStringData(index, out stringValue);
//Modify string value stringValue += "_Changed";
//Set the updated string value to custom data dsCustomData.SetStringData(index, stringValue);
break; } default: break; } } }
private static void PrintCustomDataInfo(CustomData dsCustomData) { //Get custom data count int count = dsCustomData.GetDataCount(); Debug.Print("Custom data count:" + count.ToString());
for (int index = 0; index < count; ++index) { //Get custom data type dsCustomDataType_e dataType; dsCustomData.GetDataType(index, out dataType);
//Get custom data marker int marker; dsCustomData.GetDataMarker(index, out marker);
switch (dataType) { case dsCustomDataType_e.dsCustomDataType_BinaryData: { //Get binary data from custom data byte[] binaryDataArray = (byte[])dsCustomData.GetByteData(index); string binaryDataContent = string.Empty;
if (null == binaryDataArray) { binaryDataContent = "Empty"; } else { foreach (byte binaryData in binaryDataArray) { binaryDataContent += binaryData.ToString() + ","; } }
//Print custom data index, data type, marker, and binary value PrintCustomDataElement(index, dataType, marker, binaryDataContent);
break; } case dsCustomDataType_e.dsCustomDataType_CustomData: { //Get inner custom data CustomData dsGetCustomData; dsCustomData.GetCustomData(index, out dsGetCustomData);
PrintCustomDataInfo(dsGetCustomData);
break; } case dsCustomDataType_e.dsCustomDataType_Double: { //Get double value from custom data double doubleValue; dsCustomData.GetDoubleData(index, out doubleValue);
//Print custom data index, data type, marker and double value PrintCustomDataElement(index, dataType, marker, doubleValue);
break; } case dsCustomDataType_e.dsCustomDataType_Handle: { //Get handle value from custom data string handle = dsCustomData.GetHandleData(index);
//Print custom data index, data type, marker, and handle value PrintCustomDataElement(index, dataType, marker, handle);
break; } case dsCustomDataType_e.dsCustomDataType_Integer16: { int intValue; dsCustomData.GetInteger16Data(index, out intValue);
//Print custom data index, data type, marker, and Int16 value PrintCustomDataElement(index, dataType, marker, intValue);
break; } case dsCustomDataType_e.dsCustomDataType_Integer32: { Int32 intValue; dsCustomData.GetInteger32Data(index, out intValue);
//Print custom data index, data type, marker, and Int32 value PrintCustomDataElement(index, dataType, marker, intValue);
break; } case dsCustomDataType_e.dsCustomDataType_LayerName: { //Get layer name from custom data string layerName; dsCustomData.GetLayerName(index, out layerName);
//Print custom data index, data type, marker, and layer name value PrintCustomDataElement(index, dataType, marker, layerName);
break; } case dsCustomDataType_e.dsCustomDataType_Point: { //Get point coordinates from custom data double x, y, z; dsCustomData.GetPointData(index, out x, out y, out z);
//Print custom data index, data type, marker, and point values string pointCoordinates = x + "," + y + "," + z; PrintCustomDataElement(index, dataType, marker, pointCoordinates);
break; } case dsCustomDataType_e.dsCustomDataType_String: { //Get string value from custom data string stringValue; dsCustomData.GetStringData(index, out stringValue);
//Print custom data index, data type, marker, and string value PrintCustomDataElement(index, dataType, marker, stringValue);
break; } case dsCustomDataType_e.dsCustomDataType_Unknown: { //Print custom data index, data type, marker and value PrintCustomDataElement(index, dataType, marker, "Unknown value");
break; } default: break; } } }
private static void PrintCustomDataElement(int index, dsCustomDataType_e dataType, int marker, object customDataValue) { //Print custom data index, data type, marker and value string message = "Index: " + index.ToString(); message += " Data type: " + dataType.ToString(); message += " Marker: " + marker.ToString(); message += " Value: " + customDataValue.ToString();
Debug.Print(message); } } }