Classes suffer from the following:
Classes are identified by their name.
Renaming a class results in a loss of identity history. The version history is reset
The name consists of the file name and all the libraries the class is nested in.
Moving a class into or out of a library counts as a rename of the class.
So what is the issue with this? Any method you use to save the class data to a file (datalog, xml, flattened string...) will contain the class name (including library position) and the version. If you move/rename the class this data will change and your externally saved class data will be unreadable.
Also using classes in packed libraries will result in the classes being renamed (lvlib-->lvlibp), but the classes will retain their version history. Still, the rename makes saved data unreadable.
I propose that we introduce a static class ID that persists through all the above operations. I'm thinking something like a Class GUID. This GUID would be created together with the class and would be read only. It would be good if Get LV Class Name.vi would return the Class GUID and if you introduced a Get LV Class Default Value By Class GUID.vi (Class must be in memory). All the operations that saves/flattens etc. and currently uses version and name should then use version, name and GUID. On load/unflatten the name would not be used at all, only the GUID and the version.
If this was implemented:
The version would never be required to be reset. As long as the GUID persists the version can remain.
Saved class data would not become corrupt upon trivial operations in the project. As it currently is you cannot move a class out of a library and restore it to the same position/name without corrupting your saved class data (unless the class version is 188.8.131.52 already).
You would get fewer complaints regarding the OOP implementation.
So there are some problems with doing this. I'll list possible solutions along with the problems:
What should be done on a rename or library relocation:
Version should be incremented retaining the old name. GUID stays the same.
What should be done on a “Save as” - “Copy”:
New GUID created for the copy. Save as will prompt you to retain version history or reset the version to 184.108.40.206 (if you can find find a way to do this), or just reset the version.
What should be done when a class is copied in internet explorer and loaded?
This is currently very very bad for labview, and thus never done.
But now we can detect that we have multiple GUIDs and a pop up should be displayed with a list of all duplicates. There should be three choices for each group of duplicates:
Retain GUID, only one can select this
Get new GUID and prompt for class rename – version history handles as in 2.1
Don't load the class and discard the operation adding it to the project.
What should be done when both a class from a packed library and the library that was packed are trying to be loaded at the same time:
They have the same GUID, prompt the user to choose which to load, only one can be loaded at any time.
What should be done with the version numbers when packing a class in a packed library:
Original has version incremented twice, all version have the same data. Example:
Original class version = 220.127.116.11
Packed class = 18.104.22.168
After Packing original is = 22.214.171.124.
The major issue with this is probably that it'll increase the overhead on all classes, right? So it doesn't have to be a GUID, but some form of uniqueness should be attributed to the class because the system is extremely inflexible in the current implementation.
Please don't propose that I implement methods on all classes that saves the private data piece by piece as a work around. If that was the intention that NI had with classes then wiring a class to a flatten/save etc. node should result in a broken wire.
I might have been overly thorough with my explanation but this is a big issue for me due to CAR543330 where the work around is reducing the size of my libraries, which is really really hard when they contain classes that are also saved to a large number of external files.
Best regards Henrik
The MathScript wrapper for MatLab is great. Well, compared to MatLab it is horrible, but it is fully built. There are two language groups that are open source (bsd, mit, etc...) and have very large user-bases who would love to interact with "Real world" objects: "R" and "Python".
There are even fair interfaces to C in the form of Cython and Rcpp, or Java in the form of Jython and Rjava, that do a fair bit of the leg-work for wrapping into a compileable paradigm.
Microsoft and their big data engagement came to the conclusion that buying Revolution Analytics (R) and allowing SQL server 2016 to natively run R internally was an excellent business idea. R is built and maintained by stats majors - it is deeper and broader (technically speaking) than any other language on the planet. A wrapper for R is a wrapper for the highest analytic sophistication scripting language around.
A number of years ago I worked as a drafter. The software that we used at the time had several features that LabVIEW might find advantageous to consider. It is also worth mentioning that some of these ideas are multiple decades old so while a copyright may exist for a particular design style, the patents (if they existed) are no longer in force. That means that you can copy the general function as NI, and copyright the design.
As I do more of this work, and more of the "I wish they had that" come to mind, I hope to append them to this thread.
I would like to make sub-vi's that look like the following:
Resistor arrays can come in multiple forms, and each form has a purpose.
<---- Resistor Array SIPP
<---- Resistor Array SOIC
There is a time and a place for each.
The VI "desktop" is at a premium for larger or more complex systems. Being able to reduce the "ink" to what is absolutely necessary can have good value. I wish that the icons could be made to be "text plus pins" without requiring artwork.
I am moving from MatLab/R to LabVIEW and the "documentation of blocks" is a challenge. I have resorted to single panes of flat sequences to group and retain relationships that define an element of function.
My goal there is entirely to partially resist the confusing effect of "clean up" on these elements of function. I can then justify and more completely describe using labels for the components and the "documentation" for the sequence chunk.
If you look at the above diagram, the wires overlap the label text. Can you make an option that allows the label text to not be obscured?
Graphs allow displaying data in linear or log scale.
This doesn't go without glitches, so my first suggestion would be fix all the annoying bugs which exist.
But a common way to get motivated to fix a bug being to implement a few feature, here is a unique opportunity:
Implement symmetric log scales (aka symlog scale) on all Graphs
What is a symlog scale, you will ask?
It is a log scale accepting negative arguments.
If x > 0, then Log(x) is computed (and labeled "x", hence the log scale apparence).
if x < 0, -Log(-x) is computer and labeled "x"
To get a visual representation of what this all mean, Google "symlog scale" and you will most likely end up on this page from which I am linking this figure:
Of course this should work on both axes (or all 3 axes for a 3D Graph).
The benefit is that when a curve has negative values, using a log scale to represent the plot results in a clipped plot. All negative values are gone, leaving gaps in the plot. The only way to visualize them is to revert to a linear scale, which now clumps all small positive values to pretty much the same location on the axis.
Tired of resizing an event structure and having to relocate the timeout constant?... Simply double-click on the hourglass and type the timeout value!
Of course, the option of wiring to the event structure timeout input should still exist. Just like the timed loop, where you can double click and set the period, etc.
LabVIEW Help is painful to use for 21st century users.
When you click on a link in a Help page, you are sent to that page, and so on and so forth,
This means that when you are done with reading the many tidbits you did not know or forgot about, you have to use the Back arrow as many times as you have progressed in your branching search:
That's so 2000 (at best)!
This problem of having a single window/tab is of course not limited to the Help application (see the countless requests for improvements of the Search and other windows) but the Help files are fundamentally HTML files, so you would expect that the amount of work for the custom browser that the Help application is using would be negligible.
My suggestion: Offer an option to "Open in New Tab" and "Open in New Window" right-click options for links in Help pages.
Or purely and simply drop the Help application and use the default browser instead.
I recently starting putting String Indicators in some of my programs that identified the Routine, along with its Version Number. I have also created Dialog Boxes with one-line Messages, usually in large size, often Bold, sometimes colored and with a colored background. I wanted to have the String indicator displaying these one-line messages "fit the text" (if the indicator was too short, the message would be truncated, and if too long, it "looked unprofessional" and wasted space). I found code on the Forum that was awkward and didn't scale with fonts -- I found a work-around, got in touch with NI to inquire about filing a CAR to fix the specific flaw in their Get Text Rect function that I discovered, but was told they were not interested ("You just need to add a constant").
After more investigation, I found an even better solution to this problem, which I have posted to the LabVIEW Community here. While this seems to work, I would like to propose that NI provide a simple Method or Property that could be used to scale the horizontal size of the contents of both the String and Path controls to just fit the content to be displayed in these controls. This Method or Property should work regardless of the other properties, such as Font Size or Font Attribute (Bold, Italic, etc.). It should also work regardless of the "family" of the control (Silver, Modern, Classic, or System). I do note that System Strings might be a problem, but I could get my code to work with the System 2.0 String indicators available on the LabVIEW Tools Network.
The figures show a Front Panel with "too small" indicators truncating the display of their (variable, and run-time-dependent) content, plus the same Front Panel after I run my "Size-to-Text" code on the indicators. I'm suggesting that NI provide a Method/Property to do the "dirty work" for me.
Notice truncation of Text and Paths
After programmatic adjustment of Indicators to "fit" their content.
When filling values into an Array constant you hae to select each element individually and enter the value.
It would be nice to hit Enter and have it move to the next element or Arrow keys to move between Array elements when the Array is highlighted.
This is from a colleague of mine when discussing simple circular buffers.
Allow the data stored in a Feedback Z-Transformation to be returned as an optional output. This simple change allows for generic circular buffers of any type. The output would be an array of Z size of the feedback's data type. This allows for very simple circular buffering of any data type with no real implementation. If you combine itis with theenable terminal you cna make it a read access only (IE on some loops I want to just access the data history without adding an element).
We have a software product where we have started working with branches and sometimes have a few different versions of the repository checked out for code implementation / testing / exploration.
It happens that I have two (or even more) versions of projects with the same name open at a time from different paths. Currently I switch to files view and back to check which version I am currently looking at and I just thought it would nbe nice to see the path of the project file int he title bar of the project window.
I know I can right.click the project, I know there are other ways to get this information but can't we have a simple indication as to the path at least SOMEWHERE in the project window?
Current OPC UA monitor function - Add Monitored Nodes.vi - will only trigger a monitor on value change.
It would be very useful to have the possibility of monitors for timestamp changes. E.g. if the same value was writtent twice I would still like to detect this.
This is also how shared variable monitoring works.
In the Configure Timed Loop Dialog Box documentation we are told that:
Period—Specifies the amount of time that elapses between two subsequent iterations of the Timed Loop. The unit of the period changes depending on the timing source you select in Source Type.
But nowhere are we explicitly told what the unit of Period is. This ought to be made explicit for each of the possible Loop Timing Source Types. I'm guessing that if I select 1 kHz Clock the unit of Period is 1 millisecond. But I shouldn't have to guess!
[note: this is a cross post from the NI Discussion Forums]
I'm still missing block highlighting of the text in LabVIEW. Wouldn't it be awesome to be able to select text by blocks not letter by letter as it works now for free labels, object labels (including sub diagram labels) and captions, text in all LV dialogs and string inputs?
Common key combo is CTRL+SHIFT with any of the arrow keys
How it works in LV?
...and in the rest of the world: