/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.dicom.codec; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.dcm4che3.data.Tag; import org.weasis.dicom.codec.macro.SOPInstanceReferenceAndMAC; public class KOSpecialElement extends AbstractKOSpecialElement { public KOSpecialElement(DicomMediaIO mediaIO) { super(mediaIO); } public void toggleKeyObjectReference(DicomImageElement dicomImage) { String studyInstanceUID = TagD.getTagValue(dicomImage, Tag.StudyInstanceUID, String.class); String seriesInstanceUID = TagD.getTagValue(dicomImage, Tag.SeriesInstanceUID, String.class); String sopInstanceUID = TagD.getTagValue(dicomImage, Tag.SOPInstanceUID, String.class); String sopClassUID = TagD.getTagValue(dicomImage, Tag.SOPClassUID, String.class); toggleKeyObjectReference(studyInstanceUID, seriesInstanceUID, sopInstanceUID, sopClassUID); } /** * If the sopInstanceUID is not referenced, add a new Key Object reference<br> * If the sopInstanceUID is already referenced, remove this Key Object reference * * @param studyInstanceUID * @param seriesInstanceUID * @param sopInstanceUID * @param sopClassUID */ private void toggleKeyObjectReference(String studyInstanceUID, String seriesInstanceUID, String sopInstanceUID, String sopClassUID) { // Get the SOPInstanceReferenceMap for this seriesUID Map<String, SOPInstanceReferenceAndMAC> sopInstanceReferenceBySOPInstanceUID = sopInstanceReferenceMapBySeriesUID.get(seriesInstanceUID); boolean isSelected = sopInstanceReferenceBySOPInstanceUID != null && sopInstanceReferenceBySOPInstanceUID.containsKey(sopInstanceUID); setKeyObjectReference(!isSelected, studyInstanceUID, seriesInstanceUID, sopInstanceUID, sopClassUID); } public boolean setKeyObjectReference(boolean selectedState, DicomImageElement dicomImage) { String studyInstanceUID = TagD.getTagValue(dicomImage, Tag.StudyInstanceUID, String.class); String seriesInstanceUID = TagD.getTagValue(dicomImage, Tag.SeriesInstanceUID, String.class); String sopInstanceUID = TagD.getTagValue(dicomImage, Tag.SOPInstanceUID, String.class); String sopClassUID = TagD.getTagValue(dicomImage, Tag.SOPClassUID, String.class); return setKeyObjectReference(selectedState, studyInstanceUID, seriesInstanceUID, sopInstanceUID, sopClassUID); } private boolean setKeyObjectReference(boolean selectedState, String studyInstanceUID, String seriesInstanceUID, String sopInstanceUID, String sopClassUID) { if (selectedState) { return addKeyObject(studyInstanceUID, seriesInstanceUID, sopInstanceUID, sopClassUID); } else { return removeKeyObject(studyInstanceUID, seriesInstanceUID, sopInstanceUID); } } public boolean setKeyObjectReference(boolean selectedState, List<DicomImageElement> dicomImageList) { Map<String, Set<DicomImageElement>> dicomImageSetMap = new HashMap<>(); for (DicomImageElement dicomImage : dicomImageList) { String studyInstanceUID = TagD.getTagValue(dicomImage, Tag.StudyInstanceUID, String.class); String seriesInstanceUID = TagD.getTagValue(dicomImage, Tag.SeriesInstanceUID, String.class); String sopClassUID = TagD.getTagValue(dicomImage, Tag.SOPClassUID, String.class); String hashcode = studyInstanceUID + seriesInstanceUID + sopClassUID; Set<DicomImageElement> dicomImageSet = dicomImageSetMap.get(hashcode); if (dicomImageSet == null) { dicomImageSet = new HashSet<>(); dicomImageSetMap.put(hashcode, dicomImageSet); } dicomImageSet.add(dicomImage); } boolean hasDataModelChanged = false; for (Set<DicomImageElement> dicomImageSet : dicomImageSetMap.values()) { DicomImageElement firstDicomImage = dicomImageSet.iterator().next(); String studyInstanceUID = TagD.getTagValue(firstDicomImage, Tag.StudyInstanceUID, String.class); String seriesInstanceUID = TagD.getTagValue(firstDicomImage, Tag.SeriesInstanceUID, String.class); String sopClassUID = TagD.getTagValue(firstDicomImage, Tag.SOPClassUID, String.class); Collection<String> sopInstanceUIDs = new ArrayList<>(dicomImageSet.size()); for (DicomImageElement dicomImage : dicomImageSet) { sopInstanceUIDs.add(TagD.getTagValue(dicomImage, Tag.SOPInstanceUID, String.class)); } hasDataModelChanged |= setKeyObjectReference(selectedState, studyInstanceUID, seriesInstanceUID, sopInstanceUIDs, sopClassUID); } return hasDataModelChanged; } private boolean setKeyObjectReference(boolean selectedState, String studyInstanceUID, String seriesInstanceUID, Collection<String> sopInstanceUIDs, String sopClassUID) { if (selectedState) { return addKeyObjects(studyInstanceUID, seriesInstanceUID, sopInstanceUIDs, sopClassUID); } else { return removeKeyObjects(studyInstanceUID, seriesInstanceUID, sopInstanceUIDs); } } }