Esempio n. 1
0
        /// <summary>
        /// Convert query options into DICOM patient query DataSeet
        /// </summary>
        /// <param name="options">query options</param>
        /// <returns>DICOM DataSet that contains the DICOM query options</returns>
        private Dicom.DicomDataSet GetPatientQuery(QueryOptions options)
        {
            DicomDataSet query     = new DicomDataSet( );
            FindQuery    findQuery = new FindQuery( );

            query.Initialize(DicomClassType.StudyRootQueryStudy, DicomDataSetInitializeFlags.ImplicitVR | DicomDataSetInitializeFlags.LittleEndian | DicomDataSetInitializeFlags.AddMandatoryElementsOnly | DicomDataSetInitializeFlags.AddMandatoryModulesOnly);

            InsertPatientInfo(options, query);

            query.InsertElementAndSetValue(DicomTag.QueryRetrieveLevel, "PATIENT");

            return(query);
        }
Esempio n. 2
0
        private void InsertStudyInfo(QueryOptions options, DicomDataSet query)
        {
            if (null != options.StudiesOptions)
            {
                if (!string.IsNullOrEmpty(options.StudiesOptions.AccessionNumber))
                {
                    query.InsertElementAndSetValue(DicomTag.AccessionNumber, options.StudiesOptions.AccessionNumber);
                }


                if ((null != options.StudiesOptions.ModalitiesInStudy) &&
                    (options.StudiesOptions.ModalitiesInStudy.Length > 0))
                {
                    query.InsertElementAndSetValue(DicomTag.ModalitiesInStudy, options.StudiesOptions.ModalitiesInStudy);
                }

                if (!string.IsNullOrEmpty(options.StudiesOptions.ReferDoctorName))
                {
                    query.InsertElementAndSetValue(DicomTag.ReferringPhysicianName, options.StudiesOptions.ReferDoctorName);
                }

                if (!string.IsNullOrEmpty(options.StudiesOptions.StudyID))
                {
                    query.InsertElementAndSetValue(DicomTag.StudyID, options.StudiesOptions.StudyID);
                }

                if (!string.IsNullOrEmpty(options.StudiesOptions.StudyInstanceUID))
                {
                    query.InsertElementAndSetValue(DicomTag.StudyInstanceUID, options.StudiesOptions.StudyInstanceUID);
                }

                if (!string.IsNullOrEmpty(options.StudiesOptions.StudyDateStart) ||
                    !string.IsNullOrEmpty(options.StudiesOptions.StudyDateEnd))
                {
                    //TODO: Date need to be formatted into DICOM. Convert string to datetime then ToString ( "yyyyMMdd" )
                    query.InsertElementAndSetValue(DicomTag.StudyDate, string.Format("{0}-{1}",
                                                                                     (options.StudiesOptions.StudyDateStart == null) ? "" : options.StudiesOptions.StudyDateStart,
                                                                                     (options.StudiesOptions.StudyDateEnd == null) ? "" : options.StudiesOptions.StudyDateEnd));
                }

                if (!string.IsNullOrEmpty(options.StudiesOptions.StudyTimeStart) ||
                    !string.IsNullOrEmpty(options.StudiesOptions.StudyTimeEnd))
                {
                    //TODO: Time need to be formatted into DICOM. Convert string to datetime then ToString ( "HHmmss" )
                    query.InsertElementAndSetValue(DicomTag.StudyTime, string.Format("{0}-{1}",
                                                                                     (options.StudiesOptions.StudyTimeStart == null) ? "" : options.StudiesOptions.StudyTimeStart,
                                                                                     (options.StudiesOptions.StudyTimeEnd == null) ? "" : options.StudiesOptions.StudyTimeEnd));
                }
            }
            else
            {
            }
        }
        private void BuildDataSet( )
        {
            long         code    = -1;
            DicomTag     tag     = null;
            DicomElement element = null;

            element = _Dataset.FindFirstElement(null, _PreviousCode, false);


            code = OrientationConfigDialog.GetTag(comboBoxTags.Text);

            if (code == -1)
            {
                _Dataset.Reset( );

                dicomPropertyGrid.DataSet = _Dataset;

                MessageBox.Show("Invalid Tag", "Error with tag", MessageBoxButtons.OK, MessageBoxIcon.Error);

                comboBoxTags.Focus( );
            }
            else
            {
                if (element != null && element.Tag != code)
                {
                    _TagValue = null;
                }

                _PreviousCode = code;

                tag = DicomTagTable.Instance.Find(code);

                _Dataset.Reset();

                if (_TagValue != null)
                {
                    _Dataset.InsertElementAndSetValue(code, _TagValue);
                }
                else
                {
                    _Dataset.InsertElement(null, false, code, tag != null ? tag.VR : DicomVRType.UN, tag != null && tag.VR == DicomVRType.SQ, -1);
                }

                dicomPropertyGrid.DataSet = _Dataset;
            }
        }
Esempio n. 4
0
        public static void AddDefaultImages(Configuration configGlobalPacs)
        {
            ImageCountReset();

            MainForm.StoreClientSessionProxy proxy = null;
            InstanceCStoreCommand            cmd   = null;
            IStorageDataAccessAgent          agent = DataAccessFactory.GetInstance(new StorageDataAccessConfigurationView(configGlobalPacs, DicomDemoSettingsManager.ProductNameStorageServer, null)).CreateDataAccessAgent <IStorageDataAccessAgent>();

            for (int i = 1; i < ImageCountResources + 1; i++)
            {
                using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(string.Format("CSPacsDatabaseConfigurationDemo.Resources.{0}.dcm", i)))
                {
                    using (DicomDataSet ds = new DicomDataSet())
                    {
                        ds.Load(stream, DicomDataSetLoadFlags.None);

                        proxy = new MainForm.StoreClientSessionProxy();
                        cmd   = new InstanceCStoreCommand(proxy, ds, agent);

                        proxy.AffectedSOPInstance = ds.GetValue <string>(DicomTag.SOPInstanceUID, string.Empty);
                        proxy.AbstractClass       = ds.GetValue <string>(DicomTag.SOPClassUID, string.Empty);

                        ds.InsertElementAndSetValue(DicomTag.MediaStorageSOPInstanceUID, proxy.AffectedSOPInstance);
                        cmd.Execute();

                        ImageCountUpdate();
                    }
                }
            }
#if (LEADTOOLS_V19_OR_LATER)
            InsertDefaultImages("mg", ImageCountMG, configGlobalPacs);
            InsertDefaultImages("cr", ImageCountCR, configGlobalPacs);
            InsertDefaultImages("FMX18.de", ImageCountFMX, 2, configGlobalPacs);
#endif

#if (LEADTOOLS_V20_OR_LATER)
            InsertDefaultImages("MRI.mri_", ImageCountMRI, 2, configGlobalPacs);
#endif
        }
Esempio n. 5
0
        private void OnMatchFound(DicomDataSet response)
        {
            try
            {
                if (null != MatchFound)
                {
                    try
                    {
                        GatewaySession.Log(__Client, DicomCommandType.CFind, LogType.Debug, MessageDirection.Output, null,
                                           "[Gateway] Sending C-Find response to client \"" + (__Client.IsAssociated() ? __Client.Association.Calling : string.Empty) + "\"");

                        DicomElement element = response.FindFirstElement(null, DicomTag.RetrieveAETitle, true);

                        if (null != element)
                        {
                            response.DeleteElement(element);
                        }

                        response.InsertElementAndSetValue(DicomTag.InstanceAvailability, "NEARLINE");

                        MatchFound(this, new MatchFoundEventArgs(response));

                        GatewaySession.Log(__Client, DicomCommandType.CFind, LogType.Debug, MessageDirection.Output, null,
                                           "[Gateway] C-Find response sent successfully to client \"" + (__Client.IsAssociated() ? __Client.Association.Calling : string.Empty) + "\"");
                    }
                    catch (Exception exception)
                    {
                        GatewaySession.Log(__Client, DicomCommandType.CFind, LogType.Error, MessageDirection.Output, null,
                                           "[Gateway] Faild to send C-Find response to client \"" + (__Client.IsAssociated() ? __Client.Association.Calling : string.Empty) + "\"\n"
                                           + exception.Message);
                    }
                }
            }
            finally
            {
                response.Dispose();
            }
        }
Esempio n. 6
0
        public object this[long tag]
        {
            get
            {
                if (_Dataset != null)
                {
                    if (Utils.IsSequence(tag))
                    {
                        return(new Sequence(tag, this));
                    }

                    return(_Dataset.GetElementValue(tag, false));
                }
                return(null);
            }
            set
            {
                if (_Dataset != null)
                {
                    _Dataset.InsertElementAndSetValue(tag, value);
                }
            }
        }
Esempio n. 7
0
        public DicomDataSet GenerateDerivedInstance
        (
            DicomDataSet original,
            RasterImage derivedImage,
            string seriesDescription,
            string seriesNumber,
            string protocolName,
            string userName
        )
        {
            string sopInstanceUID   = GenerateDicomUniqueIdentifier();
            string seriesInstancUID = GenerateDicomUniqueIdentifier();

            PreProcessBitmap(derivedImage);

            DicomDataSet derivedDataSet = Duplicate(original, derivedImage);

            if (!string.IsNullOrEmpty(seriesDescription))
            {
                derivedDataSet.InsertElementAndSetValue(DicomTag.SeriesDescription, seriesDescription);
            }

            if (!string.IsNullOrEmpty(seriesInstancUID))
            {
                derivedDataSet.InsertElementAndSetValue(DicomTag.SeriesInstanceUID, seriesInstancUID);
            }

            if (string.IsNullOrEmpty(sopInstanceUID))
            {
                throw new InvalidOperationException("SOP Instance UID can't be empty.");
            }

            if (!string.IsNullOrEmpty(seriesNumber))
            {
                derivedDataSet.InsertElementAndSetValue(DicomTag.SeriesNumber, seriesNumber);
            }

            if (!string.IsNullOrEmpty(protocolName))
            {
                derivedDataSet.InsertElementAndSetValue(DicomTag.ProtocolName, protocolName);
            }

            derivedDataSet.InsertElementAndSetValue(DicomTag.SeriesDate, original.GetValue <string>(DicomTag.SeriesDate, string.Empty));
            derivedDataSet.InsertElementAndSetValue(DicomTag.SeriesTime, original.GetValue <string>(DicomTag.SeriesTime, string.Empty));

            derivedDataSet.InsertElementAndSetValue(DicomTag.InstanceCreationDate, DateTime.Now);
            derivedDataSet.InsertElementAndSetValue(DicomTag.InstanceCreationTime, DateTime.Now);
            derivedDataSet.InsertElementAndSetValue(DicomTag.ContentDate, DateTime.Now);
            derivedDataSet.InsertElementAndSetValue(DicomTag.ContentTime, DateTime.Now);
            derivedDataSet.InsertElementAndSetValue(DicomTag.DateOfSecondaryCapture, DateTime.Now);
            derivedDataSet.InsertElementAndSetValue(DicomTag.TimeOfSecondaryCapture, DateTime.Now);

            derivedDataSet.InsertElementAndSetValue(DicomTag.SOPInstanceUID, sopInstanceUID);
            derivedDataSet.InsertElementAndSetValue(DicomTag.MediaStorageSOPInstanceUID, sopInstanceUID);

            derivedDataSet.InsertElementAndSetValue(DicomTag.OperatorName, userName);
            derivedDataSet.InsertElementAndSetValue(DicomTag.ConversionType, "WSD");
            derivedDataSet.InsertElementAndSetValue(DicomTag.Modality, "OT");
            derivedDataSet.InsertElementAndSetValue(DicomTag.InstanceNumber, GetInstanceNumber(derivedDataSet) + 1);
            derivedDataSet.InsertElementAndSetValue(DicomTag.ImageType, "DERIVED\\SECONDARY");

            return(derivedDataSet);
        }
Esempio n. 8
0
        public DicomCommandStatusType OnStore
        (
            DicomClient client,
            byte presentationId,
            int messageId,
            string affectedClass,
            string instance,
            DicomCommandPriorityType priority,
            string moveAE,
            int moveMessageId,
            DicomDataSet request
        )
        {
            try
            {
                CStoreClientSessionProxy sessionProxy;
                DicomCommand             command;


                if (request != null && !CanStore(client, instance))
                {
                    return(DicomCommandStatusType.DuplicateInstance);
                }

                if (!ValidateLicense(client, request))
                {
                    return(DicomCommandStatusType.ProcessingFailure);
                }

                _messageId      = messageId;
                _presentationId = presentationId;
                _clientSession  = new ClientSession(client);

                sessionProxy = new CStoreClientSessionProxy(_clientSession, presentationId, messageId, affectedClass, instance, moveAE, moveMessageId);

                if (AddInsSession.DataAccess == null)
                {
                    if (null == DicomCommandFactory.GetInitializationService(typeof(CStoreCommand)))
                    {
                        DicomCommandFactory.RegisterCommandInitializationService(typeof(CStoreCommand),
                                                                                 new StoreCommandInitializationService( ));
                    }

                    command = DicomCommandFactory.GetInstance( ).CreateCStoreCommand(sessionProxy, request);
                }
                else
                {
                    StoreCommandInitializationService service;


                    service = ServiceLocator.Retrieve <StoreCommandInitializationService> ( );
                    command = new InstanceCStoreCommand(sessionProxy, request, AddInsSession.DataAccess);

                    service.ConfigureCommand(command);
                }

                _clientSession.CStoreResponse += new EventHandler <CStoreResponseEventArgs> (_clientSession_CStoreResponse);

                byte[] value = new byte[] { 0x00, 0x01 };

                request.InsertElementAndSetValue(DicomTag.FileMetaInformationVersion, value);
                request.InsertElementAndSetValue(DicomTag.MediaStorageSOPClassUID, affectedClass);
                request.InsertElementAndSetValue(DicomTag.MediaStorageSOPInstanceUID, instance);

                if (request.FindFirstElement(null, DicomTag.ImplementationClassUID, true) == null)
                {
                    request.InsertElementAndSetValue(DicomTag.ImplementationClassUID, (string.IsNullOrEmpty(client.Server.ImplementationClass) ? "1.2.840.114257.1123456" : client.Server.ImplementationClass));
                }

                if (request.FindFirstElement(null, DicomTag.ImplementationVersionName, true) == null)
                {
                    request.InsertElementAndSetValue(DicomTag.ImplementationVersionName, (string.IsNullOrEmpty(client.Server.ImplementationVersionName) ? "LTPACSF V19" : client.Server.ImplementationVersionName));
                }

                _clientSession.ProcessCStoreRequestSync(presentationId, messageId, affectedClass, instance, priority, moveAE, moveMessageId, command);

                if (_status != DicomCommandStatusType.Success)
                {
                    SaveFailedStoreRequest(request, _status.ToString( ), client);
                }

                return(_status);
            }
            catch (Exception exception)
            {
                SaveFailedStoreRequest(request, exception.Message, client);

                throw;
            }
            finally
            {
                if (null != request)
                {
                    request.Dispose( );
                }
            }
        }
        protected override void OnDoWork(DoWorkEventArgs e)
        {
            List <string> dicomFiles;
            int           count             = 0;
            int           successCount      = 0;
            int           failureCount      = 0;
            int           selectedFileCount = 0;
            int           totalFileCount    = 0;

            string[] selectedFileArray = e.Argument as string[];
            if (selectedFileArray != null)
            {
                selectedFileCount = selectedFileArray.Length;
            }

            if (this.CancellationPending)
            {
                // e.Cancel = true;
                e.Result = GetCancelResult(selectedFileCount, successCount, failureCount);
                return;
            }


            dicomFiles = GetDicomFiles(e);

            if (dicomFiles != null)
            {
                totalFileCount = dicomFiles.Count;
            }

            if (this.CancellationPending)
            {
                // e.Cancel = true;
                e.Result = GetCancelResult(totalFileCount, successCount, failureCount);
                return;
            }

            MultiDicomImportEventArgs args = new MultiDicomImportEventArgs(totalFileCount);

            EventBroker.Instance.PublishEvent <MultiDicomImportEventArgs>(this, args);


            foreach (string file in dicomFiles)
            {
                if (this.CancellationPending)
                {
                    // e.Cancel = true;
                    e.Result = GetCancelResult(totalFileCount, successCount, failureCount);
                    return;
                }

                using (DicomDataSet ds = new DicomDataSet( ))
                {
                    DicomCommandStatusType status;
                    string message        = string.Empty;
                    bool   successfulLoad = true;

                    try
                    {
                        ds.Load(file, DicomDataSetLoadFlags.None);
                    }
                    catch (Exception ex)
                    {
                        successfulLoad = false;
                        message        = ex.Message;
                        if (!File.Exists(file))
                        {
                            message = string.Format(@"File does not exist");

                            // This is needed for the following case
                            // If importing a DICOMDIR references a large number of files that do not exist, processing occurs so quickly that the import cannot be cancelled.
                            // So in the case that a file does not exists (i.e. abnormal condition), sleep for 100 ms to give the user time to cancel
                            Thread.Sleep(100);
                        }
                    }

                    count++;

                    AddDicomWorkerProgressState state;
                    StoreClientSessionProxy     proxy;
                    InstanceCStoreCommand       cmd;

                    if (successfulLoad && !OnCancelStore(ds, out message))
                    {
                        proxy = new StoreClientSessionProxy();
                        cmd   = new InstanceCStoreCommand(proxy, ds, _DataAccess);


                        proxy.AffectedSOPInstance = ds.GetValue <string>(DicomTag.SOPInstanceUID, string.Empty);
                        proxy.AbstractClass       = ds.GetValue <string>(DicomTag.SOPClassUID, string.Empty);
                        proxy.ServerName          = _AETitle;
                        proxy.ClientName          = _AETitle;


                        ds.InsertElementAndSetValue(DicomTag.MediaStorageSOPInstanceUID, proxy.AffectedSOPInstance);
                        ds.InsertElementAndSetValue(DicomTag.ImplementationClassUID, _ImplementationClassUID);

                        state = new AddDicomWorkerProgressState();

                        OnStoreCommandCreated(this, new StoreCommandEventArgs(cmd));

                        cmd.Execute();

                        status  = proxy.LastStatus;
                        message = proxy.LastStatusDescriptionMessage;
                    }
                    else
                    {
                        state  = new AddDicomWorkerProgressState();
                        status = DicomCommandStatusType.ProcessingFailure;
                    }

                    if (status == DicomCommandStatusType.Success)
                    {
                        successCount++;

                        state.CurrentCount = successCount;
                    }
                    else
                    {
                        failureCount++;

                        state.CurrentCount = failureCount;
                    }

                    state.Status        = status;
                    state.TotalCount    = dicomFiles.Count;
                    state.File          = file;
                    state.LoadedDataSet = ds;
                    state.Description   = message;

                    ReportProgress((count * 100) / dicomFiles.Count, state);
                }
            }

            AddDicomWorkerResultState resultState = new AddDicomWorkerResultState();

            resultState.SuccessCount = successCount;
            resultState.FailedCount  = failureCount;
            e.Result = resultState;
        }
Esempio n. 10
0
 private void SetSomeTag(DicomDataSet ds, string FileName)
 {
     try
     {
         
         DicomElement element = ds.FindFirstElement(null, DicomTag.PatientID, false);
         if (element != null)
         {
             ds.DeleteElement(element);
             ds = ds.InsertElementAndSetValue(DicomTag.PatientID, txtID2.Text.Trim());
         }
         if (element == null) ds = ds.InsertElementAndSetValue(DicomTag.PatientID, txtID2.Text.Trim());
         //RegistrationSequence
         element = ds.FindFirstElement(null, DicomTag.RegistrationSequence, false);
         if (element != null)
         {
             ds.DeleteElement(element);
             ds = ds.InsertElementAndSetValue(DicomTag.RegistrationSequence, txtRegNumber2.Text.Trim());
         }
         if (element == null) ds = ds.InsertElementAndSetValue(DicomTag.RegistrationSequence, txtRegNumber2.Text.Trim());
         //Sex
         element = ds.FindFirstElement(null, DicomTag.PatientSex, false);
         if (element != null)
         {
             ds.DeleteElement(element);
             ds = ds.InsertElementAndSetValue(DicomTag.PatientSex, Sex);
         }
         if (element == null) ds = ds.InsertElementAndSetValue(DicomTag.PatientSex, Sex);
         //CreatedDate
         element = ds.FindFirstElement(null, DicomTag.DateTime, false);
         if (element != null)
         {
             ds.DeleteElement(element);
             ds = ds.InsertElementAndSetValue(DicomTag.DateTime, RegDate.ToLongTimeString());
         }
         if (element == null) ds = ds.InsertElementAndSetValue(DicomTag.DateTime, RegDate.ToLongTimeString());
         //pBirthdate
         element = ds.FindFirstElement(null, DicomTag.PatientBirthDate, false);
         if (element != null)
         {
             ds.DeleteElement(element);
             ds = ds.InsertElementAndSetValue(DicomTag.PatientBirthDate, BirthDate);
         }
         if (element == null) ds = ds.InsertElementAndSetValue(DicomTag.PatientBirthDate, BirthDate);
         //pName
         element = ds.FindFirstElement(null, DicomTag.PatientName, false);
         if (element != null)
         {
             ds.DeleteElement(element);
             ds = ds.InsertElementAndSetValue(DicomTag.PatientName, Bodau(txtName2.Text.Trim()));
         }
         if (element == null) ds = ds.InsertElementAndSetValue(DicomTag.PatientName, Bodau(txtName2.Text.Trim()));
         //pAge
         element = ds.FindFirstElement(null, DicomTag.PatientAge, false);
         if (element != null)
         {
             ds.DeleteElement(element);
             ds = ds.InsertElementAndSetValue(DicomTag.PatientAge, txtAge.Text.Trim());
         }
         if (element == null) ds = ds.InsertElementAndSetValue(DicomTag.PatientAge, txtAge.Text.Trim());
     }
     catch
     {
     }
 }
Esempio n. 11
0
        /// <summary>
        /// Finds the image.
        /// </summary>
        /// <param name="addin">The addin.</param>
        /// <param name="affectedClass">The affected class.</param>
        /// <param name="connection">The connection.</param>
        /// <param name="ds">The ds.</param>
        /// <param name="response">The response.</param>
        /// <returns></returns>
        public static DicomCommandStatusType FindImage(FindAddIn addin, string affectedClass, string connection, DicomDataSet ds, DicomDataSet response)
        {
            string          filter = string.Empty;
            string          temp;
            SqlCeDataReader reader;

            filter  = "s.StudyInstanceUID = '" + ds.GetValue <string>(DicomTag.StudyInstanceUID, string.Empty) + "'";
            filter += " AND SeriesInstanceUID = '" + ds.GetValue <string>(DicomTag.SeriesInstanceUID, string.Empty) + "'";

            temp = ds.GetValue <string>(DicomTag.PatientID, string.Empty);
            if (affectedClass == DicomUidType.PatientRootQueryFind && temp.Length > 0)
            {
                filter += " AND p.PatientID = '" + temp + "'";
            }

            List <string> instances = ds.GetValue <List <string> >(DicomTag.SOPInstanceUID, new List <string>());

            foreach (string instance in instances)
            {
                filter += " AND SOPInstanceUID ='" + instance + "'";
            }

            temp = ds.GetValue <string>(DicomTag.InstanceNumber, string.Empty);
            if (temp.Length > 0)
            {
                filter += " AND InstanceNumber = " + temp.ToString();
            }

            filter = "SELECT p.PatientId,Name,Images.* FROM Images JOIN Studies s ON s.StudyInstanceUid = images.StudyInstanceUid JOIN Patients p ON p.PatientId = s.PatientId WHERE " + filter;
            reader = SqlCeHelper.ExecuteReader(connection, filter);
            while (reader.Read())
            {
                response.InsertElementAndSetValue(DicomTag.SOPInstanceUID, reader["SOPInstanceUID"]);
                if (affectedClass == DicomUidType.PatientRootQueryFind)
                {
                    response.InsertElementAndSetValue(DicomTag.PatientID, ds.GetValue <string>(DicomTag.PatientID, string.Empty));
                }

                if (reader["ImageNumber"] != null && reader["ImageNumber"].ToString().Length > 0)
                {
                    response.InsertElementAndSetValue(DicomTag.InstanceNumber, reader["ImageNumber"]);
                }

                if (addin.OnMatchFound(response))
                {
                    reader.Close();
                    return(DicomCommandStatusType.Cancel);
                }
                else if (addin.Cancel)
                {
                    if (addin.BreakType == BreakType.Cancel)
                    {
                        return(DicomCommandStatusType.Cancel);
                    }
                    else
                    {
                        return(DicomCommandStatusType.Failure);
                    }
                }

                //response.Clear();
            }

            return(DicomCommandStatusType.Success);
        }
Esempio n. 12
0
        /// <summary>
        /// Finds the series.
        /// </summary>
        /// <param name="addin">The addin.</param>
        /// <param name="affectedClass">The affected class.</param>
        /// <param name="connection">The connection.</param>
        /// <param name="ds">The ds.</param>
        /// <param name="response">The response.</param>
        /// <returns></returns>
        public static DicomCommandStatusType FindSeries(FindAddIn addin, string affectedClass, string connection, DicomDataSet ds, DicomDataSet response)
        {
            string          filter = string.Empty;
            string          temp;
            SqlCeDataReader reader;

            filter = "s.StudyInstanceUID = '" + ds.GetValue <string>(DicomTag.StudyInstanceUID, string.Empty) + "'";

            temp = ds.GetValue <string>(DicomTag.PatientID, string.Empty);
            if (affectedClass == DicomUidType.PatientRootQueryFind && temp.Length > 0)
            {
                filter += " AND p.PatientID = '" + temp + "'";
            }

            temp = ds.GetValue <string>(DicomTag.SeriesInstanceUID, string.Empty);
            if (temp.Length > 0)
            {
                filter += " AND SeriesInstanceUID='" + temp + "'";
            }

            temp = ds.GetValue <string>(DicomTag.Modality, string.Empty);
            if (temp.Length > 0)
            {
                filter += " AND Modality LIKE '" + temp + "'";
            }

            temp = ds.GetValue <string>(DicomTag.SeriesNumber, string.Empty);
            if (temp.Length > 0)
            {
                filter += " AND SeriesNumber = " + temp;
            }

            filter = "SELECT p.PatientId,Name,Series.* FROM Series JOIN Studies s ON s.StudyInstanceUid = Series.StudyInstanceUid JOIN Patients p ON p.PatientId = s.PatientId WHERE " + filter;
            reader = SqlCeHelper.ExecuteReader(connection, filter);
            while (reader.Read())
            {
                response.InsertElementAndSetValue(DicomTag.SeriesInstanceUID, reader["SeriesInstanceUID"]);

                if (reader["Modality"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.Modality, reader["Modality"]);
                }
                if (reader["SeriesNumber"] != null && IsInteger(reader["SeriesNumber"].ToString()))
                {
                    response.InsertElementAndSetValue(DicomTag.SeriesNumber, reader["SeriesNumber"]);
                }
                if (reader["SeriesDate"] != null && reader["SeriesDate"].ToString().Length > 0)
                {
                    DateTime date = DateTime.Parse(reader["SeriesDate"].ToString());

                    response.InsertElementAndSetValue(DicomTag.SeriesDate, date.ToShortDateString());
                    response.InsertElementAndSetValue(DicomTag.SeriesTime, date.ToShortTimeString());
                }
                if (reader["SeriesDesscription"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.SeriesDescription, reader["SeriesDesscription"].ToString());
                }
                if (reader["StudyInstanceUID"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.StudyInstanceUID, reader["StudyInstanceUID"].ToString());
                }
                try
                {
                    string sql = string.Format("SELECT Count(*) FROM Images WHERE SeriesInstanceUID = '{0}'", reader["SeriesInstanceUID"]);

                    response.InsertElementAndSetValue(DicomTag.NumberOfSeriesRelatedInstances, (int)SqlCeHelper.ExecuteScalar(connection, sql));
                }
                catch { }

                if (addin.OnMatchFound(response))
                {
                    reader.Close();
                    return(DicomCommandStatusType.Cancel);
                }
                else if (addin.Cancel)
                {
                    if (addin.BreakType == BreakType.Cancel)
                    {
                        return(DicomCommandStatusType.Cancel);
                    }
                    else
                    {
                        return(DicomCommandStatusType.Failure);
                    }
                }


                //response.Clear();
            }

            return(DicomCommandStatusType.Success);
        }
Esempio n. 13
0
        public static DicomCommandStatusType FindPatient(FindAddIn addin, string connection, DicomDataSet ds, DicomDataSet response)
        {
            string          filter      = string.Empty;
            string          patientID   = ds.GetValue <string>(DicomTag.PatientID, string.Empty);
            string          patientName = ds.GetValue <string>(DicomTag.PatientName, string.Empty);
            SqlCeDataReader reader      = null;

            if (patientID.Length > 0)
            {
                filter = CheckForWildcards("PatientID LIKE '" + patientID + "'");
            }

            if (patientName.Length > 0)
            {
                if (filter.Length > 0)
                {
                    filter += " AND ";
                }
                filter += CheckForWildcards("Name LIKE '" + patientName + "'");
            }

            if (string.IsNullOrEmpty(filter))
            {
                filter = "SELECT * FROM Patients";
            }
            else
            {
                filter = "SELECT * FROM Patients WHERE " + filter;
            }

            reader = SqlCeHelper.ExecuteReader(connection, filter);
            while (reader.Read())
            {
                response.InsertElementAndSetValue(DicomTag.PatientID, reader["PatientID"]);
                if (reader["Name"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.PatientName, reader["Name"]);
                }
                if (reader["BirthDate"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.PatientBirthDate, reader["BirthDate"]);
                }
                if (reader["Sex"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.PatientSex, reader["Sex"]);
                }
                if (reader["EthnicGroup"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.EthnicGroup, reader["EthnicGroup"]);
                }
                if (reader["Comments"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.PatientComments, reader["Comments"]);
                }
                if (addin.OnMatchFound(response))
                {
                    reader.Close();
                    return(DicomCommandStatusType.Cancel);
                }
                else if (addin.Cancel)
                {
                    if (addin.BreakType == BreakType.Cancel)
                    {
                        return(DicomCommandStatusType.Cancel);
                    }
                    else
                    {
                        return(DicomCommandStatusType.Failure);
                    }
                }

                //response.Clear();
            }
            return(DicomCommandStatusType.Success);
        }
Esempio n. 14
0
        /// <summary>
        /// Finds the study.
        /// </summary>
        /// <param name="addin">The addin.</param>
        /// <param name="connection">The connection.</param>
        /// <param name="ds">The ds.</param>
        /// <param name="response">The response.</param>
        /// <returns></returns>
        public static DicomCommandStatusType FindStudy(FindAddIn addin, string connection, DicomDataSet ds, DicomDataSet response)
        {
            string          filter = string.Empty;
            string          temp;
            SqlCeDataReader reader;

            temp = ds.GetValue <string>(DicomTag.PatientID, string.Empty);
            if (temp.Length > 0)
            {
                filter = CheckForWildcards("Studies.PatientId = '" + temp + "'");
            }

            temp = ds.GetValue <string>(DicomTag.PatientName, string.Empty);
            if (temp.Length > 0)
            {
                if (filter.Length > 0)
                {
                    filter += " AND ";
                }
                filter += CheckForWildcards("Name LIKE '" + temp + "'");
            }

            List <string> instances = ds.GetValue <List <string> >(DicomTag.StudyInstanceUID, new List <string>());

            foreach (string instance in instances)
            {
                if (filter.Length > 0)
                {
                    filter += " AND ";
                }

                filter += CheckForWildcards("StudyInstanceUid = '" + instance + "'");
            }

            DicomDateRangeValue[] d = ExtensionMethods.GetDateRange(ds, DicomTag.StudyDate);
            DicomTimeRangeValue[] t = ExtensionMethods.GetTimeRange(ds, DicomTag.StudyTime);
            int dCount     = (d == null ? 0 : d.Length);
            int tCount     = (t == null ? 0 : t.Length);
            int maxEntries = Math.Max(dCount, tCount);

            for (int i = 0; i < maxEntries; i++)
            {
                DateTime startDate      = new DateTime(1900, 1, 1, 0, 0, 0);
                DateTime endDate        = new DateTime(3000, 12, 31, 23, 59, 59);
                DateTime startTime      = DateTime.MinValue;
                DateTime endTime        = DateTime.MaxValue;
                string   sStartDateTime = string.Empty;
                string   sEndDateTime   = string.Empty;

                // Get the start date and end date
                if (i < dCount)
                {
                    // start date
                    if ((d[i].Type == DicomRangeType.Lower) || (d[i].Type == DicomRangeType.Both))
                    {
                        startDate = new DateTime(d[i].Date1.Year, d[i].Date1.Month, d[i].Date1.Day, 0, 0, 0);
                    }

                    // end date
                    if (d[i].Type == DicomRangeType.Upper)
                    {
                        endDate = new DateTime(d[i].Date1.Year, d[i].Date1.Month, d[i].Date1.Day, 23, 59, 59);
                    }
                    else if (d[i].Type == DicomRangeType.Both)
                    {
                        endDate = new DateTime(d[i].Date2.Year, d[i].Date2.Month, d[i].Date2.Day, 23, 59, 59);
                    }
                }

                // Get the start time and end time
                if (i < tCount)
                {
                    // start date
                    if ((t[i].Type == DicomRangeType.Lower) || (t[i].Type == DicomRangeType.Both))
                    {
                        startTime = new DateTime(1, 1, 1, t[i].Time1.Hours, t[i].Time1.Minutes, t[i].Time1.Seconds);
                    }

                    // end date
                    if (t[i].Type == DicomRangeType.Upper)
                    {
                        endTime = new DateTime(1, 1, 1, t[i].Time1.Hours, t[i].Time1.Minutes, t[i].Time1.Seconds);
                    }
                    else if (t[i].Type == DicomRangeType.Both)
                    {
                        endTime = new DateTime(1, 1, 1, t[i].Time2.Hours, t[i].Time2.Minutes, t[i].Time2.Seconds);
                    }
                }

                string sAdd = string.Format("( (StudyDate >= '{0}') and (StudyDate <= '{1}'))", startDate, endDate);
                string sTimeFormatString = "AND ((CONVERT(nvarchar,StudyDate,108) BETWEEN '{0}' AND '{1}'))";

                filter += sAdd;
                sAdd    = string.Format(sTimeFormatString, startTime.ToString("HH:mm:ss"), endTime.ToString("HH:mm:ss"));
                filter += sAdd;
            }

            temp = ds.GetValue <string>(DicomTag.AccessionNumber, string.Empty);
            if (temp.Length > 0)
            {
                if (filter.Length > 0)
                {
                    filter += " AND ";
                }
                filter += CheckForWildcards("AccessionNumber = '" + temp + "'");
            }

            temp = ds.GetValue <string>(DicomTag.StudyID, string.Empty);
            if (temp.Length > 0)
            {
                if (filter.Length > 0)
                {
                    filter += " AND ";
                }
                filter += CheckForWildcards("StudyId LIKE '" + temp + "'");
            }

            temp = ds.GetValue <string>(DicomTag.ReferringPhysicianName, string.Empty);
            if (temp.Length > 0)
            {
                temp = temp.Replace("*", "%");
                if (filter.Length > 0)
                {
                    filter += " AND ";
                }
                filter += CheckForWildcards("ReferDrName LIKE '" + temp + "'");
            }

            temp = FindElementModalitiesInStudy(ds);
            if (temp.Length > 0)
            {
                if (filter.Length > 0)
                {
                    filter += " AND ";
                }
                filter += temp;
            }

            if (string.IsNullOrEmpty(filter))
            {
                filter = "SELECT p.PatientId,Name,Studies.* FROM Studies JOIN Patients p ON p.PatientId = Studies.PatientId";
            }
            else
            {
                filter = "SELECT p.PatientId,Name,Studies.* FROM Studies JOIN Patients p ON p.PatientId = Studies.PatientId WHERE " + filter;
            }


            reader = SqlCeHelper.ExecuteReader(connection, filter);
            while (reader.Read())
            {
                response.InsertElementAndSetValue(DicomTag.StudyInstanceUID, reader["StudyInstanceUID"]);

                if (reader["StudyDate"] != System.DBNull.Value)
                {
                    DateTime date = DateTime.Parse(reader["StudyDate"].ToString());

                    response.InsertElementAndSetValue(DicomTag.StudyDate, date.ToShortDateString());
                    response.InsertElementAndSetValue(DicomTag.StudyTime, date.ToShortTimeString());
                }

                if (reader["AccessionNumber"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.AccessionNumber, reader["AccessionNumber"]);
                }
                if (reader["StudyId"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.StudyID, reader["StudyId"]);
                }
                if (reader["PatientID"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.PatientID, reader["PatientId"]);
                }
                if (reader["Name"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.PatientName, reader["Name"]);
                }
                if (reader["ReferDrName"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.ReferringPhysicianName, reader["ReferDrName"]);
                }
                if (reader["StudyDescription"] != null)
                {
                    response.InsertElementAndSetValue(DicomTag.StudyDescription, reader["StudyDescription"]);
                }

                try
                {
                    string sql = string.Format("SELECT Count(*) FROM Series WHERE StudyInstanceUid = '{0}'", reader["StudyInstanceUID"]);

                    response.InsertElementAndSetValue(DicomTag.NumberOfStudyRelatedSeries, (int)SqlCeHelper.ExecuteScalar(connection, sql));
                    sql = string.Format("SELECT Count(*) FROM Images WHERE StudyInstanceUid = '{0}'", reader["StudyInstanceUID"]);
                    response.InsertElementAndSetValue(DicomTag.NumberOfStudyRelatedInstances, (int)SqlCeHelper.ExecuteScalar(connection, sql));
                }
                catch { }

                if (addin.OnMatchFound(response))
                {
                    reader.Close();
                    return(DicomCommandStatusType.Cancel);
                }
                else if (addin.Cancel)
                {
                    if (addin.BreakType == BreakType.Cancel)
                    {
                        return(DicomCommandStatusType.Cancel);
                    }
                    else
                    {
                        return(DicomCommandStatusType.Failure);
                    }
                }

                //response.Clear();
            }
            return(DicomCommandStatusType.Success);
        }
Esempio n. 15
0
        private static void InsertPatientInfo(QueryOptions options, DicomDataSet query)
        {
            if (options.PatientsOptions != null)
            {
                if (!string.IsNullOrEmpty(options.PatientsOptions.BirthDate))
                {
                    query.InsertElementAndSetValue(DicomTag.PatientBirthDate, options.PatientsOptions.BirthDate);
                }
                else
                {
                    query.InsertElementAndSetValue(DicomTag.PatientBirthDate, string.Empty);
                }

                if (!string.IsNullOrEmpty(options.PatientsOptions.PatientID))
                {
                    query.InsertElementAndSetValue(DicomTag.PatientID, options.PatientsOptions.PatientID);
                }
                else
                {
                    query.InsertElementAndSetValue(DicomTag.PatientID, string.Empty);
                }

                if (!string.IsNullOrEmpty(options.PatientsOptions.PatientName))
                {
                    query.InsertElementAndSetValue(DicomTag.PatientName, options.PatientsOptions.PatientName);
                }
                else
                {
                    query.InsertElementAndSetValue(DicomTag.PatientName, string.Empty);
                }

                if (!string.IsNullOrEmpty(options.PatientsOptions.Sex))
                {
                    query.InsertElementAndSetValue(DicomTag.PatientSex, options.PatientsOptions.Sex);
                }
                else
                {
                    query.InsertElementAndSetValue(DicomTag.PatientSex, string.Empty);
                }
            }
            else
            {
                query.InsertElementAndSetValue(DicomTag.PatientBirthDate, string.Empty);
                query.InsertElementAndSetValue(DicomTag.PatientID, string.Empty);
                query.InsertElementAndSetValue(DicomTag.PatientName, string.Empty);
                query.InsertElementAndSetValue(DicomTag.PatientSex, string.Empty);
            }
        }
Esempio n. 16
0
        public static DicomDataSet GeneratePresentationStateForAnnotations
        (
            string userName,
            string seriesInstanceUID,
            string annotationData,
            string description,
            string userData,
            DataSet seriesDs
        )
        {
            AnnCodecs codec = new AnnCodecs();

            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(annotationData)))
            {
                ms.Position = 0;
                AnnCodecsInfo codecInfo = codec.GetInfo(ms);
                ms.Position = 0;
                JavaScriptSerializer      jsSerialzer = new JavaScriptSerializer();
                DicomAnnotationsUtilities dicomAnnotationsUtilities = new DicomAnnotationsUtilities();

                if (null == seriesDs || seriesDs.Tables[DataTableHelper.PatientTableName].Rows.Count == 0 || seriesDs.Tables[DataTableHelper.StudyTableName].Rows.Count == 0)
                {
                    throw new Exception("Series not found");
                }

                DicomDataSet ds = new DicomDataSet();

                {
                    DataRow patient = seriesDs.Tables[DataTableHelper.PatientTableName].Rows[0];
                    DataRow study   = seriesDs.Tables[DataTableHelper.StudyTableName].Rows[0];

                    IPatientInfo        patientInfo = RegisteredDataRows.PatientInfo;
                    PersonNameComponent pn          = patientInfo.Name(patient);
                    string sFamilyName = pn.FamilyName;
                    string sGivenName  = pn.GivenName;
                    string sMiddleName = pn.MiddleName;
                    string sNamePrefix = pn.NamePrefix;
                    string sNameSuffix = pn.NameSuffix;
                    string sPatientId  = patientInfo.GetElementValue(patient, DicomTag.PatientID);

                    //Patient Module C.7.1.1
                    ds.InsertElementAndSetValue(DicomTag.PatientName, string.Format("{0}^{1}^{2}^{3}^{4}",
                                                                                    string.IsNullOrEmpty(sFamilyName) ? "" : sFamilyName,
                                                                                    string.IsNullOrEmpty(sGivenName) ? "" : sGivenName,
                                                                                    string.IsNullOrEmpty(sMiddleName) ? "" : sMiddleName,
                                                                                    string.IsNullOrEmpty(sNamePrefix) ? "" : sNamePrefix,
                                                                                    string.IsNullOrEmpty(sNameSuffix) ? "" : sNameSuffix));

                    ds.InsertElementAndSetValue(DicomTag.PatientID, sPatientId);
                    ds.InsertElementAndSetValue(DicomTag.PatientBirthDate, "");
                    ds.InsertElementAndSetValue(DicomTag.PatientSex, "");

                    IStudyInfo studyInfo         = RegisteredDataRows.StudyInfo;
                    string     sStudyInstanceUid = studyInfo.GetElementValue(study, DicomTag.StudyInstanceUID);
                    string     sAccessionNumber  = studyInfo.GetElementValue(study, DicomTag.AccessionNumber);
                    string     sStudyId          = studyInfo.GetElementValue(study, DicomTag.StudyID);

                    //Study Module C.7.2.1
                    ds.InsertElementAndSetValue(DicomTag.StudyInstanceUID, sStudyInstanceUid);
                    ds.InsertElementAndSetValue(DicomTag.StudyDate, "");
                    ds.InsertElementAndSetValue(DicomTag.StudyTime, "");
                    ds.InsertElementAndSetValue(DicomTag.ReferringPhysicianName, "");
                    ds.InsertElementAndSetValue(DicomTag.StudyID, string.IsNullOrEmpty(sStudyId) ? "" : sStudyId);
                    ds.InsertElementAndSetValue(DicomTag.AccessionNumber, string.IsNullOrEmpty(sAccessionNumber) ? "" : sAccessionNumber);

                    //Series Module C.7.3.1
                    ds.InsertElementAndSetValue(DicomTag.SeriesInstanceUID, SeriesGenerator.GenerateDicomUniqueIdentifier());
                    ds.InsertElementAndSetValue(DicomTag.Modality, "PR");
                    ds.InsertElementAndSetValue(DicomTag.SeriesNumber, 1);
                    ds.InsertElementAndSetValue(DicomTag.SeriesDate, DicomDateValue.Now);
                    ds.InsertElementAndSetValue(DicomTag.SeriesTime, DicomTimeValue.Now);
                    ds.InsertElementAndSetValue(DicomTag.SeriesDescription, "Annotations presentation state");

                    //General Equipment Module C.7.5.1
                    ds.InsertElementAndSetValue(DicomTag.Manufacturer, "LEADTOOLS IMAGING");
                    ds.InsertElementAndSetValue(DicomTag.InstitutionName, "LEADTOOLS, INC.");
                    ds.InsertElementAndSetValue(DicomTag.StationName, "HTML5 Viewer");

                    //Presentation State Identification Module C.11.10
                    ds.InsertElementAndSetValue(DicomTag.PresentationCreationDate, DicomDateValue.Now);
                    ds.InsertElementAndSetValue(DicomTag.PresentationCreationTime, DicomTimeValue.Now);
                    //Content Identification Macro Table 10-12
                    ds.InsertElementAndSetValue(DicomTag.InstanceNumber, 1);
                    ds.InsertElementAndSetValue(DicomTag.ContentLabel, "ANNOTATIONS");
                    ds.InsertElementAndSetValue(DicomTag.ContentDescription, description);
                    ds.InsertElementAndSetValue(DicomTag.ContentCreatorName, userName);

                    //Presentation State RelationShip Module C11.11
                    PresentationStateRelationShip referncedSeriesSeq = new PresentationStateRelationShip();
                    referncedSeriesSeq.ReferencedSeriesSequence = new List <ReferencedSeries>();
                    ReferencedSeries referencedSeries = new ReferencedSeries();
                    referencedSeries.SeriesInstanceUID       = seriesInstanceUID;
                    referencedSeries.ReferencedImageSequence = new List <SopInstanceReference>();
                    referncedSeriesSeq.ReferencedSeriesSequence.Add(referencedSeries);


                    Dictionary <LeadSize, List <ImageSopInstanceReference> > displayedAreaInstance = new Dictionary <LeadSize, List <ImageSopInstanceReference> >();
                    for (int index = 0; index < codecInfo.Pages.Length; index++)
                    {
                        AnnContainer container = codec.Load(ms, codecInfo.Pages[index]);
                        ms.Position = 0;

                        if (null == container.UserData)
                        {
                            continue;
                        }

                        AnnUserData refInstance = (AnnUserData)jsSerialzer.Deserialize <AnnUserData>(container.UserData.ToString());

                        if (null != refInstance && null != refInstance.ReferencedImageSequence)
                        {
                            referncedSeriesSeq.ReferencedSeriesSequence[0].ReferencedImageSequence.Add(refInstance.ReferencedImageSequence);

                            // The Medical Viewer defaults dpi to 150
                            // In this case, there is enough information to compute the dpi, which should be 150

                            //double dpiX = 0;
                            //double dpiY = 0;
                            //container.CalculateDpi(out dpiX, out dpiY);

                            //if (dpiX == 0 || dpiY == 0)
                            //{
                            //   dpiX = 150.0;
                            //   dpiY = 150.0;
                            //}
                            double xDpi = 150;
                            double yDpi = 150;

                            dicomAnnotationsUtilities.ImageDpiX = xDpi;
                            dicomAnnotationsUtilities.ImageDpiY = yDpi;


                            DicomElement graphicSequenceItem = dicomAnnotationsUtilities.FromAnnContainerToDataSet(ds, container);

                            DicomElement layerElement = ds.FindFirstElement(graphicSequenceItem, DicomTag.GraphicLayer, false);

                            if (null == layerElement)
                            {
                                ds.InsertElementAndSetValue(graphicSequenceItem, true, DicomTag.GraphicLayer, "LAYER1");
                            }
                            else
                            {
                                ds.SetStringValue(layerElement, "LAYER1", DicomCharacterSetType.Default);
                            }

                            GraphicAnnotationsModule annModule = new GraphicAnnotationsModule();

                            annModule.ReferencedImageSequence = new List <ImageSopInstanceReference>();
                            annModule.ReferencedImageSequence.Add(refInstance.ReferencedImageSequence);

                            ds.Set(graphicSequenceItem, annModule);
                        }

                        if (!refInstance.ImageSize.IsEmpty)
                        {
                            if (!displayedAreaInstance.ContainsKey(refInstance.ImageSize))
                            {
                                displayedAreaInstance[refInstance.ImageSize] = new List <ImageSopInstanceReference>();
                            }

                            displayedAreaInstance[refInstance.ImageSize].Add(refInstance.ReferencedImageSequence);
                        }
                    }

                    ds.Set(referncedSeriesSeq);

                    //Displayed Area Module
                    //
                    //
                    DisplayedAreaModule displayedAreaModule = new DisplayedAreaModule();


                    displayedAreaModule.DisplayedAreaSelection = new List <DisplayedAreaSelection>();

                    foreach (KeyValuePair <LeadSize, List <ImageSopInstanceReference> > areaInstance in displayedAreaInstance)
                    {
                        DisplayedAreaSelection displayedArea = new DisplayedAreaSelection();
                        displayedAreaModule.DisplayedAreaSelection.Add(displayedArea);
                        displayedArea.DisplayedAreaTopLeftHandCorner     = new List <long>();
                        displayedArea.DisplayedAreaBottomRightHandCorner = new List <long>();
                        displayedArea.DisplayedAreaTopLeftHandCorner.Add(1);
                        displayedArea.DisplayedAreaTopLeftHandCorner.Add(1);
                        displayedArea.DisplayedAreaBottomRightHandCorner.Add(areaInstance.Key.Width);
                        displayedArea.DisplayedAreaBottomRightHandCorner.Add(areaInstance.Key.Height);
                        displayedArea.PresentationSizeMode         = PresentationSizeMode.ScaleToFit;
                        displayedArea.PresentationPixelAspectRatio = new List <int>();
                        displayedArea.PresentationPixelAspectRatio.Add(1);
                        displayedArea.PresentationPixelAspectRatio.Add(1);

                        if (displayedAreaInstance.Count > 1)
                        {
                            displayedArea.ReferencedImageSequence = areaInstance.Value;
                        }
                    }

                    ds.Set(displayedAreaModule);

                    //Graphic Layer Module
                    GraphicLayerModule graphicLayerModule = new GraphicLayerModule();
                    graphicLayerModule.GraphicLayerSequence = new List <GraphicLayer>();
                    GraphicLayer layer = new GraphicLayer();
                    layer.GraphicLayerName  = "LAYER1";
                    layer.GraphicLayerOrder = 1;
                    graphicLayerModule.GraphicLayerSequence.Add(layer);

                    ds.Set(graphicLayerModule);

                    //Softcopy Presentation LUT Module
                    SoftCopyPresentationLutModule presentationLut = new SoftCopyPresentationLutModule();
                    presentationLut.PresentationLutShape = PresentationLutShape.Identity;

                    ds.Set(presentationLut);

                    //SOP Common Module
                    ds.InsertElementAndSetValue(DicomTag.SOPClassUID, DicomUidType.GrayscaleSoftcopyPresentationStateStorage);
                    ds.InsertElementAndSetValue(DicomTag.SOPInstanceUID, SeriesGenerator.GenerateDicomUniqueIdentifier());
                    ds.InsertElementAndSetValue(DicomTag.InstanceCreationDate, DicomDateValue.Now);
                    ds.InsertElementAndSetValue(DicomTag.InstanceCreationTime, DicomDateValue.Now);
                    ds.InsertElementAndSetValue(DicomTag.InstanceNumber, 1);
                }
                return(ds);
            }
        }
Esempio n. 17
0
        public static DicomDataSet GeneratePresentationState(string seriesInstanceUID, string annotationData, string description, DicomDataSet seriesDs, int windowCenter, int windowWidth, out string sopInstanceUID)
        {
            AnnCodecs codec = new AnnCodecs();

            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(annotationData)))
            {
                ms.Position = 0;
                AnnCodecsInfo codecInfo = codec.GetInfo(ms);
                ms.Position = 0;
                JavaScriptSerializer      jsSerialzer = new JavaScriptSerializer();
                DicomAnnotationsUtilities dicomAnnotationsUtilities = new DicomAnnotationsUtilities();
                DicomDataSet ds = new DicomDataSet();


                sopInstanceUID = SeriesGenerator.GenerateDicomUniqueIdentifier();
                //Patient Module C.7.1.1
                ds.InsertElementAndSetValue(DicomTag.PatientName, seriesDs.GetValue <string>(DicomTag.PatientName, string.Empty));

                ds.InsertElementAndSetValue(DicomTag.PatientID, seriesDs.GetValue <string>(DicomTag.PatientID, string.Empty));
                ds.InsertElementAndSetValue(DicomTag.PatientBirthDate, "");
                ds.InsertElementAndSetValue(DicomTag.PatientSex, "");

                //Study Module C.7.2.1
                ds.InsertElementAndSetValue(DicomTag.StudyInstanceUID, seriesDs.GetValue <string>(DicomTag.StudyInstanceUID, string.Empty));
                ds.InsertElementAndSetValue(DicomTag.StudyDate, "");
                ds.InsertElementAndSetValue(DicomTag.StudyTime, "");
                ds.InsertElementAndSetValue(DicomTag.ReferringPhysicianName, "");
                ds.InsertElementAndSetValue(DicomTag.StudyID, seriesDs.GetValue <string>(DicomTag.StudyID, string.Empty));
                ds.InsertElementAndSetValue(DicomTag.AccessionNumber, seriesDs.GetValue <string>(DicomTag.AccessionNumber, string.Empty));

                //Series Module C.7.3.1
                ds.InsertElementAndSetValue(DicomTag.SeriesInstanceUID, SeriesGenerator.GenerateDicomUniqueIdentifier());
                ds.InsertElementAndSetValue(DicomTag.Modality, "PR");
                ds.InsertElementAndSetValue(DicomTag.SeriesNumber, 1);
                ds.InsertElementAndSetValue(DicomTag.SeriesDate, DicomDateValue.Now);
                ds.InsertElementAndSetValue(DicomTag.SeriesTime, DicomTimeValue.Now);
                ds.InsertElementAndSetValue(DicomTag.SeriesDescription, "Study layout presentation state");

                //General Equipment Module C.7.5.1
                ds.InsertElementAndSetValue(DicomTag.Manufacturer, "LEADTOOLS IMAGING");
                ds.InsertElementAndSetValue(DicomTag.InstitutionName, "LEADTOOLS, INC.");
                ds.InsertElementAndSetValue(DicomTag.StationName, "HTML5 Viewer");

                //Presentation State Identification Module C.11.10
                ds.InsertElementAndSetValue(DicomTag.PresentationCreationDate, DicomDateValue.Now);
                ds.InsertElementAndSetValue(DicomTag.PresentationCreationTime, DicomTimeValue.Now);
                //Content Identification Macro Table 10-12
                ds.InsertElementAndSetValue(DicomTag.InstanceNumber, 1);
                ds.InsertElementAndSetValue(DicomTag.ContentLabel, "STUDY LAYOUT PRESENTATION");
                ds.InsertElementAndSetValue(DicomTag.ContentDescription, description);
                //ds.InsertElementAndSetValue(DicomTag.ContentCreatorName, userName);

                //Presentation State RelationShip Module C11.11
                PresentationStateRelationShip referncedSeriesSeq = new PresentationStateRelationShip();
                referncedSeriesSeq.ReferencedSeriesSequence = new List <ReferencedSeries>();
                ReferencedSeries referencedSeries = new ReferencedSeries();
                referencedSeries.SeriesInstanceUID       = seriesInstanceUID;
                referencedSeries.ReferencedImageSequence = new List <SopInstanceReference>();
                referncedSeriesSeq.ReferencedSeriesSequence.Add(referencedSeries);


                Dictionary <LeadSize, List <ImageSopInstanceReference> > displayedAreaInstance = new Dictionary <LeadSize, List <ImageSopInstanceReference> >();
                for (int index = 0; index < codecInfo.Pages.Length; index++)
                {
                    AnnContainer container = codec.Load(ms, codecInfo.Pages[index]);
                    ms.Position = 0;

                    if (null == container.UserData)
                    {
                        continue;
                    }

                    AnnUserData refInstance = (AnnUserData)jsSerialzer.Deserialize <AnnUserData>(container.UserData.ToString());

                    if (null != refInstance && null != refInstance.ReferencedImageSequence)
                    {
                        referncedSeriesSeq.ReferencedSeriesSequence[0].ReferencedImageSequence.Add(refInstance.ReferencedImageSequence);

                        // The Medical Viewer defaults dpi to 150
                        // In this case, there is enough information to compute the dpi, which should be 150

                        //double dpiX = 0;
                        //double dpiY = 0;
                        //container.CalculateDpi(out dpiX, out dpiY);

                        //if (dpiX == 0 || dpiY == 0)
                        //{
                        //   dpiX = 150.0;
                        //   dpiY = 150.0;
                        //}
                        double xDpi = 150;
                        double yDpi = 150;

                        dicomAnnotationsUtilities.ImageDpiX = xDpi;
                        dicomAnnotationsUtilities.ImageDpiY = yDpi;


                        DicomElement graphicSequenceItem = dicomAnnotationsUtilities.FromAnnContainerToDataSet(ds, container);

                        DicomElement layerElement = ds.FindFirstElement(graphicSequenceItem, DicomTag.GraphicLayer, false);

                        if (null == layerElement)
                        {
                            ds.InsertElementAndSetValue(graphicSequenceItem, true, DicomTag.GraphicLayer, "LAYER1");
                        }
                        else
                        {
                            ds.SetStringValue(layerElement, "LAYER1", DicomCharacterSetType.Default);
                        }

                        GraphicAnnotationsModule annModule = new GraphicAnnotationsModule();

                        annModule.ReferencedImageSequence = new List <ImageSopInstanceReference>();
                        annModule.ReferencedImageSequence.Add(refInstance.ReferencedImageSequence);

                        ds.Set(graphicSequenceItem, annModule);
                    }

                    if (!refInstance.ImageSize.IsEmpty)
                    {
                        if (!displayedAreaInstance.ContainsKey(refInstance.ImageSize))
                        {
                            displayedAreaInstance[refInstance.ImageSize] = new List <ImageSopInstanceReference>();
                        }

                        displayedAreaInstance[refInstance.ImageSize].Add(refInstance.ReferencedImageSequence);
                    }
                }

                ds.Set(referncedSeriesSeq);

                //Displayed Area Module
                //
                //
                DisplayedAreaModule displayedAreaModule = new DisplayedAreaModule();


                displayedAreaModule.DisplayedAreaSelection = new List <DisplayedAreaSelection>();

                foreach (KeyValuePair <LeadSize, List <ImageSopInstanceReference> > areaInstance in displayedAreaInstance)
                {
                    DisplayedAreaSelection displayedArea = new DisplayedAreaSelection();
                    displayedAreaModule.DisplayedAreaSelection.Add(displayedArea);
                    displayedArea.DisplayedAreaTopLeftHandCorner     = new List <long>();
                    displayedArea.DisplayedAreaBottomRightHandCorner = new List <long>();
                    displayedArea.DisplayedAreaTopLeftHandCorner.Add(1);
                    displayedArea.DisplayedAreaTopLeftHandCorner.Add(1);
                    displayedArea.DisplayedAreaBottomRightHandCorner.Add(areaInstance.Key.Width);
                    displayedArea.DisplayedAreaBottomRightHandCorner.Add(areaInstance.Key.Height);
                    displayedArea.PresentationSizeMode         = PresentationSizeMode.ScaleToFit;
                    displayedArea.PresentationPixelAspectRatio = new List <int>();
                    displayedArea.PresentationPixelAspectRatio.Add(1);
                    displayedArea.PresentationPixelAspectRatio.Add(1);

                    if (displayedAreaInstance.Count > 1)
                    {
                        displayedArea.ReferencedImageSequence = areaInstance.Value;
                    }
                }

                ds.Set(displayedAreaModule);

                //Graphic Layer Module
                GraphicLayerModule graphicLayerModule = new GraphicLayerModule();
                GraphicLayer       layer = new GraphicLayer();

                graphicLayerModule.GraphicLayerSequence = new List <GraphicLayer>();
                layer.GraphicLayerName  = "LAYER1";
                layer.GraphicLayerOrder = 1;
                graphicLayerModule.GraphicLayerSequence.Add(layer);

                ds.Set(graphicLayerModule);

                //Softcopy Presentation LUT Module
                SoftCopyPresentationLutModule presentationLut = new SoftCopyPresentationLutModule();
                presentationLut.PresentationLutShape = PresentationLutShape.Identity;
                if (windowCenter != -1 || windowWidth != -1)
                {
                    SoftCopyVoiLutModule module = new SoftCopyVoiLutModule();

                    module.WindowCenter = new List <double>();
                    module.WindowCenter.Add(windowCenter);
                    module.WindowWidth = new List <double>();
                    module.WindowWidth.Add(windowWidth);
                    ds.Set(module);
                }

                ds.Set(presentationLut);

                //SOP Common Module
                ds.InsertElementAndSetValue(DicomTag.SOPClassUID, DicomUidType.GrayscaleSoftcopyPresentationStateStorage);
                ds.InsertElementAndSetValue(DicomTag.SOPInstanceUID, sopInstanceUID);
                ds.InsertElementAndSetValue(DicomTag.InstanceCreationDate, DicomDateValue.Now);
                ds.InsertElementAndSetValue(DicomTag.InstanceCreationTime, DicomDateValue.Now);
                ds.InsertElementAndSetValue(DicomTag.InstanceNumber, 1);

                return(ds);
            }
        }
Esempio n. 18
0
        public DicomCommandStatusType OnFind(DicomClient Client, byte PresentationId, int MessageId, string AffectedClass,
                                             DicomCommandPriorityType Priority, DicomDataSet Request)
        {
            if (Request == null)
            {
                return(DicomCommandStatusType.InvalidArgumentValue);
            }

            try
            {
                string level = Request.GetValue <string>(DicomTag.QueryRetrieveLevel, string.Empty);
                DicomCommandStatusType status   = Module.GetAttributeStatus(level, AffectedClass, Request);
                DicomDataSet           response = new DicomDataSet(Client.Server.TemporaryDirectory);

                if (status != DicomCommandStatusType.Success)
                {
                    return(status);
                }

                response.Initialize(DicomClassType.Undefined, DicomDataSetInitializeFlags.ExplicitVR | DicomDataSetInitializeFlags.LittleEndian);
                switch (level.ToUpper())
                {
                case "PATIENT":
                    response.InsertElementAndSetValue(DicomTag.QueryRetrieveLevel, "PATIENT");

                    //
                    // Required Keys
                    //
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.PatientBirthDate);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.PatientBirthTime);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.PatientSex);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.EthnicGroup);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.PatientComments);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.NumberOfPatientRelatedStudies);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.NumberOfPatientRelatedSeries);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.NumberOfPatientRelatedInstances);
                    status = DB.FindPatient(this, Module.ServerInfo.ConnectionString, Request, response);
                    break;

                case "STUDY":
                    response.InsertElementAndSetValue(DicomTag.QueryRetrieveLevel, "STUDY");

                    // Required Keys
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.StudyDate);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.StudyTime);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.AccessionNumber);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.StudyID);

                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.PatientName);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.PatientID);

                    // Optional Keys
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.StudyDescription);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.ReferringPhysicianName);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.NumberOfStudyRelatedSeries);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.NumberOfStudyRelatedInstances);
                    status = DB.FindStudy(this, Module.ServerInfo.ConnectionString, Request, response);
                    break;

                case "SERIES":
                    response.InsertElementAndSetValue(DicomTag.QueryRetrieveLevel, "SERIES");

                    // Required Keys
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.StudyInstanceUID);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.Modality);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.SeriesNumber);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.SeriesDate);

                    // Optional Keys
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.SeriesDescription);
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.NumberOfSeriesRelatedInstances);
                    status = DB.FindSeries(this, AffectedClass, Module.ServerInfo.ConnectionString, Request, response);
                    break;

                case "IMAGE":
                    response.InsertElementAndSetValue(DicomTag.QueryRetrieveLevel, "IMAGE");

                    // Required Keys
                    ExtensionMethods.InsertKeyElement(response, Request, DicomTag.InstanceNumber);
                    status = DB.FindImage(this, AffectedClass, Module.ServerInfo.ConnectionString, Request, response);
                    break;

                default:
                    return(DicomCommandStatusType.InvalidAttributeValue);
                }
                return(status);
            }
            catch (Exception)
            {
                return(DicomCommandStatusType.ProcessingFailure);
            }
        }