PACS connection

All other questions regarding DCMTK

Moderator: Moderator Team

Locked
Message
Author
Mitmal
Posts: 112
Joined: Mon, 2011-04-18, 19:36
Location: France

PACS connection

#1 Post by Mitmal »

Hello everybody,
I trying to connect my new application to PACS Network.
I found this code :

Code: Select all

connection(QString qipAdress, QString qport, QString qaet)
{

T_ASC_Network *net; // network struct, contains DICOM upper layer FSM etc.
//ASC_initializeNetwork(NET_REQUESTOR, 0, 1000 /* timeout */, &net);
ASC_initializeNetwork(NET_REQUESTOR, 104, 1000, &net);

T_ASC_Parameters *params; // parameters of association request
ASC_createAssociationParameters(&params, ASC_DEFAULTMAXPDU);

// set calling and called AE titles
ASC_setAPTitles(params, "ECHOSCU", "ANY-SCP", NULL);

// the DICOM server accepts connections at server.nowhere.com port 104
QString XXX = "server.nowhere.com:"+qport;
ASC_setPresentationAddresses(params, qipAdress, XXX);

// list of transfer syntaxes, only a single entry here
const char* ts[] = { UID_LittleEndianImplicitTransferSyntax };

// add presentation context to association request
ASC_addPresentationContext(params, 1, UID_VerificationSOPClass, ts, 1);

// request DICOM association
T_ASC_Association *assoc;
if (ASC_requestAssociation(net, params, &assoc).good())
{
	QMessageBox::information(0,"","Parametre ok");
	if (ASC_countAcceptedPresentationContexts(params) == 1)
		{
			QMessageBox::information(0,"","Connexion ok");
			// the remote SCP has accepted the Verification Service Class
			DIC_US id = assoc->nextMsgID++; // generate next message ID
			DIC_US status; // DIMSE status of C-ECHO-RSP will be stored here
			DcmDataset *sd = NULL; // status detail will be stored here
			// send C-ECHO-RQ and handle response
			DIMSE_echoUser(assoc, id, DIMSE_BLOCKING, 0, &status, &sd);
			delete sd; // we don't care about status detail
		}
}
ASC_releaseAssociation(assoc); // release association
ASC_destroyAssociation(&assoc); // delete assoc structure
ASC_dropNetwork(&net); // delete net structure
return 0;
}
But I do not understand it.
What is "server.nowhere.com" ???

I suppose that I need to give who I am and where I want to be connected. So, in my example, "server.nowhere.com" could be qipAdress and qipAdress could be my ip adress ? Isn't it ?

--------
And (AFTER), with this code, how I can ask some question to the server and download some Dicom pictures ??
Respectueusement,
MitMal

Michael Onken
DCMTK Developer
Posts: 2048
Joined: Fri, 2004-11-05, 13:47
Location: Oldenburg, Germany
Contact:

#2 Post by Michael Onken »

Hi,
I suppose that I need to give who I am and where I want to be connected. So, in my example, "server.nowhere.com" could be qipAdress and qipAdress could be my ip adress ? Isn't it ?
XXX is the server you want to connect to. qipAdress is your own adress.

This is the original example in the online documentation.

Also, instead, you might use the DcmSCU class which is more object-oriented. An example can be found in our support wiki.

Best regards,
Michael

Mitmal
Posts: 112
Joined: Mon, 2011-04-18, 19:36
Location: France

#3 Post by Mitmal »

Thanks Michael,

But I don't understand :
With : ASC_setPresentationAddresses(params, "120.40.30.99:104", qipAdress+":"+qport); the connection is failded.

And with : ASC_setPresentationAddresses(params, qipAdress+":"+qport, "120.40.30.99:104"); the connection is done.

(I mine when it is done, I can read the ok message)

I will test now with your second option, the class DcmSCU, and I go back to keep you inform

***************
As for me, if I switch the two parameter, my ip address, and the server, the connection is done even if the network is broken. So maybe something listen on my computer, sorry...
Last edited by Mitmal on Mon, 2011-11-07, 12:25, edited 1 time in total.
Respectueusement,
MitMal

Mitmal
Posts: 112
Joined: Mon, 2011-04-18, 19:36
Location: France

#4 Post by Mitmal »

And just before, can you explain to me what this line mines:
ASC_initializeNetwork(NET_REQUESTOR, 0, 1000 /* timeout */, &net);

0 is it my port or the server port ?
Respectueusement,
MitMal

Michael Onken
DCMTK Developer
Posts: 2048
Joined: Fri, 2004-11-05, 13:47
Location: Oldenburg, Germany
Contact:

#5 Post by Michael Onken »

Looking into the header file:

Code: Select all

/** network instance creation function (constructor)
 *  @param role association acceptor, requestor or both
 *  @param acceptorPort acceptor port for incoming connections.
 *    For association requestors, zero should be passed here.
 *  @param timeout timeout for network operations, in seconds
 *  @param network T_ASC_Network will be allocated and returned in this parameter
 *  @param options network options. Only DUL_FULLDOMAINNAME is currently defined
 *    as a possible option.
 *  @return EC_Normal if successful, an error code otherwise
 */
OFCondition ASC_initializeNetwork(
    T_ASC_NetworkRole role,
    int acceptorPort,
    int timeout,
    T_ASC_Network ** network,
    unsigned long options = 0);

Mitmal
Posts: 112
Joined: Mon, 2011-04-18, 19:36
Location: France

#6 Post by Mitmal »

Of course, thank you, know I will look every time in the header ;-)
Respectueusement,
MitMal

Mitmal
Posts: 112
Joined: Mon, 2011-04-18, 19:36
Location: France

#7 Post by Mitmal »

I trying to use the DcmSCU example, but I don't understand this part :

Code: Select all

int MedicTool2::connectionPacs(QString serverIpAdress, QString serverPort, QString serverAet, QString myIpAdress, QString myPort, QString myAet)
{
	QProgressDialog progressDialog ("Connecting\nPlease wait...",QString(),0,100);
	progressDialog.setWindowModality(Qt::WindowModal);
	progressDialog.show();

	/* Setup DICOM connection parameters */
	OFLog::configure(OFLogger::DEBUG_LOG_LEVEL);
	DcmTestSCU scu;
progressDialog.setValue(10);

	// set AE titles
	OFString ipAdresse = serverIpAdress;
	Uint16 port = serverPort.toUInt();
	OFString aet = serverAet;

	scu.setAETitle("TEST-SCU" );
	scu.setPeerHostName(ipAdresse);
	scu.setPeerPort(port);
	scu.setPeerAETitle(aet);
In setAETitle, setPeerHostName, setPeerPort, setPeerAETitle what kind of information I need to give ?


**********************
After looking in the header file , I saw:

Code: Select all

/** Set SCU's AETitle to be used in association negotiation
   *  @param myAETtitle [in] The SCU's AETitle to be used
   */
  void setAETitle(const OFString &myAETtitle);

  /** Set SCP's host (hostname or IP address) to talk to in association negotiation
   *  @param peerHostName [in] The SCP's hostname or IP address to be used
   */
  void setPeerHostName(const OFString &peerHostName);

  /** Set SCP's AETitle to talk to in association negotiation
   *  @param peerAETitle [in] The SCP's AETitle to be used
   */
  void setPeerAETitle(const OFString &peerAETitle);
So I add this lines :

Code: Select all

// set AE titles
	OFString OFmyAet = myAet;
	OFString OFipAdresse = serverIpAdress;
	Uint16 OFport = serverPort.toUInt();
	OFString OFaet = serverAet;

	scu.setAETitle(OFmyAet);
	scu.setPeerHostName(OFipAdresse);
	scu.setPeerPort(OFport);
	scu.setPeerAETitle(OFaet);
But the process failed, I can read the display 40 but after it's write "Unable to negotiate association: " :

Code: Select all

	/* Initialize network */ 
	OFCondition result = scu.initNetwork(); 
	if (result.bad()) 
	{ 
		QMessageBox::information(0,"","Unable to set up the network: ");
		return 1; 
	}
progressDialog.setValue(40);
 
	/* Negotiate Association */ 
	result = scu.negotiateAssociation(); 
	if (result.bad()) 
	{
		QMessageBox::information(0,"","Unable to negotiate association: "); 
		return 1; 
	}
progressDialog.setValue(50);
I will search how to add the result.text() but maybe have you some ideas ?
Respectueusement,
MitMal

Mitmal
Posts: 112
Joined: Mon, 2011-04-18, 19:36
Location: France

#8 Post by Mitmal »

The message is :
Unable to negociate association: DUL Association Rejected
Can you explain me what is it ?


***********************
Ok, it was my fault (logically), i was make a fault in my AETitle...lol
Respectueusement,
MitMal

Mitmal
Posts: 112
Joined: Mon, 2011-04-18, 19:36
Location: France

#9 Post by Mitmal »

Great, now I can run a ECHO test on my connection to the PACS.
Now I need to search (name, first name, number, date ...) and after download the images on my hard drive.

Do you know how to do this?
Respectueusement,
MitMal

Mitmal
Posts: 112
Joined: Mon, 2011-04-18, 19:36
Location: France

#10 Post by Mitmal »

For those who are interested, my function ECHO is :

Code: Select all

/***
Connexion et tentative de requete ECHO vers le noeud DICOM spécifié
 -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
*/
bool MedicTool2::echoDicomNode(QString serverIpAdress, QString serverPort, QString serverAet, QString monIpAdress, QString monPort, QString monAet)
{
	QProgressDialog progressDialog ("Connexion ECHO en cours\nVeuillez patienter...",QString(),0,60);
	progressDialog.setWindowModality(Qt::WindowModal);
	progressDialog.show();

	//Mise en place des parametre pour établire la connexion DICOM
	OFLog::configure(OFLogger::DEBUG_LOG_LEVEL);
	DcmTestSCU scu;
progressDialog.setValue(10);

	//Mise en place des parametres AET
	OFString OFmonAet = monAet;				scu.setAETitle(OFmonAet);
	OFString OFipAdresse = serverIpAdress;	scu.setPeerHostName(OFipAdresse);
	Uint16 OFport = serverPort.toUInt();	scu.setPeerPort(OFport);
	OFString OFaet = serverAet;				scu.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<OFString> 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);
progressDialog.setValue(30);
 
	//Initialisation du reseau
	OFCondition result = scu.initNetwork(); 
	if (result.bad()) 
	{//PROBLEME DE CONNEXION
		QString add = result.text();
		QMessageBox::information(0,"Test ECHO","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(); 
	if (result.bad()) 
	{//PROBLEME D'IDENTIFICATION
		QString add = result.text();
		QMessageBox::information(0,"Test ECHO","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); 
	if (result.bad()) 
	{//PROBLEME, LE SERVER NE REPOND PAS
		QString add = result.text();
		QMessageBox::information(0,"Test ECHO","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;
	}
	else return true;
progressDialog.setValue(60);
	return false;
}
I am looking how to add a specific request now, may it be here, right?

Code: Select all

//Construction et envoi d'une requete C-FIND, pour trouver les examens
	FINDResponses findResponses; 
	DcmDataset req; 
	req.putAndInsertOFStringArray(DCM_QueryRetrieveLevel, "STUDY");
	req.putAndInsertOFStringArray(DCM_StudyInstanceUID, "DUMONT^NICOLAS"); 
	T_ASC_PresentationContextID presID = findUncompressedPC(UID_FINDStudyRootQueryRetrieveInformationModel, scu);
	if (presID == 0) 
	{//PROBLEME avec le contexte de présentation
		QMessageBox::information(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 1; 
	}
But that does not work ... I am looking for, if you have ideas :wink:
Respectueusement,
MitMal

Mitmal
Posts: 112
Joined: Mon, 2011-04-18, 19:36
Location: France

#11 Post by Mitmal »

Problem, I have FINDResponses but I do not have MOVEResponses...do you know why ???? :cry:
Respectueusement,
MitMal

Mitmal
Posts: 112
Joined: Mon, 2011-04-18, 19:36
Location: France

#12 Post by Mitmal »

I tested with:

Code: Select all

req.putAndInsertOFStringArray(DCM_QueryRetrieveLevel, "STUDY");
req.putAndInsertOFStringArray(DCM_StudyInstanceUID, "");
	
req.putAndInsertOFStringArray(DCM_PatientName, "DUMONT");
req.putAndInsertOFStringArray(DCM_Modality, "CT");
req.putAndInsertOFStringArray(DCM_PatientID,"001578802");
But that does not seem correct. The results are not correct in with my PACS data (when I use an other viewer)

Can you tell me if this is the right approach?
I want to search according to some criteria:
- Patient's name
- The patient's first name (or name and surname together)
- modality
- Earlier
- Date posterior
- And also the type of sequence can be (but it may be difficult)


************************
Here is my code now:

Code: Select all

//Construction et envoi d'une requete C-FIND, pour trouver les examens
	FINDResponses findResponses;
	DcmDataset req;
	req.putAndInsertOFStringArray(DCM_QueryRetrieveLevel, "SERIES");
	//req.putAndInsertOFStringArray(DCM_StudyInstanceUID, "");
	
	QString nom = "RADERANIRINA Sendrison";
	nom.replace(" ","^");
	OFString OFNom = nom;
	req.putAndInsertOFStringArray(DCM_PatientName, OFNom);
	//req.putAndInsertOFStringArray(DCM_Modality, "CT");
	//req.putAndInsertOFStringArray(DCM_PatientID,"001578802");
The search takes me back out the number 10, which corresponds to the number of series to my patients the on PACS.
Only now I wish I could find the patient starting with a beginning, or have a string in their name.
A little like in SQL, when I try using% xxx%

Do you know how to do this?
Respectueusement,
MitMal

Michael Onken
DCMTK Developer
Posts: 2048
Joined: Fri, 2004-11-05, 13:47
Location: Oldenburg, Germany
Contact:

#13 Post by Michael Onken »

Hi,
Problem, I have FINDResponses but I do not have MOVEResponses...do you know why ????
Maybe you have a version installed that is not depending on the latest snapshots? See also note at the end of the DcmSCU example on the wiki.
Can you tell me if this is the right approach?
Query/Retrieve requests need to follow specific rules, laid down in part 4 of the DICOM standard. I explained the most basic ones several times in the forum; please try to understand by reading the standard and searching the forum.

Best regards,
Michael

P.S: Sorry to interrupt your thread :-)

Mitmal
Posts: 112
Joined: Mon, 2011-04-18, 19:36
Location: France

#14 Post by Mitmal »

hum hum thank you Michael but it does not help me ^ ^
But that's OK, here is my code with which I can get my info:

Code: Select all

req.putAndInsertOFStringArray(DCM_QueryRetrieveLevel, "STUDY");
	//req.putAndInsertOFStringArray(DCM_QueryRetrieveLevel, "SERIES");
	
	//CONSTRUCTION DE LA REQUETE
	//AVEC LES CHAMPS DU FILTRE
	QString nom = MedicUi.m_lineEditName->text()+"*"; nom.replace(" ","^"); OFString OFNom = nom; req.putAndInsertOFStringArray(DCM_PatientName, OFNom);
	QString d1 =  MedicUi.m_lineEditExamD1->text();
	QString d2 =  MedicUi.m_lineEditExamD1->text();

	//CHAMPS INDISPENSEMBLE
	req.putAndInsertOFStringArray(DCM_Modality, "MR");
	//req.putAndInsertOFStringArray(DCM_SeriesDescription, "PERFUSION");

	//INFORMATIONS NECESSAIRE POUR IDENTIFIER L'EXAMEN
	DcmElement *dcmelementStudyDate = new DcmAttributeTag(DCM_StudyDate); req.insert(dcmelementStudyDate);
	DcmElement *dcmelementPatientName = new DcmAttributeTag(DCM_PatientName); req.insert(dcmelementPatientName);
	DcmElement *dcmelementModality = new DcmAttributeTag(DCM_Modality); req.insert(dcmelementModality);
	DcmElement *dcmelementNaissancePatient = new DcmAttributeTag(DCM_PatientBirthDate); req.insert(dcmelementNaissancePatient);
	DcmElement *dcmelementIDPatient = new DcmAttributeTag(DCM_PatientID); req.insert(dcmelementIDPatient);
	DcmElement *dcmelementStudyDescription = new DcmAttributeTag(DCM_StudyDescription); req.insert(dcmelementStudyDescription);
	DcmElement *dcmelementCommentairePatient = new DcmAttributeTag(DCM_PatientComments); req.insert(dcmelementCommentairePatient);
	DcmElement *dcmelementSexePatient = new DcmAttributeTag(DCM_PatientSex); req.insert(dcmelementSexePatient);
	DcmElement *dcmelementStudyId = new DcmAttributeTag(DCM_StudyID); req.insert(dcmelementStudyId);

	T_ASC_PresentationContextID presID = findUncompressedPC(UID_FINDStudyRootQueryRetrieveInformationModel, scu);
	if (presID == 0)
	{//PROBLEME avec le contexte de présentation
		QMessageBox::information(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 res;
	}
progressDialog.setValue(70);

	result = scu.sendFINDRequest(presID, &req, &findResponses);
	if (result.bad())
	{//PROBLEME AVEC LE RESULTAT DE LA RECHERCHE, il n'y a pas de serie disponnible
		QString add = result.text();
		QMessageBox::information(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 res;
	}
	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);
	if (presID == 0)
	{//PROBLEME avec le contexte de présentation
		QMessageBox::information(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 res;
	}
progressDialog.setValue(90);

	OFListIterator(FINDResponse*) study = findResponses.begin();
	Uint32 studyCount = 1;
	OFBool failed = OFFalse;
	int nbr = 0;
	while (study != findResponses.end() && result.good())
	{
		
		//Chaque boucle exécuté récupère toutes l'image
		//MOVEResponses moveResponses;

		//Etre sûr que ce n'est pas la dernière réponse, car elle n'a pas de données
		if ( (*study)->m_dataset != NULL)
		{
			OFString studyInstanceUID;
			result = (*study)->m_dataset->findAndGetOFStringArray(DCM_StudyInstanceUID, studyInstanceUID);
			//On essaye seulement de récupérer la série si il y a effectivement un ID d'instance de série, sinon on l'ignore
			if (result.good())
			{
				//req.putAndInsertOFStringArray(DCM_StudyInstanceUID, studyInstanceUID);
				// On récupère toutes les images de cette série particulière
				QString val = "";
				OFString OFStrin; 
				(*study)->m_dataset->findAndGetOFString(DCM_StudyDate, OFStrin); val = val +"Date examen: "+OFStrin.c_str()+""+Outils::separateur;
				(*study)->m_dataset->findAndGetOFString(DCM_PatientName, OFStrin); val = val +"Nom patient: "+OFStrin.c_str()+""+Outils::separateur;
				(*study)->m_dataset->findAndGetOFString(DCM_Modality, OFStrin); val = val +"Modalité: "+OFStrin.c_str()+"\n";
				(*study)->m_dataset->findAndGetOFString(DCM_PatientBirthDate, OFStrin); val = val +"Date de Naissance patient: "+OFStrin.c_str()+"\n";
				(*study)->m_dataset->findAndGetOFString(DCM_PatientID, OFStrin); val = val +"ID patient: "+OFStrin.c_str()+"\n";
				(*study)->m_dataset->findAndGetOFString(DCM_StudyDescription, OFStrin); val = val +"Description Examen: "+OFStrin.c_str()+"\n";
				(*study)->m_dataset->findAndGetOFString(DCM_PatientComments, OFStrin); val = val +"Commentaire patient: "+OFStrin.c_str()+"\n";
				(*study)->m_dataset->findAndGetOFString(DCM_PatientSex, OFStrin); val = val +"Sexe: "+OFStrin.c_str()+"\n";
				(*study)->m_dataset->findAndGetOFString(DCM_StudyID, OFStrin); val = val +"ID examen: "+OFStrin.c_str()+"\n";
				res = res + val;
				QMessageBox::information(0,"RESULTAT",val);

				/*result = scu.sendMOVERequest(presID, "MOVESCP", &req, &moveResponses);
				if (result.good())
				{
					QMessageBox::information(0,"","Received study #");
					studyCount++;
				}*/

				nbr++;
				if (nbr>1000) break;
			}
		} 
		study++; 
	}
	//QString val = ""; val.sprintf("%d",nbr); QMessageBox::information(0,"CONNEXION","Il y a "+val+" réponse");

	if (result.bad()) 
I must specify in the request what attributes I want it back.
(As QSL, after the SELECT, I must say what I want fields to return)

-------------

For MOVEResponses I saw the comment at the bottom of the wiki, only it does not explain (or I do not understand) what to do
Respectueusement,
MitMal

Michael Onken
DCMTK Developer
Posts: 2048
Joined: Fri, 2004-11-05, 13:47
Location: Oldenburg, Germany
Contact:

#15 Post by Michael Onken »

For the MOVEResponse: If it is not part of your DCMTK installation, then you need to get a newer version, e.g. the latest snapshot.

Michael

Locked

Who is online

Users browsing this forum: Bing [Bot] and 1 guest