weasis窗位调节源码分析

EventManager

setAction(getMoveTroughSliceAction(20, TIME.SECOND, 0.1));

    @Override
    protected SliderCineListener getMoveTroughSliceAction(int speed, TIME time, double mouseSensivity) {
        return new SliderCineListener(ActionW.SCROLL_SERIES, 1, 2, 1, speed, time, mouseSensivity) {

            protected CineThread currentCine;

            @Override
            public void stateChanged(BoundedRangeModel model) {

                ViewCanvas<DicomImageElement> view2d = null;
                Series<DicomImageElement> series = null;
                SynchCineEvent mediaEvent = null;
                DicomImageElement image = null;
                Optional<ToggleButtonListener> defaultPresetAction =
                    getAction(ActionW.DEFAULT_PRESET, ToggleButtonListener.class);
                boolean isDefaultPresetSelected =
                    defaultPresetAction.isPresent() ? defaultPresetAction.get().isSelected() : true;

                if (selectedView2dContainer != null) {
                    view2d = selectedView2dContainer.getSelectedImagePane();
                }

                if (view2d != null && view2d.getSeries() instanceof Series) {
                    series = (Series<DicomImageElement>) view2d.getSeries();
                    if (series != null) {
                        // Model contains display value, value-1 is the index value of a sequence
                        int index = model.getValue() - 1;
                        image = series.getMedia(index,
                            (Filter<DicomImageElement>) view2d.getActionValue(ActionW.FILTERED_SERIES.cmd()),
                            view2d.getCurrentSortComparator());
                        mediaEvent = new SynchCineEvent(view2d, image, index);
                        // Ensure to load image before calling the default preset (requires pixel min and max)
                        if (image != null && !image.isImageAvailable()) {
                            image.getImage();
                        }
                    }
                }

                Optional<ComboItemListener> layoutAction = getAction(ActionW.LAYOUT, ComboItemListener.class);
                Optional<ComboItemListener> synchAction = getAction(ActionW.SYNCH, ComboItemListener.class);

                if (image != null && layoutAction.isPresent() && View2dFactory
                    .getViewTypeNumber((GridBagLayoutModel) layoutAction.get().getSelectedItem(), ViewCanvas.class) > 1
                    && synchAction.isPresent()) {

                    SynchView synchview = (SynchView) synchAction.get().getSelectedItem();
                    if (synchview.getSynchData().isActionEnable(ActionW.SCROLL_SERIES.cmd())) {
                        double[] val = (double[]) image.getTagValue(TagW.SlicePosition);
                        if (val != null) {
                            mediaEvent.setLocation(val[0] + val[1] + val[2]);
                        }
                    } else {
                        if (selectedView2dContainer != null) {
                            final List<ViewCanvas<DicomImageElement>> panes = selectedView2dContainer.getImagePanels();
                            for (ViewCanvas<DicomImageElement> p : panes) {
                                Boolean cutlines = (Boolean) p.getActionValue(ActionW.SYNCH_CROSSLINE.cmd());
                                if (cutlines != null && cutlines) {
                                    double[] val = (double[]) image.getTagValue(TagW.SlicePosition);
                                    if (val != null) {
                                        mediaEvent.setLocation(val[0] + val[1] + val[2]);
                                    } else {
                                        return; // Do not throw event
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }

                Optional<SliderChangeListener> windowAction = getAction(ActionW.WINDOW, SliderChangeListener.class);
                Optional<SliderChangeListener> levelAction = getAction(ActionW.LEVEL, SliderChangeListener.class);
                if (view2d != null && image != view2d.getImage() && image != null && windowAction.isPresent()
                    && levelAction.isPresent()) {
                    Optional<ComboItemListener> presetAction = getAction(ActionW.PRESET, ComboItemListener.class);
                    PresetWindowLevel oldPreset =
                        presetAction.isPresent() ? (PresetWindowLevel) presetAction.get().getSelectedItem() : null;
                    PresetWindowLevel newPreset = null;
                    boolean pixelPadding = JMVUtils.getNULLtoTrue(
                        view2d.getDisplayOpManager().getParamValue(WindowOp.OP_NAME, ActionW.IMAGE_PIX_PADDING.cmd()));

                    List<PresetWindowLevel> newPresetList = image.getPresetList(pixelPadding);

                    // Assume the image cannot display when win =1 and level = 0
                    if (oldPreset != null
                        || (windowAction.get().getSliderValue() <= 1 && levelAction.get().getSliderValue() == 0)) {
                        if (isDefaultPresetSelected) {
                            newPreset = image.getDefaultPreset(pixelPadding);
                        } else {
                            if (oldPreset != null) {
                                for (PresetWindowLevel preset : newPresetList) {
                                    if (preset.getName().equals(oldPreset.getName())) {
                                        newPreset = preset;
                                        break;
                                    }
                                }
                            }
                            // set default preset when the old preset is not available any more
                            if (newPreset == null) {
                                newPreset = image.getDefaultPreset(pixelPadding);
                                isDefaultPresetSelected = true;
                            }
                        }
                    }

                    Optional<ComboItemListener> lutShapeAction = getAction(ActionW.LUT_SHAPE, ComboItemListener.class);
                    Double windowValue = newPreset == null ? windowAction.get().getRealValue() : newPreset.getWindow();
                    Double levelValue = newPreset == null ? levelAction.get().getRealValue() : newPreset.getLevel();
                    LutShape lutShapeItem = newPreset == null
                        ? lutShapeAction.isPresent() ? (LutShape) lutShapeAction.get().getSelectedItem() : null
                        : newPreset.getLutShape();

                    Double levelMin =
                        (Double) view2d.getDisplayOpManager().getParamValue(WindowOp.OP_NAME, ActionW.LEVEL_MIN.cmd());
                    Double levelMax =
                        (Double) view2d.getDisplayOpManager().getParamValue(WindowOp.OP_NAME, ActionW.LEVEL_MAX.cmd());

                    PresentationStateReader prReader =
                        (PresentationStateReader) view2d.getActionValue(PresentationStateReader.TAG_PR_READER);
                    if (levelMin == null || levelMax == null) {
                        levelMin = Math.min(levelValue - windowValue / 2.0, image.getMinValue(prReader, pixelPadding));
                        levelMax = Math.max(levelValue + windowValue / 2.0, image.getMaxValue(prReader, pixelPadding));
                    } else {
                        levelMin = Math.min(levelMin, image.getMinValue(prReader, pixelPadding));
                        levelMax = Math.max(levelMax, image.getMaxValue(prReader, pixelPadding));
                    }

                    // FIX : setting actionInView here without firing a propertyChange avoid another call to
                    // imageLayer.updateImageOperation(WindowOp.name.....
                    // TODO pass to mediaEvent with PR and KO

                    ImageOpNode node = view2d.getDisplayOpManager().getNode(WindowOp.OP_NAME);
                    if (node != null) {
                        node.setParam(ActionW.PRESET.cmd(), newPreset);
                        node.setParam(ActionW.DEFAULT_PRESET.cmd(), isDefaultPresetSelected);
                        node.setParam(ActionW.WINDOW.cmd(), windowValue);
                        node.setParam(ActionW.LEVEL.cmd(), levelValue);
                        node.setParam(ActionW.LEVEL_MIN.cmd(), levelMin);
                        node.setParam(ActionW.LEVEL_MAX.cmd(), levelMax);
                        node.setParam(ActionW.LUT_SHAPE.cmd(), lutShapeItem);
                    }
                    updateWindowLevelComponentsListener(image, view2d);

                }

                firePropertyChange(ActionW.SYNCH.cmd(), null, mediaEvent);
                if (image != null) {
                    fireSeriesViewerListeners(
                        new SeriesViewerEvent(selectedView2dContainer, series, image, EVENT.SELECT));
                }

                updateKeyObjectComponentsListener(view2d);

            }



View2d

 public void propertyChange(PropertyChangeEvent evt) {
        super.propertyChange(evt);
        if (series == null) {
            return;
        }

        RenderedImage dispImage = imageLayer.getDisplayImage();
        OpManager disOp = imageLayer.getDisplayOpManager();
        final String name = evt.getPropertyName();
        if (name.equals(ActionW.SYNCH.cmd())) {
            SynchEvent synch = (SynchEvent) evt.getNewValue();
            SynchData synchData = (SynchData) actionsInView.get(ActionW.SYNCH_LINK.cmd());
            boolean tile = synchData != null && SynchData.Mode.TILE.equals(synchData.getMode());
            if (synchData != null && Mode.NONE.equals(synchData.getMode())) {
                return;
            }
            for (Entry<String, Object> entry : synch.getEvents().entrySet()) {
                final String command = entry.getKey();
                final Object val = entry.getValue();
                if (synchData != null && !synchData.isActionEnable(command)) {
                    continue;
                }

                if (command.equals(ActionW.PRESET.cmd())) {
                    actionsInView.put(ActionW.PRESET.cmd(), val);

                    if (val instanceof PresetWindowLevel) {
                        PresetWindowLevel preset = (PresetWindowLevel) val;
                        DicomImageElement img = getImage();
                        ImageOpNode node = disOp.getNode(WindowOp.OP_NAME);

                        if (node != null) {
                            node.setParam(ActionW.WINDOW.cmd(), preset.getWindow());
                            node.setParam(ActionW.LEVEL.cmd(), preset.getLevel());
                            node.setParam(ActionW.LUT_SHAPE.cmd(), preset.getLutShape());
                            // When series synchronization, do not synch preset from other series
                            if (img == null || !img.containsPreset(preset)) {
                                List<PresetWindowLevel> presets =
                                    (List<PresetWindowLevel>) actionsInView.get(PRManager.PR_PRESETS);
                                if (presets == null || !presets.contains(preset)) {
                                    preset = null;
                                }
                            }
                            node.setParam(ActionW.PRESET.cmd(), preset);
                        }
                        imageLayer.updateDisplayOperations();
                    }
                }

RenderedImageLayer

    @Override
    public synchronized void setEnableDispOperations(boolean enabled) {
        this.enableDispOperations = enabled;
        if (enabled) {
            updateDisplayOperations();
        }
    }

    @Override
    public void updateDisplayOperations() {
        if (isEnableDispOperations()) {
            displayImage = disOpManager.process();
            fireImageChanged();
        }
    }

    public void fireImageChanged() {
        if (displayImage == null) {
            disOpManager.clearNodeIOCache();
        }
        PlanarImage img = null;
        if (buildIterator && sourceImage != null) {
            img = sourceImage.getImage(preprocessing);
        }
        readIterator = (img == null) ? null : RandomIterFactory.create(img, null);
        fireLayerChanged();
    }

    public void fireLayerChanged() {
        for (int i = 0; i < listenerList.size(); i++) {
            listenerList.get(i).handleLayerChanged(this);
        }
    }

View2d

    @Override
    public void handleLayerChanged(ImageLayer layer) {
        repaint();
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值