原来都是使用dcmtk来读dicom的文件.最近打算将一些dicom rt的信息写到dicom文件里.有些数据是嵌套的序列,就打算使用findOrCreateSequenceItem这个函数往里面写sequence的信息,看了看函数的参数也没什么,就直接往里面写了.原来自己写过一个创建dicom CT图象的代码,就直接往里面加了这几行:
OFCondition result1;
DcmItem *ditem1 =NULL;
result1 = dataset1->findOrCreateSequenceItem(DCM_DoseReferenceSequence, ditem1);
if (result1.good())
{
ditem1->putAndInsertString(DCM_DoseReferenceDescription,"12325252535");
ditem1->putAndInsertString(DCM_DoseReferenceType,"12325252535");
}
写完之后想检验一下.手头有两个工具,一个是easydicom,打开view dicom information,已经能看到写进去的信息了,感觉应该是用对了;另一个是leadtools 的dicom demo,可以用节点树的方式查看dicom的信息,却怎么也找不到写的信息在哪里,连那个module也没有.就感觉很奇怪,肯定是哪里有问题.
上网搜了一下,也没找到相关的信息.以前还写过一个读取dicom的嵌套数据的代码,拿过来读取了一下自己刚刚生成的文件,发现确实是写进去了.可是为什么leadtools却读不出来呢,不太对劲.
在dcmtk里面搜索了一下,找到了一个使用findOrCreateSequenceItem的例句.
result = record->findOrCreateSequenceItem(DCM_IconImageSequence, ditem);
直接加进去,生成一个文件,leadtools打开,立刻就能看到那个modual下面多出了一个节点.看来函数的时候是没有什么问题的.那问题到底出在哪里呢,奇怪了.
是不是在这个语句之前还有什么语句相关呢.干脆采取了逐步排除的办法.把这个语句之前的都屏蔽掉,发现生成的文件里面光剩下这个干巴巴的节点了,moduale都不见了.看来确实是有控制moduale的语句,反过来再逐行增加.当增加到下面一行的时候.leadtools里面出现了那个moduale,和那个节点.
dataset1->putAndInsertString(DCM_SOPClassUID, UID_CTImageStorage);
可是为什么没有我写的 general rt的moduale呢.仔细看了这一行,原来UID_CTImageStorage这个参数好像有点问题,应该是换成UID_RTPlanStorage.然后再试,ok!
原因分析,leadtools是根据SOPClassUID来显示moduale和节点的.tags 的信息和SOPClassUID必须保持一致.我原来的代码是写CT图象的,这次没改,直接加了dicom rt的信息,leadtools还是按照ct 图象来分析的,当然也就不会显示rt plan的节点信息了,尽管已经写进所谓dicom文件了.
阅读(2363) | 评论(0) | 转发(0) |