From 395f2af417631e2807f1052cb02db5c2b7b1d532 Mon Sep 17 00:00:00 2001 From: takion <jo@surikat.pro> Date: Tue, 13 Mar 2018 12:43:07 +0100 Subject: [PATCH] warehouse wip --- Zome.rb | 16 +- Zome.rbz | Bin 4426 -> 3409 bytes Zome/core.rb | 1019 ++++++++++++++++++++++---------------------------- 3 files changed, 449 insertions(+), 586 deletions(-) diff --git a/Zome.rb b/Zome.rb index 9eca3da..0f5d277 100644 --- a/Zome.rb +++ b/Zome.rb @@ -1,9 +1,13 @@ require 'sketchup.rb' require 'extensions.rb' -zome_extension = SketchupExtension.new('Zome', 'Zome/core.rb') -zome_extension.version = '1.2.4' -zome_extension.copyright = '2018' -zome_extension.description = 'Zome Creator - PolarZonahedron' -zome_extension.creator = 'Jo Takion <jo@redcat.ninja>' -Sketchup.register_extension(zome_extension, true) +module Takion + module Zome + zome_extension = SketchupExtension.new('Zome', 'Zome/core.rb') + zome_extension.version = '1.2.4' + zome_extension.copyright = '2018' + zome_extension.description = 'Zome Creator - PolarZonahedron' + zome_extension.creator = 'Jo Takion <jo@redcat.ninja>' + Sketchup.register_extension(zome_extension, true) + end +end diff --git a/Zome.rbz b/Zome.rbz index 0caa7175038c59bba0cac1dfaae4128130feaf8b..c00f8a03a2436fef109a2a649f100f1391150bda 100644 GIT binary patch delta 3307 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 delta 4332 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 a000000000WfV6=HlPnD%29gi}0002N6+NZ^ diff --git a/Zome/core.rb b/Zome/core.rb index 6c22fc1..1df32e0 100644 --- a/Zome/core.rb +++ b/Zome/core.rb @@ -3,604 +3,463 @@ require 'sketchup.rb' include Math module Takion -class RhombiZonaedrePolaire - def self.generation func - self.new func - end - def initialize func - eval("#{func}") - end - def start - $mo = Sketchup.active_model - Sketchup::set_status_text("Zome modelisation in progress...") - $mo.start_operation "PolarZonahedron - Structure Processing" - @t1 = Time.now - $entities = $mo.active_entities.add_group.entities - end - def ending - $mo.commit_operation - if not $takion_z_l - UI.messagebox("\nZome Creator" << - "\OpenSource software developed by Jo - jo@redcat.ninja" << - "\nhttps://github.com/takion/zome-polar-rhombizonahedron/", "Zome Creator - Open software") - $takion_z_l = true - end - end - def add_note(msg) - $mo.add_note msg, 0, 0.03 - end - def rayon_polygone_regulier n_cotes,segment_length - return (segment_length/2.0)/(Math.sin((360.0/n_cotes)/(2.0*(180.0/Math::PI)))) - end - def aire_polygone_regulier n_cotes,segment_length,radius - if not radius - radius = rayon_polygone_regulier n_cotes,segment_length - end - area = n_cotes*(0.5*(segment_length*Math.sqrt((radius*radius)-((segment_length*segment_length)/4.0))))*$u_inch*1000.0 - return area.inch - end - def draw_face(pts) - if($takion_zome['T_Modelisation']=='Faces') - face = $entities.add_face(pts) - face.back_material = $takion_zome['RVB_BACK_FACES'] - face.material = $takion_zome['RVB_FACES'] - end - if($takion_zome['T_Modelisation']=='Squelette') - line = $entities.add_line( pts ) - end - if($takion_zome['T_Modelisation']=='Tubes') - line = $entities.add_line(pts) - create_tubes(line,$takion_zome['L_TubesDiametre']) - end - end - def create_tubes(line,radius) - edges = [line] - verts=[] - newVerts=[] - startEdge=startVert=nil - edges.each {|edge|verts.push(edge.vertices)} - verts.flatten! - vertsShort=[] - vertsLong=[] - verts.each do |v| - if vertsLong.include?(v) - vertsShort.push(v) - else - vertsLong.push(v) + module Zome + class Zome + def self.gen_dh + obj = self.new + obj.zome_dh() end - end - if (startVert=(vertsLong-vertsShort).first)==nil - startVert=vertsLong.first - closed=true - startEdge = startVert.edges.first - else - closed=false - startEdge = (edges & startVert.edges).first - end - #SORT VERTICES, LIMITING TO THOSE IN THE SELECTION SET - if startVert==startEdge.start - newVerts=[startVert] - counter=0 - while newVerts.length < verts.length - edges.each do |edge| - if edge.end==newVerts.last - newVerts.push(edge.start) - elsif edge.start==newVerts.last - newVerts.push(edge.end) - end - end - counter+=1 - if counter > verts.length - return nil if UI.messagebox("There seems to be a problem. Try again?", MB_YESNO)!=6 - newVerts.reverse! - reversed=true + def self.gen_al + obj = self.new + obj.zome_al() + end + def self.gen_ah + obj = self.new + obj.zome_ah() + end + def self.gen_ad + obj = self.new + obj.zome_ad() + end + + def initialize + + end + def start + @mo = Sketchup.active_model + Sketchup::set_status_text("Zome modelisation in progress...") + @mo.start_operation "PolarZonahedron - Structure Processing" + @t1 = Time.now + @entities = @mo.active_entities.add_group.entities + end + def ending + @mo.commit_operation + end + def add_note(msg) + @mo.add_note msg, 0, 0.03 + end + def rayon_polygone_regulier n_cotes,segment_length + return (segment_length/2.0)/(Math.sin((360.0/n_cotes)/(2.0*(180.0/Math::PI)))) + end + def aire_polygone_regulier n_cotes,segment_length,radius + if not radius + radius = rayon_polygone_regulier n_cotes,segment_length end + area = n_cotes*(0.5*(segment_length*Math.sqrt((radius*radius)-((segment_length*segment_length)/4.0))))*@u_inch*1000.0 + return area.inch end - else - newVerts=[startVert] - counter=0 - while newVerts.length < verts.length - edges.each do |edge| - if edge.end==newVerts.last - newVerts.push(edge.start) - elsif edge.start==newVerts.last - newVerts.push(edge.end) - end + def draw_face(pts) + if(@gen_zome['T_Modelisation']=='Faces') + face = @entities.add_face(pts) + face.back_material = @gen_zome['RVB_BACK_FACES'] + face.material = @gen_zome['RVB_FACES'] end - counter+=1 - if counter > verts.length - return nil if UI.messagebox("There seems to be a problem. Try again?", MB_YESNO)!=6 - newVerts.reverse! - reversed=true + if(@gen_zome['T_Modelisation']=='Squelette') + line = @entities.add_line( pts ) end end - end - ###newVerts.uniq! ### allow IF closed - newVerts.reverse! if reversed - #CONVERT VERTICES TO POINT3Ds - newVerts.collect!{|x| x.position} - ###newVerts.push(newVerts[0]) - ### now have an array of vertices in order with NO forced closed loop ... - ### - do stuff - ### - pt1 = newVerts[0] - pt2 = newVerts[1] - vec = pt1.vector_to pt2 - theCircle = $entities.add_circle pt1, vec, radius - # theCircle = $entities.add_ngon pt1, vec, radius, 4 - theFace = $entities.add_face theCircle - i = 0 - @@theEdges= [] - 0.upto(newVerts.length - 2) do |something| - @@theEdges[i] = $entities.add_line(newVerts[i],newVerts[i+1]) ### make vertices into edges - i = i + 1 - end - ### follow me along selected edges - theFace.reverse!.followme @@theEdges ### - $mo.commit_operation - ### restore selection set of edges and display them - i = 0 - theEdgeX = [] - 0.upto(newVerts.length - 2) do |something| - theEdgeX[i] = $entities.add_line(newVerts[i],newVerts[i+1]) ### make vertices into edges - i = i + 1 - end - $mo.selection.clear - $mo.selection.add theEdgeX - end - def create_polarzonaedre(draw, bases, niveaux, sinus, cosinus, hypotenus) - @arretes_nb = (bases*2*niveaux)-bases - @tirants_nb = (bases*2*niveaux)/2 - @segments_nb = @arretes_nb+@tirants_nb - @connecteurs_nb = (bases*niveaux)+1 - - msg = "" - vector = Geom::Vector3d.new(sinus,0,cosinus) - vector.length = hypotenus - pts=[] - points=[] - pts[0] = Geom::Point3d.new(0,0,0) - - 1.upto(niveaux){ |i| - p_rotate = Geom::Transformation.rotation( pts[0] , Geom::Vector3d.new(0,0,1), i*2*PI/bases ) + def create_polarzonaedre(draw, bases, niveaux, sinus, cosinus, hypotenus) + @arretes_nb = (bases*2*niveaux)-bases + @tirants_nb = (bases*2*niveaux)/2 + @segments_nb = @arretes_nb+@tirants_nb + @connecteurs_nb = (bases*niveaux)+1 + + msg = "" + vector = Geom::Vector3d.new(sinus,0,cosinus) + vector.length = hypotenus + pts=[] + points=[] + pts[0] = Geom::Point3d.new(0,0,0) + + 1.upto(niveaux){ |i| + p_rotate = Geom::Transformation.rotation( pts[0] , Geom::Vector3d.new(0,0,1), i*2*PI/bases ) - pts[1] = pts[0].transform( vector ) - pts[3] = pts[1].transform( p_rotate ) - pts[2] = pts[3].transform( vector ) - # mb = i*2*PI/bases - # UI.messagebox "#{mb.radians}" - points[i] = [] - 0.upto(bases-1){ |j| - f_rotate = Geom::Transformation.rotation( Geom::Point3d.new(0,0,0) , Geom::Vector3d.new(0,0,1), j*2*PI/bases) - points[i][j] = pts.collect{|p| p.transform(f_rotate)} - - } - pts[0] = pts[3] - } - rot = Geom::Transformation.rotation [0,0,0], X_AXIS, 180.degrees - hauteur_r = points[niveaux-1][0][2][2] + pts[1] = pts[0].transform( vector ) + pts[3] = pts[1].transform( p_rotate ) + pts[2] = pts[3].transform( vector ) + # mb = i*2*PI/bases + # UI.messagebox "#{mb.radians}" + points[i] = [] + 0.upto(bases-1){ |j| + f_rotate = Geom::Transformation.rotation( Geom::Point3d.new(0,0,0) , Geom::Vector3d.new(0,0,1), j*2*PI/bases) + points[i][j] = pts.collect{|p| p.transform(f_rotate)} + + } + pts[0] = pts[3] + } + rot = Geom::Transformation.rotation [0,0,0], X_AXIS, 180.degrees + hauteur_r = points[niveaux-1][0][2][2] - faces = [] - 1.upto(niveaux){ |i| - 0.upto(bases-1){ |j| - points[i][j].collect{|p| - p.transform!(rot) - p[2]+=hauteur_r + faces = [] + 1.upto(niveaux){ |i| + 0.upto(bases-1){ |j| + points[i][j].collect{|p| + p.transform!(rot) + p[2]+=hauteur_r + } + if(draw==true) + pt1 = points[i][j][1] + pt3 = points[i][j][3] + pt4 = points[i][j][0] + if(@gen_zome['T_Ties']=='Horizontal') + if(i<niveaux) + pt2 = points[i][j][2] + faces.push [pt1,pt2,pt3] + end + faces.push [pt1,pt4,pt3] + faces.push [pt3,pt1,pt4] #tirants + end + if(@gen_zome['T_Ties']=='None') + if(i<niveaux) + pt2 = points[i][j][2] + faces.push [pt4,pt1,pt2,pt3] + else + faces.push [pt1,pt4,pt3] + end + end + end + } } + faces.collect{|face|draw_face(face)} + + diametre_r = (points[niveaux-1][0][2].distance [0,0,0]) *2 if(draw==true) - pt1 = points[i][j][1] - pt3 = points[i][j][3] - pt4 = points[i][j][0] - if($takion_zome['T_Ties']=='Horizontal') - if(i<niveaux) - pt2 = points[i][j][2] - faces.push [pt1,pt2,pt3] - end - faces.push [pt1,pt4,pt3] - faces.push [pt3,pt1,pt4] #tirants - end - if($takion_zome['T_Ties']=='None') - if(i<niveaux) - pt2 = points[i][j][2] - faces.push [pt4,pt1,pt2,pt3] - else - faces.push [pt1,pt4,pt3] - end - end - end - } - } - faces.collect{|face|draw_face(face)} - - diametre_r = (points[niveaux-1][0][2].distance [0,0,0]) *2 - if(draw==true) - # if($takion_zome['T_Tuiles2D']=='Yes') - # create_tiles $takion_zome - # end - msg += rapport_complet $takion_zome - end - return [diametre_r,hauteur_r,msg] - end - def create_tiles params - - end - def rapport_complet params - sixbranch_connection = (@connecteurs_nb-(params['N_Cotes']*2))-1 - tubes_length = params["L_RayonConnecteurs"]*( (params['N_Cotes']*4)+(sixbranch_connection*6)+(params['N_Cotes']*5)+params['N_Cotes'] ) - tubes_length = tubes_length.inch - rayonConnecteurs = params["L_RayonConnecteurs"].inch - msg = "" - msg += " Sides: #{params["N_Cotes"]} \n" - msg += " Layers: #{params["N_Niveaux"]} \n" - msg += " Height: #{params["L_Hauteur"]} \n" - msg += " Ground diameter: #{params["L_Diametre"]} \n" - # msg += " Aire au sol: #{@ground_area}² \n" - msg += "\n Number of connectors: #{@connecteurs_nb} \n" - msg += " #{params['N_Cotes']} x Connector 4 branches \n" - msg += " #{sixbranch_connection} x Connector 6 branches \n" - msg += " #{params['N_Cotes']} x Connector 5 branches \n" - msg += " 1 x Connector #{params['N_Cotes']} branches \n" - msg += "\n Radius of the connectors: #{rayonConnecteurs} \n" - msg += " -> Length of tubes needed: #{tubes_length} \n" - msg += "\n Segments total number: #{@segments_nb} \n" - # msg += " Longeur totale des segments: #{segments_lenth} \n" - msg += " Number of Ties: #{@tirants_nb} \n" - - return msg - end - def zome_al - config = [ - ['N_Cotes',10,'Sides of rotation around the axis'], - ['N_Niveaux',5,'Vertical Layer'], - ['L_AngleDeForme',35.2643896827547,'Shape angle'], - ['L_Arrete',1.m,'Edges'], - ['T_Ties','Horizontal','Ties',"Horizontal|None"], - ['L_RayonConnecteurs',150.mm,'Radius of the connectors'], - ['T_Ground','No','Ground',"Yes|No"], - ['T_Modelisation','Faces','Modelisation',"Squelette|Faces|Tubes"] - ] - $takion_zome = {} if not $takion_zome - 0.upto(config.length-1){ |i| - $takion_zome[config[i][0]] = config[i][1] if not $takion_zome[config[i][0]] - } - - results = nil - prompts = [] - defaults = [] - drops = [] - 0.upto(config.length-1){ |i| - defaults.push config[i][1] - prompts.push config[i][2] - if(config[i][3]) - drops.push config[i][3] - else - drops.push '' + # if(@gen_zome['T_Tuiles2D']=='Yes') + # create_tiles @gen_zome + # end + msg += rapport_complet @gen_zome + end + return [diametre_r,hauteur_r,msg] end - } - begin - results = UI.inputbox prompts,defaults,drops,'Polar Zonohedron based on shape angle and edges' - return unless results - 0.upto(config.length-1){ |i| - $takion_zome[config[i][0]] = results[i] - } - #<validation> - raise "Number of layers different from the number of needed sides" if ( $takion_zome['N_Niveaux'] == $takion_zome['N_Cotes'] ) - raise "Required a number of layers not equal to null" if ( $takion_zome['N_Niveaux'] <= 0 ) - raise "Minimum 2 layers required for coherent Zome" if ( $takion_zome['N_Niveaux'] < 2 ) - raise "Required a number of sides not equal to null" if( $takion_zome['N_Cotes'] <= 0 ) - raise "Minimum 3 sides required for coherent Zome" if ( $takion_zome['N_Cotes'] < 3 ) - raise "Required height not equal to null" if ( $takion_zome['L_Hauteur'] <= 0 ) - raise "Angle can't be equal to 90" if ( $takion_zome['L_AngleDeForme'] == 90 ) - #</validation> - rescue - UI.messagebox $!.message - retry - end - if($takion_zome['T_Modelisation']=="Tubes") - begin - results_tubes = UI.inputbox ['Diamètre des Tubes'],[28.mm],[],'Modelisation Tubes' - return unless results_tubes - $takion_zome['L_TubesDiametre'] = results_tubes[0] - raise "Required a value not equal to none" if ( $takion_zome['L_TubesDiametre'] <= 0 ) - rescue - UI.messagebox $!.message - retry - end - end - - start - - angle_forme = $takion_zome['L_AngleDeForme'].degrees - hypotenus = $takion_zome['L_Arrete'] - msg = "" - - sinus = cos(angle_forme) - cosinus = sin(angle_forme) - retour = create_polarzonaedre(true,$takion_zome['N_Cotes'],$takion_zome['N_Niveaux'],sinus,cosinus,hypotenus) - - msg += "Sides: #{$takion_zome['N_Cotes']} \n" - msg += "Layers: #{$takion_zome['N_Niveaux']} \n" - msg += "Diameter: #{retour[0].inch} \n" - msg += "Height: #{retour[1].inch} \n" - msg += "Shape angle: #{angle_forme.radians} \n" - msg += "Edges: #{hypotenus.inch} \n" - - msg += retour[2] - - add_note msg - ending - end - - def zome_ah - config = [ - ['N_Cotes',10,'Sides of rotation around the axis'], - ['N_Niveaux',5,'Vertical Layer'], - ['L_AngleDeForme',35.2643896827547,'Shape angle'], - ['L_Hauteur',3000.mm,'Height at the top'], - ['T_Ties','Horizontal','Ties',"Horizontal|None"], - ['L_RayonConnecteurs',150.mm,'Radius of the connectors'], - ['T_Ground','No','Ground',"Yes|No"], - ['T_Modelisation','Faces','Modelisation',"Squelette|Faces|Tubes"] - ] - $takion_zome = {} if not $takion_zome - 0.upto(config.length-1){ |i| - $takion_zome[config[i][0]] = config[i][1] if not $takion_zome[config[i][0]] - } - - results = nil - prompts = [] - defaults = [] - drops = [] - 0.upto(config.length-1){ |i| - defaults.push config[i][1] - prompts.push config[i][2] - if(config[i][3]) - drops.push config[i][3] - else - drops.push '' + def create_tiles params + + end + def rapport_complet params + sixbranch_connection = (@connecteurs_nb-(params['N_Cotes']*2))-1 + msg = "" + msg += " Sides: #{params["N_Cotes"]} \n" + msg += " Layers: #{params["N_Niveaux"]} \n" + msg += " Height: #{params["L_Hauteur"]} \n" + msg += " Ground diameter: #{params["L_Diametre"]} \n" + # msg += " Aire au sol: #{@ground_area}² \n" + msg += "\n Number of connectors: #{@connecteurs_nb} \n" + msg += " #{params['N_Cotes']} x Connector 4 branches \n" + msg += " #{sixbranch_connection} x Connector 6 branches \n" + msg += " #{params['N_Cotes']} x Connector 5 branches \n" + msg += " 1 x Connector #{params['N_Cotes']} branches \n" + msg += "\n Segments total number: #{@segments_nb} \n" + # msg += " Longeur totale des segments: #{segments_lenth} \n" + msg += " Number of Ties: #{@tirants_nb} \n" + + msg += "\n© Zome Creator \OpenSource software developed by Jo - jo@redcat.ninja \nhttps://github.com/takion/zome-polar-rhombizonahedron/" + + return msg + end + def zome_al + config = [ + ['N_Cotes',10,'Sides of rotation around the axis'], + ['N_Niveaux',5,'Vertical Layer'], + ['L_AngleDeForme',35.2643896827547,'Shape angle'], + ['L_Arrete',1.m,'Edges'], + ['T_Ties','Horizontal','Ties',"Horizontal|None"], + ['T_Ground','No','Ground',"Yes|No"], + ['T_Modelisation','Faces','Modelisation',"Squelette|Faces"] + ] + @gen_zome = {} if not @gen_zome + 0.upto(config.length-1){ |i| + @gen_zome[config[i][0]] = config[i][1] if not @gen_zome[config[i][0]] + } + + results = nil + prompts = [] + defaults = [] + drops = [] + 0.upto(config.length-1){ |i| + defaults.push config[i][1] + prompts.push config[i][2] + if(config[i][3]) + drops.push config[i][3] + else + drops.push '' + end + } + begin + results = UI.inputbox prompts,defaults,drops,'Polar Zonohedron based on shape angle and edges' + return unless results + 0.upto(config.length-1){ |i| + @gen_zome[config[i][0]] = results[i] + } + #<validation> + raise "Number of layers different from the number of needed sides" if ( @gen_zome['N_Niveaux'] == @gen_zome['N_Cotes'] ) + raise "Required a number of layers not equal to null" if ( @gen_zome['N_Niveaux'] <= 0 ) + raise "Minimum 2 layers required for coherent Zome" if ( @gen_zome['N_Niveaux'] < 2 ) + raise "Required a number of sides not equal to null" if( @gen_zome['N_Cotes'] <= 0 ) + raise "Minimum 3 sides required for coherent Zome" if ( @gen_zome['N_Cotes'] < 3 ) + raise "Angle can't be equal to 90" if ( @gen_zome['L_AngleDeForme'] == 90 ) + #</validation> + rescue + #UI.messagebox $!.message + #retry + end + + start + + angle_forme = @gen_zome['L_AngleDeForme'].degrees + hypotenus = @gen_zome['L_Arrete'] + msg = "" + + sinus = cos(angle_forme) + cosinus = sin(angle_forme) + retour = create_polarzonaedre(true,@gen_zome['N_Cotes'],@gen_zome['N_Niveaux'],sinus,cosinus,hypotenus) + + msg += "Sides: #{@gen_zome['N_Cotes']} \n" + msg += "Layers: #{@gen_zome['N_Niveaux']} \n" + msg += "Diameter: #{retour[0].inch} \n" + msg += "Height: #{retour[1].inch} \n" + msg += "Shape angle: #{angle_forme.radians} \n" + msg += "Edges: #{hypotenus.inch} \n" + + msg += retour[2] + + add_note msg + ending end - } - begin - results = UI.inputbox prompts,defaults,drops,'RhombiZonaèdre Polar by shapes angle and height' - return unless results - 0.upto(config.length-1){ |i| - $takion_zome[config[i][0]] = results[i] - } - #<validation> - raise "Required a number of layers not equal to null" if ( $takion_zome['N_Niveaux'] <= 0 ) - raise "Minimum 2 layers required for coherent Zome" if ( $takion_zome['N_Niveaux'] < 2 ) - raise "Required a number of sides not equal to null" if( $takion_zome['N_Cotes'] <= 0 ) - raise "Minimum 3 sides required for coherent Zome" if ( $takion_zome['N_Cotes'] < 3 ) - raise "Required height not equal to null" if ( $takion_zome['L_Hauteur'] <= 0 ) - raise "Angle can't be 90" if ( $takion_zome['L_AngleDeForme'] == 90 ) - #</validation> - rescue - UI.messagebox $!.message - retry - end - if($takion_zome['T_Modelisation']=="Tubes") - begin - results_tubes = UI.inputbox ['Diamètre des Tubes'],[28.mm],[],'Modelisation Tubes' - return unless results_tubes - $takion_zome['L_TubesDiametre'] = results_tubes[0] - raise "Valeur non nulle requise" if ( $takion_zome['L_TubesDiametre'] <= 0 ) - rescue - UI.messagebox $!.message - retry - end - end - - start - - msg = "" - - angle_forme = $takion_zome['L_AngleDeForme'].degrees - adjacent = $takion_zome['L_Hauteur']/$takion_zome['N_Niveaux'] - hypotenus = adjacent/angle_forme - oppose = sqrt(hypotenus*hypotenus - adjacent*adjacent) - - sinus = cos(angle_forme) - cosinus = sin(angle_forme) - - retour1 = create_polarzonaedre(false,$takion_zome['N_Cotes'],$takion_zome['N_Niveaux'],sinus,cosinus,hypotenus) - hypotenus *= $takion_zome['L_Hauteur']/retour1[1] - retour2 = create_polarzonaedre(true,$takion_zome['N_Cotes'],$takion_zome['N_Niveaux'],sinus,cosinus,hypotenus) - - msg += "Bases: #{$takion_zome['N_Cotes']} \n" - msg += "Layers: #{$takion_zome['N_Niveaux']} \n" - msg += "Diameter: #{retour2[0].inch} \n" - msg += "Height: #{retour2[1].inch} \n" - msg += "Shape angle: #{angle_forme.radians} \n" - msg += "Edges: #{hypotenus.inch} \n" - msg += retour2[2] - add_note msg - ending - end + def zome_ah + config = [ + ['N_Cotes',10,'Sides of rotation around the axis'], + ['N_Niveaux',5,'Vertical Layer'], + ['L_AngleDeForme',35.2643896827547,'Shape angle'], + ['L_Hauteur',3000.mm,'Height at the top'], + ['T_Ties','Horizontal','Ties',"Horizontal|None"], + ['T_Ground','No','Ground',"Yes|No"], + ['T_Modelisation','Faces','Modelisation',"Squelette|Faces"] + ] + @gen_zome = {} if not @gen_zome + 0.upto(config.length-1){ |i| + @gen_zome[config[i][0]] = config[i][1] if not @gen_zome[config[i][0]] + } + + results = nil + prompts = [] + defaults = [] + drops = [] + 0.upto(config.length-1){ |i| + defaults.push config[i][1] + prompts.push config[i][2] + if(config[i][3]) + drops.push config[i][3] + else + drops.push '' + end + } + begin + results = UI.inputbox prompts,defaults,drops,'RhombiZonaèdre Polar by shapes angle and height' + return unless results + 0.upto(config.length-1){ |i| + @gen_zome[config[i][0]] = results[i] + } + #<validation> + raise "Required a number of layers not equal to null" if ( @gen_zome['N_Niveaux'] <= 0 ) + raise "Minimum 2 layers required for coherent Zome" if ( @gen_zome['N_Niveaux'] < 2 ) + raise "Required a number of sides not equal to null" if( @gen_zome['N_Cotes'] <= 0 ) + raise "Minimum 3 sides required for coherent Zome" if ( @gen_zome['N_Cotes'] < 3 ) + raise "Required height not equal to null" if ( @gen_zome['L_Hauteur'] <= 0 ) + raise "Angle can't be 90" if ( @gen_zome['L_AngleDeForme'] == 90 ) + #</validation> + rescue + UI.messagebox $!.message + retry + end + + start + + msg = "" + + angle_forme = @gen_zome['L_AngleDeForme'].degrees - def zomes_ad - config = [ - ['N_Cotes',10,'Sides of rotation around the axis'], - ['N_Niveaux',5,'Vertical Layer'], - ['L_AngleDeForme',35.2643896827547,'Shape angle'], - ['L_Diametre',6000.mm,'Ground diameter'], - ['L_RayonConnecteurs',150.mm,'Radius of the connectors'], - ['T_Ground','No','Ground',"Yes|No"], - ['T_Modelisation','Faces','Modelisation',"Squelette|Faces|Tubes"] - ] - $takion_zome = {} if not $takion_zome - 0.upto(config.length-1){ |i| - $takion_zome[config[i][0]] = config[i][1] if not $takion_zome[config[i][0]] - } - - results = nil - prompts = [] - defaults = [] - drops = [] - 0.upto(config.length-1){ |i| - defaults.push config[i][1] - prompts.push config[i][2] - if(config[i][3]) - drops.push config[i][3] - else - drops.push '' + adjacent = @gen_zome['L_Hauteur']/@gen_zome['N_Niveaux'] + hypotenus = adjacent/angle_forme + oppose = sqrt(hypotenus*hypotenus - adjacent*adjacent) + + sinus = cos(angle_forme) + cosinus = sin(angle_forme) + + retour1 = create_polarzonaedre(false,@gen_zome['N_Cotes'],@gen_zome['N_Niveaux'],sinus,cosinus,hypotenus) + hypotenus *= @gen_zome['L_Hauteur']/retour1[1] + retour2 = create_polarzonaedre(true,@gen_zome['N_Cotes'],@gen_zome['N_Niveaux'],sinus,cosinus,hypotenus) + + msg += "Bases: #{@gen_zome['N_Cotes']} \n" + msg += "Layers: #{@gen_zome['N_Niveaux']} \n" + msg += "Diameter: #{retour2[0].inch} \n" + msg += "Height: #{retour2[1].inch} \n" + msg += "Shape angle: #{angle_forme.radians} \n" + msg += "Edges: #{hypotenus.inch} \n" + msg += retour2[2] + add_note msg + ending end - } - begin - results = UI.inputbox prompts,defaults,drops,'Polar Zonohedron based on shape angle and diameter' - return unless results - 0.upto(config.length-1){ |i| - $takion_zome[config[i][0]] = results[i] - } - #<validation> - raise "Required a number of layers not equal to null" if ( $takion_zome['N_Niveaux'] <= 0 ) - raise "Minimum 2 layers required for a coherent Zome" if ( $takion_zome['N_Niveaux'] < 2 ) - raise "Required a number of sides not equal to null" if( $takion_zome['N_Cotes'] <= 0 ) - raise "Minimum 3 sides required for a coherent Zome" if ( $takion_zome['N_Cotes'] < 3 ) - raise "Required a diameter not equal to null" if ( $takion_zome['L_Diametre'] <= 0 ) - raise "The angle can't be at 90" if ( $takion_zome['L_AngleDeForme'] == 90 ) - #</validation> - rescue - UI.messagebox $!.message - retry - end - if($takion_zome['T_Modelisation']=="Tubes") - begin - results_tubes = UI.inputbox ['Diamètre des Tubes'],[28.mm],[],'Modelisation Tubes' - return unless results_tubes - $takion_zome['L_TubesDiametre'] = results_tubes[0] - raise "Valeur non nulle requise" if ( $takion_zome['L_TubesDiametre'] <= 0 ) - rescue - UI.messagebox $!.message - retry - end - end - - start - - msg = "" - - angle_forme = $takion_zome['L_AngleDeForme'].degrees - hypotenus = $takion_zome['L_Diametre']/2/PI - - sinus = cos(angle_forme) - cosinus = sin(angle_forme) - - retour1 = create_polarzonaedre(false,$takion_zome['N_Cotes'],$takion_zome['N_Niveaux'],sinus,cosinus,hypotenus) - - hypotenus *= $takion_zome['L_Diametre']/retour1[0] - retour2 = create_polarzonaedre(true,$takion_zome['N_Cotes'],$takion_zome['N_Niveaux'],sinus,cosinus,hypotenus) - - msg += "Bases: #{$takion_zome['N_Cotes']} \n" - msg += "Layers: #{$takion_zome['N_Niveaux']} \n" - msg += "Diameter: #{$takion_zome['L_Diametre'].inch} \n" - msg += "Height: #{retour2[1].inch} \n" - msg += "Shape angle: #{angle_forme.radians} \n" - msg += "Edges: #{hypotenus.inch} \n" - msg += retour2[2] - add_note msg - ending - end + + def zome_ad + config = [ + ['N_Cotes',10,'Sides of rotation around the axis'], + ['N_Niveaux',5,'Vertical Layer'], + ['L_AngleDeForme',35.2643896827547,'Shape angle'], + ['L_Diametre',6000.mm,'Ground diameter'], + ['T_Ties','Horizontal','Ties',"Horizontal|None"], + ['T_Ground','No','Ground',"Yes|No"], + ['T_Modelisation','Faces','Modelisation',"Squelette|Faces"] + ] + @gen_zome = {} if not @gen_zome + 0.upto(config.length-1){ |i| + @gen_zome[config[i][0]] = config[i][1] if not @gen_zome[config[i][0]] + } + + results = nil + prompts = [] + defaults = [] + drops = [] + 0.upto(config.length-1){ |i| + defaults.push config[i][1] + prompts.push config[i][2] + if(config[i][3]) + drops.push config[i][3] + else + drops.push '' + end + } + begin + results = UI.inputbox prompts,defaults,drops,'RhombiZonaèdre Polar by shapes angle and height' + return unless results + 0.upto(config.length-1){ |i| + @gen_zome[config[i][0]] = results[i] + } + #<validation> + raise "Required a number of layers not equal to null" if ( @gen_zome['N_Niveaux'] <= 0 ) + raise "Minimum 2 layers required for coherent Zome" if ( @gen_zome['N_Niveaux'] < 2 ) + raise "Required a number of sides not equal to null" if( @gen_zome['N_Cotes'] <= 0 ) + raise "Minimum 3 sides required for coherent Zome" if ( @gen_zome['N_Cotes'] < 3 ) + raise "Required diameter not equal to null" if ( @gen_zome['L_Diametre'] <= 0 ) + raise "Angle can't be 90" if ( @gen_zome['L_AngleDeForme'] == 90 ) + #</validation> + rescue + UI.messagebox $!.message + retry + end + + start + + msg = "" + + angle_forme = @gen_zome['L_AngleDeForme'].degrees + + hypotenus = @gen_zome['L_Diametre']/2/PI + sinus = cos(angle_forme) + cosinus = sin(angle_forme) + + retour1 = create_polarzonaedre(false,@gen_zome['N_Cotes'],@gen_zome['N_Niveaux'],sinus,cosinus,hypotenus) + hypotenus *= @gen_zome['L_Diametre']/retour1[0] + retour2 = create_polarzonaedre(true,@gen_zome['N_Cotes'],@gen_zome['N_Niveaux'],sinus,cosinus,hypotenus) + + msg += "Bases: #{@gen_zome['N_Cotes']} \n" + msg += "Layers: #{@gen_zome['N_Niveaux']} \n" + msg += "Diameter: #{retour2[0].inch} \n" + msg += "Height: #{retour2[1].inch} \n" + msg += "Shape angle: #{angle_forme.radians} \n" + msg += "Edges: #{hypotenus.inch} \n" + msg += retour2[2] + add_note msg + ending + end - def zome_dh - config = [ - ['N_Cotes',10,'Sides of rotation around the axis'], - ['N_Niveaux',5,'Vertical Layer'], - ['L_Diametre',6000.mm,'Ground diameter'], - ['L_Hauteur',3000.mm,'Height at the top'], - ['T_Ties','None','Ties',"Horizontal|None"], - ['L_RayonConnecteurs',150.mm,'Radius of the connectors'], - ['T_Ground','No','Ground',"Yes|No"], - ['T_Modelisation','Squelette','Modelisation',"Squelette|Faces|Tubes"] - ] - $takion_zome = {} if not $takion_zome - 0.upto(config.length-1){ |i| - $takion_zome[config[i][0]] = config[i][1] if not $takion_zome[config[i][0]] - } - - results = nil - prompts = [] - defaults = [] - drops = [] - 0.upto(config.length-1){ |i| - defaults.push config[i][1] - prompts.push config[i][2] - if(config[i][3]) - drops.push config[i][3] - else - drops.push '' + def zome_dh + config = [ + ['N_Cotes',10,'Sides of rotation around the axis'], + ['N_Niveaux',5,'Vertical Layer'], + ['L_Diametre',6000.mm,'Ground diameter'], + ['L_Hauteur',3000.mm,'Height at the top'], + ['T_Ties','None','Ties',"Horizontal|None"], + ['T_Ground','No','Ground',"Yes|No"], + ['T_Modelisation','Faces','Modelisation',"Squelette|Faces"] + ] + @gen_zome = {} if not @gen_zome + 0.upto(config.length-1){ |i| + @gen_zome[config[i][0]] = config[i][1] if not @gen_zome[config[i][0]] + } + + results = nil + prompts = [] + defaults = [] + drops = [] + 0.upto(config.length-1){ |i| + defaults.push config[i][1] + prompts.push config[i][2] + if(config[i][3]) + drops.push config[i][3] + else + drops.push '' + end + } + begin + results = UI.inputbox prompts,defaults,drops,'Polar Zonohedron based on diameter and height' + return unless results + 0.upto(config.length-1){ |i| + @gen_zome[config[i][0]] = results[i] + } + #<validation> + raise "Required a number of layers not equal to null" if ( @gen_zome['N_Niveaux'] <= 0 ) + raise "Minimum 2 layers required for a coherent Zome" if ( @gen_zome['N_Niveaux'] < 2 ) + raise "Required a number of sides not equal to null" if( @gen_zome['N_Cotes'] <= 0 ) + raise "Minimum 3 sides required for a coherent Zome" if ( @gen_zome['N_Cotes'] < 3 ) + raise "Diameter can't be equal to null" if ( @gen_zome['L_Diametre'] <= 0 ) + raise "Required height not equal to null" if ( @gen_zome['L_Hauteur'] <= 0 ) + #</validation> + rescue + UI.messagebox $!.message + retry + end + + start + + + msg = "" + + adjacent = @gen_zome['L_Hauteur']/@gen_zome['N_Niveaux'] + + oppose = @gen_zome['L_Diametre']/@gen_zome['N_Niveaux']/2 + hypotenus = sqrt(adjacent*adjacent + oppose*oppose) + sinus = oppose/hypotenus + cosinus = adjacent/hypotenus + retour1 = create_polarzonaedre(false,@gen_zome['N_Cotes'],@gen_zome['N_Niveaux'],sinus,cosinus,hypotenus) + ndiametre = @gen_zome['L_Diametre']*(@gen_zome['L_Diametre']/retour1[0]) + + oppose = ndiametre/@gen_zome['N_Niveaux']/2 + hypotenus = sqrt(adjacent*adjacent + oppose*oppose) + sinus = oppose/hypotenus + cosinus = adjacent/hypotenus + retour2 = create_polarzonaedre(true,@gen_zome['N_Cotes'],@gen_zome['N_Niveaux'],sinus,cosinus,hypotenus) + + msg += "Bases: #{@gen_zome['N_Cotes']} \n" + msg += "Layers: #{@gen_zome['N_Niveaux']} \n" + msg += "Diameter: #{@gen_zome['L_Diametre'].inch} \n" + msg += "Height: #{@gen_zome['L_Hauteur'].inch} \n" + msg += "Edges: #{hypotenus.inch} \n" + # msg += "Shape angle: #{asin(cosinus).radians} \n" + msg += "Shape angle: #{acos(sinus).radians} \n" + msg += "Angle between the axes and the edge of the top layer: #{asin(sinus).radians} \n" + + msg += retour2[2] + + add_note msg + ending end - } - begin - results = UI.inputbox prompts,defaults,drops,'Polar Zonohedron based on diameter and height' - return unless results - 0.upto(config.length-1){ |i| - $takion_zome[config[i][0]] = results[i] - } - #<validation> - raise "Required a number of layers not equal to null" if ( $takion_zome['N_Niveaux'] <= 0 ) - raise "Minimum 2 layers required for a coherent Zome" if ( $takion_zome['N_Niveaux'] < 2 ) - raise "Required a number of sides not equal to null" if( $takion_zome['N_Cotes'] <= 0 ) - raise "Minimum 3 sides required for a coherent Zome" if ( $takion_zome['N_Cotes'] < 3 ) - raise "Diameter can't be equal to null" if ( $takion_zome['L_Diametre'] <= 0 ) - raise "Required height not equal to null" if ( $takion_zome['L_Hauteur'] <= 0 ) - #</validation> - rescue - UI.messagebox $!.message - retry - end - if($takion_zome['T_Modelisation']=="Tubes") - begin - results_tubes = UI.inputbox ['Diamètre des Tubes'],[28.mm],[],'Modelisation Tubes' - return unless results_tubes - $takion_zome['L_TubesDiametre'] = results_tubes[0] - raise "Valeur non nulle requise" if ( $takion_zome['L_TubesDiametre'] <= 0 ) - rescue - UI.messagebox $!.message - retry - end end - - start - - - msg = "" - - adjacent = $takion_zome['L_Hauteur']/$takion_zome['N_Niveaux'] - - oppose = $takion_zome['L_Diametre']/$takion_zome['N_Niveaux']/2 - hypotenus = sqrt(adjacent*adjacent + oppose*oppose) - sinus = oppose/hypotenus - cosinus = adjacent/hypotenus - retour1 = create_polarzonaedre(false,$takion_zome['N_Cotes'],$takion_zome['N_Niveaux'],sinus,cosinus,hypotenus) - ndiametre = $takion_zome['L_Diametre']*($takion_zome['L_Diametre']/retour1[0]) - - oppose = ndiametre/$takion_zome['N_Niveaux']/2 - hypotenus = sqrt(adjacent*adjacent + oppose*oppose) - sinus = oppose/hypotenus - cosinus = adjacent/hypotenus - retour2 = create_polarzonaedre(true,$takion_zome['N_Cotes'],$takion_zome['N_Niveaux'],sinus,cosinus,hypotenus) - - msg += "Bases: #{$takion_zome['N_Cotes']} \n" - msg += "Layers: #{$takion_zome['N_Niveaux']} \n" - msg += "Diameter: #{$takion_zome['L_Diametre'].inch} \n" - msg += "Height: #{$takion_zome['L_Hauteur'].inch} \n" - msg += "Edges: #{hypotenus.inch} \n" - # msg += "Shape angle: #{asin(cosinus).radians} \n" - msg += "Shape angle: #{acos(sinus).radians} \n" - msg += "Angle between the axes and the edge of the top layer: #{asin(sinus).radians} \n" - - msg += retour2[2] - - add_note msg - ending + zomes_menu = UI.menu("Plugins").add_submenu("Zome") + zomes_menu.add_item("By diameter and height") { Zome.gen_dh() } + zomes_menu.add_item("By angle and edges") { Zome.gen_al() } + zomes_menu.add_item("By angle and height") { Zome.gen_ah() } + zomes_menu.add_item("By angle and diameter") { Zome.gen_ad() } + file_loaded(File.basename(__FILE__)) end end -end - -zomes_menu = UI.menu("Plugins").add_submenu("Zome") -zomes_menu.add_item("By diameter and height") { Takion::RhombiZonaedrePolaire.generation('zome_dh') } -zomes_menu.add_item("By angle and edges") { Takion::RhombiZonaedrePolaire.generation('zome_al') } -zomes_menu.add_item("By angle and height") { Takion::RhombiZonaedrePolaire.generation('zome_ah') } -zomes_menu.add_item("By angle and diameter") { Takion::RhombiZonaedrePolaire.generation('zomes_ad') } -file_loaded(File.basename(__FILE__))