/// <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); }
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); } }
/// <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); }
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); } }
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); } }
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(); } }
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); }
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(); }
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); }
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); }
/// <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); }
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); }
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); }
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(); }
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]); }
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); }
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'); }
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(); }
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"); } }
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); }
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); }
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); }
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); }
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)); }
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(); }
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; })); }
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)); }
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()); } } }
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); }