//genesis function do_rel_position(src, x, y, z) str src float x, y, z int nmsgs, i float tx, ty, tz str child nmsgs = {getmsg {src} -incoming -count} tx = x + {getfield {src} x} ty = y + {getfield {src} y} tz = z + {getfield {src} z} setfield {src} x {tx} setfield {src} y {ty} setfield {src} z {tz} for (i = 0; i < nmsgs; i = i + 1) if ( \ {strcmp {getmsg {src} -incoming -type {i}} RAXIAL} == 0 \ ) child = {getmsg {src} -incoming -source {i}} do_rel_position {child} {x} {y} {z} end end end function do_rel_position(src, x, y, z) /* testing the C version of the routine. */ relposition {src} {x} {y} {z} end function do_z_rotate(name, x, y, sin, cos) str name float x, y, sin, cos int nmsgs, i str child float dx, dy nmsgs = {getmsg {name} -incoming -count} for (i = 0; i < nmsgs; i = i + 1) if ( \ {strcmp {getmsg {name} -incoming -type {i}} RAXIAL} == 0 \ ) child = {getmsg {name} -incoming -source {i}} do_z_rotate {child} {x} {y} {sin} {cos} end end dx = {getfield {name} x} - x dy = {getfield {name} y} - y setfield {name} x {x + cos*dx - sin*dy} setfield {name} y {y + sin*dx + cos*dy} end function do_x_rotate(name, y, z, sin, cos) str name float y, z, sin, cos int nmsgs, i str child float dy, dz nmsgs = {getmsg {name} -incoming -count} for (i = 0; i < nmsgs; i = i + 1) if ( \ {strcmp {getmsg {name} -incoming -type {i}} RAXIAL} == 0 \ ) child = {getmsg {name} -incoming -source {i}} do_x_rotate {child} {y} {z} {sin} {cos} end end dy = {getfield {name} y} - y dz = {getfield {name} z} - z setfield {name} y {y + cos*dy - sin*dz} setfield {name} z {z + sin*dy + cos*dz} end function do_y_rotate(name, x, z, sin, cos) str name float x, z, sin, cos int nmsgs, i str child float dx, dz nmsgs = {getmsg {name} -incoming -count} for (i = 0; i < nmsgs; i = i + 1) if ( \ {strcmp {getmsg {name} -incoming -type {i}} RAXIAL} == 0 \ ) child = {getmsg {name} -incoming -source {i}} do_y_rotate {child} {x} {z} {sin} {cos} end end dx = {getfield {name} x} - x dz = {getfield {name} z} - z setfield {name} x {x + cos*dx - sin*dz} setfield {name} z {z + sin*dx + cos*dz} end function scale_el_props(elm, ratio, scope) str elm float ratio int scope float temp float nmsgs, i str name temp = {getfield {elm} Ra} setfield {elm} Ra {temp*ratio} temp = {getfield {elm} Rm} setfield {elm} Rm {temp/ratio} temp = {getfield {elm} Cm} setfield {elm} Cm {temp*ratio} if (scope == 0) return end nmsgs = {getmsg {elm} -incoming -count} for (i = 0; i < nmsgs; i = i + 1) if ( \ {strcmp {getmsg {elm} -incoming -type {i}} RAXIAL} == 0 \ ) name = {getmsg {elm} -incoming -source {i}} scale_el_props {name} {ratio} 1 end end end function do_stretch(x,y,z) // click coords added DEB 8/2/95 float x, y, z str elm, parent float cos, sin float dotprd, crossprd float dx, dy, dz, ex, ey, ez, px, py, pz, elx, ely, elz float len float init_len, final_len, ratio int nmsgs, i if ({strncmp {getfield /compt_select/draw transform} o 1} == 0) echo Draw transform should be one of xy, yz, xz. return end elm = comptpath nmsgs = {getmsg {elm} -incoming -count} for (i = 0; i < nmsgs; i = i + 1) if ( \ {strcmp {getmsg {elm} -incoming -type {i}} AXIAL} == 0 \ ) parent = {getmsg {elm} -incoming -source {i}} end end elx = {getfield {elm} x} ely = {getfield {elm} y} elz = {getfield {elm} z} px = {getfield {parent} x} py = {getfield {parent} y} pz = {getfield {parent} z} init_len = (elx - px)*(elx - px) + (ely - py)*(ely - py) + (elz - pz)*(elz - pz) if ({strncmp {getfield /compt_select/draw transform} z 1} == 0) dx = x - px dy = y - py ex = elx - px ey = ely - py dotprd = dx*ex + dy*ey crossprd = ex*dy - dx*ey len = ex*ex + ey*ey cos = dotprd/len sin = crossprd/len dx = cos*ex - sin*ey - ex dy = sin*ex + cos*ey - ey if (({getfield /compt_select/scope state}) == 0) do_rel_position {elm} {dx} {dy} 0 else do_z_rotate {elm} {px} {py} {sin} {cos} end end if ({strncmp {getfield /compt_select/draw transform} x 1} == 0) dz = z - pz dy = y - py ez = elz - pz ey = ely - py dotprd = dz*ez + dy*ey crossprd = dz*ey - ez*dy len = ez*ez + ey*ey cos = dotprd/len sin = crossprd/len dy = cos*ey - sin*ez - ey dz = sin*ey + cos*ez - ez if (({getfield /compt_select/scope state}) == 0) do_rel_position {elm} 0 {dy} {dz} else do_x_rotate {elm} {py} {pz} {sin} {cos} end end if ({strncmp {getfield /compt_select/draw transform} y 1} == 0) dx = x - px dz = z - pz ex = elx - px ez = elz - pz dotprd = dx*ex + dz*ez crossprd = ex*dz - dx*ez len = ex*ex + ez*ez cos = dotprd/len sin = crossprd/len dx = cos*ex - sin*ez - ex dz = sin*ex + cos*ez - ez if (({getfield /compt_select/scope state}) == 0) do_rel_position {elm} {dx} 0 {dz} else do_y_rotate {elm} {px} {pz} {sin} {cos} end end elx = {getfield {elm} x} ely = {getfield {elm} y} elz = {getfield {elm} z} final_len = (elx - px)*(elx - px) + (ely - py)*(ely - py) + (elz - pz)*(elz - pz) ratio = {sqrt {final_len/init_len}} scale_el_props {elm} {ratio} \ {getfield /compt_select/scope state} if ((user_symcomps)) setfield /compt_select/draw/cell \ path {cellpath}/##[TYPE=symcompartment] else setfield /compt_select/draw/cell \ path {cellpath}/##[TYPE=compartment] end end function do_rotate(x,y,z) // click coords added DEB 8/2/95 float x, y, z str elm, parent float cos, sin float dotprd, crossprd float dx, dy, dz, ex, ey, ez, px, py, pz, elx, ely, elz float len int nmsgs, i elm = comptpath nmsgs = {getmsg {elm} -incoming -count} for (i = 0; i < nmsgs; i = i + 1) if ( \ {strcmp {getmsg {elm} -incoming -type {i}} AXIAL} == 0 \ ) parent = {getmsg {elm} -incoming -source {i}} end end elx = {getfield {elm} x} ely = {getfield {elm} y} elz = {getfield {elm} z} px = {getfield {parent} x} py = {getfield {parent} y} pz = {getfield {parent} z} if ({strncmp {getfield /compt_select/draw transform} z 1} == 0) dx = x - px dy = y - py ex = elx - px ey = ely - py dotprd = dx*ex + dy*ey crossprd = ex*dy - dx*ey len = {sqrt {dx*dx + dy*dy}} len = len*{sqrt {ex*ex + ey*ey}} cos = dotprd/len sin = crossprd/len dx = cos*ex - sin*ey - ex dy = sin*ex + cos*ey - ey if (({getfield /compt_select/scope state}) == 0) do_rel_position {elm} {dx} {dy} 0 else do_z_rotate {elm} {px} {py} {sin} {cos} end end if ({strncmp {getfield /compt_select/draw transform} x 1} == 0) dz = z - pz dy = y - py ez = elz - pz ey = ely - py dotprd = dz*ez + dy*ey crossprd = dz*ey - ez*dy len = {sqrt {dz*dz + dy*dy}} len = len*{sqrt {ez*ez + ey*ey}} cos = dotprd/len sin = crossprd/len dy = cos*ey - sin*ez - ey dz = sin*ey + cos*ez - ez if (({getfield /compt_select/scope state}) == 0) do_rel_position {elm} 0 {dy} {dz} else do_x_rotate {elm} {py} {pz} {sin} {cos} end end if ({strncmp {getfield /compt_select/draw transform} y 1} == 0) dx = x - px dz = z - pz ex = elx - px ez = elz - pz dotprd = dx*ex + dz*ez crossprd = ex*dz - dx*ez len = {sqrt {dx*dx + dz*dz}} len = len*{sqrt {ex*ex + ez*ez}} cos = dotprd/len sin = crossprd/len dx = cos*ex - sin*ez - ex dz = sin*ex + cos*ez - ez if (({getfield /compt_select/scope state}) == 0) do_rel_position {elm} {dx} 0 {dz} else do_y_rotate {elm} {px} {pz} {sin} {cos} end end if ( \ {strcmp {getfield /compt_select/draw transform} o} == 0 \ ) echo Draw transform should be one of xy ,yz, xz. else if ((user_symcomps)) setfield /compt_select/draw/cell \ path {cellpath}/##[TYPE=symcompartment] else setfield /compt_select/draw/cell \ path {cellpath}/##[TYPE=compartment] end end end