Full ruby installer
-
As of SketchUp 2014 we have most of the StdLib - with a few exceptions where they caused SketchUp to crash.
Are you talking about installed standalone Ruby, or did you intend to install for use in a SketchUp plugin?
What SketchUp version are you developing for?
-
Hi.
I am using SketchUp 2014. I would like to test YAML and JSON. I have tried to add require at the beginning of the program, but that doesn't seem to work. Maybe I am missing something?
-
Can you elaborate on "doesn't work"? Error messages?
Also are you using the M0 release or M1?
In M0 there was a bug where parts of the Ruby lib wasn't loaded if SketchUp was launched by an SKP file or shortcut that wasn't on the same drive as where SketchUp was installed. -
Hi there. Apologies for wasting your time. I just realized that I had commented all the requires because of a previous problem.
Too many late nights and weekends trying to finish this project on time!
The 'doesn't work' meant that I received the error
Error: #<NoMethodError: undefined method `to_yaml' for #Array:0xe3023f8>
Now I am trying to figure out how to dump an array of objects recursively. JSON only saves references to the objects, but YAML seems to work.
Thanks again
-
Sketchup API classes themselves are not extended with
to_yaml
orto_json
methods ! -
Thanks. That explains it.
This is an extract of the json I have produced by using .to_yaml on the array of Point_SVF objects.
` !ruby/object:Point_SVF
grid_node: !ruby/object:Geom::Point3d {}
svf_array:- !ruby/object:Ray
vector: !ruby/object:Geom::Vector3d {}
shaded: false
solid_angle: 0.022817320094517073 - !ruby/object:Ray
vector: !ruby/object:Geom::Vector3d {}
shaded: false
solid_angle: 0.022817320094517073`
Because this is just a string, it doesn't make sense to try to parse it back so it is of no use
I have then tried to redefine the to_yaml method in my object, but it doesn't make any difference in the output.
This is my object
` class Point_SVF
attr_accessor :grid_node # This is the node on the grid - Point3D
attr_accessor :svf_array # This is a Ray object
def to_yaml
"Coords: "+ self.grid_node.x.to_s + "," + self.grid_node.y.to_s + "," + self.grid_node.x.to_s
endend`
Calculations take even an hour and I am trying several shading options. I would like to be able to save my shading file (array of Point_SVF) and then just re-use it
It would be great if you could point me in the right direction.
Cheers
- !ruby/object:Ray
-
@ruggiero.guida said:
With my ruby script I am starting to create very big objects that require several minutes to be created.
How are you creating these objects? Entities.add_face (very slow) or Entities.fill_from_mesh (fastest)
Also, can you provide examples of what you are generating? Or even a code snippet?
-
Hi,
I'll give you a bit of background.
I am working on a outdoor comfort analysis for a new development.
I do not use Sketchup for visualization. I am using SketchUp to calculate the solar radiation for each point of a computational grid. The grid is fixed as it is imported from the CFD wind analysis. The surroundings are the 3D models of the buildings provided by the architects.
SketchUp is great because it has lots of geometry operations embedded and easily accessible. And they are so fast! I use especially the raytest to check if a point is shaded or not.
Now, for each point of the grid (ca 3000) I cast several rays to cover the sky. For each one of this ray I need to know if it is shaded, if not, how much radiation receives and which surface, if any, it intersects.
I have an object that represent the node of the grid.
class Point_SVF attr_accessor :grid_node # This is the node on the grid - Point3D attr_accessor :svf_array # This is an array of Rays objects def to_yaml "Coords: "+ self.grid_node.to_s#x.to_s + "," + self.grid_node.y.to_s + "," + self.grid_node.x.to_s end end
The Ray object is used to store some info on the particular direction for that specific node.
class Ray attr_accessor :vector #Vector3D object attr_accessor :shaded attr_accessor :solid_angle attr_accessor :transparency #Transparency of the FIRST intercepted surface attr_accessor :temperature #temperature of the FIRST intercepted surface end
You can imagine that it can take a while to perform the analysis and the objects get quite big (SU sometime crashes).
Also I need to test various shading scenario that will affect only some of the rays and I don't want to re-rerun the whole simulation all the time.
That is where the serialization comes in. I would like to be able to serialize the array of Point_SVF objects. This array practically describes the whole geometry and it changes only partially when I test local shading.
This is where I am stuck.
Hope this gives a bit more context.
-
Ah, it's the calculation actually being slow?
In which case I would suggest using a Ruby C++ Extension to do that. You would call the Ruby API to get data from the SketchUp model - but you can compute and manage your data in more efficient C++. We have a GitHub repo with a Hello World example to get people started: https://github.com/SketchUp/ruby-c-extension-examples -
eh that would be good!
The speed is not an issue. I know that C++ would be better, but I don't know it and I really can't learn it in a week!! Maybe for the next project.
Just one question. Is it possible in principle to serialize an object that contains various SketchUp specific classes? Like the object I have? This would solve all my problems.
Thanks for your help. It's cool that the SketchUp developers get involved in this forum to help people.
We are doing lots of stuff in my company with SketchUp from Openstudio to Daysim and various other simulations. In my team I am using SketchUp as the main modelling tool. A kind of repository for the geometries and then we export to the various simulation tools we use.
-
You cannot serialize Entity derived objects. I cannot recall what the case about Point3d and Vector3d is right now. I'd have to check.
You might find it easier to convert Point3d and Vector3d objects into arrays. SketchUp add's a few utility methods to the Array class which allow you to treat Array's as Point3d or Vector3d.
-
Thanks a lot for the advice! I will try it out today.
-
It worked beatifully.
The only thing I had to change was a line of code where I use 'angle_between'. I just created a temporary Vector3D and solved the issue.
I had to switch to Marshal because files were getting too big (180MB) and it was taking 15 minutes just to save.
Advertisement