LabVIEW Idea Exchange

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

The goal of this idea is to make it easy for the LabVIEW ecosystem to create reusable libraries for LabVIEW that would be type independent. Let's think for a second dictionaries, also called as key-value stores. Dictionaries are data structures that allow storing and retrieving values with a specific key. To create a generic reusable strongly typed dictionary is currently impossible with the LabVIEW type system. One can create a dictionary that is type specific but then it's not reusable. Or one can create a reusable dictionary but then it's not strongly typed. Type Parameters and Parametrized Generic Types as explained in this idea would allow creating strongly typed dictionaries that are widely reusable across applications. Specifically type parameters and parametrized generic types would allow LabVIEW ecosystem to develop highly reusable strongly typed components to solve various common programming problems. This would allow National Instruments to put more focus on the core of the language as the LabVIEW ecosystem could solve much wider range of problems that preivously have required National Instruments to contribute.

 

Add a new control type Type Parameter to LabVIEW that augments the current Control, Type Def and Strict Type Def control types. The Type Parameter type would act like a regular Type Def control with one special and important distinction. You could wire anything to an input terminal expecting a specific Type Parameter type and the downstream type would adapt at compile time to the type wired to the type parameter input.

Type Parameter Definition

 

In a single VI type parameter could be used in multiple places but all instances of the type parameter would adapt to the same type.

 

Type Parameters

 

When a VI that uses Type Parameters in the front panel is used on a block diagram, the template VI is replaced by the compiler by a type specific instance that has adapted the type parameters to the type wired to the Type Parameter input. Notice below how in our VI the control and the indicator were of type Type Parameter with a default type of DBL and the instance got adapted to type U32 that was wired to the input.

Calling a VI with Type Parameter Inputs

The same type parameter could be used on multiple inputs of a VI.

Multiple Inputs of The Same Type Parameter

And all of the type parameters would adapt to the same type when the VI is being used.

Calling a VI with Multiple Type Parameter Inputs of the Same Type

Note that in the above example we chose the element of the array to be a specific type specified by a type parameter. However the arrays themselves could as well have been specified by a type parameter.

 

So far we have focused on VI boundary where type parameters adapt the whole VI to specific type or types if multiple different type parameters are being used in the connector pane of the VI. Type parameters can also be used in composite types (e.g. arrays, clusters, classes) and the downstream composite types would adapt to what is wired to the type parameter input.

 

Type Parameters with a Cluster

Note that x and y as instances of the same type parameter have to be of the same or compatible type.

Type Error With Type Parameters

 

Type parameters can also be used in class private data to create parameterized custom types. This is where type parameters become extremely powerful. Let's assume that we have a class 3D Vector.lvclass that has three instances of a "Data Element.ctl" Type Parameters. The default type of the Data Element is set to be DBL. The cluster private data has three instances of the Data Element, one for each of X, Y and Z.

Type Parameters in Class Private DAta

 

Now we could create a Create 3D Vector method VI for this class that allows us to construct type parametrized instance of the class type.

Creating a Type Parametrized Object

Now calling this Create 3D Vector.vi with string as the inputs for type parametrized inputs X, Y and Z will create an instance of class 3D Vector with compile time type 3D Vector[String].

Calling a VI that Creates a Type Parametrized Object

 

And this is where we now start seeing the superpowers of type parameters and parametrized types as well as generic type parameterized VIs that go along with them. Now we have a capability of creating custom VIs and custom types that both can adapt to different parameter types at usage time.

 

Let's get back to the question of dictionaries. We could easily construct a dictionary that allows the key type to be parametrized with one parameter and the value type to be parametrized with another parameter. For example we could use the dictionary with I32s as keys and Strings as values. Or we could use it with Strings as keys and File Paths as values. Constructor for such custom type would be trivial to create.

Type Parametrized Create Method for a Dictionary

 

Once we have constructed the dictionary we would naturally like to use it. We could now use method VIs of the Dictionary class to add and fetch elements from the dictionary. As an example Get Element By Key would look something like this in it's simplest form.

 

Get Element From Dictionary

 

 

Note that Dictionary In is type parametrized with two different type parameters Key Type and Value Type. In the class library there is a Type Parameter control Key Type.ctl and Value Type.ctl. Now type parameter Key Type.ctl is used both inside the private data of the class and on the fron panel as the Key input, the type of these two must be the same. The same is true for the Value Type element of private data and the Value indicator that both derive from Value Type.ctl type parameter. The has function is any function that can convert any LabVIEW types to some strings that we can use as keys for the variant attribute node. We are using variant attributes as the store implementation is this basic example.

 

Calling the Dictionary with integer as the type parameter and string as the value would look something like this.

 

Calling a Type Parametrized Dictionary

 

As you can see the 0 and empty string will define propagate as type parameter types for Key Type and Value Type in the dictionary wire. Now Add Element.vi would have to adapt to these elections for Key Type and Value Type the moment the Dictionary wire is connected. The Key input immediately change to type INT32 and the Value input to type String. Similar would be true if the wires would be connected in reverse order. Connecting University of Texas string to the Value input of Add Element and connecting number 1 of type INT32 to the Key input of the Add Element would immediately adapt the Dictionary in and Dictionary out inputs to be of type Dictionary[Key Type = INT32, Value Type = String]. A type error would occur if Dictionary in would be of different type.

 

Type Parametrized Generic Types are an extremely powerful concept to incldue in a language and this idea describes a feasible way to implement them in a visual dataflow model of LabVIEW. This is and has been for maybe ten years my absolute #1 feature I have wanted to see in LabVIEW. I think the time is right for me to officially make this request. Ideally Type Parameters can be bounded but that's a topic for a whole other idea post.

The Property class, which represents the property node, has a property called All Supported Properties which ideally would show all the properties supported by the class the property node is linked to.

 

The problem is that it doesn't. If you have nested properties which come from another class (for example, the properties for the caption which can be selected by opening the pull right menu, as seen in the top image), those properties aren't returned when you call the property, and instead you just get the property for the caption reference, as seen in the bottom image, where the ControlIndex property is shown immediately after the Caption property.

 

NestedProps.png

 

 

Instead, I want either this property or a new property to return all of the nested properties as well, just like you get in the UI.

This would be useful for setting properties using scripting and alternate UIs (like this one or this one, which can't work today, because they can't get the full list of properties).

 

 

 

[Cross-posted here on the JKI blog]

 

One LabVIEW feature that (if it existed) would make a big difference for VIPM users is the ability to refresh the menus (e.g., the FileTools, and Help menus) programmatically after installing packages that add menu-launch VIs.  Maybe we could do this if LabVIEW added a new VI server method called Application:Refresh Menus.

Note: this would be similar to how we can refresh the palette menus programmatically by invoking theApplication:Refresh Palettes method (shown below).


refresh-palettes

 

I bring this up, because one feature that I’d love to see added to VIPM (some day) is an easier way to build menu-launch tools into VI Packages, and I’m sure more people would be asking us why their add-on doesn’t show up in LabVIEW after it’s installed.

Hopefully, we can help NI get this feature onto the LabVIEW roadmap by convincing them that it’s worthwhile.

Hi,

 

It would be awesome if there was an option in project window to set if the method is contained within a .lvclass file or ouside of the .lvclass next to it in the folder.

 

Now it's like this:

HowItsNow.png

 

It's hard to use a class like that in a plugin architecture with VIs on the outside. Lets put everything together inside like a LabVIEW LLB!

 

How it should be:

HowItShouldBe.png

 

Don't get me started on Packed Project Libraries 😉 We just need LLB functionality, for the class to behave like a folder and we are happy 🙂

 

Piotr

Title says it all really.

 

Openoffice is cross-platform and free.  All good points.

 

Please?

 

Shane.

With LINQ (Language-Integrated Query) becoming increasing prevolant in .Net programming, more and more classes are using <T> Generics.

Unfortunately, LabVIEW does not support Generics, which limits the Methods and Classes available when importing .Net Dll's.

 

Take the following code:

 

namespace GenericsTest

{

   public class GenericList<T>

      {

      void Add(T input) { }

      }

 

   public class NonGenericList

      {

      void AddNoT() { }

      }

 

   class TestGenericList

      {

      private class ExampleClass { }

      static void Main()

            {

         // Declare a list of type int.

         GenericList<int> list1 = new GenericList<int>();

         // Declare a list of type string.

         GenericList<string> list2 = new GenericList<string>();

         // Declare a list of type ExampleClass.

         GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();

            }

      }

}

 

When importing this to LabVIEW

 

GenClass.PNG

 

Notice that I can only see the "NonGenericList" Class as LabVIEW fails to destruct the "GenericList" Class.

One solution to this problem may to treat generics as Method/Constructor inputs, allowing the developed to choose the Generic Type.

When you’re making a By Reference LabVIEW Object using a Data Value References (DVRs) the user of your class would need to embed each Dynamic Dispatching VI inside an In Place Element Structure (IPE). Or you have to create wrapper VI for each method but this undermines the advantages of LVOOP Inheritance.
 
The idea is that a DVR containing a LabVIEW Object wired to a Dynamic Dispatching Terminal is equal to calling the Method VI inside the IPE structure like illustrated below.

DVR DynamicDispatch.PNG

Message Edited by Support on 01-15-2010 04:39 PM

Current methods for the LabVIEW Project that exist as Right Click Popup Menus are not exposed via VI Server/Scripting.

However, these methods would be very handy to call programmatically. 

 

I say, if we can Right Click Popup on it, then we should be able to script it!

NXG needs an Idea Exchange.  The feedback button is a lame excuse for a replacement.  Why?

 

  • I can't tell if my idea has been suggested before.  (And maybe someone else's suggestion is BETTER and I want to sign onto it, instead.)
  • NI has to slog through bunches of similar feedback submissions to determine whether or not they are the same thing.
  • Many ideas start out as unfocused concepts that are honed razor sharp by the community.
  • This is an open loop feedback system.

Let's make an Idea Exchange for NXG!

Having a continuous integration system is an essential component of software development:

Continuous Integration ProcessContinuous Integration Process

This system requires automating the building process.

The LabVIEW development environment unfortunately does not have built-in tools to achieve this easily.

But the community has supplied a few sollutions to achieve this: CLI Tool

 

On of the biggest hurdles that yet remain, is the fact that the application builder is inherently tied to the development environment.

This requires a valid license for the environment and all toolkits / technologies used in the source code of the product you intend to build.

 

My proposal would be to have a special "CI" license in which all required modules and toolkits are activated, and that would allow the development environment to launch in some sort of protected mode that prevents users from actively developping code (while still allowing scripting functions), for the sole purpose of building applications.

There have been several ideas proposed to alleviate accidentally savings vis in the wrong version of LabVIEW. While useful, I think the main problem is that LabVIEW doesn't use the information it reads from the file to preserve compatibility. I'd like to propose here that LabVIEW introduce compatibility modes for previous releases in which LabVIEW will break a VI if a feature is introduced that isn't supported by the compatibility version. It will essentially be a built-in, seamless "save for previous" mode. 

 

By default, LabVIEW will load a VI (hierarchy) in a compatibility mode for whichever version is was saved in. If the user tries to make a change that isn't compatible, LabVIEW will alert the user and the user can tell LabVIEW whether it's ok to save to a newer version that supports the feature.

 

The level of alerts can be configurable, of course.

 

Related ideas:

Version-aware LabVIEW launcher

Add header to LabVIEW file to contain the version of LabVIEW

Display VI version in title bar

Version independent Source Code Saves

Currently it's only possible to have drag and drop events for files on a path control.

 

It would be usefull if we could have drag and drop events for files on any control.

This way simpler GUI can be build with a very nice user experience.

 

Ton

NI LabVIEW allows VIs with invalid characters such as "?" in the filename inside an LLB file as shown below:

LLB.png

 

However when it comes to building a Source Distribution / TestStand Deployment that uses this file it returns an error as shown below:

Build Error.png

 

This inconsistency within LabVIEW is quite frustrating where one part allows invalid characters in the filename and another part will return an error. Since the invalid characters are allowed in VI filenames within LLB files I would suggest that the LabVIEW build tools also handle them graciously.

 

During the build process it could quite easily rename the file "pi40iv Can Connect Channel?.vi" to "pi40iv Can Connect Channel_.vi"  and link the VIs that use it to the newly renamed file. The build tools already contain the ability to rename files by adding prefixes so something like this would not be that difficult.

 

While people may argue to just rename the filename within the LLB and be done with it, the fact that the LLB is a perfectly valid file in the Development Environment but causes problems when trying to do a build is a problem that should be rectified.

 

The LLB in question is one that is not developed by us but is part of a Pickering Driver Installation obtained from the following location:

http://downloads.pickeringtest.info/downloads/drivers/IVI/

Therefore every time we install a new version of the driver we would need to rename the VI filename within the LLB file.

You can right-click on a While Loop and select "Replace with For Loop", and vice-versa:

 

loops.png

 

Neither of these operations is currently available in VI Scripting. If they were, Quick Drop and other G-based editor features could benefit.

One practice which is increasingly debated in the community is the packaging of code for distribution and collaboration, and which tools to use.

 

I suggest that NI should define and maintain an open standard for distributing packages of LabVIEW artefacts (.vi,  .lvclass etc).

And include a frontend to this in LabVIEW. This package manager should handle dependencies between packages and across LabVIEW versions and targets. The typical use cases would be:

  • The distribution (online or shipped with labview) of:
    • NI examples
    • NI drivers
    • NI toolkits
  • The distribution of third party species of the above

There should also be an API so that applications can use this mechanism to be modular and extensible. 

 

Cheers,

/MArcus

 

 

I suggest NI include a native feature to serialize LabVIEW objects in an interchangeable form.  (Alternatively, NI can at least provide enough access to allow a third party to develop such a framework.)

 

By "interchangeable" I mean in a manner that allows sharing object data between platforms (e.g., between LabVIEW and Java).  (Hence having "default data" without specifying the values of the default data is not allowed.)  Moreover, using a more common format (such as "Simple XML") is appropriate.

 

Of course, including the object version number is only meaningful within LabVIEW, but this is useful within LabVIEW thanks to the capability of LabVIEW objects to translate between versions.  (Note: I recognize the versioning can't avoid all possible issues, but in practice I think that is rarely a practical issue.)

 

I understand that for security reasons a developer may want to turn off the ability to serialize an object.  To support that, I envision a checkbox to allow serialization (default = True) in the class properties dialog.

 

I think XML is the best option for this for several reasons:

1) It is a common way to serialize objects in different environments.  This means that I can exchange serialized data with Java applications, for example.

2) It is readable, albeit not easily readable, by human beings.  (I actually don't want humans to read serialized data very often--and really never the operator, but it is good that they can on the rare occasion when they need to do so.)


Why I think NI should implement this:

1) This is relatively straightforward for NI to do since NI can already serialize a class to the current (noninterchangeable) LabVIEW XML format.

2) Having this capability could greatly expand the application space of LabVIEW, since it would make it orders of magnitude easier to interface with nonLabVIEW applications.  This is especially important in large systems, in which it may be advantageous to implement some system components in one environment and other components in another environment.  This is, I think, by far the most compelling reason to include this feature.

3) That there is a need for this seems obvious, given the number of lengthy discussions just on LAVA about this topic.

4) The current situation, in which each class must contain specific code for serialization, is patently inefficient and nonsensical.

5) In other major languages meaningful object serialization is a given, and LabVIEW should include (indeed, must include) this functionality to be competitive.


For the record, to serialize LabVIEW object data for communication within LabVIEW we use either the methods to flatten to string or to XML, and this works fine.  I realize it's not theoretically 100% fool-proof, because of potential issues across different object versions, but in practice we use version control, so that we build applications using the same versions of interface code (usually), and we only have one large system, so we can pretty easily control our deployed applications.   (I think that versioning an application could achieve the same.)  In practice, we've never experienced a version problem with this approach, and it avoids having to write any class-specific code (which, again, a developer should definitely not have to do) to support serialization.

With the advent of scripting, it is possible to create some nifty tools to aid in code writing.  Those that work on individual elements of the FP or BD can often work nicely in Quick Drop or the Right-Click Framework.  Some of these tools however, work most naturally as an addition to to Tools menu.  The missing piece of the puzzle for seamless integration into the IDE is the ability to customize keyboard shortcuts for those additions.  I would simply like the ability to assign keyboard shortcuts to any item which appears in the Tools menu.  I have at least three things in there already more worthy of Ctrl-t.

If you are using TCP to communicate to a different code environment, you may want to set some of the socket options. For example, for responsive control, you will want to disable Nagle's algorithm. There is currently no obvious or easy way to do this. TCP Get Raw Net Object.vi in <vi.lib>\utility\tcp.llb will provide the raw socket ID, but you then need to call setsockopt() on your particular platform using the call library node. You can do this with the code provide here. A much better way would be adding a property node to the TCP reference that allowed you to set and query the options directly.

Invoke nodes can have lots of optional arguments, resulting in their taking up a lot of vertical space.  I would like to recommend that the arguments portion of Invoke nodes be resizeable, allowing the developer to select the optional arguments to be displayed on the block diagram and, hence, have more control over the layout of the block diagram.

 

Consider the Save-As Invoke node from Microsoft Word:

 

Current Microsoft Word Save-As Invoke Node

 

which gets longer with each new version of Word.

 

Now imagine being able to show just the optional arguments that are needed:

 

Just the Optional Arguments that are Needed

 

And, as an added bonus, this Invoke node would not break when the VI is opened in a development environment that has a different version of Word with the same exposed optional arguments.

Idea:

Create a free, stripped down edition of LabVIEW for general purpose programming (GPP). Let's call this hypothetical edition "LabVIEW Lite". By GPP, I mean programming tasks that have nothing to do with data acquisition, test, or measurement- tasks such as creating generic PC, mobile, and web applications. Former text-based programmers would flock en mass to LabVIEW Lite for GPP use cases if a free, stripped down IDE were available. Imagine the recent popularity of the Eclipse IDE and Java, only with LabVIEW Lite and G!   

 

Rationale:

  • LabVIEW Lite would exponentially promote the paradigm of graphical system design.
  • Few (if any) structural dataflow languages are available for GPP.
  • Structured dataflow languages are insanely cool! Inherent parallelism, increased productivity, and hierarchical system design are only a couple of reasons. These are things other GPP programming languages can't offer.
  • 16, 32, 64, ... core consumer devices are coming! LabVIEW is poised to exploit parallelism in a way that is hopelessly messy with text-based languages.
  • GPP use cases of LabVIEW Lite would spark user ideas for many non-GPP use cases, for which NI would receive full LabVIEW and NI hardware sales.

 

Implementation:

  • No measurement/test/data acquisition VIs or tools.
  • No FPGA tools.
  • Application (exe, dll) builder for stripped down applications.
  • The LabVIEW IDE we all know and love.
  • Primitive types, clusters, structures, loops, file i/o, etc. provided.

 

I think it's a shame that programmers today aren't using G! What do you think?