Imports Leadtools
Imports Leadtools.Dicom
Imports Leadtools.Dicom.Annotations.Core
Imports Leadtools.Annotations.Core
Private Sub DicomAnnotationsUtilities_FromAnnContainerToDataSet(ByVal dsImage As DicomDataSet, ByVal outfilePresentationState As String)
' Create an AnnRectangleObject (rotated, filled)
Dim rectangleObject As New AnnRectangleObject()
rectangleObject.Stroke.Stroke = AnnSolidColorBrush.Create("red")
rectangleObject.Fill = AnnSolidColorBrush.Create("blue")
rectangleObject.Points.Add(GetLeadPointD(100, 100))
rectangleObject.Points.Add(GetLeadPointD(200, 100))
rectangleObject.Points.Add(GetLeadPointD(200, 200))
rectangleObject.Points.Add(GetLeadPointD(100, 200))
rectangleObject.Rotate(45.0, GetLeadPointD(150, 150))
' Create a pointer object
Dim pointerObject As New AnnPointerObject()
pointerObject.Stroke.Stroke = AnnSolidColorBrush.Create("red")
pointerObject.Points.Clear()
pointerObject.Points.Add(GetLeadPointD(300, 100))
pointerObject.Points.Add(GetLeadPointD(400, 200))
pointerObject.PointerPosition = AnnPointerPosition.End
' Create a ruler object
Dim polyRulerObject As New AnnPolyRulerObject()
polyRulerObject.Stroke.Stroke = AnnSolidColorBrush.Create("green")
polyRulerObject.Points.Add(GetLeadPointD(100, 300))
polyRulerObject.Points.Add(GetLeadPointD(200, 400))
polyRulerObject.Points.Add(GetLeadPointD(300, 300))
' Add them to the AnnContainer
Dim annContainer As New AnnContainer()
annContainer.Mapper = New AnnContainerMapper(96, 96, 96, 96)
annContainer.Children.Add(rectangleObject)
annContainer.Children.Add(pointerObject)
annContainer.Children.Add(polyRulerObject)
' Create a DicomDataSet
Dim dsPS As New DicomDataSet()
dsPS.Initialize(DicomClassType.GrayscaleSoftcopyPresentationState, DicomDataSetInitializeFlags.AddMandatoryModulesOnly Or DicomDataSetInitializeFlags.AddMandatoryElementsOnly)
' Delete the empty referenced Series Sequence
Dim referencedSeriesSequence As DicomElement = dsPS.FindFirstElement(Nothing, DicomTag.ReferencedSeriesSequence, True)
If referencedSeriesSequence IsNot Nothing Then
dsPS.DeleteElement(referencedSeriesSequence)
End If
' Add a new Referenced Series Sequence
dsPS.AddPresentationStateImageReference(dsImage, Nothing, 0)
' Set up the DicomAnnotationsUtilities converter
Dim du As New DicomAnnotationsUtilities()
du.ContainerMapper = annContainer.Mapper
du.DefaultObject = New DicomTextObject()
du.ImageDpiX = 96.0
du.ImageDpiY = 96.0
du.DisplayWidth = 200
du.DisplayHeight = 200
du.LayerName = "Layer 0"
AddHandler du.OnIncrementGraphicGroupId, AddressOf du_OnIncrementGraphicGroupId
AddHandler du.OnIncrementCompoundGraphicInstanceId, AddressOf du_OnIncrementCompoundGraphicInstanceId
' Convert LEAD annotations to DICOM annotations
Dim graphicAnnSequenceItem As DicomElement = du.FromAnnContainerToDataSet(dsPS, annContainer)
' Save the presentation state
dsPS.Save(outfilePresentationState, DicomDataSetSaveFlags.None)
' Now you can convert the presentation state dataset back to an AnnContainer
Dim annContainerNew As AnnContainer = du.FromDataSetToAnnContainer(dsPS, graphicAnnSequenceItem)
' There should be three objects
Debug.Assert(annContainerNew.Children.Count = 3)
MessageBox.Show("Presentation State Saved: " & outfilePresentationState)
End Sub
Private Function GetLeadPointD(ByVal x As Double, ByVal y As Double) As LeadPointD
Dim imageDpi As Double = 96.0
Return New LeadPointD(x * 720.0 / imageDpi, y * 720.0 / imageDpi)
End Function
' Override the default behavior of IncrementGraphicGroupId
Private Sub du_OnIncrementGraphicGroupId(ByVal sender As Object, ByVal e As EventArgs)
Dim du As DicomAnnotationsUtilities = TryCast(sender, DicomAnnotationsUtilities)
If du IsNot Nothing Then
du.GraphicGroupId = du.GraphicGroupId + 2
End If
End Sub
' Override the default behavior of IncrementGraphicInstanceId
Private Sub du_OnIncrementCompoundGraphicInstanceId(ByVal sender As Object, ByVal e As EventArgs)
Dim du As DicomAnnotationsUtilities = TryCast(sender, DicomAnnotationsUtilities)
If du IsNot Nothing Then
du.CompoundGraphicInstanceId = du.CompoundGraphicInstanceId + 10
End If
End Sub
using Leadtools;
using Leadtools.Dicom;
using Leadtools.Dicom.Annotations.Core;
using Leadtools.Annotations.Core;
private void DicomAnnotationsUtilities_FromAnnContainerToDataSet(DicomDataSet dsImage, string outfilePresentationState)
{
// Create an AnnRectangleObject (rotated, filled)
AnnRectangleObject rectangleObject = new AnnRectangleObject();
rectangleObject.Stroke.Stroke = AnnSolidColorBrush.Create("red");
rectangleObject.Fill = AnnSolidColorBrush.Create("blue");
rectangleObject.Points.Add(GetLeadPointD(100,100));
rectangleObject.Points.Add(GetLeadPointD(200,100));
rectangleObject.Points.Add(GetLeadPointD(200,200));
rectangleObject.Points.Add(GetLeadPointD(100,200));
rectangleObject.Rotate(45.0, GetLeadPointD(150,150));
// Create a pointer object
AnnPointerObject pointerObject = new AnnPointerObject();
pointerObject.Stroke.Stroke = AnnSolidColorBrush.Create("red");
pointerObject.Points.Clear();
pointerObject.Points.Add(GetLeadPointD(300, 100));
pointerObject.Points.Add(GetLeadPointD(400,200));
pointerObject.PointerPosition = AnnPointerPosition.End;
// Create a ruler object
AnnPolyRulerObject polyRulerObject = new AnnPolyRulerObject();
polyRulerObject.Stroke.Stroke = AnnSolidColorBrush.Create("green");
polyRulerObject.Points.Add(GetLeadPointD(100, 300));
polyRulerObject.Points.Add(GetLeadPointD(200,400));
polyRulerObject.Points.Add(GetLeadPointD(300,300));
// Add them to the AnnContainer
AnnContainer annContainer = new AnnContainer();
annContainer.Mapper = new AnnContainerMapper(96, 96, 96, 96);
annContainer.Children.Add(rectangleObject);
annContainer.Children.Add(pointerObject);
annContainer.Children.Add(polyRulerObject);
// Create a DicomDataSet
DicomDataSet dsPS = new DicomDataSet();
dsPS.Initialize(DicomClassType.GrayscaleSoftcopyPresentationState, DicomDataSetInitializeFlags.AddMandatoryModulesOnly | DicomDataSetInitializeFlags.AddMandatoryElementsOnly);
// Delete the empty referenced Series Sequence
DicomElement referencedSeriesSequence = dsPS.FindFirstElement(null, DicomTag.ReferencedSeriesSequence, true);
if (referencedSeriesSequence != null)
{
dsPS.DeleteElement(referencedSeriesSequence);
}
// Add a new Referenced Series Sequence
dsPS.AddPresentationStateImageReference(dsImage, null, 0);
// Set up the DicomAnnotationsUtilities converter
DicomAnnotationsUtilities du = new DicomAnnotationsUtilities();
du.ContainerMapper = annContainer.Mapper;
du.DefaultObject = new DicomTextObject();
du.ImageDpiX = 96.0;
du.ImageDpiY = 96.0;
du.DisplayWidth = 200;
du.DisplayHeight = 200;
du.LayerName = "Layer 0";
du.OnIncrementGraphicGroupId += new EventHandler(du_OnIncrementGraphicGroupId);
du.OnIncrementCompoundGraphicInstanceId += new EventHandler(du_OnIncrementCompoundGraphicInstanceId);
// Convert LEAD annotations to DICOM annotations
DicomElement graphicAnnSequenceItem = du.FromAnnContainerToDataSet(dsPS, annContainer);
// Save the presentation state
dsPS.Save(outfilePresentationState, DicomDataSetSaveFlags.None);
// Now you can convert the presentation state dataset back to an AnnContainer
AnnContainer annContainerNew = du.FromDataSetToAnnContainer(dsPS, graphicAnnSequenceItem);
// There should be three objects
Debug.Assert(annContainerNew.Children.Count == 3);
MessageBox.Show("Presentation State Saved: " + outfilePresentationState);
}
LeadPointD GetLeadPointD(double x, double y)
{
double imageDpi = 96.0;
return new LeadPointD(x * 720.0 / imageDpi , y * 720.0 / imageDpi );
}
// Override the default behavior of IncrementGraphicGroupId
void du_OnIncrementGraphicGroupId(object sender, EventArgs e)
{
DicomAnnotationsUtilities du = sender as DicomAnnotationsUtilities;
if (du != null)
{
du.GraphicGroupId = du.GraphicGroupId + 2;
}
}
// Override the default behavior of IncrementGraphicInstanceId
void du_OnIncrementCompoundGraphicInstanceId(object sender, EventArgs e)
{
DicomAnnotationsUtilities du = sender as DicomAnnotationsUtilities;
if (du != null)
{
du.CompoundGraphicInstanceId = du.CompoundGraphicInstanceId + 10;
}
}