protected override void Execute() { try { WriteHtmlInformation("<br />"); WriteInformation(string.Format("Reading reference media file from {0}", DCMCompareForm.firstDCMFile)); WriteHtmlInformation("<br />"); // Read the DCM File DicomFile dcmFile = new DicomFile(); DataSet refDataset = new DataSet(); if ((DCMCompareForm.firstDCMFile.ToLower().IndexOf("dicomdir")) != -1) { // Read the DICOMDIR dataset refDataset.DvtkDataDataSet = Dvtk.DvtkDataHelper.ReadDataSetFromFile(DCMCompareForm.firstDCMFile); } else { dcmFile.Read(DCMCompareForm.firstDCMFile, this); refDataset = dcmFile.DataSet; } refDataset.UnVrDefinitionLookUpWhenReading = false; FileMetaInformation refFMI = dcmFile.FileMetaInformation; WriteInformation(string.Format("Reading source media file from {0}", DCMCompareForm.secondDCMFile)); WriteHtmlInformation("<br />"); DataSet srcDataset = new DataSet(); if ((DCMCompareForm.secondDCMFile.ToLower().IndexOf("dicomdir")) != -1) { // Read the DICOMDIR dataset srcDataset.DvtkDataDataSet = Dvtk.DvtkDataHelper.ReadDataSetFromFile(DCMCompareForm.secondDCMFile); } else { dcmFile.Read(DCMCompareForm.secondDCMFile, this); srcDataset = dcmFile.DataSet; } srcDataset.UnVrDefinitionLookUpWhenReading = false; FileMetaInformation srcFMI = dcmFile.FileMetaInformation; // Now get the list of filtered attribute if (DCMCompareForm.attributesTagList.Count != 0) { foreach (string filterAttr in DCMCompareForm.attributesTagList) { try { if (srcDataset.Exists(filterAttr)) { srcDataset.Delete(filterAttr); } if (refDataset.Exists(filterAttr)) { refDataset.Delete(filterAttr); } } catch (Exception exception) { MessageBox.Show(exception.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } DCMCompareForm.attributesTagList.Clear(); } WriteInformation(string.Format("Comparing the Media files - {0} and {1}", DCMCompareForm.firstDCMFile, DCMCompareForm.secondDCMFile)); WriteHtmlInformation("<br />"); StaticDicomCompare staticDicomCompare = new StaticDicomCompare(); //Determine the VR display based on Transfer syntax string srcTransferSyntax = ""; string refTransferSyntax = ""; if ((srcFMI != null) && srcFMI.Exists("0x00020010")) { // Get the Transfer syntax DvtkHighLevelInterface.Dicom.Other.Attribute tranferSyntaxAttr = srcFMI["0x00020010"]; srcTransferSyntax = tranferSyntaxAttr.Values[0]; } else { WriteHtmlInformation(string.Format("Couldn't retrieve the Transfer syntax from DCM File {0}", DCMCompareForm.secondDCMFile)); WriteHtmlInformation("<br />"); } if ((refFMI != null) && refFMI.Exists("0x00020010")) { // Get the Transfer syntax DvtkHighLevelInterface.Dicom.Other.Attribute tranferSyntaxAttr = refFMI["0x00020010"]; refTransferSyntax = tranferSyntaxAttr.Values[0]; } else { WriteHtmlInformation(string.Format("Couldn't retrieve the Transfer syntax from DCM File {0}", DCMCompareForm.firstDCMFile)); WriteHtmlInformation("<br />"); } FlagsDicomAttribute flags = FlagsDicomAttribute.Compare_values | FlagsDicomAttribute.Compare_present | FlagsDicomAttribute.Include_sequence_items; if ((srcTransferSyntax == "1.2.840.10008.1.2") || (refTransferSyntax == "1.2.840.10008.1.2")) { staticDicomCompare.DisplayAttributeVR = false; } else { flags |= FlagsDicomAttribute.Compare_VR; } //Check for group length attributes option if (DCMCompareForm.filterGroupLengthAttributes) { /*for( int i=0; i < srcDataset.Count; i++ ) * { * HLI.Attribute attribute = srcDataset[i]; * if(attribute.ElementNumber == 0x0000) * srcDataset.Delete(DCMCompareForm.TagString(attribute.GroupNumber,attribute.ElementNumber)); * } * * for( int i=0; i < refDataset.Count; i++ ) * { * HLI.Attribute attribute = refDataset[i]; * if(attribute.ElementNumber == 0x0000) * refDataset.Delete(DCMCompareForm.TagString(attribute.GroupNumber,attribute.ElementNumber)); * }*/ staticDicomCompare.DisplayGroupLength = false; } int differences = 0; if ((refFMI != null) && (srcFMI != null)) { AttributeCollections fmis = new AttributeCollections(); fmis.Add(refFMI); fmis.Add(srcFMI); StringCollection fmiDescriptions = new StringCollection(); fmiDescriptions.Add("Ref FMI"); fmiDescriptions.Add("Src FMI"); HLIStaticCompare.CompareResults fmiCompareResults = staticDicomCompare.CompareAttributeSets("FMI compare results", fmis, fmiDescriptions, flags); WriteHtmlInformation(fmiCompareResults.Table.ConvertToHtml()); differences += fmiCompareResults.DifferencesCount; NrOfValidationErrors += (uint)fmiCompareResults.DifferencesCount; } AttributeCollections datasets = new AttributeCollections(); datasets.Add(refDataset); datasets.Add(srcDataset); StringCollection dsDescriptions = new StringCollection(); dsDescriptions.Add("Ref Dataset"); dsDescriptions.Add("Src Dataset"); HLIStaticCompare.CompareResults dsCompareResults = staticDicomCompare.CompareAttributeSets("DataSet compare results", datasets, dsDescriptions, flags); WriteHtmlInformation(dsCompareResults.Table.ConvertToHtml()); differences += dsCompareResults.DifferencesCount; WriteHtmlInformation("<b>"); WriteInformation("Differences found: " + differences.ToString()); WriteHtmlInformation("</b><br />"); NrOfValidationErrors += (uint)dsCompareResults.DifferencesCount; } catch (Exception exception) { MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } }
private bool HandleSubOperation(System.String moveDestinationAE, System.String dcmFilename, int subOperationIndex) { SCU storageScu = new SCU(); storageScu.Initialize(DicomThread.ThreadManager); storageScu.Options.DeepCopyFrom(DicomThread.Options); storageScu.Options.Identifier = "StorageSubOperationAsScu"; ////Check for Secure connection //if (DicomThread.Options.SecureConnection) //{ // storageScu.Options.SecureConnection = true; // storageScu.Options.CertificateFilename = DicomThread.Options.CertificateFilename; // storageScu.Options.CredentialsFilename = DicomThread.Options.CredentialsFilename; //} storageScu.Options.ResultsFileNameOnlyWithoutExtension = "StorageSubOperationAsScu" + subOperationIndex.ToString(); storageScu.Options.ResultsDirectory = DicomThread.Options.ResultsDirectory; storageScu.Options.LocalAeTitle = DicomThread.Options.LocalAeTitle; storageScu.Options.LocalPort = DicomThread.Options.LocalPort; if (IsHaveMoveDestinations) { storageScu.Options.RemoteAeTitle = moveDestinationAE; storageScu.Options.RemotePort = MoveDestiantions[MoveAEdetailsIndex].Port; storageScu.Options.RemoteHostName = MoveDestiantions[MoveAEdetailsIndex].IP; } else { storageScu.Options.RemoteAeTitle = moveDestinationAE; storageScu.Options.RemotePort = DicomThread.Options.RemotePort; storageScu.Options.RemoteHostName = DicomThread.Options.RemoteHostName; } storageScu.Options.DataDirectory = DicomThread.Options.DataDirectory; storageScu.Options.StorageMode = Dvtk.Sessions.StorageMode.AsDataSet; // Read the DCM File DicomFile dcmFile = new DicomFile(); dcmFile.Read(dcmFilename, storageScu); FileMetaInformation fMI = dcmFile.FileMetaInformation; // Get the transfer syntax and SOP class UID System.String transferSyntax = "1.2.840.10008.1.2"; if ((fMI != null) && fMI.Exists("0x00020010")) { // Get the Transfer syntax DvtkHighLevelInterface.Dicom.Other.Attribute tranferSyntaxAttr = fMI["0x00020010"]; transferSyntax = tranferSyntaxAttr.Values[0]; } Values values = dcmFile.DataSet["0x00080016"].Values; System.String sopClassUid = values[0]; PresentationContext presentationContext = new PresentationContext(sopClassUid, // Abstract Syntax Name transferSyntax); // Transfer Syntax Name(s) PresentationContext[] presentationContexts = new PresentationContext[1]; presentationContexts[0] = presentationContext; DicomMessage storageMessage = new DicomMessage(DvtkData.Dimse.DimseCommand.CSTORERQ); storageMessage.DataSet.CloneFrom(dcmFile.DataSet); storageScu.Start(); bool sendResult = storageScu.TriggerSendAssociationAndWait(storageMessage, presentationContexts); if (!sendResult) { WriteWarning("Association to move destination for Storage Sub-Operation is rejected."); } if (storageScu.HasExceptionOccured) { WriteError("Storage Sub-Operation As SCU Failed"); } storageScu.Stop(); DicomMessageCollection cStoreResponses = storageScu.Messages.DicomMessages.CStoreResponses; // Obtain the value of the C-STORE RSP.The value of this variable is used to determine the attributes of the C-MOVE RSP. foreach (DicomMessage cStoreRsp in cStoreResponses) { cStoreStatusVal = Int32.Parse(cStoreRsp.CommandSet.GetValues("0x00000900")[0]); } // Transform the sub results Xslt.StyleSheetFullFileName = DicomThread.Options.StyleSheetFullFileName; System.String htmlResultsFilename = Xslt.Transform(storageScu.Options.ResultsDirectory, storageScu.Options.ResultsFileNameOnly); // Make link to the sub-operation results file System.String message = System.String.Format("<a href=\"{0}\">Storage sub-operation {1} to AE Title \"{2}\"</a><br/>", htmlResultsFilename, subOperationIndex, moveDestinationAE); DicomThread.WriteHtmlInformation(message); return(sendResult); }