Get and Set Block Definitions, Block Instances, and BlockAttribute Instances Example (VB.NET)
This example shows how to get and set Block definitions, Block
instances, and BlockAttribute instances.
'--------------------------------------------------------------
' Preconditions:
' 1. Create a VB.NET Windows console project.
' 2. Copy and paste this code into the VB.NET IDE.
' 3. Add a reference to:
' install_dir\APISDK\tlb\DraftSight.Interop.dsAutomation.dll.
' 4. Start DraftSight and open a document.
' 5. Review the macro to see how Block definitions,
' Block instances, and BlockAttribute instances
' are modified.
' 6. Start debugging the project.
'
' Postconditions: Block definitions, Block instances, and
' BlockAttribute instances are modified. Message
' boxes are popped up when a Block-related object does not exist.
' Read the text in each message box before clicking OK to close it.
'----------------------------------------------------------------
Imports DraftSight.Interop.dsAutomation
Module Module1
Sub Main()
Dim dsApp As Application
Dim dsDoc As Document
'Connect to DraftSight application
dsApp = GetObject(, "DraftSight.Application")
dsApp.AbortRunningCommand() ' abort any command currently running in DraftSight to avoid nested commands
'Get active document
dsDoc = dsApp.GetActiveDocument()
If Not dsDoc Is Nothing Then
'Test Block definitions
TestBlockDefinitions(dsDoc)
Else
MsgBox("There are no open documents in DraftSight.")
End If
End Sub
Sub TestBlockDefinitions(ByVal dsDoc As Document)
Dim dsVarBlkDefinitions As Object
Dim dsBlkDefinition As BlockDefinition
Dim dsExtRef As ExternalReference
Dim index As Integer
'Get all Block definitions in the drawing
dsVarBlkDefinitions = dsDoc.GetBlockDefinitions
'Check if there are any Block definitions
If IsArray(dsVarBlkDefinitions) Then
For index = LBound(dsVarBlkDefinitions) To UBound(dsVarBlkDefinitions)
dsBlkDefinition = dsVarBlkDefinitions(index)
'Check if Block definition is a reference
dsExtRef = dsBlkDefinition.GetExternalReference
If Not dsExtRef Is Nothing Then
MsgBox(dsBlkDefinition.GetName & " block definition is a reference.")
Else
MsgBox(dsBlkDefinition.GetName & " block definition isn't a reference.")
End If
'Test BlockAttribute definitions
TestAttributeDefinitions(dsBlkDefinition)
'Test Block instances
TestBlockInstances(dsBlkDefinition)
Next
Else
MsgBox("There are no Block definitions in """ & dsDoc.GetPathName & """ document.")
End If
End Sub
Sub TestAttributeDefinitions(ByVal dsBlkDefinition As BlockDefinition)
Dim dsVarAttrDefinitions As Object
Dim dsAttrDefinition As AttributeDefinition
Dim index As Integer
Dim attrDefCaption As String
Dim attrDefValue As String
Dim attrDefName As String
Dim newAttrCaptionValue As String
Dim newAttrDefValue As String
Dim newAttrDefName As String
'Get all BlockAttribute definitions in Block definition
dsVarAttrDefinitions = dsBlkDefinition.GetAttributeDefinitions
'Check if there are any BlockAttribute definition
If IsArray(dsVarAttrDefinitions) Then
For index = LBound(dsVarAttrDefinitions) To UBound(dsVarAttrDefinitions)
dsAttrDefinition = 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 Then
MsgBox("The caption of '" & dsAttrDefinition.Name + "' BlockAttribute definition wasn't changed from '" + attrDefCaption + "' to '" + newAttrCaptionValue + "'.")
End If
'Get BlockAttribute definition value
attrDefValue = dsAttrDefinition.Value
'Change BlockAttribute definition value
newAttrDefValue = dsAttrDefinition.Value & "_Changed"
dsAttrDefinition.Value = newAttrDefValue
If newAttrDefValue <> dsAttrDefinition.Value Then
MsgBox("The value of '" & dsAttrDefinition.Name + "' BlockAttribute definition wasn't changed from '" + attrDefValue + "' to '" + newAttrDefValue + "'.")
End If
'Get BlockAttribute definition name
attrDefName = dsAttrDefinition.Name
'Change BlockAttribute definition name
newAttrDefName = dsAttrDefinition.Name & "_Changed"
dsAttrDefinition.Name = newAttrDefName
If newAttrDefName <> dsAttrDefinition.Name Then
MsgBox("The name of '" & dsAttrDefinition.Name + "' BlockAttribute definition wasn't changed from '" + attrDefName + "' to '" + newAttrDefName + "'.")
End If
Next
Else
MsgBox("There are no BlockAttribute definitions in """ & dsBlkDefinition.GetName & """ block definition.")
End If
End Sub
Sub TestBlockInstances(ByVal dsBlkDefinition As BlockDefinition)
Dim dsVarBlockInstances As Object
Dim dsBlockInstance As BlockInstance
Dim dsBlockDefinition As BlockDefinition
Dim Workspace As Object = Nothing
Dim workSpaceType As dsObjectType_e
Dim dsSheet As Sheet
Dim dsModel As Model
Dim index As Integer
'Get Block instances of Block definition
dsVarBlockInstances = dsBlkDefinition.GetBlockInstances
'Check if there are any Block instances
If IsArray(dsVarBlockInstances) Then
For index = LBound(dsVarBlockInstances) To UBound(dsVarBlockInstances)
dsBlockInstance = dsVarBlockInstances(index)
'Test attribute instances
TestAttributeInstances(dsBlockInstance)
'Get Block definition from Block instance
dsBlockDefinition = dsBlockInstance.GetBlockDefinition
If dsBlockDefinition Is Nothing Then
MsgBox("GetBlockDefinition method returns Nothing for Block instance with ID=""" & dsBlockInstance.GetID & ".")
End If
'Get working space
dsBlockInstance.GetWorkingSpace(workSpaceType, Workspace)
If Not Workspace Is Nothing Then
'If work space is sheet
If workSpaceType = dsObjectType_e.dsSheetType Then
dsSheet = Workspace
If dsSheet Is Nothing Then
MsgBox("GetWorkingSpace method returns dsSheetType type, but sheet object is Nothing.")
End If
ElseIf workSpaceType = dsObjectType_e.dsModelType Then
dsModel = Workspace
If dsModel Is Nothing Then
MsgBox("GetWorkingSpace method returns dsModelType type, but model object is Nothing.")
End If
End If
Else
MsgBox("GetWorkingSpace method returns Nothing for Block instance.")
End If
Next
Else
MsgBox("There are no Block instances of """ & dsBlkDefinition.GetName & """ Block definition.")
End If
End Sub
Sub TestAttributeInstances(ByVal dsBlockInstance As BlockInstance)
Dim dsVarAttrInstances As Object
Dim dsAttrInstance As AttributeInstance
Dim index As Integer
Dim attrInstanceName As String
Dim attrInstanceValue As String
Dim newAttrInstanceValue As String
'Get BlockAttribute instances
dsVarAttrInstances = dsBlockInstance.GetAttributeInstances
'Check if there are any BlockAttribute instances
If IsArray(dsVarAttrInstances) Then
For index = LBound(dsVarAttrInstances) To UBound(dsVarAttrInstances)
dsAttrInstance = 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 Then
MsgBox("The value of the '" & dsAttrInstance.GetName + "' instance wasn't changed from '" + attrInstanceValue + "' to '" + newAttrInstanceValue + "'.")
End If
'Test general properties
TestAttributeInstanceGeneralProperties(dsAttrInstance)
'Select BlockAttribute instance
dsAttrInstance.Select(True)
'Deselect BlockAttribute instance
dsAttrInstance.Select(False)
Next
Else
MsgBox("There are no BlockAttribute instances in """ & dsBlockInstance.GetBlockDefinition.GetName & """ Block instance.")
End If
End Sub
Sub TestAttributeInstanceGeneralProperties(ByVal dsAttrInstance As AttributeInstance)
Dim layer As String
Dim lineStyle As String
Dim lineScale As Double
Dim newLineScale As Double
Dim precision As Double
Dim lineWeight As dsLineWeight_e
Dim newLineWeight As dsLineWeight_e
Dim visible As Boolean
Dim newVisibleValue As Boolean
'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 = 0.000000001
If Math.Abs(newLineScale - dsAttrInstance.LineScale) > precision Then
MsgBox("The line scale of '" & dsAttrInstance.GetName + "' attribute instance wasn't changed from '" + lineScale + "' to '" + newLineScale + "'.")
End If
'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 Then
MsgBox("The line weight of '" & dsAttrInstance.GetName + "' attribute instance wasn't changed from '" + lineWeight + "' to '" + newLineWeight + "'.")
End If
'Get visible property
visible = dsAttrInstance.visible
'Set visible property
newVisibleValue = Not visible
dsAttrInstance.visible = newVisibleValue
If newVisibleValue <> dsAttrInstance.Visible Then
MsgBox("The visible property of '" & dsAttrInstance.GetName + "' attribute instance wasn't changed from '" + visible + "' to '" + newVisibleValue + "'.")
End If
End Sub
End Module