LScript (Modeler) to snaps points in different ways to other points. It can align points in linear, either side of currently selected points or by making points snap to there nearest neighbour a set distance away.
Compatible with Newtek LightWave 9.6 and above.
// LScript Modeler - www.StephenCulley.co.uk // // web address: http://www.stephenculley.co.uk // email address: email@stephenculley.co.uk /* LScript Modeler - Snap Modeler_Snap.ls */ @version 2.2 @warnings @script modeler @name *Snap // Title sTitle = "*Snap"; // Version sVersion = "v1.0"; ctrl_c0,ctrl_c1,ctrl_c2,ctrl_c3,ctrl_c4,ctrl_c5; main { // Store bAxisX = recall("bAxisX",true); bAxisY = recall("bAxisY",true); bAxisZ = recall("bAxisZ",true); nSeperation = recall("nSeperation",0.1); iType = recall("iType",1); bTwoPointPolygon = recall("bTwoPointPolygon",false); reqbegin(sTitle + " " + sVersion); // Reset ctrl_res0 = ctlbutton("Reset",50,"button_reset"); // Button Reset ctlsep(); // Control ctrl_c0 = ctlcheckbox("X", bAxisX); ctrl_c1 = ctlcheckbox("Y", bAxisY); ctrl_c2 = ctlcheckbox("Z", bAxisZ); ctrl_c3 = ctldistance("Seperation",nSeperation); ctrl_c4 = ctlchoice("Type",iType,@"Linear","+/-","Nearest"@); ctrl_c5 = ctlcheckbox("Make Two Point Polygons", bTwoPointPolygon); // Developer ctlsep(); ctrl_dev0 = ctltext("","developer: Stephen Culley","http://www.stephenculley.co.uk"); return if !reqpost(); bAxisX = getvalue(ctrl_c0); // X bAxisY = getvalue(ctrl_c1); // Y bAxisZ = getvalue(ctrl_c2); // Z nSeperation = getvalue(ctrl_c3); iType = getvalue(ctrl_c4); bTwoPointPolygon = getvalue(ctrl_c5); // Store store("bAxisX",bAxisX); store("bAxisY",bAxisY); store("bAxisZ",bAxisZ); store("nSeperation",nSeperation); store("iType",iType); store("bTwoPointPolygon",bTwoPointPolygon); // Selection - Point (GLOBAL) selmode(GLOBAL); iPointCountBefore = pointcount(); // Selection - Point (DIRECT) selmode(DIRECT); iPointCount = pointcount(); if(iPointCount <= 1) error("None or not enough points selected."); undogroupbegin(); // Undo moninit(iPointCount,"Processing..."); // Progress Monitor if(iType == 1) // Linear { editbegin(); vSnapPoint = pointinfo(points[1]); vTempPoint = vSnapPoint; for(iCurrentPoint = 2; iCurrentPoint <= iPointCount; iCurrentPoint++) { if(bAxisX) vSnapPoint.x += nSeperation; // X if(bAxisY) vSnapPoint.y += nSeperation; // Y if(bAxisZ) vSnapPoint.z += nSeperation; // Z pointmove(points[iCurrentPoint],vSnapPoint); // Move point // Two Point Polygon if(bTwoPointPolygon) { point[1] = addpoint(vTempPoint); point[2] = addpoint(vSnapPoint); addpolygon(point); } vTempPoint = vSnapPoint; monstep(); // Progress Monitor } editend(); } if(iType == 2) // +/- { editbegin(); vSnapPoint = pointinfo(points[1]); for(iCurrentPoint = 2; iCurrentPoint <= iPointCount; iCurrentPoint++) { vPoint = pointinfo(points[iCurrentPoint]); vTempPoint = vSnapPoint; if(bAxisX) vTempPoint.x = snap(vPoint.x,vSnapPoint.x,nSeperation); // X if(bAxisY) vTempPoint.y = snap(vPoint.y,vSnapPoint.y,nSeperation); // Y if(bAxisZ) vTempPoint.z = snap(vPoint.z,vSnapPoint.z,nSeperation); // Z pointmove(points[iCurrentPoint],vTempPoint); // Move point // Two Point Polygon if(bTwoPointPolygon) { point[1] = addpoint(vTempPoint); point[2] = addpoint(vSnapPoint); addpolygon(point); } vSnapPoint = vTempPoint; monstep(); // Progress Monitor } editend(); } if(iType == 3) // Nearest { editbegin(); aPoints[1] = pointinfo(points[1]); // Add point to array for(iCurrentPoint = 2; iCurrentPoint <= iPointCount; iCurrentPoint++) { vPoint = pointinfo(points[iCurrentPoint]); vSnapPoint = aPoints[1]; Distance = distance3D(vPoint,vSnapPoint); for(iCurrentPoint = 1; iCurrentPoint <= aPoints.size(); iCurrentPoint++) { DistanceNew = distance3D(vPoint,aPoints[iCurrentPoint]); if(DistanceNew < Distance) { vSnapPoint = aPoints[iCurrentPoint]; Distance = DistanceNew; } } vTempPoint = vSnapPoint; if(bAxisX) vTempPoint.x = snap(vPoint.x,vSnapPoint.x,nSeperation); // X if(bAxisY) vTempPoint.y = snap(vPoint.y,vSnapPoint.y,nSeperation); // Y if(bAxisZ) vTempPoint.z = snap(vPoint.z,vSnapPoint.z,nSeperation); // Z pointmove(points[iCurrentPoint],vTempPoint); // Move point // Two Point Polygon if(bTwoPointPolygon) { point[1] = addpoint(vTempPoint); point[2] = addpoint(vSnapPoint); addpolygon(point); } aPoints[iCurrentPoint] = vTempPoint; // Add to array monstep(); // Progress Monitor } editend(); monend(); // Progress Monitor } // Selection - Point (GLOBAL) selmode(GLOBAL); iPointCountAfter = pointcount(); if((iPointCountAfter - iPointCountBefore) > 0) { for(s = 1; s <= (iPointCountAfter - iPointCountBefore) ; s++){aSelection[s] = s + iPointCountBefore;} selmode(USER); selpoint(SET, POINTNDX, aSelection); mergepoints(0.0); // Merge Points } undogroupend(); // Undo } button_reset { setvalue(ctrl_c0,true); // X setvalue(ctrl_c1,true); // Y setvalue(ctrl_c2,true); // Z setvalue(ctrl_c3,0.1); // Seperation setvalue(ctrl_c4,1); // Type setvalue(ctrl_c5,false); // Two Point Polygon } // SNAP snap: n1,n2,n { if(n1 < n2){return(n2 - n);} else {return(n2 + n);} } // VECTOR distance3D: v1, v2 // n { // Vector return(sqrt(((v2.x - v1.x) * (v2.x - v1.x)) + ((v2.y - v1.y) * (v2.y - v1.y)) + ((v2.z - v1.z) * (v2.z - v1.z)))); }
https://drive.google.com/open?id=1cR_q2GVUAJHumic1-A3eXV16acQnVTWs
Thanks so much!
ReplyDeleteHi. I'm trying out this script, and I was not sure how it works. I have 3 points that I want to line up into a "straight" alignment in 3d space. Is this possible? Do I deselect the X, Y, and Z axis?
ReplyDeletejust deselect the axis you don't want. make sure the first selected point is the point you want to align with, all other points selected after will then align with the first selected. Hope this helps.
ReplyDeleteSteve do you know of a script which will allow me to align points based on the first and last selected points irrespective of XYZ.
ReplyDeleteNot that I have seen.. Would it be like align to nearest position on line or distance % from either end? Im curious how you decide where to position or is it simply to get it on the same vectors?
DeleteI would like all the points to align in a row between the first and last points. I find i have been doing allot of diagonal modeling lately and whilst align to last points position on x,y,z, its no good if you have a diagonal plane or such. I mean the plane is a normal oblong its just orientated in 3d space diagonally. Yes i could rotate it and then back but i have some buildings that are pretty poly heavy and rotating them all the time is a pain. Of course if we had some really good snap tools in modeler this would help.
ReplyDelete