ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info
  • Matrices can be your friend - webpage

    7
    0 Votes
    7 Posts
    456 Views
    M
    Attached is the Baker article in black text on a white page. I've read it and it makes almost complete sense. What was the "glRotate" he referred to? Is that openGL? Does that help us? I've read Wiki (gone thru the words one at a time, anyway) and it is dense. Went to Wiki's Transformation Matrix article and it was unreadable. I left a message to that effect on the talk page. If you go there, please move my message to the bottom of the talk page (where I should have put it) and add another message re "how about writing for folks who didn't get a PhD in math?" change the extension back to html (board doesn't allow ULing HTML).
  • FollowMe and scale?

    5
    0 Votes
    5 Posts
    216 Views
    thomthomT
    @tig said: My recent update ExtrudeEdgesByRailsalso scales the Edges-Profile between the rails, rotating and scaling the profile to suit the gap between the [apprortioned] nodes of the rails... Cool. Will have a look at it.
  • Materials Bugs?

    16
    0 Votes
    16 Posts
    700 Views
    C
    ThomThom, you rock! That took care of the issue on this model. Thank you so much and have a Happy Thanksgiving! C
  • How to set egds of an enities in-visible?

    7
    0 Votes
    7 Posts
    217 Views
    Chris FullmerC
    I like that one Jim.
  • Hide semantics

    20
    0 Votes
    20 Posts
    529 Views
    TIGT
    Having slept on this... An Entity that is part of a Definition's Entities is a single 'thing'. Instances of this Definition can be 'placed' within the Entities of a Model or even those of other Definition. Instances are themselves 'Entities'... These Instances are simply 'markers' and refer to the Definition - they have no 'contents' of their own. Any properties that this Entity has [like visibility, material, layer etc] are set within the Definition's Entities and cannot be changed on an Instance by Instance basis as they don't exist. Any Instance of the Definition containing this Entity can have individual properties [like visibility, material, layer etc] - some of these might even get reflected down the nesting - like 'material' which when changed on the Instance will affect the appearance of any contained Entities which have their material=nil, however the 'visible' property does not filter down. Visible/hidden Entities within a Definition [that is seen as an Instance] remain visible/hidden independent of each Instance's 'visible' state - however, if the container Instance is 'hidden' then you cannot see it, and by logic you cannot see its contents - irrespective of whether or not they are visible/hidden within the Definition itself. This is a logical setup. Let's say you have Entity called A [an Entity is unique, but of course it might itself be just one Instance of a Definition]. 'A' is within a Definition and there are 6 Instances of this Definition within an Entities set. 2 of these Instances are visible the other 4 are not. Thus you can only 'see' 2 representations of A. However, there are 6 representations of A 'available' in the scheme of things - so, how do you get the number of visible A's ? Remember you can't refer to a particular A in a particular Instance because there is only one A and that's inside the Definition. If you mined down into the contents of every Definition in the Model to find A you will eventually get just one parent Definition returned because every Entity is unique - however, if A were an Instance then finding its Definition and then that Definition's Instances would give us a list of all Instances equivalent to A - however, they are NOT A itself, but a list of Instances of A's Definition - we can't confuse Entity-A and Definition-of-Instance-A - this would just make it more complicated to find them all, but it's not impossible. For now let's assume we have a simple Entity A, and we have its parent Definition, we can now find a list of all of that Definition's Instances, and then from this list we can get lists of all of those Instances that are visible/hidden. Thus we can say that Entity A exists 6 times in the Entities set, that it is visible 2 time and that it is hidden 4 time, simply by looking at the lists we just made of the parent Definition's Instances visibility. Since we know which are the Instances displaying A we can find each of their locations and thus the location of the 'ghost' of A within them, since we know where A is inside the Instance's Definition... However, if Entity A were hidden in its Definition then it would be always hidden in every Instance we looked at, so in that case, irrespective of the containing Definition's Instance visibility, A is 'hidden' in all 6 cases even when its container is visible... Not sure much of this is of any practical use...
  • Collaborative Effort - Ruby Template, RDoc, and Localization

    36
    0 Votes
    36 Posts
    10k Views
    Dan RathbunD
    @jim said: What about creating an abstract base class named Plugin which provides inspectors for the information? Not only could inspectors be created for name, author, copyright, license, etc; but also inspectors for menus, Commands and toolbar images? This way, external applications (menu organizers, etc) can simply ask the plugin about itself. I've actually done some playing around & testing this past week along these lines, before I saw this post. I had seen, in many standard (extra Sketchup) ruby scripts, that coders were just declaring a string constant "VERSION" at the top of their outer code blocks. This could be easily accessed ie:, Module::VERSION. But then the spark for me was seeing somewhere (perhaps within the RubyGems files,) someone took it a baby step forward by making the constant VERSION a Hash with 4 elements, the first 3 Integer components of the version number, and the 4th a string concatonation of the first 3. ie: VERSION=[MAJOR => 0, MINOR => 0, TEENY => 0, STRING => (MAJOR,MINOR,TEENY).join(".") ] This was a bit better, as you could get any one of the version components for comparison, without having to convert to numeric, by calling as an example: if Module;;VERSION[MAJOR] < 7 {..do a block..} Or if you wanted the whole version string, you'd call, like so: messagebox( "The plugin version is; #{Module;;VERSION[STRING]}" ) But the spark had not yet ignited into flame until I stumbled across the standard ruby class OpenStruct. When I read the filenotes in 'ostruct.rb', I immediately thought this is perfect for versioning !! OpenStruct is similar to the built-in class Struct, but really makes it act like a true data object should act in an object oriented language like Ruby. Struct on the other hand is so much like a hash, there doesn't seem to be much benefit in it; as you still set and access values as you would in a hash object. OpenStruct is SO MUCH better! You simply state a new object name = followed by OpenStruct.new(keylist), where the keylist is just that; a list of data keys to create. The class creates all the keys as attributes, and automatically sets up getter and setter accessors for each one! (Pssst! [whispering off topic this would also be great for ruby-side JSON as OpenStructs will look and act just like Javascript Objects..)] So my thoughts are to set up a custom subclass of OpenStruct called VersionStruct, or just a custom class called VersionStruct that uses an OpenStruct. Still playing and testing which way is better. Any way the goal is to have something that is all setup correctly that can be either 'included' or mixed-in into a top code block, so the module or class inherits the data structure; OR instanstiated into a code block if it's set up as a class. (I cannot see making coders cut and paste a codeblock into everyscript, errors may creep in.) Anyway.. after instantiating a VersionStruct, a coder would set the fields, then freeze the VERSION object (so the data cannot be changed after the script is loaded.) Example: ['RubyTools' is a fictional Namespace.] module DandyCode VERSION = RubyTools;;VersionStruct.new(2,1,4) # first 3 parameters are integers; major, minor, teeny # note VERSION.string is created automatically VERSION.author="Ruby A. Coder" VERSION.copyright="(c) 2010 by author" VERSION.disclaimer="No Waranty...no particular purpose...author to be held harmless ...etc" # can be preset VERSION.termsOfUse="Free for Public Use...etc." # can be preset VERSION.title="Title of this plugin code" VERSION.description="A short explanation of it's features." VERSION.minSUverMajor=7 VERSION.minSUverMinor=1 VERSION.dependancies=self.DependancyList VERSION.exclusions=self.ExclusionList VERSION.freeze DependancyList = Array.new DependancyList[0] = DependancyItemStruct.new(module='JRF;;Inputbox', minverMajor=2) ExclusionList = Array.new ExclusionList[0] = ExclusionItemStruct.new(module='SluggishKeyTrapper', allVers=true) VERSION.freeze .. more code ... end # module Anyway.. ideas to chew on... Currently.. I'm only playing with a VERSION structure that has Major, Minor, Teeny and String attributes. The other attributes in the above example, or discussed in the prior posts, could be in a separate struct as Jim suggested called 'Plugin' or whatever. (We've seen a similar thing done with the Sketchup Extension Class, except that it's put in a separate file.) For those interested, who don't have a full ruby install, I attach the ostruct.rb file that ships with Ruby 1.9.1 (put it in a folder that's in the search path, perhaps the Tools folder. I personally have it in a folder named 'Library' which I put in my search path.) ostruct.rb
  • Ruby Cost.rb Script File

    3
    0 Votes
    3 Posts
    493 Views
    M
    Jim, Thanks for the information. It worked. MPKArch
  • How to get face uvs if texture is applied to component inst

    18
    0 Votes
    18 Posts
    624 Views
    W
    Thanks Thomas!
  • [Code] Ruby Extension for Sketchup color integers

    7
    0 Votes
    7 Posts
    2k Views
    Dan RathbunD
    Added to the original post (root of thread,): Clarification: As discussed in the thread below... these methods really belong within the class to which they provide benefit and functionality. This class or classes, would be any Color object class that is defined in ruby, for whatever purpose. The example code can be rewritten slightly, so as to make it a generic mix-in module, for including in any Color class definition. In this way any Color class could inherit the conversion methods in the mixin module. Such a module would have as it's first line "module ColorIntegerConversion" instead of "class ::Integer", and this will be the way that it would be submitted for Standard Ruby, NOT as an extension to the ruby base Integer class.
  • How to tell when a material is not really a material (Image)

    5
    0 Votes
    5 Posts
    161 Views
    thomthomT
    This is something that the manual should mention. I'll add it to the list.
  • Evaluate a dynamic attribute in Ruby?

    2
    0 Votes
    2 Posts
    224 Views
    Chris FullmerC
    Yes. Dynamic components store their dynamic attributes in attribute dictionaries on the compopnent (or the definition mayeb). So dig through the attribute dicts to find one from the dynamic comp, and it will have all the values in there. Chris
  • Ending a tool

    9
    0 Votes
    9 Posts
    553 Views
    thomthomT
    @adamb said: I've always used Sketchup.active_model.tools.pop_tool so it returns to whatever you had before rather than forcing the use of SelectionTool. Adam Do yo have to use Sketchup.active_model.tools.push_tool to activate the tool then? Because I tried Sketchup.active_model.tools.pop_tool when I had activated the tool using Sketchup.active_model.tools.select_tool - and that did not seem to do anything.
  • Cutlist plugin in reverse?

    9
    0 Votes
    9 Posts
    1k Views
    TIGT
    For each piece you really need several extra columns in the worksheet, giving the x/y/z location in the world, the x/y/z rotation in the world and the x/y/z scaling in the world - ideally it should be a 16 item transformation matrix so you can easily set the piece's transformation from it... tr=object.transformation trans=tr.to_a scalex=Math.sqrt(trans[0]**2+trans[1]**2+trans[2]**2) scaley=Math.sqrt(trans[4]**2+trans[5]**2+trans[6]**2) scalez=Math.sqrt(trans[8]**2+trans[9]**2+trans[10]**2) scale=scalex scale=scaley if scaley>scale scale=scalez if scalez>scale puts " <pos>#{trans[12]} #{trans[13]} #{trans[14]}</pos>\n" puts " <scale>#{scale}</scale>\n" puts " <rotation>\n" puts " <matrix>\n" puts " #{trans[0]/scalex} #{trans[4]/scaley} #{trans[8]/scalez} #{trans[1]/scalex} #{trans[5]/scaley} #{trans[9]/scalez} #{trans[2]/scalex} #{trans[6]/scaley} #{trans[10]/scalez}\n" puts " </matrix>\n" puts " </rotation>\n" The rotation/scaling are inexorability linked using sines/cosines of the rotation angles in x/y/z etc in a complex but predictable way...
  • How to apply attributes through code? and how do they work?

    21
    0 Votes
    21 Posts
    577 Views
    TIGT
    Things [each called an Entity] that are 'visible' in a model are typically geometry [lines, faces etc], and groups and components [what is commonly called a component is actually a 'component-instance']. These groups and instances contain geometry - they can also contain sub-groups and other instances. This is a simplified picture since there's also Images, Text, Dimensions etc etc but lets keep it simple ! Within the model's 'database' there are other things you can't see but that you can use - inside 'collections' called Materials, Layers, Styles and ComponentDefinitions. Each of these will have entries like Material, Layer, Style and ComponentDefinition. So far so good ? When you look at the Components in the Browser you are looking into the model's database and seeing the Component-definitions available for use. When you select [highlight] something in a model you can get its 'class' [typename etc] so with the initial examples above you have Sketchup::Edge, Sketchup::Face, Sketchup::Group and Sketchup::ComponentInstance. Let's assume you have somehow set a variable instance=ss[i] which is a Sketchup::ComponentInstance. You can find its definition thus definition=instance.definition Now you can find an instance.definition but conversely you can find a definition.instances [i.e. all of that definition's instances] Any particular definition's instance doesn't contain anything at all - it is a marker for the definition itself, so instance.definition.entities gives you a list of entities inside the definition that that instance is using... You can even 'swap' an instance's definition for another one: instance.definition=another_definition ...
  • Ideas for 2 simple but usefull plugins.

    5
    0 Votes
    5 Posts
    443 Views
    MALAISEM
    Thankx for tricks.. MALAISE
  • What is this?

    2
    0 Votes
    2 Posts
    152 Views
    R
    Looks like an example of using a DLL to get sketchup to talk to another program. Perhaps something similar is included with the SDK? othrwise it'll just be something somebody else has put together to try it out/demonstrate it.
  • Adding observers to a group of entities

    3
    0 Votes
    3 Posts
    141 Views
    C
    Here is an abridged version: class EntityObserver def onChangeEntity(entity) puts entity.to_s + " changed" end end $entityObserver = EntityObserver.new def addObserver Sketchup.active_model.selection.each{|entity| entity.add_observer($entityObserver)} end def removeObserver Sketchup.active_model.selection.each{|entity| entity.remove_observer($entityObserver)} end If you have one entity selected, it adds and removes fine, but if you have more than one entity selected, it only removes the first entity in the selection.
  • Can I &quot;store&quot; a material as object in a variable?

    16
    0 Votes
    16 Posts
    410 Views
    N
    Yes, I just noticed that is no use to have bitmap data as binary in ruby. Because when asigning texture image to a created material m = materials.add "mat1" m.texture = "C;/texure.jpg" We don't really add that texture, but pass the path to SketchUp and there, inside that evil thing some magic happens and it grabs the texture with the claws. So, yes... we need the bitmap as file on disk before any attempt to do anything.
  • Components

    12
    0 Votes
    12 Posts
    518 Views
    honoluludesktopH
    TIG, Got it, thanks: model = Sketchup.active_model selection = model.selection selection.each do |i| puts "Component(s)" if i.is_a? Sketchup;;ComponentInstance puts i.definition.name i.definition.entities.each do|j| if j.is_a? Sketchup;;ComponentInstance puts j.definition.name j.definition.entities.each do|k| if k.is_a? Sketchup;;ComponentInstance puts k.definition.name end end end end end end Now, to organize as a proceedure to accomplish the above (3 levels) to the nth level:-}
  • Componentreporter.rb

    6
    0 Votes
    6 Posts
    713 Views
    M
    I went through the cutlist.rb instructions again on my project and it works great. I had to move a number of component axis. Thanks.

Advertisement