示例#1
0
        public void WriteXmlTest()
        {
            XmlWriterSettings settings = new XmlWriterSettings();

            string   value     = "Test";
            TagType  type      = TagType.Additive;
            bool     isUser    = false;
            TagValue firstItem = new TagValue(value, type, isUser);

            StringWriter stringWriter = new StringWriter();
            XmlWriter    writer       = XmlWriter.Create(stringWriter, settings);
            var          serial       = new XmlSerializer(typeof(TagValueCollection));

            var coll = new TagValueCollection();

            coll.Add(firstItem);

            serial.Serialize(writer, coll);
            Assert.AreEqual(m_1ItemXml, stringWriter.ToString());

            coll.Add(new TagValue("AnotherTestValue", TagType.Additive, false));
            stringWriter = new StringWriter();
            writer       = XmlWriter.Create(stringWriter, settings);
            serial.Serialize(writer, coll);
            Assert.AreEqual(m_2ItemXml, stringWriter.ToString());
        }
示例#2
0
        private TagValueCollection GenerateTagValueCollection(TagValueCollection tagValueFilterCollection)
        {
            TagValueCollection localTagValueCollection = new TagValueCollection();

            // Check if the comparator can be used with a Universal Match on the Value of the Tag
            // - that is zero-length Value.
            if (this.UseComparator(tagValueFilterCollection, true) == true)
            {
                foreach (BaseTagValue baseTagValue in tagValueFilterCollection)
                {
                    Hl7TagValue hl7TagValue = null;

                    if (baseTagValue is Hl7TagValue)
                    {
                        hl7TagValue = (Hl7TagValue)baseTagValue;
                    }
                    else if (baseTagValue is DicomTagValue)
                    {
                        DicomTagValue dicomTagValue = (DicomTagValue)baseTagValue;
                        hl7TagValue = new Hl7TagValue(DicomHl7TagMapTemplate.DicomToHl7Tag(dicomTagValue.Tag), dicomTagValue.Value);
                    }

                    // If the Value is empty (Universal Match) then try to get the actual
                    // value from the comparator so that is actual value will be used against
                    // other comparators.
                    if (hl7TagValue.Tag != null)
                    {
                        if (hl7TagValue.Value == System.String.Empty)
                        {
                            // try to get a value for this Tag from this comparator
                            System.String lValue = getValue(hl7TagValue.Tag);

                            // Add a new Tag Value - with Value coming from this comparator
                            // to the local filter.
                            Hl7TagValue lHl7TagValue = new Hl7TagValue(hl7TagValue.Tag, lValue);
                            localTagValueCollection.Add(lHl7TagValue);
                        }
                        else
                        {
                            // Just add the given Tag Value pair to the local filter
                            localTagValueCollection.Add(hl7TagValue);
                        }
                    }
                }
            }

            // Return the local filter
            return(localTagValueCollection);
        }
示例#3
0
        /// <summary>
        ///
        /// </summary>
        public void CreateDefaultTagValues()
        {
            // Create a default value list that is the combination of the user defined
            // default values and the in-built default values. The user defined values
            // take precedence.
            _defaultDicomTagValues = new TagValueCollection();

            // Add all the user defined default values provided
            foreach (BaseDicomTagValue userDefinedTagValue in _userDefinedDefaultTagValues)
            {
                if (userDefinedTagValue is DicomTagValueDelete)
                {
                    // Do not add this to the list as the default should be deleted
                }
                else
                {
                    _defaultDicomTagValues.Add(userDefinedTagValue);
                }
            }

            // Generate all the in-built default values
            InBuiltDefaultTagValues inBuiltDefaultTagValues = new InBuiltDefaultTagValues();

            // Add the in-built default values - but only if not defined by the user
            foreach (BaseDicomTagValue inBuiltTagValue in inBuiltDefaultTagValues.TagValueDefaults)
            {
                BaseDicomTagValue userDefinedTagValue = _userDefinedDefaultTagValues.Find(inBuiltTagValue.Tag);
                if ((userDefinedTagValue != null) &&
                    (userDefinedTagValue is DicomTagValueDelete))
                {
                    // Do not add this to the list as the default should be deleted
                }
                else if (_defaultDicomTagValues.Find(inBuiltTagValue.Tag) == null)
                {
                    _defaultDicomTagValues.Add(inBuiltTagValue);
                }
            }

            // Now instantiate the default tag value list
            _instantiatedDefaultTagValues = new TagValueCollection();
            foreach (BaseDicomTagValue defaultTagValue in _defaultDicomTagValues)
            {
                // The Value property of defaultTagValue returns the next instantiated value based on the
                // how the default value was defined at setup.
                _instantiatedDefaultTagValues.Add(new DicomTagValue(defaultTagValue.Tag, defaultTagValue.Value));
            }
        }
示例#4
0
        /// <summary>
        /// Update the default DICOM Tag Values grouped by the given affected entity.
        /// Any 'auto' default value in the affected entity will get it's next value.
        /// </summary>
        /// <param name="affectedEntity">Affected Entity enum - to update.</param>
        public void UpdateInstantiatedDefaultTagValues(AffectedEntityEnum affectedEntity)
        {
            foreach (BaseDicomTagValue defaultTagValue in _defaultDicomTagValues)
            {
                if (defaultTagValue.AffectedEntity == affectedEntity)
                {
                    // Try to get the instantiated default tag value
                    BaseDicomTagValue instantiatedDefaultTagValue = _instantiatedDefaultTagValues.Find(defaultTagValue.Tag);
                    if (instantiatedDefaultTagValue != null)
                    {
                        // Remove the existing tag value
                        _instantiatedDefaultTagValues.Remove(instantiatedDefaultTagValue);

                        // Add the updated value
                        // The Value property of defaultTagValue returns the next instantiated value based on the
                        // how the default value was defined at setup.
                        _instantiatedDefaultTagValues.Add(new DicomTagValue(defaultTagValue.Tag, defaultTagValue.Value));
                    }
                }
            }
        }
示例#5
0
 /// <summary>
 /// Add user defined default Tag Values. Used to help define the message tag/values
 /// used during the tests.
 /// </summary>
 /// <param name="defaultTagValue">Default Tag Value pair.</param>
 public void AddUserDefinedDefaultTagValue(BaseDicomTagValue defaultTagValue)
 {
     _userDefinedDefaultTagValues.Add(defaultTagValue);
 }
示例#6
0
        public InBuiltDefaultTagValues()
        {
            // Patient Entity default values
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.PATIENTS_NAME, "Doe^John"));
            _defaultDicomTagValues.Add(new DicomTagValueAutoIncrement(AffectedEntityEnum.PatientEntity, Tag.PATIENT_ID, "PatId:", 1, 1, 6));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.PATIENTS_BIRTH_DATE, "19600606"));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.PATIENTS_SEX, "M"));

            // Study Entity default values
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.STUDY_DESCRIPTION, "StudyDescription"));
            _defaultDicomTagValues.Add(new DicomTagValueAutoIncrement(AffectedEntityEnum.StudyEntity, Tag.STUDY_ID, "StdyId:", 1, 1, 3));
            _defaultDicomTagValues.Add(new DicomTagValueAutoSetDate(AffectedEntityEnum.StudyEntity, Tag.STUDY_DATE));
            _defaultDicomTagValues.Add(new DicomTagValueAutoSetTime(AffectedEntityEnum.StudyEntity, Tag.STUDY_TIME));

            // Series Entity default values
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.PROTOCOL_NAME, "ProtocolName"));
            _defaultDicomTagValues.Add(new DicomTagValueAutoSetUid(AffectedEntityEnum.SeriesEntity, Tag.SERIES_INSTANCE_UID, _uidRoot, 1));
            _defaultDicomTagValues.Add(new DicomTagValueAutoIncrement(AffectedEntityEnum.SeriesEntity, Tag.SERIES_NUMBER, "", 1, 1, 0));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.RETRIEVE_AE_TITLE, "RetrieveAET"));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.SERIES_DESCRIPTION, "SeriesDescription"));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.PERFORMING_PHYSICIANS_NAME, "Performing^Physician"));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.OPERATORS_NAME, "Operators^Name"));

            // Instance Entity default values
            _defaultDicomTagValues.Add(new DicomTagValueAutoSetUid(AffectedEntityEnum.InstanceEntity, Tag.SOP_INSTANCE_UID, _uidRoot, 1));
            _defaultDicomTagValues.Add(new DicomTagValueAutoIncrement(AffectedEntityEnum.InstanceEntity, Tag.INSTANCE_NUMBER, "", 1, 1, 0));

            // Image Service Request Entity default values
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.REFERENCED_STUDY_SEQUENCE, ""));
            _defaultDicomTagValues.Add(new DicomTagValueAutoIncrement(AffectedEntityEnum.ImageServiceRequestEntity, Tag.ACCESSION_NUMBER, "AccNo:", 1, 1, 6));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.REFERRING_PHYSICIANS_NAME, "Referring^Physician"));

            // Requested Procedure Entity default values
            _defaultDicomTagValues.Add(new DicomTagValueAutoIncrement(AffectedEntityEnum.RequestedProcedureEntity, Tag.REQUESTED_PROCEDURE_ID, "RPId:", 1, 1, 3));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.REQUESTED_PROCEDURE_DESCRIPTION, "RequestedProcedureDescription"));
            _defaultDicomTagValues.Add(new DicomTagValueAutoSetUid(AffectedEntityEnum.RequestedProcedureEntity, Tag.STUDY_INSTANCE_UID, _uidRoot, 1));

            // Scheduled Procedure Step Entity default values
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.MODALITY, "OT"));
            _defaultDicomTagValues.Add(new DicomTagValueAutoIncrement(AffectedEntityEnum.ScheduledProcedureStepEntity, Tag.SCHEDULED_PROCEDURE_STEP_ID, "SPSId:", 1, 1, 3));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.SCHEDULED_PROCEDURE_STEP_DESCRIPTION, "ScheduledProcedureStepDescription"));
            _defaultDicomTagValues.Add(new DicomTagValueAutoSetDate(AffectedEntityEnum.ScheduledProcedureStepEntity, Tag.SCHEDULED_PROCEDURE_STEP_START_DATE));
            _defaultDicomTagValues.Add(new DicomTagValueAutoSetTime(AffectedEntityEnum.ScheduledProcedureStepEntity, Tag.SCHEDULED_PROCEDURE_STEP_START_TIME));

            // Performed Procedure Step Entity default values
            _defaultDicomTagValues.Add(new DicomTagValueAutoIncrement(AffectedEntityEnum.PerformedProcedureStepEntity, Tag.PERFORMED_PROCEDURE_STEP_ID, "PPSId:", 1, 1, 3));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.PERFORMED_PROCEDURE_STEP_DESCRIPTION, "PerformedProcedureStepDescription"));
            _defaultDicomTagValues.Add(new DicomTagValueAutoSetDate(AffectedEntityEnum.PerformedProcedureStepEntity, Tag.PERFORMED_PROCEDURE_STEP_START_DATE));
            _defaultDicomTagValues.Add(new DicomTagValueAutoSetTime(AffectedEntityEnum.PerformedProcedureStepEntity, Tag.PERFORMED_PROCEDURE_STEP_START_TIME));
            _defaultDicomTagValues.Add(new DicomTagValueAutoSetDate(AffectedEntityEnum.PerformedProcedureStepEntity, Tag.PERFORMED_PROCEDURE_STEP_END_DATE));
            _defaultDicomTagValues.Add(new DicomTagValueAutoSetTime(AffectedEntityEnum.PerformedProcedureStepEntity, Tag.PERFORMED_PROCEDURE_STEP_END_TIME));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.PERFORMED_STATION_AE_TITLE, "PerformedAET"));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.PERFORMED_STATION_NAME, "PerformedStationName"));
            _defaultDicomTagValues.Add(new DicomTagValue(Tag.PERFORMED_LOCATION, "PerformedLocation"));
        }
示例#7
0
        /// <summary>
        /// Send a C-MOVE-RQ Information Model Retrieve.
        /// Retrieve based on the informationModel provided and the query/retrieve level. Take
        /// the retrieve tags from the retrieveTags provided. The retrieve is done to the move
        /// destination.
        ///
        /// The C-MOVE-RSP messages returned are stored in a DicomQueryItemCollection named RetrieveItems.
        /// </summary>
        /// <param name="informationModel">Q/R Information Model to be used in the retrieve operation.</param>
        /// <param name="level">Query / retrieve level.</param>
        /// <param name="moveDestination">AE Title of the "move" destination.</param>
        /// <param name="retrieveTags">List of Retrieve Tags.</param>
        /// <returns>Boolean indicating success or failure.</returns>
        public bool SendRetrieveImages(QueryRetrieveInformationModelEnum informationModel, QueryRetrieveLevelEnum level, System.String moveDestination, TagValueCollection retrieveTags)
        {
            System.String queryRetrieveLevel = System.String.Empty;
            switch (level)
            {
            case QueryRetrieveLevelEnum.PatientQueryRetrieveLevel:
                queryRetrieveLevel = "PATIENT";
                break;

            case QueryRetrieveLevelEnum.StudyQueryRetrieveLevel:
                queryRetrieveLevel = "STUDY";
                break;

            case QueryRetrieveLevelEnum.SeriesQueryRetrieveLevel:
                queryRetrieveLevel = "SERIES";
                break;

            case QueryRetrieveLevelEnum.InstanceQueryRetrieveLevel:
                queryRetrieveLevel = "IMAGE";
                break;

            default:
                return(false);
            }
            if (retrieveTags.Find(Tag.QUERY_RETRIEVE_LEVEL) == null)
            {
                retrieveTags.Add(new DicomTagValue(Tag.QUERY_RETRIEVE_LEVEL, queryRetrieveLevel));
            }
            _retrieveItems = new DicomQueryItemCollection();

            DicomTrigger trigger = new DicomTrigger(TransactionNameEnum.RAD_16);

            System.String sopClassUid = System.String.Empty;
            switch (informationModel)
            {
            case QueryRetrieveInformationModelEnum.PatientRootQueryRetrieveInformationModel:
                sopClassUid = "1.2.840.10008.5.1.4.1.2.1.2";
                break;

            case QueryRetrieveInformationModelEnum.StudyRootQueryRetrieveInformationModel:
                sopClassUid = "1.2.840.10008.5.1.4.1.2.2.2";
                break;

            case QueryRetrieveInformationModelEnum.PatientStudyOnlyQueryRetrieveInformationModel:
                sopClassUid = "1.2.840.10008.5.1.4.1.2.3.2";
                break;

            default:
                return(false);
            }
            trigger.AddItem(GenerateTriggers.MakeCMoveRetrieve(informationModel, moveDestination, retrieveTags),
                            sopClassUid,
                            "1.2.840.10008.1.2");

            // RAD-16 - trigger the ImageArchive
            bool triggerResult = TriggerActorInstances(ActorTypeEnum.ImageArchive, trigger, true);

            // Get the retrieve items returned
            if (triggerResult == true)
            {
                foreach (ActorsTransaction actorsTransaction in ActorsTransactionLog)
                {
                    if (actorsTransaction.FromActorName.Type == ActorTypeEnum.ImageArchive)
                    {
                        BaseTransaction baseTransaction = actorsTransaction.Transaction;
                        if (baseTransaction is DicomTransaction)
                        {
                            DicomTransaction dicomTransaction = (DicomTransaction)baseTransaction;
                            if (dicomTransaction.Processed == false)
                            {
                                DicomMessageCollection cMoveResponses = dicomTransaction.DicomMessages.CMoveResponses;
                                int index = 0;
                                foreach (DvtkHighLevelInterface.Dicom.Messages.DicomMessage dicomMessage in cMoveResponses)
                                {
                                    // store all C-MOVE-RSP messages
                                    // - use DicomQueryItem.GetValue(Tag.NUMBER_OF_COMPLETED_SUBOPERATIONS) to get completed count
                                    // - use DicomQueryItem.GetValue(Tag.NUMBER_OF_FAILED_SUBOPERATIONS) to get failed count
                                    // - use DicomQueryItem.GetValue(Tag.NUMBER_OF_REMAINING_SUBOPERATIONS) to get remaining count
                                    // - use DicomQueryItem.GetValue(Tag.NUMBER_OF_WARNING_SUBOPERATIONS) to get warning count
                                    DicomQueryItem dicomRetriveItem = new DicomQueryItem(index++, dicomMessage);
                                    _retrieveItems.Add(dicomRetriveItem);
                                }
                                dicomTransaction.Processed = true;
                            }
                        }
                    }
                }
            }

            return(triggerResult);
        }
示例#8
0
        /// <summary>
        /// Send a C-FIND-RQ Information Model Query.
        /// Query based on the informationModel provided and the query/retrieve level. Take
        /// the query tags from the queryTags provided.
        ///
        /// The C-FIND-RSP messages returned are stored in a DicomQueryItemCollection named QueryItems.
        /// </summary>
        /// <param name="informationModel">Q/R Information Model to be used in the query operation.</param>
        /// <param name="level">Query / retrieve level.</param>
        /// <param name="queryTags">List of Query Tags.</param>
        /// <returns>Boolean indicating success or failure.</returns>
        public bool SendQueryImages(QueryRetrieveInformationModelEnum informationModel, QueryRetrieveLevelEnum level, TagValueCollection queryTags)
        {
            System.String queryRetrieveLevel = System.String.Empty;
            switch (level)
            {
            case QueryRetrieveLevelEnum.PatientQueryRetrieveLevel:
                _patientLevelQueryItems = new DicomQueryItemCollection();
                queryRetrieveLevel      = "PATIENT";
                break;

            case QueryRetrieveLevelEnum.StudyQueryRetrieveLevel:
                _studyLevelQueryItems = new DicomQueryItemCollection();
                queryRetrieveLevel    = "STUDY";
                break;

            case QueryRetrieveLevelEnum.SeriesQueryRetrieveLevel:
                _seriesLevelQueryItems = new DicomQueryItemCollection();
                queryRetrieveLevel     = "SERIES";
                break;

            case QueryRetrieveLevelEnum.InstanceQueryRetrieveLevel:
                _instanceLevelQueryItems = new DicomQueryItemCollection();
                queryRetrieveLevel       = "IMAGE";
                break;

            default:
                return(false);
            }
            if (queryTags.Find(Tag.QUERY_RETRIEVE_LEVEL) == null)
            {
                queryTags.Add(new DicomTagValue(Tag.QUERY_RETRIEVE_LEVEL, queryRetrieveLevel));
            }

            DicomQueryItemCollection queryItems = QueryItems(level);

            DicomTrigger trigger = new DicomTrigger(TransactionNameEnum.RAD_14);

            System.String sopClassUid = System.String.Empty;
            switch (informationModel)
            {
            case QueryRetrieveInformationModelEnum.PatientRootQueryRetrieveInformationModel:
                sopClassUid = "1.2.840.10008.5.1.4.1.2.1.1";
                break;

            case QueryRetrieveInformationModelEnum.StudyRootQueryRetrieveInformationModel:
                sopClassUid = "1.2.840.10008.5.1.4.1.2.2.1";
                break;

            case QueryRetrieveInformationModelEnum.PatientStudyOnlyQueryRetrieveInformationModel:
                sopClassUid = "1.2.840.10008.5.1.4.1.2.3.1";
                break;

            default:
                return(false);
            }
            trigger.AddItem(GenerateTriggers.MakeCFindQuery(informationModel, queryTags),
                            sopClassUid,
                            "1.2.840.10008.1.2");

            // RAD-14 - trigger the ImageArchive
            bool triggerResult = TriggerActorInstances(ActorTypeEnum.ImageArchive, trigger, true);

            // Get the query items returned
            if (triggerResult == true)
            {
                foreach (ActorsTransaction actorsTransaction in ActorsTransactionLog)
                {
                    if (actorsTransaction.FromActorName.Type == ActorTypeEnum.ImageArchive)
                    {
                        BaseTransaction baseTransaction = actorsTransaction.Transaction;
                        if (baseTransaction is DicomTransaction)
                        {
                            DicomTransaction dicomTransaction = (DicomTransaction)baseTransaction;
                            if (dicomTransaction.Processed == false)
                            {
                                DicomMessageCollection cFindResponses = dicomTransaction.DicomMessages.CFindResponses;
                                int index = 0;
                                foreach (DvtkHighLevelInterface.Dicom.Messages.DicomMessage dicomMessage in cFindResponses)
                                {
                                    if (dicomMessage.DataSet.Count != 0)
                                    {
                                        DicomQueryItem dicomQueryItem = new DicomQueryItem(index++, dicomMessage);
                                        queryItems.Add(dicomQueryItem);
                                    }
                                }
                                dicomTransaction.Processed = true;
                            }
                        }
                    }
                }
            }

            return(triggerResult);
        }
示例#9
0
 /// <summary>
 /// Add a Tag Value filter for the comparator.
 /// Only compare messages which contain the same values for this filter.
 /// </summary>
 /// <param name="tagValueFilter">Tag Value Filter.</param>
 public void AddComparisonTagValueFilter(DicomTagValue tagValueFilter)
 {
     _tagValueFilterCollection.Add(tagValueFilter);
 }
        public void WriteXmlTest()
        {
            XmlWriterSettings settings = new XmlWriterSettings();

            string value = "Test";
            TagType type = TagType.Additive;
            bool isUser = false;
            TagValue firstItem = new TagValue(value, type, isUser);

            StringWriter stringWriter = new StringWriter();
            XmlWriter writer = XmlWriter.Create(stringWriter, settings);
            var serial = new XmlSerializer(typeof(TagValueCollection));

            var coll = new TagValueCollection();
            coll.Add(firstItem);

            serial.Serialize(writer, coll);
            Assert.AreEqual(m_1ItemXml, stringWriter.ToString());

            coll.Add(new TagValue("AnotherTestValue", TagType.Additive, false));
            stringWriter = new StringWriter();
            writer = XmlWriter.Create(stringWriter, settings);
            serial.Serialize(writer, coll);
            Assert.AreEqual(m_2ItemXml, stringWriter.ToString());
        }