Hole plugin
-
Hello !
I need some help on a plugin.
I made geometrical form on that cube and I have a plugin which allow you to make hole in there (pushpull method).
When I started with 1,2,3,4 then A it worked.
If I start with a letter then number I have a hole only on A or B, but not in number because the pushpull make a hole on the edge of the cube.Why it worked like that ?
I take the idea from that plugin, but this plugin work only for rectangle form...
http://rhin.crai.archi.fr/rld/plugin_details.php?id=326I modify it to work with one click on the face. (you have to draw the geometrical form first then select the face and it create the hole)
How can I upload to plugin to show you ?
File test of Hole plugin
THX thomthom !To use it, copy it into plugin directory.
Then create a simple cube with geometrical form on that cube.
Click on "Plugins> njeremy2 Hole"
The plugin is activated, select the geometrical form and it create the hole -
-
I have an another pb... I can't create hole in components or groups. I have to explode it before make a hole
-
@njeremy2 said:
I have an another pb... I can't create hole in components or groups. I have to explode it before make a hole
Sounds like you are not referring to the correct entities collection.
If you use
model.active_entities
then it'll create the entities in the currently open group/component. If you want to edit a group you need to reference it'sEntities
collection:group.entities
- When editing a ComponentInstance you need to modify the definitioncomponentinstance.definition.entities
.
(Here's a short summary about how instances and definitions relate in SketchUp: http://www.thomthom.net/thoughts/2012/02/definitions-and-instances-in-sketchup/ ) -
Regarding test_hole.rb
Your methoddef in_face
is outside the class. Move it to the inside of the class so it doesn't pollute the global namespace.
@entities = @model.entities
This is your problem with not being able to edit groups/components.
model.entities
always refer to the root entities collection. Usemodel.active_entities
to the current open set of entities.
(Still looking)
-
I'm gonna read your articles
and test what you tell me to do.
-
<span class="syntaxdefault"><br /> </span><span class="syntaxcomment">#We get all faces, norms, reversed norms and plans<br /> </span><span class="syntaxdefault">all_faces </span><span class="syntaxkeyword">= []<br /> </span><span class="syntaxdefault">all_norms </span><span class="syntaxkeyword">= []<br /> </span><span class="syntaxdefault">all_norms_reverse </span><span class="syntaxkeyword">= []<br /> </span><span class="syntaxdefault">all_plans </span><span class="syntaxkeyword">= []<br /> </span><span class="syntaxdefault">j </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">0<br /> </span><span class="syntaxkeyword">@</span><span class="syntaxdefault">entities</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">each </span><span class="syntaxkeyword">do |</span><span class="syntaxdefault">current_ent</span><span class="syntaxkeyword">|<br /> if </span><span class="syntaxdefault">current_ent</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">is_a</span><span class="syntaxkeyword">?(</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Face</span><span class="syntaxkeyword">)<br /> </span><span class="syntaxdefault">all_faces</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">] = </span><span class="syntaxdefault">current_ent<br /> all_norms</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">] = </span><span class="syntaxdefault">current_ent</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">normal<br /> all_norms_reverse</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">] = </span><span class="syntaxdefault">current_ent</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">normal</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">reverse</span><span class="syntaxkeyword">!<br /> </span><span class="syntaxdefault">all_plans</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">] = </span><span class="syntaxdefault">current_ent</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">plane<br /> j </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">j </span><span class="syntaxkeyword">+ </span><span class="syntaxdefault">1<br /> end </span><span class="syntaxcomment"># end if current_ent is_a face<br /> </span><span class="syntaxdefault">end </span><span class="syntaxcomment">#end current_ent<br /> </span><span class="syntaxdefault"></span>
First of all,
@entities
is incorrect. In your code you set this to@model.entities
- which is the root entities collection. The face you pick might be from any group or component - so you want to use the entities collection that face belongs to.face.parent.entities
.Second of all, you use a counter to insert items into your arrays.
<span class="syntaxdefault"><br />j </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">0<br /></span><span class="syntaxkeyword">for </span><span class="syntaxdefault">e in model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">entities<br /> array1</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">] = </span><span class="syntaxdefault">foo<br /> array2</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">] = </span><span class="syntaxdefault">bar<br />end<br /></span>
No need for that, just push the data directly to the arrays.
<span class="syntaxdefault"><br /></span><span class="syntaxkeyword">for </span><span class="syntaxdefault">e in model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">entities<br /> array1 </span><span class="syntaxkeyword"><< </span><span class="syntaxdefault">foo<br /> array2 </span><span class="syntaxkeyword"><< </span><span class="syntaxdefault">bar<br />end<br /></span>
Both
foo
andbar
are still located with the same index in each their arrays.A cleaned up version of your code snippet:
<span class="syntaxdefault"><br /> </span><span class="syntaxcomment">#We get all faces, norms, reversed norms and plans<br /> </span><span class="syntaxdefault">all_faces </span><span class="syntaxkeyword">= []<br /> </span><span class="syntaxdefault">all_norms </span><span class="syntaxkeyword">= []<br /> </span><span class="syntaxdefault">all_norms_reverse </span><span class="syntaxkeyword">= []<br /> </span><span class="syntaxdefault">all_plans </span><span class="syntaxkeyword">= []<br /> </span><span class="syntaxdefault">face</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">parent</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">entities</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">each </span><span class="syntaxkeyword">do |</span><span class="syntaxdefault">current_ent</span><span class="syntaxkeyword">|<br /> if </span><span class="syntaxdefault">current_ent</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">is_a</span><span class="syntaxkeyword">?(</span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Face</span><span class="syntaxkeyword">)<br /> </span><span class="syntaxdefault">all_faces </span><span class="syntaxkeyword"><< </span><span class="syntaxdefault">current_ent<br /> all_norms </span><span class="syntaxkeyword"><< </span><span class="syntaxdefault">current_ent</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">normal<br /> all_norms_reverse </span><span class="syntaxkeyword"><< </span><span class="syntaxdefault">current_ent</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">normal</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">reverse</span><span class="syntaxkeyword">!<br /> </span><span class="syntaxdefault">all_plans </span><span class="syntaxkeyword"><< </span><span class="syntaxdefault">current_ent</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">plane<br /> end </span><span class="syntaxcomment"># end if current_ent is_a face<br /> </span><span class="syntaxdefault">end </span><span class="syntaxcomment">#end current_ent<br /> </span><span class="syntaxdefault"></span>
(Still looking)
-
I don't understand the rest of your code.
mini = 10000
What is this magic number?current_norm_reverse.length = 1000
What is the purpose of this line? -
@thomthom said:
I don't understand the rest of your code.
mini = 10000
What is this magic number?current_norm_reverse.length = 1000
What is the purpose of this line?me too, that code is from rectangleHoletool.rb from the link in my first post
-
I made some test on that plugin.
If the entity is longer than ~25000 cm (more than 25400cm, I just test it), you can make any hole. If it's smaller than that value, it workingre-edit2 : I can make a hole in groups ! (many thanks thom !)
Now I still have the first problem... -
The logic for finding the opposite face is somewhat odd. The magic number is no good design and puts on an artificial limit.
I'm thinking that it'd be better to trace a ray to pick the opposite face. Shoot a ray from one of the vertices (or a calculated face centre) in the opposite direction of the face normal - see if it hit a face with a reversed normal. Then use that length to push-pull. -
-
Meh! Doesn't work for faces outside the current context...
-
This one works.
UPDATE: I'd forgotten to remove some old code. Please check the new version.
-
I saw a tiger lurking...
-
I made an inept and incorrect comment, which I then decided to erase
You have fixed it now anyway...
BUT where'd it go
Now it's back again... The art of illusion..........
"Now you see it, now you don't."PS:
The latest code method'smodel = face.model
is now redundant, because you iterate through theface.parent.entities
to find the matching 'back-face'... -
@tig said:
PS:
The latest code method's model = face.model is now redundant, because you iterate through the face.parent.entities to find the matching 'back-face'...True that. (Won't bother to update for that one line though.)
-
ahahah
AHAHAHAHAHA !!! Thank you thomthom !!It works great !!!
Many many many .... (ctrl+C, ctrl+V) ... many thanks !!
Advertisement