LabVIEW Idea Exchange

Community Browser
cancel
Showing results for 
Search instead for 
Did you mean: 
Post an idea

I want to be able to programmatically change the color of the LEDs on push buttons.

The colors[4] property will change the color of the housing, but not the LED itself.

 

bhpowell_0-1756585981792.png

 

This push button is one of the controls that is both a control and an indicator rolled into one.

In my particular case, I want to represent a third state. I have a valve that can be open, closed, or in transit.

There are two actuation states of open and close, but three indicator states.

 

I think making it a property I can control is a powerful solution. Not only will it solve my use case, but I can have all different colors of Booleans without needing to use Customize Control and the Control Editor to modify the colors.

 

Extra credit request: Can we make just the LED blink?  Right now, the blinking property blinks the entire control, but wouldn't it be cool if just the LED blinked? This is what those same two controls look like when blinking:

bhpowell_1-1756586494123.png

Maybe it's a new property just for LEDs that's separate from "Blinking". I'd be okay with that if you want to preserve current behavior.

 

Here are some related Idea Exchange posts related to a tri-state Boolean. They're not quite what I want, but I thought I'd link to them for reference:

https://forums.ni.com/t5/LabVIEW-Idea-Exchange/Tri-State-Boolean/idi-p/1139952

https://forums.ni.com/t5/LabVIEW-Idea-Exchange/Special-LED-control-with-three-states-Default-ON-OFF/idi-p/991307

 

I work with PPLs quite a bit...and sometimes...I just want to rename them.

 

Libraries that depend on the renamed PPL will then be broken, as expected.  Example here:

_carl_0-1761236480557.png

It would be awesome if I could simply go in, right-click on the missing dependency, and replace it with the newly named one. But...for whatever reason...this option is disabled.  Instead, I find myself having to go in and manually replace each individual broken PPL call (VIs, typedefs, etc.). This is unnecessarily time consuming and error prone.

 

Wiki link: https://en.wikipedia.org/wiki/Memoization

 

I have a lot of "stuff" that gets created dynamically from config files at runtime. The "stuff generation" process is pretty quick, but often I need to create a LOT of these objects, and most are identical. The "stuff creation" process is quick and painless when I design my app to work with, say, 1000 "data objects", but then a user comes along and says they need a million of 'em, and now that fraction of a second takes forever.

 

One easy way to handle this is to bundle up all of my config data and use it as a key for a map, then look up that key prior to running the "generate" function. If it already exists, return the cached value, otherwise, run the code and add it to the cache.

 

For example, here's what a wrapper looks like around "slow.vi":

 

This is simple enough on the block diagram, but I have to do it for each function. It would be nice if LabVIEW could do this for me.

 

I propose that this gets implemented as a VI setting as an option for Run VI or possibly as a checkbox in the Execution menu. Alternatively, you could make it like a VI Refnum where you drop an existing VI into a "box" that handles this wrapping.

 

 

cache2.png

 

There would need to be a bit more to it than a simple checkbox- for example, you'd likely want a way to programmatically force a re-compute for a given input, or clear the cache entirely. And you'd need to decide how you handle shared or preallocated clones, (probably) prevent inlining, that sort of thing.

 

I would think implementing this at a "core" level would offer speed benefits over making a bunch of wrappers. I think you could probably make an Xnode that does this, but that's far beyond my comfort level, and I'm gunshy on them anyway, especially since I'll be using this mostly with objects.

 

I am missing a tool to clear the revision history of all VI's, classes, controls, ... in the current project.
I find this useful since when building, some of the revision history is still checked and causes longer build times and even build errors due to this revision history still referencing old missing VI's which are not even part of the repo anymore.
To extend this: Why is there still a revision history in every VI, control, ...? Everybody uses a version control system like GiT or any other one, so it is even better to just switch off revision history tagging in the LabVIEW options for a project (just like separate compiled code checkbox)!
This would be a nice feature and will clear all my errors, pain and time consumption..

We know that LabVIEW has some magic that it uses for automatic error handling.  What if LabVIEW could use such sorcery to enrich the error string flowing on the wire, with information about the originating source of the error -- specifically the VI Reference and GObject UID of the node where the error was introduced.  Then a "fancy error dialog of the future" (TM) could utilize those UIDs to navigate directly to the node and highlight it (a visual effect to show which node it is). This behavior could be added to the Simple Error Handler and General Error Handler VIs, and maybe ever there could be a "LabVIEW Gems" vi.lib utility that can extract the VI Reference and GObject UID for use in other, 3rd party tools.

Problem: Currently, the native nodes and VIs that can be used for error manipulation are located in the Dialog & User Interface palette. While manipulating errors can mean generating dialogues, and can influence the User Interface/User Experience, error manipulation is a broader and stand-alone topic.

 

Solution: Nodes and VIs that are relevant to error handling/error manipulation should be given their own subpalette inside the Programming palette. The new subpalette could be named "Error Handling", "Error Manipulation" or "Errors".

 

1 (annotated).png

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2 (annotated).png

LabVIEW should have tabs for each open vi instead of opening a new window for each.  Opening a new window for every vi is a horrible user experience.

A recent version of LabVIEW has introduced the ability to make the Iteration Terminal of For Loops and While Loops invisible. This is a useful new feature, I use it often, thanks for implementing it.

 

The problem is that currently the only way to toggle the visibility of the Iteration and Conditional terminals is to right-click, navigate to Visible Items, and select the desired option. This can take one or a few seconds, which is slow. Moreover, sometimes it is necessary to right-click and access the menu twice in quick succession. For example, for loops are created with their Iteration Terminal visible and their Conditional Terminal invisible. If one wants to invert the visibility of each terminal (make the Iteration Terminal invisible and the Conditional Terminal visible) one needs to access the same menu twice. This can take a few seconds.

 

Solution: The Iteration Terminal and Conditional Terminal configuration of a loop can be set via a single keystroke. For example, pressing "0" would make both terminals invisible (if possible). Pressing "1" would make the Iteration Terminal visible, and the Conditional Terminal invisible. Pressing "2" would make the Iteration Terminal invisible and the Conditional Terminal visible. Pressing "3" would make both terminals visible.

 

Notes

  • While keys "0", "1", "2", "3" are proposed above, I would be happy with any other keys, or key combinations, being chosen as the trigger of this action.
  • The digits 0/1/2/3 were chosen as they can represent a two-by-two binary table of the visible/invisible states of the two terminals. I.e. 00 = both terminals off, 11 = both terminals on, etc.
  • Pressing the key should have no effect in those cases where the requested action is impossible. For example, a While Loop must always show its Conditional Terminal. Pressing "0" could make the Iteration Terminal invisible (if it is not wired), but would have to leave the Conditional Terminal being visible.
  • This idea sits in the "increase developer productivity" category. I want my IDE to enable me to be as productive as possible. Every second matters. In fact, even tenths of a second matter.
  • This idea is similar to the following: Pressing the "L" key should toggle label visibility. These ideas were posted on the same day.

Problem: Viewing and/or hiding labels on the block diagram is an important part of programming in LabVIEW. In general I display the labels of subVIs, native functions (e.g. TCP Read or Obtain Queue), constants, and structures such as Case Structures, For Loops, While Loops. But sometimes, for a variety of reasons, I choose to hide labels.

 

Currently toggling the visibility of labels can be done either by right-clicking and navigating to Visible Items >> Label or by using the AddLabels QuickDrop shortcut (Ctrl+Space + Ctrl+Q to make labels visible, Ctrl+Space + Ctrl+Shift+Q to make them invisible).

 

Both options are slow for such a common, repetitive, and necessary action. While I admire the intention of the QuickDrop shortcut, and do use it from time to time, it unfortunately cannot achieve the virtually-instant response that should be associated with this action.

 

Solution: Label visibility should be toggled by pressing a single key, for example key "L" for label. For example, if the TCP Read primitive was dropped with its label being hidden, then selecting the primitive and hitting "L" would make its label visible. No need to navigate with the mouse. No need to load QuickDrop (which can take more than one or two seconds, especially when working in large projects).

 

Notes

  • While key "L" is proposed above, I would be happy with any other key being chosen as the trigger of this action.
  • I would be happy with a key combination, such as "Ctrl + L" or similar being chosen.
  • The action should work for groups of selected objects, just like the two current ways of toggling label visibility work on groups.
  • The idea above refers strictly to objects on the Block Diagram, as that is where I need this feature most. It would be a bonus if the new functionality would apply to objects on the Front Panel too.
  • This idea sits in the "improve developer productivity" category. I want my IDE to enable me to be as productive as possible. Every second matters. In fact, even tenths of a second matter.

If I'm working with a class in my development code base, and I right-click on it (or one of its wires), I have access to the full menu of class methods. This is super convenient, and it saves me from navigating the project tree or remembering the exact method name when using quick drop.

 

However....if my class is defined in a PPL, this menu simply doesn't exists.  I'm not sure if this is a bug or a feature request, but, I would really like to have access to this menu when working with classes in PPLs.

 

Untitled.jpg

This topic keeps coming up randomly.  A LabVIEW class keeps a mutation history so that it can load older versions of the class.  But how often does this actually need to be done?  I have never needed it.  Many others I have talked with have never needed it.  But it often causes problems as projects and histories get large.  For reference: Slow Editor Performance with Large LabVIEW Projects Containing Many Classes.  The history is also just added bloat to your files (lvclass and any built files that use the lvclass) for something most of us do not need and sometimes causes build errors.

 

My proposal is to add an option to the class properties to keep the mutation history.  It can be enabled by default to keep the current behavior.  But allowing me to uncheck this option and then never have to worry about clearing the history again would be well worth it.

Error 1003 occurred at an unidentified location

Possible reason(s):

LabVIEW: (Hex 0x3EB) The VI is not executable. This error may occur because the VI is either broken or contains a subVI that LabVIEW cannot locate. Select File>>Open to open the VI and verify that you can run it.

 

The RT Image contains a secret subset of the host's vi.lib. Excluding vi.lib is the default build setting and is recommended in LabVIEW: (Hex 0x6C0) When Deploying Source Distribution to RT Target - NI

When running deployed code, we get error 1003 if the RT Image does not contain a .vi or .ctl that exists in the host's vi.lib. My tests showed that this can likely be a single .ctl.

 

I ask NI either to publish which .vis and .ctls each RT Image contains, or, even better, to create a log that helps identify which .ctl or .vi is missing. A log with even an obscure signature of the item that failed to load is better than having no information. The alternative—disabling “Exclude vi.lib” because of one or two missing files in the RT Image—leads to unnecessary bloat and code duplication for every single plugin deployed.


I ask NI to either publish which .vis .ctls each RT Image contains or better to create a log which can help identifying which .ctl or .vi is missing. A log with an obscure signature that failed to load is better than no info here. The alternative of not excluding vi.lib because of one or two missing files in RT Image is effectively unnecessary bloating and duplication of code.

The Desktop Execution Trace Toolkit (DETT) collects hundreds to thousands of data points that indicate memory allocations, queue references, events, and more.  The data is always available and often is overwhelming.  The only way to make sense of data quickly is to create custom probes that create highlights in the data, however, that is only after you know which VI is worth probing further.

 

The idea:

Feed all the data normally collected by the DETT about a LabVIEW project directly into Nigel so that it can provide human-friendly suggestions explaining:

Level 1

How often a VI allocates memory in a repeated fashion

The time jitter between different events

VI's that could be good candidates for refactoring

 

Level 2

Improvements to the code within that VI based on best practices for optimal compiler operations.

 

This is based off a discussion at GDevCon #6 on September 10th, 2025.

 

It's hard to believe that this is the first post to request something like this (pun intended), but I couldn't find it after a few queries.

 

The base idea would be that both the static and dynamic connectors used to connect the methods to the owning class shall be defaulting to the owner class, a.k.a. this object in text based languages. The main problem is the use case for refactoring. When moving around methods the class controls and indicators have to be replaced every time. It doesn't matter if I'm moving methods between classes or to interfaces it is the same pain: replace the connectors (with QuickDrop), then change the names to class names, then update the icon, finally move the VI to the new location.

 

I know that this could and maybe is already solved with scripting, but I think the development environment shall grant the option to change the control and indicator to this object that will always default to the owning class, without manual updates. Even the labels could be This in and This out, and replaced in real time with the actual class implementation on the block diagram of the calling VIs.

 

The proposed solution would also get rid of the error telling about the dynamic dispatch controls shall reference the owning class, since it would happen automatically.

It would be really nice if you were able to resize properties dialog boxes for controls, indicators, constants, and other nodes on a front panel or block diagram. Sometimes the information entered in a dialog is larger than the allotted space. Fortunately, in those situations, there is usually a tip strip that shows all of the information rather than just the visible portion of the information, such as shown in the enum properties dialog box picture below. To make all information visible, it would be great if properties dialog box windows were resizable and the contents of the tab control pages automatically scaled with the size of the dialog. It would also be nice if pages containing objects with columns (e.g. multi-column listboxes, etc.) allowed the columns to be resized as depicted in the picture below. 

 

Ryan_Wright__2-1731433895037.png

The zooming feature in LabVIEW was way past due, particularly with the advent of 4k displays (and the rapid degradation of my sight!), but was implemented very poorly.   As mentioned in other idea exchanges, the font size handling is awful, and regardless does not address the ancient-looking pixelated block diagram interface.   Also the zoom resolution has too many steps for how drastically the view contorts with each step. 

 

The entire system should be overhauled as vector-based so it looks crisp at any zoom level and zooms smoothly between zoom levels.   The shining light example of smooth-zooming is Miro which handles text sizes and detail-loading even better than Google Maps. 

 

I am really looking forward to not squinting at pixels, and LabVIEW is literally the last offender I work with.

Control and indicator references are currently 19 pixels tall. They should be 16 pixels tall. References would then align better with other items which are already 16 pixels tall, such as the Bundle By Name and Unbundle By Name nodes.

 

1 (edited).png

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

This idea is inspired by this idea and this idea.

Quiztus2_0-1741871908439.png

I couldn't find this explicitly mentioned here, but it seems related to:

 

Block diagram references should be 16 pixels tall (currently 19 pixels) - NI Community

Same Height of Unbundle by Name / Terminal / Local Variable - NI Community 

 

Although making changes like this could hurt legacy code, earlier implementation is preferable. Local variables are already the same size as bundles and property nodes, but constants are not. My suggestion is to increase the size of bundle/unbundle elements by one pixel and decrease the size of constants by two pixels by reducing their border thickness. Since numerics require a type indicator, a 1 px border wouldn't compromise recognition. Numeric constant type visualization - NI Community


If we want a ring of a string type we can use a combo box and if undefined items are not to be allowed it *could* behave as a regular ring (integer type) with no text editing/input, but that is not an option in LabVIEW now. Having such an option would allow us the keep the behaviour of multiple ring controls identical (and hence more intuitive to the users) although their types behind the scene for programmatic convenience are different.

If you want to keep the ring as a string (to not have to deal with it indirectly though the ring/enum string array property, which would be the current workaround...) you are currently forced to accept that the this ring will behave differently than other ring controls or enums:

 

In Microsoft applications the suggested feature is available by setting the style of the combo box to DropDropDownList.

 

After working with text-based languages recently, I've become more aware of a very painful flaw in the LabVIEW IDE.

 

First of all, as software engineer, I like to perform experiments. Make a small change, test it. If it doesn't work, then just use Git to roll back the changes. I've been doing this for years, and with LabVIEW it has been fairly painful. Until recently I didn't realize there was a better way.

Why is it painful? Everytime I use Git to check out a different branch or roll things back, I am forced to close LabVIEW or at least close the project so that LabVIEW detects and loads the new code from disk instead of whatever it has in memory. I lived with that for years because I didn't know any better.

 

Enter text-based programming and IDEs: VSCode, PyCharm, probably any other modern IDE. I try an experiment, it doesn't work. I roll the changes back in Git and guess what? I don't have to open and close anything! The IDE just automatically detects the file has changed and loads the new file!

 

When is LabVIEW going to get with the times?