sketchucation logo sketchucation
    • Login
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    🛣️ Road Profile Builder | Generate roads, curbs and pavements easily Download

    Suggestion for code - Minimize (rollup) Outliner

    Scheduled Pinned Locked Moved Developers' Forum
    11 Posts 7 Posters 2.4k Views 7 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.
    • J Offline
      Jim
      last edited by

      That's a good suggestion, John.

      I tried a quick experiment. It is possible to shade the Outliner from Ruby, but I don't see a way to tell if it is currently open. Anyone have an idea about that?

      Note that the Ruby API in SketchUp 7 has changed to address this issue. The change is in the start_operation method:

      SU 6:

      
      Sketchup.active_model.start_operation("Create a zillion faces")
      
      

      versus SU 7:

      
      Sketchup.active_model.start_operation("Create a zillion faces", true)
      
      

      Hi

      1 Reply Last reply Reply Quote 0
      • C Offline
        CPhillips
        last edited by

        I wrote this up a while ago. I am pretty sure I sent it to you Jim...

        def toggleRollUp(name)
            findWindow = Win32API.new("user32.dll", "FindWindow", ['P','P'], 'N')
            pw=findWindow.call(0,name)
           
            sendMessage = Win32API.new("user32.dll", "SendMessage", ['N','N','N','P'], 'N')
           
            sendMessage.call (pw,0x00a1,2,"")#WM_NCLBUTTONDOWN
            sendMessage.call(pw,0x0202,0,"")#WM_LBUTTONUP
        end
        def isRolledUp(name)
            findWindow = Win32API.new("user32.dll", "FindWindow", ['P','P'], 'N')
            getWindowRect= Win32API.new("user32.dll", "GetWindowRect",['P','PP'], 'N')
            pw=findWindow.call(0,name) 
        
            data=Array.new.fill(0.chr,0..4*4).join
            getWindowRect.call (pw,data);
            rect=data.unpack("i*")
                #if window height is less than 90 then the window is rolledup
            return (rect[3]-rect[1])<90
        end
        
        1 Reply Last reply Reply Quote 0
        • K Offline
          kwistenbiebel
          last edited by

          Wow, this is an excellent idea.

          The outliner is a fantastic tool when editing.
          But it is indeed a pain in the ass when you got it open while using heavy scripts.

          This (future) script might save me a headache 😄

          1 Reply Last reply Reply Quote 0
          • J Offline
            Jim
            last edited by

            You would still need to add it every existing script you want to use it in.

            Hi

            1 Reply Last reply Reply Quote 0
            • JClementsJ Offline
              JClements
              last edited by

              Jim F:

              So if CPhillips' code can be stored as a .rb and is given a name like "Outliner_Rollup.rb" and it is located in the SU/Plugins directory, what code would need to be inserted into a script to call Outliner_Rollup.rb and where should it be placed relative to the existing code?

              John

              John | Illustrator | Beaverton, Oregon

              1 Reply Last reply Reply Quote 0
              • C Offline
                CPhillips
                last edited by

                @jclements said:

                Jim F:

                So if CPhillips' code can be stored as a .rb and is given a name like "Outliner_Rollup.rb" and it is located in the SU/Plugins directory, what code would need to be inserted into a script to call Outliner_Rollup.rb and where should it be placed relative to the existing code?

                John

                I added hideOutliner() and restoreOutliner(). Just call before and after your script respectively.

                
                require "win32api.so"
                #these 2 functions are untested but should work.
                def hideOutliner()
                   $bOutlinerWasOpen=!isRolledUp("Outliner")
                   toggleRollUp("Outliner") if $bOutlinerWasOpen
                end
                def restoreOutliner()
                   toggleRollUp("Outliner") if $bOutlinerWasOpen
                end
                
                def toggleRollUp(name)
                    findWindow = Win32API.new("user32.dll", "FindWindow", ['P','P'], 'N')
                    pw=findWindow.call(0,name)
                   
                    sendMessage = Win32API.new("user32.dll", "SendMessage", ['N','N','N','P'], 'N')
                   
                    sendMessage.call (pw,0x00a1,2,"")#WM_NCLBUTTONDOWN
                    sendMessage.call(pw,0x0202,0,"")#WM_LBUTTONUP
                end
                def isRolledUp(name)
                    findWindow = Win32API.new("user32.dll", "FindWindow", ['P','P'], 'N')
                    getWindowRect= Win32API.new("user32.dll", "GetWindowRect",['P','PP'], 'N')
                    pw=findWindow.call(0,name)
                
                    data=Array.new.fill(0.chr,0..4*4).join
                    getWindowRect.call (pw,data);
                    rect=data.unpack("i*")
                        #if window height is less than 90 then the window is rolledup
                    return (rect[3]-rect[1])<90
                end
                
                
                1 Reply Last reply Reply Quote 0
                • A Offline
                  avariant
                  last edited by

                  While you'll still need a method to determine if the Outliner is visible or not... you can just call this:

                  UI.show_inspector "Outliner"
                  

                  to toggle between rolled up and rolled down. (At least in SU 7, didn't try 6)

                  1 Reply Last reply Reply Quote 0
                  • A Offline
                    alz
                    last edited by

                    Had a similar problem awhile back and just hacked it by adding "Sketchup.send_action 21926" before/after the function to temporarily hide all the dialog windows.

                    The above ideas are more elegant and official, however

                    --alz

                    1 Reply Last reply Reply Quote 0
                    • J Offline
                      Jim
                      last edited by

                      Is this still valid for Ruby 2, or is there now a better way using the Ruby StdLib?

                      Hi

                      1 Reply Last reply Reply Quote 0
                      • J Offline
                        johnzdennis
                        last edited by

                        I see this thread is almost ten years old, but has this issue ever actually gotten fixed?

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

                        Advertisement