sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    [plugin] Ruby Code Editor - UPDATED to v3.0 3/4/2013

    Scheduled Pinned Locked Moved Plugins
    56 Posts 11 Posters 39.8k Views 11 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • alexschreyerA Offline
      alexschreyer Extension Creator
      last edited by

      @Dan: You are right, going with the OS styling also makes sense to keep elements looking "native" on Win and Mac.

      I wanted to go with the jQuery UI framework, though, so that a) the dialog looks exactly the same on Win and Mac and b) later I could offer different styling to users, so that they can pick their preference from a dropdown. The UI system has various nice templates:

      Link Preview Image
      ThemeRoller | jQuery UI

      jQuery UI is a curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library. Whether you're building highly interactive web applications or you just need to add a date picker to a form control, jQuery UI is the perfect choice.

      favicon

      (jqueryui.com)

      One question: I have to save some preferences (like the UI selection) locally. Can I reliably use cookies or should I go with an ini file?

      Cheers,
      Alex

      Author of "Architectural Design with SketchUp":
      http://sketchupfordesign.com/

      1 Reply Last reply Reply Quote 0
      • thomthomT Offline
        thomthom
        last edited by

        Cookies can be purged by the user or utilities that clean the browser data. Safest is to store it separately.

        Thomas Thomassen — SketchUp Monkey & Coding addict
        List of my plugins and link to the CookieWare fund

        1 Reply Last reply Reply Quote 0
        • Dan RathbunD Offline
          Dan Rathbun
          last edited by

          @thomthom said:

          Cookies can be purged by the user or utilities that clean the browser data. Safest is to store it separately.

          Agreed.

          You can use Sketchup.write_default and Sketchup.read_default to save settings in the Registry (Win32) or plist files (Mac) but they have a few disadvantages.

          Once you create a key, you cannot remove it, so they can become cluttered with old setting keys that are not used anymore.

          And they can be only 1 level of heirarchy, even though the Windows Registry supports any numbers of levels. (It's a tree structered database.) Perhaps this is a limitation of the Mac plists and Google is enforcing it on both platforms for 'sameness'?

          Also.. XP Home has a Registry limit size (I'm constantly on the edge of it and often get the Registry Limit reached Warnings. If I'd known about it I would have paid the extra and bought XP Pro.)

          Anyhow.. an ini (or any settings file,) would give you complete freedom.
          It doesn't need to be an ini format. It can be simply a ruby script that decalres a Settings Hash wrapped in your plugin namespace. Did you know that Module and Class definitions can be split up into multiple files? They can. The main file can be the functional part of the class definition, and the other can be just a Hash declaration inside the same class namespace, that gets loaded by the first (if it exists,) and gets RE-written by the first file, when changes to the settings are made.

          I'm not here much anymore.

          1 Reply Last reply Reply Quote 0
          • thomthomT Offline
            thomthom
            last edited by

            @dan rathbun said:

            Also.. XP Home has a Registry limit size (I'm constantly on the edge of it and often get the Registry Limit reached Warnings. If I'd known about it I would have paid the extra and bought XP Pro.)

            Never knew that.
            ...how much stuff you got installed? I've installed lots of random stuff on my old xp box through up the years - never had that warning.

            Thomas Thomassen — SketchUp Monkey & Coding addict
            List of my plugins and link to the CookieWare fund

            1 Reply Last reply Reply Quote 0
            • Dan RathbunD Offline
              Dan Rathbun
              last edited by

              @thomthom said:

              @dan rathbun said:

              Also.. XP Home has a Registry limit size (I'm constantly on the edge of it and often get the Registry Limit reached Warnings. If I'd known about it I would have paid the extra and bought XP Pro.)

              Never knew that.
              ...how much stuff you got installed? I've installed lots of random stuff on my old xp box through up the years - never had that warning.

              TOO much stuff! OpenOffice Suite, AutoCAD, Epson Scanner Software, Windows SDK, MS VisualStudio (w/ VB, C#, C++, SQL Server), Debugging Tools for Windows, Windows Support Tools, PowerToys for Windows XP, MS HTML Help Workshop, PCB123, AdobeReader, Paint.NET, NotePad++, SciTE, FamilyOrigins (Genealogy dBase), Google Sketchup 7.x, Google Earth. ..etc...
              (And at one time 2 full versions of MS Flight Simulator; which I uninstalled.)

              I believe I didn't get the errors until after I installed AutoCAD. I can't find the exact error message at a MS search, but did find an article dated 2007 that says the RSL (Registry Size Limit) "no longer applies" to Windows XP or Windows Server 2003. But I know I have got the error popup after that.

              @Alex: Thinking more about this. You don't need need to worry at all regarding this issue. The RSL applies only (if it even does anymore,) to the System Hive of the Registry. Sketchup settings are saved in the User Hive, which does not have (or never had) any size limit.

              I'm not here much anymore.

              1 Reply Last reply Reply Quote 0
              • Dan RathbunD Offline
                Dan Rathbun
                last edited by

                @dan rathbun said:

                Anyhow.. an ini (or any settings file,) would give you complete freedom.
                It doesn't need to be an ini format. It can be simply a ruby script that decalres a Settings Hash wrapped in your plugin namespace. ... that gets loaded by the first (if it exists,) and gets RE-written by the first file, when changes to the settings are made.

                If Js is more comfy for you, the same technique can be used but in Js. A ruby method can write out a Js script that is a JS object holding settings, or an Array of settings, or global varibales, whatever.
                The file just gets loaded with the webpage.. no complex parsing required.
                If the user makes settings changes.. you send them to a ruby callback that overwrites the settings .js file.

                Also if you wish to change CSS dynamically you'll need to assign ID attributes to the stylesheets (whether inline or loaded via LINK tag.)

                I'm not here much anymore.

                1 Reply Last reply Reply Quote 0
                • alexschreyerA Offline
                  alexschreyer Extension Creator
                  last edited by

                  Thanks for the recommendations, guys. I actually went with the easiest version (cookies) for now since I was able to implement this without hassle. I'll look at file storage later.

                  Didn't know that the registry could actually become too large. I never ran into this problem. And I have several Autodesk products installed (those are huuuge - though mostly by filesize! When will ADSK finally cut down on bloating their own software).

                  Cheers,
                  Alex

                  Author of "Architectural Design with SketchUp":
                  http://sketchupfordesign.com/

                  1 Reply Last reply Reply Quote 0
                  • D Offline
                    driven
                    last edited by

                    Hi,

                    a possibly naive question from one your target end users,

                    I'm teaching myself ruby on a mac

                    I have a very Ruby for SU text book that is in PDF format on my hard-drive, I want to access it through the reference menu on your console, (which does throw up some code errors, but still mostly works)

                    Is it possible, or could I put it on my website and read it from there (less preferable as the books not published yet)?

                    john

                    learn from the mistakes of others, you may not live long enough to make them all yourself...

                    1 Reply Last reply Reply Quote 0
                    • D Offline
                      driven
                      last edited by

                      @Dan,

                      thanks a lot for that, I went round in circles trying to get the pdf file to load using #{ENV['HOME']} but eventually just dragged the file in with out that there and it opens the doc on top of SU, but can I get it to stay on top while I use SU? I want to copy paste bits and bobs straight into ruby console.

                      john

                      #
                      #  helpmenu.rb
                      #  
                      #
                      #  Created by Dan Rathbun on 14/02/2010.
                      #  Copyright (c) 2010 @SCF. No? rights reserved.
                      #
                      
                      # helpmenu.rb for PLAT=Mac & OS=OSX
                      module SU_User
                        module Menus
                          helpmenu=UI.menu('Help')
                          helpmenu.add_separator
                          # Edit the 'Your TextBook Title' Menu Item Title below
                          # Edit the pathname to your textbook pdf file below
                          helpmenu.add_item('TextBook') { 
                            UI.openURL("file;//localhost/Users/johns_iMac/Documents/Learning_rubies/TextBook.pdf")
                          }
                          #   #{ENV['HOME']} inside a double-quoted string    ##### couldn't get  #{ENV['HOME']} to work, but just draging the pdf file into the double quotes works
                          #   should return something like; '/Users/John' on the Mac
                          #   For PC, the HOME variable must be changed to USERPROFILE
                        end # module Menus
                      end # module SU_User
                      

                      %(#004000)[So, that just open pdf in preview, but this does what I'm after a modal wd pdf, on a Mac you can work under show_modal

                      get_dialog = UI;;WebDialog.new 
                      get_dialog.show_modal
                       
                      (get_dialog.set_url "file;//localhost/Users/johns_iMac/Documents/Learning_rubies/TextBook.pdf")
                      

                      what I can't figure is how to get the help item (such a good place to put it) to trigger this??]

                      learn from the mistakes of others, you may not live long enough to make them all yourself...

                      1 Reply Last reply Reply Quote 0
                      • D Offline
                        driven
                        last edited by

                        GOT IT....

                        #
                        #  helpmenu.rb
                        #  
                        #
                        #  Created by Dan Rathbun on 14/02/2010.
                        #  Copyright (c) 2010 @SCF. No? rights reserved.
                        #
                        
                        # helpmenu.rb for PLAT=Mac & OS=OSX
                        module SU_User
                          module Menus
                            helpmenu=UI.menu('Help')
                            helpmenu.add_separator
                            # Edit the 'Your TextBook Title' Menu Item Title below
                            # Edit the pathname to your textbook pdf file below
                            helpmenu.add_item('TextBook') { get_dialog = UI;;WebDialog.new 
                        get_dialog.show_modal
                         
                        (get_dialog.set_url "file;//localhost/Users/johns_iMac/Documents/Learning_rubies/TextBook.pdf")}
                          end # module Menus
                        end # module SU_User
                        

                        Not only does pdf's I can follow Kirill tutorials inside of SU

                        learn from the mistakes of others, you may not live long enough to make them all yourself...

                        1 Reply Last reply Reply Quote 0
                        • Dan RathbunD Offline
                          Dan Rathbun
                          last edited by

                          @driven said:

                          @Dan, thanks a lot for that, I went round in circles trying to get the pdf file to load using #{ENV['HOME']} but eventually just dragged the file in with out that there and it opens the doc on top of SU, but can I get it to stay on top while I use SU? I want to copy paste bits and bobs straight into ruby console.

                          No problem!
                          Don't worry about copyright. It's so simple and really just slightly modified version of the code snippet from the API. Assigning a copyright would be like tying to patent the chemical formula H2O.

                          Apparently the UI.openURL argument requires (on the Mac,) the protocol 'file://localhost' before the HOME variable. For a trully generic loadstring (if you were to change your username,) this should work as well (all one line):
                          UI.openURL("file://localhost#{ENV['HOME']}/Documents/Learning_rubies/TextBook.pdf")
                          URLs work slightly different on PC and Mac.

                          Anyway... it was a good learning exercise for you.

                          I'm not here much anymore.

                          1 Reply Last reply Reply Quote 0
                          • D Offline
                            driven
                            last edited by

                            Thanks again Dan,

                            I'll globalise it, and do you have any objections to me posting this ruby for others, less interested in doing it themselves... I think really handy.

                            the next thing I've been attempting is to make this RubyCodeEditor to .show_modal.

                            then I can, read the text, copy paste edit in RCE and see the result in web console, without constantly changing screens.

                            any ideas where to implement that in nsnSketchupApi.rb

                            or am I in completely the wrong place EDIT: Yes , it's completely the wrong ruby, I guess that's why that doesn't work, I'm learning a at least now to dig through the right rubies...

                            john

                            learn from the mistakes of others, you may not live long enough to make them all yourself...

                            1 Reply Last reply Reply Quote 0
                            • Dan RathbunD Offline
                              Dan Rathbun
                              last edited by

                              @driven said:

                              the next thing I've been attempting is to make this RubyCodeEditor to .show_modal.

                              This is something Alex can do when he gets the User Preferences options part done. He can add an option for Mac users to check a box and then put a conditional statement in the code.

                              Some thing like:
                              if RUBY_PLATFORM.include?('darwin') %(#F0F0F0)[__]OPTIONS['MacShowModal'] ? show_modal() : show() else # it's a PC %(#F0F0F0)[__]show() end #if

                              or you can just change the show to show_modal near he end of the code (for your copy, til Alex gets to releasing his next version.)

                              I'm not here much anymore.

                              1 Reply Last reply Reply Quote 0
                              • thomthomT Offline
                                thomthom
                                last edited by

                                Except that you can't create modal webdialogs on Mac. A modal form on the Mac only makes it stay on top of SU's window - but not modal.

                                Thomas Thomassen — SketchUp Monkey & Coding addict
                                List of my plugins and link to the CookieWare fund

                                1 Reply Last reply Reply Quote 0
                                • Dan RathbunD Offline
                                  Dan Rathbun
                                  last edited by

                                  @driven said:

                                  I'll globalise it, and do you have any objections to me posting this ruby for others, less interested in doing it themselves... I think really handy.

                                  Well handy yes, but not all that 'special'. There are numerous plugins around that put help links on the menus. (One by Didier and TBD that will search all folders under Plugins and create links to any help file type, like .pdf, .txt, .chm, .hlp, .htm, etc... automatically.)

                                  There is a problem with your version. You have the new constructor inside the command block without a conditional check to only create a new instance if it has not yet been done. Repeated clicking on the menu would create extra WebDialog objects, wasting space on the stack.
                                  Either move the constructor statement before the 'helpmenu.add_item' line, or add
                                  ' get_dialog=false' before it and change the constructor inside the {} block to:
                                  ' get_dialog = UI::WebDialog.new if not get_dialog'
                                  Probably the 2nd is best, so the WebDialog object doesn't get created unless the menuitem is actually clicked.

                                  I'm not here much anymore.

                                  1 Reply Last reply Reply Quote 0
                                  • Dan RathbunD Offline
                                    Dan Rathbun
                                    last edited by

                                    @thomthom said:

                                    Except that you can't create modal webdialogs on Mac. A modal form on the Mac only makes it stay on top of SU's window - but not modal.

                                    He knows, we know. That's really what he wants... it to stay on top.

                                    I'm not here much anymore.

                                    1 Reply Last reply Reply Quote 0
                                    • Dan RathbunD Offline
                                      Dan Rathbun
                                      last edited by

                                      @dan rathbun said:

                                      Apparently the UI.openURL argument requires (on the Mac,) the protocol 'file://localhost' before the HOME variable. For a trully generic loadstring (if you were to change your username,) this should work as well (all one line):
                                      UI.openURL("file://localhost#{ENV['HOME']}/Documents/Learning_rubies/TextBook.pdf")
                                      URLs work slightly different on PC and Mac.

                                      FYI: On the PC, Windows ignores 'file://localhost/' and strips it off when it passes the path to whatever application is registered to open the filetype. If it's a .txt it will likely open in Notepad, if a .pdf it will open in Adobe Acrobat Reader, etc.

                                      I'm not here much anymore.

                                      1 Reply Last reply Reply Quote 0
                                      • D Offline
                                        driven
                                        last edited by

                                        @unknownuser said:

                                        Exactly, the Mac 'flaw' is the best feature

                                        Dan, I got this far last night and I'll have another look, with your new input in mind, but what do think??

                                        #
                                        > #  _PDF_Viewer.rb
                                        > 
                                        > #  seems to only work with adobe pdf format, but that's what safari saves pdfs to, so if it won't open, re-save from safari
                                        > #  seems to open most image files at full size so you may want smaller copies, export to mail and post to self is cheap and easy,
                                        > #  batch conversion, or graphics convertor.
                                        > 
                                        > #  helpmenue.rb Created by Dan Rathbun on 14/02/2010.
                                        > #  2010 @SCF. No? rights reserved.
                                        > 
                                        > #  modified for modal Mac usage by john@drivenupthewall.co.uk
                                        > #  show_modal works differently on PC's
                                        > #  user selected pdf + image veiwer 
                                        > #  for PLAT=Mac & OS=OSX
                                        > 
                                        > module SU_User
                                        >    module Menus
                                        > 
                                        > require "sketchup.rb"
                                        > # Check to see if the plugin is already loaded 
                                        > if not file_loaded? "_PDF_Viewer.rb" 
                                        > 
                                        > 
                                        > 
                                        > 
                                        > # where to look for it
                                        >    helpmenu=UI.menu('Help')
                                        >    helpmenu.add_separator
                                        > 
                                        > # it's name in the Help menu
                                        > 	
                                        >    helpmenu.add_item('PDF_Viewer') {
                                        >       file = UI.openpanel;
                                        >       get_dialog = UI;;WebDialog.new;
                                        >       get_dialog.show_modal;
                                        >       get_dialog.set_url(file)
                                        >    }
                                        > 	
                                        > 	
                                        >   end
                                        >     end
                                        > 
                                        > 
                                        >  file_loaded "_PDF_Viewer"
                                        > end
                                        

                                        If I move get_dialog.set_url(file) to the top will that allow multi-windows? I do get new file, iff I shut the first window

                                        chee

                                        Exactly, the Mac 'flaw' is the best feature

                                        Dan, I got this far last night and I'll have another look, with your new input in mind, but what do think??

                                        #
                                        #  _PDF_Viewer.rb
                                        
                                        #  seems to only work with adobe pdf format, but that's what safari saves pdfs to, so if it won't open, re-save from safari
                                        #  seems to open most image files at full size so you may want smaller copies, export to mail and post to self is cheap and easy,
                                        #  batch conversion, or graphics convertor.
                                        
                                        #  helpmenue.rb Created by Dan Rathbun on 14/02/2010.
                                        #  2010 @SCF. No? rights reserved.
                                        
                                        #  modified for modal Mac usage by john@drivenupthewall.co.uk
                                        #  show_modal works differently on PC's
                                        #  user selected pdf + image veiwer 
                                        #  for PLAT=Mac & OS=OSX
                                        
                                        module SU_User
                                           module Menus
                                        
                                        require "sketchup.rb"
                                        # Check to see if the plugin is already loaded 
                                        if not file_loaded? "_PDF_Viewer.rb" 
                                        
                                        
                                        
                                        
                                        # where to look for it
                                           helpmenu=UI.menu('Help')
                                           helpmenu.add_separator
                                        
                                        # it's name in the Help menu
                                        	
                                           helpmenu.add_item('PDF_Viewer') {
                                              file = UI.openpanel;
                                              get_dialog = UI;;WebDialog.new;
                                              get_dialog.show_modal;
                                              get_dialog.set_url(file)
                                           }
                                        	
                                        	
                                          end
                                            end
                                        
                                        
                                         file_loaded "_PDF_Viewer"
                                        end
                                        

                                        If I move get_dialog.set_url(file) to the top will that allow multi-windows? I do get new file, iff I shut the first window

                                        cheers
                                        john

                                        learn from the mistakes of others, you may not live long enough to make them all yourself...

                                        1 Reply Last reply Reply Quote 0
                                        • thomthomT Offline
                                          thomthom
                                          last edited by

                                          @driven said:

                                          Exactly, the Mac 'flaw' is the best feature

                                          ? It's terrible. Makes it impossible to make replacements for UI.inputbox.

                                          Thomas Thomassen — SketchUp Monkey & Coding addict
                                          List of my plugins and link to the CookieWare fund

                                          1 Reply Last reply Reply Quote 0
                                          • D Offline
                                            driven
                                            last edited by

                                            @thomthom said:

                                            ? It's terrible. Makes it impossible to make replacements for UI.inputbox.

                                            I'll more than likely agree if/when I get to that stage in coding, but being able to simply float the 'TextBook' over SU has already increased my workflow, so for now I see it as a blessing which I may curse later on...

                                            BTW: I found the your 'missing manual' page helpful, but only found it through google after I almost last-night.

                                            learn from the mistakes of others, you may not live long enough to make them all yourself...

                                            1 Reply Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 3
                                            • 2 / 3
                                            • First post
                                              Last post
                                            Buy SketchPlus
                                            Buy SUbD
                                            Buy WrapR
                                            Buy eBook
                                            Buy Modelur
                                            Buy Vertex Tools
                                            Buy SketchCuisine
                                            Buy FormFonts

                                            Advertisement