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

    Get MAC Address

    Scheduled Pinned Locked Moved Developers' Forum
    55 Posts 8 Posters 5.2k Views 8 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.
    • D Offline
      driven
      last edited by

      @garry k said:

      You show the mac_address as lower case - can you confirm that is indeed the output.

      yes it's lower-case, I realised that obscuring it in my other posts was counter productive, so I just adjusted only the number values to show the return this time...
      @unknownuser said:

      Also - off topic - but how do you get the source code to go into the embedded window?
      the one with the red circle...

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

      1 Reply Last reply Reply Quote 0
      • G Offline
        Garry K
        last edited by

        Thanks again. I checked the code for windows and it works fine.
        I've added an upcase on the following line

        lines.each{|line| mac_addr << (line.strip[-17,17]).upcase().gsub( /-/, ':' ) }

        1 Reply Last reply Reply Quote 0
        • jaimedaJ Offline
          jaimeda
          last edited by

          Hello

          This works fine in Sketchup 2013 but not in 2014.

          Any tips?

          1 Reply Last reply Reply Quote 0
          • tt_suT Offline
            tt_su
            last edited by

            @jaimeda said:

            This works fine in Sketchup 2013 but not in 2014.

            Due to the upgrade of the Ruby core this broke. We haven't been able to figure out why. But the workaround is to pipe the result from the command to a temporary file and read it after executing the command.

            <span class="syntaxdefault"><br />tempfile&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxstring">"C;/Users/Thomas/Desktop/temp.txt"<br /></span><span class="syntaxkeyword">`</span><span class="syntaxstring">ipconfig&nbsp;/all&nbsp;>&nbsp;#{tempfile}</span><span class="syntaxkeyword">`<br /></span><span class="syntaxdefault">puts&nbsp;File</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">read</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">tempfile</span><span class="syntaxkeyword">)<br />&nbsp;</span><span class="syntaxdefault"></span>
            
            1 Reply Last reply Reply Quote 0
            • jaimedaJ Offline
              jaimeda
              last edited by

              Thanks Thomas.

              It works perfectly.

              1 Reply Last reply Reply Quote 0
              • G Offline
                Garry K
                last edited by

                @tt_su said:

                @jaimeda said:

                This works fine in Sketchup 2013 but not in 2014.

                Due to the upgrade of the Ruby core this broke. We haven't been able to figure out why. But the workaround is to pipe the result from the command to a temporary file and read it after executing the command.

                <span class="syntaxdefault"><br />tempfile </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">"C;/Users/Thomas/Desktop/temp.txt"<br /></span><span class="syntaxkeyword">`</span><span class="syntaxstring">ipconfig /all > #{tempfile}</span><span class="syntaxkeyword">`<br /></span><span class="syntaxdefault">puts File</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">read</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">tempfile</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault"> </span>
                

                In my C++ programming for windows I would create a temp file this way

                tempfp = tmpfile();

                Is there anything in Sketchup that would do the same for both Windows and Mac?

                1 Reply Last reply Reply Quote 0
                • tt_suT Offline
                  tt_su
                  last edited by

                  Well,... since we now have the Ruby Standard Library available: http://ruby-doc.org/stdlib-2.0.0/libdoc/tempfile/rdoc/Tempfile.html

                  😄

                  So an updated example would be:

                  <span class="syntaxdefault"><br /></span><span class="syntaxkeyword">require&nbsp;</span><span class="syntaxstring">'tempfile'<br /></span><span class="syntaxdefault">file&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Tempfile</span><span class="syntaxkeyword">.new(</span><span class="syntaxstring">'my_prefix'</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">file</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">close<br /></span><span class="syntaxkeyword">`</span><span class="syntaxstring">ipconfig&nbsp;/all&nbsp;>&nbsp;#{file.path}</span><span class="syntaxkeyword">`<br /></span><span class="syntaxdefault">puts&nbsp;File</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">read</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">file</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">path</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">file</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">unlink<br /></span>
                  
                  1 Reply Last reply Reply Quote 0
                  • Dan RathbunD Offline
                    Dan Rathbun
                    last edited by

                    Weirdly the backquotes, & %x strings which use the ()` method, work on my machine.

                    And I verified that I do not have the backquote_patch.rb (that I proposed,) loaded.

                    I'm not here much anymore.

                    1 Reply Last reply Reply Quote 0
                    • Chris FullmerC Offline
                      Chris Fullmer
                      last edited by

                      We have seen that if a user drags a skp model onto their SU icon, then they work. but if they double click on a skp model file, or double click on the SU icon, then it does not work. Are you seeing it work in both scenarios?

                      Lately you've been tan, suspicious for the winter.
                      All my Plugins I've written

                      1 Reply Last reply Reply Quote 0
                      • G Offline
                        Garry K
                        last edited by

                        @tt_su said:

                        Well,... since we now have the Ruby Standard Library available: http://ruby-doc.org/stdlib-2.0.0/libdoc/tempfile/rdoc/Tempfile.html

                        😄

                        So an updated example would be:

                        <span class="syntaxdefault"><br />require </span><span class="syntaxstring">'tempfile'<br /></span><span class="syntaxdefault">file </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Tempfile</span><span class="syntaxkeyword">.new(</span><span class="syntaxstring">'my_prefix'</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">file</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">close<br /></span><span class="syntaxkeyword">`</span><span class="syntaxstring">ipconfig /all > #{file.path}</span><span class="syntaxkeyword">`<br /></span><span class="syntaxdefault">puts File</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">read</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">file</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">path</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">file</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">unlink<br /></span>
                        

                        This is great for 2014 and forward - but what if you want to support earlier versions.

                        I guess we have to either use a one size fits all strategy or check the version an branch appropriately.

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

                          There are whole topic threads on using the TEMP directory.

                          No problem on Mac OSX...

                          The issue on PC is unicode characters in usernames, which cause Ruby 1.8.x to choke.

                          So some coders create a TEMP subdir of THEIR specific plugin's folder.
                          (I think this is better than creating any temp folders in the root dir of the system drive.)

                          I'm not here much anymore.

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

                            @chris fullmer said:

                            ... but if they double click on a skp model file, or double click on the SU icon, then it does not work. Are you seeing it work in both scenarios?

                            NO neither.

                            I see now, I either have used a pinned shortcut copy (of the desktop icon,) on the taskbar, or a copy on the StartMenu, or from a popup menu of the Desktop taskbar.
                            These are all single-click ways of launching SketchUp. I usually start SU this way because the Desktop is covered up.

                            I'm not here much anymore.

                            1 Reply Last reply Reply Quote 0
                            • jaimedaJ Offline
                              jaimeda
                              last edited by

                              I think this works in 2014 and earlier

                              <span class="syntaxdefault">IO</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">popen</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"ipconfig/all >temp.txt"</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{|</span><span class="syntaxdefault">fd</span><span class="syntaxkeyword">|</span><span class="syntaxdefault"> fd</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">readlines</span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">lines </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> open</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"temp.txt"</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">readlines<br />puts</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">lines</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault"> </span>
                              
                              1 Reply Last reply Reply Quote 0
                              • G Offline
                                Garry K
                                last edited by

                                Does this code work with Mac OS.
                                With windows the tempfile goes to desktop and gets discarded when finished.
                                Where does the file go for Mac OS and do we have rights?

                                
                                      # do this for testing on a mac
                                      @@windows = false 
                                
                                      # do this for testing on windows
                                      # @@windows = false 
                                
                                      mac_addr = []
                                      cmd = @@windows ? 'ipconfig /all' ; 'ifconfig'
                                
                                      # choose lines that have only six pairs of 2 char hex values 
                                      # separated by either a ; or -
                                      regex = Regexp.compile('(..[;-]){5}..')
                                
                                      tempfile = "temp.txt"
                                      `#{cmd} > #{tempfile}`
                                      File.open(tempfile, 'r') do |file|
                                        lines = file.grep(regex)
                                        lines.each { |line| mac_addr << (line.strip[-17, 17]).upcase().gsub(/-/, ';') }
                                      end
                                      File.unlink(tempfile)
                                
                                      # if windows and we have more than 1 mac address 
                                      # then use the second one otherwise use the first
                                      # if not windows then use the first address
                                      index = @@windows && mac_addr.length > 1 ? 1 ; 0
                                      @@mac_address = mac_addr[index]
                                
                                
                                1 Reply Last reply Reply Quote 0
                                • Dan RathbunD Offline
                                  Dan Rathbun
                                  last edited by

                                  The temp file only goes to the desktop by chance that your current working directory is pointing at the desktop directory.

                                  WIN = RUBY_PLATFORM !~ /darwin/i OSX =( not WIN ) desktop_dir = WIN ? "#{ENV['USERPROFILE']}/Desktop" : "~/Desktop"
                                  Assuming that the name of the directory is not language localized, but it likely IS.

                                  You should not ever assume some other script has not changed the working directory.

                                  All older SketchUp versions attempted to set it to the user's home directory.
                                  SketchUp 2014 (on my machine,) has left me in "#{ENV['SystemRoot']}/System32" (why I do not know, but have asked.)

                                  To see what the current working directory is, use:
                                  Dir::getwd
                                  or, it's alias:
                                  Dir::pwd

                                  To temporarily change the working directory (and have it change back to whatever it was,) use the blockform of the Dir::chdir class method.

                                  Dir;;chdir( RUBY_PLATFORM !~ /darwin/i ? "#{ENV['USERPROFILE']}/Desktop" ; "~/Desktop" ) {
                                        # do this for testing on a mac
                                        @@windows = false 
                                  
                                        # do this for testing on windows
                                        # @@windows = false 
                                  
                                        mac_addr = []
                                        cmd = @@windows ? 'ipconfig /all' ; 'ifconfig'
                                  
                                        # choose lines that have only six pairs of 2 char hex values 
                                        # separated by either a ; or -
                                        regex = Regexp.compile('(..[;-]){5}..')
                                  
                                        tempfile = "temp.txt"
                                        `#{cmd} > #{tempfile}`
                                        File.open(tempfile, 'r') do |file|
                                          lines = file.grep(regex)
                                          lines.each { |line| mac_addr << (line.strip[-17, 17]).upcase().gsub(/-/, ';') }
                                        end
                                        File.unlink(tempfile)
                                  
                                        # if windows and we have more than 1 mac address 
                                        # then use the second one otherwise use the first
                                        # if not windows then use the first address
                                        index = @@windows && mac_addr.length > 1 ? 1 ; 0
                                        @@mac_address = mac_addr[index]
                                  
                                  } # chdir block
                                  
                                  

                                  To test for access rights:
                                  File::directory?( dirname ) && File::writable?( dirname )

                                  See the File class for other class query methods to determine access info: executable?(), executable_real?(), readable?(), readable_real?(), writable_real?, etc.

                                  💭

                                  Be aware that path strings with unicode characters will not work well under Ruby 1.8.x on PC. (Mac OSX does not have these problems.)

                                  I'm not here much anymore.

                                  1 Reply Last reply Reply Quote 0
                                  • G Offline
                                    Garry K
                                    last edited by

                                    Thanks Dan. I should have thought about the whole issue of current working directory. This has been true since the beginning of DOS.

                                    I'm going to put a config folder in my own plugin folder. I can put the temp.txt file there. I can also use the folder to put user custom settings so that updates don't overwrite user settings.

                                    Thanks

                                    1 Reply Last reply Reply Quote 0
                                    • tt_suT Offline
                                      tt_su
                                      last edited by

                                      @garry k said:

                                      I'm going to put a config folder in my own plugin folder. I can put the temp.txt file there. I can also use the folder to put user custom settings so that updates don't overwrite user settings.

                                      For SketchUp versions older than SU2014 that might cause problems if the user doesn't have full permissions to the Plugins folder since Windows locks down Program Files quite tight. Ruby will in many cases not have write access.

                                      1 Reply Last reply Reply Quote 0
                                      • G Offline
                                        Garry K
                                        last edited by

                                        @tt_su said:

                                        For SketchUp versions older than SU2014 that might cause problems if the user doesn't have full permissions to the Plugins folder since Windows locks down Program Files quite tight. Ruby will in many cases not have write access.

                                        OK - then what do you suggest. I will need to find a location to temporarily write a file. This will be for Windows and Mac.

                                        I suppose I could use one strategy for SU 2014 and another for older versions.

                                        1 Reply Last reply Reply Quote 0
                                        • tt_suT Offline
                                          tt_su
                                          last edited by

                                          For temporary files in SketchUp < 2014 I would write to the temp folder based on that the ENV variable gives you:

                                          temp_path = File.expand_path(ENV['TMPDIR'] || ENV['TMP'] || ENV['TEMP'])

                                          For settings and persistent preferences, if you want to write that to file it will get tricky in older SketchUp. I stick with using Sketchup.write_default/read_default.

                                          This is one of those areas where you probably would end up with code branching for the different ruby interpreters.

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

                                            @tt_su said:

                                            For temporary files in SketchUp < 2014 I would write to the temp folder based on that the ENV variable gives you:

                                            But... the TMP/TEMP directory is in the user path, and IF the username has unicode characters, then older versions on PC have problems.

                                            We would need to employ tricks like in TIG's PCFIleTools.
                                            http://sketchucation.com/forums/viewtopic.php?f=180%26amp;t=43007%26amp;p=385472

                                            I'm not here much anymore.

                                            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