Sparkette Posted January 16, 2013 Report Share Posted January 16, 2013 (edited) I found a bug that's reproducible using VI scripting. I was trying to programmatically place the entire contents of a VI onto a block diagram given the diagram's refnum, hoping it would help me make XNodes. (It's important to note that this bug does not involve XNodes at all, as if it did, I'd write it off as one of the reasons they weren't really released.) First, here's the code I used--notice that all the property/invoke nodes are cyan or yellow, not brown! Drop that into a new VI, and then put any old VI in the VI reference node. It should be one with at least some controls/indicators, so don't just create a blank VI.Now run the VI. A new front panel window with the same controls as the reference VI should open, but the block diagram will be empty. Double-clicking on one of the controls to jump to its respective terminal just opens the blank diagram. Just for the hell of it, I looked in Heap Peek, and no Front Panel Terminals were listed. Finally, duplicate one of the controls and click Run Continuously. LabVIEW will crash. Edited January 16, 2013 by flarn2006 Quote Link to comment
Yair Posted January 16, 2013 Report Share Posted January 16, 2013 Scripting has a lot of these holes. The fact that it is official now does not mean it is fully debugged. In this case, I don't think the Top Level Diagram should implement the Move method, as moving a diagram doesn't seem to make too much sense. Quote Link to comment
Sparkette Posted January 16, 2013 Author Report Share Posted January 16, 2013 Scripting has a lot of these holes. The fact that it is official now does not mean it is fully debugged. In this case, I don't think the Top Level Diagram should implement the Move method, as moving a diagram doesn't seem to make too much sense. I thought maybe it would move/copy the entire contents of the diagram. Anyone know how I can do that? Keep in mind that all I have is the refnum for the diagram to put it in, since I'd like to use this in an XNode's GenerateCode ability VI. Quote Link to comment
Yair Posted January 16, 2013 Report Share Posted January 16, 2013 Well, I don't have that much practical experience with scripting and I don't have LV in front of me, so excluding some proper method which may exist, here are a few quick ideas: Make Selection on all objects[] of the diagram, then copy and paste. I believe this won't work if the VI isn't idle. Enclose the content in a sequence structure, then move the structure and remove it. Use a VIT. This is simpler in that you have a starting point without requiring any code, but it won't work if you already have an existing VI you want to put the code into. Quote Link to comment
Rolf Kalbermatter Posted January 16, 2013 Report Share Posted January 16, 2013 I thought maybe it would move/copy the entire contents of the diagram. Anyone know how I can do that? Keep in mind that all I have is the refnum for the diagram to put it in, since I'd like to use this in an XNode's GenerateCode ability VI. - Move is as the name says not meant to copy code around for one thing. - Also you make the mistake to try to copy a TopLevelDiagram into another TopLevelDiagram. For one thing a diagram can NOT contain a diagram but instead is an internal property of some other object, such as a VI or a loop, case or sequence structure. - Please also notice that there is in fact a difference between a TopLevelDiagram and a Diagram(Section) you can for instance get from a loop or for every case in a case structure. They are similar but not the same, since they are owned by two very different objects, as VIs existed before there was a proper object hierarchy in LabVIEW. For another thing I would believe it is there to move nodes around to another part of the same VI, not copy it to an entirely different VI. Clarification: objects existed in LabVIEW from at least version 2.0 internally and were used extensively despite LabVIEW having been programmed in standard C exclusively back then (all the C++ compilers back then were not up to the task of compiling a code base like LabVIEW without bugs and horrible performance of the resulting executable), but that object hierarchy was not exposed anywhere, and was not fully formalized, as C has no means to enforce any object hierarchy formalization and all had to be done by hand and agreement between developers. The first versions of VI Server around LabVIEW 4.0 only allowed access on VI level, and only around 5.0 was the VI server interface to the object hierarchy of frontpanel objects added and around 6.0 extended with what we know as scripting interface now. Quote Link to comment
Popular Post ShaunR Posted January 16, 2013 Popular Post Report Share Posted January 16, 2013 And just in case you were thinking it . You won't be able to use scripting to "peek" inside a password protected diagram. 3 Quote Link to comment
Sparkette Posted January 16, 2013 Author Report Share Posted January 16, 2013 (edited) And just in case you were thinking it . You won't be able to use scripting to "peek" inside a password protected diagram. Don't worry, I already have a better way to do that, as you know. Also, what makes you think it's not for copying to another VI? If so, there wouldn't be an Owner parameter that does that. (Though come to think of it, it could be more for putting things in structures and stuff like that.) All I'd like to do though is make a subVI that can be placed in an Xnode GenerateCode VI, which will duplicate the contents of a template VI and hook up some terminals. That way I can program the Xnode's generated code just like I would if I was writing a regular subVI. It's a shame Generic VIs are so problematic. Edited January 16, 2013 by flarn2006 Quote Link to comment
Darin Posted January 16, 2013 Report Share Posted January 16, 2013 I usually create a new subvi on the diagram using a path to the template. SubVIs then have a method to place their contents. I am on my phone so this is from memory. Quote Link to comment
Sparkette Posted January 16, 2013 Author Report Share Posted January 16, 2013 (edited) I usually create a new subvi on the diagram using a path to the template. SubVIs then have a method to place their contents. I am on my phone so this is from memory. That's actually a good idea, and I'm surprised I hadn't thought of it. I'll give it a try and post if anything goes wrong (which wouldn't be a surprise since I'm working with Xnodes.) Edited January 16, 2013 by flarn2006 Quote Link to comment
Sparkette Posted January 16, 2013 Author Report Share Posted January 16, 2013 That's actually a good idea, and I'm surprised I hadn't thought of it. I'll give it a try and post if anything goes wrong (which wouldn't be a surprise since I'm working with Xnodes.) Worked great! Though I wish it was easier to get adaptive terminals to work. Quote Link to comment
Sparkette Posted January 17, 2013 Author Report Share Posted January 17, 2013 D'oh! Sorry for the triple post, but I remember now that that's why I wanted to place the contents of the VI rather than embedding it as a subVI. (I knew there was a reason.) That way the adaptive terminals would work correctly, and I could program my code template VI as I would if I was writing a generic VI, but it wouldn't be as dangerous. Anyone know how to do this? And yes, I am aware this thread has gone off topic somewhat. Quote Link to comment
Darin Posted January 17, 2013 Report Share Posted January 17, 2013 Did you invoke the Inline method? Quote Link to comment
Sparkette Posted January 17, 2013 Author Report Share Posted January 17, 2013 Did you invoke the Inline method? I can't seem to find that method; where is it? And what does it do exactly? Quote Link to comment
Rolf Kalbermatter Posted January 17, 2013 Report Share Posted January 17, 2013 D'oh! Sorry for the triple post, but I remember now that that's why I wanted to place the contents of the VI rather than embedding it as a subVI. (I knew there was a reason.) That way the adaptive terminals would work correctly, and I could program my code template VI as I would if I was writing a generic VI, but it wouldn't be as dangerous. Anyone know how to do this? And yes, I am aware this thread has gone off topic somewhat. The way I did this in the past is enumerating the entire contents of the diagram recursively, place everything into a selection, copy it to the clipboard, then pasting it from there into the new VI. Quite involved, and very easy to forget something, so if you do not need this to work with ancient LabVIEW versions, I would look for the Inline method, Darin mentions. Sorry I wouldn't know where it is as I haven't used that so far, but I assume it would be only in recent versions. Quote Link to comment
GregSands Posted January 17, 2013 Report Share Posted January 17, 2013 Have you already looked at Gavin Burnell's Scripting Tools on the LAVA Code Repository? It has a number of routines that are really useful for creating XNodes, including "Copy and Wire Tagged Element" which is almost exactly what you're looking for - often, GenerateCode can simply be a call to this VI. Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.