Ejemplo n.º 1
0
 public DicomNGetRequest(
     DicomUID requestedClassUid,
     DicomUID requestedInstanceUid)
     : base(DicomCommandField.NGetRequest, requestedClassUid)
 {
     SOPInstanceUID = requestedInstanceUid;
 }
Ejemplo n.º 2
0
 /// <summary>
 /// Add item for creating extended negotiation sub-items.
 /// </summary>
 /// <param name="uid">Associated UID.</param>
 /// <param name="creator">Creator instance.</param>
 public static void AddSubItemCreator(DicomUID uid, CreateIExtendedNegotiationSubItemDelegate creator)
 {
     if (false == subItemCreators.ContainsKey(uid))
     {
         subItemCreators.Add(uid, creator);
     }
 }
Ejemplo n.º 3
0
 public DicomPresentationContext(byte pcid, DicomUID abstractSyntax)
 {
     _pcid = pcid;
     _result = DicomPresentationContextResult.Proposed;
     _abstract = abstractSyntax;
     _transferSyntaxes = new List<DicomTransferSyntax>();
 }
Ejemplo n.º 4
0
		internal DicomPresentationContext(byte pcid, DicomUID abstractSyntax, DicomTransferSyntax transferSyntax, DicomPresentationContextResult result) {
			_pcid = pcid;
			_result = result;
			_abstract = abstractSyntax;
			_transferSyntaxes = new List<DicomTransferSyntax>();
			_transferSyntaxes.Add(transferSyntax);
		}
Ejemplo n.º 5
0
 /// <summary>
 /// Initializes new Basic Film Box
 /// </summary>
 /// <param name="session">Basic Film Session</param>
 /// <param name="sopInstance">SOP Instance UID</param>
 /// <param name="dataset">Dataset</param>
 public DcmFilmBox(DcmFilmSession session, DicomUID sopInstance, DcmDataset dataset)
 {
     _session = session;
     _sopInstance = sopInstance;
     _dataset = dataset;
     _boxes = new List<DcmImageBox>();
 }
Ejemplo n.º 6
0
        private List<UpdateData> generateUpdateObjectList(string studyDir)
        {
            toolstripStatuslbl.Text = "Preparing files for anonymization";

            Random randomNumber = new Random();
            List<UpdateData> updateList = new List<UpdateData>();

            //Set Study ID
            _studyID = DicomUID.Generate();

            //Set Patient ID and Accession Number based on user random request
            if (chkbxRandomPatientId.Checked == true)
            {
                _patientId = randomNumber.Next(1000, 99999).ToString();
            }

            if (chkbxRandomAccessionNumber.Checked == true)
            {
                _accessionNumber = randomNumber.Next(1000, 99999).ToString();
            }

            foreach (string dcmFile in Directory.GetFiles(studyDir, "*", SearchOption.AllDirectories))
            {
                if(dcmFile.EndsWith(".dcm"))
                {
                    int seriesNumber = getSeriesNumberFromDcm(dcmFile);
                    updateList.Add(createUpdateObject(dcmFile, seriesNumber));
                }
            }
            return updateList;
        }
Ejemplo n.º 7
0
 public DicomNCreateRequest(
     DicomUID affectedClassUid,
     DicomUID affectedInstanceUid)
     : base(DicomCommandField.NCreateRequest, affectedClassUid)
 {
     SOPInstanceUID = affectedInstanceUid;
 }
Ejemplo n.º 8
0
 /// <summary>
 /// Initializes new Basic Film Box
 /// </summary>
 /// <param name="session">Basic Film Session</param>
 /// <param name="sopInstance">SOP Instance UID</param>
 public DcmFilmBox(DcmFilmSession session, DicomUID sopInstance)
 {
     _session = session;
     _sopInstance = sopInstance;
     _dataset = new DcmDataset(DicomTransferSyntax.ImplicitVRLittleEndian);
     _boxes = new List<DcmImageBox>();
 }
Ejemplo n.º 9
0
		protected DicomRequest(DicomCommandField type, DicomUID affectedClassUid, DicomPriority priority) : base() {
			Type = type;
			SOPClassUID = affectedClassUid;
			MessageID = GetNextMessageID();
			Priority = priority;
			Dataset = null;
		}
Ejemplo n.º 10
0
        /// <summary>
        /// Construct new film session from scratch
        /// </summary>
        public FilmSession(DicomUID sopClassUID, DicomUID sopInstance = null, bool isColor = false)
            : base()
        {
            this.InternalTransferSyntax = DicomTransferSyntax.ExplicitVRLittleEndian;
            if (sopClassUID == null)
            {
                throw new ArgumentNullException("sopClassUID");
            }

            SOPClassUID = sopClassUID;

            if (sopInstance == null || sopInstance.UID == string.Empty)
            {
                SOPInstanceUID = DicomUID.Generate();
            }
            else
            {
                SOPInstanceUID = sopInstance;

            }

            this.Add(DicomTag.SOPClassUID, SOPClassUID);
            this.Add(DicomTag.SOPInstanceUID, SOPInstanceUID);

            BasicFilmBoxes = new List<FilmBox>();
            PresentationLuts = new List<PresentationLut>();

            IsColor = isColor;
        }
Ejemplo n.º 11
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DicomRequest"/> class.
 /// </summary>
 /// <param name="type">
 /// The command field type.
 /// </param>
 /// <param name="requestedClassUid">
 /// The requested Class Uid.
 /// </param>
 protected DicomRequest(DicomCommandField type, DicomUID requestedClassUid)
 {
     Type = type;
     SOPClassUID = requestedClassUid;
     MessageID = GetNextMessageID();
     Dataset = null;
 }
Ejemplo n.º 12
0
 public PresentationLut(DicomUID sopInstance, DicomDataset dataset)
 {
     if (dataset == null)
     {
         throw new ArgumentNullException("dataset");
     }
     dataset.CopyTo(this);
 }
Ejemplo n.º 13
0
 public DicomNDeleteRequest(
     DicomUID requestedClassUid,
     DicomUID requestedInstanceUid,
     DicomPriority priority = DicomPriority.Medium)
     : base(DicomCommandField.NDeleteRequest, requestedClassUid, priority)
 {
     SOPInstanceUID = requestedInstanceUid;
 }
Ejemplo n.º 14
0
 public DicomNGetRequest(
     DicomUID requestedClassUid,
     DicomUID requestedInstanceUid,
     DicomTag[] attributes,
     DicomPriority priority = DicomPriority.Medium)
     : base(DicomCommandField.NGetRequest, requestedClassUid, priority)
 {
     SOPInstanceUID = requestedInstanceUid;
 }
Ejemplo n.º 15
0
 public DicomNCreateRequest(
     DicomUID affectedClassUid,
     DicomUID affectedInstanceUid,
     ushort eventTypeId,
     DicomPriority priority = DicomPriority.Medium)
     : base(DicomCommandField.NCreateRequest, affectedClassUid, priority)
 {
     SOPInstanceUID = affectedInstanceUid;
 }
Ejemplo n.º 16
0
 public DicomNEventReportRequest(
     DicomUID requestedClassUid,
     DicomUID requestedInstanceUid,
     ushort eventTypeId)
     : base(DicomCommandField.NEventReportRequest, requestedClassUid)
 {
     SOPInstanceUID = requestedInstanceUid;
     EventTypeID = eventTypeId;
 }
Ejemplo n.º 17
0
 public DicomNActionRequest(
     DicomUID requestedClassUid,
     DicomUID requestedInstanceUid,
     ushort actionTypeId)
     : base(DicomCommandField.NActionRequest, requestedClassUid)
 {
     SOPInstanceUID = requestedInstanceUid;
     ActionTypeID = actionTypeId;
 }
Ejemplo n.º 18
0
 public DicomNActionRequest(
     DicomUID requestedClassUid,
     DicomUID requestedInstanceUid,
     ushort actionTypeId,
     DicomPriority priority = DicomPriority.Medium)
     : base(DicomCommandField.NActionRequest, requestedClassUid, priority)
 {
     SOPInstanceUID = requestedInstanceUid;
     ActionTypeID = actionTypeId;
 }
Ejemplo n.º 19
0
        /// <summary>
        /// Construct new film session for specified SOP instance UID
        /// </summary>
        /// <param name="sopInstance">Film session SOP instance UID</param>
        /// <param name="dataset">Film session dataset</param>
        public FilmSession(DicomUID sopClassUID, DicomUID sopInstance, DicomDataset dataset, bool isColor = false)
            : this(sopClassUID, sopInstance)
        {
            if (dataset == null)
            {
                throw new ArgumentNullException("dataset");
            }
            dataset.CopyTo(this);

            this.InternalTransferSyntax = dataset.InternalTransferSyntax;
            IsColor = isColor;
        }
Ejemplo n.º 20
0
 public PresentationLut(DicomUID sopInstance = null)
     : base()
 {
     this.InternalTransferSyntax = DicomTransferSyntax.ExplicitVRLittleEndian;
     if (sopInstance == null || sopInstance.UID == string.Empty)
     {
         SopInstanceUid = DicomUID.Generate();
     }
     else
     {
         SopInstanceUid = sopInstance;
     }
     CreateLutSequence();
 }
Ejemplo n.º 21
0
        /// <summary>
        /// Create baisc film box for specified film session
        /// </summary>
        /// <param name="filmSession">Film session instance</param>
        /// <param name="sopInstance">Basic film box SOP Instance UID</param>
        public FilmBox(FilmSession filmSession, DicomUID sopInstance, DicomTransferSyntax transferSyntax)
            : base()
        {
            this.InternalTransferSyntax = transferSyntax;
            _filmSession = filmSession;
            if (sopInstance == null || sopInstance.UID == string.Empty)
            {
                SOPInstanceUID = DicomUID.Generate();
            }
            else
            {
                SOPInstanceUID = sopInstance;
            }
            this.Add(DicomTag.SOPClassUID, SOPClassUID);
            this.Add(DicomTag.SOPInstanceUID, SOPInstanceUID);

            BasicImageBoxes = new List<ImageBox>();
        }
Ejemplo n.º 22
0
        /// <summary>
        /// Construct new ImageBox for specified filmBox using specified SOP class UID and SOP instance UID
        /// </summary>
        /// <param name="filmBox"></param>
        /// <param name="sopClass"></param>
        /// <param name="sopInstance"></param>
        public ImageBox(FilmBox filmBox, DicomUID sopClass, DicomUID sopInstance)
            : base()
        {
            this.InternalTransferSyntax = DicomTransferSyntax.ExplicitVRLittleEndian;
            FilmBox = filmBox;
            SOPClassUID = sopClass;
            if (sopInstance == null || sopInstance.UID == string.Empty)
            {
                SOPInstanceUID = DicomUID.Generate();
            }
            else
            {
                SOPInstanceUID = sopInstance;
            }

            this.Add(DicomTag.SOPClassUID, SOPClassUID);
            this.Add(DicomTag.SOPInstanceUID, SOPInstanceUID);
        }
Ejemplo n.º 23
0
        /// <summary>
        /// Construct new print job using specified SOP instance UID. If passed SOP instance UID is missing, new UID will
        /// be generated
        /// </summary>
        /// <param name="sopInstance">New print job SOP instance uID</param>
        /// <param name="printer">The printer.</param>
        /// <param name="originator">The originator.</param>
        /// <param name="log">The log.</param>
        /// <param name="session">The session.</param>
        /// <exception cref="System.ArgumentNullException">printer</exception>
        /// /
        public PrintJob(DicomUID sopInstance, Printer printer, string originator, Log.Logger log, FilmSession session)
        {
            if (printer == null)
            {
                throw new ArgumentNullException("printer");
            }

            Log = log;

            if (sopInstance == null || sopInstance.UID == string.Empty)
                SOPInstanceUID = DicomUID.Generate();
            else
                SOPInstanceUID = sopInstance;

            Add(DicomTag.SOPClassUID, SOPClassUID);
            Add(DicomTag.SOPInstanceUID, SOPInstanceUID);

            Printer = printer;

            Status = PrintJobStatus.Pending;

            PrinterName = Printer.PrinterAet;
            Session = session;

            Originator = originator;

            if (CreationDateTime == DateTime.MinValue)
            {
                CreationDateTime = DateTime.Now;
            }

            PrintJobFolder = SOPInstanceUID.UID;

            var receivingFolder = Environment.CurrentDirectory + @"\PrintJobs";

            FullPrintJobFolder = string.Format(@"{0}\{1}", receivingFolder.TrimEnd('\\'), PrintJobFolder);
            FilmBoxFolderList = new List<string>();
        }
Ejemplo n.º 24
0
		protected override void OnReceiveNCreateRequest(byte presentationID, ushort messageID, 
			DicomUID affectedClass, DicomUID affectedInstance, DcmDataset dataset) {
			DicomUID sopClass = Associate.GetAbstractSyntax(presentationID);

			if (affectedClass == DicomUID.BasicFilmSessionSOPClass) {
				if (_session != null) {
					Log.Error("{0} -> Attempted to create second Basic Film Session on association", LogID);
					SendAbort(DcmAbortSource.ServiceProvider, DcmAbortReason.NotSpecified);
					return;
				}

				_session = new DcmFilmSession(sopClass, affectedInstance, dataset);

				SendNCreateResponse(presentationID, messageID, affectedClass, _session.SOPInstanceUID, null, DcmStatus.Success);
				return;
			}

			if (affectedClass == DicomUID.BasicFilmBoxSOPClass) {
				if (_session == null) {
					Log.Error("{0} -> A Basic Film Session does not exist for this association", LogID);
					SendAbort(DcmAbortSource.ServiceProvider, DcmAbortReason.NotSpecified);
					return;
				}

				DcmFilmBox box = _session.CreateFilmBox(affectedInstance, dataset);
				if (!box.Initialize()) {
					SendAbort(DcmAbortSource.ServiceProvider, DcmAbortReason.NotSpecified);
					return;
				}

				SendNCreateResponse(presentationID, messageID, affectedClass, box.SOPInstanceUID, dataset, DcmStatus.Success);
				return;
			}

			SendAbort(DcmAbortSource.ServiceProvider, DcmAbortReason.NotSpecified);
		}
Ejemplo n.º 25
0
 /// <summary>
 /// Platform-specific implementation to attempt to obtain a unique network identifier, e.g. based on a MAC address.
 /// </summary>
 /// <param name="identifier">Unique network identifier, if found.</param>
 /// <returns>True if network identifier could be obtained, false otherwise.</returns>
 protected abstract bool TryGetNetworkIdentifierImpl(out DicomUID identifier);
Ejemplo n.º 26
0
 protected override void OnReceiveCStoreResponse(byte presentationID, ushort messageIdRespondedTo, DicomUID affectedInstance, DcmStatus status)
 {
     _current.Status = status;
     if (OnCStoreResponseReceived != null)
     {
         try {
             OnCStoreResponseReceived(this, _current);
         }
         catch (Exception e) {
             Log.Error("Unhandled exception in user C-Store Response Callback: {0}", e.ToString());
         }
     }
     _current.Unload();
     _current = null;
     SendNextCStoreRequest();
 }
Ejemplo n.º 27
0
 internal void SendCStoreRequest(byte pcid, DicomUID instUid, DcmDataset dataset)
 {
     SendCStoreRequest(pcid, NextMessageID(), instUid, Priority, dataset);
 }
Ejemplo n.º 28
0
        private void btnCreateSRDicom_Click(object sender, EventArgs e)
        {
            string deviceObserverUID = "1.1.1.1.1";             // TODO (121012)
            string studyInstanceUid  = "1.1.1.1.1.1.1";
            string seriesInstanceUid = "1.1.1.1.1.1.1.2";
            string accessionNo       = "298347982347598";
            int    imageCount        = 3;

            DateTime now          = DateTime.Now;
            string   dateTagValue = DateTime.Now.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
            string   timeTagValue = DateTime.Now.ToString("HHmmss", CultureInfo.InvariantCulture);

            DicomDataset seqContent = new DicomDataset();        //Content of the sequence
            DicomDataset ds         = new DicomDataset();        //Main dataset

            ds.Add(DicomTag.SpecificCharacterSet, "ISO_IR 100"); //Add some items

            ds.Add(DicomTag.PatientName, "Last^First^Middle=Last2^First2^Middle2=Last3^First3^Middle3");
            ds.Add(DicomTag.PatientID, "ID0001");
            ds.Add(DicomTag.PatientBirthDate, dateTagValue);

            ds.Add(DicomTag.PatientSex, "M");

            ds.Add(DicomTag.StudyDate, dateTagValue);
            ds.Add(DicomTag.StudyTime, timeTagValue);
            ds.Add(DicomTag.AccessionNumber, accessionNo);
            ds.Add(DicomTag.ReferringPhysicianName, "RefPhysicianName Kim");
            ds.Add(DicomTag.StudyDescription, "CHEST");
            ds.Add(DicomTag.StudyInstanceUID, studyInstanceUid);
            ds.Add(DicomTag.StudyID, "0");

            ds.Add(DicomTag.SeriesDate, dateTagValue);
            ds.Add(DicomTag.SeriesTime, timeTagValue);
            ds.Add(DicomTag.Modality, "SR");
            ds.Add(DicomTag.SeriesDescription, "Description");
            ds.Add(DicomTag.SeriesInstanceUID, seriesInstanceUid);
            ds.Add(DicomTag.SeriesNumber, "2");

            ds.Add(DicomTag.Manufacturer, "Manufacturer");
            ds.Add(DicomTag.InstitutionName, "Hospital Name");
            ds.Add(DicomTag.StationName, "Room 1");
            ds.Add(DicomTag.SoftwareVersions, "1.0.0.0");
            ds.Add(DicomTag.ContentDate, dateTagValue);
            ds.Add(DicomTag.ContentTime, timeTagValue);
            ds.Add(DicomTag.InstanceNumber, "1");

            ds.Add(DicomTag.NumberOfStudyRelatedInstances, imageCount);
            ds.Add(DicomTag.ValueType, DicomValueType.Container);

            DicomSequence conceptNameCodeSequence = new DicomSequence(DicomTag.ConceptNameCodeSequence, new DicomCodeItem("113701", "DCM", "X-Ray Radiation Dose Report", "01"));

            ds.Add(conceptNameCodeSequence);

            ds.Add(DicomTag.ContinuityOfContent, DicomContinuity.Separate);

            seqContent.Clear();
            seqContent.Add(DicomTag.AccessionNumber, accessionNo);
            seqContent.Add(DicomTag.StudyInstanceUID, studyInstanceUid);
            seqContent.Add(DicomTag.RequestedProcedureDescription, string.Empty);
            seqContent.Add(DicomTag.RequestedProcedureCodeSequence, new DicomDataset());
            seqContent.Add(DicomTag.RequestedProcedureID, string.Empty);
            seqContent.Add(DicomTag.PlacerOrderNumberImagingServiceRequest, string.Empty);
            seqContent.Add(DicomTag.FillerOrderNumberImagingServiceRequest, string.Empty);

            DicomSequence referenceRequestSequence = new DicomSequence(DicomTag.ReferencedRequestSequence, seqContent);

            ds.Add(referenceRequestSequence);

            ds.Add(DicomTag.PerformedProcedureCodeSequence, new DicomDataset());
            ds.Add(DicomTag.CompletionFlag, "COMPLETE");
            ds.Add(DicomTag.CompletionFlagDescription, "Completed on Study close");
            ds.Add(DicomTag.VerificationFlag, "UNVERIFIED");
            ds.Add(DicomTag.PreliminaryFlag, "FINAL");

            DicomDataset ContentTemplateSequenceDataset = new DicomDataset();

            ContentTemplateSequenceDataset.Add(DicomTag.MappingResource, "DCMR");
            ContentTemplateSequenceDataset.Add(DicomTag.TemplateIdentifier, "10001");
            DicomSequence contentTemplateSequence = new DicomSequence(DicomTag.ContentTemplateSequence, ContentTemplateSequenceDataset);

            ds.Add(contentTemplateSequence);

            seqContent.Clear();

            DicomStructuredReport sr = new DicomStructuredReport(ds);

            {
                DicomContentItem item = new DicomContentItem(
                    GetDcmTypeCodeItem(121058, "Procedure reported"),
                    DicomRelationship.HasConceptModifier,
                    GetDcmTypeCodeItem(113704, "Projection X-Ray"));

                item.Add(new DicomContentItem(
                             GetSrtTypeCodeItem("G-C0E8", "Has Intent"),
                             DicomRelationship.HasConceptModifier,
                             GetSrtTypeCodeItem("R-408C3", "Diagnostic Intent")));

                sr.Add(item);
            }

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121005, "Observer Type"),
                       DicomRelationship.HasObservationContext,
                       GetDcmTypeCodeItem(121007, "Device")));

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121012, "Device Observer UID"),
                       DicomRelationship.HasObservationContext,
                       DicomUID.Parse("2222222222222222")));          // TODO : set real value

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121013, "Device Observer Name"),
                       DicomRelationship.HasObservationContext,
                       DicomValueType.Text,
                       "22222222222222222"));          // TODO : set real value

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121014, "Device Observer Manufacturer"),
                       DicomRelationship.HasObservationContext,
                       DicomValueType.Text,
                       "Rayence"));

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121015, "Device Observer Model Name"),
                       DicomRelationship.HasObservationContext,
                       DicomValueType.Text,
                       "XMARU SERIES"));          // TODO : set real value

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121016, "Device Observer Serial Number"),
                       DicomRelationship.HasObservationContext,
                       DicomValueType.Text,
                       "Unknown"));          // TODO : set real value

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121017, "Device Observer Physical Location During Observation"),
                       DicomRelationship.HasObservationContext,
                       DicomValueType.Text,
                       "Unknown"));          // TODO : set real value

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(113876, "Device Role in Procedure"),
                       DicomRelationship.HasObservationContext,
                       GetDcmTypeCodeItem(121097, "Recording")));

            {
                DicomContentItem item = new DicomContentItem(
                    GetDcmTypeCodeItem(113705, "Scope of Accumulation"),
                    DicomRelationship.HasObservationContext,
                    GetDcmTypeCodeItem(113014, "Study"));

                item.Add(new DicomContentItem(
                             GetDcmTypeCodeItem(110180, "Study Instance UID"),
                             DicomRelationship.HasProperties,
                             DicomUID.Parse(studyInstanceUid)));

                sr.Add(item);
            }

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(113944, "X-Ray Mechanical Data Available"),
                       DicomRelationship.Contains,
                       GetSrtTypeCodeItem("R-00339", "No")));

            //-------------- TID 10002 ------------------
            {
                DicomContentItem containerItem = new DicomContentItem(
                    GetDcmTypeCodeItem(113702, "Accumulated X-Ray Dose Data"),
                    DicomRelationship.Contains,
                    DicomContinuity.Separate);

                DicomSequence sequence = new DicomSequence(DicomTag.ContentTemplateSequence);

                sequence.Items.Add(new DicomDataset()
                                   .Add(DicomTag.MappingResource, "DCMR")
                                   .Add(DicomTag.TemplateIdentifier, "10002"));

                containerItem.Dataset.Add(sequence);

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113764, "Acquisition Plane"),
                                      DicomRelationship.HasConceptModifier,
                                      GetDcmTypeCodeItem(113622, "Single Plane")));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113722, "Dose Area Product Total"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(1.224),   // TODO : set real value
                                                             new DicomCodeItem("Gy.m2", "UCUM", "Gy.m2"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113725, "Dose (RP) Total"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(0),   // TODO : set real value
                                                             new DicomCodeItem("Gy", "UCUM", "Gy"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113727, "Acquisition Dose Area Product Total"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(1.224),   // TODO : set real value
                                                             new DicomCodeItem("Gy.m2", "UCUM", "Gy.m2"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113729, "Acquisition Dose (RP) Total"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(0),   // TODO : set real value
                                                             new DicomCodeItem("Gy", "UCUM", "Gy"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113855, "Total Acquisition Time"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(0.672),   // TODO : set real value
                                                             new DicomCodeItem("s", "UCUM", "s"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113731, "Total Number of Radiographic Frames"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(imageCount),
                                                             new DicomCodeItem("1", "UCUM", "no units"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113780, "Reference Point Definition"),
                                      DicomRelationship.Contains,
                                      DicomValueType.Text,
                                      "In Detector Plane"));

                DicomContentItem IrradiatingDevice = new DicomContentItem(
                    GetDcmTypeCodeItem(113876, "Device Role in Procedure"),
                    DicomRelationship.Contains,
                    GetDcmTypeCodeItem(113859, "Irradiating Device"));
                {
                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113877, "Device Name"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "DX3605801"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113878, "Device Manufacturer"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "Manufacturer"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113879, "Device Model Name"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "ManufacturerModelName"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113880, "Device Serial Number"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "Unknown"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(121012, "Device Observer UID"),
                                              DicomRelationship.HasProperties,
                                              DicomUID.Parse(deviceObserverUID)));
                }

                containerItem.Add(IrradiatingDevice);

                sr.Add(containerItem);
            }

            //-------------- TID 10003 ------------------



            for (int i = 0; i < imageCount; i++)
            {
                DicomContentItem containerItem = new DicomContentItem(
                    GetDcmTypeCodeItem(113706, "Irradiation Event X-Ray Data"),
                    DicomRelationship.Contains,
                    DicomContinuity.Separate);

                DicomSequence sequence = new DicomSequence(DicomTag.ContentTemplateSequence);

                sequence.Items.Add(new DicomDataset()
                                   .Add(DicomTag.MappingResource, "DCMR")
                                   .Add(DicomTag.TemplateIdentifier, "10003"));

                containerItem.Dataset.Add(sequence);

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113764, "Acquisition Plane"),
                                      DicomRelationship.HasConceptModifier,
                                      GetDcmTypeCodeItem(113622, "Single Plane")));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113769, "Irradiation Event UID"),
                                      DicomRelationship.Contains,
                                      DicomUID.Parse($"{seriesInstanceUid}.{i}")));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(111526, "DateTime Started"),
                                      DicomRelationship.Contains,
                                      DicomValueType.DateTime,
                                      DateTime.Now));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113721, "Irradiation Event Type"),
                                      DicomRelationship.Contains,
                                      GetDcmTypeCodeItem(113611, "Stationary Acquisition")));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(125203, "Acquisition Protocol"),
                                      DicomRelationship.Contains,
                                      DicomValueType.Text,
                                      "1.1"));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(123014, "Target Region"),
                                      DicomRelationship.Contains,
                                      GetSrtTypeCodeItem("Undefin", "ed")));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(122130, "Dose Area Product"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(0.25),
                                                             new DicomCodeItem("Gy.m2", "UCUM", "Gy.m2"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113845, "Exposure Index"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(500),
                                                             new DicomCodeItem("1", "UCUM", "no units"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113846, "Target Exposure Index"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(300),
                                                             new DicomCodeItem("1", "UCUM", "no units"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113738, "Dose (RP)"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(0),
                                                             new DicomCodeItem("Gy", "UCUM", "Gy"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113780, "Reference Point Definition"),
                                      DicomRelationship.Contains,
                                      DicomValueType.Text,
                                      "In Detector Plane"));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113768, "Number of Pulses"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(1),
                                                             new DicomCodeItem("1", "UCUM", "no units"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113733, "KVP"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(75),
                                                             new DicomCodeItem("kV", "UCUM", "kV"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113736, "Exposure"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(50),
                                                             new DicomCodeItem("uA.s", "UCUM", "uA.s"))));

                DicomContentItem IrradiatingDevice = new DicomContentItem(
                    GetDcmTypeCodeItem(113876, "Device Role in Procedure"),
                    DicomRelationship.Contains,
                    GetDcmTypeCodeItem(113859, "Irradiating Device"));
                {
                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113877, "Device Name"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "DX3605801"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113878, "Device Manufacturer"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "Manufacturer"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113879, "Device Model Name"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "ManufacturerModelName"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113880, "Device Serial Number"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "Unknown"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(121012, "Device Observer UID"),
                                              DicomRelationship.HasProperties,
                                              DicomUID.Parse(deviceObserverUID)));
                }

                containerItem.Add(IrradiatingDevice);
                sr.Add(containerItem);
            }

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(113854, "Source of Dose Information"),
                       DicomRelationship.Contains,
                       GetSrtTypeCodeItem("A-2C090", "Dosimeter")));

            DicomFile file = new DicomFile();

            file.FileMetaInfo.AddOrUpdate(DicomTag.MediaStorageSOPClassUID, DicomUID.Parse("1.2.840.10008.5.1.4.1.1.88.67"));
            file.FileMetaInfo.AddOrUpdate(DicomTag.MediaStorageSOPInstanceUID, DicomUID.Parse("1.2.840.10008.1.2.1"));
            file.FileMetaInfo.AddOrUpdate(DicomTag.ImplementationClassUID, "1.2.410.200067.141");
            file.FileMetaInfo.AddOrUpdate(DicomTag.SourceApplicationEntityTitle, "Rayence");

            file.Dataset.Add(ds);
            file.FileMetaInfo.TransferSyntax = DicomTransferSyntax.ImplicitVRLittleEndian;
            file.Save("SR.dcm");

            System.Diagnostics.Process.Start("SR.dcm");
        }
Ejemplo n.º 29
0
        private DicomCStoreRequest GenerateRequest(string patientId, DicomUID studyInstanceUid, DicomUID seriesInstanceUid)
        {
            var dataset = new DicomDataset();

            dataset.Add(DicomTag.PatientID, patientId);
            dataset.Add(DicomTag.StudyInstanceUID, studyInstanceUid);
            dataset.Add(DicomTag.SeriesInstanceUID, seriesInstanceUid);
            dataset.Add(DicomTag.SOPInstanceUID, DicomUIDGenerator.GenerateDerivedFromUUID());
            dataset.Add(DicomTag.SOPClassUID, DicomUID.SecondaryCaptureImageStorage.UID);
            var file = new DicomFile(dataset);

            return(new DicomCStoreRequest(file));
        }
Ejemplo n.º 30
0
 public bool Supports(DicomUID ax)
 {
     return(AbstractSyntaxes.Contains(ax.UID));
 }
Ejemplo n.º 31
0
 public DicomNSetRequest(DicomUID requestedClassUid, DicomUID requestedInstanceUid, DicomPriority priority = DicomPriority.Medium) : base(DicomCommandField.NSetRequest, requestedClassUid, priority)
 {
     SOPInstanceUID = requestedInstanceUid;
 }
Ejemplo n.º 32
0
 /// <summary>
 /// Initializes new Basic Film Session
 /// </summary>
 /// <param name="sessionClass">Color or Grayscale Basic Print Management UID</param>
 public DcmFilmSession(DicomUID sessionClass)
 {
     _sessionClass = sessionClass;
     _dataset      = new DcmDataset(DicomTransferSyntax.ImplicitVRLittleEndian);
     _boxes        = new List <DcmFilmBox>();
 }
Ejemplo n.º 33
0
 /// <summary>
 /// Attempt to obtain a unique network identifier, e.g. based on a MAC address.
 /// </summary>
 /// <param name="identifier">Unique network identifier, if found.</param>
 /// <returns>True if network identifier could be obtained, false otherwise.</returns>
 public static bool TryGetNetworkIdentifier(out DicomUID identifier)
 {
     return implementation.TryGetNetworkIdentifierImpl(out identifier);
 }
Ejemplo n.º 34
0
        /// <summary>
        /// Reads A-ASSOCIATE-AC from PDU buffer
        /// </summary>
        /// <param name="raw">PDU buffer</param>
        public void Read(RawPDU raw)
        {
            // reset async ops in case remote end does not negotiate
            _assoc.MaxAsyncOpsInvoked   = 1;
            _assoc.MaxAsyncOpsPerformed = 1;

            uint   l = raw.Length - 6;
            ushort c = 0;

            raw.ReadUInt16("Version");
            raw.SkipBytes("Reserved", 2);
            raw.SkipBytes("Reserved", 16);
            raw.SkipBytes("Reserved", 16);
            raw.SkipBytes("Reserved", 32);
            l -= 68;

            while (l > 0)
            {
                byte type = raw.ReadByte("Item-Type");
                l -= 1;

                if (type == 0x10)
                {
                    // Application Context
                    raw.SkipBytes("Reserved", 1);
                    c = raw.ReadUInt16("Item-Length");
                    raw.SkipBytes("Value", (int)c);
                    l -= 3 + (uint)c;
                }
                else if (type == 0x21)
                {
                    // Presentation Context
                    raw.ReadByte("Reserved");
                    ushort pl = raw.ReadUInt16("Presentation Context Item-Length");
                    byte   id = raw.ReadByte("Presentation Context ID");
                    raw.ReadByte("Reserved");
                    byte res = raw.ReadByte("Presentation Context Result/Reason");
                    raw.ReadByte("Reserved");
                    l  -= (uint)pl + 3;
                    pl -= 4;

                    // Presentation Context Transfer Syntax
                    raw.ReadByte("Presentation Context Item-Type (0x40)");
                    raw.ReadByte("Reserved");
                    ushort tl = raw.ReadUInt16("Presentation Context Item-Length");
                    string tx = raw.ReadString("Presentation Context Syntax UID", tl);
                    pl -= (ushort)(tl + 4);

                    _assoc.PresentationContexts[id].SetResult(
                        (DicomPresentationContextResult)res,
                        DicomTransferSyntax.Parse(tx));
                }
                else if (type == 0x50)
                {
                    // User Information
                    raw.ReadByte("Reserved");
                    ushort il = raw.ReadUInt16("User Information Item-Length");
                    l -= (uint)(il + 3);
                    while (il > 0)
                    {
                        byte ut = raw.ReadByte("User Item-Type");
                        raw.ReadByte("Reserved");
                        ushort ul = raw.ReadUInt16("User Item-Length");
                        il -= (ushort)(ul + 4);
                        if (ut == 0x51)
                        {
                            _assoc.MaximumPDULength = raw.ReadUInt32("Max PDU Length");
                        }
                        else if (ut == 0x52)
                        {
                            _assoc.RemoteImplemetationClassUID =
                                DicomUID.Parse(raw.ReadString("Implementation Class UID", ul));
                        }
                        else if (ut == 0x53)
                        {
                            _assoc.MaxAsyncOpsInvoked   = raw.ReadUInt16("Asynchronous Operations Invoked");
                            _assoc.MaxAsyncOpsPerformed = raw.ReadUInt16("Asynchronous Operations Performed");
                        }
                        else if (ut == 0x55)
                        {
                            _assoc.RemoteImplementationVersion = raw.ReadString("Implementation Version", ul);
                        }
                        else
                        {
                            raw.SkipBytes("User Item Value", (int)ul);
                        }
                    }
                }
                else
                {
                    raw.SkipBytes("Reserved", 1);
                    ushort il = raw.ReadUInt16("User Item-Length");
                    raw.SkipBytes("Unknown User Item", il);
                    l -= (uint)(il + 3);
                }
            }
        }
Ejemplo n.º 35
0
        public void Constructor_AffectedSopClassUid_ThrowWhenNotSupported(DicomUID affectedSopClassUid, bool throws)
        {
            var exception = Record.Exception(() => new DicomCFindRequest(affectedSopClassUid));

            Assert.Equal(throws, exception != null);
        }
Ejemplo n.º 36
0
        public async Task <bool> SendMppsCompletedAsync(string serverIp, int serverPort, string serverAET, string localAET, string studyInstanceUid, DicomUID affectedInstanceUid, DicomDataset worklistItem)
        {
            DicomSequence procedureStepSq = worklistItem.GetSequence(DicomTag.ScheduledProcedureStepSequence);
            // A worklistitem may have a list of scheduledprocedureSteps.
            // For each of them you have to send separate MPPS InProgress- and Completed-messages.
            // there in this example we will only send for the first procedure step
            DicomDataset procedureStep = procedureStepSq.First();

            // data
            DicomDataset dataset = new DicomDataset
            {
                { DicomTag.StudyInstanceUID, studyInstanceUid },
                { DicomTag.PerformedProcedureStepEndDate, DateTime.Now },
                { DicomTag.PerformedProcedureStepEndTime, DateTime.Now },
                { DicomTag.PerformedProcedureStepStatus, COMPLETED },
                { DicomTag.PerformedProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty) },
                { DicomTag.PerformedProcedureTypeDescription, string.Empty },

                { DicomTag.PerformedProtocolCodeSequence, new DicomDataset() },
                { DicomTag.ProcedureCodeSequence, new DicomDataset() },

                // dose and reports
                { DicomTag.ImageAndFluoroscopyAreaDoseProduct, 0.0m }, // if there has bee sone dose while examination
                { DicomTag.CommentsOnRadiationDose, string.Empty },    // a free text that contains all dose parameters

                { DicomTag.PerformedSeriesSequence, new DicomDataset()
                  {
                      { DicomTag.RetrieveAETitle, string.Empty }, // the aetitle of the archive where the images have been sent to
                      { DicomTag.SeriesDescription, "series 1" },
                      { DicomTag.PerformingPhysicianName, string.Empty },
                      { DicomTag.OperatorsName, string.Empty },
                      { DicomTag.ProtocolName, "protocol 1" },
                      { DicomTag.SeriesInstanceUID, DicomUID.Generate() },
                      { DicomTag.ReferencedImageSequence, new DicomDataset()
                        {
                            { DicomTag.ReferencedSOPClassUID, DicomUID.SecondaryCaptureImageStorage },
                            { DicomTag.ReferencedSOPInstanceUID, DicomUID.Generate() }
                        } },
                  } }
            };

            //// images created
            //DicomSequence performedSeriesSq = new DicomSequence(DicomTag.PerformedSeriesSequence);
            //// iterate all Series that have been created while examination
            //DicomDataset serie = new DicomDataset()
            //{
            //    { DicomTag.RetrieveAETitle, string.Empty }, // the aetitle of the archive where the images have been sent to
            //    { DicomTag.SeriesDescription, "serie 1" },
            //    { DicomTag.PerformingPhysicianName, string.Empty },
            //    { DicomTag.OperatorsName, string.Empty },
            //    { DicomTag.ProtocolName, string.Empty },
            //    { DicomTag.SeriesInstanceUID, DicomUID.Generate() }
            //};
            //DicomSequence refImagesInSerie = new DicomSequence(DicomTag.ReferencedImageSequence);
            //// iterate all images in the serie
            //DicomDataset image = new DicomDataset()
            //{
            //    { DicomTag.ReferencedSOPClassUID, DicomUID.SecondaryCaptureImageStorage },
            //    { DicomTag.ReferencedSOPInstanceUID, DicomUID.Generate() }
            //};
            //refImagesInSerie.Items.Add(image);
            //serie.Add(refImagesInSerie);
            //performedSeriesSq.Items.Add(serie);
            //dataset.Add(performedSeriesSq);

            bool result = false;

            DicomNSetRequest dicomFinished = new DicomNSetRequest(DicomUID.ModalityPerformedProcedureStepSOPClass, affectedInstanceUid)
            {
                Dataset            = dataset,
                OnResponseReceived = (req, res) =>
                {
                    if (res != null)
                    {
                        if (res.Status == DicomStatus.Success)
                        {
                            result = true;
                            Logger.Debug("Set study [{0}] [Complete] Success.", studyInstanceUid);
                        }
                        else
                        {
                            Logger.Warn("Set study [{0}] [Complete] Failed. [{1}]", studyInstanceUid, res.Status);
                        }
                    }
                }
            };

            DicomClient client = new DicomClient(serverIp, serverPort, false, localAET, serverAET);

            await client.AddRequestAsync(dicomFinished);

            await client.SendAsync();

            return(result);
        }
Ejemplo n.º 37
0
        private static async Task <(string responseStatus, string responseMessage)> SendMppsCompletedAsync(string serverIP, int serverPort, string serverAET, string clientAET, DicomUID affectedInstanceUid, DicomDataset worklistItem)
        {
            var client  = new DicomClient(serverIP, serverPort, false, clientAET, serverAET);
            var dataset = new DicomDataset();

            DicomSequence procedureStepSq = worklistItem.GetSequence(DicomTag.ScheduledProcedureStepSequence);
            // A worklistitem may have a list of scheduledprocedureSteps.
            // For each of them you have to send separate MPPS InProgress- and Completed-messages.
            // there in this example we will only send for the first procedure step
            var procedureStep = procedureStepSq.First();

            // data
            dataset.Add(DicomTag.PerformedProcedureStepEndDate, DateTime.Now);
            dataset.Add(DicomTag.PerformedProcedureStepEndTime, DateTime.Now);
            dataset.Add(DicomTag.PerformedProcedureStepStatus, "COMPLETED");
            dataset.Add(DicomTag.PerformedProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty));
            dataset.Add(DicomTag.PerformedProcedureTypeDescription, string.Empty);

            dataset.Add(DicomTag.PerformedProtocolCodeSequence, new DicomDataset());

            // dose and reports
            dataset.Add(DicomTag.ImageAndFluoroscopyAreaDoseProduct, 0.0m); // if there has bee sone dose while examination
            dataset.Add(DicomTag.CommentsOnRadiationDose, string.Empty);    // a free text that contains all dose parameters

            // images created
            var performedSeriesSq = new DicomSequence(DicomTag.PerformedSeriesSequence);
            // iterate all Series that have been created while examination
            var serie = new DicomDataset
            {
                { DicomTag.RetrieveAETitle, string.Empty }, // the aetitle of the archive where the images have been sent to
                { DicomTag.SeriesDescription, "serie 1" },
                { DicomTag.PerformingPhysicianName, string.Empty },
                { DicomTag.OperatorsName, string.Empty },
                { DicomTag.ProtocolName, string.Empty },
                { DicomTag.SeriesInstanceUID, DicomUID.Generate() }
            };
            var refImagesInSerie = new DicomSequence(DicomTag.ReferencedImageSequence);
            // iterate all images in the serie
            var image = new DicomDataset
            {
                { DicomTag.ReferencedSOPClassUID, DicomUID.SecondaryCaptureImageStorage },
                { DicomTag.ReferencedSOPInstanceUID, DicomUID.Generate() }
            };

            refImagesInSerie.Items.Add(image);
            serie.Add(refImagesInSerie);
            performedSeriesSq.Items.Add(serie);
            dataset.Add(performedSeriesSq);

            var dicomFinished = new DicomNSetRequest(DicomUID.ModalityPerformedProcedureStepSOPClass, affectedInstanceUid)
            {
                Dataset = dataset
            };

            string responseStatus  = string.Empty;
            string responseMessage = string.Empty;

            dicomFinished.OnResponseReceived += (req, response) =>
            {
                if (response != null)
                {
                    Console.WriteLine(response);
                    responseStatus  = response.Status.ToString();
                    responseMessage = response.ToString();
                }
            };

            await client.AddRequestAsync(dicomFinished);

            await client.SendAsync();

            return(responseStatus, responseMessage);
        }
Ejemplo n.º 38
0
 /// <summary>
 /// Add Extended Negotiation with Service Class Application Info
 /// </summary>
 /// <param name="sopClassUid">SOP Class UID.</param>
 /// <param name="applicationInfo">Service Class Application Info.</param>
 public void Add(DicomUID sopClassUid, DicomServiceApplicationInfo applicationInfo)
 {
     Add(new DicomExtendedNegotiation(sopClassUid, applicationInfo));
 }
Ejemplo n.º 39
0
 /// <summary>
 /// Add (Common) Extended Negotiation with Application Info, Service Class UID and Related General SOP Class UIDs
 /// </summary>
 /// <param name="sopClassUid">SOP Class UID.</param>
 /// <param name="applicationInfo">Service Class Application Info.</param>
 /// <param name="serviceClassUid">Common Service Class UID.</param>
 /// <param name="relatedGeneralSopClasses">Related General SOP Classes.</param>
 public void Add(DicomUID sopClassUid, DicomServiceApplicationInfo applicationInfo, DicomUID serviceClassUid, params DicomUID[] relatedGeneralSopClasses)
 {
     Add(new DicomExtendedNegotiation(sopClassUid, applicationInfo, serviceClassUid, relatedGeneralSopClasses));
 }
Ejemplo n.º 40
0
        /// <summary>
        /// Reads A-ASSOCIATE-AC from PDU buffer
        /// </summary>
        /// <param name="raw">PDU buffer</param>
        public void Read(RawPDU raw)
        {
            uint   l = raw.Length;
            ushort c = 0;

            raw.ReadUInt16("Version");
            raw.SkipBytes("Reserved", 2);
            raw.SkipBytes("Reserved", 16);
            raw.SkipBytes("Reserved", 16);
            raw.SkipBytes("Reserved", 32);
            l -= 68;

            while (l > 0)
            {
                byte type = raw.ReadByte("Item-Type");
                l -= 1;

                if (type == 0x10)
                {
                    // Application Context
                    raw.SkipBytes("Reserved", 1);
                    c = raw.ReadUInt16("Item-Length");
                    raw.SkipBytes("Value", (int)c);
                    l -= 3 + (uint)c;
                }
                else

                if (type == 0x21)
                {
                    // Presentation Context
                    raw.ReadByte("Reserved");
                    ushort pl = raw.ReadUInt16("Presentation Context Item-Length");
                    byte   id = raw.ReadByte("Presentation Context ID");
                    raw.ReadByte("Reserved");
                    byte res = raw.ReadByte("Presentation Context Result/Reason");
                    raw.ReadByte("Reserved");
                    l  -= (uint)pl + 3;
                    pl -= 4;

                    // Presentation Context Transfer Syntax
                    raw.ReadByte("Presentation Context Item-Type (0x40)");
                    raw.ReadByte("Reserved");
                    ushort tl = raw.ReadUInt16("Presentation Context Item-Length");
                    string tx = raw.ReadString("Presentation Context Syntax UID", tl);
                    pl -= (ushort)(tl + 4);

                    _assoc.SetPresentationContextResult(id, (DcmPresContextResult)res);
                    _assoc.SetAcceptedTransferSyntax(id, DicomTransferSyntax.Lookup(tx));
                }
                else

                if (type == 0x50)
                {
                    // User Information
                    raw.ReadByte("Reserved");
                    ushort il = raw.ReadUInt16("User Information Item-Length");
                    l -= (uint)(il + 3);
                    while (il > 0)
                    {
                        byte ut = raw.ReadByte("User Item-Type");
                        raw.ReadByte("Reserved");
                        ushort ul = raw.ReadUInt16("User Item-Length");
                        il -= (ushort)(ul + 4);
                        if (ut == 0x51)
                        {
                            _assoc.MaximumPduLength = raw.ReadUInt32("Max PDU Length");
                        }
                        else if (ut == 0x52)
                        {
                            _assoc.ImplementationClass = DicomUID.Lookup(raw.ReadString("Implementation Class UID", ul));
                        }
                        else if (ut == 0x53)
                        {
                            _assoc.AsyncOpsInvoked   = raw.ReadUInt16("Asynchronous Operations Invoked");
                            _assoc.AsyncOpsPerformed = raw.ReadUInt16("Asynchronous Operations Performed");
                        }
                        else if (ut == 0x55)
                        {
                            _assoc.ImplementationVersion = raw.ReadString("Implementation Version", ul);
                        }
                        else
                        {
                            raw.SkipBytes("User Item Value", (int)ul);
                        }
                    }
                }

                else
                {
                    raw.SkipBytes("Reserved", 1);
                    ushort il = raw.ReadUInt16("User Item-Length");
                    raw.SkipBytes("Unknown User Item", il);
                    l -= (uint)(il + 3);
                }
            }
        }
Ejemplo n.º 41
0
        private static async Task <(DicomUID affectedInstanceUid, string responseStatus, string responseMessage)> SendMppsInProgressAsync(string serverIP, int serverPort, string serverAET, string clientAET, DicomDataset worklistItem)
        {
            var client  = new DicomClient(serverIP, serverPort, false, clientAET, serverAET);
            var dataset = new DicomDataset();

            DicomSequence procedureStepSq = worklistItem.GetSequence(DicomTag.ScheduledProcedureStepSequence);
            // A worklistitem may have a list of scheduledprocedureSteps.
            // For each of them you have to send separate MPPS InProgress- and Completed-messages.
            // there in this example we will only send for the first procedure step
            var procedureStep = procedureStepSq.First();

            DicomDataset content = new DicomDataset();
            // get study instance UID from MWL query resault
            string studyInstanceUID = worklistItem.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, DicomUID.Generate().ToString());

            // set Attribute Sequence data
            content.Add(DicomTag.StudyInstanceUID, studyInstanceUID);
            content.Add(DicomTag.ReferencedStudySequence, new DicomDataset());
            content.Add(DicomTag.AccessionNumber, worklistItem.GetSingleValueOrDefault(DicomTag.AccessionNumber, string.Empty));
            content.Add(DicomTag.RequestedProcedureID, worklistItem.GetSingleValueOrDefault(DicomTag.RequestedProcedureID, string.Empty));
            content.Add(DicomTag.RequestedProcedureDescription, worklistItem.GetSingleValueOrDefault(DicomTag.RequestedProcedureDescription, string.Empty));
            content.Add(DicomTag.ScheduledProcedureStepID, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty));
            content.Add(DicomTag.ScheduledProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepDescription, string.Empty));
            content.Add(DicomTag.ScheduledProtocolCodeSequence, new DicomDataset());

            DicomSequence attr_Sequence = new DicomSequence(DicomTag.ScheduledStepAttributesSequence, content);//"Scheduled Step Attribute Sequence"

            dataset.Add(attr_Sequence);

            dataset.Add(DicomTag.PatientName, worklistItem.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty));
            dataset.Add(DicomTag.PatientID, worklistItem.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty));
            dataset.Add(DicomTag.PatientBirthDate, worklistItem.GetSingleValueOrDefault(DicomTag.PatientBirthDate, string.Empty));
            dataset.Add(DicomTag.PatientSex, worklistItem.GetSingleValueOrDefault(DicomTag.PatientSex, string.Empty));

            dataset.Add(DicomTag.ReferencedPatientSequence, new DicomDataset());
            dataset.Add(DicomTag.PerformedProcedureStepID, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty));
            dataset.Add(DicomTag.PerformedStationAETitle, PerformedStationAETitle);
            dataset.Add(DicomTag.PerformedStationName, PerformedStationName);
            dataset.Add(DicomTag.PerformedLocation, string.Empty);
            dataset.Add(DicomTag.PerformedProcedureStepStartDate, DateTime.Now);
            dataset.Add(DicomTag.PerformedProcedureStepStartTime, DateTime.Now);
            // set status
            dataset.Add(DicomTag.PerformedProcedureStepStatus, "IN PROGRESS");
            dataset.Add(DicomTag.PerformedProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty));
            dataset.Add(DicomTag.PerformedProcedureTypeDescription, string.Empty);

            dataset.Add(DicomTag.PerformedProcedureStepEndDate, string.Empty);
            dataset.Add(DicomTag.PerformedProcedureStepEndTime, string.Empty);
            // get modality from MWL query resault
            dataset.Add(DicomTag.Modality, procedureStep.GetSingleValueOrDefault(DicomTag.Modality, string.Empty));
            dataset.Add(DicomTag.StudyID, worklistItem.GetSingleValueOrDefault(DicomTag.StudyID, string.Empty));
            dataset.Add(DicomTag.PerformedProtocolCodeSequence, new DicomDataset());

            // create an unique UID as the effectedinstamceUid, this id will be needed for the N-SET also
            DicomUID effectedinstamceUid = DicomUID.Generate();
            var      dicomStartRequest   = new DicomNCreateRequest(DicomUID.ModalityPerformedProcedureStepSOPClass, effectedinstamceUid)
            {
                Dataset = dataset
            };

            string responseStatus  = string.Empty;
            string responseMessage = string.Empty;

            dicomStartRequest.OnResponseReceived += (req, response) =>
            {
                if (response != null)
                {
                    Console.WriteLine(response);
                    responseStatus  = response.Status.ToString();
                    responseMessage = response.ToString();
                }
            };

            await client.AddRequestAsync(dicomStartRequest);

            await client.SendAsync();

            return(effectedinstamceUid, responseStatus, responseMessage);
        }
Ejemplo n.º 42
0
 /// <summary>
 /// Initialize and add new presentation context.
 /// </summary>
 /// <param name="abstractSyntax">Abstract syntax of the presentation context.</param>
 /// <param name="transferSyntaxes">Supported transfer syntaxes.</param>
 public void Add(DicomUID abstractSyntax, params DicomTransferSyntax[] transferSyntaxes)
 {
     Add(abstractSyntax, null, null, transferSyntaxes);
 }
Ejemplo n.º 43
0
        protected override void OnReceiveCStoreRequest(byte presentationID, ushort messageID, DicomUID affectedInstance,
                                                       DcmPriority priority, string moveAE, ushort moveMessageID, DcmDataset dataset, string fileName)
        {
            DcmStatus status = DcmStatus.Success;

            if (OnCStoreRequest != null)
            {
                status = OnCStoreRequest(this, presentationID, messageID, affectedInstance, priority, moveAE, moveMessageID, dataset, fileName);
            }

            SendCStoreResponse(presentationID, messageID, affectedInstance, status);
        }
Ejemplo n.º 44
0
        /// <summary>
        /// Attempt to load a volume from the given SeriesUID for the given DicomFolderContents
        /// </summary>
        /// <param name="dfc">A pre-built description of DICOM contents within a particular folder</param>
        /// <param name="seriesUID">The DICOM seriesUID you wish to construct a volume for</param>
        /// <param name="acceptanceTests">An implementation of IVolumeGeometricAcceptanceTest defining the geometric constraints of your application</param>
        /// <param name="loadStructuresIfExists">True if rt-structures identified in the folder and referencing seriesUID should be loaded</param>
        /// <param name="supportLossyCodecs">If you wish to accept lossy encodings of image pixel data</param>
        /// <returns></returns>
        private static VolumeLoaderResult LoadDicomSeries(
            DicomFolderContents dfc, DicomUID seriesUID, IVolumeGeometricAcceptanceTest acceptanceTests, bool loadStructuresIfExists, bool supportLossyCodecs)
        {
            try
            {
                var dicomSeriesContent = dfc.Series.FirstOrDefault((s) => s.SeriesUID == seriesUID);

                var warnings = new List <string>();
                RadiotherapyStruct rtStruct = null;

                if (dicomSeriesContent != null)
                {
                    var volumeData = DicomSeriesReader.BuildVolume(dicomSeriesContent.Content.Select(x => x.File.Dataset), acceptanceTests, supportLossyCodecs);

                    if (volumeData != null && loadStructuresIfExists)
                    {
                        var rtStructData = dfc.RTStructs.FirstOrDefault(rt => rt.SeriesUID == seriesUID);
                        if (rtStructData != null)
                        {
                            if (rtStructData.Content.Count == 1)
                            {
                                var rtStructAndWarnings = RtStructReader.LoadContours(
                                    rtStructData.Content.First().File.Dataset,
                                    volumeData.Transform.DicomToData,
                                    seriesUID.UID,
                                    null,
                                    false);

                                rtStruct = rtStructAndWarnings.Item1;

                                var warning = rtStructAndWarnings.Item2;

                                if (!string.IsNullOrEmpty(warning))
                                {
                                    warnings.Add(warning);
                                }
                            }
                            else if (rtStructData.Content.Count > 1)
                            {
                                warnings.Add("There is more than 1 RT STRUCT referencing this series - skipping structure set load");
                            }
                        }
                    }
                    var dicomIdentifiers = dicomSeriesContent.Content.Select((v) => DicomIdentifiers.ReadDicomIdentifiers(v.File.Dataset)).ToArray();

                    if (rtStruct == null)
                    {
                        rtStruct = RadiotherapyStruct.CreateDefault(dicomIdentifiers);
                    }

                    var result = new MedicalVolume(
                        volumeData,
                        dicomIdentifiers,
                        dicomSeriesContent.Content.Select((d) => d.Path).ToArray(),
                        rtStruct);

                    return(new VolumeLoaderResult(seriesUID.UID, result, null, warnings));
                }
                throw new Exception("Could not find that series");
            }
            catch (Exception oops)
            {
                return(new VolumeLoaderResult(seriesUID.UID, null, oops, new List <string>()));
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="DicomPresentationContext"/> class.
 /// </summary>
 /// <param name="pcid">
 /// The presentation context ID.
 /// </param>
 /// <param name="abstractSyntax">
 /// The abstract syntax associated with the presentation context.
 /// </param>
 public DicomPresentationContext(byte pcid, DicomUID abstractSyntax)
     : this(pcid, abstractSyntax, null, null)
 {
 }
Ejemplo n.º 46
0
 /// <summary>
 /// Add or update (Common) Extended Negotiation with Application Info, Service Class UID and Related General SOP Class UIDs
 /// </summary>
 /// <param name="sopClassUid">SOP Class UID.</param>
 /// <param name="applicationInfo">Service Class Application Info.</param>
 /// <param name="serviceClassUid">Common Service Class UID.</param>
 /// <param name="relatedGeneralSopClasses">Related General SOP Classes.</param>
 public void AddOrUpdate(DicomUID sopClassUid, DicomServiceApplicationInfo applicationInfo, DicomUID serviceClassUid, params DicomUID[] relatedGeneralSopClasses)
 {
     if (_ec.TryGetValue(sopClassUid, out var en))
     {
         en.RequestedApplicationInfo = applicationInfo ?? en.RequestedApplicationInfo;
         if (serviceClassUid != null)
         {
             en.ServiceClassUid = serviceClassUid;
             en.RelatedGeneralSopClasses.Clear();
             en.RelatedGeneralSopClasses.AddRange(relatedGeneralSopClasses);
         }
     }
     Add(new DicomExtendedNegotiation(sopClassUid, applicationInfo, serviceClassUid, relatedGeneralSopClasses));
 }
Ejemplo n.º 47
0
 public DicomReferencedSOP(DicomUID inst, DicomUID clazz)
 {
     Add(DicomTag.ReferencedSOPInstanceUID, inst);
     Add(DicomTag.ReferencedSOPClassUID, clazz);
 }
Ejemplo n.º 48
0
 /// <summary>
 /// Indicates if specified uid is contained in collection
 /// </summary>
 /// <param name="item">SOP Class UID to search for.</param>
 /// <returns><code>true</code> if <paramref name="item"/> is contained in collection, <code>false</code> otherwise.</returns>
 public bool Contains(DicomUID item)
 {
     return(_ec.ContainsKey(item));
 }
Ejemplo n.º 49
0
 internal void SendCStoreRequest(byte pcid, DicomUID instUid, Stream stream)
 {
     SendCStoreRequest(pcid, NextMessageID(), instUid, Priority, stream);
 }
Ejemplo n.º 50
0
 /// <summary>
 /// Gets the Extended negotiation associated with <paramref name="id"/>.
 /// </summary>
 /// <param name="id">SOP Class UID.</param>
 /// <returns>Extended negotiation associated with <paramref name="id"/></returns>
 public DicomExtendedNegotiation this[DicomUID id] => _ec[id];
Ejemplo n.º 51
0
 /// <summary>
 /// Find image box instance with specified SOP instance UID
 /// </summary>
 /// <param name="sopInstnace">Target image box SOP instance UID</param>
 /// <returns>Target image box instance or null if no matching found</returns>
 public ImageBox FindImageBox(DicomUID sopInstnace)
 {
     foreach (var filmBox in BasicFilmBoxes)
     {
         var imageBox = filmBox.FindImageBox(sopInstnace);
         if (imageBox != null)
         {
             return imageBox;
         }
     }
     return null;
 }
Ejemplo n.º 52
0
 /// <summary>
 /// Attempt to obtain a unique network identifier, e.g. based on a MAC address.
 /// </summary>
 /// <param name="identifier">Unique network identifier, if found.</param>
 /// <returns>True if network identifier could be obtained, false otherwise.</returns>
 public static bool TryGetNetworkIdentifier(out DicomUID identifier)
 {
     return(implementation.TryGetNetworkIdentifierImpl(out identifier));
 }
Ejemplo n.º 53
0
        public async Task <bool> SendMppsDiscontinuedAsync(string serverIp, int serverPort, string serverAET, string localAET, string studyInstanceUid, DicomUID affectedInstanceUid, DicomDataset worklistItem)
        {
            DicomSequence procedureStepSq = worklistItem.GetSequence(DicomTag.ScheduledProcedureStepSequence);
            // A worklistitem may have a list of scheduledprocedureSteps.
            // For each of them you have to send separate MPPS InProgress- and Completed-messages.
            // there in this example we will only send for the first procedure step
            DicomDataset procedureStep = procedureStepSq.First();

            DicomDataset dataset = new DicomDataset()
            {
                { DicomTag.StudyInstanceUID, studyInstanceUid },
                { DicomTag.PerformedProcedureStepEndDate, DateTime.Now },
                { DicomTag.PerformedProcedureStepEndTime, DateTime.Now },
                { DicomTag.PerformedProcedureStepStatus, DISCONTINUED },
                { DicomTag.PerformedProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty) },
                { DicomTag.PerformedProcedureTypeDescription, string.Empty },

                { DicomTag.PerformedProtocolCodeSequence, new DicomDataset() },
                { DicomTag.ProcedureCodeSequence, new DicomDataset() },

                { DicomTag.PerformedSeriesSequence, new DicomDataset()
                  {
                      { DicomTag.RetrieveAETitle, string.Empty }, // the aetitle of the archive where the images have been sent to
                      { DicomTag.SeriesDescription, "series 1" },
                      { DicomTag.PerformingPhysicianName, string.Empty },
                      { DicomTag.OperatorsName, string.Empty },
                      { DicomTag.ProtocolName, "protocol 1" },
                      { DicomTag.SeriesInstanceUID, DicomUID.Generate() },
                      { DicomTag.ReferencedImageSequence, new DicomDataset()
                        {
                            { DicomTag.ReferencedSOPClassUID, DicomUID.SecondaryCaptureImageStorage },
                            { DicomTag.ReferencedSOPInstanceUID, DicomUID.Generate() }
                        } },
                  } }
            };

            bool result = false;

            DicomNSetRequest dicomAbort = new DicomNSetRequest(DicomUID.ModalityPerformedProcedureStepSOPClass, affectedInstanceUid)
            {
                Dataset            = dataset,
                OnResponseReceived = (req, res) =>
                {
                    if (res != null)
                    {
                        if (res.Status == DicomStatus.Success)
                        {
                            result = true;
                            Logger.Debug("Set study [{0}] [Discontinued] Success.", studyInstanceUid);
                        }
                        else
                        {
                            Logger.Warn("Set study [{0}] [Discontinued] Failed. [{1}]", studyInstanceUid, res.Status);
                        }
                    }
                }
            };

            DicomClient client = new DicomClient(serverIp, serverPort, false, localAET, serverAET);

            await client.AddRequestAsync(dicomAbort);

            await client.SendAsync();

            return(result);
        }
Ejemplo n.º 54
0
 public PresentationLut FindPresentationLut(DicomUID sopInstance)
 {
     return PresentationLuts.FirstOrDefault(p => p.SopInstanceUid == sopInstance);
 }
Ejemplo n.º 55
0
        public PresentationLut CreatePresentationLut(DicomUID sopInstance, DicomDataset dataset)
        {
            DicomUID uid = sopInstance;
            if (uid == null || uid.UID == string.Empty)
            {
                uid = new DicomUID(
                    string.Format("{0}.{1}", SOPInstanceUID.UID, BasicFilmBoxes.Count + 1),
                    SOPInstanceUID.Name,
                    SOPInstanceUID.Type);
            }

            var presentationLut = new PresentationLut(uid, dataset);

            PresentationLuts.Add(presentationLut);

            return presentationLut;
        }
Ejemplo n.º 56
0
        public async Task <(DicomUID affectedInstanceUid, string studyInstanceUid, bool result)> SendMppsInProgressAsync(string serverIp, int serverPort, string serverAET, string localAET, DicomDataset worklistItem)
        {
            DicomSequence procedureStepSeq = worklistItem.GetSequence(DicomTag.ScheduledProcedureStepSequence);
            // A worklistitem may have a list of scheduledprocedureSteps.
            // For each of them you have to send separate MPPS InProgress- and Completed-messages.
            // there in this example we will only send for the first procedure step
            DicomDataset procedureStep = procedureStepSeq.First();

            // get study instance UID from MWL query resault
            string studyInstanceUID = worklistItem.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, DicomUIDGenerator.GenerateDerivedFromUUID().UID);

            DicomDataset dataset = new DicomDataset
            {
                { DicomTag.PatientName, worklistItem.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty) },
                { DicomTag.PatientID, worklistItem.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty) },
                { DicomTag.PatientBirthDate, worklistItem.GetSingleValueOrDefault(DicomTag.PatientBirthDate, string.Empty) },
                { DicomTag.PatientSex, worklistItem.GetSingleValueOrDefault(DicomTag.PatientSex, string.Empty) },
                { DicomTag.StudyID, worklistItem.GetSingleValueOrDefault(DicomTag.StudyID, string.Empty) },
                { DicomTag.StudyInstanceUID, studyInstanceUID },

                { DicomTag.PerformedProcedureStepID, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty) },
                { DicomTag.PerformedProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty) },

                // set status
                { DicomTag.PerformedProcedureStepStatus, IN_PROGRESS },
                { DicomTag.PerformedProcedureTypeDescription, string.Empty },

                { DicomTag.PerformedProcedureStepStartDate, DateTime.Now },
                { DicomTag.PerformedProcedureStepStartTime, DateTime.Now },
                { DicomTag.PerformedProcedureStepEndDate, string.Empty },
                { DicomTag.PerformedProcedureStepEndTime, string.Empty },
                { DicomTag.PerformedLocation, string.Empty },
                { DicomTag.PerformedStationAETitle, localAET },
                { DicomTag.PerformedStationName, localAET },
                // get modality from MWL query result
                { DicomTag.Modality, procedureStep.GetSingleValueOrDefault(DicomTag.Modality, string.Empty) },
                { DicomTag.PerformedProtocolCodeSequence, new DicomDataset() },
                { DicomTag.ProcedureCodeSequence, new DicomDataset() },
                { DicomTag.ReferencedPatientSequence, new DicomDataset() }
            };
            // set Attribute Sequence data
            DicomDataset content = new DicomDataset
            {
                { DicomTag.AccessionNumber, worklistItem.GetSingleValueOrDefault(DicomTag.AccessionNumber, string.Empty) },
                { DicomTag.StudyInstanceUID, studyInstanceUID },
                { DicomTag.ReferencedStudySequence, new DicomDataset() },
                { DicomTag.RequestedProcedureID, worklistItem.GetSingleValueOrDefault(DicomTag.RequestedProcedureID, string.Empty) },
                { DicomTag.RequestedProcedureDescription, worklistItem.GetSingleValueOrDefault(DicomTag.RequestedProcedureDescription, string.Empty) },
                { DicomTag.ScheduledProcedureStepID, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty) },
                { DicomTag.ScheduledProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepDescription, string.Empty) },
                { DicomTag.ScheduledProtocolCodeSequence, new DicomDataset() }
            };

            DicomSequence attr_Sequence = new DicomSequence(DicomTag.ScheduledStepAttributesSequence, content);//"Scheduled Step Attribute Sequence"

            dataset.Add(attr_Sequence);

            dataset.Add(DicomTag.PerformedSeriesSequence, new DicomDataset());

            // create an unique UID as the effectedinstamceUid, this id will be needed for the N-SET also
            DicomUID effectedinstamceUid = DicomUID.Generate();

            DicomNCreateRequest dicomStartRequest = new DicomNCreateRequest(DicomUID.ModalityPerformedProcedureStepSOPClass, effectedinstamceUid)
            {
                Dataset = dataset
            };

            bool result = false;

            dicomStartRequest.OnResponseReceived += (req, res) =>
            {
                if (res != null)
                {
                    if (res.Status == DicomStatus.Success)
                    {
                        Logger.Debug("Set study [{0}] [In Progress] Success.", studyInstanceUID);

                        result = true;
                    }
                    else
                    {
                        Logger.Warn("Set study [{0}] [In Progress] Failed. [{1}]", studyInstanceUID, res.Status);
                    }
                }
            };

            DicomClient client = new DicomClient(serverIp, serverPort, false, localAET, serverAET);
            await client.AddRequestAsync(dicomStartRequest);

            await client.SendAsync();

            return(effectedinstamceUid, studyInstanceUID, result);
        }
Ejemplo n.º 57
0
        public void DeletePresentationLut(DicomUID sopInstance)
        {
            var presentationLut = FindPresentationLut(sopInstance);

            if (presentationLut != null)
            {
                PresentationLuts.Remove(presentationLut);
            }
        }
 public AcceptOnlyEchoStoreProvider(INetworkStream stream, Encoding fallbackEncoding, Logger log,
                                    ILogManager logManager, INetworkManager networkManager, ITranscoderManager transcoderManager) : base(stream, fallbackEncoding, log, logManager, networkManager, transcoderManager)
 {
     AcceptedSopClasses.Add(DicomUID.Verification);
     AcceptedSopClasses.AddRange(DicomUID.Enumerate().Where(u => u.IsImageStorage));
 }
Ejemplo n.º 59
0
 /// <summary>
 /// Platform-specific implementation to attempt to obtain a unique network identifier, e.g. based on a MAC address.
 /// </summary>
 /// <param name="identifier">Unique network identifier, if found.</param>
 /// <returns>True if network identifier could be obtained, false otherwise.</returns>
 protected abstract bool TryGetNetworkIdentifierImpl(out DicomUID identifier);
Ejemplo n.º 60
0
        /// <summary>
        /// Reads A-ASSOCIATE-RQ from PDU buffer
        /// </summary>
        /// <param name="raw">PDU buffer</param>
        public void Read(RawPDU raw)
        {
            uint l = raw.Length;

            raw.ReadUInt16("Version");
            raw.SkipBytes("Reserved", 2);
            _assoc.CalledAE  = raw.ReadString("Called AE", 16);
            _assoc.CallingAE = raw.ReadString("Calling AE", 16);
            raw.SkipBytes("Reserved", 32);
            l -= 2 + 2 + 16 + 16 + 32;

            while (l > 0)
            {
                byte type = raw.ReadByte("Item-Type");
                raw.SkipBytes("Reserved", 1);
                ushort il = raw.ReadUInt16("Item-Length");

                l -= 4 + (uint)il;

                if (type == 0x10)
                {
                    // Application Context
                    raw.SkipBytes("Application Context", il);
                }
                else

                if (type == 0x20)
                {
                    // Presentation Context
                    byte id = raw.ReadByte("Presentation Context ID");
                    raw.SkipBytes("Reserved", 3);
                    il -= 4;

                    while (il > 0)
                    {
                        byte pt = raw.ReadByte("Presentation Context Item-Type");
                        raw.SkipBytes("Reserved", 1);
                        ushort pl = raw.ReadUInt16("Presentation Context Item-Length");
                        string sx = raw.ReadString("Presentation Context Syntax UID", pl);
                        if (pt == 0x30)
                        {
                            _assoc.AddPresentationContext(id, DicomUID.Lookup(sx));
                        }
                        else if (pt == 0x40)
                        {
                            _assoc.AddTransferSyntax(id, DicomTransferSyntax.Lookup(sx));
                        }
                        il -= (ushort)(4 + pl);
                    }
                }
                else

                if (type == 0x50)
                {
                    // User Information
                    while (il > 0)
                    {
                        byte ut = raw.ReadByte("User Information Item-Type");
                        raw.SkipBytes("Reserved", 1);
                        ushort ul = raw.ReadUInt16("User Information Item-Length");
                        il -= (ushort)(4 + ul);
                        if (ut == 0x51)
                        {
                            _assoc.MaximumPduLength = raw.ReadUInt32("Max PDU Length");
                        }
                        else if (ut == 0x52)
                        {
                            _assoc.ImplementationClass = new DicomUID(raw.ReadString("Implementation Class UID", ul), "Implementation Class UID", DicomUidType.Unknown);
                        }
                        else if (ut == 0x55)
                        {
                            _assoc.ImplementationVersion = raw.ReadString("Implementation Version", ul);
                        }
                        else if (ut == 0x53)
                        {
                            _assoc.AsyncOpsInvoked   = raw.ReadUInt16("Asynchronous Operations Invoked");
                            _assoc.AsyncOpsPerformed = raw.ReadUInt16("Asynchronous Operations Performed");
                        }
                        else if (ut == 0x54)
                        {
                            raw.SkipBytes("SCU/SCP Role Selection", ul);

                            /*
                             * ushort rsul = raw.ReadUInt16();
                             * if ((rsul + 4) != ul) {
                             *      throw new DicomNetworkException("SCU/SCP role selection length (" + ul + " bytes) does not match uid length (" + rsul + " + 4 bytes)");
                             * }
                             * raw.ReadChars(rsul);	// Abstract Syntax
                             * raw.ReadByte();		// SCU role
                             * raw.ReadByte();		// SCP role
                             */
                        }
                        else
                        {
                            Debug.Log.Error("Unhandled user item: 0x{0:x2} ({1} + 4 bytes)", ut, ul);
                            raw.SkipBytes("Unhandled User Item", ul);
                        }
                    }
                }
            }
        }