Select all geometry
-
@laxmarsk said:
I am working on a little script that is moving groups or components based on offset values read from a txt file and saving the files again at the new location.
Script is working but now I want to get things done without having to manually "select all".
What I meant is that you do not need to select entities to perform your 'move' operations. Sketchup.active_model.active_entitiescontains all the entities of the model, and you can then apply your transformation to this list.
For instance, if you want to move all objects of the model by an offset offset_vector (which you'll read from a file), then all you have to write is
all_entities = Sketchup.active_model.active_entities #all entities of the models t = Geom;;Transformation.translation offset_vector all_entities.transform_entities t, all_entities
Now, if your problem is about the selection, Todd's and Didier's code will make it as a Select All.
-
@unknownuser said:
In one line:
> Sketchup.active_model.selection.add(Sketchup.active_model.entities.to_a) >
Please, Todd, tell me how to select my object »Stein«, but not all entities.
-
Hi,
In select_all function, replace@sel.add ent if (ent.typename == "ComponentInstance")
with:
@sel.add Sketchup.active_model.definitions["Stein"].instances
assuming that you want to select all instances of the "Stein" component, I guess.
If I had to code such a function, I'll write this:
def select_comp_by_name(comp_name) @sel = Sketchup.active_model.selection @sel.clear! @sel.add Sketchup.active_model.definitions[comp_name].instances @sel end
Function call example in the script:
... stones=select_comp_by_name("Stein")
Hope this helps,
...
-
def select_comp_by_name(comp_name) @sel = Sketchup.active_model.selection @sel.clear! @sel.add Sketchup.active_model.definitions[comp_name].instances @sel end
From this I made a text file "Aar_select_comp_by_name.rb" in the Plugins folder. Restart SU.
stones=select_comp_by_name("Stein")
This I wrote in the ruby console line.
Then comes the following error:
@unknownuser said:
stones=select_comp_by_name("Stein")
Error: #<NoMethodError: undefined method `clear!' for #Sketchup::Selection:0x1afaa3b0>
(eval):11
(eval):11How to select an object by name?
-
Unfortunately I don’t know, what to type in the Ruby console line (I am Ruby beginner).
-
Just remove the exclamation mark to @sel.clear
-
@unknownuser said:
Just remove the exclamation mark to @sel.clear
Then come the following error:
@unknownuser said:stones=select_comp_by_name("Stein")
Error: #<NoMethodError: undefined method `instances' for nil:NilClass>
/Library/Application Support/Google SketchUp 6/SketchUp/Plugins/Aar_Select_comp_by_name.rb:4
(eval):197 -
First, I would make a test on the return value of Sketchup.active_model.definitions[comp_name], because if there is no such component definition*<comp_name>*, it will return <nil>, and applying the method instanceswill provoke an error.
Otherwise, your code seems correct to me.
The issue is maybe that there is no such component "Stein" in your model. You should check with the Component window.
-
@unknownuser said:
Sketchup.active_model.definitions[comp_name]
Error: #<NameError: undefined local variable or method `comp_name' for main:Object>
(eval):197This comes from ruby console.
I had an object named "Stein". And your question to a component named ”Stein" let me make also a component named "Stein". Same error.
-
When you call it from the console, use "stein" not comp_name, which is the name of the variable. So:
Sketchup.active_model.definitions["stein"]
Your code looks correct. Here it is with the test on existence of the component
def select_comp_by_name(comp_name) model = Sketchup.active_model sel = model.selection sel.clear compdef = model.definitions[comp_name] if compdef #There is a component sel.clear sel.add compdef.instances else UI.beep end end
Are you sure you have a component called "stein" in your model? Check with the Windows>Components. By the way, I wonder what you call "an Object named "stein"", as in Sketchup, you only give a name to Components or Groups, but there is nothing like an 'object'.
Note also that Sketchup is not case sensitive with the name of components.
Fredo
-
@unknownuser said:
…
I wonder what you call "an Object named "stein"", as in Sketchup, you only give a name to Components or Groups, but there is nothing like an 'object'.
…Please excuse me, I have a group named "Stein", no object.
-
Then, this is the source of your error.
You must have a Component, not a Group for your Ruby code to work.
In Sketchup, use the command Make Component(shortcut 'G') instead of Make Group -
@Fredo6
Now my model has no group "Stein", but one component "Stein". But I have no luck. To select my component "Stein" by script in ruby console does not work. Did you try your script lines and you could select your component by name? -
Which error do you get?
-
This is my ruby script »Aar_Select_comp_by_name.rb« in the Plugins folder:
@unknownuser said:
def select_comp_by_name(comp_name)
model = Sketchup.active_model
sel = model.selection
sel.clear
compdef = model.definitions[comp_name]
if compdef #There is a component
sel.clear
sel.add compdef.instances
else
UI.beep
end
end
#def select_comp_by_name(comp_name)
#@sel = Sketchup.active_model.selection
#@sel.clear
#@sel.add Sketchup.active_model.definitions[comp_name].instances
#@sel
#endIf I repeat loading by ruby console:
load "Aar_Select_comp_by_name.rb"
then come the following notes
@unknownuser said:/Library/Application Support/Google SketchUp 6/SketchUp/Plugins/Aar_Select_comp_by_name.rb:6: warning: parenthesize argument(s) for future version
/Library/Application Support/Google SketchUp 6/SketchUp/Plugins/Aar_Select_comp_by_name.rb:7: warning: parenthesize argument(s) for future version
/Library/Application Support/Google SketchUp 6/SketchUp/Plugins/Aar_Select_comp_by_name.rb:7: warning: parenthesize argument(s) for future version
/Library/Application Support/Google SketchUp 6/SketchUp/Plugins/Aar_Select_comp_by_name.rb:8: warning: parenthesize argument(s) for future version
/Library/Application Support/Google SketchUp 6/SketchUp/Plugins/Aar_Select_comp_by_name.rb:8: warning: parenthesize argument(s) for future version
/Library/Application Support/Google SketchUp 6/SketchUp/Plugins/Aar_Select_comp_by_name.rb:8: warning: parenthesize argument(s) for future version
/Library/Application Support/Google SketchUp 6/SketchUp/Plugins/Aar_Select_comp_by_name.rb:10: warning: parenthesize argument(s) for future version
/Library/Application Support/Google SketchUp 6/SketchUp/Plugins/Aar_Select_comp_by_name.rb:10: warning: parenthesize argument(s) for future version
true
… but also »true«.Now with ruby script line
Sketchup.active_model.definitions["Stein"]
I get
@unknownuser said:nil
and with
> select_comp_by_name("Stein")
@unknownuser said:
Error: #<NoMethodError: undefined method ` ' for main:Object>
/Library/Application Support/Google SketchUp 6/SketchUp/Plugins/Aar_Select_comp_by_name.rb:2
(eval):197… nothing is selected.
-
Hi !
Your script works fine here... Be careful with case of the definition name... I found no error in your script...
Perhaps some parenthesissel.add(compdef.instances)
and unnecessary duplication
sel.clear
Erase the second duplication.
-
@Matt666
Thanks for your corrections.
When your script runs fine, in the end you have the component "Stein" selected? -
@unknownuser said:
When your script runs fine, in the end you have the component "Stein" selected?
I tried with a component called "essai" created before. I had five components, and they had been all selected in the end.
Can you upload an example I can test, please ?
-
Matt, here is my model to select a component by name "Stein"
-
Ok I understand your problem...
I have made a component called "test". Entity info window looks like this :
With your component, entity info window looks like this :
The script search for component with definition as ["Stein"]. But your component definition is called "<gruppe#4> in the Skecthup database. His NAME is "Stein".3 methods :
- Create a component directly, without create a group first. Your first ruby script will work.
- Change your ruby script, and don't change your method.
Try this in the ruby API :
Sketchup.active_model.definitions.each{|d|return d if d.name == "Stein"}
This code returns the name of the component definition which called "stein"
And the ruby script :def select_comp_by_name(comp_name) model = Sketchup.active_model sel = model.selection sel.clear compdef = Sketchup.active_model.definitions.each{|d|return d if d.name == "Stein"} if compdef #There is a component sel.clear sel.add(compdef.instances) else UI.beep end end
- Add a line in ruby which control name of all component definitions if C definitions not found...
Like this :
def select_comp_by_name(comp_name) model = Sketchup.active_model sel = model.selection sel.clear compdef = Sketchup.active_model.definitions[comp_name] Sketchup.active_model.definitions.each{|d|return d if d.name == "Stein"} if not compdef if compdef sel.clear sel.add(compdef.instances) else UI.beep end end
Not tested, but it sould work !
Tell me if you want more explanations
Advertisement