---------------------------------------------------------------------------------- --Architectural Selection Tools --(C) Sam O'Hare, Uniform Communications Ltd, July 2005 --Last Updated August 2006 --Email sam.ohare@pixelpollen.com --Version 0.7 --Current Functionality --Allow selection of edges based on their orientation --Allow selection of edges based on their size --Allow selection of polygons based on their size --Allow saving/recall of polygon sub-object selections --Proposed Functionality: -- --Version History --0.1 Polygon Selection by size completed (Original name - Poly Size Selector). --0.2 Reorganised UI. --0.3 Added Edges by orientation using distance measurement method. --0.4 Added Edges by size. --0.5 Altered Edges by orientation to be based on angle from the selected direction. --0.6 Divided Edges by size into get and set - added all get functionality. --0.7 Added the Polygon Selection Sets. ---------------------------------------------------------------------------------- macroScript AST category:"Dusk" tooltip:"Architectural Selection Tools 0.7" icon:#("Uniform",8) ( if classof $ == Editable_Poly then ( -- POLY Functions -- Function to get average size of selected faces fn get_avg_size face_list = ( local total_size = 0.0 local new_size = 0.0 local count = 0 for i in face_list do ( new_size = polyop.getFaceArea $ i total_size += new_size count += 1 ) avg = sqrt (total_size / count) ) --Function to compare sizes of faces. fn check_face_sizes face_list maxSize minSize = ( good_faces = for i in face_list where polyop.getFaceArea $ i <= minSize^2 and polyop.getFaceArea $ i >= maxSize^2 collect i print good_faces polyop.setFaceSelection $ good_faces redrawViews() ) -- POLY Variables poly_size = get_avg_size (polyop.getfaceselection $) print poly_size -- EDGE Variables ztol = 0.01 ytol = 0.01 xtol = 0.01 -- GET/SET Variables a_set1 a_set2 a_set3 a_set4 a_set5 -- EDGE Functions fn Difference a b = (if a<=b then abs(a-b) else if a>b then abs (b-a)) fn edge_angle edge xtol ytol ztol dir = ( currentEdgeVerts = polyop.getVertsUsingEdge $ edge VP = for i in currentEdgeVerts collect polyOp.getVert $ i node: $ VP_dif = #(difference VP[1].x VP[2].x, difference VP[1].y VP[2].y, difference VP[1].z VP[2].z) hyp = (sqrt ((VP_dif[1]^2 + VP_dif[2]^2) + VP_dif[3]^2)) -- if hyp > mini and hyp < maxi then true else false case dir of ( "x": if acos (VP_dif[1] / hyp) < xtol then true else false "y": if acos (VP_dif[2] / hyp) < ytol then true else false "z": if acos (VP_dif[3] / hyp) < ztol then true else false ) ) fn get_avg_edge_size edge_list = ( local total_size = 0.0 local new_size = 0.0 local count = 0 for edge in edge_list do ( currentEdgeVerts = polyop.getVertsUsingEdge $ edge VP = for i in currentEdgeVerts collect polyOp.getVert $ i node: $ VP_dif = #(difference VP[1].x VP[2].x, difference VP[1].y VP[2].y, difference VP[1].z VP[2].z) new_size = (sqrt ((VP_dif[1]^2 + VP_dif[2]^2) + VP_dif[3]^2)) total_size += new_size count += 1 ) avg = (total_size / count) ) fn Det_Edge edge Xtol Ytol Ztol dir = ( currentEdgeVerts = polyop.getVertsUsingEdge $ edge VP = for i in currentEdgeVerts collect polyOp.getVert $ i node: $ VP_dif = #(difference VP[1].x VP[2].x, difference VP[1].y VP[2].y, difference VP[1].z VP[2].z) case dir of ( "x" : if VP_dif[2] < ytol and VP_dif[3] < ztol then true else false "y" : if VP_dif[1] < xtol and VP_dif[3] < ztol then true else false "z" : if VP_dif[1] < xtol and VP_dif[2] < ytol then true else false ) ) fn edge_select edges xtol ytol ztol dir = ( z_eds = for i in edges where edge_angle i xtol ytol ztol dir collect i polyop.setEdgeSelection $ z_eds redrawViews() -- print "---AST - End Edge Selection---" ) fn edge_measure edge mini maxi = ( currentEdgeVerts = polyop.getVertsUsingEdge $ edge VP = for i in currentEdgeVerts collect polyOp.getVert $ i node: $ VP_dif = #(difference VP[1].x VP[2].x, difference VP[1].y VP[2].y, difference VP[1].z VP[2].z) if (sqrt ((VP_dif[1]^2 + VP_dif[2]^2) + VP_dif[3]^2)) > mini and (sqrt ((VP_dif[1]^2 + VP_dif[2]^2) + VP_dif[3]^2)) < maxi then true else false ) --Interface rollout AST "Architectural Selection Tools" ( group "Get Polygons" ( spinner avg_size_spinner "Current:" type:#float range:[0,999999999999,(get_avg_size (polyop.getfaceselection $))] width: 160 across:3 align: #left button avg_2_min "Min" offset: [40,0] width: 35 button avg_2_max "Max" offset: [16,0] width: 35 spinner prev_size_spinner "Previous:" type:#float range:[0,99999999999,0] width: 160 across:3 align: #left button prev_2_min "Min" offset: [40,0] width: 35 button prev_2_max "Max" offset: [16,0] width: 35 spinner tolerance_spinner "Tolerance:" type:#float range:[0,99999999999,10] across:3 align:#left width: 156 button set_val "Set" offset: [40,0] width: 35 button Update "Upd" offset: [16,0] width: 35 ) group "Set Polygons" ( spinner min_size_spinner "Min Size:" type:#float range:[0,99999999999,0] across:3 align:#left width: 160 button select "Sel" offset: [40,0] width: 35 height: 42 button All "All" offset: [16,0] width: 35 height: 42 spinner max_size_spinner "Max Size:" type:#float range:[0,99999999999,1000] align:#left width: 98 offset: [0,-22] ) group "Edges by Orientation" ( spinner Z_tol_spin "Z-Edge Tol:" type:#float range:[0.01,90,ztol] width: 155 align: #left across: 3 button z_sel "Sel" offset: [40,0] width: 35 button z_all "All" offset: [16,0] width: 35 spinner Y_tol_spin "Y-Edge Tol:" type:#float range:[0.01,90,ytol] width: 155 align: #left across: 3 button y_sel "Sel" offset: [40,0] width: 35 button y_all "All" offset: [16,0] width: 35 spinner X_tol_spin "X-Edge Tol:" type:#float range:[0.01,90,xtol] width: 155 align: #left across: 3 button x_sel "Sel" offset: [40,0] width: 35 button x_all "All" offset: [16,0] width: 35 ) group "Get Edges by Size" ( spinner e_avg_size_spin "Current:" type:#float range:[0,999999999999,(get_avg_edge_size (polyop.getEdgeSelection $))] width: 160 across:3 align: #left button e_avg_2_min "Min" offset: [40,0] width: 35 button e_avg_2_max "Max" offset: [16,0] width: 35 spinner e_prev_size_spin "Previous:" type:#float range:[0,99999999999,0] width: 160 across:3 align: #left button e_prev_2_min "Min" offset: [40,0] width: 35 button e_prev_2_max "Max" offset: [16,0] width: 35 spinner e_tolerance_spin "Tolerance:" type:#float range:[0,99999999999,10] across:3 align:#left width: 156 button e_set_val "Set" offset: [40,0] width: 35 button e_Update "Upd" offset: [16,0] width: 35 ) group "Set Edges by Size" ( spinner edge_min_spin "Min Size:" type:#float range:[0,9999999,0] width: 162 align: #left across: 3 button edge_sel "Sel" offset: [40,0] width: 35 height: 42 button edge_all "All" offset: [16,0] width: 35 height: 42 spinner edge_max_spin "Max Size:" type:#float range:[0,9999999,100] align:#left width: 100 offset: [0,-22] ) group "Poly Selection Sets" ( button set1 "Set1" across: 5 button set2 "Set2" button set3 "Set3" button set4 "Set4" button set5 "Set5" button get1 "Get1" across: 5 button get2 "Get2" button get3 "Get3" button get4 "Get4" button get5 "Get5" ) --EDGE Buttons on edge_min_spin changed value do ( if edge_max_spin.value < value then edge_max_spin.value = value e_prev_size_spin.value = e_avg_size_spin.value e_avg_size_spin.value = get_avg_edge_size (polyop.getEdgeSelection $) ) on edge_max_spin changed value do ( if edge_min_spin.value > value then edge_min_spin.value = value e_prev_size_spin.value = e_avg_size_spin.value ) on e_update pressed do ( e_prev_size_spin.value = e_avg_size_spin.value e_avg_size_spin.value = get_avg_edge_size (polyop.getEdgeSelection $) ) on e_set_val pressed do ( edge_min_spin.value = e_avg_size_spin.value - e_tolerance_spin.value edge_max_spin.value = e_avg_size_spin.value + e_tolerance_spin.value ) on e_avg_2_max pressed do edge_max_spin.value = e_avg_size_spin.value on e_avg_2_min pressed do edge_min_spin.value = e_avg_size_spin.value on e_prev_2_max pressed do edge_max_spin.value = e_prev_size_spin.value on e_prev_2_min pressed do edge_min_spin.value = e_prev_size_spin.value on edge_sel pressed do ( small_edges = for i in (polyOp.getEdgeSelection $) where edge_measure i edge_min_spin.value edge_max_spin.value collect i polyop.setEdgeSelection $ small_edges redrawViews() ) on edge_all pressed do ( polyOp.setEdgeSelection $ #all small_edges = for i in (polyOp.getEdgeSelection $) where edge_measure i edge_min_spin.value edge_max_spin.value collect i polyop.setEdgeSelection $ small_edges redrawViews() ) on z_all pressed do ( polyOp.setEdgeSelection $ #all edge_Select (polyop.getEdgeSelection $) xtol ytol ztol "z" ) on z_sel pressed do edge_Select (polyop.getEdgeSelection $) xtol ytol ztol "z" on y_all pressed do ( polyOp.setEdgeSelection $ #all edge_Select (polyop.getEdgeSelection $) xtol ytol ztol "y" ) on y_sel pressed do edge_Select (polyop.getEdgeSelection $) xtol ytol ztol "y" on x_all pressed do ( polyOp.setEdgeSelection $ #all edge_Select (polyop.getEdgeSelection $) xtol ytol ztol "x" ) on x_sel pressed do edge_Select (polyop.getEdgeSelection $) xtol ytol ztol "x" on z_tol_spin changed value do ztol = value on y_tol_spin changed value do ytol = value on x_tol_spin changed value do xtol = value --POLY Buttons on min_size_spinner changed value do ( if max_size_spinner.value < value then max_size_spinner.value = value prev_size_spinner.value = avg_size_spinner.value avg_size_spinner.value = get_avg_size (polyop.getfaceselection $) ) on max_size_spinner changed value do ( if min_size_spinner.value > value then min_size_spinner.value = value prev_size_spinner.value = avg_size_spinner.value avg_size_spinner.value = get_avg_size (polyop.getfaceselection $) ) on select pressed do ( check_face_sizes (polyop.getfaceselection $) min_size_spinner.value max_size_spinner.value prev_size_spinner.value = avg_size_spinner.value avg_size_spinner.value = get_avg_size (polyop.getfaceselection $) ) on all pressed do ( all_faces = for j = 1 to (polyop.getnumfaces $) collect j check_face_sizes all_faces min_size_spinner.value max_size_spinner.value ) on update pressed do ( prev_size_spinner.value = avg_size_spinner.value avg_size_spinner.value = get_avg_size (polyop.getfaceselection $) ) on set_val pressed do ( min_size_spinner.value = avg_size_spinner.value - tolerance_spinner.value max_size_spinner.value = avg_size_spinner.value + tolerance_spinner.value ) on avg_2_max pressed do max_size_spinner.value = avg_size_spinner.value on avg_2_min pressed do min_size_spinner.value = avg_size_spinner.value on prev_2_max pressed do max_size_spinner.value = prev_size_spinner.value on prev_2_min pressed do min_size_spinner.value = prev_size_spinner.value -- Get Set Buttons on set1 pressed do a_set1 = polyop.getfaceselection $ on set2 pressed do a_set2 = polyop.getfaceselection $ on set3 pressed do a_set3 = polyop.getfaceselection $ on set4 pressed do a_set4 = polyop.getfaceselection $ on set5 pressed do a_set5 = polyop.getfaceselection $ on get1 pressed do ( if a_set1 != undefined then polyop.setfaceselection $ a_set1 redrawviews()) on get2 pressed do ( if a_set2 != undefined then polyop.setfaceselection $ a_set2 redrawviews()) on get3 pressed do ( if a_set3 != undefined then polyop.setfaceselection $ a_set3 redrawviews()) on get4 pressed do ( if a_set4 != undefined then polyop.setfaceselection $ a_set4 redrawviews()) on get5 pressed do ( if a_set5 != undefined then polyop.setfaceselection $ a_set5 redrawviews()) )--End rollout createdialog AST 230 532 )--End if poly )--End macroscript