bool InstanceInformationAdapter::Create(std::string& content,
                                          const std::string& instanceId)
  {
    std::string message = "Creating spatial information for instance: " + instanceId;
    OrthancPluginLogInfo(context_, message.c_str());

    std::string uri = "/instances/" + instanceId;

    Json::Value instance, tags;
    if (!GetJsonFromOrthanc(instance, context_, uri) ||
        !GetJsonFromOrthanc(tags, context_, uri + "/tags?simplify") ||
        instance.type() != Json::objectValue ||
        tags.type() != Json::objectValue)
    {
      return false;
    }

    InstanceInformation info;

    if (tags.isMember(IMAGE_ORIENTATION_PATIENT) &&
        tags.isMember(IMAGE_POSITION_PATIENT) &&
        tags[IMAGE_ORIENTATION_PATIENT].type() == Json::stringValue &&
        tags[IMAGE_POSITION_PATIENT].type() == Json::stringValue)
    {
      std::vector<float> cosines, position;
      if (TokenizeVector(cosines, tags[IMAGE_ORIENTATION_PATIENT].asString(), 6) &&
          TokenizeVector(position, tags[IMAGE_POSITION_PATIENT].asString(), 3))
      {
        std::vector<float> normal(3);
        normal[0] = cosines[1] * cosines[5] - cosines[2] * cosines[4];
        normal[1] = cosines[2] * cosines[3] - cosines[0] * cosines[5];
        normal[2] = cosines[0] * cosines[4] - cosines[1] * cosines[3];

        info.SetPosition(normal, position);
      }
    }

    if (instance.isMember(INDEX_IN_SERIES) &&
        instance[INDEX_IN_SERIES].type() == Json::intValue)
    {
      info.SetIndexInSeries(instance[INDEX_IN_SERIES].asInt());
    }

    info.Serialize(content);
    return true;
  }
Пример #2
0
    Instance(ServerIndex& index,
             const std::string& instanceId) :
      instanceId_(instanceId),
      framesCount_(1)
    {
      DicomMap instance;
      if (!index.GetMainDicomTags(instance, instanceId, ResourceType_Instance, ResourceType_Instance))
      {
        throw OrthancException(ErrorCode_UnknownResource);
      }

      const DicomValue* frames = instance.TestAndGetValue(DICOM_TAG_NUMBER_OF_FRAMES);
      if (frames != NULL &&
          !frames->IsNull() &&
          !frames->IsBinary())
      {
        try
        {
          framesCount_ = boost::lexical_cast<unsigned int>(frames->GetContent());
        }
        catch (boost::bad_lexical_cast&)
        {
        }
      }
      
      std::vector<float> tmp;
      hasPosition_ = TokenizeVector(tmp, instance, DICOM_TAG_IMAGE_POSITION_PATIENT, 3);

      if (hasPosition_)
      {
        position_[0] = tmp[0];
        position_[1] = tmp[1];
        position_[2] = tmp[2];
      }

      std::string s;
      hasIndexInSeries_ = false;

      try
      {
        if (index.LookupMetadata(s, instanceId, MetadataType_Instance_IndexInSeries))
        {
          indexInSeries_ = boost::lexical_cast<size_t>(s);
          hasIndexInSeries_ = true;
        }
      }
      catch (boost::bad_lexical_cast&)
      {
      }
    }
Пример #3
0
  static bool TokenizeVector(std::vector<float>& result,
                             const DicomMap& map,
                             const DicomTag& tag,
                             unsigned int expectedSize)
  {
    const DicomValue* value = map.TestAndGetValue(tag);

    if (value == NULL ||
        value->IsNull() ||
        value->IsBinary())
    {
      return false;
    }
    else
    {
      return TokenizeVector(result, value->GetContent(), expectedSize);
    }
  }
Пример #4
0
  void SliceOrdering::ComputeNormal()
  {
    DicomMap series;
    if (!index_.GetMainDicomTags(series, seriesId_, ResourceType_Series, ResourceType_Series))
    {
      throw OrthancException(ErrorCode_UnknownResource);
    }

    std::vector<float> cosines;
    hasNormal_ = TokenizeVector(cosines, series, DICOM_TAG_IMAGE_ORIENTATION_PATIENT, 6);

    if (hasNormal_)
    {
      normal_[0] = cosines[1] * cosines[5] - cosines[2] * cosines[4];
      normal_[1] = cosines[2] * cosines[3] - cosines[0] * cosines[5];
      normal_[2] = cosines[0] * cosines[4] - cosines[1] * cosines[3];
    }
  }