# DesignerHook: Handling case where Vision has been disabled

**URL:** <https://forum.inductiveautomation.com/t/designerhook-handling-case-where-vision-has-been-disabled/113850>\
**Category:** Module Development\
**Tags:** vision\
**Created:** [February 9, 2026, 2:01pm UTC](https://forum.inductiveautomation.com/t/designerhook-handling-case-where-vision-has-been-disabled/113850 "2026-02-09T14:01:44Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![mpderbec](https://avatars.discourse-cdn.com/v4/letter/m/bbe5ce/32.png) [@mpderbec](https://forum.inductiveautomation.com/u/mpderbec)\
**Post date:** [February 9, 2026, 2:01pm UTC](https://forum.inductiveautomation.com/t/designerhook-handling-case-where-vision-has-been-disabled/113850/1 "2026-02-09T14:01:44Z")

</div>

Is there a canonical pattern for handling the case where a module has Vision components and the customer has disabled Vision? We just had a customer do that and they can’t start Designer due to our module, here’s the exception:

```python
ModuleLoadException: Error loading hook class "com.seeq.ignition.designer.DesignerHook" for module "Seeq". caused by NoClassDefFoundError: com/inductiveautomation/vision/api/designer/palette/PaletteItem caused by ClassNotFoundException: com.inductiveautomation.vision.api.designer.palette.PaletteItem

```

How do you isolate the code and handle this exception (and then skip any Vision-related stuff)? Do I need to create a separate JAR?

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [February 9, 2026, 2:05pm UTC](https://forum.inductiveautomation.com/t/designerhook-handling-case-where-vision-has-been-disabled/113850/2 "2026-02-09T14:05:42Z")

</div>

> [@mpderbec](#):
>
> where a module has Vision components and the customer has disabled Vision?

You should just need to check if Vision is installed before you start referencing its classes or adding components or whatever. Something like this EventStreams module does: [ignition-sdk-examples/event-stream-source/event-stream-source-gateway/src/main/java/com/inductiveautomation/ignition/examples/eventstream/source/gateway/ExampleSourceGatewayHook.java at dc086e3da35512409c2e2869674faa984f6926e6 · inductiveautomation/ignition-sdk-examples · GitHub](https://github.com/inductiveautomation/ignition-sdk-examples/blob/dc086e3da35512409c2e2869674faa984f6926e6/event-stream-source/event-stream-source-gateway/src/main/java/com/inductiveautomation/ignition/examples/eventstream/source/gateway/ExampleSourceGatewayHook.java)

Basically, just try to get the Vision module from the ModuleManager and check if it's null or not.

edit: same idea in the DesignerModuleHook: [ignition-sdk-examples/event-stream-source/event-stream-source-designer/src/main/java/com/inductiveautomation/ignition/examples/eventstream/source/designer/ExampleSourceDesignerHook.java at dc086e3da35512409c2e2869674faa984f6926e6 · inductiveautomation/ignition-sdk-examples · GitHub](https://github.com/inductiveautomation/ignition-sdk-examples/blob/dc086e3da35512409c2e2869674faa984f6926e6/event-stream-source/event-stream-source-designer/src/main/java/com/inductiveautomation/ignition/examples/eventstream/source/designer/ExampleSourceDesignerHook.java)

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [February 9, 2026, 2:19pm UTC](https://forum.inductiveautomation.com/t/designerhook-handling-case-where-vision-has-been-disabled/113850/3 "2026-02-09T14:19:04Z")

</div>

Complete example for you, from my NoteChart module. It conditionally adds the Vision components and/or Reporting component based on module presence:

```python
    public void startup(DesignerContext context, LicenseState activationState) throws Exception {
        // Add my component to its own palette, but only if Vision is loaded.
        Object vision = context.getModule("com.inductiveautomation.vision");
        if (vision != null) {
            // Add the BeanInfo package to the search path
            context.addBeanInfoSearchPath("com.automation_pros.notechart.beaninfos");

            VisionDesignerInterface sdk = (VisionDesignerInterface) vision;
            logger.debug("Adding EasyNoteChart and NoteChart to Designer's 'Charts' Palette Group");
            Palette palette = sdk.getPalette();

            PaletteItemGroup group = palette.getGroup("Charts");
            group.addPaletteItem(new JavaBeanPaletteItem(EasyNoteChart.class));
            group.addPaletteItem(new JavaBeanPaletteItem(NoteChart.class));

        }
        Object reporting = context.getModule("com.inductiveautomation.reporting");
        if (reporting != null) {
            RMArchiver.registerClass(ReportNoteChart.ARCHIVE_NAME, ReportNoteChart.class);
            DesignerShapeRegistry.get(context).register(ReportNoteChart.class);
        }
    }

```

---

<div class="post-metadata">

**Author:** ![mpderbec](https://avatars.discourse-cdn.com/v4/letter/m/bbe5ce/32.png) [@mpderbec](https://forum.inductiveautomation.com/u/mpderbec)\
**Post date:** [February 9, 2026, 2:45pm UTC](https://forum.inductiveautomation.com/t/designerhook-handling-case-where-vision-has-been-disabled/113850/4 "2026-02-09T14:45:39Z")

</div>

Awesome, thanks all. I’ll test shortly

---

<div class="post-metadata">

**Author:** ![mpderbec](https://avatars.discourse-cdn.com/v4/letter/m/bbe5ce/32.png) [@mpderbec](https://forum.inductiveautomation.com/u/mpderbec)\
**Post date:** [February 9, 2026, 8:20pm UTC](https://forum.inductiveautomation.com/t/designerhook-handling-case-where-vision-has-been-disabled/113850/5 "2026-02-09T20:20:24Z")

</div>

The `context.getModule("com.inductiveautomation.vision")` approach works great!
