# Insert Splines Example (C#)

This example shows how to:

- construct several Splines, which are displayed as the Dassault Systèmes logo in a DraftSight drawing.
- fire events before and after commands are executed.
- select a group of entities and modify a member in that group of entities.
- execute a command using IApplication::RunCommand.

    //--------------------------------------------------------------
    // Preconditions:
    // 1. Create a C# Windows console project.
    // 2. Copy and paste this example into the C# IDE.
    // 3. Add a reference to the DraftSight type library,
    //    install_dir\APISDK\tlb\DraftSight.Interop.dsAutomation.dll.
    // 4. Add references to System and System.Windows.Forms.
    // 5. Start DraftSight.
    // 6. Press F5.
    //
    // Postconditions:
    // 1. CommandPreNotify event is fired. Click OK to close
    //    the message box.
    // 2. Click anywhere in the drawing when you are prompted
    //    in the command window to Click to insert a point
    //    for the lower-left corner for the 3DS logo.
    // 3. CommandPostNotify event is fired. Click OK to close
    //    the message box.
    // 4. The Dassault Systemes logo is constructed in the drawing.
    //    a. Examine the drawing to verify.
    //    b. Press F5 in the IDE.
    //       The Dassault Systemes logo's letter D is changed
    //       from blue to yellow.
    //    c. Press F5 to in the IDE.
    //       The Dassault Systemes logo's letter D is changed
    //       back to blue.
    //    d. Press F5 in the IDE.
    // 5. CommandPreNotify event is fired. Click OK to close the
    //    the message box.
    // 6. CommandPostNotify event is fired. Click OK to close the
    //    message box.
    // 7. The Dassault Systemes logo is deleted.
    //----------------------------------------------------------------
    using DraftSight.Interop.dsAutomation;
    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    static class Module1
    {

        static DraftSight.Interop.dsAutomation.Application dsApp = default(DraftSight.Interop.dsAutomation.Application);
        static string commandPreNotifyCommand = " ";
        static string commandPostNotifyCommand = " ";
        static Document dsDoc = default(Document);

        	public static void Main()
        	{

            		SketchManager dsSketchMgr;
            		SelectionManager dsSelectionManager;
            		SelectionFilter dsSelectionFilter;
            		EntityHelper dsEntityHelper;

    		// Connect to DraftSight
                      dsApp = (DraftSight.Interop.dsAutomation.Application)Marshal.GetActiveObject("DraftSight.Application");

                      // Abort any command currently running in DraftSight to
    		// avoid nested commands
    		dsApp.AbortRunningCommand();

            		//Set up dsApp events
            		AttachAppEventHandlers();

    		// Get command message object
    		CommandMessage dsCommandMessage = default(CommandMessage);
    		dsCommandMessage = dsApp.GetCommandMessage();

    		//Get active document
    		dsDoc = dsApp.GetActiveDocument();
    		if (dsDoc == null) {
    			MessageBox.Show("There are no open documents in DraftSight.");
    			return;
    		}

    		// Get model space
    		Model dsModel = default(Model);
    		dsModel = dsDoc.GetModel();

    		// Get Sketch Manager
    		dsSketchMgr = dsModel.GetSketchManager();

    		double x = 0;
    		double y = 0;
    		double z = 0;

    		// Prompt to insert the a point for lower-left corner of the 3DS logo
    		MathUtility dsMathUtility = default(MathUtility);
    		MathPlane dsMathPlane = default(MathPlane);
    		dsMathUtility = dsApp.GetMathUtility();
    		dsMathPlane = dsMathUtility.CreateXYPlane();
    		bool status = false;
            		string mssge = "Click to insert a point for the lower-left corner for the 3DS logo";
    		status = dsCommandMessage.PromptForPoint2(mssge, true, 0, 0, 0, out x, out y, out z, dsMathPlane);

    		double[] spArray1 = new double[27];
    		double[] spArray2 = new double[24];
    		double[] spArray3 = new double[18];

    		// Construct the D
    		spArray1[0] = x + 0.4513;
    		spArray1[1] = y + 0.3825;
    		spArray1[2] = z + 0.0;
    		spArray1[3] = x + 0.324;
    		spArray1[4] = y + 0.1912;
    		spArray1[5] = z + 0.0;
    		spArray1[6] = x + 0.1261;
    		spArray1[7] = y + 0.0932;
    		spArray1[8] = z + 0.0;
    		spArray1[9] = x + 0.2571;
    		spArray1[10] = y + 0.3839;
    		spArray1[11] = z + 0.0;
    		spArray1[12] = x + 0.0023;
    		spArray1[13] = y + 0.0086;
    		spArray1[14] = z + 0.0;
    		spArray1[15] = x + 0.2132;
    		spArray1[16] = y + 0.0711;
    		spArray1[17] = z + 0.0;
    		spArray1[18] = x + 0.5275;
    		spArray1[19] = y + 0.4664;
    		spArray1[20] = z + 0.0;
    		spArray1[21] = x + 0.428;
    		spArray1[22] = y + 0.5052;
    		spArray1[23] = z + 0.0;
    		spArray1[24] = x + 0.1237;
    		spArray1[25] = y + 0.4568;
    		spArray1[26] = z + 0.0;

    		Spline spline1 = default(Spline);
    		spline1 = dsSketchMgr.InsertSpline(spArray1, true, 0, 0, 0, 0, 0, 0);

    		// Construct the S
    		spArray2[0] = x + 0.4659;
    		spArray2[1] = y + 0.1472;
    		spArray2[2] = 0.0;
    		spArray2[3] = x + 0.8218;
    		spArray2[4] = y + 0.2052;
    		spArray2[5] = z + 0.0;
    		spArray2[6] = x + 0.6099;
    		spArray2[7] = y + 0.5472;
    		spArray2[8] = z + 0.0;
    		spArray2[9] = x + 0.7898;
    		spArray2[10] = y + 0.6372;
    		spArray2[11] = z + 0.0;
    		spArray2[12] = x + 0.9877;
    		spArray2[13] = y + 0.5952;
    		spArray2[14] = z + 0.0;
    		spArray2[15] = x + 0.7158;
    		spArray2[16] = y + 0.5472;
    		spArray2[17] = z + 0.0;
    		spArray2[18] = x + 0.9318;
    		spArray2[19] = y + 0.2232;
    		spArray2[20] = z + 0.0;
    		spArray2[21] = x + 0.7818;
    		spArray2[22] = y + 0.1112;
    		spArray2[23] = z + 0.0;

    		Spline spline2 = default(Spline);
    		spline2 = dsSketchMgr.InsertSpline(spArray2, true, 0, 0, 0, 0, 0, 0);

    		// Construct the 3
    		spArray3[0] = x + 0.6319;
    		spArray3[1] = y + 0.8672;
    		spArray3[2] = z + 0.0;
    		spArray3[3] = x + 0.33;
    		spArray3[4] = y + 0.9233;
    		spArray3[5] = z + 0.0;
    		spArray3[6] = x + 0.5;
    		spArray3[7] = y + 0.9642;
    		spArray3[8] = z + 0.0;
    		spArray3[9] = x + 0.7318;
    		spArray3[10] = y + 0.8952;
    		spArray3[11] = z + 0.0;
    		spArray3[12] = x + 0.6279;
    		spArray3[13] = y + 0.6892;
    		spArray3[14] = z + 0.0;
    		spArray3[15] = x + 0.369;
    		spArray3[16] = y + 0.5563;
    		spArray3[17] = z + 0.0;

    		Spline spline3 = default(Spline);
    		spline3 = dsSketchMgr.InsertSpline(spArray3, true, 0, 0, 0, 0, 0, 0);

    		// Set the colors for the logo
    		Color color1 = default(Color);
    		Color color2 = default(Color);
    		Color color3 = default(Color);

    		color1 = spline1.Color;
    		color2 = spline2.Color;
    		color3 = spline3.Color;

    		color1.SetNamedColor(dsNamedColor_e.dsNamedColor_Blue);
    		color2.SetNamedColor(dsNamedColor_e.dsNamedColor_Yellow);
    		color3.SetNamedColor(dsNamedColor_e.dsNamedColor_Red);

    		spline1.Color = color1;
    		spline2.Color = color2;
    		spline3.Color = color3;

           		// Examine the drawing to verify that
            		// the logo was created and that
            		// the letter D is blue, the
            		// letter S is yellow, and the non-letter
            		// is red

    		System.Diagnostics.Debugger.Break();
    	    	// Press F5 to change the colors of the logo

    	    	//Get Selection Manager
    	    	dsSelectionManager = dsDoc.GetSelectionManager();

    	    	//Get selection filter
    	    	dsSelectionFilter = dsSelectionManager.GetSelectionFilter();

    	    	//Clear selection filter
    	    	dsSelectionFilter.Clear();

    	    	//Add Spline entities to the selection filter
    	    	dsSelectionFilter.AddEntityType(dsObjectType_e.dsSplineType);

    	    	//Activate selection filter
    	    	dsSelectionFilter.Active = true;

    	    	//Get all layer names
    	    	string[] layerNames = GetLayers(dsDoc);

    	    	object entityType = null;
    	    	object entityObject = null;
            		object[] entityObjects = null;

    	    	//Get Spline entities
    	    	dsSketchMgr.GetEntities(dsSelectionFilter, layerNames, out entityType, out entityObject);
            		entityObjects = (object[])entityObject;

            		// Get EntityHelper
            		dsEntityHelper = (EntityHelper)dsApp.GetEntityHelper();

    	    	// Change the letter D in the logo from blue to yellow
    	    	dsEntityHelper.SetColor(entityObjects[0], color2);

    	    	System.Diagnostics.Debugger.Break();
    	    	// Examine the drawing to verify that
    	    	// the color of D has changed from blue to yellow
    	    	// Press F5 to continue

    	    	dsEntityHelper.SetColor(entityObjects[0], color1);

            		System.Diagnostics.Debugger.Break();
            		// Examine the drawing to verify that
            		// the color of D has changed back to blue
            		// Press F5 to delete the logo

    		int state;
            		state = (int)dsApp.RunCommand("DELETE ALL\n\n", false);

            		DetachEventHandlers();

>         }

>         //Attach dsApp event handlers
>         static public void AttachAppEventHandlers()
>         {
>             AttachAppEvents();
>         }

>         static public void AttachAppEvents()
>         {
>             dsApp.CommandPreNotify += new _IApplicationEvents_CommandPreNotifyEventHandler(CommandPreNotify);
>             dsApp.CommandPostNotify += new _IApplicationEvents_CommandPostNotifyEventHandler(CommandPostNotify);
>         }

>         //Detach all event handlers
>         static public void DetachEventHandlers()
>         {
>             dsApp.CommandPreNotify -= new _IApplicationEvents_CommandPreNotifyEventHandler(CommandPreNotify);
>             dsApp.CommandPostNotify -= new _IApplicationEvents_CommandPostNotifyEventHandler(CommandPostNotify);
>         }

>         static public void CommandPreNotify(string commandPreNotifyCommand, Document Document)
>         {
>             MessageBox.Show("CommandPreNotify event was fired before " + commandPreNotifyCommand + " was executed.");
>         }

>         static public void CommandPostNotify(string commandPostNotifyCommand, Document Document)
>         {
>             MessageBox.Show("CommandPostNotify event was fired after " + commandPostNotifyCommand + " was executed.");
>         }

>         private static string[] GetLayers(Document dsDoc)
>         {
>             //Get Layer Manager and Layer names
>             LayerManager dsLayerManager = dsDoc.GetLayerManager();

>             object[] dsLayers = (object[])dsLayerManager.GetLayers();

>             string[] layerNames = new string[dsLayers.Length];

>             for (int index = 0; index < dsLayers.Length; ++index)
>             {
>                 Layer dsLayer = dsLayers[index] as Layer;
>                 layerNames[index] = dsLayer.Name;
>             }

>                 return layerNames;
>          }

    }