Tanget Edges - Chain Select

 From:  MO (MO_TE)
11506.9 In reply to 11506.8 
Hi Zooen
The code you posted has a little typo. I think you missed the last bracket at the end.
Here is the correct one:
code:
script :/* Extend edge selection */ var angle_degrees = 20; var cos_ang = Math.cos( angle_degrees * Math.PI / 180.0 ); var done_edges =[]; while ( 1 ) { var any_change = false; var edges = moi.geometryDatabase.getSelectedObjects().getEdges(); for ( var i = 0; i < edges.length; ++i ) { var e = edges.item(i); if ( done_edges[e.id] ) continue; done_edges[e.id] = true; var ptA = e.getStartPt(); var ptB = e.getEndPt(); var done_faces = []; var faces = e.getFacesOfEdge(); while ( faces.length> 0 ) { var f = faces.item( faces.length-1 ); faces.removeObjectAt( faces.length-1 ); if ( done_faces[f.id] ) continue; done_faces[f.id] = true; var edges2 = f.getEdges(); for ( var j = 0; j < edges2.length; ++j ) { var e2 = edges2.item(j); var ptC = e2.getStartPt(); var ptD = e2.getEndPt(); var tol = 1.0e-6; var A = false, B = false, C = false, D = false; if ( moi.vectorMath.distance( ptA, ptC ) < tol ) { A = true; C = true; } else if ( moi.vectorMath.distance( ptA, ptD ) < tol ) { A = true; D = true; } else if ( moi.vectorMath.distance( ptB, ptC ) < tol ) { B = true; C = true; } else if ( moi.vectorMath.distance( ptB, ptD ) < tol ) { B = true; D = true; } if ( A || B ) { var tan_e = e.evaluateTangent( A ? e.domainMin : e.domainMax ); var tan_e2 = e2.evaluateTangent( C ? e2.domainMin : e2.domainMax ); if ( Math.abs( (tan_e.x * tan_e2.x) + (tan_e.y * tan_e2.y) + (tan_e.z * tan_e2.z) )> cos_ang ) { if ( !e2.selected ) { e2.selected = true; any_change = true; } } var faces2 = e2.getFacesOfEdge(); for ( var k = 0; k < faces2.length; ++k ) { var f2 = faces2.item(k); if ( !done_faces[f2.id] ) faces.addObject( f2 ); } } } } } if ( !any_change ) break; }


PS:
One trick to select the edges faster for symmetrical objects is to use the "SelectSimilarLengthEdges" and "ExtentEdgeSelection" scripts together.
Here is a modified version of the "SelectSimilarLengthEdges" script I'm using. It can work on multiple selected edges.
code:
script:/* Select Similar Length Edges ( Multiple Selection ) */ try { var selectedEdges = moi.geometryDatabase.getSelectedObjects().getEdges(); for(p=0; p<selectedEdges.length; p++) { var edge = selectedEdges.item(p); var tollerance = 1000; var edgeL = edge.getLength(); var min = edgeL - edgeL/tollerance; var max = edgeL + edgeL/tollerance; var edges = edge.getParentBRep().getEdges(); for ( var i = 0; i < edges.length; ++i ) { var edgeLoopL = edges.item(i).getLength(); if ( edgeLoopL> min && edgeLoopL< max) edges.item(i).selected = true; } } }catch(e){}