Mercurial > hg > orthanc
comparison OrthancServer/RadiotherapyRestApi.cpp @ 538:505d6deb9947 dicom-rt
access contours by instances
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 03 Sep 2013 17:45:26 +0200 |
parents | da8e064d0d49 |
children | c8347eef225b |
comparison
equal
deleted
inserted
replaced
535:da8e064d0d49 | 538:505d6deb9947 |
---|---|
387 { | 387 { |
388 if (contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) && | 388 if (contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) && |
389 contour[i].isMember(CONTOUR_GEOMETRIC_TYPE) && | 389 contour[i].isMember(CONTOUR_GEOMETRIC_TYPE) && |
390 contour[i].isMember(NUMBER_OF_CONTOUR_POINTS) && | 390 contour[i].isMember(NUMBER_OF_CONTOUR_POINTS) && |
391 contour[i].isMember(CONTOUR_DATA) && | 391 contour[i].isMember(CONTOUR_DATA) && |
392 contour[i].isMember(CONTOUR_SLAB_THICKNESS) && | |
393 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 && | 392 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 && |
394 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID) && | 393 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID) && |
395 contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "CLOSED_PLANAR") | 394 contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "CLOSED_PLANAR") |
396 { | 395 { |
397 result.append(i); | 396 result.append(i); |
463 } | 462 } |
464 } | 463 } |
465 } | 464 } |
466 | 465 |
467 | 466 |
468 static void GetRtStructuresClosedPlanarInstance(RestApi::GetCall& call) | 467 static void GetRtStructuresInstanceOfClosedPlanar(RestApi::GetCall& call) |
469 { | 468 { |
470 RETRIEVE_CONTEXT(call); | 469 RETRIEVE_CONTEXT(call); |
471 | 470 |
472 Json::Value roi, contour; | 471 Json::Value roi, contour; |
473 std::string instanceId; | 472 std::string instanceId; |
496 } | 495 } |
497 } | 496 } |
498 } | 497 } |
499 | 498 |
500 | 499 |
500 static void GetRtStructuresListOfInstances(RestApi::GetCall& call) | |
501 { | |
502 RETRIEVE_CONTEXT(call); | |
503 | |
504 Json::Value roi, contour; | |
505 std::string instanceId; | |
506 | |
507 if (GetRtStructuresRoi(roi, contour, instanceId, context, | |
508 call.GetUriComponent("id", ""), | |
509 call.GetUriComponent("roi", ""))) | |
510 { | |
511 Json::Value result = Json::arrayValue; | |
512 | |
513 for (Json::Value::ArrayIndex i = 0; i < contour.size(); i++) | |
514 { | |
515 if (contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) && | |
516 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 && | |
517 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID)) | |
518 { | |
519 std::string uid = contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0][REFERENCED_SOP_INSTANCE_UID]["Value"].asString(); | |
520 | |
521 std::list<std::string> instance; | |
522 context.GetIndex().LookupTagValue(instance, DICOM_TAG_SOP_INSTANCE_UID, uid); | |
523 | |
524 if (instance.size() == 1) | |
525 { | |
526 result.append(instance.front()); | |
527 } | |
528 } | |
529 } | |
530 | |
531 call.GetOutput().AnswerJson(result); | |
532 } | |
533 } | |
534 | |
535 | |
536 | |
537 static void GetRtStructuresClosedPlanarsOfInstance(RestApi::GetCall& call) | |
538 { | |
539 RETRIEVE_CONTEXT(call); | |
540 | |
541 Json::Value roi, contour, instance; | |
542 std::string instanceId; | |
543 | |
544 if (context.GetIndex().LookupResource(instance, call.GetUriComponent("instance", ""), ResourceType_Instance) && | |
545 GetRtStructuresRoi(roi, contour, instanceId, context, | |
546 call.GetUriComponent("id", ""), | |
547 call.GetUriComponent("roi", ""))) | |
548 { | |
549 boost::mutex::scoped_lock lock(context.GetDicomFileMutex()); | |
550 ParsedDicomFile& dicom = context.GetDicomFile(instanceId); | |
551 | |
552 Json::Value result = Json::arrayValue; | |
553 | |
554 for (Json::Value::ArrayIndex i = 0; i < contour.size(); i++) | |
555 { | |
556 if (contour[i].isMember(CONTOUR_DATA) && | |
557 contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) && | |
558 contour[i].isMember(NUMBER_OF_CONTOUR_POINTS) && | |
559 contour[i].isMember(CONTOUR_GEOMETRIC_TYPE) && | |
560 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 && | |
561 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID) && | |
562 contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "CLOSED_PLANAR") | |
563 { | |
564 std::string uid = contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0][REFERENCED_SOP_INSTANCE_UID]["Value"].asString(); | |
565 | |
566 if (uid == instance["MainDicomTags"]["SOPInstanceUID"].asString()) | |
567 { | |
568 ParsedDicomFile::SequencePath path; | |
569 path.push_back(std::make_pair(DicomTag(0x3006, 0x0039 /* ROIContourSequence */), roi["InternalIndex"].asInt())); | |
570 path.push_back(std::make_pair(DicomTag(0x3006, 0x0040 /* ContourSequence */), i)); | |
571 | |
572 Json::Value points; | |
573 std::string contourData; | |
574 std::string numberOfPoints; | |
575 | |
576 if (dicom.GetTagValue(contourData, path, DicomTag(0x3006, 0x0050 /* ContourData */)) && | |
577 dicom.GetTagValue(numberOfPoints, path, DicomTag(0x3006, 0x0046 /* NumberOfContourPoints */)) && | |
578 ContourToPoints(points, contourData) && | |
579 points.size() == boost::lexical_cast<unsigned int>(numberOfPoints)) | |
580 { | |
581 result.append(points); | |
582 } | |
583 } | |
584 } | |
585 } | |
586 | |
587 call.GetOutput().AnswerJson(result); | |
588 } | |
589 } | |
590 | |
591 | |
592 | |
593 static void GetRtStructuresPointsOfInstance(RestApi::GetCall& call) | |
594 { | |
595 RETRIEVE_CONTEXT(call); | |
596 | |
597 Json::Value roi, contour, instance; | |
598 std::string instanceId; | |
599 | |
600 if (context.GetIndex().LookupResource(instance, call.GetUriComponent("instance", ""), ResourceType_Instance) && | |
601 GetRtStructuresRoi(roi, contour, instanceId, context, | |
602 call.GetUriComponent("id", ""), | |
603 call.GetUriComponent("roi", ""))) | |
604 { | |
605 Json::Value result = Json::arrayValue; | |
606 | |
607 for (Json::Value::ArrayIndex i = 0; i < contour.size(); i++) | |
608 { | |
609 if (contour[i].isMember(CONTOUR_DATA) && | |
610 contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) && | |
611 contour[i].isMember(CONTOUR_GEOMETRIC_TYPE) && | |
612 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 && | |
613 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID) && | |
614 contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "POINT") | |
615 { | |
616 std::string uid = contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0][REFERENCED_SOP_INSTANCE_UID]["Value"].asString(); | |
617 | |
618 if (uid == instance["MainDicomTags"]["SOPInstanceUID"].asString()) | |
619 { | |
620 Json::Value p; | |
621 if (ContourToPoints(p, contour[i][CONTOUR_DATA]["Value"].asString()) && | |
622 p.size() == 1) | |
623 { | |
624 result.append(p[0]); | |
625 } | |
626 } | |
627 } | |
628 } | |
629 | |
630 call.GetOutput().AnswerJson(result); | |
631 } | |
632 } | |
633 | |
634 | |
635 | |
636 | |
501 RadiotherapyRestApi::RadiotherapyRestApi(ServerContext& context) : OrthancRestApi(context) | 637 RadiotherapyRestApi::RadiotherapyRestApi(ServerContext& context) : OrthancRestApi(context) |
502 { | 638 { |
503 Register("/series/{id}/rt-structures", GetRtStructuresInfo); | 639 Register("/series/{id}/rt-structures", GetRtStructuresInfo); |
504 Register("/series/{id}/rt-structures/roi", GetRtStructuresListOfROIs); | 640 Register("/series/{id}/rt-structures/roi", GetRtStructuresListOfROIs); |
505 Register("/series/{id}/rt-structures/roi/{roi}/info", GetRtStructuresROI); | 641 Register("/series/{id}/rt-structures/roi/{roi}/info", GetRtStructuresROI); |
506 Register("/series/{id}/rt-structures/roi/{roi}/points", GetRtStructuresROIPoints); | 642 Register("/series/{id}/rt-structures/roi/{roi}/points", GetRtStructuresROIPoints); |
507 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar", GetRtStructuresListOfClosedPlanars); | 643 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar", GetRtStructuresListOfClosedPlanars); |
508 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/points", GetRtStructuresSingleClosedPlanar); | 644 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/vertices", GetRtStructuresSingleClosedPlanar); |
509 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/thickness", GetRtStructuresClosedPlanarThickness); | 645 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/thickness", GetRtStructuresClosedPlanarThickness); |
510 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/instance", GetRtStructuresClosedPlanarInstance); | 646 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/instance", GetRtStructuresInstanceOfClosedPlanar); |
647 Register("/series/{id}/rt-structures/roi/{roi}/instances", GetRtStructuresListOfInstances); | |
648 Register("/series/{id}/rt-structures/roi/{roi}/instances/{instance}/closed-planar", GetRtStructuresClosedPlanarsOfInstance); | |
649 Register("/series/{id}/rt-structures/roi/{roi}/instances/{instance}/points", GetRtStructuresPointsOfInstance); | |
511 } | 650 } |
512 | 651 |
513 } | 652 } |
514 | 653 |
515 | 654 |