2015-07-30 15 views
5

Java projemde bu depodan http://www.dcm4che.org/maven2/dcm4che/'dan aşağıda belirtilen dcm4che2 API'sini kullanmıştım.dcm4che2'den dcm4che3'e geçiş

org.dcm4che2.net.CommandUtils 
org.dcm4che2.net.ConfigurationException 
org.dcm4che2.net.NetworkApplicationEntity 
org.dcm4che2.net.NetworkConnection 
org.dcm4che2.net.NewThreadExecutor 
org.dcm4che3.net.service.StorageService 
org.dcm4che3.net.service.VerificationService 

anda I geçirmek isteyen dcm4che çekirdekli 2.0.29.jar

org.dcm4che2.data.DicomObject 
org.dcm4che2.io.StopTagInputHandler 
org.dcm4che2.data.BasicDicomObject 
org.dcm4che2.data.UIDDictionary 
org.dcm4che2.data.DicomElement 
org.dcm4che2.data.SimpleDcmElement 
org.dcm4che2.net.service.StorageCommitmentService 
org.dcm4che2.util.CloseUtils 

dcm4che-net 2.0.29.jar yukarıda dcm4che3 ama listelenen API, bu depodan indirdiğim dcm4che3 içinde bulunmadı http://sourceforge.net/projects/dcm4che/files/dcm4che3/
Alternatif yaklaşım için bana yol gösterir misiniz?

cevap

4

Daha önce gözlemlediğiniz gibi, BasicDicomObject geçmişte - diğerlerinin yanında.

Yeni "Dicom nesnesi" Attributes - bir nesne nitelik koleksiyonudur.

Bu nedenle, Öznitelikler oluşturur, bunları RQ davranışı (C-FIND, vb.) Için gereken etiketlerle doldurursunuz ve elde ettiğiniz şey, istediğiniz etiketleri çektiğiniz başka bir Attributes nesnesidir.

Benim düşünceme göre, dcm4che 2.x bireysel değer temsilleri ile ilgilenme konusunda muğlaktı. dcm4che 3.x biraz daha açık. Geçiş, tek tek etiketleri nasıl sorguladığınız ve nasıl ele aldığınız konusunda kodunuzun yeniden yazılmasını gerektirir. Öte yandan, dcm4che 3.x yeni kodu daha az kıvrımlı hale getirir.

Oldukça eksiksiz bir örnek, bir PACS tarafından verilen katılım numaralarından çalışmaların alınması; Sorguyu ayarlama ve sonucu işleme:

String modality = null; 
    String accessionNumber = "1234567890"; 

    //-------------------------------------------------------- 
    // HERE follows setup of a query, using an Attributes object 
    //-------------------------------------------------------- 
    Attributes query = new Attributes(); 

    // Indicate character set 
    { 
     int tag = Tag.SpecificCharacterSet; 
     VR vr = ElementDictionary.vrOf(tag, query.getPrivateCreator(tag)); 
     query.setString(tag, vr, "ISO_IR 100"); 
    } 

    // Study level query 
    { 
     int tag = Tag.QueryRetrieveLevel; 
     VR vr = ElementDictionary.vrOf(tag, query.getPrivateCreator(tag)); 
     query.setString(tag, vr, "STUDY"); 
    } 

    // Accession number 
    { 
     int tag = Tag.AccessionNumber; 
     VR vr = ElementDictionary.vrOf(tag, query.getPrivateCreator(tag)); 
     query.setString(tag, vr, accessionNumber); 
    } 

    // Optionally filter on modality in study if 'modality' is provided, 
    // otherwise retrieve modality 
    { 
     int tag = Tag.ModalitiesInStudy; 
     VR vr = ElementDictionary.vrOf(tag, query.getPrivateCreator(tag)); 
     if (null != modality && modality.length() > 0) { 
      query.setString(tag, vr, modality); 
     } else { 
      query.setNull(tag, vr); 
     } 
    } 

    // We are interested in study instance UID 
    { 
     int tag = Tag.StudyInstanceUID; 
     VR vr = ElementDictionary.vrOf(tag, query.getPrivateCreator(tag)); 
     query.setNull(tag, vr); 
    } 

    // Do the actual query, needing an AppliationEntity (ae), 
    // a local (local) and remote (remote) Connection, and 
    // an AAssociateRQ (rq) set up earlier. 

    // 1) Open a connection to the SCP 
    Association as = ae.connect(local, remote, rq); 

    // 2) Query 
    int priority = 0x0002; // low for the sake of demo :) 
    as.cfind(UID.StudyRootQueryRetrieveInformationModelFIND, query, null, 
      new DimseRSPHandler(as.nextMessageID()) { 

     @Override 
     public void onDimseRSP(Association assoc, Attributes cmd, 
           Attributes response) { 

      super.onDimseRSP(assoc, cmd, response); 

      int status = cmd.getInt(Tag.Status, -1); 
      if (Status.isPending(status)) { 
       //-------------------------------------------------------- 
       // HERE follows handling of the response, which 
       // is just another Attributes object 
       //-------------------------------------------------------- 
       String studyInstanceUID = response.getString(Tag.StudyInstanceUID); 
       // etc... 
      } 
     } 
    }); 

    // 3) Close the connection to the SCP 
    if (as != null && as.isReadyForDataTransfer()) { 
     as.waitForOutstandingRSP(); 
     as.release(); 
     as = null; 
    }