Create file with accent in the path
-
I'd think there would be Ruby exceptions raised so you could try to catch these and present a failure message. You could also explicitly see if the file exist after you have tried to create it: File.exist?()
-
File.exist? doesn't work, for same reasons...
-
@iltis said:
File.exist? doesn't work, for same reasons...
Doesn't work, as in it raises an error? Then you can rescue from that error and provide your message to the user.
-
Mhhh, I've got a problem with my test :
UI.messagebox(filepath) # Open a file for writing File.open(filepath, "w"){ |file| selection = Sketchup.active_model.selection ...{ ...{ # Write the coordinates to the file. file.puts("#{u};#{v}") } } } UI.messagebox("FileTest") if FileTest.exists?(filepath) UI.messagebox("The file is there") else UI.messagebox("The file is not there") end
The first messagebox give me the path : "C:\Users\Tarzan\Documents\aiR-C2\MiniCut2d\Bibliothèque\test.txt"
But no more messagebox after the "File.open"... do you know why?
But if I understand this topic (http://sketchucation.com/forums/viewtopic.php?t=20289), the ".exists?" is not the solution. -
In the Ruby Console do you see error messages? What I meant was to catch there errors, using
begin, rescue
. -
OK, I see the error in the Ruby Console (thank you for the tip) :
Error: #<Errno::ENOENT: No such file or directory - C:/Users/Tarzan/Documents/aiR-C2/MiniCut2d/Bibliothèque/test.f2xy>
...I will try to catch it.
-
OK, this code works on SU8 :
begin File.open(filepath, "w"){ |file| ... } UI.messagebox("The file is here ;" + filepath) rescue UI.messagebox("Error, the file was not created. Be careful if you are using an older version of SketchUp, the full file path must not contain special or accented characters. The full file path you requested is " + filepath) end
The "è" looks "è" in the messagebox, but the user know how to fix the problem.
I try to use it in SketchUp 2014, but I've got an error
Erreur de chargement du fichier faces2xy.rb Error; #<SyntaxError; C;/Users/Tarzan/AppData/Roaming/SketchUp/SketchUp 2014/SketchUp/Plugins/faces2xy.rb;18; syntax error, unexpected ',', expecting ')' filepath = UI.savepanel ("Export selected faces",nil,"*.f2xy") C;/Users/Tarzan/AppData/Roaming/SketchUp/SketchUp 2014/SketchUp/Plugins/faces2xy.rb;18; Can't assign to nil filepath = UI.savepanel ("Export selected faces",nil,"*.f2xy") C;/Users/Tarzan/AppData/Roaming/SketchUp/SketchUp 2014/SketchUp/Plugins/faces2xy.rb;18; syntax error, unexpected ')', expecting ;; or '[' or '.' filepath = UI.savepanel ("Export selected faces",nil,"*.f2xy")
Do you know how to fix this (in all SU versions...)?
Thanks,
Renaud -
@iltis said:
The "è" looks "è" in the messagebox, but the user know how to fix the problem.
That's odd - if the string is UTF-8 encoded then it should look fine in SketchUp regardless.
Have you saved your RB files as UTF-8 without BOM?@iltis said:
I try to use it in SketchUp 2014, but I've got an error
I'm not sure, but I think it could be that space you have between the method name and the parentheses:
filepath = UI.savepanel ("Export selected faces",nil,"*.f2xy")
But the error could be cascading some elsewhere... hard to tell without knowing the source code.
Btw, it's recommended not to catch all exceptions, but only the ones you expect.
http://www.skorks.com/2009/09/ruby-exceptions-and-exception-handling/ -
Bingo! 2/2. It works fine now. Is "UTF-8 without BOM" the best to use? (Default value?)
Thank you for the quick answer!
I will see how to catch only the file exception. -
Mhh, the error is
Error; #<Errno;;ENOENT; No such file or directory - C;/Users/Tarzan/Documents/aiR-C2/MiniCut2d/Bibliothèque/test.f2xy>
I don't understand how to only catch this type of exception... (not in the "Ruby Exception Hierarchy"). I'll see this later.
-
@iltis said:
Bingo! 2/2. It works fine now. Is "UTF-8 without BOM" the best to use?
I recommend that because without the BOM you can load the file in Ruby 1.8. With the BOM Ruby 1.8 will not load it.
-
@iltis said:
Mhh, the error is
Error; #<Errno;;ENOENT; No such file or directory - C;/Users/Tarzan/Documents/aiR-C2/MiniCut2d/Bibliothèque/test.f2xy>
I don't understand how to only catch this type of exception... (not in the "Ruby Exception Hierarchy"). I'll see this later.
You should be able to catch
Errno::ENOENT
- it's a class inherited form StandardError.Errno::ENOENT.ancestors [Errno::ENOENT, SystemCallError, StandardError, Exception, Object, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, Kernel, BasicObject]
Though, it might be system dependant... Maybe catching SystemCallError is a good one to catch for these types of errors.
-
OK, thank you.
-
Like this:
begin File.open(filepath, "w"){ |file| #... } UI.messagebox("The file is here ;" + filepath) rescue SystemCallError => e if e.message =~ /(No such file or directory)/ UI.messagebox("Error, the file was not created. Be careful if you are using an older version of SketchUp, the full file path must not contain special or accented characters. The full file path you requested is " + filepath) else fail() #re-raise the last exception end end
-
Nice, thank you Dan!
-
@dan rathbun said:
fail() #re-raise the last exception
Never seen that method used before. Is that different from just calling
raise
? -
@tt_su said:
@dan rathbun said:
fail() #re-raise the last exception
Never seen that method used before. Is that different from just calling
raise
?raise()
is an alias forfail()
See the doc on theKernel
module:
http://www.ruby-doc.org/core-1.8.6/Kernel.html#method-i-failThe best practices guides I have read, suggest that
fail
be used instead ofraise
, for readability, I suppose. But I really did not understand the logic in the guide. (I think it was something like "raise" has more meanings as a verb than "fail" ?)
Advertisement