Python Tutorials | (back to the list of tutorials) |
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") #input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 8 vnum = 8 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum+1) : for j in range(vnum+1) : pt = surf.pt( i*uinc, j*vinc ) IPoint(pt).clr( i*uinc, j*vinc, 0)
The for loop and the way to use surf.pt( i*uinc, j*vinc ) in the code above are a basic way to extract points on the surface to create new geometries on the surface.
When you don't need the input surface anymore, you can delete it by del() method.
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") #/input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 8 vnum = 8 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum+1) : for j in range(vnum+1) : pt = surf.pt( i*uinc, j*vinc ) IPoint(pt).clr( i*uinc, j*vinc, 0) surf.del()
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") # input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 8 vnum = 8 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum) : for j in range(vnum) : pt1 = surf.pt(i*uinc, j*vinc) pt2 = surf.pt((i+1)*uinc, j*vinc) ICurve(pt1, pt2).clr(0) surf.del()
In the similar way, you can draw lines on a surface in v direction, by switching the logic of i and j.
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") #input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 8 vnum = 8 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum+1) : for j in range(vnum) : pt1 = surf.pt(i*uinc, j*vinc) pt2 = surf.pt(i*uinc, (j+1)*vinc) ICurve(pt1, pt2).clr(1.0) surf.del()
To combine both, dealing with the ending number difference in u and v direction, you'd use if condition to skip the logic around the ending number.
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") # input geometry from 3dm file IG.open("surface1.obj") # input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 8 vnum = 8 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum+1) : for j in range(vnum+1) : pt1 = surf.pt(i*uinc, j*vinc) if i < unum : pt2u = surf.pt((i+1)*uinc, j*vinc) ICurve(pt1, pt2u).clr(0) if j < vnum : pt2v = surf.pt(i*uinc, (j+1)*vinc) ICurve(pt1, pt2v).clr(1.0) surf.del()
When you run the for loops with the counter i and j, the behavior of the internal parameter of u and v, calculated by the counter i, j and the interval uinc, vinc on the surface can be diagrammed like the below.
When the iteration of for loop is going through, depending on the state (depending on what number i and j are assigned), the location of the point specified the parameter is relatively changed.
To build geometry relative to the current state of i and j in the for loop, you specify a relative location using the counter i, j and the interval uinc and vinc.
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") #input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 8 vnum = 8 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum) : for j in range(vnum) : pt1 = surf.pt(i*uinc, j*vinc) pt2 = surf.pt((i+1)*uinc, (j+1)*vinc) ICurve(pt1, pt2).clr(0,1.,1.) surf.del()
To flip the direction of diagonals, use
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") #input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 8 vnum = 8 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum) : for j in range(vnum) : pt1 = surf.pt(i*uinc, (j+1)*vinc) pt2 = surf.pt((i+1)*uinc, j*vinc) ICurve(pt1, pt2).clr(0,0,1.) surf.del()
The below is an example to combine diagonal lines and orthogonal u lines and v lines.
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") #input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 8 vnum = 8 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum+1) : for j in range(vnum) : pt1 = surf.pt(i*uinc, j*vinc) if i < unum : pt2u = surf.pt((i+1)*uinc, j*vinc) ICurve(pt1, pt2u).clr(0) if j < vnum : pt2v = surf.pt(i*uinc, (j+1)*vinc) ICurve(pt1, pt2v).clr(1.0) if i < unum and j < vnum : pt2uv = surf.pt((i+1)*uinc, (j+1)*vinc) ICurve(pt1, pt2uv).clr(0,1.,1.) surf.del()
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") #input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 8 vnum = 8 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum) : for j in range(vnum+1) : if (i+j)%2 == 0 : pt1 = surf.pt(i*uinc, j*vinc) if j > 0 : pt2 = surf.pt((i+1)*uinc, (j-1)*vinc) ICurve(pt1, pt2).clr(0) if j < vnum : pt3 = surf.pt((i+1)*uinc, (j+1)*vinc) ICurve(pt1, pt3).clr(0,0,1.) surf.del()
The if condition of if( (i+j)%2 == 0 ) picks every other point in the diagonal checker pattern way as shown in the diagram below.
Then on each point,
When this "<" shape is repeated at each diagrid point, it forms diagrid lines.
If you use
the if condition of if( (i+j)%2 == 1 ) ,
instead of if( (i+j)%2 == 0 ) ,
The corner condition of diagrid lines can be changed.
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") #input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 8 vnum = 8 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum) : for j in range(vnum+1) : if (i+j)%2 == 1 : pt1 = surf.pt(i*uinc, j*vinc) if j > 0 : pt2 = surf.pt((i+1)*uinc, (j-1)*vinc) ICurve(pt1, pt2).clr(0) if j < vnum : pt3 = surf.pt((i+1)*uinc, (j+1)*vinc) ICurve(pt1, pt3).clr(0,0,1.) surf.del()
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") #input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 8 vnum = 4 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum) : vnum+=1 vinc = 1.0/vnum for j in range(vnum+1) : vinc2 = 1.0/(vnum+1) pt1 = surf.pt(i*uinc, j*vinc) pt2 = surf.pt((i+1)*uinc, j*vinc2) pt3 = surf.pt((i+1)*uinc, (j+1)*vinc2) ICurve(pt1, pt2).clr(1.,0,0) ICurve(pt1, pt3).clr(.5,0,1) surf.del()
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") # input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 20 vnum = 8 uinc = 1.0/unum vinc = 1.0/vnum r = 0.3 for i in range(unum+1) : for j in range(vnum+1) : if (i+j)%2 == 0 : pt1 = surf.pt(i*uinc, (j-r)*vinc) pt2 = surf.pt(i*uinc, (j+r)*vinc) ICurve(pt1, pt2).clr(1.,0,1.) if i < unum : if j > 0 : pt3 = surf.pt((i+1)*uinc, (j-1+r)*vinc) ICurve(pt1, pt3).clr(0) if j < vnum : pt4 = surf.pt((i+1)*uinc, (j+1-r)*vinc) ICurve(pt2, pt4).clr(0,0,1.) surf.del()
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") #input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 12 vnum = 12 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum+1) : for j in range(vnum+1) : pt1 = surf.pt(i*uinc, j*vinc) if (i+j)%3 == 0 : if i < unum : pt2 = surf.pt((i+1)*uinc, j*vinc) ICurve(pt1, pt2).clr(0) # orthogonal line if j < vnum : pt3 = surf.pt(i*uinc, (j+1)*vinc) ICurve(pt1, pt3).clr(0.5) # orthogonal line if (i+j)%3 == 1 : if i < unum and j < vnum : pt4 = surf.pt((i+1)*uinc, (j+1)*vinc) ICurve(pt1, pt4).clr(1.,0,0) # diagonal line surf.del()
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") #input geometry from OBJ file surfs = IG.surfaces() for surf in surfs: unum = 8 vnum = 8 uinc = 1.0/unum vinc = 1.0/vnum for i in range(unum) : for j in range(vnum+1) : if (i+j)%2 == 0 : pt1 = surf.pt(i*uinc, j*vinc) if j > 0 : pt2 = surf.pt((i+1)*uinc, (j-1)*vinc) ICylinder(pt1, pt2, 0.5) if j < vnum : pt3 = surf.pt((i+1)*uinc, (j+1)*vinc) ICylinder(pt1, pt3, 0.5) surf.del()
add_library('igeo') size( 480, 360, IG.GL ) #IG.open("surface1.3dm") #input geometry from 3dm file IG.open("surface1.obj") #input geometry from OBJ file surfs = IG.surfaces() for surf in surfs : unum = 12 vnum = 12 uinc = 1.0/unum vinc = 1.0/vnum depth = 3.0 for i in range(unum+1) : for j in range(vnum+1) : pt1 = surf.pt(i*uinc, j*vinc) pt1d = surf.pt(i*uinc, j*vinc, depth) if (i+j)%3 == 0 : if i < unum : pt2 = surf.pt((i+1)*uinc, j*vinc) pt2d = surf.pt((i+1)*uinc, j*vinc, depth) ISurface(pt1, pt2, pt2d, pt1d).clr(0) if j < vnum : pt3 = surf.pt(i*uinc, (j+1)*vinc) pt3d = surf.pt(i*uinc, (j+1)*vinc, depth) ISurface(pt1, pt3, pt3d, pt1d).clr(0.5) if (i+j)%3 == 1 : if i < unum and j < vnum : pt4 = surf.pt((i+1)*uinc, (j+1)*vinc) pt4d = surf.pt((i+1)*uinc, (j+1)*vinc, depth) ISurface(pt1, pt4, pt4d, pt1d).clr(1.,0,0) surf.del()