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

    Get MAC Address

    已排程 已置頂 已鎖定 已移動 Developers' Forum
    55 貼文 8 Posters 4.9k 瀏覽 8 Watching
    正在載入更多貼文
    • 從舊到新
    • 從新到舊
    • 最多點贊
    回覆
    • 在新貼文中回覆
    登入後回覆
    此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
    • tt_suT 離線
      tt_su
      最後由 編輯

      @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 條回覆 最後回覆 回覆 引用 0
      • G 離線
        Garry K
        最後由 編輯

        @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 條回覆 最後回覆 回覆 引用 0
        • tt_suT 離線
          tt_su
          最後由 編輯

          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 條回覆 最後回覆 回覆 引用 0
          • Dan RathbunD 離線
            Dan Rathbun
            最後由 編輯

            @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 條回覆 最後回覆 回覆 引用 0
            • tt_suT 離線
              tt_su
              最後由 編輯

              @dan rathbun said:

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

              On the machines I tested this on the ENV variable would return DOS 8.3 short filepaths for the temp paths - and that works for Ruby 1.8 since they call the ASCII versions of the Windows file functions that can handle that.

              That said, there's always a change that ENV variables might be altered by someone, but it has worked fine for several years.

              In theory you could use Win32 API calls under Ruby 1.8 to get short 8.3 filepaths and pass that to the Ruby File methods.

              1 條回覆 最後回覆 回覆 引用 0
              • G 離線
                Garry K
                最後由 編輯

                @tt_su said:

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

                Then branching it is.

                
                      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}..')
                
                      if (RUBY_VERSION[0..2] == '1.8')
                        lines = %x[#{cmd}].split("\n").grep(regex)
                        lines.each { |line| mac_addr << (line.strip[-17, 17]).upcase().gsub(/-/, ';') }
                      else
                        temp_path = File.expand_path(ENV['TMPDIR'] || ENV['TMP'] || ENV['TEMP'])
                        tempfile = File.join(temp_path, '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)
                      end
                
                
                1 條回覆 最後回覆 回覆 引用 0
                • Dan RathbunD 離線
                  Dan Rathbun
                  最後由 編輯

                  similar:
                  ipa = %x[ipconfig /all].split("\n").grep /\A\s*(Physical Address)/

                  The regular expression means:
                  \A start of line
                  \s* one or more space characters
                  and the parens group the string

                  returns:

                  [
                    "   Physical Address. . . . . . . . . ; XX-XX-XX-ED-C2-XX",
                    "   Physical Address. . . . . . . . . ; 00-XX-XX-ED-C2-XX",
                    "   Physical Address. . . . . . . . . ; XX-XX-XX-E5-20-XX",
                    "   Physical Address. . . . . . . . . ; 00-00-00-00-00-00-00-E0",
                    "   Physical Address. . . . . . . . . ; 00-00-00-00-00-00-00-E0",
                    "   Physical Address. . . . . . . . . ; 00-00-00-00-00-00-00-E0"
                  ]
                  
                  

                  The first 2 are the Wireless:

                  1. Microsoft Virtual Miniport Adapter
                  2. the actual 802.11b/g/n Adaptor

                  The third is the Ethernet port.

                  The last 2 are virtual tunneling ports.

                  ~

                  I'm not here much anymore.

                  1 條回覆 最後回覆 回覆 引用 0
                  • Dan RathbunD 離線
                    Dan Rathbun
                    最後由 編輯

                    DUh... I just stumbled upon GetMAC.exe on my Win 7 machine. (It is in the "%WINDIW%/System32" directory.)

                    Ironic given the title of the topic.

                    Win 7 comes with it installed.

                    It is installed on XP Pro, but other editions need to install the Resource Kit or Support Tools. (They are separate installers on the install CD.)

                    Documentation page: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/getmac.mspx?mfr=true

                    Output looks like: %(#008080)[C:\Users\Dan>getmac]

                    
                    Physical Address    Transport Name
                    =================== ==========================================================
                    XX-XX-XX-2B-E5-XX   \Device\Tcpip_{<a GUID is output here>}
                    XX-XX-XX-C2-1B-96   Media disconnected
                    XX-XX-XX-C2-1B-96   Media disconnected
                    
                    

                    💭

                    I'm not here much anymore.

                    1 條回覆 最後回覆 回覆 引用 0
                    • G 離線
                      Garry K
                      最後由 編輯

                      A fellow in Russian has been testing this and ends up with this error when running SU 2014.

                      Error: #<ArgumentError: invalid byte sequence in UTF-8>
                      The line of code that is fails on is

                      lines = file.grep(regex)

                      So the next thing we did was change the prior line to but had the same error.

                      File.open(tempfile, 'r', :encoding => 'iso-8859-1') do |file|

                      What is interesting and confusing is that when we ran this code from the web-console it worked

                      
                      mac_addr = []
                      cmd = 'ipconfig /all'
                      regex = Regexp.compile('(..[;-]){5}..')
                      
                      if (RUBY_VERSION[0..2] == '1.8')
                        lines = %x[#{cmd}].split("\n").grep(regex)
                        lines.each { |line| mac_addr << (line.strip[-17, 17]).upcase().gsub(/-/, ';') }
                      else
                        temp_path = File.expand_path(ENV['TMPDIR'] || ENV['TMP'] || ENV['TEMP'])
                        tempfile = File.join(temp_path, 'temp.txt')
                      
                        `#{cmd} > #{tempfile}`
                        File.open(tempfile, 'r', ;encoding => 'iso-8859-1') do |file|
                           lines = file.grep(regex)
                           lines.each { |line| mac_addr << (line.strip[-17, 17]).upcase().gsub(/-/, ';') }
                        end
                      
                        File.unlink(tempfile)
                      end
                      
                      mac_addr[1]
                      
                      
                      1 條回覆 最後回覆 回覆 引用 0
                      • Dan RathbunD 離線
                        Dan Rathbun
                        最後由 編輯

                        Encoding::default_internal has not been set correctly in the first release of SU2014.

                        SO try:
                        File.open(tempfile, 'r', :encoding => 'iso-8859-1:utf-8') do |file|

                        I'm not here much anymore.

                        1 條回覆 最後回覆 回覆 引用 0
                        • G 離線
                          Garry K
                          最後由 編輯

                          My mistake this does work.
                          We got our versions crossed up.

                          File.open(tempfile, 'r', :encoding => 'iso-8859-1') do |file|

                          Thanks anyway Dan

                          1 條回覆 最後回覆 回覆 引用 0
                          • Dan RathbunD 離線
                            Dan Rathbun
                            最後由 編輯

                            OH he is in Russia, so he's likely running a different codepage.

                            Get his default system Encoding:
                            Encoding::find("filesystem") >> an encoding
                            (On my machine it returns the #<Encoding:Windows-1252> object reference.)
                            or
                            Encoding::locale_charmap >> returns a name for the encoding.
                            (On my machine it returns the string "CP1252".)

                            💭

                            I'm not here much anymore.

                            1 條回覆 最後回覆 回覆 引用 0
                            • G 離線
                              Garry K
                              最後由 編輯

                              For me it just returns an error.
                              (eval):5:in `run': uninitialized constant JF::WebConsole::Encoding

                              1 條回覆 最後回覆 回覆 引用 0
                              • G 離線
                                Garry K
                                最後由 編輯

                                Sorry - I see this only works in SU 2014

                                1 條回覆 最後回覆 回覆 引用 0
                                • G 離線
                                  Garry K
                                  最後由 編輯

                                  I've run into issues with taking the fist or second Mac Address out of ifconfig or ipconfig /all.

                                  I've changed the code to look at the entire file and then to step through it line by line and treat it as a bit of a state machine.

                                  Thanks to pgarmyn and Driven I think I've got some code that will work. They both helped with files as have a handful of other people.

                                  With windows I've tested files in English, French, Russian and some with VMWare set up.
                                  With OSX I've just tested in English.


                                  Mac Address

                                  1 條回覆 最後回覆 回覆 引用 0
                                  • 1
                                  • 2
                                  • 3
                                  • 3 / 3
                                  • 第一個貼文
                                    最後的貼文
                                  Buy SketchPlus
                                  Buy SUbD
                                  Buy WrapR
                                  Buy eBook
                                  Buy Modelur
                                  Buy Vertex Tools
                                  Buy SketchCuisine
                                  Buy FormFonts

                                  Advertisement