r639: no message
[ctsim.git] / libctsim / ctndicom.cpp
index 36dbeb162e7ad295949b45ef566226ff06bf7065..2209fba2706e40236729782e5dfcaac15a53edad 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: ctndicom.cpp,v 1.7 2001/03/07 16:34:47 kevin Exp $
+**  $Id: ctndicom.cpp,v 1.12 2001/03/13 14:53:44 kevin Exp $
 **
 **  This program is free software; you can redistribute it and/or modify
 **  it under the terms of the GNU General Public License (version 2) as
@@ -37,7 +37,7 @@
 
 
 DicomImporter::DicomImporter (const char* const pszFile)
-  : m_strFilename(pszFile), m_bFail(false), m_iContents(DICOM_CONTENTS_INVALID), 
+  : m_pFile(NULL), m_strFilename(pszFile), m_bFail(false), m_iContents(DICOM_CONTENTS_INVALID), 
   m_pImageFile(NULL), m_pProjections(NULL)
 {
   unsigned long lOptions = DCM_ORDERLITTLEENDIAN;
@@ -154,7 +154,7 @@ DicomImporter::loadImage(unsigned short iNRows, unsigned short iNCols, unsigned
   if (iMaskLength > 8)
     iMaskLength -= 8;
   unsigned int iMask = (1 << iMaskLength) - 1;
-  for (int iy = iNRows - 1; iy >= 0; iy--) {
+  for (int iy = 0; iy < iNRows; iy++) {
     for (int ix = 0; ix < iNCols; ix++) {
       if (iBitsAllocated == 8)  {
         unsigned char cV = pRawPixels[iy * iNRows + ix];
@@ -164,7 +164,7 @@ DicomImporter::loadImage(unsigned short iNRows, unsigned short iNCols, unsigned
         unsigned char cV1 = pRawPixels[lBase];
         unsigned char cV2 = pRawPixels[lBase+1] & iMask;
         int iV = cV1 + (cV2 << 8);
-        v[ix][iy] = iV * dRescaleSlope + dRescaleIntercept;
+        v[ix][iNRows - 1 - iy] = iV * dRescaleSlope + dRescaleIntercept;
       }
     }
   }
@@ -284,13 +284,14 @@ DicomExporter::createDicomObject()
     dWidth = 1E-7;
   double dScale = 65535. / dWidth;
 
-  double dRescaleIntercept = -dMin;
+  double dRescaleIntercept = dMin;
   double dRescaleSlope = 1 / dScale;
   char szRescaleIntercept[17];
   char szRescaleSlope[17];
   snprintf (szRescaleIntercept, sizeof(szRescaleIntercept), "%e", dRescaleIntercept);
   snprintf (szRescaleSlope, sizeof(szRescaleIntercept), "%e", dRescaleSlope);
 
+  char szCTSimRoot[] = "1.2.826.0.1.3680043.2.284.";
   char szModality[] = "CT";
   char szSOPClassUID[65] = "1.2.840.10008.5.4.1.1.2";
   char szImgPhotometricInterp[] = "MONOCHROME2";
@@ -300,17 +301,17 @@ DicomExporter::createDicomObject()
   char szAcqKvp[] = "0";
   char szRelAcquisitionNumber[] = "1";
   char szRelImageNumber[] = "1";
-  char szIDSOPInstanceUID[] = "";
+  char szIDSOPInstanceUID[65] = "";
   char szIDManufacturer[] = "CTSim";
   char szRelPositionRefIndicator[] = "0";
-  char szRelFrameOfReferenceUID[] = "";
+  char szRelFrameOfReferenceUID[65] = "";
   char szRelSeriesNumber[] = "1";
   char szIDAccessionNumber[] = "0";
   char szRelStudyID[] = "1";
   char szIDReferringPhysician[] = "NONE";
   char szIDStudyTime[] = "000000.0";
   char szIDStudyDate[] = "00000000";
-  char szRelStudyInstanceUID[] = "";
+  char szRelStudyInstanceUID[65] = "";
   char szPatSex[] = "O";
   char szPatBirthdate[] = "0000000";
   char szPatID[] = "NONE";
@@ -318,6 +319,15 @@ DicomExporter::createDicomObject()
   char szIDImageType[] = "ORIGINAL";
   char szIDManufacturerModel[65] = "";
 
+  std::ostringstream osPatComments;
+  m_pImageFile->printLabelsBrief (osPatComments);
+  size_t sizePatComments = osPatComments.str().length();
+  char* pszPatComments = new char [sizePatComments+1];
+  strncpy (pszPatComments, osPatComments.str().c_str(), sizePatComments);
+
+  snprintf (szIDSOPInstanceUID, sizeof(szIDSOPInstanceUID), "%s.2.1.6.1", szCTSimRoot);
+  snprintf (szRelStudyInstanceUID, sizeof(szRelStudyInstanceUID), "%s.2.1.6.1.1", szCTSimRoot);
+  snprintf (szRelFrameOfReferenceUID, sizeof(szRelFrameOfReferenceUID), "%s.99", szCTSimRoot);
 #ifdef VERSION
   snprintf (szIDManufacturerModel, sizeof(szIDManufacturerModel), "VERSION %s", VERSION);
 #endif
@@ -374,13 +384,13 @@ DicomExporter::createDicomObject()
     {DCM_IDMODALITY, DCM_CS, "", 1, strlen(szModality), szModality},
     {DCM_IDSOPCLASSUID, DCM_UI, "", 1, strlen(szSOPClassUID), szSOPClassUID},
     {DCM_IDMANUFACTURERMODEL, DCM_LO, "", 1, strlen(szIDManufacturerModel), szIDManufacturerModel},
+    {DCM_PATCOMMENTS, DCM_LT, "", 1, strlen(pszPatComments), pszPatComments},
   };
   int nElemRequired = sizeof (aElemRequired) / sizeof(DCM_ELEMENT);
 
   int iUpdateCount;
   cond = DCM_ModifyElements (&m_pObject, aElemRequired, nElemRequired, NULL, 0, &iUpdateCount);
 
-
   DCM_ELEMENT elemPixelData = {DCM_PXLPIXELDATA, DCM_OT, "", 1, 0, NULL};
 
   unsigned long lRealLength = 2 * m_pImageFile->nx() * m_pImageFile->ny();
@@ -390,10 +400,10 @@ DicomExporter::createDicomObject()
   elemPixelData.d.ot = pRawPixels;
   
   ImageFileArray v = m_pImageFile->getArray();
-  for (int iy = iNRows - 1; iy >= 0; iy--) {
+  for (int iy = 0; iy < iNRows; iy++) {
     for (int ix = 0; ix < iNCols; ix++) {
         unsigned long lBase = (iy * iNRows + ix) * 2;
-        unsigned int iValue = nearest<int>(dScale * (v[ix][iy] - dMin));
+        unsigned int iValue = nearest<int>(dScale * (v[ix][iNRows - 1 - iy] - dMin));
         pRawPixels[lBase] = iValue & 0xFF;
         pRawPixels[lBase+1] = (iValue & 0xFF00) >> 8;
     }
@@ -401,6 +411,8 @@ DicomExporter::createDicomObject()
   cond = DCM_ModifyElements (&m_pObject, &elemPixelData, 1, NULL, 0, &iUpdateCount);
   delete pRawPixels;
 
+  delete pszPatComments;
+
   if (cond != DCM_NORMAL || iUpdateCount != 1) {
     m_bFail = true;
     m_strFailMessage = "Error modifying pixel data";