LabVIEW Idea Exchange

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

When reopening a project, the position of the window is retained from the last save of the project, the items in the project tree but not the status of the disclosure rectangles.  I usually like to have open the "chassis" and FPGA components as well as my top level software folders, and build definitions.  I keep sub-vi folder and hardware module folders closed.

 

It would be a time saver (and relatively simple) to preserve the status of those personal preferences so that reopening a project takes you to the same state you left it in.

 

Hopefully this is a moderate reward very low effort request.

LabVIEW 2020 allows you to remove the event property nodes shown here:

carls___0-1593446234322.pngcarls___2-1593446364647.png

It's a nice feature because these nodes are often not used and can get in the way.  However -- the process for removing them is a bit tedious: you have to either remove them all individually or size the cluster down to one and then remove through a menu.  I find that I rarely use this because, well, it just takes too long.

 

However...if you could just click on the node (it's already selectable) and then click the "delete" button on your keyboard, this process would be near-instantaneous, and I know I'd be much more likely to use it.

There are two things that bother me about the index array. I think these changes would be useful to nearly all LabVIEW users.

 

  1. The default value is not optional (for integers always zero, a very useful value) There should be a way to set the desired value if the index is out of bounds.
     

    Image 1.png

  2. There should be a way to get rather the index is out of bounds from this primitive since this has to be check anyhow to know whether to use the default value.Image 2.png should look something like this: Image 3.png

     

     

The lack of these items usually proves to generate code that looks much uglier than necessary.

Although I do not know the internal workings of this primitive it would be hard for me to believe that this would have much of a performance impact. Also, bound checking arrays is necessary for many algorithms, why do it twice? 

It would save me a lot of time browsing around the file system if, when selecting File/Open from the menu of a given VI, the file selection dialog that opens started at the same directory the VI is in.

 

Make that an option in LabVIEW initialization file, for people that rather have the current behavior.  Default to current behavior for minimal disturbance.

 

We have over 20 thousand files all over some deep hierarchy.  Sometimes we have two versions of that mapped in different places.  The time wasted navigating from one place to another is a bit of a pain.  Storing Quick Access directories only works up to a certain point.  it would also allow running two versions of LabVIEW simultaneously, without stomping over one another.

 

See this post in the forums where I asked for help with this last case.

 

It seems like every time I want to create a VI that has a connector pane which adheres to a particular type specifier, so I can pass a VI Reference into a subVI, I have to manually dig through the context help on that type specifier and find out what the desired connector pane is. Then after i create the VI and set up the connector pane, surely I will still get a broken wire on my reference, only to find out my connector pane connections are right, but my connection "requirements" don't match. I would love to have an option where you could right click a type specifier and "Create VI from type specifier" much like how we can create a callback VI from the register event callback node.

Hello,

 

This is a really small thing. However please could you add TRef Find Object By Label.vi to the scripting pallet?

I use this VI a lot (as do a lot of other scripting fans) and it's a pain to have to copy it from another tool or open it from traverseref.llb in program files.

 

Perhaps put it in an advanced sub pallet?

 

Context Help: TRef Find Object By Label.viContext Help: TRef Find Object By Label.vi

 

2019 Scripting Pallet2019 Scripting Pallet

 

In the application builder we can define Pre / Post Build actions.

The template VIs fro Pre and Post build actions are located in :

~\LabVIEW 2018\resource\Framework\Providers\Builds\Common\Pre and Post Build

Of course these can be modified at our own risks.

 

From the application builder, LabVIEW offers to generate Pre / Post build VIs with the specific connector pane,  when generating such a VI, LabVIEW **simply** creates copy of the templates, the base VIs being "Pre Build Action.vi" and "Post Build Action.vi")

 

Instead of asking where to save a copy of a fix file, I wish LabVIEW first ask which VI to use as a starting base.

Display a pop-up* listing all the possible template for pre / post build action that I placed in the folder cited above, and then use the selected one as a base for my new pre / post build VI.

 

Untitled.png

* = similar to the one we get when disabling the default icon

It would be helpful to have Refresh Palettes operation as part of the built-in Command Line Operations. This would help fill in the NI Package's short coming of not having palette tools like VI Package Manager. My suggestion is the Operation Name to be RefreshPalettes and require any additional arguments.

So this isn't a huge deal, but it would be nice if we could put an array of classes into To More Specific Class to convert all of them to the more specific class. There are handfuls of functions that work well on both arrays and single elements (the Math functions, Close Reference, etc).

Targetclass.PNG

Error Out would need to become an array as well. I can't think of anything at the moment that this might break, or any poor patterns it might enable, it would just save a For loop here and there. I made a quick example vim just to illustrate, but it'd be nice if it was part of LabVIEW core.

 

tsc_vim.png

I'm working on large AF projects and I want to be able to pack my actors into lvlibps as there are lots of benefits of using PPLs. However, I'm a bit uneasy about distributing the PPLs with the executable because it's possible to reuse the public methods in a PPL. (The software I write is mostly licensable, but it would still be possible for competitor companies to reuse the public APIs)

 

What I would like is a way of securing/encrypting PPLs when distributing the executable.

I really like using VIMs; however, I have been having a lot of issues when saving for previous versions / VIM based bugs.

 

What I would like is a right-click (under the advanced tag) to convert VIM to VI copy (which you could then save) and a 'tools>Advanced>replace all VIM instances in the project' tool.

 

I attempted to make this myself, but it turns out the 'Replace' scripting method doesn't work with VIMs and I don't really want to go down the route of deleting, placing, rewiring.

 

So either, could I suggest creating the tool, or providing the scripting functions for us to create the tool.

 

NB: This is the proof of concept I was trying out to change VIMs to VIs:

Order of operation:

  1. Get a reference to SubVIs and filter for VIMs
  2. Create a copy of the VIM and save as a VI
  3. Replace VIM with new VI

Converting VIM to VI.png

 

I use Desktop Trace Execution for looking at memory use issues in large applications. I would like a feature to find "Memory Allocates" that are unmatched by a "Memory Free"
within a selectable range of memory events in a Trace Execution output. Matching would take place as shown in the attached .jpg.

DET.jpg

This is something that started as a way to get data back from Actors in non-actor code (for example, web services). I've never cared for the blocking nature of Reply Msgs and the only other built-in option for getting back data is to make everything an Actor, which is not always an option. Promises solve both of those issues.

 

The basic idea is an enforced single-writer, many-reader cross thread datatype. In the current implementation, they are not much more than a locked-down, single element queue but you can actually do some pretty cool stuff with just that.

 

In the message sender, we create the promise and return it. The idea here is that the Actor owns the promise and will fulfill it. This gives us very low coupling for free.

Actor_Example_lvlib_Start_Long_Running_Process_Msg_lvclass_Send_Start_Long_Running_Processd.png
Wait on Promise will wait for the Promise to be fulfilled. It is a malleable VI so that a Default Value (for timeout) and Type can be wired. Using the timeout lets us do other things while waiting for data.

Actor_Example_lvlib_Launcherd.png
Inside the Actor, we can set the value with Fulfill Promise. Remember, once the Promise is set, that's it, no changing it again. In fact, Fulfill Promise will error out if called twice on the same promise.

Fulfill Promise.PNG
Something else really cool we can do is fulfill a promise with another promise. This may seem pedantic at first but it can help keep your code cohesive by passing the responsibility of fulfilling a Promise to another process. For example, if you have a message broker that just forwards a message, you can have the message broker fulfill it's promise to the caller with a promise from the callee.

Fulfill with Promise.PNG
We can also reject a promise with an error message that will be returned by any Wait on Promise that tries to read it. Rejecting a promise does fulfill the promise so you still cannot set the value later and you cannot reject a promise again.

Reject Promise.PNG
Finally, we have Destroy Promise. It does exactly what it says on the tin.

 Destroy Promise.PNG


I'd love to hit some more of the design points from https://promisesaplus.com/ (mainly adding Then callbacks) but I figure it's at a pretty good spot to share and get some feedback. I'd also like to try to figure out network communication at some point but that's probably a ways away (without some help anyway Smiley Wink).

 

I'm hosting the code at https://github.com/kgullion/LabVIEW-Promise if you are interested in checking it out or contributing!

Hi,

 

The Event Structure is able to catch the information when Windows is shutting down is the event "Application Instance Close?".

That event don't work in Linux OS. It exist a workaround in Linux with CIN code, but since CIN has been deprecated with LV 2011, the is no actual workaround.

http://digital.ni.com/public.nsf/allkb/C2470DFFFC71D47F86256F70005891C6?OpenDocument

 

When performing a single point read on an XNet session, you will receive the value of the signal that was last read, or the Default value as defined by the database if it has never been read.

 

This type of functionality is sometimes useful, but more often I'm interesting in knowing what the last reading was, if the reading is relatively recent.  The problem with the NI implementation is that you have no way of knowing (with this one session type) if the device is still broadcasting data or not.  I think a useful property might be to have a way of specifying an amount of time, that a signal's value is still valid.  If I haven't seen an update to a signal in 2 seconds for example, I can likely assume my device is no longer communicating and the reading I get back from the XNet read should return NaN.

 

I had a small discussion on this topic and posted a solution using an XY session type here, which demonstrates the functionality I am talking about.  I'd like this to be built into the API.

What I propose is to have functionality built into the XNet API that is similar to the DAQmx API.  I'd want a separate subpalette where functions like Start, and Stop logging can be invoked which will log the raw data from an XNet interface into a TDMS file.  Maybe even some other functions like forcing a new file, or forcing a new file after the current file is so old, or of a certain file size.  On buses that are heavily loaded, reading every frame, and then logging it can be use a non-trivial amount of resources, and having this built into the API would likely be more efficient.

 

XNet already has a standard for how to read and write raw frames into a TDMS file that is compatible with DIAdem, and has several shipping examples with LabVIEW to log into this format.

I propose that if an array is wired into a for loop, the tunnel should be auto-indexing by default (current behavior) UNLESS there is already an auto-indexing input tunnel in that for loop (new behavior).

 

Generally, when I wire an array into a for loop, I want an auto-indexing tunnel, so I am happy that it creates one by default. However, when I wire a second array into the same for loop and it creates another auto-indexing tunnel by default. This is usually not what I want because it will cause the loop to stop early due to one array being smaller. I'm afraid that this default behavior may cause bugs for new programmers because they may not realize to change it (in fact, this has even happened to me before). Default behavior should be the "safe" behavior. Making the decision to have more than one auto-indexing input tunnel in a loop is one that should be carefully considered, so it shouldn't happen by default, but rather should be changed explicitly by the user.

 

I know there have been many ideas posted about the current auto-indexing default behavior, but I didn't see this specific one anywhere, and I think it is an important suggestion.

LabVIEW on just looks awful. Here's a little gallery of horrors. In my opinion it makes LabVIEW looks very unprofessional. These are all taken from a "stock" LV2016 Full license, installed on Windows 7, taken from some of the windows I see all the time. This list could go on forever!

 

1.PNG

 

2.PNG

 

3.PNG

 

4.PNG

 

5.PNG

 

6.PNG

 

A lot of these problems seem to originate from using LabVIEW-style controls and indicators into its own windows and panels, which are not rendered correctly. Please save LabVIEW from itself!

I have been recently asked by NI to answer a poll about what feature I would like to see as far as data management and access and at that time, I didn't really think about mentioning something which is dearly missing in LabVIEW: cloud storage access.

The reason for this request is that increasingly, files used by collaborations cannot always be copied locally (for instance due to their size or because of frequent updates), or managing local copies and updating the central cloud repository is getting prohibitively time consuming and cumbersome.

 

There exist a few attempts in this direction (e.g. GDrive for LabVIEW, a third party skeleton of a toolkit to access Google Drive, or LabVIEW Interface for Amazon S3), but there are some glaring absent ones such as Dropbox, OneDrive, Box or iCloud to name the most popular ones.

As I mentioned before, GDrive is a starting point but is missing some basic features such as folder list, comments, etc.

I cannot comment on Amazon S3, as I don't use it.

Obviously, there is no way to predict which cloud storage solution will disappear in a few years from now or which one will pop-up tomorrow and become popular, but most of the work has been done by those vendors, who provide .NET API for their cloud solutions (maybe not Apple) or at the very least a RESTful API. These APIs could of course be made community projects (like GDrive is to some extent), but their importance would seem to justify a minimal investment from NI.

 

 

Imagine that you have made lots of code, wiring up several VI etc. all with the same data, a cluster for example, going in and out. Now you regret not having defined that wire as a typedef. Today replacing the data with a typedef will involve a lot of steps; you start by clicking on one of the controls or indicators, and create a typedef...then you need to do the tedious work of replacing all the other controls and indicators up- and downstream. 

 

Would it not be nice if you could just right-click on the wire and select "Define type"/"Create type definition" or "Replace with type def/class"  - and then choose to have the type definition automatically replace everything along the wire ("propagating type def")?

 

This idea was inspired by and first came about as a comment to this idea by cowen71.