Guidelines for adding a method to existing classes?
-
From my newbie standpoint i cant see a problem with it. If it doesnt exist already it's unlikely anyones going to be calling it mistakenly.
I suppose the only problem would be if someone else decides to add the same method to the class in a later script.
waits for people who know what theyre talking about
-
well you're welcome. This however won't be a plugin in the traditional sense. It will be available for other script writers to incorporate into their scripts. But hopefully that is still helpful!
Chris
-
I'm not sure about this extending SU and Ruby classes.
It's convenient, but I've avoided it so far as I'm worried that it might conflict. I've noted when I've been inspecting classes that with a few plugins installed there's quite a few additional methods, even to the private ones.I've just added it to a separate function, to be 100% sure.
But I don't really know what I'm talking about, so I'll join you in the wait and see what people says.
-
Yeah, that is my thinking too remus. I think I'll go ahead and name it with the initials in the front just to be safe.
Chris
waits along with Remus and Thom
-
Ohh, look at that tumbleweed!
-
I would like to use a method like
3.1415.watts_to_kwatts
SketchUp warehouse does not let me to add the method to Float class:
class Float
def watts_to_kwatts()
...
end
endIs there a solution to make sentence work storing method in a subclass?
-
You can try a subclass.. BUT it must be defined within YOUR or your company's) namespace.
Do not define it at the toplevel withinObject
!class Juantxo;;Watts < Float def to_kw self / 1000.0 end end # custom class
Your subclass should inherit a
to_f
method.w = Juantxo::Watts.new(3.1415) kw = w.to_kw()
-
You can also use
.extend()
on single instances:
http://www.ruby-doc.org/core-1.8.6/Object.html#method-i-extendNote that extending
Entity
instances would not be allowed by EW because the instances are global to everyone using the SketchUp environment. But for other types such as Point3d, Vector3d, String etc that would work. -
WARNING from 2014: Extending the SketchUp classes is virtually always a bad idea and will make your plugin not be allowed onto the Extension Warehouse. Please find a different way to do things, other than by extending existing SketchUp classes, modules, methods, etc.
class Sketchup;;Entities # Adds a clf_bezier_points method to the Entities class. Arguments are the starting point of the bezier, first handle, the endpoint of the bezier, the endpoints handle. # All are either Point3d objects, or an array of [x,y,z] values. The last argument is the number of segments the bezier should have. # This method returns an array of [x,y,z] points, starting with the given starting point and ending with the given endoing point. def clf_bezier_points( p0, p1, p3, p2, segs ) point_array = [] np = [0,0,0] cx = (3 * (p1[0] - p0[0])) bx = (3 * (p2[0] - p1[0])) - cx ax = (p3[0] - p0[0]) - cx - bx cy = (3 * (p1[1] - p0[1])) by = (3 * (p2[1] - p1[1])) - cy ay = (p3[1] - p0[1]) - cy - by cz = (3 * (p1[2] - p0[2])) bz = (3 * (p2[2] - p1[2])) - cz az = (p3[2] - p0[2]) - cz - bz (segs.to_i+1).times do |e| t = e/segs.to_f np[0] = (ax*(t**3)) + (bx*(t**2)) + (cx*t) + p0[0] np[1] = (ay*(t**3)) + (by*(t**2)) + (cy*t) + p0[1] np[2] = (az*(t**3)) + (bz*(t**2)) + (cz*t) + p0[2] point_array << np.clone end point_array end # clf_bezier_points # Adds a clf_add_bezier method to the Entities class. Arguments are the starting point of the bezier, first handle, the endpoint of the bezier, the endpoints handle. # All are either Point3d objects, or an array of [x,y,z] values. The last argument is the number of segments the bezier should have. # This method returns an array that contains an arc object and an array of the edges, in order, in the bezier curve. def clf_add_bezier( p0, p1, p3, p2, segs ) point_array = clf_bezier_points( p0, p1, p3, p2, segs ) z = parent.active_entities.add_curve point_array bez_curve = z[0].curve [bez_curve,z] end # clf_add_bezier end # Sketchup;;Entities class
This is the code I was planning on releasing as a developer's tool to add quick bezier curve ability.
Is writing it as its own .rb file that needs to be downloaded and installed really the best way? Or would it just made more sense to post is as standalone methods that would be easy for other scripter's to just copy and paste from here into their code?
And don't get me wrong, I fully expect that about 0 people will ever actually use this code. It was a bit of an exercise in figuring out how to extend SU's classes. But theoretically, what does everyone think the most efficient way to provide code bits like this is?
Chris
EDIT: Also, I was hoping that someone with some experience in these things could look over the code quickly and check if I have done anything majorly wrong that would quickly cause problems? Thanks in advance (Jim, Todd, Rick, TBD, TIG, Fredo, Tomasz, Whaat, the other Chris, and the other one, Wehby, and everyone that I missed, or didn't include who feels like they have answers! )
-
@tt_su said:
Note that extending
Entity
instances would not be allowed by EW because the instances are global to everyone using the SketchUp environment. But for other types such as Point3d, Vector3d, String etc that would work.Here
delegators
can be useful.require 'delegate' module DanielB class SampleFace < DelegateClass(Sketchup;;Face) def inner_loops return loops.find_all { |l| l != outer_loop } end end def self.demo face = Sketchup.active_model.selection.find { |e| e.is_a?(Sketchup;;Face) } return if face.nil? face = SampleFace.new(face) puts face.inner_loops end end
Advertisement