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; 
   } 
}