⚠️ Important | Libfredo 15.6b introduces important bugfixes for Fredo's Extensions Update
  • [Plugin] Align tool 3D (bug fix)

    58
    0 Votes
    58 Posts
    145k Views
    R
    There's a huge issue with this tool (I noticed it after dekade of using ) - it distorts objects. Additional operation needed (reset skew, rotation) afterwards. Any chance to to fix it please?
  • Help with installing slicer/slicemodeler

    4
    0 Votes
    4 Posts
    1k Views
    pilouP
    Maybe Install last version 2017 Make (if you have 64 bits)
  • Any plugin to evenly space objects?

    24
    0 Votes
    24 Posts
    11k Views
    Dave RD
    @joshuabrew said: hey! any leads on a plugin for this?? looking for the same... basically the sketchup equivalent of the distribute and align tools common in adobe indesign and illustrator, but for 3D objects in sketchup. thx! j Hey! Did you try the link in the post immediately above yours from 2014?
  • Double Offset

    8
    0 Votes
    8 Posts
    2k Views
    CadFatherC
    hope TIG is ok with it: main 2 routines: @@dist=nil def initialize(dist=nil) @toolname="extrudeEdgesByOffset" if dist==0 puts 'Extrude Edges by Offset' + '; Offset cannot be 0.' return nil end#if model=Sketchup.active_model ss=model.selection edges=[] ss.each{|e|edges << e if e.class==Sketchup;;Edge} if not edges[1] if not dist UI.messagebox('Extrude Edges by Offset') + ('; Must Select >=2 Edges.') else puts 'Extrude Edges by Offset' + '; Must Select >=2 Edges.' end return nil end#if verts=[] edges.each{|e| verts << e.vertices} verts.flatten! verts.uniq! pts=[] verts.each{|v| pts << v.position} cop=true vec=Geom;;Vector3d.new(0,0,0) edges[0..-2].each_with_index{|e,i| vec=e.line[1].cross(edges[i+1].line[1])} vec=Z_AXIS.clone if vec.length==0 ### all in line plane=[pts[0],vec] pts.each{|p| if not p.on_plane?(plane) cop=false break end } if not dist if not cop UI.messagebox('Extrude Edges by Offset') + ('; Edges must be coplanar.') return nil end @@dist=0.to_l if not @@dist Sketchup;;set_status_text(("Extrude Edges by Offset")+"; "+("Distance; "), SB_PROMPT) results=inputbox(["Distance; "],[@@dist],"Extrude Edges by Offset"+"...") return nil if not results if results[0]==0 UI.messagebox('Extrude Edges by Offset'+'; Offset cannot be 0!'+"\n"+"Try again"+"...") results=inputbox(["Distance; "],[@@dist],"Extrude Edges by Offset"+"...") return nil if not results or results[0]==0 end#if @@dist=results[0] else ### dist passed as arg if not cop puts 'Extrude Edge by Offset'+'; Edges must be coplanar.' return nil end @@dist=dist.to_l end#if ### model.start_operation("Extrude Edges by Offset"+' '+@@dist.to_s) dist=@@dist group=model.active_entities.add_group() ents=group.entities ### if edges.length==verts.length ### looped ### tface=ents.add_face(pts) ### fverts=tface.outer_loop.vertices fpts=[] 0.upto(fverts.length-1) do |a| vec1=(fverts[a].position-fverts[a-(fverts.length-1)].position).normalize vec2=(fverts[a].position-fverts[a-1].position).normalize vec3=(vec1+vec2).normalize if vec3.valid? ang=vec1.angle_between(vec2)/2 ang=180.degrees if vec1.parallel?(vec2) vec3.length=dist/Math;;sin(ang) t=Geom;;Transformation.new(vec3) if fpts.length > 0 if not (vec2.parallel?(fpts.last.vector_to(fverts[a].position.transform(t)))) t=Geom;;Transformation.new(vec3.reverse) end end fpts << fverts[a].position.transform(t) end end nface=ents.add_face(fpts) tface.erase! if tface.valid? and dist>0 nface.erase! if nface.valid? and dist<0 face=nil; ents.each{|e|face=e if e.class==Sketchup;;Face} face.reverse! if face.normal.z<0 ol=face.outer_loop verts=ol.vertices if dist<0 il=(face.loops-[ol])[0] verts=il.vertices if dist>0 verts.each_with_index{|vert,a| vec1=(verts[a].position.vector_to(verts[a-(verts.length-1)].position)).normalize vec2=(verts[a].position.vector_to(verts[a-1].position)).normalize vec3=(vec1+vec2).normalize if vec3.valid? ang=vec1.angle_between(vec2)/2 ang=90.degrees if vec1.parallel?(vec2) vec3.length= -dist/Math;;sin(ang) t=Geom;;Transformation.new(vec3) p=verts[a].position pt=p.transform(t) ents.add_line(p,pt) end } ### tr=Geom;;Transformation.new() len=ents.length len.times{ents.intersect_with(true, tr, ents, tr, true, ents.to_a)} ### cedges=[]; ents.each{|e|cedges << e if e.class==Sketchup;;Edge} ### else ### open ended ### edges.each{|e|ents.add_line(e.start.position, e.end.position)} edges=ents.to_a es=[] ee=[] se=[] edges.each{|e| if not e.start.edges[1] es=e.start ee=e.end se=e break elsif not e.end.edges[1] es=e.end ee=e.start se=e break end#if } nedges=[se] verts=[es,ee] (edges.length-1).times{ edges.each{|e| next if nedges.include?(e) if e.start==ee verts << e.vertices ee=e.end nedges << e elsif e.end==ee verts << e.vertices ee=e.start nedges << e end } } verts.flatten! verts.uniq! ### opts=[] verts.each_with_index{|vert,a| if a==0 #special case for start vertex v=verts[a].position.vector_to(verts[a+1].position).normalize f=dist/dist.abs t=Geom;;Transformation.rotation(verts[0].position, vec, 90.degrees*f) vec3=v.transform(t) vec3.length=dist.abs opts << verts[a].position.transform(vec3) elsif a==verts.length-1 #special case for end vertex v=verts[a-1].position.vector_to(verts[a].position).normalize f=dist/dist.abs t=Geom;;Transformation.rotation(verts[a].position, vec, 90.degrees*f) vec3=v.transform(t) vec3.length=dist.abs opts << verts[a].position.transform(vec3) else vec1=(verts[a].position.vector_to(verts[a+1].position)).normalize vec2=(verts[a].position.vector_to(verts[a-1].position)).normalize vec3=(vec1+vec2).normalize if vec3.valid? ang=vec1.angle_between(vec2)/2 ang=90.degrees if vec1.parallel?(vec2) vec3.length=dist/Math;;sin(ang) t=Geom;;Transformation.new(vec3) if not vec2.parallel?(opts[-1].vector_to(verts[a].position.transform(t))) t=Geom;;Transformation.new(vec3.reverse) end opts << verts[a].position.transform(t) end end#if } begin nedges=ents.add_edges(opts) rescue nedges=[] end pts=[] verts.each{|v|pts << v.position} ents.erase_entities(edges) begin edges=ents.add_edges(pts) rescue edges=[] end pts.each_with_index{|p,i|ents.add_line(pts[i],opts[i])} ### tr=Geom;;Transformation.new() len=ents.length len.times{ents.intersect_with(true, tr, ents, tr, true, ents.to_a)} ### cedges=[]; ents.each{|e|cedges << e if e.class==Sketchup;;Edge} cedges.length.times{ ents.to_a.each{|e| next if e.class!=Sketchup;;Edge or not e.valid? e.find_faces } } ents.to_a.each{|e|e.reverse! if e.class==Sketchup;;Face and e.normal.z<0} ### end#if ### model.commit_operation # CREATE REVERSE GROUP model.start_operation("Extrude Edges by Offset - Reverse Side"+' '+@@dist.to_s) dist=@@dist*-1 group=model.active_entities.add_group() ents=group.entities ### if edges.length==verts.length ### looped ### tface=ents.add_face(pts) ### fverts=tface.outer_loop.vertices fpts=[] 0.upto(fverts.length-1) do |a| vec1=(fverts[a].position-fverts[a-(fverts.length-1)].position).normalize vec2=(fverts[a].position-fverts[a-1].position).normalize vec3=(vec1+vec2).normalize if vec3.valid? ang=vec1.angle_between(vec2)/2 ang=180.degrees if vec1.parallel?(vec2) vec3.length=dist/Math;;sin(ang) t=Geom;;Transformation.new(vec3) if fpts.length > 0 if not (vec2.parallel?(fpts.last.vector_to(fverts[a].position.transform(t)))) t=Geom;;Transformation.new(vec3.reverse) end end fpts << fverts[a].position.transform(t) end end nface=ents.add_face(fpts) tface.erase! if tface.valid? and dist>0 nface.erase! if nface.valid? and dist<0 face=nil; ents.each{|e|face=e if e.class==Sketchup;;Face} face.reverse! if face.normal.z<0 ol=face.outer_loop verts=ol.vertices if dist<0 il=(face.loops-[ol])[0] verts=il.vertices if dist>0 verts.each_with_index{|vert,a| vec1=(verts[a].position.vector_to(verts[a-(verts.length-1)].position)).normalize vec2=(verts[a].position.vector_to(verts[a-1].position)).normalize vec3=(vec1+vec2).normalize if vec3.valid? ang=vec1.angle_between(vec2)/2 ang=90.degrees if vec1.parallel?(vec2) vec3.length= -dist/Math;;sin(ang) t=Geom;;Transformation.new(vec3) p=verts[a].position pt=p.transform(t) ents.add_line(p,pt) end } ### tr=Geom;;Transformation.new() len=ents.length len.times{ents.intersect_with(true, tr, ents, tr, true, ents.to_a)} ### cedges=[]; ents.each{|e|cedges << e if e.class==Sketchup;;Edge} ### else ### open ended ### edges.each{|e|ents.add_line(e.start.position, e.end.position)} edges=ents.to_a es=[] ee=[] se=[] edges.each{|e| if not e.start.edges[1] es=e.start ee=e.end se=e break elsif not e.end.edges[1] es=e.end ee=e.start se=e break end#if } nedges=[se] verts=[es,ee] (edges.length-1).times{ edges.each{|e| next if nedges.include?(e) if e.start==ee verts << e.vertices ee=e.end nedges << e elsif e.end==ee verts << e.vertices ee=e.start nedges << e end } } verts.flatten! verts.uniq! ### opts=[] verts.each_with_index{|vert,a| if a==0 #special case for start vertex v=verts[a].position.vector_to(verts[a+1].position).normalize f=dist/dist.abs t=Geom;;Transformation.rotation(verts[0].position, vec, 90.degrees*f) vec3=v.transform(t) vec3.length=dist.abs opts << verts[a].position.transform(vec3) elsif a==verts.length-1 #special case for end vertex v=verts[a-1].position.vector_to(verts[a].position).normalize f=dist/dist.abs t=Geom;;Transformation.rotation(verts[a].position, vec, 90.degrees*f) vec3=v.transform(t) vec3.length=dist.abs opts << verts[a].position.transform(vec3) else vec1=(verts[a].position.vector_to(verts[a+1].position)).normalize vec2=(verts[a].position.vector_to(verts[a-1].position)).normalize vec3=(vec1+vec2).normalize if vec3.valid? ang=vec1.angle_between(vec2)/2 ang=90.degrees if vec1.parallel?(vec2) vec3.length=dist/Math;;sin(ang) t=Geom;;Transformation.new(vec3) if not vec2.parallel?(opts[-1].vector_to(verts[a].position.transform(t))) t=Geom;;Transformation.new(vec3.reverse) end opts << verts[a].position.transform(t) end end#if } begin nedges=ents.add_edges(opts) rescue nedges=[] end pts=[] verts.each{|v|pts << v.position} ents.erase_entities(edges) begin edges=ents.add_edges(pts) rescue edges=[] end pts.each_with_index{|p,i|ents.add_line(pts[i],opts[i])} ### tr=Geom;;Transformation.new() len=ents.length len.times{ents.intersect_with(true, tr, ents, tr, true, ents.to_a)} ### cedges=[]; ents.each{|e|cedges << e if e.class==Sketchup;;Edge} cedges.length.times{ ents.to_a.each{|e| next if e.class!=Sketchup;;Edge or not e.valid? e.find_faces } } ents.to_a.each{|e|e.reverse! if e.class==Sketchup;;Face and e.normal.z<0} ### end#if ### model.commit_operation Sketchup.send_action("selectSelectionTool;") end#def
  • JHS Standard Toolbar Problems / SU 2018

    4
    0 Votes
    4 Posts
    1k Views
    atelierpaarA
    Hi Max, I tried the updated Standard Toolbar "hide rest of the Model" as well as "Isolated/Restore Selected"tool work well excellent work. Thanks a lot for looking into it - I appreciate Uli
  • [Plugin] Animation - SUalive Free

    17
    0 Votes
    17 Posts
    7k Views
    SUaliveS
    Hello, SUalive Free 2.40 just under review (you can download 2.40 from our website)… Replay slider on top window* Online help available from SUalive help menu* website help tab QuickTour shows tuto and a tenth of videos from SUalive Full* No longer use .rbs files* SketchUp 2018pro SUalive Light and Full release today! from http://www.sualive.com at first Website home page has 4 new animation videos Lift-top Table assembly* Scaffolding assembly* Corkscrew* Scissor Lift @jumpjack We are waiting for Twilight contact and will let you know here as soon as they mail us. you said ‘...creating a temporary new scene per each frame...’ You can now render any frame you like. Simply move replay slider then render! you said ‘...Maybe SUalive could save scenes data...’ SUalive full has 2 commands. First ‘Export Scene like’ and ‘Play Scenes’. The last wait for user to click on next button and can easily be automated. User Ruby script or render extension can integrate the following safe script. Both script and next button may be used at the same time. if defined?(YDco657479255;;api_play_next_scene) YDco657479255;;api_play_next_scene() end Have a good day WhyDi
  • CURIC plugin

    5
    0 Votes
    5 Posts
    16k Views
    E
    Seems they launched tasty teasers on FB and don't rush to launch plugins they advertise...
  • Random move components?

    8
    0 Votes
    8 Posts
    2k Views
    E
    Ok, I resolved that by myself. I should have used Ruby Code Editor instead of Ruby Console.
  • Looking for a plugin to make studs

    14
    0 Votes
    14 Posts
    1k Views
    PixeroP
    Thats quite a lot of suggestions. Will have to try them out but at a glance the 2d boolean looks promising.
  • [Plugin] Rename Component Instance

    7
    0 Votes
    7 Posts
    9k Views
    jujuJ
    take a look at EasyGroups
  • [Plugin] Key Rotate

    7
    0 Votes
    7 Posts
    11k Views
    I
    (No experience with ruby) I'm trying to alter this to rotate around component base instead of center. It seems I just need to change this line: pt = e.bounds.center Can anyone help me find out what I need to write to make the component center its point of rotation? Any help would be greatly appreciated.
  • [Plugin] AutoSmooth

    32
    0 Votes
    32 Posts
    44k Views
    A
    Not smooth edge that create by tgi3d move tool Thanks [image: i0Ku_Capture.PNG]
  • Plug in for positioning random Textures????

    12
    0 Votes
    12 Posts
    5k Views
    E
    Nice, thanks
  • [Plugin] Axis Cam v1.0.4

    32
    0 Votes
    32 Posts
    12k Views
    renderizaR
    Hi, I have not updated my SketchUp Extensions for 5 years, but I am currently working on ways to monetize them so that I can invest more time in maintaining my Plugins. I hope to improve all my Extensions soon so that people can enjoy them once again. Best regards, Renderiza
  • [Inquiry] Shading/Shadow Settings Import/Export Plugin

    2
    0 Votes
    2 Posts
    462 Views
    BoxB
    You could try Eneroth's https://extensions.sketchup.com/en/content/eneroth-shadow-memory Perhaps even her https://extensions.sketchup.com/en/content/eneroth-view-memory will sort you out.
  • [Plugin] VolumeCalculator v1.8

    5
    0 Votes
    5 Posts
    7k Views
    Dan RathbunD
    I have posted my rendition of the "no temporary group" calculate volume solution. See: Calculate volume on manifold surface without group & explode Bonus method for a volume display string in model units: See: [code] format volume in model units
  • [Plugin] LSS Toolbar 2.0 Beta

    68
    0 Votes
    68 Posts
    65k Views
    E
    I guess the plugin should be working with SU 8. The toolbar opens with errors in all tools: "No definition "callRuby"", "No definition "get_settings"", "No definition "obtain_defaults"" They don't let me continue working with this plugin, regardless I answer YES or NO. Unfortunately, Ruby console is empty. I have rather put the files into correct folders. [image: u0pK_Beztytuu.png]
  • [Plugin] 3D Parametric Shapes - makes placeable components

    76
    0 Votes
    76 Posts
    20k Views
    J
    @einstein said: Great thanks, johnwmcc, for this plugin! Thanks for your appreciate comment. @einstein said: Did you consider designing a toolbar for it? I'm sure for many users it became one of the very basic tools in SU. Having it accessible on top of the screen would be nice Not sure I know how to do that, but will consider it when I have time (probably not for at least weeks) - I have several other higher priority projects on the go at the moment, leaving me little time to update this one.
  • Layers that will show all the areas

    2
    0 Votes
    2 Posts
    889 Views
    Rich O BrienR
    Use Scenes to toggle layer visibility.
  • REQUEST: Color Front Faces in Group or Component

    3
    0 Votes
    3 Posts
    868 Views
    JClementsJ
    How do you propose to determine the 'material' to be used for the [selected front-faces?] I think the simplest way is for the user to be required to pre-select the color they want to use by choosing a color in the Materials windows. Then run the script. A. The script would use the color chosen by the user and create new color by copying it and adding a custom suffix or prefix to the name so it could later be identified to assist in reverting all surfaces with that color, if desired, back to the default front face color. B. I would be happy to manually turn on monochrome style before running the script to assure the front faces are oriented properly, but I suppose if you want to build that in as feature when the script is run that would be up to you. C. Perhaps the Paint Bucket cursor would appear and the user could paint the selection or the script would just automatically apply the color to the pre-selection Is this tool used on a selection of components/groups, or more globally on all such 'containers ? The user would have to do a pre-selection of geometry (if there was nothing selected a message would occur to notify the user to make a selection and run the script again). The script would disregard components/sub-components found in a pre-selection. If inside an entity which contains subgroups, then a pre-selection of objects would still be required and pertain only to that pre-selection and its subgroups. D. Hopefully, the user could use Ctrl-Z to undo the changes immediately after the script has run. What about badly modeled geometry with textured back-faces etc ? They would not be considered. Note: Trimble Connect currently can not render texture or patterns with transparency either. As far as the logic for nested components goes I see why it would be very tricky. I'm thinking that I could get by with only the un-painted front faces within nested groups being affected. I not sure, now that I have read your posting, that we want to include the faces of nested components as it could have unexpected results. Perhaps that is something that could wait for later on and add in if really needed. For reverting the painted front faces back to the default front face color, could a script then search recursively for any geometry with the custom color name (mentioned above in Step "A.") and replace them with the default front face color? The user could then manually purge the custom color.

Advertisement