Selection loop: Sélection d'arêtes qui se suivent . By Michael Gibson
Permet de sélectionner certaines arêtes d'une face sélectionnée.
L
|
script:/*Loop selection*/moi.geometryDatabase.selectLoop();
|
Sélection des faces d'une boucle fermée d'Arêtes! SelectFill
Original Les faces doivent être "Jointes"! Les faces peuvent être "angulées" !
Toutes les surfaces seront sélectionnées! |
Etendre une sélection By Max Smirnov (Extend Selection)
script:/*Etendre selection*/ function es(edg){ var i,f; for (i=0; i<edg.length; i++) {f=edg.item(i).getFacesOfEdge(); f.setProperty('selected',1);}} var so = moi.geometryDatabase.getSelectedObjects(), sf=so.getFaces(), i; for ( i=0; i<sf.length;i++) es(sf.item(i).getEdges()); es(so.getEdges());
Réduire une sélection By Max Smirnov (Reduce Selection)
script:/*Réduire Loop selection*/ function es(edg){ var i,f; for (i=0; i<edg.length; i++) {f=edg.item(i).getFacesOfEdge(); f.setProperty('selected',0);}} var gd = moi.geometryDatabase; gd.invertSelection(); var so = gd.getSelectedObjects(), sf=so.getFaces(), i; gd.invertSelection(); for ( i=0; i<sf.length;i++) es(sf.item(i).getEdges());
script:/*Etendre selection*/ function es(edg){ var i,f; for (i=0; i<edg.length; i++) {f=edg.item(i).getFacesOfEdge(); f.setProperty('selected',1);}} var so = moi.geometryDatabase.getSelectedObjects(), sf=so.getFaces(), i; for ( i=0; i<sf.length;i++) es(sf.item(i).getEdges()); es(so.getEdges());
Réduire une sélection By Max Smirnov (Reduce Selection)
script:/*Réduire Loop selection*/ function es(edg){ var i,f; for (i=0; i<edg.length; i++) {f=edg.item(i).getFacesOfEdge(); f.setProperty('selected',0);}} var gd = moi.geometryDatabase; gd.invertSelection(); var so = gd.getSelectedObjects(), sf=so.getFaces(), i; gd.invertSelection(); for ( i=0; i<sf.length;i++) es(sf.item(i).getEdges());
By Michael
switching from the selection of the selected faces to the edges of the faces adjacent to the unselected faces
switching from the selection of the selected faces to the edges of the faces adjacent to the unselected faces
script : /* commutation de la sélection des faces sélectionnées vers les arêtes des faces adjacentes aux faces non sélectionnées */ var gd = moi.geometryDatabase ; var seledges = moi.geometryDatabase.createObjectList() ; var faces = gd.getSelectedObjects().getFaces() ; for ( var i = 0 ; i < faces.length ; ++i ) { var edges = faces. item(i).getEdges() ; for ( var j = 0 ; j < edges.length ; ++j ) { var edge = edges.item(j) ; var allselected = true ; var facesofedge = edge.getFacesOfEdge() ; for ( var k = 0 ; k < facesofedge.length ; ++k ) { if ( !facesofedge.item(k).selected ) { allselected = false ; } } if ( !allselected || facesofedge.length == 1 ) { seledges.addObject( edge ) ; } } gd.deselectAll() ; seledges.setProperty( "selected", true ) ;)
evolve the face selection to a neighboring face that is coplanar with the current face selection
script: /* faire évoluer la sélection des faces vers une face voisine qui soit coplanaire avec la sélection actuelle des faces */ var faces = moi.geometryDatabase.getSelectedObjects().getFaces(); for ( var i = 0; i < faces.length; ++i ) { var f = faces.item(i); var edges = f.getEdges(); for ( var j = 0; j < edges.length; ++j ) { var e = edges.item(j); var faces2 = e.getFacesOfEdge(); for ( var k = 0; k < faces2.length; ++k ) { var f2 = faces2.item(k); if ( f2.id != f.id && f2.isPlanar && f.isPlanar && f.isOnPlane( f2.planarFrame ) ) f2.selected = true; } } }
grow face selection to all neighboring faces that are coplanar with the current face selection:
script: /* étendre la sélection de faces à toutes les faces voisines qui sont coplanaires avec la sélection de faces actuelle :*/ while ( true ) { var did_one = false; var faces = moi.geometryDatabase.getSelectedObjects().getFaces(); for ( var i = 0; i < faces.length; ++i ) { var f = faces.item(i); var edges = f.getEdges(); for ( var j = 0; j < edges.length; ++j ) { var e = edges.item(j); var faces2 = e.getFacesOfEdge(); for ( var k = 0; k < faces2.length; ++k ) { var f2 = faces2.item(k); if ( f2.id != f.id && f2.isPlanar && f.isPlanar && f.isOnPlane( f2.planarFrame ) ) if ( !f2.selected ) { f2.selected = true; did_one = true; } } } } if ( !did_one ) break; }
grow face selection to all neighboring faces that are coplanar with the current face selection:
script: /* étendre la sélection de faces à toutes les faces voisines qui sont coplanaires avec la sélection de faces actuelle :*/ while ( true ) { var did_one = false; var faces = moi.geometryDatabase.getSelectedObjects().getFaces(); for ( var i = 0; i < faces.length; ++i ) { var f = faces.item(i); var edges = f.getEdges(); for ( var j = 0; j < edges.length; ++j ) { var e = edges.item(j); var faces2 = e.getFacesOfEdge(); for ( var k = 0; k < faces2.length; ++k ) { var f2 = faces2.item(k); if ( f2.id != f.id && f2.isPlanar && f.isPlanar && f.isOnPlane( f2.planarFrame ) ) if ( !f2.selected ) { f2.selected = true; did_one = true; } } } } if ( !did_one ) break; }
This should extend the edge selection to neighboring edges that are within a 20 degree angle.
Cela devrait étendre la sélection des arêtes aux arêtes voisines qui se trouvent dans un angle de 20 degrés.
script: /* Etendre la Sélection d'arête d'un pas */ var angle_degrees = 20; var cos_ang = Math.cos(angle_degrees * Math.PI / 180.0); var edges = moi.geometryDatabase.getSelectedObjects().getEdges(); for ( var i = 0; i < edges.length; ++i ) { var e = edges.item(i); var ptA = e.getStartPt(); var ptB = e.getEndPt(); var done = []; var faces = e.getFacesOfEdge(); while ( faces.length> 0 ) { var f = faces.item( faces.length-1 ); faces.removeObjectAt( faces.length-1 ); if ( done[f.id] ) continue; done[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 ) e2.selected = true; var faces2 = e2.getFacesOfEdge(); for ( var k = 0; k < faces2.length; ++k ) { var f2 = faces2.item(k); if ( !done[f2.id] ) faces.addObject( f2 ); } } } } }
Cela devrait étendre la sélection des arêtes aux arêtes voisines qui se trouvent dans un angle de 20 degrés.
script: /* Etendre la Sélection d'arête d'un pas */ var angle_degrees = 20; var cos_ang = Math.cos(angle_degrees * Math.PI / 180.0); var edges = moi.geometryDatabase.getSelectedObjects().getEdges(); for ( var i = 0; i < edges.length; ++i ) { var e = edges.item(i); var ptA = e.getStartPt(); var ptB = e.getEndPt(); var done = []; var faces = e.getFacesOfEdge(); while ( faces.length> 0 ) { var f = faces.item( faces.length-1 ); faces.removeObjectAt( faces.length-1 ); if ( done[f.id] ) continue; done[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 ) e2.selected = true; var faces2 = e2.getFacesOfEdge(); for ( var k = 0; k < faces2.length; ++k ) { var f2 = faces2.item(k); if ( !done[f2.id] ) faces.addObject( f2 ); } } } } }
Il suffit de sélectionner une arête et Clic Droit du rappel de la dernière fonction utilisée!
On peut sélectionner plusieurs segments de droite ou d'arcs de cercle en même temps!!!
On peut sélectionner plusieurs segments de droite ou d'arcs de cercle en même temps!!!
allows you to enter a longer string in one go
Et voici une version qui permet de saisir une chaîne plus longue en une seule fois :
script : /* Etendre la sélection d'arêtes */ 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; }
Et voici une version qui permet de saisir une chaîne plus longue en une seule fois :
script : /* Etendre la sélection d'arêtes */ 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; }
extend the selection tangentially
Etendre la sélection tangentiellement by Cemortan_Tudor
Etendre la sélection tangentiellement by Cemortan_Tudor
Bascule une Sélection de Faces en Sélection d'Arêtes!!! Original
script: /* Bascule Sélection de Faces en Sélection d'Arêtes */ var gd = moi.geometryDatabase; var faces = gd.getSelectedObjects().getFaces(); gd.deselectAll(); for ( var i = 0; i < faces.length; ++i ) faces.item(i).getEdges().setProperty( 'selected', true );
Bascule une sélection d'arête en sélection de faces! Original
script: /* Bascule Sélection d'Arêtes en Sélection de Faces */ var processed_faces = [], processed_edges = []; var edges = moi.geometryDatabase.getSelectedObjects().getEdges(); for ( var i = 0; i < edges.length; ++i ) { var edge = edges.item(i); var faces = edge.getFacesOfEdge(); for ( var j = 0; j < faces.length; ++j ) { var face = faces.item(j); if ( processed_faces[face.id] ) { continue; } processed_faces[face.id] = true; var all_selected = true; var these_edges = face.getEdges(); for ( var k = 0; k < these_edges.length; ++k ) { var this_edge = these_edges.item(k); if ( !this_edge.selected ) { all_selected = false; break; } } if ( all_selected ) { for ( var k = 0; k < these_edges.length; ++k ) { var this_edge = these_edges.item(k); processed_edges[this_edge.id] = true; } face.selected = true; } } } for ( var i = 0; i < edges.length; ++i ) { var edge = edges.item(i); if ( processed_edges[edge.id] ) { edge.selected = false; } }
A remarquer : pas besoin de cliquer 2 fois sur une arête commune, des arêtes orphelines ne sélectionnent pas de faces!
Sélection du contour d'après une sélection d'arêtes original
script: /* Select Outlines v1.4 */ var gd=moi.geometryDatabase, so=gd.getSelectedObjects(); function ss(o,v){o.setProperty("selected",v)} function sl(o){ for ( var i=0; i<o.length; ++i ) o.item(i).getEdges().invertProperty("selected");} gd.selectLoop(); sl(so.getFaces()); sl(so.getSolids()); sl(so.getOpenBReps()); sl(so.getSingleFaceBReps()); ss(so.getBReps(),0); ss(so.getFaces(),0);
Isolation des objets sélectionnés Original
script: /* Isolation Multi-niveaux */ var states = []; var objs = moi.geometryDatabase.getObjects(); for ( var i = 0; i < objs.length; ++i ) { var obj = objs.item(i); states[obj.id] = obj.hidden; if ( !obj.selected ) { obj.hidden = true; } } var levels = []; try { levels = moi.command.getOption( 'multi-level isolate' ); } catch(e) {}; levels.push( states ); moi.command.setOption( 'multi-level isolate', levels );
Et pour récupérer les sélections multi-niveaux:
script: /* Révéler l'isolation*/ var levels = []; try { levels = moi.command.getOption( 'multi-level isolate' ); } catch(e) {} if ( levels.length > 0 ) { var states = levels.pop(); moi.command.setOption( 'multi-level isolate', levels ); var objs = moi.geometryDatabase.getObjects(); for ( var i = 0; i < objs.length; ++i ) { var obj = objs.item(i); var state = states[obj.id]; if ( state != undefined ) { obj.hidden = state; } } }Cliquer ici pour modifier.
Et pour récupérer les sélections multi-niveaux:
script: /* Révéler l'isolation*/ var levels = []; try { levels = moi.command.getOption( 'multi-level isolate' ); } catch(e) {} if ( levels.length > 0 ) { var states = levels.pop(); moi.command.setOption( 'multi-level isolate', levels ); var objs = moi.geometryDatabase.getObjects(); for ( var i = 0; i < objs.length; ++i ) { var obj = objs.item(i); var state = states[obj.id]; if ( state != undefined ) { obj.hidden = state; } } }Cliquer ici pour modifier.