Mercurial > hg > orthanc-stone
diff Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp @ 2098:4288d635d77e dicom-sr
first rendering of dicom-sr
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 08 Nov 2023 17:23:31 +0100 |
parents | a9e23ef9ee09 |
children | 48a7f05c3bd5 |
line wrap: on
line diff
--- a/Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp Wed Nov 08 16:31:49 2023 +0100 +++ b/Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp Wed Nov 08 17:23:31 2023 +0100 @@ -457,49 +457,64 @@ double pixelSpacingX, double pixelSpacingY) const ORTHANC_OVERRIDE { - size_t frameIndex; - if (!LookupFrame(frameIndex, sopInstanceUid, frameNumber)) - { - return NULL; - } - - const OrthancStone::DicomInstanceParameters& parameters = GetInstanceOfFrame(frameIndex); + std::unique_ptr<OrthancStone::MacroSceneLayer> layer(new OrthancStone::MacroSceneLayer); const double x = originX - pixelSpacingX / 2.0; const double y = originY - pixelSpacingY / 2.0; - const double w = parameters.GetWidth() * pixelSpacingX; - const double h = parameters.GetHeight() * pixelSpacingY; - - std::unique_ptr<OrthancStone::MacroSceneLayer> layer(new OrthancStone::MacroSceneLayer); - - { - std::unique_ptr<OrthancStone::PolylineSceneLayer> polyline(new OrthancStone::PolylineSceneLayer); + + for (size_t i = 0; i < sr_->GetStructuresCount(); i++) + { + const OrthancStone::DicomStructuredReport::Structure& structure = sr_->GetStructure(i); + if (structure.GetSopInstanceUid() == sopInstanceUid && + (!structure.HasFrameNumber() || + structure.GetFrameNumber() == frameNumber)) { - OrthancStone::PolylineSceneLayer::Chain chain; - chain.push_back(OrthancStone::ScenePoint2D(x, y)); - chain.push_back(OrthancStone::ScenePoint2D(x + pixelSpacingX, y)); - chain.push_back(OrthancStone::ScenePoint2D(x + pixelSpacingX, y + pixelSpacingY)); - chain.push_back(OrthancStone::ScenePoint2D(x, y + pixelSpacingY)); - - polyline->AddChain(chain, true, 255, 0, 0); + OrthancStone::Color color(0, 0, 255); + + if (structure.HasProbabilityOfCancer()) + { + if (structure.GetProbabilityOfCancer() > 50.0f) + { + color = OrthancStone::Color(255, 0, 0); + } + else + { + color = OrthancStone::Color(0, 255, 0); + } + } + + switch (structure.GetType()) + { + case OrthancStone::DicomStructuredReport::StructureType_Point: + // TODO + break; + + case OrthancStone::DicomStructuredReport::StructureType_Polyline: + { + const OrthancStone::DicomStructuredReport::Polyline& source = dynamic_cast<const OrthancStone::DicomStructuredReport::Polyline&>(structure); + + if (source.GetSize() > 1) + { + std::unique_ptr<OrthancStone::PolylineSceneLayer> target(new OrthancStone::PolylineSceneLayer); + + OrthancStone::PolylineSceneLayer::Chain chain; + chain.resize(source.GetSize()); + for (size_t i = 0; i < source.GetSize(); i++) + { + chain[i] = OrthancStone::ScenePoint2D(x + source.GetPoint(i).GetX() * pixelSpacingX, + y + source.GetPoint(i).GetY() * pixelSpacingY); + } + + target->AddChain(chain, false, color.GetRed(), color.GetGreen(), color.GetBlue()); + layer->AddLayer(target.release()); + } + break; + } + + default: + break; + } } - - layer->AddLayer(polyline.release()); - } - - { - std::unique_ptr<OrthancStone::PolylineSceneLayer> polyline(new OrthancStone::PolylineSceneLayer); - { - OrthancStone::PolylineSceneLayer::Chain chain; - chain.push_back(OrthancStone::ScenePoint2D(x, y)); - chain.push_back(OrthancStone::ScenePoint2D(x + w, y)); - chain.push_back(OrthancStone::ScenePoint2D(x + w, y + h)); - chain.push_back(OrthancStone::ScenePoint2D(x, y + h)); - - polyline->AddChain(chain, true, 255, 0, 0); - } - - layer->AddLayer(polyline.release()); } return layer.release();