I do not understand what you want me to learn.
Here is my code:
Code:
/***
Charge sur le disque les series qui sont demandées depuis la zone d'importation
-serverIpAdress represente l'adresse IP nécéssaire à la connexion
-serverPort represente le numero du port nécéssaire à la connexion, coté serveur
-serverAet represente l'AET nécéssaire à la connexion
-monIpAdress represente l'adresse IP de la machine
-monPort represente le numero du port nécéssaire à la connexion coté client
-monAet represente l'AET de la machine
-listeStudyIDGet représente la liste des DCM_StudyInstanceUID des Study à charger sur le disque
*/
bool MedicTool2::getImagePacs(QString serverIpAdress, QString serverPort, QString serverAet, QString monIpAdress, QString monPort, QString monAet, QStringList listeStudyIDGet)
{
for (int numeroStudy=0; numeroStudy {
//Récupération de l'examen courant
QString numeroIDStudy = listeStudyIDGet[numeroStudy];
QProgressDialog progressDialog (tr("Récuperation en cours :")+" "+numeroIDStudy+"\n"+tr("Veuillez patienter..."),QString(),0,100);
progressDialog.setWindowModality(Qt::WindowModal);
progressDialog.show();
//Mise en place des parametre pour établire la connexion DICOM
OFLog::configure(OFLogger::DEBUG_LOG_LEVEL);
DcmTestSCU scu;
DcmTestSCUN scuN;
progressDialog.setValue(10);
//Mise en place des parametres AET
OFString OFmonAet = monAet; scu.setAETitle(OFmonAet); scuN.setAETitle(OFmonAet);
OFString OFipAdresse = serverIpAdress; scu.setPeerHostName(OFipAdresse); scuN.setPeerHostName(OFipAdresse);
Uint16 OFport = serverPort.toUInt(); scu.setPeerPort(OFport); scuN.setPeerPort(OFport);
OFString OFaet = serverAet; scu.setPeerAETitle(OFaet); scuN.setPeerAETitle(OFaet);
progressDialog.setValue(20);
//Utilisation du contexte de présentation FIND / MOVE dans la racine des series, pour proposer toutes les syntaxes de transfert compressées (Use presentation context for FIND/MOVE in study root, propose all uncompressed transfer syntaxes)
OFList ts;
ts.push_back(UID_LittleEndianExplicitTransferSyntax);
ts.push_back(UID_BigEndianExplicitTransferSyntax);
ts.push_back(UID_LittleEndianImplicitTransferSyntax);
scu.addPresentationContext(UID_FINDStudyRootQueryRetrieveInformationModel, ts); scu.addPresentationContext(UID_MOVEStudyRootQueryRetrieveInformationModel, ts); scu.addPresentationContext(UID_VerificationSOPClass, ts);
scuN.addPresentationContext(UID_FINDStudyRootQueryRetrieveInformationModel, ts); scuN.addPresentationContext(UID_MOVEStudyRootQueryRetrieveInformationModel, ts); scuN.addPresentationContext(UID_VerificationSOPClass, ts);
progressDialog.setValue(30);
//Initialisation du reseau
OFCondition result = scu.initNetwork();
result = scuN.initNetwork();
if (result.bad())
{//PROBLEME DE CONNEXION
QString add = result.text();
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nImpossible d'initialiser le reseau: "+add);
return false;
}
progressDialog.setValue(40);
//TENTATIVE D'ASSOCIATION
result = scu.negotiateAssociation();
result = scuN.negotiateAssociation();
if (result.bad())
{//PROBLEME D'IDENTIFICATION
QString add = result.text();
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nImpossible de negocier l'association: "+add);
return false;
}
progressDialog.setValue(50);
//Voyons si le serveur est en écoute: Contruction et envoi d'une demande C-ECHO (Let's look whether the server is listening: Assemble and send C-ECHO request)
result = scu.sendECHORequest(0);
result = scuN.sendECHORequest(0);
if (result.bad())
{//PROBLEME, LE SERVER NE REPOND PAS
QString add = result.text();
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nImpossible d'utiliser le processus E-ECHO avec le serveur: "+add);
return false;
}
progressDialog.setValue(60);
//Construction et envoi d'une requete C-FIND, pour trouver les examens
FINDResponses findResponses;
OFList OFfindResponses;
DcmDataset req;
req.putAndInsertOFStringArray(DCM_QueryRetrieveLevel, "STUDY");
//CONSTRUCTION DE LA REQUETE
//Avec les numéro ID des series selectionnées
OFString OFNumeroIDStudy = numeroIDStudy;
req.putAndInsertOFStringArray(DCM_StudyInstanceUID, OFNumeroIDStudy);
T_ASC_PresentationContextID presID = findUncompressedPC(UID_FINDStudyRootQueryRetrieveInformationModel, scu);
presID = findUncompressedPC(UID_FINDStudyRootQueryRetrieveInformationModel, scuN);
if (presID == 0)
{//PROBLEME avec le contexte de présentation
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nIl n'y a pas de contexte de présentation non compressé pour Study Root FIND");
return false;
}
progressDialog.setValue(70);
result = scu.sendFINDRequest(presID, &req, &findResponses);
result = scuN.sendFINDRequest(presID, &req, &OFfindResponses);
if (result.bad())
{//PROBLEME AVEC LE RESULTAT DE LA RECHERCHE, il n'y a pas de serie disponnible
QString add = result.text();
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nIl n'y a pas de series disponnibles: "+add);
return false;
}
else
{ //La connexion est opérationnelle et il y a des series à récupérer
//QMessageBox::information(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nIl y a des series disponnibles");
}
progressDialog.setValue(80);
//Construction et envoi d'une requete C-MOVE, pour tous les examens identifiés au dessus
presID = findUncompressedPC(UID_MOVEStudyRootQueryRetrieveInformationModel, scu);
presID = findUncompressedPC(UID_MOVEStudyRootQueryRetrieveInformationModel, scuN);
if (presID == 0)
{//PROBLEME avec le contexte de présentation
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nIl n'y a pas de contexte de présentation non compressé pour Study Root MOVE");
return false;
}
progressDialog.setValue(90);
//OFListIterator(FINDResponse*) study = findResponses.begin();
OFListIterator(QRResponse*) study = OFfindResponses.begin();
Uint32 studyCount = 1;
OFBool failed = OFFalse;
while (study != OFfindResponses.end() && result.good())
{
// Pour chaque boucle en réponse, soit chaque examen, toutes les images seront récupérées
OFList moveResponses;//MOVEResponses moveResponses;
if ( (*study)->m_dataset != NULL) //Il faut etre certain que ce n'est pas la derniere réponse, elle ne contient pas d'information
{
OFString studyInstanceUID;
result = (*study)->m_dataset->findAndGetOFStringArray(DCM_StudyInstanceUID, studyInstanceUID);
// only try to get study if we actually have study instance uid, otherwise skip it
if (result.good())
{
req.putAndInsertOFStringArray(DCM_StudyInstanceUID, studyInstanceUID);
// fetches all images of this particular study
OFString OFmonAet = monAet;
result = scuN.sendMOVERequest(presID, OFmonAet, &req, &moveResponses);
if (result.good())
{
QMessageBox::information(0,"CONNEXION","YES MA POULE");
studyCount++;
}
else
{
QString add = result.text();
QMessageBox::warning(0,"Recuperation depuis noeud DICOM","A) Problème : Impossible de récupérer l'examen distant : "+add);
return false;
}
}
else
{
QString add = result.text();
QMessageBox::warning(0,"Recuperation depuis noeud DICOM","B) Problème ; impossible de récupérer l'instance ID de l'examen récupéré sur le reseau : "+add);
return false;
}
}
else
{
QMessageBox::warning(0,"Recuperation depuis noeud DICOM","C) Problème : pionteur vers examen récupéré NULL");
return false;
}
study++;
}
if (result.bad())
{
QString add = result.text();
QMessageBox::warning(0,"CONNEXION","TENTATIVE DE CONNEXION :\nJe suis : "+monIpAdress+":"+monPort+" ("+monAet+")\nEt je veux parler à : "+serverIpAdress+":"+serverPort+" ("+serverAet+")\n\nImpossible de récupérer toutes les séries: "+add);
return false;
}
progressDialog.setValue(99);
// Release association
//scu.closeAssociation(DCMSCU_RELEASE_ASSOCIATION);
QMessageBox::warning(0,"Recuperation depuis noeud DICOM","FIN D'UNE RECUPERATION");
progressDialog.setValue(100);
//*/
//Fin de l'importation d'UN examen
}
//Fin de l'importation de tous les examens demandés
return true;
}
My question is simple yet how to retrieve images from PACS (for examens that I ask).
How STORESCP work? Do I need an object of type STORSCP??