# Get and Set Block Definitions, Block Instances, and BlockAttribute Instances Example (C#)

This example shows how to get and set Block definitions, Block instances, and BlockAttribute instances.

    //--------------------------------------------------------------
    // 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. Start DraftSight and open a document.
    // 6. Review the code to see how Block definitions,
    //    Block instances, and BlockAttribute instances
    //    are modified.
    // 7. Start debugging the project.
    //
    // Postconditions: Block definitions, Block instances, and
    // BlockAttribute instances are modified. Message
    // boxes pop up when a Block-related entity does not exist.
    // Read the text in each message box before clicking OK to close it.
    //----------------------------------------------------------------
    using DraftSight.Interop.dsAutomation;
    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    static class Module1
    {

        public static void Main()
    	{
            	DraftSight.Interop.dsAutomation.Application dsApp;
    		Document dsDoc = default(Document);

    		//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
    		dsDoc = (Document)dsApp.GetActiveDocument();

    		if (dsDoc != null)
                    {
    			//Test Block definitions
    			TestBlockDefinitions(dsDoc);

    		}
                    else
                    {
    			MessageBox.Show("There are no open documents in DraftSight.");
    		}
    	}

        public static void TestBlockDefinitions(Document dsDoc)
        {
            object[] dsVarBlkDefinitions = null;
            BlockDefinition dsBlkDefinition = default(BlockDefinition);
            ExternalReference dsExtRef = default(ExternalReference);
            int index = 0;

            //Get all Block definitions in the drawing
            dsVarBlkDefinitions = (object[])dsDoc.GetBlockDefinitions();

            //Check if there are any Block definitions
            if (dsVarBlkDefinitions != null)
            {
                for (index = 0; index <= dsVarBlkDefinitions.Length - 1; index++)
                {
                    for (index = dsVarBlkDefinitions.GetLowerBound(0); index <= dsVarBlkDefinitions.GetUpperBound(0); index++)
                    {
                        dsBlkDefinition = (BlockDefinition)dsVarBlkDefinitions[index];

                        //Check if Block definition is a reference
                        dsExtRef = dsBlkDefinition.GetExternalReference();
                        if (dsExtRef != null)
                        {
                            MessageBox.Show(dsBlkDefinition.GetName() + " block definition is a reference.");
                        }
                        else
                        {
                            MessageBox.Show(dsBlkDefinition.GetName() + " block definition isn't a reference.");
                        }

                        //Test BlockAttribute definitions
                        TestAttributeDefinitions(dsBlkDefinition);

                        //Test Block instances
                        TestBlockInstances(dsBlkDefinition);

                    }

                }
            }
            else
            {
                MessageBox.Show("There are no Block definitions in \"" + dsDoc.GetPathName() + "\" document.");
            }
        }
        public static void TestAttributeDefinitions(BlockDefinition dsBlkDefinition)
        {
            object[] dsVarAttrDefinitions = null;
            AttributeDefinition dsAttrDefinition = default(AttributeDefinition);
            int index = 0;
            string attrDefCaption = null;
            string attrDefValue = null;
            string attrDefName = null;
            string newAttrCaptionValue = null;
            string newAttrDefValue = null;
            string newAttrDefName = null;

            //Get all BlockAttribute definitions in Block definition
            dsVarAttrDefinitions = (object[])dsBlkDefinition.GetAttributeDefinitions();

            //Check if there are any BlockAttribute definition

            if (dsVarAttrDefinitions != null)
            {

                for (index = dsVarAttrDefinitions.GetLowerBound(0); index <= dsVarAttrDefinitions.GetUpperBound(0); index++)
                {
                    dsAttrDefinition = (AttributeDefinition)dsVarAttrDefinitions[index];

                    //Get BlockAttribute definition caption and change
                    attrDefCaption = dsAttrDefinition.Caption;

                    //Change caption value
                    newAttrCaptionValue = dsAttrDefinition.Caption + "_Changed";
                    dsAttrDefinition.Caption = newAttrCaptionValue;

                    if (newAttrCaptionValue != dsAttrDefinition.Caption)
                    {
                        MessageBox.Show("The caption of '" + dsAttrDefinition.Name + "' BlockAttribute definition wasn't changed from '" + attrDefCaption + "' to '" + newAttrCaptionValue + "'.");
                    }

                    //Get BlockAttribute definition value
                    attrDefValue = dsAttrDefinition.Value;

                    //Change BlockAttribute definition value
                    newAttrDefValue = dsAttrDefinition.Value + "_Changed";
                    dsAttrDefinition.Value = newAttrDefValue;

                    if (newAttrDefValue != dsAttrDefinition.Value)
                    {
                        MessageBox.Show("The value of '" + dsAttrDefinition.Name + "' BlockAttribute definition wasn't changed from '" + attrDefValue + "' to '" + newAttrDefValue + "'.");
                    }

                    //Get BlockAttribute definition name
                    attrDefName = dsAttrDefinition.Name;

                    //Change BlockAttribute definition name
                    newAttrDefName = dsAttrDefinition.Name + "_Changed";
                    dsAttrDefinition.Name = newAttrDefName;

                    if (newAttrDefName != dsAttrDefinition.Name)
                    {
                        MessageBox.Show("The name of '" + dsAttrDefinition.Name + "' BlockAttribute definition wasn't changed from '" + attrDefName + "' to '" + newAttrDefName + "'.");
                    }

                }

            }
            else
            {
                MessageBox.Show("There are no BlockAttribute definitions in \"" + dsBlkDefinition.GetName() + "\" block definition.");
            }
        }
        public static void TestBlockInstances(BlockDefinition dsBlkDefinition)
        {
            object[] dsVarBlockInstances = null;
            BlockInstance dsBlockInstance = default(BlockInstance);
            BlockDefinition dsBlockDefinition = default(BlockDefinition);
            object Workspace = null;
            dsObjectType_e workSpaceType = default(dsObjectType_e);
            Sheet dsSheet = default(Sheet);
            Model dsModel = default(Model);
            int index = 0;

            //Get Block instances of Block definition
            dsVarBlockInstances = (object[])dsBlkDefinition.GetBlockInstances();

            //Check if there are any Block instances

            if (dsVarBlockInstances != null)
            {

                for (index = dsVarBlockInstances.GetLowerBound(0); index <= dsVarBlockInstances.GetUpperBound(0); index++)
                {
                    dsBlockInstance = (BlockInstance)dsVarBlockInstances[index];

                    //Test attribute instances
                    TestAttributeInstances(dsBlockInstance);

                    //Get Block definition from Block instance
                    dsBlockDefinition = dsBlockInstance.GetBlockDefinition();
                    if (dsBlockDefinition == null)
                    {
                        MessageBox.Show("GetBlockDefinition method returns Nothing for Block instance with ID=\"" + dsBlockInstance.GetID() + ".");
                    }

                    //Get working space
                    dsBlockInstance.GetWorkingSpace(out workSpaceType, out Workspace);

                    if (Workspace != null)
                    {
                        //If work space is sheet
                        if (workSpaceType == dsObjectType_e.dsSheetType)
                        {
                            dsSheet = (Sheet)Workspace;

                            if (dsSheet == null)
                            {
                                MessageBox.Show("GetWorkingSpace method returns dsSheetType type, but sheet object is Nothing.");
                            }

                        }
                        else if (workSpaceType == dsObjectType_e.dsModelType)
                        {
                            dsModel = (Model)Workspace;

                            if (dsModel == null)
                            {
                                MessageBox.Show("GetWorkingSpace method returns dsModelType type, but model object is Nothing.");
                            }

                        }

                    }
                    else
                    {
                        MessageBox.Show("GetWorkingSpace method returns Nothing for Block instance.");
                    }

                }

            }
            else
            {
                MessageBox.Show("There are no Block instances of \"" + dsBlkDefinition.GetName() + "\" Block definition.");
            }
        }

        public static void TestAttributeInstances(BlockInstance dsBlockInstance)
        {
            object[] dsVarAttrInstances = null;
            AttributeInstance dsAttrInstance = default(AttributeInstance);
            int index = 0;
            string attrInstanceName = null;
            string attrInstanceValue = null;
            string newAttrInstanceValue = null;

            //Get BlockAttribute instances
            dsVarAttrInstances = dsBlockInstance.GetAttributeInstances();

            //Check if there are any BlockAttribute instances

            if (dsVarAttrInstances != null)
            {

                for (index = dsVarAttrInstances.GetLowerBound(0); index <= dsVarAttrInstances.GetUpperBound(0); index++)
                {
                    dsAttrInstance = (AttributeInstance)dsVarAttrInstances[index];

                    //Get BlockAttribute instance name
                    attrInstanceName = dsAttrInstance.GetName();

                    //Get BlockAttribute instance value
                    attrInstanceValue = dsAttrInstance.Value;

                    //Change BlockAttribute instance value
                    newAttrInstanceValue = dsAttrInstance.Value + "_Changed";
                    dsAttrInstance.Value = newAttrInstanceValue;

                    if (newAttrInstanceValue != dsAttrInstance.Value)
                    {
                        MessageBox.Show("The value of the '" + dsAttrInstance.GetName() + "' instance wasn't changed from '" + attrInstanceValue + "' to '" + newAttrInstanceValue + "'.");
                    }

                    //Test general properties
                    TestAttributeInstanceGeneralProperties(dsAttrInstance);

                    //Select BlockAttribute instance
                    dsAttrInstance.Select(true);

                    //Deselect BlockAttribute instance
                    dsAttrInstance.Select(false);

                }

            }
            else
            {

                MessageBox.Show("There are no BlockAttribute instances in \"" + dsBlockInstance.GetBlockDefinition().GetName() + "\" Block instance.");
            }

        }
        public static void TestAttributeInstanceGeneralProperties(AttributeInstance dsAttrInstance)
        {
            string layer = null;
            string lineStyle = null;
            double lineScale = 0;
            double newLineScale = 0;
            double precision = 0;
            dsLineWeight_e lineWeight = default(dsLineWeight_e);
            dsLineWeight_e newLineWeight = default(dsLineWeight_e);
            bool visible = false;
            bool newVisibleValue = false;

            //Get layer name
            layer = dsAttrInstance.Layer;

            //Set the same layer
            dsAttrInstance.Layer = layer;

            //Get line scale
            lineScale = dsAttrInstance.LineScale;

            //Set line scale
            newLineScale = 8.6;
            dsAttrInstance.LineScale = newLineScale;

            precision = 1E-09;
            if (Math.Abs(newLineScale - dsAttrInstance.LineScale) > precision)
            {
                MessageBox.Show("The line scale of '" + dsAttrInstance.GetName() + "' attribute instance wasn't changed from '" + lineScale + "' to '" + newLineScale + "'.");
            }

            //Get line style
            lineStyle = dsAttrInstance.LineStyle;

            //Set the same line style
            dsAttrInstance.LineStyle = lineStyle;

            //Get line weight
            lineWeight = dsAttrInstance.LineWeight;

            //Set new line weight
            newLineWeight = dsLineWeight_e.dsLnWt_015;
            dsAttrInstance.LineWeight = newLineWeight;
            if (newLineWeight != dsAttrInstance.LineWeight)
            {
                MessageBox.Show("The line weight of '" + dsAttrInstance.GetName() + "' attribute instance wasn't changed from '" + lineWeight + "' to '" + newLineWeight + "'.");
            }

            //Get visible property
            visible = dsAttrInstance.Visible;

            //Set visible property
            newVisibleValue = !visible;
            dsAttrInstance.Visible = newVisibleValue;
            if (newVisibleValue != dsAttrInstance.Visible)
            {
                MessageBox.Show("The visible property of '" + dsAttrInstance.GetName() + "' attribute instance wasn't changed from '" + visible + "' to '" + newVisibleValue + "'.");
            }

        }

    }