예제 #1
0
        /// <summary>
        /// Queries the server indicated in <see cref="Configuration"/>
        /// with the query parameters indicated in <see cref="Study"/>.
        /// Implements the DICOM C-FIND command at STUDY Level.
        /// </summary>
        /// <param name="configuration">Server and client configuration.</param>
        /// <param name="studyQuery">Parameters specifying the query.</param>
        public static List <Study> CFINDStudies(Configuration configuration, Study studyQuery)
        {
            var studyResponses = new List <Study>();
            // init find request
            DicomCFindRequest cfind = new DicomCFindRequest(DicomQueryRetrieveLevel.Study);

            foreach (QueryParameter studyParameter in studyQuery)
            {
                cfind.Dataset.Add(studyParameter.getTag(), studyParameter.value);
            }

            cfind.OnResponseReceived = (request, response) =>
            {
                if (response.HasDataset)
                {
                    studyResponses.Add(new Study(response.Dataset, studyQuery));
                }
                if (!response.HasDataset)
                {
                    Debug.gotNumberOfResults(studyResponses.Count);
                }
            };

            var client = new DicomClient();

            client.AddRequest(cfind);

            // prepare to receive data
            studyResponses = new List <Study>();

            // send query
            Debug.studyQuery(configuration, studyQuery);
            try
            {
                var _networkStream = new DesktopNetworkStream(configuration, true, true);
                client.Send(_networkStream, configuration.thisNodeAET, configuration.AET, 5000);
            }
            catch (Exception) { Debug.cantReachServer(); }

            // arrange results in table
            return(studyResponses);
        }
예제 #2
0
        public void OldDicomClientSend_StorePart10File_ShouldSucceed()
        {
            var port = Ports.GetNext();

            using (var server = DicomServer.Create <CStoreScp>(port))
            {
                server.Logger = _logger.IncludePrefix("CStoreScp");

                var file = DicomFile.Open(@".\Test Data\CT-MONO2-16-ankle");

                var client = new DicomClient
                {
                    Logger = _logger.IncludePrefix("DicomClient")
                };
                client.AddRequest(new DicomCStoreRequest(file));

                var exception = Record.Exception(() => client.Send("127.0.0.1", port, false, "SCU", "SCP"));
                Assert.Null(exception);
            }
        }
예제 #3
0
        /// <summary>
        /// Возвращает всех пациентов из Dicom Worklist
        /// </summary>
        /// <returns></returns>
        public IEnumerable <Patient> GetAllPatients()
        {
            Patient     patient = new Patient();
            var         cfind   = DicomCFindRequest.CreateWorklistQuery();
            DicomClient client  = new DicomClient();

            cfind.OnResponseReceived = (DicomCFindRequest rq, DicomCFindResponse rp) =>
            {
                for (int i = 0; i < rp.Dataset.Count(); i++)
                {
                    patient = GetPatientInformation(rp);
                    _patients.Add(patient);
                }
            };

            client.AddRequest(cfind);
            client.Send(_host, _port, _useTls, _callingAe, _calledAe);

            return(_patients);
        }
예제 #4
0
파일: Form1.cs 프로젝트: yjsyyyjszf/JPACS
        private void btnSendDCM_Click(object sender, EventArgs e)
        {
            try
            {
                var client = new DicomClient();
                client.NegotiateAsyncOps();
                //for (int i = 0; i < 10; i++)
                //{
                //    client.AddRequest(new DicomCEchoRequest());
                //}

                //client.AddRequest(new DicomCStoreRequest(@"test1.dcm"));
                client.AddRequest(new DicomCStoreRequest(@"test1.dcm"));
                client.Send("127.0.0.1", 11123, false, "SCUTEST", "JPACSStoreSCP");
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message);
            }
        }
예제 #5
0
        public async Task DicomClientShallNotCloseConnectionTooEarly_CEchoParallelAsync(int expected)
        {
            int port = Ports.GetNext();

            using (var server = DicomServer.Create <DicomCEchoProvider>(port))
            {
                while (!server.IsListening)
                {
                    await Task.Delay(50);
                }

                var actual = 0;

                var requests = Enumerable.Range(0, expected).Select(
                    async requestIndex =>
                {
                    var client = new DicomClient();
                    client.AddRequest(
                        new DicomCEchoRequest
                    {
                        OnResponseReceived = (req, res) =>
                        {
                            output.WriteLine("Response #{0}", requestIndex);
                            Interlocked.Increment(ref actual);
                        }
                    }
                        );

                    output.WriteLine("Sending #{0}", requestIndex);
                    await client.SendAsync("127.0.0.1", port, false, "SCU", "ANY-SCP", 600 * 1000);
                    output.WriteLine("Sent (or timed out) #{0}", requestIndex);
                }
                    ).ToArray();

                await Task.WhenAll(requests);

                Assert.Equal(expected, actual);
            }
        }
예제 #6
0
        private void echo_click(object sender, EventArgs e)
        {
            DicomCEchoResponse echo_response;
            DicomCEchoRequest  echo_request;


            try
            {
                var client = new DicomClient();
                var CEcho  = new DicomCEchoRequest();
                CEcho.OnResponseReceived = (DicomCEchoRequest rq, DicomCEchoResponse resp) => {
                    if (resp.Status == DicomStatus.Success)
                    {
                        // Console.WriteLine(resp);
                        echostat = true;
                        MessageBox.Show("C-Echo success");
                    }
                    else
                    {
                        echostat = false;
                        MessageBox.Show("C-Echo failure");
                        this.Close();
                    }
                };
                client.NegotiateAsyncOps();

                client.AddRequest(CEcho);
                client.Send(Basic_called_ip, System.Convert.ToInt32(Basic_called_port), false, Basic_called_ae, Basic_calling_ae);
            }
            catch (Exception exc)
            {
                if (!(exc is DicomException))
                {
                    Console.WriteLine(exc.ToString());
                }
                MessageBox.Show("C-Echo failure SSL issue");
                this.Close();
            }
        }
예제 #7
0
        private static DicomClient CreateDicomVerificationClient()
        {
            var client = new DicomClient();

            //register that we want to do a DICOM ping here
            var dicomCEchoRequest = new DicomCEchoRequest();

            //attach an event handler when remote peer responds to echo request
            dicomCEchoRequest.OnResponseReceived += OnEchoResponseReceivedFromRemoteHost;
            client.AddRequest(dicomCEchoRequest);

            //Add a handler to be notified of any association rejections
            client.AssociationRejected += OnAssociationRejected;

            //Add a handler to be notified of any association information on successful connections
            client.AssociationAccepted += OnAssociationAccepted;

            //Add a handler to be notified when association is successfully released - this can be triggered by the remote peer as well
            client.AssociationReleased += OnAssociationReleased;

            return(client);
        }
예제 #8
0
        private void MoveStudies(RetriveEntity RetriveFrom, DicomCMoveRequest cmoveRequest)
        {
            //Try to open Local SCP for CStore Support for comming files
            if (_scuStore == null)
            {
                _scuStore = new DicomServer <CStoreSCU>(_MoverSettings.LocalPort);
            }
            DicomClient clt = new DicomClient();

            cmoveRequest.OnResponseReceived = (request, response) =>
            {
            };
            // Add request to Dicom Client Object.
            clt.AddRequest(cmoveRequest);

            string Host, CalledAE;
            int    Port;

            GetEntityInfo(RetriveFrom, out Host, out Port, out CalledAE);
            clt.Send(Host, Port, false, _MoverSettings.Store_AE_Name, CalledAE);
            autoEvent.WaitOne();
        }
예제 #9
0
        public IEnumerable <string> SearchSeriesOfStudy(string studyUID)
        {
            var client = new DicomClient();

            client.NegotiateAsyncOps();

            List <string> result  = new List <string>();
            var           request = CreateSeriesRequestByStudyUID(studyUID);

            request.OnResponseReceived += (req, response) =>
            {
                if (response.Status == DicomStatus.Pending)
                {
                    result.Add(response.Dataset.GetString(DicomTag.SeriesInstanceUID));
                }
            };
            client.AddRequest(request);

            client.Send(_pacsNode.Host, _pacsNode.Port, false, LocalAET, _pacsNode.AET);

            return(result);
        }
예제 #10
0
        public async Task SearchStudyAsync()
        {
            var client = new DicomClient();

            client.NegotiateAsyncOps();

            // Find a list of Studies.
            var request = CreateStudyRequest(new QueryConditionModel());

            var studies = new List <DicomDataset>();

            request.OnResponseReceived += (req, response) =>
            {
                DebugStudyResponse(response);
                if (response.Status == DicomStatus.Pending)
                {
                    _studies.OnNext(StudyViewHelper.CreateFrom(response.Dataset));
                }
            };
            client.AddRequest(request);
            await client.SendAsync(_pacsNode.Host, _pacsNode.Port, false, LocalAET, _pacsNode.AET);
        }
예제 #11
0
        /// <summary>
        /// Send CGet to Get Target Frame
        /// </summary>
        /// <param name="SOPInstanceUID">the SOPInstanceUID Where Frame in</param>
        /// <param name="FrameIndex"> the FrameIndex Where Frame in</param>
        /// <returns></returns>
        internal async Task SaveTargetFramesAsyn(String SOPInstanceUID, int FrameIndex)
        {
            client = new DicomClient();
            var cGetRequest = CreateCGetRquest_FramesByList(SOPInstanceUID, FrameIndex);

            cGetRequest.Dataset.AddOrUpdate(new DicomTag(0x8, 0x5), "ISO_IR 100");
            cGetRequest.Dataset.AddOrUpdate(new DicomSequence(DicomTag.PerFrameFunctionalGroupsSequence));
            var FrameExtractionSequence = new DicomSequence(DicomTag.FrameExtractionSequence);

            cGetRequest.Dataset.AddOrUpdate(DicomTag.SOPInstanceUID, SOPInstanceUID);

            cGetRequest.Dataset.AddOrUpdate(DicomTag.QueryRetrieveLevel, DicomQueryRetrieveLevel.NotApplicable);

            var pcs = DicomPresentationContext.GetScpRolePresentationContextsFromStorageUids(
                DicomStorageCategory.Image,
                DicomTransferSyntax.ExplicitVRLittleEndian,
                DicomTransferSyntax.ImplicitVRLittleEndian,
                DicomTransferSyntax.ImplicitVRBigEndian,
                DicomTransferSyntax.JPEGLSLossless,
                DicomTransferSyntax.JPEG2000Lossless,
                DicomTransferSyntax.JPEGProcess14SV1,
                DicomTransferSyntax.JPEGProcess14,
                DicomTransferSyntax.RLELossless,
                DicomTransferSyntax.JPEGLSNearLossless,
                DicomTransferSyntax.JPEG2000Lossy,
                DicomTransferSyntax.JPEGProcess1,
                DicomTransferSyntax.JPEGProcess2_4
                );

            client.AdditionalPresentationContexts.AddRange(pcs);
            client.OnCStoreRequest += (DicomCStoreRequest req) =>
            {
                SaveImage(req.Dataset);

                return(new DicomCStoreResponse(req, DicomStatus.Success));
            };
            client.AddRequest(cGetRequest);
            client.Send(QRServerHost, QRServerPort, false, AET, QRServerAET);
        }
예제 #12
0
        private static DicomClient CreateDicomStoreClient(string fileToTransmit)
        {
            var client = new DicomClient();

            //request for DICOM store operation
            var dicomCStoreRequest = new DicomCStoreRequest(fileToTransmit);

            //attach an event handler when remote peer responds to store request
            dicomCStoreRequest.OnResponseReceived += OnStoreResponseReceivedFromRemoteHost;
            client.AddRequest(dicomCStoreRequest);

            //Add a handler to be notified of any association rejections
            client.AssociationRejected += OnAssociationRejected;

            //Add a handler to be notified of any association information on successful connections
            client.AssociationAccepted += OnAssociationAccepted;

            //Add a handler to be notified when association is successfully released - this can be triggered by the remote peer as well
            client.AssociationReleased += OnAssociationReleased;

            return(client);
        }
예제 #13
0
        BitmapImage downloadSampleImage(SeriesQueryOut seriesResponse, string SOPInstanceUID)
        {
            var cmove = new DicomCMoveRequest(configuration.thisNodeAET, seriesResponse.StudyInstanceUID, seriesResponse.SeriesInstanceUID, SOPInstanceUID);

            var client = new DicomClient();

            client.AddRequest(cmove);

            File.Create("singleImage.txt").Close();

            DirectoryInfo di = new DirectoryInfo("./images/");

            foreach (FileInfo file in di.GetFiles())
            {
                file.Delete();
            }

            client.Send(configuration.ip, configuration.port, false, configuration.thisNodeAET, configuration.AET);

            var image = new BitmapImage();

            if (File.Exists("./images/file.jpg"))
            {
                var uriSource = new Uri(Path.GetFullPath("./images/file.jpg"));
                image.BeginInit();
                image.CacheOption   = BitmapCacheOption.OnLoad;
                image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
                image.UriSource     = uriSource;
                image.EndInit();
            }
            else
            {
                MessageBox.Show("Listener didn't receive anything or didn't work");
            }

            File.Delete("singleImage.txt");
            return(image);
        }
예제 #14
0
        static void Main(string[] args)
        {
            //开启C-STORE SCP服务,用于接收C-MOVE SCP返回的图像
            CStoreSCP.OnCStoreRequestCallBack = (request) =>
            {
                var studyUid = request.Dataset.Get <string>(DicomTag.StudyInstanceUID);
                var instUid  = request.SOPInstanceUID.UID;

                var path = Path.GetFullPath(@"c:\cmove-scu");
                path = Path.Combine(path, studyUid);

                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }

                path = Path.Combine(path, instUid) + ".dcm";

                request.File.Save(path);

                return(new DicomCStoreResponse(request, DicomStatus.Success));
            };

            var cstoreServer = new DicomServer <CStoreSCP>(22345);

            //发起C-MOVE-RQ操作,发送请求的StudyID是12
            DicomCMoveRequest req = new DicomCMoveRequest("DEST-AE", "12");
            var client            = new DicomClient();

            client.NegotiateAsyncOps();
            client.AddRequest(req);
            //这里的IP地址是C-MOVE SCP的地址,12345端口号是C-MOVE SCP提供C-MOVE服务的端口
            //在C-MOVE SCP端发出的C-STORE-RQ子操作请求的是C-MOVE SCU端我们实现的C-STORE SCP,C-STORE SCP绑定的端口是22345
            client.Send("127.0.0.1", 12345, false, "DEST-AE", "SCP-AE");
            Console.ReadLine();
        }
예제 #15
0
        public String CFind(Selector sel)
        {
            client = new DicomClient();
            client.NegotiateAsyncOps();

            // Find a list of Studies

            request = CreateStudyRequestByPatientName(sel.patientName);


            List <String> studyUids = new List <string>();

            request.OnResponseReceived += (req, response) =>
            {
                DebugStudyResponse(response);
                studyUids.Add(response.Dataset?.GetSingleValue <string>(DicomTag.StudyInstanceUID));
            };
            client.AddRequest(request);
            client.Send(QRServerHost, QRServerPort, false, AET, QRServerAET);


            Console.WriteLine("ho prodotto lo study uid " + studyUids[0]);
            return(studyUids[0]);
        }
예제 #16
0
        static void TestCStoreService()
        {
            string ipAddress = "127.0.0.1";
            int    port      = 801;
            string calledAE  = "MinfoundSCP";

            var client = new DicomClient();

            string            path   = @"C:\DATAPART2\FMIDICMFiles";
            DirectoryInfo     info   = new DirectoryInfo(path);
            Action <FileInfo> action = f =>
            {
                client.AddRequest(new DicomCStoreRequest(f.FullName));
                index++;
                if (index % 100 == 0)
                {
                    client.Send(ipAddress, port, false, "SCU", calledAE);
                }
            };

            AlldDo(info, action);

            Console.WriteLine(index);
        }
예제 #17
0
        static void Main(string[] args)
        {
            var client = new DicomClient();

            client.NegotiateAsyncOps();
            var storeMore = "";

            StoreServerHost = GetServerHost();
            StoreServerPort = GetServerPort();

            Console.WriteLine("***************************************************");
            Console.WriteLine("Server AE Title: " + StoreServerAET);
            Console.WriteLine("Server Host Address: " + StoreServerHost);
            Console.WriteLine("Server Port: " + StoreServerPort);
            Console.WriteLine("Client AE Title: " + AET);
            Console.WriteLine("***************************************************");

            do
            {
                try
                {
                    Console.WriteLine();
                    Console.WriteLine("Enter the folder path for a DICOM file:");
                    Console.Write(">>>");
                    string dicomFile = Console.ReadLine();

                    while (!Directory.Exists(dicomFile))
                    {
                        Console.WriteLine("Invalid file path, enter the path for a DICOM file or press Enter to Exit:");

                        dicomFile = Console.ReadLine();

                        if (string.IsNullOrWhiteSpace(dicomFile))
                        {
                            return;
                        }
                    }
                    var files = Directory.GetFiles(dicomFile, "*.dcm", SearchOption.AllDirectories);
                    foreach (var item in files)
                    {
                        var request = new DicomCStoreRequest(item);

                        request.OnResponseReceived += (req, response) =>
                        {
                            Console.WriteLine("C-Store Response Received, Status: " + response.Status);
                        };

                        client.AddRequest(request);
                        client.Send(StoreServerHost, StoreServerPort, false, AET, StoreServerAET);
                    }
                }
                catch (Exception exception)
                {
                    Console.WriteLine();
                    Console.WriteLine("----------------------------------------------------");
                    Console.WriteLine("Error storing file. Exception Details:");
                    Console.WriteLine(exception.ToString());
                    Console.WriteLine("----------------------------------------------------");
                    Console.WriteLine();
                }

                Console.WriteLine("To store another file, enter \"y\"; Othersie, press enter to exit: ");
                Console.Write(">>>");
                storeMore = Console.ReadLine().Trim();
            } while (storeMore.Length > 0 && storeMore.ToLower()[0] == 'y');
        }
예제 #18
0
        static void Main(string[] args)
        {
            var client = new DicomClient();

            client.NegotiateAsyncOps();

            // Find a list of Studies

            var request = CreateDummyRequest();

            var studyUids = new List <string>();

            request.OnResponseReceived += (req, response) =>
            {
                DebugStudyResponse(response);
                studyUids.Add(response.Dataset?.Get <string>(DicomTag.StudyInstanceUID));
            };
            client.AddRequest(request);
            client.Send(QRServerHost, QRServerPort, false, AET, QRServerAET);

            // find all series from a study that previous was returned

            var studyUID = studyUids[3];

            request = CreateSeriesRequestByStudyUID(studyUID);
            var serieUids = new List <string>();

            request.OnResponseReceived += (req, response) =>
            {
                DebugSerieResponse(response);
                serieUids.Add(response.Dataset?.Get <string>(DicomTag.SeriesInstanceUID));
            };
            client.AddRequest(request);
            client.Send(QRServerHost, QRServerPort, false, AET, QRServerAET);

            // now get all the images of a serie with cGet in the same association

            var cGetRequest = CreateCGetBySeriesUID(studyUID, serieUids.First());

            client.OnCStoreRequest += (DicomCStoreRequest req) =>
            {
                SaveImage(req.Dataset);
                return(new DicomCStoreResponse(req, DicomStatus.Success));
            };
            // the client has to accept storage of the images. We know that the requested images are of SOP class Secondary capture,
            // so we add the Secondary capture to the additional presentation context
            // a more general approach would be to mace a cfind-request on image level and to read a list of distinct SOP classes of all
            // the images. these SOP classes shall be added here.
            client.AdditionalPresentationContexts.Add(DicomPresentationContext.GetScpRolePresentationContext(
                                                          DicomUID.SecondaryCaptureImageStorage, DicomTransferSyntax.ImplicitVRBigEndian,
                                                          DicomTransferSyntax.ExplicitVRBigEndian, DicomTransferSyntax.ExplicitVRLittleEndian));
            client.AddRequest(cGetRequest);
            client.Send(QRServerHost, QRServerPort, false, AET, QRServerAET);

            // if the images shall be sent to an existing storescp and this storescp is configured on the QR SCP then a CMove could be performed:

            // here we want to see how a error case looks like - because the test QR Server does not know the node FODICOMSCP
            var  cMoveRequest     = CreateCMoveBySeriesUID("FODICOMSCP", studyUID, serieUids.First());
            bool?moveSuccessfully = null;

            cMoveRequest.OnResponseReceived += (DicomCMoveRequest requ, DicomCMoveResponse response) =>
            {
                if (response.Status.State == DicomState.Pending)
                {
                    Console.WriteLine("Sending is in progress. please wait");
                }
                else if (response.Status.State == DicomState.Success)
                {
                    Console.WriteLine("Sending successfully finished");
                    moveSuccessfully = true;
                }
                else if (response.Status.State == DicomState.Failure)
                {
                    Console.WriteLine("Error sending datasets: " + response.Status.Description);
                    moveSuccessfully = false;
                }
                Console.WriteLine(response.Status);
            };
            client.AddRequest(cMoveRequest);
            client.Send(QRServerHost, QRServerPort, false, AET, QRServerAET);

            if (moveSuccessfully.GetValueOrDefault(false))
            {
                // images sent successfully from QR Server to the store scp
            }
            Console.ReadLine();
        }
예제 #19
0
        public void find(QueryObject query, string level)
        {
            if (level != "Study" && level != "Series" && level != "Image")
            {
                MessageBox.Show("incorrect level"); return;
            }

            DicomQueryRetrieveLevel queryLevel = (DicomQueryRetrieveLevel)Enum.Parse(typeof(DicomQueryRetrieveLevel), level);
            DicomCFindRequest       cfind      = new DicomCFindRequest(queryLevel);
            Type tipo = query.GetType();

            PropertyInfo[] properties1 = tipo.GetProperties();

            foreach (PropertyInfo property in properties1)
            {
                var      tag    = typeof(DicomTag).GetField(property.Name).GetValue(null);
                DicomTag theTag = (DicomTag.Parse(tag.ToString()));

                var variabile = property.GetValue(query);
                if (variabile.GetType().ToString() == "System.String")
                {
                    String a = (String)variabile;
                    cfind.Dataset.Add(theTag, a);
                }
                if (variabile.GetType().ToString() == "Dicom.DicomDateRange")
                {
                    DicomDateRange a = (DicomDateRange)variabile;
                    cfind.Dataset.Add(theTag, a);
                }
            }

            cfind.OnResponseReceived = (DicomCFindRequest rq, DicomCFindResponse rp) => {
                if (rp.HasDataset)
                {
                    var type     = Type.GetType("QueryRetrieveService." + level + "ResponseQuery");
                    var response = (QueryObject)Activator.CreateInstance(type);
                    queryResponses.Add(response);

                    PropertyInfo[] properties = response.GetType().GetProperties();
                    foreach (PropertyInfo property in properties)
                    {
                        var      tag   = typeof(DicomTag).GetField(property.Name).GetValue(null);
                        DicomTag myTag = DicomTag.Parse(tag.ToString());
                        try {
                            property.SetValue(response, rp.Dataset.GetValues <string>(myTag)[0]);
                        } catch (Exception e)
                        {
                            //                 MessageBox.Show("tag " + myTag.ToString() + " not found in this dataset");
                        }
                    }
                    RaiseEvent(response);
                }
            };


            var client = new DicomClient();

            client.AddRequest(cfind);
            client.AssociationReleased += (sender, e) => {
                // non può inviare la lista 'queryResponses' prima
                // che 'cfind.OnResponseReceived' abbia finito di riempirla!!
                Thread.Sleep(5);
                RaiseConnectionClosed(queryResponses);
            };
            try
            {
                client.Send(GUILogic.readFromFile("server"), Int32.Parse(GUILogic.readFromFile("serverPort")), false, GUILogic.readFromFile("thisMachineAE"), GUILogic.readFromFile("serverAE"), 1000);
            } catch (Exception e) { MessageBox.Show("impossible connect to server"); }
        }
예제 #20
0
        private static (DicomUID affectedInstanceUid, string responseStatus, string responseMessage) SendMppsInProgress(string serverIP, int serverPort, string serverAET, string clientAET, DicomDataset worklistItem)
        {
            var client  = new DicomClient();
            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("effectedinstamceUid");
            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();
                }
            };

            client.AddRequest(dicomStartRequest);
            client.SendAsync(serverIP, serverPort, false, clientAET, serverAET).Wait();

            return(effectedinstamceUid, responseStatus, responseMessage);
        }
예제 #21
0
        private static (string responseStatus, string responseMessage) SendMppsCompleted(string serverIP, int serverPort, string serverAET, string clientAET, DicomUID affectedInstanceUid, DicomDataset worklistItem)
        {
            var client  = new DicomClient();
            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();
                }
            };

            client.AddRequest(dicomFinished);
            client.SendAsync(serverIP, serverPort, false, clientAET, serverAET).Wait();

            return(responseStatus, responseMessage);
        }
예제 #22
0
        public static string SendPrintTask(string callingAE, string calledAE, string calledIP, int calledPort, string taskPath)
        {
            PrintTaskInfo task = new PrintTaskInfo()
            {
                CallingAETitle = callingAE, TaskPath = taskPath
            };

            string strErr = string.Empty;

            LogManager.Instance.Log("Start to send print task: " + taskPath);
            try
            {
                DirectoryInfo dirTask = new DirectoryInfo(taskPath);
                if (!dirTask.Exists)
                {
                    throw new Exception("invalid task path");
                }

                string filmSessionFile = Path.Combine(taskPath, "FilmSession.dcm");
                if (!File.Exists(filmSessionFile))
                {
                    throw new Exception("can't find film session file");
                }

                //load filmSession from dcmFile
                FilmSession filmSession = FilmSession.Load(filmSessionFile);

                //load filmBox from dcmFiles
                var subDirs = dirTask.EnumerateDirectories();
                foreach (DirectoryInfo dirFilmBox in subDirs)
                {
                    FilmBox filmBox = FilmBox.Load(filmSession, dirFilmBox.FullName);
                    filmSession.BasicFilmBoxes.Add(filmBox);
                }

                var dicomClient = new DicomClient();

                var filmSessionRequest = new DicomNCreateRequest(filmSession.SOPClassUID, filmSession.SOPInstanceUID);
                filmSessionRequest.Dataset = filmSession;

                dicomClient.AddRequest(filmSessionRequest);

                foreach (var filmbox in filmSession.BasicFilmBoxes)
                {
                    var imageBoxRequests = new List <DicomNSetRequest>();

                    var filmBoxRequest = new DicomNCreateRequest(FilmBox.SOPClassUID, filmbox.SOPInstanceUID);
                    filmBoxRequest.Dataset = filmbox;

                    filmBoxRequest.OnResponseReceived = (request, response) =>
                    {
                        if (response.HasDataset)
                        {
                            var seq = response.Dataset.Get <DicomSequence>(DicomTag.ReferencedImageBoxSequence);
                            for (int i = 0; i < seq.Items.Count; i++)
                            {
                                var req            = imageBoxRequests[i];
                                var imageBox       = req.Dataset;
                                var sopInstanceUid = seq.Items[i].Get <string>(DicomTag.ReferencedSOPInstanceUID);
                                imageBox.AddOrUpdate(DicomTag.SOPInstanceUID, sopInstanceUid);
                                req.Command.AddOrUpdate(DicomTag.RequestedSOPInstanceUID, sopInstanceUid);
                            }
                        }
                    };
                    dicomClient.AddRequest(filmBoxRequest);

                    foreach (var image in filmbox.BasicImageBoxes)
                    {
                        var req = new DicomNSetRequest(image.SOPClassUID, image.SOPInstanceUID)
                        {
                            Dataset = image
                        };

                        imageBoxRequests.Add(req);
                        dicomClient.AddRequest(req);
                    }
                }

                dicomClient.AddRequest(new DicomNActionRequest(filmSession.SOPClassUID, filmSession.SOPInstanceUID, 0x0001));

                dicomClient.Send(calledIP, calledPort, false, callingAE, calledAE);

                task.HasError = false;
                if (PrintTaskEvent != null)
                {
                    PrintTaskEvent(task);
                }
            }
            catch (Exception e)
            {
                strErr = e.Message;
                LogManager.Instance.Log("Send task failed due to " + e.Message);

                task.HasError     = true;
                task.ErrorMessage = e.Message;
                if (PrintTaskEvent != null)
                {
                    PrintTaskEvent(task);
                }
            }

            return(strErr);
        }
예제 #23
0
파일: Program.cs 프로젝트: xydoublez/CSDN
        public virtual IEnumerable <DicomCMoveResponse> OnCMoveRequest(DicomCMoveRequest request)
        {
            DicomStatus status             = DicomStatus.Success;
            IList <DicomCMoveResponse> rsp = new List <DicomCMoveResponse>();
            /*----to do------*/
            //添加查询数据库的代码,即根据request的条件提取指定的图像
            //然后将图像信息添加到rsp响应中

            //创建C-STORE-SCU,发起C-STORE-RQ
            IList <DicomDataset> queries;
            DicomClient          clt = new DicomClient();

            if (OnZSCMoveRequest != null)
            {
                queries = OnZSCMoveRequest(request);
                if (queries != null)
                {
                    Logger.Info("需要发送{0}个数据", queries.Count);
                    int len = queries.Count;
                    int cnt = 0;
                    foreach (var item in queries)
                    {
                        //zssure:
                        //取巧的方法直接利用request来构造response中相同的部分
                        //这部分与mDCM方式很不同
                        var studyUid = item.Get <string>(DicomTag.StudyInstanceUID);
                        var instUid  = item.Get <string>(DicomTag.SOPInstanceUID);
                        //需要在c:\cmovetest目录下手动添加C-MOVE SCU请求的图像
                        //本地构造的目录结构为,
                        //      c:\cmovetest\12\0.dcm
                        //      c:\cmovetest\12\1.dcm
                        //      c:\cmovetest\12\2.dcm
                        var path = Path.GetFullPath(@"c:\cmovetest");

                        try
                        {
                            path = Path.Combine(path, studyUid);
                            if (!Directory.Exists(path))
                            {
                                Directory.CreateDirectory(path);
                            }
                            path = Path.Combine(path, instUid) + ".dcm";
                            DicomCStoreRequest cstorerq = new DicomCStoreRequest(path);
                            cstorerq.OnResponseReceived = (rq, rs) =>
                            {
                                if (rs.Status != DicomStatus.Pending)
                                {
                                }
                                if (rs.Status == DicomStatus.Success)
                                {
                                    DicomCMoveResponse rsponse = new DicomCMoveResponse(request, DicomStatus.Pending);
                                    rsponse.Remaining = --len;
                                    rsponse.Completed = ++cnt;
                                    rsponse.Warnings  = 0;
                                    rsponse.Failures  = 0;
                                    //zssure:2014-12-24
                                    //修复发送C-MOVE-RSP的逻辑错误
                                    SendResponse(rsponse);
                                    //rsp.Add(rsponse);
                                    //zssure:end
                                }
                            };
                            clt.AddRequest(cstorerq);
                            //注意:这里给出的IP地址与C-MOVE请求的IP地址相同,意思就是说C-MOVE SCP需要向C-MOVE SCU发送C-STORE-RQ请求
                            //将查询到的图像返回给C-MOVE SCU
                            //所以四尺C-STORE-RQ中的IP地址与C-MOVE SCU相同,但是端口不同,因为同一个端口不能被绑定多次。
                            clt.Send("127.0.0.1", 22345, false, this.Association.CalledAE, request.DestinationAE);
                        }
                        catch (System.Exception ex)
                        {
                            DicomCMoveResponse rs = new DicomCMoveResponse(request, DicomStatus.StorageStorageOutOfResources);
                            rsp.Add(rs);
                            return(rsp);
                        }
                    }
                    //zssure:
                    //发送完成后统一返回C-MOVE RESPONSE
                    //貌似响应流程有问题,有待进一步核实
                    //注意,如果最后为发送DicomStatus.Success消息,TCP连接不会释放,浪费资源
                    rsp.Add(new DicomCMoveResponse(request, DicomStatus.Success));
                    return(rsp);
                }
                else
                {
                    rsp.Add(new DicomCMoveResponse(request, DicomStatus.NoSuchObjectInstance));
                    return(rsp);
                }
            }
            rsp.Add(new DicomCMoveResponse(request, DicomStatus.NoSuchObjectInstance));
            return(rsp);
        }
예제 #24
0
        public IEnumerable <DicomCMoveResponse> OnCMoveRequest(DicomCMoveRequest request)
        {
            // the c-move request contains the DestinationAE. the data of this AE should be configured somewhere.
            if (request.DestinationAE != "STORESCP")
            {
                yield return(new DicomCMoveResponse(request, DicomStatus.QueryRetrieveMoveDestinationUnknown));

                yield return(new DicomCMoveResponse(request, DicomStatus.ProcessingFailure));

                yield break;
            }

            // this data should come from some data storage!
            var destinationPort = 11112;
            var destinationIP   = "localhost";

            IDicomImageFinderService finderService = QRServer.CreateFinderService;
            List <string>            matchingFiles = null;

            switch (request.Level)
            {
            case DicomQueryRetrieveLevel.Patient:
                matchingFiles = finderService.FindFilesByUID(request.Dataset.Get <string>(DicomTag.PatientID), string.Empty, string.Empty);
                break;

            case DicomQueryRetrieveLevel.Study:
                matchingFiles = finderService.FindFilesByUID(string.Empty, request.Dataset.Get <string>(DicomTag.StudyInstanceUID), string.Empty);
                break;

            case DicomQueryRetrieveLevel.Series:
                matchingFiles = finderService.FindFilesByUID(string.Empty, string.Empty, request.Dataset.Get <string>(DicomTag.SeriesInstanceUID));
                break;

            case DicomQueryRetrieveLevel.Image:
                yield return(new DicomCMoveResponse(request, DicomStatus.QueryRetrieveUnableToPerformSuboperations));

                yield break;
            }

            DicomClient client = new DicomClient();

            client.NegotiateAsyncOps();
            int storeTotal   = matchingFiles.Count;
            int storeDone    = 0; // this variable stores the number of instances that have already been sent
            int storeFailure = 0; // this variable stores the number of faulues returned in a OnResponseReceived

            foreach (string file in matchingFiles)
            {
                var storeRequest = new DicomCStoreRequest(file);
                // !!! there is a Bug in fo-dicom 3.0.2 that the OnResponseReceived handlers are invoked not until the DicomClient has already
                //     sent all the instances. So the counters are not increased image by image sent but only once in a bulk after all storage
                //     has been finished. This bug will be fixed hopefully soon.
                storeRequest.OnResponseReceived += (req, resp) =>
                {
                    if (resp.Status == DicomStatus.Success)
                    {
                        Logger.Info("Storage of image successfull");
                        storeDone++;
                    }
                    else
                    {
                        Logger.Error("Storage of image failed");
                        storeFailure++;
                    }
                    // SendResponse(new DicomCMoveResponse(request, DicomStatus.Pending) { Remaining = storeTotal - storeDone - storeFailure, Completed = storeDone });
                };
                client.AddRequest(storeRequest);
            }

            // client.Send(destinationIP, destinationPort, false, QRServer.AETitle, request.DestinationAE);

            var sendTask = client.SendAsync(destinationIP, destinationPort, false, QRServer.AETitle, request.DestinationAE);

            while (!sendTask.IsCompleted)
            {
                // while the send-task is runnin we inform the QR SCU every 2 seconds about the status and how many instances are remaining to send.
                yield return(new DicomCMoveResponse(request, DicomStatus.Pending)
                {
                    Remaining = storeTotal - storeDone - storeFailure, Completed = storeDone
                });

                Thread.Sleep(TimeSpan.FromSeconds(2));
            }

            Logger.Info("..fertig");
            yield return(new DicomCMoveResponse(request, DicomStatus.Success));
        }
예제 #25
0
        public void MoveAndStore(Selector sel, String seriesInstanceUID, String studyUID)
        {
            //  NON FUNZIONA find all series from a study that previous was returned

            request   = CreateSeriesRequestByStudyUID(studyUID);
            serieUids = new List <string>();

            /*
             * request.OnResponseReceived += (req, response) =>
             * {
             *  DebugSerieResponse(response);
             *  serieUids.Add(response.Dataset?.GetSingleValue<string>(DicomTag.SeriesInstanceUID));
             *  Console.WriteLine("aggiungo serie");
             * };
             * // -> porto StudyUID nella classe AvvioQuery
             */
            serieUids.Add(seriesInstanceUID);
            Console.WriteLine("ho prodotto lo study uid " + studyUID);


            client.AddRequest(request);
            client.SendAsync(QRServerHost, QRServerPort, false, AET, QRServerAET).Wait();

            // now get all the images of a serie with cGet in the same association

            client = new DicomClient();
            var cGetRequest = CreateCGetBySeriesUID(studyUID, serieUids.First());

            client.OnCStoreRequest += (DicomCStoreRequest req) =>
            {
                Console.WriteLine(DateTime.Now.ToString() + " recived");
                SaveImage(req.Dataset);
                return(new DicomCStoreResponse(req, DicomStatus.Success));
            };
            // the client has to accept storage of the images. We know that the requested images are of SOP class Secondary capture,
            // so we add the Secondary capture to the additional presentation context
            // a more general approach would be to mace a cfind-request on image level and to read a list of distinct SOP classes of all
            // the images. these SOP classes shall be added here.
            var pcs = DicomPresentationContext.GetScpRolePresentationContextsFromStorageUids(
                DicomStorageCategory.Image,
                DicomTransferSyntax.ExplicitVRLittleEndian,
                DicomTransferSyntax.ImplicitVRLittleEndian,
                DicomTransferSyntax.ImplicitVRBigEndian);

            client.AdditionalPresentationContexts.AddRange(pcs);
            client.AddRequest(cGetRequest);
            client.Send(QRServerHost, QRServerPort, false, AET, QRServerAET);

            // if the images shall be sent to an existing storescp and this storescp is configured on the QR SCP then a CMove could be performed:

            // here we want to see how a error case looks like - because the test QR Server does not know the node FODICOMSCP
            client = new DicomClient();
            var  cMoveRequest     = CreateCMoveByStudyUID(QRServerAET, studyUID);
            bool?moveSuccessfully = null;

            cMoveRequest.OnResponseReceived += (DicomCMoveRequest requ, DicomCMoveResponse response) =>
            {
                if (response.Status.State == DicomState.Pending)
                {
                    Console.WriteLine("Sending is in progress. please wait: " + response.Remaining.ToString());
                }
                else if (response.Status.State == DicomState.Success)
                {
                    Console.WriteLine("Sending successfully finished");
                    moveSuccessfully = true;
                }
                else if (response.Status.State == DicomState.Failure)
                {
                    Console.WriteLine("Error sending datasets: " + response.Status.Description);
                    moveSuccessfully = false;
                }
                Console.WriteLine(response.Status);
            };
            client.AddRequest(cMoveRequest);
            client.Send(QRServerHost, QRServerPort, false, AET, QRServerAET);

            if (moveSuccessfully.GetValueOrDefault(false))
            {
                Console.WriteLine("images sent successfully");
                // images sent successfully from QR Server to the store scp
            }
            Console.ReadLine();
        }
예제 #26
0
        public void move(string callingAE, QueryObject query, string level, GUILogic guiLogic)
        {
            var cmove = new DicomCMoveRequest("", "");

            if (query.GetType().ToString() == "QueryRetrieveService.StudyResponseQuery")
            {
                string studyId = ((StudyResponseQuery)query).StudyInstanceUID;
                cmove = new DicomCMoveRequest(callingAE, studyId);
            }

            if (query.GetType().ToString() == "QueryRetrieveService.SeriesResponseQuery")
            {
                string studyId  = ((SeriesResponseQuery)query).StudyInstanceUID;
                string seriesId = ((SeriesResponseQuery)query).SeriesInstanceUID;
                cmove = new DicomCMoveRequest(callingAE, studyId, seriesId);
            }

            if (query.GetType().ToString() == "QueryRetrieveService.ImageResponseQuery")
            {
                string studyId  = ((ImageResponseQuery)query).StudyInstanceUID;
                string seriesId = ((ImageResponseQuery)query).SeriesInstanceUID;
                string imageId  = ((ImageResponseQuery)query).SOPInstanceUID;
                cmove = new DicomCMoveRequest(callingAE, studyId, seriesId, imageId);
                Console.WriteLine(studyId + " " + seriesId + " " + imageId);
            }

            var client = new DicomClient();

            bool?moveSuccessfully = null;

            cmove.OnResponseReceived += (DicomCMoveRequest requ, DicomCMoveResponse response) =>
            {
                if (response.Status.State == DicomState.Pending)
                {
                    Console.WriteLine("Sending is in progress. please wait: " + response.Remaining.ToString());
                }
                else if (response.Status.State == DicomState.Success)
                {
                    Console.WriteLine("Sending successfully finished");
                    moveSuccessfully = true;
                }
                else if (response.Status.State == DicomState.Failure)
                {
                    Console.WriteLine("Error sending datasets: " + response.Status.Description);
                    moveSuccessfully = false;
                }
                Console.WriteLine(response.Status);
            };
            var pcs = DicomPresentationContext.GetScpRolePresentationContextsFromStorageUids(
                DicomStorageCategory.Image,
                DicomTransferSyntax.ExplicitVRLittleEndian,
                DicomTransferSyntax.ImplicitVRLittleEndian,
                DicomTransferSyntax.ImplicitVRBigEndian);

            client.AdditionalPresentationContexts.AddRange(pcs);

            client.AddRequest(cmove);
            // cicle to kill listener and restart it (thus ending associatio) if move takes too much time
            bool sendSuccess = false;

            new Thread(() =>
            {
                Thread.CurrentThread.IsBackground = true;
                Thread.Sleep(5000);
                if (!sendSuccess)
                {
                    guiLogic.listenerProcess.Kill();
                    guiLogic.newProcess();
                }
            }).Start();
            client.Send(GUILogic.readFromFile("server"), Int32.Parse(GUILogic.readFromFile("serverPort")), false, GUILogic.readFromFile("thisMachineAE"), GUILogic.readFromFile("serverAE"), 1000);
            sendSuccess = true;
        }
        private Task <string> sendFile(string fullpath, int intDetEstudioID)
        {
            return(Task.Run(() =>
            {
                string respuesta = "";
                try
                {
                    try
                    {
                        string _ser = _conf.vchIPServidor;
                        int port = _conf.intPuertoServer;
                        string _aetS = _conf.vchAETitle;
                        string _aetA = _conf.vchAETitleServer;

                        if (_ser != "" && port > 0 && _aetA != "" && _aetS != "")
                        {
                            #region Bitacora
                            LogManager.SetImplementation(NLogManager.Instance);
                            DicomException.OnException += delegate(object sender, DicomExceptionEventArgs ea)
                            {
                                ConsoleColor old = Console.ForegroundColor;
                                Console.ForegroundColor = ConsoleColor.Yellow;
                                Console.WriteLine(ea.Exception);
                                Console.ForegroundColor = old;
                            };
                            var config = new LoggingConfiguration();
                            var target = new ColoredConsoleTarget();
                            target.Layout = @"${date:format=HH\:mm}  ${message}";

                            //codigo agregado
                            FileTarget filetarjet = new FileTarget();
                            DateTime Fecha = DateTime.Now;
                            string nameFile = "";
                            nameFile = Path.GetFileNameWithoutExtension(fullpath);
                            if (!Directory.Exists(Logpath + @"\Log"))
                            {
                                Directory.CreateDirectory(Logpath + @"\Log");
                            }

                            filetarjet.FileName = Logpath + @"\Log\" + "[" + nameFile + "].txt";
                            filetarjet.Layout = @"${date:format=HH\:mm}  ${message}";
                            //fin codigo agregado

                            config.AddTarget("Console", target);
                            config.AddTarget("file", filetarjet);
                            config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Debug, target));
                            config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Debug, filetarjet));

                            NLog.LogManager.Configuration = config;
                            #endregion Bitacora

                            var client = new DicomClient();
                            client.NegotiateAsyncOps();
                            client.AddRequest(new DicomCEchoRequest());
                            client.AddRequest(new DicomCStoreRequest(fullpath));
                            //Log.EscribeLog("IP Servidor destino: " + _ser);
                            //Log.EscribeLog("Puerto Servidor destino: " + port.ToString());
                            //Log.EscribeLog("AETitle Local: " + _aetS);
                            //Log.EscribeLog("AETitle Server: " + _aetA);
                            client.Send(_ser, port, false, _aetS, _aetA);
                            foreach (DicomPresentationContext ctr in client.AdditionalPresentationContexts)
                            {
                                Log.EscribeLog("PresentationContext: " + ctr.AbstractSyntax + " Result: " + ctr.Result);
                            }
                            client.

                            respuesta = "1";

                            Log.EscribeLog("Enviado: " + fullpath);
                        }
                        else
                        {
                            Log.EscribeLog("Los parámetros para el envío no estan completos, favor de verificar: ");
                            Log.EscribeLog("IP Servidor destino: " + _ser);
                            Log.EscribeLog("Puerto Servidor destino: " + port.ToString());
                            Log.EscribeLog("AETitle Local: " + _aetS);
                            Log.EscribeLog("AETitle Server: " + _aetA);
                            respuesta = "0";
                        }
                        try
                        {
                            NapoleonSenderDataAccess.setService(id_Servicio, vchClaveSitio);
                        }
                        catch (Exception es)
                        {
                            Log.EscribeLog("Existe un error en enviar el estatus del servicio: " + es.Message);
                        }
                    }
                    catch (Exception eENVIar)
                    {
                        respuesta = "0";
                        Log.EscribeLog("Existe un error al enviar el archivo:" + eENVIar.Message);
                        Console.WriteLine("Error al enviar el Estudio:" + eENVIar.Message);
                    }
                    if (respuesta == "1")
                    {
                        NapoleonSenderDataAccess NapServer = new NapoleonSenderDataAccess();
                        NapServer.updateEstatus(intDetEstudioID, id_Servicio, vchClaveSitio);
                        //moverFile(fullpath, respuesta);
                    }
                }
                catch (Exception esf)
                {
                    respuesta = "0";
                    Log.EscribeLog("Error: " + esf.Message);
                }
                return respuesta;
            }));
        }
예제 #28
0
        public IEnumerable <DicomCMoveResponse> OnCMoveRequest(DicomCMoveRequest request)
        {
            // The c-move request contains the DestinationAE. The data of this AE should be configured somewhere.
            if (request.DestinationAE != "")
            {
                yield return(new DicomCMoveResponse(request, DicomStatus.QueryRetrieveMoveDestinationUnknown));

                yield return(new DicomCMoveResponse(request, DicomStatus.ProcessingFailure));

                yield break;
            }

            // This data should come from some data storage.
            var destinationPort = 11112;
            var destinationIP   = "localhost";

            IDicomImageFinderService finderService = ServiceLocator.DicomImageFinderService;
            List <string>            matchingFiles = new List <string>();

            switch (request.Level)
            {
            case DicomQueryRetrieveLevel.Patient:
                string patientId = request.Dataset.GetSingleValue <string>(DicomTag.PatientID);
                matchingFiles = finderService.FindFilesByPatient(patientId);
                break;

            case DicomQueryRetrieveLevel.Study:
                string studyUID = request.Dataset.GetSingleValue <string>(DicomTag.StudyInstanceUID);
                matchingFiles = finderService.FindFilesByStudyUID(studyUID);
                break;

            case DicomQueryRetrieveLevel.Series:
                string seriesUID = request.Dataset.GetSingleValue <string>(DicomTag.SeriesInstanceUID);
                matchingFiles = finderService.FindFilesBySeriesUID(seriesUID);
                break;

            case DicomQueryRetrieveLevel.Image:
                yield return(new DicomCMoveResponse(request, DicomStatus.QueryRetrieveUnableToPerformSuboperations));

                yield break;
            }
            // Send to c-store.
            DicomClient client = new DicomClient();

            client.NegotiateAsyncOps();
            int storeTotal   = matchingFiles.Count;
            int storeDone    = 0;
            int storeFailure = 0;

            foreach (var file in matchingFiles)
            {
                var storeRequest = new DicomCStoreRequest(file);
                storeRequest.OnResponseReceived += (req, resp) =>
                {
                    if (resp.Status == DicomStatus.Success)
                    {
                        storeDone++;
                    }
                    else
                    {
                        storeFailure++;
                    }
                    SendResponseAsync(new DicomCMoveResponse(request, DicomStatus.Pending)
                    {
                        Remaining = storeTotal - storeDone - storeFailure, Completed = storeDone
                    }).Wait();
                };
                client.AddRequest(storeRequest);
            }

            var sendTask = client.SendAsync(destinationIP, destinationPort, false, CalledAE, request.DestinationAE);

            sendTask.Wait();

            yield return(new DicomCMoveResponse(request, DicomStatus.Success));
        }
예제 #29
0
        private static void Main(string[] args)
        {
            try
            {
                // Initialize log manager.
                LogManager.SetImplementation(NLogManager.Instance);

                DicomException.OnException += delegate(object sender, DicomExceptionEventArgs ea)
                {
                    ConsoleColor old = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine(ea.Exception);
                    Console.ForegroundColor = old;
                };

                var config = new LoggingConfiguration();

                var target = new ColoredConsoleTarget();
                target.Layout = @"${date:format=HH\:mm\:ss}  ${message}";
                config.AddTarget("Console", target);
                config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Debug, target));

                NLog.LogManager.Configuration = config;

                var client = new DicomClient();
                client.NegotiateAsyncOps();
                for (int i = 0; i < 10; i++)
                {
                    client.AddRequest(new DicomCEchoRequest());
                }

                client.AddRequest(new DicomCStoreRequest(@"test1.dcm"));
                client.AddRequest(new DicomCStoreRequest(@"test2.dcm"));
                client.Send("127.0.0.1", 11112, false, "SCU", "STORESCP");

                foreach (DicomPresentationContext ctr in client.AdditionalPresentationContexts)
                {
                    Console.WriteLine("PresentationContext: " + ctr.AbstractSyntax + " Result: " + ctr.Result);
                }

                var samplesDir = Path.Combine(
                    Path.GetPathRoot(Environment.CurrentDirectory),
                    "Development",
                    "fo-dicom-samples");
                var testDir = Path.Combine(samplesDir, "Test");

                if (!Directory.Exists(testDir))
                {
                    Directory.CreateDirectory(testDir);
                }

                //var img = new DicomImage(samplesDir + @"\ClearCanvas\CRStudy\1.3.51.5145.5142.20010109.1105627.1.0.1.dcm");
                //img.RenderImage().Save(testDir + @"\test.jpg");

                //var df = DicomFile.Open(samplesDir + @"\User Submitted\overlays.dcm");

                //Console.WriteLine(df.FileMetaInfo.Get<DicomTransferSyntax>(DicomTag.TransferSyntaxUID).UID.Name);
                //Console.WriteLine(df.Dataset.Get<PlanarConfiguration>(DicomTag.PlanarConfiguration));

                //var img = new DicomImage(df.Dataset);
                //img.RenderImage().Save(testDir + @"\test.jpg");

                //df = df.ChangeTransferSyntax(DicomTransferSyntax.JPEGLSLossless);
                //df.Save(testDir + @"\test-jls.dcm");

                //df = df.ChangeTransferSyntax(DicomTransferSyntax.JPEG2000Lossless);
                //df.Save(testDir + @"\test-j2k.dcm");

                //df = df.ChangeTransferSyntax(DicomTransferSyntax.JPEGProcess14SV1);
                //df.Save(testDir + @"\test-jll.dcm");

                //df = df.ChangeTransferSyntax(DicomTransferSyntax.RLELossless);
                //df.Save(testDir + @"\test-rle.dcm");

                //df = df.ChangeTransferSyntax(DicomTransferSyntax.ExplicitVRLittleEndian);
                //df.Save(testDir + @"\test-ele.dcm");

                //df = df.ChangeTransferSyntax(DicomTransferSyntax.ExplicitVRBigEndian);
                //df.Save(testDir + @"\test-ebe.dcm");

                //df = df.ChangeTransferSyntax(DicomTransferSyntax.ImplicitVRLittleEndian);
                //df.Save(testDir + @"\test-ile.dcm");

                //Console.WriteLine("End...");
                //Console.ReadLine();

                //df.WriteToLog(LogManager.GetCurrentClassLogger(), LogLevel.Info);

                //Console.WriteLine(DicomValueMultiplicity.Parse("1"));
                //Console.WriteLine(DicomValueMultiplicity.Parse("3"));
                //Console.WriteLine(DicomValueMultiplicity.Parse("1-3"));
                //Console.WriteLine(DicomValueMultiplicity.Parse("1-n"));
                //Console.WriteLine(DicomValueMultiplicity.Parse("2-2n"));

                //Console.WriteLine(DicomTag.Parse("00200020"));
                //Console.WriteLine(DicomTag.Parse("0008,0040"));
                //Console.WriteLine(DicomTag.Parse("(3000,0012)"));
                //Console.WriteLine(DicomTag.Parse("2000,2000:TEST CREATOR"));
                //Console.WriteLine(DicomTag.Parse("(4000,4000:TEST_CREATOR:2)"));

                //Console.WriteLine(DicomMaskedTag.Parse("(30xx,xx90)"));
                //Console.WriteLine(DicomMaskedTag.Parse("(3000-3021,0016)"));

                //DicomRange<DateTime> r = new DicomRange<DateTime>(DateTime.Now.AddSeconds(-5), DateTime.Now.AddSeconds(5));
                //Console.WriteLine(r.Contains(DateTime.Now));
                //Console.WriteLine(r.Contains(DateTime.Today));
                //Console.WriteLine(r.Contains(DateTime.Now.AddSeconds(60)));

                //DicomDictionary dict = new DicomDictionary();
                //dict.Load(@"F:\Development\fo-dicom\DICOM\Dictionaries\dictionary.xml", DicomDictionaryFormat.XML);

                //string output = Dicom.Generators.DicomTagGenerator.Generate("Dicom", "DicomTag", dict);
                //File.WriteAllText(@"F:\Development\fo-dicom\DICOM\DicomTagGenerated.cs", output);

                //output = Dicom.Generators.DicomDictionaryGenerator.Generate("Dicom", "DicomDictionary", "LoadInternalDictionary", dict);
                //File.WriteAllText(@"F:\Development\fo-dicom\DICOM\DicomDictionaryGenerated.cs", output);

                //string output = Dicom.Generators.DicomUIDGenerator.Process(@"F:\Development\fo-dicom\DICOM\Dictionaries\dictionary.xml");
                //File.WriteAllText(@"F:\Development\fo-dicom\DICOM\DicomUIDGenerated.cs", output);
            }
            catch (Exception e)
            {
                if (!(e is DicomException))
                {
                    Console.WriteLine(e.ToString());
                }
            }
        }
예제 #30
0
        public static List <DicomDataset> GetWorkList(DicomCFindRequest cfind)
        {
            var worklistItems = new List <DicomDataset>();

            try
            {
                if (cfind != null)
                {
                    int studyNumber = 0;
                    cfind.OnResponseReceived = (DicomCFindRequest rq, DicomCFindResponse rp) =>
                    {
                        Logger.Info($"OnResponseReceived..................");
                        Log.Loger($"OnResponseReceived..................");
                        if (rp.Dataset != null)
                        {
                            try
                            {
                                bool canAddWL = true;
                                //仅到检
                                if (_isOnlyArrived)
                                {
                                    string status = rp.Dataset.GetSequence(DicomTag.ScheduledProcedureStepSequence).First().GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStatus, string.Empty);
                                    //if (status != "ARRIVED")
                                    //{
                                    //    continue;
                                    //}
                                    canAddWL = (status == "ARRIVED");
                                }

                                if (canAddWL)
                                {
                                    Logger.Info($"Before Convert..................");
                                    Log.Loger($"Before Convert..................");
                                    string log = LogToConsole(rp.Dataset);
                                    Logger.Info(log);
                                    Log.Loger(log);

                                    #region PatientName转换
                                    string oldName      = rp.Dataset.GetValue <string>(Dicom.DicomTag.PatientName, 0);
                                    string newName      = oldName;
                                    string initialsName = string.Empty;
                                    int    sepIndex     = oldName.IndexOf("^");
                                    string surName      = oldName;
                                    string firstName    = string.Empty;
                                    string lastName     = string.Empty;
                                    if (sepIndex >= 0)
                                    {
                                        //surName = oldName.Substring(0, sepIndex);
                                        firstName = oldName.Split('^')[0];
                                        lastName  = oldName.Split('^')[1];
                                        if (string.IsNullOrEmpty(lastName))
                                        {
                                            surName = firstName;
                                        }
                                        else
                                        {
                                            //若拼音码为首字母,则不取
                                            if (firstName.Length == lastName.Length)
                                            {
                                                surName = firstName;
                                            }
                                            else
                                            {
                                                surName = lastName;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        firstName = oldName;
                                    }

                                    //取首字母,保持AccessionNumber一致
                                    if (IsChinese(firstName))
                                    {
                                        initialsName = NPinyin.Pinyin.GetInitials(firstName, true, 1);
                                        initialsName = initialsName.ToUpper();
                                    }

                                    if (IsChinese(surName))
                                    {
                                        //string newSurName = NPinyin.Pinyin.GetPinyin(surName, Encoding.Unicode, true);
                                        string newSurName = NPinyin.Pinyin.GetPinyin(surName, true, 1);
                                        newSurName = newSurName.ToUpper();
                                        //oldName = oldName.Replace(surName, newSurName);
                                        newName = newSurName;

                                        //取首字母
                                        //initialsName = NPinyin.Pinyin.GetInitials(surName, Encoding.Unicode, true);
                                        //initialsName = initialsName.ToUpper();
                                    }
                                    else
                                    {
                                        newName = surName;
                                    }

                                    rp.Dataset.AddOrUpdate(Dicom.DicomTag.PatientName, newName);
                                    #endregion

                                    #region PtianetID修改
                                    if (!_isNotConvertPatientId)
                                    {
                                        string patientId      = rp.Dataset.GetSingleValueOrDefault(DicomTag.OtherPatientIDsRETIRED, string.Empty);
                                        string newNameNoSpace = newName;
                                        if (newNameNoSpace.Substring(newNameNoSpace.Length - 1, 1) == " ")
                                        {
                                            newNameNoSpace = newNameNoSpace.Remove(newNameNoSpace.Length - 1);
                                        }
                                        string newPatientId = $"{newNameNoSpace}({patientId})";
                                        if (_deviceType == "MR")
                                        {
                                            newPatientId = _deviceType + " " + newPatientId;
                                        }
                                        rp.Dataset.AddOrUpdate(Dicom.DicomTag.PatientID, newPatientId);
                                    }
                                    #endregion

                                    #region Modality置空
                                    rp.Dataset.GetSequence(Dicom.DicomTag.ScheduledProcedureStepSequence).Items[0].AddOrUpdate(Dicom.DicomTag.Modality, _deviceType);
                                    #endregion

                                    #region SpecificCharacterSet字符集转换
                                    rp.Dataset.AddOrUpdate(Dicom.DicomTag.SpecificCharacterSet, "ISO_IR 100");
                                    #endregion

                                    #region AccessionNumber

                                    string accessionNumber = rp.Dataset.GetSingleValueOrDefault <string>(Dicom.DicomTag.AccessionNumber, "");
                                    if (string.IsNullOrEmpty(accessionNumber))
                                    {
                                        string scheduledProcedureStepStartTime = rp.Dataset.GetSequence(DicomTag.ScheduledProcedureStepSequence).First().GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartTime, string.Empty);
                                        if (scheduledProcedureStepStartTime.Length > 4)
                                        {
                                            scheduledProcedureStepStartTime.Remove(4);
                                        }
                                        accessionNumber = _deviceType + initialsName + scheduledProcedureStepStartTime;
                                        rp.Dataset.AddOrUpdate(Dicom.DicomTag.AccessionNumber, accessionNumber);
                                    }
                                    #endregion

                                    #region StudyInstanceUID
                                    string studyInstanceUID = rp.Dataset.GetSingleValueOrDefault <string>(Dicom.DicomTag.StudyInstanceUID, "");
                                    if (string.IsNullOrEmpty(studyInstanceUID))
                                    {
                                        //rp.Dataset.AddOrUpdate(Dicom.DicomTag.StudyInstanceUID, rp.Dataset.GetValue<string>(Dicom.DicomTag.SOPInstanceUID, 0) + "." + (studyNumber++).ToString());
                                        string sOPInstanceUID = rp.Dataset.GetSingleValueOrDefault <string>(Dicom.DicomTag.SOPInstanceUID, "");
                                        if (sOPInstanceUID.Contains("."))
                                        {
                                            sOPInstanceUID = sOPInstanceUID.Remove(sOPInstanceUID.LastIndexOf('.'));
                                        }
                                        //rp.Dataset.AddOrUpdate(Dicom.DicomTag.StudyInstanceUID, rp.Dataset.GetValue<string>(Dicom.DicomTag.SOPInstanceUID, 0) + "." + (studyNumber++).ToString());
                                        rp.Dataset.AddOrUpdate(Dicom.DicomTag.StudyInstanceUID, sOPInstanceUID);
                                    }
                                    #endregion

                                    #region Set AETitle
                                    if (!string.IsNullOrEmpty(_setAETitle))
                                    {
                                        rp.Dataset.GetSequence(Dicom.DicomTag.ScheduledProcedureStepSequence).Items[0].AddOrUpdate(Dicom.DicomTag.ScheduledStationAETitle, _setAETitle);
                                    }
                                    #endregion

                                    #region Set Scheduled Protocol Code Sequence
                                    Dicom.DicomSequence spcs = new Dicom.DicomSequence(Dicom.DicomTag.ScheduledProtocolCodeSequence);
                                    if (!rp.Dataset.GetSequence(Dicom.DicomTag.ScheduledProcedureStepSequence).Items[0].TryGetSequence(Dicom.DicomTag.ScheduledProtocolCodeSequence, out spcs))
                                    {
                                        Dicom.DicomDataset dd = new DicomDataset();
                                        dd.AddOrUpdate(Dicom.DicomTag.CodeValue, "");
                                        dd.AddOrUpdate(Dicom.DicomTag.CodingSchemeDesignator, "");
                                        dd.AddOrUpdate(Dicom.DicomTag.CodingSchemeVersion, "");
                                        dd.AddOrUpdate(Dicom.DicomTag.CodeMeaning, "");
                                        spcs = new Dicom.DicomSequence(Dicom.DicomTag.ScheduledProtocolCodeSequence, new DicomDataset[] { dd });
                                        rp.Dataset.GetSequence(Dicom.DicomTag.ScheduledProcedureStepSequence).Items[0].Add(Dicom.DicomTag.ScheduledProtocolCodeSequence, dd);
                                        //rp.Dataset.GetSequence(Dicom.DicomTag.ScheduledProtocolCodeSequence).Items.Add(dd);
                                    }

                                    #endregion

                                    Logger.Info($"After Convert..................");
                                    Log.Loger($"After Convert..................");
                                    log = LogToConsole(rp.Dataset);
                                    Logger.Info(log);
                                    Log.Loger(log);
                                    Logger.Info($"\r\n");
                                    Log.Loger($"\r\n");

                                    worklistItems.Add(rp.Dataset);
                                }
                            }
                            catch (Exception ex)
                            {
                                string log = " Convert Failed: \r\n" + ex.Message;
                                Logger.Info($"\r\n {log}");
                                Log.Loger($"\r\n {log}");
                            }
                        }
                    };

                    var client = new DicomClient();
                    client.AddRequest(cfind);
                    Logger.Info($"Sending request async..................");
                    Log.Loger($"Sending request async..................");
                    client.SendAsync(_serverIP, _serverPort, false, _clientAET, _serverAET).GetAwaiter().GetResult();
                }
            }
            catch (Exception ex)
            {
                string log = " Convert Failed: \r\n" + ex.Message;
                Logger.Info($"\r\n {log}");
                Log.Loger($"\r\n {log}");
            }

            return(worklistItems);
        }