Not to rain on anyone's parade, but have you seen the new Attribrandomize SOP?
It's got just about every randomize preset you could want, and even works w/ Quaternions!
#include "math.h" #define PI M_PI int pt = @ptnum; if ( chi("id") ) pt = i@pt; float s = 1; if ( chi("scale") ) s = @scaleAttribute; int maxsafeint = 100000; float val = pt % maxsafeint + PI * ( pt / maxsafeint ) + ch("seed") * 0.618033988749895; float x = rand ( val ); float y = rand ( 1231 + val ); float z = rand ( 773 + val ); vector v = ( set ( x, y, z ) - 0.5 ) * chv("s") * ch("amount") * pow ( s, ch("exponent") ); @P += v;
int pointPrimsHaveDifferentAttribValues ( string input; int pt; string attribute ) { int currentValue = 0; int initialized = 0; int result = 0; int pv = pointvertex ( input, pt ); while ( pv != -1 ) { int vp = vertexprim ( input, pv ); int value = prim ( input, attribute, vp ); if ( initialized == 0 ) { currentValue = value; initialized = 1; } if ( value != currentValue ) { result = 1; break; } pv = vertexnext ( input, pv ); } return result; } i@borderpts = pointPrimsHaveDifferentAttribValues ( @OpInput1, @ptnum, chs("attribute") );
int createLine ( int pt0; int pt1 ) { int pr = addprim ( geoself ( ), "polyline" ); addvertex ( geoself ( ), pr, pt0 ); addvertex ( geoself ( ), pr, pt1 ); return pr; } int createPolygon ( int pt0; int pt1; int pt2 ) { int pr = addprim ( geoself ( ), "poly" ); addvertex ( geoself ( ), pr, pt0 ); addvertex ( geoself ( ), pr, pt1 ); addvertex ( geoself ( ), pr, pt2 ); return pr; } int createPolygon ( int pt0; int pt1; int pt2; int pt3 ) { int pr = addprim ( geoself ( ), "poly" ); addvertex ( geoself ( ), pr, pt0 ); addvertex ( geoself ( ), pr, pt1 ); addvertex ( geoself ( ), pr, pt2 ); addvertex ( geoself ( ), pr, pt3 ); return pr; } void createAxisGeometry ( float s; vector n; vector t; vector c; int color; int arrow; int scale ) { vector p [ ]; push ( p, 0 ); push ( p, set ( s, 0, 0 ) ); if ( arrow ) { float x = scale ? 0.75 * s : s - 0.25; float y = 0.03 * ( scale ? s : 1 ); push ( p, set ( x, y, y ) ); push ( p, set ( x, y, -y ) ); push ( p, set ( x, -y, y ) ); push ( p, set ( x, -y, -y ) ); } for ( int i = 0; i < len ( p ); ++i ) { matrix3 xform = dihedral ( { 1, 0, 0 }, { 0, 0, -1 } ) * lookat ( 0, n ); p [ i ] = p [ i ] * xform + t; } int pt [ ]; for ( int i = 0; i < len ( p ); ++i ) pt [ i ] = addpoint ( geoself ( ), p [ i ] ); if ( color ) { for ( int i = 0; i < len ( pt ); ++i ) setattrib ( geoself ( ), "point", "Cd", pt [ i ], -1, c, "set" ); } createLine ( pt [ 0 ], pt [ 1 ] ); if ( arrow ) { createPolygon ( pt [ 1 ], pt [ 2 ], pt [ 3 ] ); createPolygon ( pt [ 1 ], pt [ 3 ], pt [ 5 ] ); createPolygon ( pt [ 1 ], pt [ 5 ], pt [ 4 ] ); createPolygon ( pt [ 1 ], pt [ 4 ], pt [ 2 ] ); createPolygon ( pt [ 2 ], pt [ 4 ], pt [ 5 ], pt [ 3 ] ); } } void createCenterGeometry ( float s; vector t; vector c; int color; int scale ) { vector p [ ]; float x = 0.03 * ( scale ? s : 1 ); push ( p, set ( x, x, x ) ); push ( p, set ( x, x, -x ) ); push ( p, set ( x, -x, -x ) ); push ( p, set ( x, -x, x ) ); push ( p, set ( -x, x, x ) ); push ( p, set ( -x, x, -x ) ); push ( p, set ( -x, -x, -x ) ); push ( p, set ( -x, -x, x ) ); for ( int i = 0; i < len ( p ); ++i ) p [ i ] += t; int pt [ ]; for ( int i = 0; i < len ( p ); ++i ) pt [ i ] = addpoint ( geoself ( ), p [ i ] ); createPolygon ( pt [ 0 ], pt [ 1 ], pt [ 2 ], pt [ 3 ] ); createPolygon ( pt [ 1 ], pt [ 5 ], pt [ 6 ], pt [ 2 ] ); createPolygon ( pt [ 5 ], pt [ 4 ], pt [ 7 ], pt [ 6 ] ); createPolygon ( pt [ 4 ], pt [ 0 ], pt [ 3 ], pt [ 7 ] ); createPolygon ( pt [ 5 ], pt [ 1 ], pt [ 0 ], pt [ 4 ] ); createPolygon ( pt [ 7 ], pt [ 3 ], pt [ 2 ], pt [ 6 ] ); if ( color ) { for ( int i = 0; i < len ( pt ); ++i ) setattrib ( geoself ( ), "point", "Cd", pt [ i ], -1, c, "set" ); } } addattrib ( geoself ( ), "point", "Cd", { 1, 1, 1 } ); if ( chi("x") ) createAxisGeometry ( ch("s"), { 1, 0, 0 }, chv("t"), { 1, 0, 0 }, 1, chi("arrow"), chi("scale") ); if ( chi("y") ) createAxisGeometry ( ch("s"), { 0, 1, 0 }, chv("t"), { 0, 1, 0 }, 1, chi("arrow"), chi("scale") ); if ( chi("z") ) createAxisGeometry ( ch("s"), { 0, 0, 1 }, chv("t"), { 0, 0, 1 }, 1, chi("arrow"), chi("scale") ); if ( chi("center") ) createCenterGeometry ( ch("s"), chv("t"), { 1, 1, 0 }, 1, chi("scale") ); i@gl_lit = 0;
int Contains ( string collection [ ]; string item ) { for ( int i = 0; i < arraylength ( collection ); ++i ) if ( collection [ i ] == item ) return 1; return 0; } int Contains ( int collection [ ]; int item ) { for ( int i = 0; i < arraylength ( collection ); ++i ) if ( collection [ i ] == item ) return 1; return 0; } string GetPrimsFromEdge ( int input; int pt0; int pt1 ) { string prims; int hedge = pointedge ( input, pt0, pt1 ); if ( hedge != -1 ) { int count = hedge_equivcount ( input, hedge ); for ( int i = 0; i < count; ++i ) { int pr = hedge_prim ( input, hedge ); if ( pr != -1 ) { prims += itoa ( pr ) + "-"; hedge = hedge_nextequiv ( input, hedge ); } } } return prims; } int GetNextPoint ( int input; int edgept0; int edgept1; int currentpt ) { int pointNeighbors [ ] = neighbours ( input, currentpt ); string sprims = GetPrimsFromEdge ( input, edgept0, edgept1 ); string aprims [ ] = split ( sprims, "-" ); int prims [ ]; foreach ( string s; aprims ) push ( prims, atoi ( s ) ); int primPoints [ ]; for ( int i = 0; i < arraylength ( prims ); ++i ) { int count = primvertexcount ( input, prims [ i ] ); for ( int f = 0; f < count; ++f ) { int vertIndex = vertexindex ( input, prims [ i ], f ); int pointIndex = vertexpoint ( input, vertIndex ); push ( primPoints, pointIndex ); } } int uniquePoints [ ]; for ( int i = 0; i < arraylength ( pointNeighbors ); ++i ) { if ( !Contains ( primPoints, pointNeighbors [ i ] ) ) push ( uniquePoints, pointNeighbors [ i ] ); } if ( arraylength ( uniquePoints ) == 1 ) return uniquePoints [ 0 ]; return -1; } // Traverse Edges string BuildEdgeList ( int input; string edgeCollection ) { if ( edgeCollection == "" ) return "!*"; string edges [ ]; string sedges [ ] = split ( edgeCollection, " " ); int traverseCount = 0; int totalCount = arraylength ( sedges ); while ( arraylength ( sedges ) > 0 ) { string sedge; pop ( sedge, sedges ); string edgePoints [ ] = split ( sedge, "-" ); if ( !Contains ( edges, sedge ) ) { ++traverseCount; for ( int c = 0; c < 2; ++c ) { int points [ ]; int pt0 = atoi ( edgePoints [ c ] ); int pt1 = atoi ( edgePoints [ 1 - c ] ); int currentpt = pt0; int lastPoint = pt0; push ( points, currentpt ); int nextPoint = GetNextPoint ( input, pt0, pt1, currentpt ); //printf( "nextpt: %s\n", nextPoint ); while ( nextPoint != -1 && nextPoint != lastPoint ) { pt0 = currentpt; pt1 = nextPoint; currentpt = pt1; push ( points, currentpt ); nextPoint = GetNextPoint ( input, pt0, pt1, currentpt ); //printf( "nextpt: %s\n", nextPoint ); } for ( int i = 0; i < arraylength ( points ) - 1; ++i ) { int p0 = min ( points [ i ], points [ i + 1 ] ); int p1 = max ( points [ i ], points [ i + 1 ] ); push ( edges, sprintf ( "%s-%s", p0, p1 ) ); //printf( "edge: %s\n", sprintf ( "%s-%s", p0, p1 ) ); } //printf( "points: %s\n", points ); } push ( edges, sedge ); } //else //printf( "BYPASS: %s\n", sedge ); } string edgelist = ""; foreach ( string s; edges ) edgelist += "p" + s + " "; //printf( "Traversed: %s edges out of %s edges\n", traverseCount, totalCount ); return edgelist; } s@edgelist = BuildEdgeList ( 0, chs("edges") );[/code:1] Add a string parameter called edges and add this Python expression: [code:1]edges = "" geo = hou.node ( "." ).geometry ( ) names = hou.evalParm ( "group" ).split ( ' ' ) for name in names: try: group = geo.globEdges ( name ) except hou.OperationFailed: group = ( ) for e in group: p0 = e.points ( ) [ 0 ] p1 = e.points ( ) [ 1 ] try: isValidEdge = geo.findEdge ( p0, p1 ) except: isValidEdge = False if not isValidEdge: continue a = str ( min ( p0.number ( ), p1.number ( ) ) ) b = str ( max ( p0.number ( ), p1.number ( ) ) ) edges += "{0}-{1} ".format ( a, b ) return edges[:-1]
vux
insert edges with flow please
int index = 0; string name = chs("seedAttribute"); if ( chi("type") == 1 ) index = @primnum; else if ( chi("type") == 2 ) index = @ptnum; else if ( chi("type") == 3 ) index = @vtxnum; if ( chi("useSeed") ) { int exist = 0; int hash = 1; int type = attribtype ( @OpInput1, chs("type"), name ); if ( type == 0 ) { int value = 0; exist = getattribute ( @OpInput1, value, chs("type"), name, index, @vtxnum ); if ( exist ) hash = random_ihash ( value ) % 65536; } else if ( type == 1 ) { float value = 0; exist = getattribute ( @OpInput1, value, chs("type"), name, index, @vtxnum ); if ( exist ) hash = random_fhash ( value ) % 65536; } else if ( type == 2 ) { string value = ""; exist = getattribute ( @OpInput1, value, chs("type"), name, index, @vtxnum ); if ( exist ) hash = random_shash ( value ) % 65536; } if ( exist ) index = hash; } float seed = 0.99 + ch("seed"); float r = rand ( index + seed + sin ( 13 * index + 19 * seed ) ); float s = fit ( random ( 17 * index + 91 * seed ), 0, 1, ch("srangex"), ch("srangey")); s = ch("s") * ( 1 - ch("srand") ) + s * ch("srand") * ch("s"); float val = fit ( random ( 173 * index + 11 * seed ), 0, 1, ch("vrangex"), ch("vrangey")); val = ch("v") * ( 1 - ch("vrand") ) + val * ch("vrand") * ch("v"); @Cd = hsvtorgb ( ( r + 0.618033988749895 ) % 1, s, val );
mantragora
It would be nice if someone could make this topic STICKY, don't you think?
int ctype = chi("type"); int primorpt = -1; if ( ctype == 0 ) primorpt = @ptnum; if ( ctype == 1 ) primorpt = @primnum; int hash = -1; string name = chs("attribute"); int type = attribtype ( @OpInput1, chs("stype"), name ); if ( type == 0 ) { int value = 0; int exist = getattribute ( @OpInput1, value, chs("stype"), name, primorpt, @vtxnum ); if ( exist ) hash = random_ihash ( value ) % 65536; } else if ( type == 1 ) { float value = 0; int exist = getattribute ( @OpInput1, value, chs("stype"), name, primorpt, @vtxnum ); if ( exist ) hash = random_fhash ( value ) % 65536; } else if ( type == 2 ) { string value = ""; int exist = getattribute ( @OpInput1, value, chs("stype"), name, primorpt, @vtxnum ); if ( exist ) hash = random_shash ( value ) % 65536; } i@hash = hash;
int createPolygon ( int pt0; int pt1; int pt2 ) { int pr = addprim ( geoself ( ), "poly" ); addvertex ( geoself ( ), pr, pt0 ); addvertex ( geoself ( ), pr, pt1 ); addvertex ( geoself ( ), pr, pt2 ); return pr; } void createGeometry ( float s ) { float ss = 0.25 * s; vector p [ ]; push ( p, set ( 0, 0, s ) ); push ( p, set ( -ss, 0, 0 ) ); push ( p, set ( ss, 0, 0 ) ); push ( p, set ( 0, 0, 0 ) ); push ( p, set ( 0, -ss, 0 ) ); int pt [ ]; for ( int i = 0; i < len ( p ); ++i ) pt [ i ] = addpoint ( geoself ( ), p [ i ] ); createPolygon ( pt [ 0 ], pt [ 2 ], pt [ 3 ] ); createPolygon ( pt [ 0 ], pt [ 3 ], pt [ 1 ] ); createPolygon ( pt [ 0 ], pt [ 4 ], pt [ 3 ] ); setattrib ( geoself ( ), "primitive", "Cd", 0, -1, { 1, 0, 0 }, "set" ); setattrib ( geoself ( ), "primitive", "Cd", 1, -1, { 0, 0, 1 }, "set" ); setattrib ( geoself ( ), "primitive", "Cd", 2, -1, { 0, 1, 0 }, "set" ); } addattrib ( geoself ( ), "primitive", "Cd", { 1, 1, 1 } ); createGeometry ( ch("s") ); i@gl_lit = 0;
float feet = chf("feet"); float inchesperfeet = 12; float inches = chf("inches"); float inchespermeter = 39.3701; int numerator = chi("numerator"); int denominator = chi("denominator"); float decimal = float(numerator) / float(denominator); f@meters = ((feet*inchesperfeet) + inches + decimal)/inchespermeter; float lbsToKg = 0.45359237; float lbs = chf("pounds"); f@Kg = lbs * lbsToKg;
olivierth
Convert from imperial to metric (feets, inches, numerator/denominator, pounds)
Does anyone know how to show the detail attributes in the UI of the asset?
if(ch("sourcegrouptype") == 4, 0, ch("sourcegrouptype"))