FTDG for php development Get x coordinates for ancestor families of branch = nBranch ( 1 - 7) SELECT STR(FAM_ID,2)+' - '+ALLTRIM(SURNAME), "document.location.href='"+ALLTRIM(FAMFILEID(FAM_ID)) +"_portrait.svg'", FAM_ID, STR(WED_YEAR(FAM_ID),4) , (WED_YEAR(FAM_ID)-1800)*5 , FATHER, MOTHER FROM FAMILY.DBF WHERE ANCESTID(FAM_ID,nBranch ) order by FAM_ID Get X coordinates for descendant families ( where nBranch = 1 - 7 ) SELECT distinct STR(FAM_ID,4)+'-'+ALLTRIM(SURNAME), "document.location.href='"+ALLTRIM(FAMFILEID(FAM_ID)) +"_portrait.svg'", IIF(WED_YEAR(FAM_ID)=0,' ',STR(WED_YEAR(FAM_ID),4)),(WED_YEAR(FAM_ID)-1800)*5 , ALLTRIM(FLNAME(FATHER))+' + '+ALLTRIM(FLNAME(MOTHER)), SUBSTR(ALLTRIM(STR(FAM_ID,4)),1,3) , FAM_ID FROM FAMILY.DBF WHERE (BETWEEN(FAM_ID,(nBranch*100),(nBranch*100+20)) OR BETWEEN(FAM_ID,(nBranch*1000+11),(nBranch*1000+99)) ) AND ! ('.02' $ MOTHER_ID OR '.02' $ FATHER_ID ) order by 6,7 y coordinate = ROWPOS( _Tally, for each row 1 thru _Tally) FUNCTION RowPos PARAMETERS nItems, nPosition ** returns a y coordinate for an SVG document of 1000 pixel height ** used by FTDFULL.prg to create Family Tree Diagrams of varying # of children ** nItems = the number of children (child nodes drawn as rect of 190 by 40 pixel dimension ) ** nPosition = the position of the child within the child set ** nPosition must be <= nItems ** Maxes out at nItems = 20 DO CASE CASE nItems=1 RETURN 350 CASE nItems=2 If nPosition=1 RETURN 150 Else RETURN 550 Endif CASE nItems=3 do case case nPosition=1 RETURN 300 case nPosition=2 RETURN 600 case nPosition=3 RETURN 900 endcase CASE nItems=4 do case case nPosition=1 RETURN 50 case nPosition=2 RETURN 250 case nPosition=3 RETURN 450 case nPosition=4 RETURN 650 endcase CASE nItems=5 do case case nPosition=1 RETURN 50 case nPosition=2 RETURN 250 case nPosition=3 RETURN 450 case nPosition=4 RETURN 650 case nPosition=5 RETURN 850 endcase CASE nItems=6 do case case nPosition=1 RETURN 50 case nPosition=2 RETURN 200 case nPosition=3 RETURN 350 case nPosition=4 RETURN 500 case nPosition=5 RETURN 650 case nPosition=6 RETURN 800 endcase CASE nItems=7 do case case nPosition=1 RETURN 0 case nPosition=2 RETURN 150 case nPosition=3 RETURN 300 case nPosition=4 RETURN 450 case nPosition=5 RETURN 600 case nPosition=6 RETURN 750 case nPosition=7 RETURN 900 endcase CASE nItems=8 do case case nPosition=1 RETURN 0 case nPosition=2 RETURN 100 case nPosition=3 RETURN 200 case nPosition=4 RETURN 300 case nPosition=5 RETURN 400 case nPosition=6 RETURN 500 case nPosition=7 RETURN 600 case nPosition=8 RETURN 700 endcase CASE nItems=9 do case case nPosition=1 RETURN 0 case nPosition=2 RETURN 100 case nPosition=3 RETURN 200 case nPosition=4 RETURN 300 case nPosition=5 RETURN 400 case nPosition=6 RETURN 500 case nPosition=7 RETURN 600 case nPosition=8 RETURN 700 case nPosition=9 RETURN 800 endcase CASE nItems=10 do case case nPosition=1 RETURN 0 case nPosition=2 RETURN 100 case nPosition=3 RETURN 200 case nPosition=4 RETURN 300 case nPosition=5 RETURN 400 case nPosition=6 RETURN 500 case nPosition=7 RETURN 600 case nPosition=8 RETURN 700 case nPosition=9 RETURN 800 case nPosition=10 RETURN 900 endcase CASE nItems < 14 RETURN nPosition * 70-70 OTHERWISE RETURN nPosition * 50-50 ENDCASE