Skip to content

Conversation

@nagychris
Copy link
Contributor

@nagychris nagychris commented Nov 20, 2025

Context

This change was already there in a previous version:

if (segmentation) {
const segmentKeys = Object.keys(segmentation.segments);
if (segmentKeys.length > 0) {
const firstSegmentIndex = segmentKeys.map((k) => Number(k)).sort()[0];
setActiveSegmentIndex(segmentationId, firstSegmentIndex);
}
}
}

But was removed again in the current main branch (via a1ed218):

if (segmentation) {
const segmentKeys = Object.keys(segmentation.segments);
if (segmentKeys.length > 0) {
firstSegmentIndex = segmentKeys.map((k) => Number(k)).sort()[0];
}
setActiveSegmentIndex(segmentationId, firstSegmentIndex);
}
}

-> this breaks the expected behavior of segmentations, as they now always load with an empty segment with index 1, because activateSegmentIndex is called and this creates the non-existing segment with an empty label ''. We should not do this, and rather expect the application to handle the case of an initially empty segmentation.

If we add an empty segment automatically, it is harder for the application to handle the initial state for empty segmentations -> they might need to always remove this segment if it exists, e.g., if they want to check if no segment exists yet. Otherwise the user might start drawing with a non-existent segment index.

Changes & Results

Before: empty segmentations are loaded with an empty segment with index 1.
After: empty segmentations are empty after loading (contain no segments).

Testing

Checklist

PR

  • My Pull Request title is descriptive, accurate and follows the
    semantic-release format and guidelines.

Code

  • My code has been well-documented (function documentation, inline comments,
    etc.)

Public Documentation Updates

  • The documentation page has been updated as necessary for any public API
    additions or removals.

Tested Environment

  • "OS: ubuntu 24
  • "Node version: v22.7.0
  • "Browser: Brave / Chromium (latest)

@sedghi sedghi requested a review from jbocce November 20, 2025 14:39
const segmentKeys = Object.keys(segmentation.segments);
if (segmentKeys.length > 0) {
firstSegmentIndex = segmentKeys.map((k) => Number(k)).sort()[0];
setActiveSegmentIndex(segmentationId, firstSegmentIndex);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately this change will break this example and likely others. I used this PR branch, ran the example and it throws an exception when clicking to add a contour because no segment is added. I think the existing behaviour is desired and relied upon in many scenarios. @sedghi thoughts?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @nagychris, can you tell me more about the problem you're running into, without getting too deep into the code details? For example, are you loading a labelmap, and then seeing something unexpected happen?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @sedghi, the issue is that my application expects the initial state of a segmentation to have no segments, because the user should first select which type of segment they want to create before they can draw. So the issue is related to how the workflow works in my application.

The current workaround I see is to remove this empty segment as soon as the segmentation is loaded, but it's quite hacky, so I wondered if we can remove this again.

But if you say that this empty / default segment is required for other cornerstone3D features, then we can also keep it. Just wanted to raise this topic, as it might also be an issue for other applications using cornerstone3D.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the issue with your currrent proposal is that sometimes (specifically in RTSS) we skip segments, so the first one becomes segment 2 for instance

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants