C#
Objective-C
C++/CLI
public enum DicomAnnotationCompoundGraphicType
typedef NS_ENUM(NSInteger, LTDicomAnnotationCompoundGraphicType) {
LTDicomAnnotationCompoundGraphicTypeMultiLine = 6,
LTDicomAnnotationCompoundGraphicTypeInfiniteLine = 7,
LTDicomAnnotationCompoundGraphicTypeCutLine = 8,
LTDicomAnnotationCompoundGraphicTypeRangeLine = 9,
LTDicomAnnotationCompoundGraphicTypeRuler = 10,
LTDicomAnnotationCompoundGraphicTypeAxis = 11,
LTDicomAnnotationCompoundGraphicTypeCrossHair = 12,
LTDicomAnnotationCompoundGraphicTypeArrow = 13,
LTDicomAnnotationCompoundGraphicTypeRectangle = 14,
LTDicomAnnotationCompoundGraphicTypeEllipse = 5,
};
public enum class DicomAnnotationCompoundGraphicType
Value | Member | Description |
---|---|---|
5 | Ellipse | The "Compound Graphic Type" element (0070, 0294) contains the value "ELLIPSE" |
6 | MultiLine | The "Compound Graphic Type" element (0070, 0294) contains the value "MULTILINE" |
7 | InfiniteLine | The "Compound Graphic Type" element (0070, 0294) contains the value "INFINITELINE" |
8 | CutLine | The "Compound Graphic Type" element (0070, 0294) contains the value "CUTLINE" |
9 | RangeLine | The "Compound Graphic Type" element (0070, 0294) contains the value "RANGELINE" |
10 | Ruler | The "Compound Graphic Type" element (0070, 0294) contains the value "RULER" |
11 | Axis | The "Compound Graphic Type" element (0070, 0294) contains the value "AXIS" |
12 | CrossHair | The "Compound Graphic Type" element (0070, 0294) contains the value "CROSSHAIR" |
13 | Arrow | The "Compound Graphic Type" element (0070, 0294) contains the value "ARROW" |
14 | Rectangle | The "Compound Graphic Type" element (0070, 0294) contains the value "RECTANGLE" |
using Leadtools;
using Leadtools.Dicom;
///
// Creates a RULER compound graphic
private DicomCompoundGraphic CreateCompoundGraphicRuler(string layerName)
{
// Create a compound graphic
DicomCompoundGraphic compoundGraphic = new DicomCompoundGraphic();
compoundGraphic.LayerName = layerName;
compoundGraphic.Units = DicomAnnotationUnitsRelativityType.Pixel;
compoundGraphic.Type = DicomAnnotationCompoundGraphicType.Ruler;
DicomAnnotationPoint[] pts = new DicomAnnotationPoint[2];
pts[0] = new DicomAnnotationPoint(300, 100);
pts[1] = new DicomAnnotationPoint(450, 100);
compoundGraphic.SetAnnotationPoints(pts, pts.Length);
compoundGraphic.CompoundGraphicInstanceId = 100;
compoundGraphic.GraphicGroupId = 0;
compoundGraphic.RotationAngle = 0.0;
compoundGraphic.RotationPoint = new DicomAnnotationPoint(0, 0);
compoundGraphic.GapLength = 0.0f;
compoundGraphic.DiameterOfVisibility = 0;
compoundGraphic.TickAlignment = DicomAnnotationTickAlignmentType.Center;
compoundGraphic.TickLabelAlignment = DicomAnnotationTickLabelAlignmentType.Bottom;
compoundGraphic.ShowTickLabel = true;
compoundGraphic.Filled = false;
compoundGraphic.Options = DicomAnnotationOptions.Line | DicomAnnotationOptions.Text | DicomAnnotationOptions.CompoundGraphicInstanceId;
Debug.Assert(compoundGraphic.AnnotationPointCount == pts.Length);
// TextStyle
compoundGraphic.TextStyle = new DicomTextStyle();
compoundGraphic.TextStyle.TextOptions = DicomAnnotationTextOptions.FontName;
compoundGraphic.TextStyle.FontName = "Arial";
compoundGraphic.TextStyle.CssFontName = "serif";
compoundGraphic.TextStyle.TextColorCieLabValue = new ushort[3] { 34866, 53484, 50171 }; // Red
compoundGraphic.TextStyle.HorizontalAlign = DicomAnnotationHorizontalAlignmentType.Center;
compoundGraphic.TextStyle.VerticalAlign = DicomAnnotationVerticalAlignmentType.Center;
compoundGraphic.TextStyle.Shadow.ShadowStyle = DicomAnnotationShadowStyleType.Off;
compoundGraphic.TextStyle.Shadow.ShadowOffsetX = 0;
compoundGraphic.TextStyle.Shadow.ShadowOffsetY = 0;
compoundGraphic.TextStyle.Shadow.ShadowColorCieLabValue = new ushort[3] { 0, 0, 0 };
compoundGraphic.TextStyle.Shadow.ShadowOpacity = 0.0f;
compoundGraphic.TextStyle.Underlined = false;
compoundGraphic.TextStyle.Italic = false;
compoundGraphic.TextStyle.Bold = false;
// LineStyle
compoundGraphic.LineStyle = new DicomLineStyle();
compoundGraphic.LineStyle.LineOptions = DicomAnnotationLineOptions.None;
compoundGraphic.LineStyle.LineOptions = DicomAnnotationLineOptions.PatternOffColorCielabValue | DicomAnnotationLineOptions.PatternOffOpacity;
compoundGraphic.LineStyle.Shadow.ShadowStyle = DicomAnnotationShadowStyleType.Off;
compoundGraphic.LineStyle.Shadow.ShadowOpacity = 0.0f;
compoundGraphic.LineStyle.Shadow.ShadowOffsetX = 0.0f;
compoundGraphic.LineStyle.Shadow.ShadowOffsetY = 0.0f;
compoundGraphic.LineStyle.Shadow.ShadowColorCieLabValue = new ushort[3] { 0, 0, 0 };
compoundGraphic.LineStyle.PatternOnColorCieLabValue = new ushort[3] { 21169, 53249, 5175 }; // This is 'blue'
compoundGraphic.LineStyle.PatternOffColorCieLabValue = new ushort[3] { 0, 0, 0 };
compoundGraphic.LineStyle.LineThickness = 1.0f;
compoundGraphic.LineStyle.LineDashingStyle = DicomAnnotationDashStyleType.Solid;
compoundGraphic.LineStyle.LinePattern = 0xFFFF;
compoundGraphic.LineStyle.PatternOnOpacity = 1.0f;
compoundGraphic.LineStyle.PatternOffOpacity = 0.0f;
// RULER does not have a fill style
// Major Ticks Sequence
int nTickCount = 4;
float fTickIncrement = (float)(1.0 / (float)nTickCount);
compoundGraphic.MajorTicks.Clear();
for (int i = 0; i < nTickCount; i++)
{
// i * fTickIncrement represents DicomMajorTick.TickPosition
DicomMajorTick majorTickItem = new DicomMajorTick(i * fTickIncrement, "Label " + i.ToString());
compoundGraphic.MajorTicks.Add(majorTickItem);
}
Debug.Assert(compoundGraphic.MajorTickCount == 4);
return compoundGraphic;
}
// Creates a RECTANGLE compound graphic (rotated, filled)
private DicomCompoundGraphic CreateCompoundGraphicRectangle(string layerName)
{
// Create a compound graphic
DicomCompoundGraphic compoundGraphic = new DicomCompoundGraphic();
compoundGraphic.LayerName = layerName;
compoundGraphic.Units = DicomAnnotationUnitsRelativityType.Pixel;
compoundGraphic.Type = DicomAnnotationCompoundGraphicType.Rectangle;
DicomAnnotationPoint[] pts = new DicomAnnotationPoint[2];
pts[0] = new DicomAnnotationPoint(100, 100);
pts[1] = new DicomAnnotationPoint(200, 200);
compoundGraphic.SetAnnotationPoints(pts, pts.Length);
compoundGraphic.CompoundGraphicInstanceId = 200;
compoundGraphic.GraphicGroupId = 0;
compoundGraphic.RotationAngle = 45.0;
compoundGraphic.RotationPoint = new DicomAnnotationPoint(150, 150);
compoundGraphic.Filled = true;
compoundGraphic.Options = DicomAnnotationOptions.Fill | DicomAnnotationOptions.Line | DicomAnnotationOptions.CompoundGraphicInstanceId;
Debug.Assert(compoundGraphic.AnnotationPointCount == pts.Length);
// LineStyle
compoundGraphic.LineStyle = new DicomLineStyle();
compoundGraphic.LineStyle.LineOptions = DicomAnnotationLineOptions.None;
compoundGraphic.LineStyle.Shadow.ShadowStyle = DicomAnnotationShadowStyleType.Off;
compoundGraphic.LineStyle.Shadow.ShadowOpacity = 0.0f;
compoundGraphic.LineStyle.Shadow.ShadowOffsetX = 0.0f;
compoundGraphic.LineStyle.Shadow.ShadowOffsetY = 0.0f;
compoundGraphic.LineStyle.Shadow.ShadowColorCieLabValue = new ushort[3] { 1, 2, 3 };
compoundGraphic.LineStyle.PatternOnColorCieLabValue = new ushort[3] { 24886, 53484, 50171 }; // red
compoundGraphic.LineStyle.PatternOffColorCieLabValue = new ushort[3] { 0, 0, 0 };
compoundGraphic.LineStyle.LineThickness = 2.0f;
compoundGraphic.LineStyle.LineDashingStyle = DicomAnnotationDashStyleType.Solid;
compoundGraphic.LineStyle.LinePattern = 0xFFFF;
compoundGraphic.LineStyle.PatternOnOpacity = 1.0f;
compoundGraphic.LineStyle.PatternOffOpacity = 0.0f;
// FillStyle
compoundGraphic.FillStyle = new DicomFillStyle();
compoundGraphic.FillStyle.FillOptions = DicomAnnotationFillOptions.None;
compoundGraphic.FillStyle.PatternOnColorCieLabValue = new ushort[3] { 21169, 53249, 5175 }; // blue
compoundGraphic.FillStyle.PatternOffColorCieLabValue = new ushort[3] { 0, 0, 0 };
compoundGraphic.FillStyle.PatternOnOpacity = 1.0f;
compoundGraphic.FillStyle.PatternOffOpacity = 0.0f;
compoundGraphic.FillStyle.FillMode = DicomAnnotationFillModeType.Solid;
// To set a stippeled texture of the RECTANGLE compound graphic using DicomFillStyle.FillPattern, use this code:
// compoundGraphic.FillStyle.FillMode = DicomAnnotationFillModeType.Stippeled;
// compoundGraphic.FillStyle.FillPattern = new byte[128];
// .
// .
// .
return compoundGraphic;
}
private void DicomCompoundGraphicTest(string layerName, string outFile)
{
DicomDataSet ds = new DicomDataSet();
ds.Initialize(DicomClassType.GrayscaleSoftcopyPresentationState, DicomDataSetInitializeFlags.AddMandatoryModulesOnly | DicomDataSetInitializeFlags.AddMandatoryElementsOnly);
ds.CreateGraphicAnnSQItem(0, layerName);
DicomElement firstGraphicAnnSQItem = ds.FindFirstGraphicAnnSQItem();
DicomCompoundGraphic ruler = CreateCompoundGraphicRuler(layerName);
ds.CreateCompoundGraphic(firstGraphicAnnSQItem, ruler, false);
DicomCompoundGraphic rotatedFilledRectangle = CreateCompoundGraphicRectangle(layerName);
ds.CreateCompoundGraphic(firstGraphicAnnSQItem, rotatedFilledRectangle, false);
// Save the presentation state (with annotations)
ds.Save(outFile, DicomDataSetSaveFlags.None);
Console.WriteLine("Presentation State Saved: " + outFile);
// Find the second CompoundGraphicElement item -- this should be the rectangle
DicomElement element = ds.GetCompoundGraphicElement(firstGraphicAnnSQItem, 0);
string type = ds.GetValue<string>(element, false, DicomTag.CompoundGraphicType, string.Empty);
Debug.Assert(type == "RULER");
// Now we have two compound graphic items: ruler, rectangle
// Count should be 2
int nCount = ds.GetCompoundGraphicCount(firstGraphicAnnSQItem);
Debug.Assert(nCount == 2);
// Get the number of points of the first item (ruler) -- this should be 2
nCount = ds.GetCompoundGraphicPointCount(firstGraphicAnnSQItem, 0);
Debug.Assert(nCount == 2);
// Get the number of major ticks in the ruler -- this should be 4
nCount = ds.GetCompoundGraphicMajorTickCount(firstGraphicAnnSQItem, 0);
Debug.Assert(nCount == 4);
// Remove the first compound graphic (the ruler)
ds.RemoveCompoundGraphic(firstGraphicAnnSQItem, 0);
// Read the first compound graphic -- this should now be the rectangle
DicomCompoundGraphic compoundGraphic = ds.GetCompoundGraphicInformation(firstGraphicAnnSQItem, 0);
Debug.Assert(compoundGraphic.Type == DicomAnnotationCompoundGraphicType.Rectangle);
// Change the rectangle from filled, to non-filled
compoundGraphic.Filled = false;
ds.SetCompoundGraphicInformation(firstGraphicAnnSQItem, 0, compoundGraphic);
// Verify that the rectangle is non-filled
compoundGraphic = ds.GetCompoundGraphicInformation(firstGraphicAnnSQItem, 0);
Debug.Assert(compoundGraphic.Filled == false);
// Remove ALL compund graphics
ds.RemoveAllCompoundGraphics(firstGraphicAnnSQItem);
// Get the compound graphic count -- it should now be zero
nCount = ds.GetCompoundGraphicCount(firstGraphicAnnSQItem);
Debug.Assert(nCount == 0);
}