// SmartWeld // Alexandre Labedade 2010 // contact : alesk@alesk.fr or earthwormjim@free.fr @version 2.7 @script modeler @warnings @name SmartWeld c1; gMergeCentered = globalrecall( "SMARTWELD_gMergeCentered", 0 ); gSmartCentered = globalrecall( "SMARTWELD_gSmartCentered", 0 ); POINTMODE = 1; POLYMODE = 2; main { undogroupbegin(); // figure out wich selection mode is active sel_mode = POINTMODE; selmode( DIRECT ); var pc[6]; pc = polycount(); nb_direct_point = pointcount(); nb_direct_poly = pc[1]; selmode( USER ); var pc[6]; pc = polycount(); nb_user_point = pointcount(); nb_user_poly = pc[1]; if (nb_direct_point == nb_user_point && nb_direct_point > 0) { sel_mode = POINTMODE; } if (nb_direct_poly == nb_user_poly && nb_direct_poly > 0) { sel_mode = POLYMODE; } if (sel_mode == POINTMODE) { if (nb_direct_point > 0) { reqbegin( "Weld Points" ); c1 = ctlchoice( "Weld position", gMergeCentered.asInt(), @"First","Center","Last"@ ); c2 = ctlchoice( "Smart centered", gSmartCentered.asInt(), @"No","X","Y","Z"@ ); return if !reqpost(); gMergeCentered = getvalue( c1 ); gSmartCentered = getvalue( c2 ); reqend(); globalstore( "SMARTWELD_gMergeCentered", gMergeCentered ); globalstore( "SMARTWELD_gSmartCentered", gSmartCentered ); //---------------------------------------------------------------------- // Detect symmetry mode editbegin(); selection = points; first_pos = pointinfo(selection[1]); last_pos = pointinfo(selection[sizeof(selection)]); pid1 = addpoint(100,0,0); pid2 = addpoint(-100,0,0); editend(); selpoint(CLEAR); selpoint(SET, POINTID, pid1); selpoint(SET, POINTID, pid2); move(1,0,0); selpoint(CLEAR); symmetry = false; editbegin(); if (pointinfo(pid2) == <-101,0,0>) symmetry = true; rempoint(pid1); rempoint(pid2); if(symmetry){ left_list = array; right_list = array; center_list = array; foreach(p,selection){ refpos = pointinfo(p); if(refpos.x == 0) center_list += p; if(refpos.x < 0) left_list += p; if(refpos.x > 0) right_list += p; } } editend(); //---------------------------------------------------------------------- // weld on first or last point if (gMergeCentered == 1 || gMergeCentered == 3) { if(symmetry){ // in symmetry mode, all actions takes place on the right side first_pos.x = abs(first_pos.x); last_pos.x = abs(last_pos.x); if(gMergeCentered == 1) pos = first_pos; if(gMergeCentered == 3) pos = last_pos; selpoint(SET,POINTID,right_list); scale( 0, pos ); mergepoints(); }else{ selpoint(SET,POINTID,selection); scale( 0, first_pos ); } }//if (gMergeCentered == 1 || gMergeCentered == 3) // average weld if (gMergeCentered == 2) { if(symmetry){ if(!right_list.isNil()){ editbegin(); pos = <0, 0, 0>; nb_points = sizeof(right_list); foreach (p, right_list) { pos += pointinfo( p ); } pos = pos / nb_points; editend(); selpoint(SET,POINTID,right_list); scale( 0, pos ); mergepoints(); } if(!center_list.isNil()){ selpoint(CLEAR); editbegin(); pos = <0, 0, 0>; nb_points = sizeof(center_list); foreach (p, center_list) { pos += pointinfo( p ); } pos = pos / nb_points; editend(); selpoint(SET,POINTID,center_list); scale( 0, pos ); mergepoints(); } }else{ if(gSmartCentered==1){ editbegin(); pos = <0, 0, 0>; foreach (p, selection) { pos += pointinfo( p ); } pos = pos / nb_user_point; editend(); selpoint(SET,POINTID,selection); scale( 0, pos ); mergepoints(); }else{ var positions = array; var tmp = array; var n=1; editbegin(); foreach (p, selection) { tmp[1]= p; tmp[2]= pointinfo( p ); positions[n] = tmp; n++; } editend(); selpoint(CLEAR); var sel = array; while(sizeof(positions)>0){ p = positions[1][1]; pos = positions[1][2]; positions[1] = nil; positions.sortA(); positions.pack(); positions.trunc(); id = 0; mindist = 999999999; n=0; foreach(tmp , positions){ n++; if(gSmartCentered==2) test = pos.x == tmp[2].x; if(gSmartCentered==3) test = pos.y == tmp[2].y; if(gSmartCentered==4) test = pos.z == tmp[2].z; if(vmag(tmp[2] - pos)0){ centre = (pos + positions[id][2])/2.0; sel[1] = p; sel[2] = positions[id][1]; selpoint(SET,POINTID,sel); scale( 0, centre ); positions[id] = nil; positions.sortA(); positions.pack(); positions.trunc(); selpoint(CLEAR); } } selpoint(SET,POINTID,selection); mergepoints(); } } }// if (gMergeCentered == 2) } }else{ // merge polygons if (nb_direct_poly > 0) { mergepols(); } } undogroupend(); }