Jump to content


  • Content Count

  • Joined

  • Last visited

  • Days Won


Posts posted by hooovahh

  1. On 3/25/2020 at 8:48 AM, Neil Pate said:

    Joking aside, if I am updating that many controls that the GUI is slow to paint it is probably symptomatic of a bad GUI design.

    Well that or some really complicated stuff is happening.  Here is a UI I've been working on lately.


    It is the view of a sequence that is currently running.  On the left is a green arrow that moves to whatever step is currently being executed.  Next to this is Goto arrows showing that a step has a condition that might jump to another step.  Then there is the tree control that shows the sequence.  In it is the step name (I blocked out many) then two columns that show some settings on the step with icons, and a column for a comment on the step.  To the right is detailed information about the step that is currently selected.

    I'm welcome to have some feedback but here is how I made it.  The green arrow is in a pane by itself.  The arrow is 2D picture control constant, and the position of the control is changed but the value of the control never changes.  The set of Goto arrows is another 2D picture control.  This time it takes up the whole pane and is redrawn as needed.  Since the user can scroll the tree, this means we need to poll the scroll position (on mouse down, mouse move, wheel scroll, limit to 1 event) and if it changed redraw the arrows.  The While Loop can be collapsed and if that happens, the green arrow needs to point to it since the current step is in the loop.  In this example if the while loop is collapsed, then the Goto arrows need to be removed.  This is done by reducing that pane size to 0, making more room for the sequence tree.  The tree is set to fill the next pane.  The icons in the tree are two separate 2D picture controls (since icons can't be in multiple columns easily, and their size is 16x16).  The position and value of them are dependent on the scroll positions of the tree.  To reduce weird UI stuff when resizing, the 2D pictures must be aligned to be at the top of the tree control.  The 2D pictures aren't transparent because doing so means the Erase First option must be set, which ends up flickering when scrolling since these need to be changed on scroll, window resize, or collapsing of the while loop.  Because of not being able to be transparent, and wanting to align to the top, the 2D pictures actually contain the headers as part of their pictures.  Maybe I could have done this with another pane.  When scrolling too far right or left we want only partial column icons to be drawn so the column width is checked on scroll to ensure it looks right.  Also since the pictures aren't transparent, the blue background of an icon is separate image.  Oh and the scroll wheel works, and will mess with lots of these things.

    This mostly works well.  But as you might guess it can take some time to draw all these things, figure out where they should go, and get it looking right.  At first I had the quick and dirty of on any Mouse Move, Mouse Down, or Wheel Scroll event, just redraw everything.  This meant tons of events firing all the time doing mostly nothing, and some times flickering the screen.  So then I started looking at ways to improve it.  If there is a value change on the tree, we don't need to update the Goto arrows at all, just the icons.  Other information can be cached too to help with performance.  Maybe we could draw all Goto arrow permutations on start, and then switch between them as needed then we wouldn't have to draw them.  We would only need to move them vertically as needed.  This is the kinda thing I was talking about when I said diminishing returns.  Right now drawing that goto arrow is probably 10ms or so.  But by complicating the code we could bring it down to 1ms.  Is it necessary?  Well no but if the total time of doing things adds up to be too much we could look into that to reduce the performance.

    Oh and to add to the complicated nature of this, this is the same UI that is used to create the sequence, with dragging and dropping and moving steps around, dragging Goto arrows around, and clicking icons to perform other actions like sliding in another subpanel, or changing the icons.  In all of this, the defer panel updates is only used once, and it is on a full refresh which only happens on first load.  Everything else we just update what we need and it has been pretty responsive.

  2. 9 minutes ago, Neil Pate said:

    I have tried many different techniques but my currently preferred one is to assume upfront that I am going to use property nodes for all value updates so this then allows me to have a nice Update Sub VI where I update all the values every time I need to update anything. 

    You probably already know this, but property nodes have a larger performance hit than a local variable when just the value needs to be updated.  But if you want to update it in a subVI I get why you might use property nodes.  The alternative there is to use the Set Control Values by Index function.  You can read the indexes of the values you want to update in an initialization step, then pass on the indexes, and values you want to update.

    Of course this exercise, and this topic has diminishing returns.  I mean lets say I just update all UI elements, all the time, periodically.  The time it takes to update all of this can vary a lot based on what needs to happen but lets just say it takes 100ms which to be fair is a long time.  Will the user notice it takes a while?  Maybe.  Okay so add the defer updates and lets say it is down to 50ms.  Okay lets just update the elements that change 30ms on average due to some overhead.  Okay use Set Control Values by Index, 10ms and you've added a decent amount of complexity to the code that might not have needed it.

    So for me it usually starts with just update everything and see how it goes, then refactor as needed.  It feels like the lazy method but I've gone down the other road where I'm hyper concerned with performance and timing and I spend lots of time making the code great, but overly complicated which can make the code harder to maintain.  Various tools can help minimize these issues, but then there are potential down sides of that too.

  3. I've never seen Jeremy's presentation, some neat stuff in there for sure.  Since my demo (and another one here involving Notepad, Video here), I have cleaned up the VIs a bit with some basics like set Parent/Child relationship, get relationship, move and preposition, get/set menubar, resize status, and title bar, and a few other style functions.  This hasn't been posted publicly but is pretty basic and pulled in from other examples on the forums.  A more updated and complete Windows API could be useful.

  4. So the Pi3 can be deployed to with Linx 3.0 as you may have found.  This is an official toolkit from NI that adds the target in the project and you deploy to it like any other device, and is free.  There is no front panel or UI when running on the Pi so keep that in mind.  But the code can be deployed and set to run on startup so that it runs headless.  There is some licensing to be aware of, specifically it can't be used on any commercial applications.  NI has said that in collaboration with the LabVIEW Community Edition (free as in beer expected release in May) that the Linx toolkit is to also have some kind of new release.  The same people that make the Arduino Compiler also make a Pi Compiler which can be used for commercial applications and has the front panel running on the Pi so you can plug in a monitor and see it.

    Other than the Pi, the MyRIO is really the intended platform for students.  NI has partnered with Universities to offer a discount bringing the price of one I believe to $500.  I'm not a student so I can't see it.  But used ones on ebay pop up all the time from students who bought one for a class and no longer need it.  I picked one up for under $200.  The price of a raw Pi ($30-60) compared to the MyRIO ($500 retail) is a huge jump.  But NI justifies the price with all the stuff you get.  I mean the raw Pi doesn't even come with a case.  But the MyRIO has a real-time embedded Linus OS, an FPGA, built in Wifi, USB network, USB host, a bunch of IO, and the support of NI.  If your project needs an FPGA, and you want to program it in LabVIEW it is by far the cheapest option.  If you don't need an FPGA then it can be seen as over priced.  I'd start with the Pi3 and Linx and see what is possible.  There are lots of online videos and tutorials and the upfront cost is pretty low.

  5. Okay I'm done guessing without actual testing in the environment.  In Windows -1 on the Read From Text File, and Read From Binary File both read the whole file.  I feel like there is a bug or two found in this thread.

  6. 2 hours ago, ShaunR said:

    OK. Got hold of my Linux Box with LabVIEW. Wire a number of bytes to the "Count" (1024?). Ignore the error 4 if you demand too many.

    Oh yeah, just wire a -1 and you get the whole file.  I always forget that.

  7. Permissions might prevent the reading of the file.  If you do a Open File maybe even set to read only then read the file you might have better luck.  Also calling a system exec and reading the standard output might work as well.

  8. Neat idea editing the control itself.  But that solution is only going to work if you don't mind having no control over the GIF and don't mind looping, and if you don't need to update the GIF at runtime based on an existing file.  The demo I showed saved the GIF as a constant in the block diagram because it is faster, but I have some disabled diagram code that will instead read the GIF from a file.  It then will play the first half of the GIF, then wait for the saving to finish (random number) then play the second half.  Is there a site where simple animations like this can be used for free?  Also back saved to 2016.

    2016 Save Demo.zip

  9. I get your point of the multi menu setting isn't very quick to change.  That being said I sometimes mess around with conditional outputs, and with arrays I might be concatenating, or conditionally concatenating, or indexing, or last value, or conditionally last value.  And I just think cycling through all 6 possible combinations would be more annoying than a couple right clicks.

  10. On 1/9/2020 at 12:42 PM, X___ said:

    Not that I could care less, but VIM, which were introduced in ODG (old gen) are challenged by them 

    You can call the non-NXG LabVIEW IDE what you'd like since NI just refers to it as "LabVIEW" but the designator I've seen most commonly used is Current Gen (CG).  But maybe ODG would be better since, well some day it won't be current gen...unless NXG is always going to be coming next.

    Anyway I hate units too and have left them behind.  I feel bad for those that do use them as it is an official real documented feature of LabVIEW, but just has too many places it doesn't work as expected.  It's a feature I feel like the majority of NI and LabVIEW users have forgotten about.

  11. Over on reddit someone asked for suggestions on how to make a sliding UI like you might find on your phone.  I thought it was a fun challenge so here is my very rough draft that could probably be turned into a QControl.  And a video.  At the moment you can only change the settings of booleans and of a selection like the days of the week I show.  I planned on putting code for handling string and numeric value changes but probably spent too much time on this already.



    Android Sliding UI Demo.zip

    • Like 1
  12. I thought this was an interesting exercise so here is my attempt.  OpenG has some image tools and one of them is the ability to open a GIF, but for some reason it crapped out and died with your GIF even after resaving it to something much smaller.  I did find some other GIF API over on the dark side and instead used that.  Attached is a zip, extract it and run Demo Saving Button.  It will show the first image.  Then when you click the image it cycles through the first half of the GIF and waits for the simulated save process to complete.  Once it is complete it rotates through the second half of the images, and then after a few seconds returns back to the first.  Parsing of the GIF takes time so I put in the GIF images as a constant, along with the code to parse the GIF.  I also set the pane to be the color of the (0,0) pixel in the hopes it will blend in better.  Honestly this could be turned into a QControl and be made very seemless.

    Demo Saving Button Gif.zip

    • Like 2
  13. Okay I edited the spec file to start with the following:

    [Package Name]
    Display Name="OpenG LabVIEW ZIP Library"

    Then I zipped the source back up and renamed the zip to oglib_lvzip-4.2.0-1.ogp.  I then installed the package and it didn't say "Upgrade" but instead said "Install".  But after installing there was only one entry and the result was the upgrade was successful.

  14. Thanks, good to know.  I took your 4.1.0 release (maybe it was b2?) and edited it to make a package that was considered an upgrade.  I thought the changes I made were to the displayed name and version.  But now that I try to do the same with the 4.2 release in this thread I can't make it work.  I keep copying more stuff from the existing spec to the new one and it isn't working...I'll keep playing around and let you know if I get anything conclusive.

  15. As always, thank you very much for this continuation.  Inflate/Deflate on Linux RT is important for a side project I have lately so this is awesome.  I did notice that in VIPM if I open your package and already have the previous OpenG zip package installed, it doesn't do an upgrade but instead performs a new install.  It appears that the internal name of the package, or versioning changed in a way that VIPM doesn't recognize it as a new version and will install it along side the last official release of OpenG which I think was 4.0.  I was able to edit the OGP spec file and create a package that convinced VIPM that it was an upgrade.  I was curious if this was intentional to distinguish it from the official releases.

    Oh it seems the old package name was "OpenG LabVIEW ZIP Library", while the new one is "OpenG ZIP Library", I think this combined with some version changing is what I needed to edit.

  16. 13 hours ago, bjustice said:

    Thanks Hooovahh, I've used your TDMS concatenate VIs in a few places.  Really convenient to see this wrapped in a VIPM with a few other tools.  Will install this right alongside Hooovahh arrays

    The VIM Array package is a dependency, and actually included in this VIPC release.  It was just easier for me as a developer than trying to remove the dependency, and easier for you guys if everything is in one file.

  • Create New...

Important Information

By using this site, you agree to our Terms of Use.