2014-03-31 75 views
-3

我已經構建了甘特圖佈局,並且需要能夠繪製任務之間的連接線。任務只是具有背景顏色和高度,寬度等的div。我將向div的屬性添加屬性以指定哪個任務與哪個任務相關。自動使用jquery或javascript在元素之間繪製線條

我該如何去根據任務div的偏移自動在相關任務之間繪製線條?

是否有某種類型的庫可供我使用,或者是否必須手動編程它,如果是的話,我從哪裏開始。

+0

「畫線」,需要一個畫布,也許3JS或類似的東西。一點研究會告訴你。 – Fallenreaper

+0

嗯不是真的線可能是div的。 – user794846

+0

它看起來不錯,計算數據,然後將abs定位的div轉換爲相應的角度。我覺得這是一個相當麻煩的,計算上令人討厭的方法。 – Fallenreaper

回答

0

最後我從這裏開始編寫了gantt.twproject.com/distrib/gantt.html中的代碼來處理我自己的甘特圖。以下部分是我使用的。這可以改變,以適應任何基於html的甘特圖我應該考慮。

/*********************************** Draw Link Elements **************************************/ 

var peduncolusSize = 5; 
var lineSize = 0; 


function drawlink (from, to, type) { 

var rectFrom = buildRect(from); 
var rectTo = buildRect(to); 

// Dispatch to the correct renderer 
if (type == 'start-to-start') { 
    $("#gantt").append(
     drawStartToStart(rectFrom, rectTo, peduncolusSize) 
    ); 
} else { 
    $("#gantt").append(
     drawStartToEnd(rectFrom, rectTo, peduncolusSize) 
    ); 
} 

} 

/** 
* A representation of a Horizontal line 
*/ 
HLine = function(width, top, left) { 
var hl = $("<div>").addClass("taskDepLine"); 

hl.css({ 
    height: lineSize, 
    left: left, 
    width: width, 
    top: top - lineSize/2 -2 //added - 1 
}); 
    return hl; 
}; 

/** 
* A representation of a Vertical line 
*/ 

VLine = function(height, top, left) { 
var vl = $("<div>").addClass("taskDepLine"); 

vl.css({ 
    height: height -2,//added -2 
    left:left - lineSize/2, 
    width: lineSize, 
    top: top 
}); 
return vl; 
}; 

/** 
* Given an item, extract its rendered position 
* width and height into a structure. 
*/ 
function buildRect(item) { 
    var rect = item.position(); 
    rect.width = item.width(); 
    rect.height = item.height(); 

    return rect; 
    } 

/** 
    * The default rendering method, which paints a start to end dependency. 
* 
* @see buildRect 
*/ 
function drawStartToEnd(rectFrom, rectTo, peduncolusSize) { 
var left, top; 
var gheight = $('.main_table').innerHeight(); 
var gleft = -5; 

var ndo = $("<div style='position: relative;'> </div>").css({ 
    "bottom":gheight, 
    "left":-5 
    }); 

var currentX = rectFrom.left + rectFrom.width; 
var currentY = rectFrom.height/2 + rectFrom.top; 

var useThreeLine = (currentX + 2 * peduncolusSize) < rectTo.left; 

if (!useThreeLine) { 
    // L1 
    if (peduncolusSize > 0) { 
     var l1 = new HLine(peduncolusSize, currentY, currentX); 
     currentX = currentX + peduncolusSize; 
     ndo.append(l1); 
    } 

    // L2 
    var l2_4size = ((rectTo.top + rectTo.height/2) - (rectFrom.top + rectFrom.height/2))/2; 
    var l2; 
    if (l2_4size < 0) { 
     l2 = new VLine(-l2_4size, currentY + l2_4size, currentX); 
    } else { 
     l2 = new VLine(l2_4size, currentY, currentX); 
    } 
    currentY = currentY + l2_4size; 

    ndo.append(l2); 

    // L3 
    var l3size = rectFrom.left + rectFrom.width + peduncolusSize - (rectTo.left - peduncolusSize); 
    currentX = currentX - l3size; 
    var l3 = new HLine(l3size, currentY, currentX); 
    ndo.append(l3); 

    // L4 
    var l4; 
    if (l2_4size < 0) { 
     l4 = new VLine(-l2_4size, currentY + l2_4size, currentX); 
    } else { 
     l4 = new VLine(l2_4size, currentY, currentX); 
    } 
    ndo.append(l4); 

    currentY = currentY + l2_4size; 

    // L5 
    if (peduncolusSize > 0) { 
     var l5 = new HLine(peduncolusSize, currentY, currentX); 
     currentX = currentX + peduncolusSize; 
     ndo.append(l5); 

    } 
} else { 
    //L1 
    var l1_3Size = (rectTo.left - currentX)/2; 
    var l1 = new HLine(l1_3Size, currentY, currentX); 
    currentX = currentX + l1_3Size; 
    ndo.append(l1); 

    //L2 
    var l2Size = ((rectTo.top + rectTo.height/2) - (rectFrom.top + rectFrom.height/2)); 
    var l2; 
    if (l2Size < 0) { 
     l2 = new VLine(-l2Size, currentY + l2Size, currentX); 
    } else { 
     l2 = new VLine(l2Size, currentY, currentX); 
    } 
    ndo.append(l2); 

    currentY = currentY + l2Size; 

    //L3 
    var l3 = new HLine(l1_3Size, currentY, currentX); 
    currentX = currentX + l1_3Size; 
    ndo.append(l3); 
} 

//arrow 
var arr = $("<img src='custom/modules/Project/linkArrow.png'>").css({ 
    position: 'absolute', 
    top: rectTo.top + rectTo.height/2 - 6,//added -6 
    left: rectTo.left - 5 
}); 

ndo.append(arr); 

return ndo; 
} 

    /** 
    * A rendering method which paints a start to start dependency. 
    * 
    * @see buildRect 
    */ 
    function drawStartToStart(rectFrom, rectTo, peduncolusSize) { 
     var left, top; 
     var gheight = $('.main_table').innerHeight(); 
     var ndo = $("<div style='position: relative;'> </div>").css({ 
     "bottom":gheight, 
     "left":-5 
    }); 

var currentX = rectFrom.left; 
var currentY = rectFrom.height/2 + rectFrom.top; 

var useThreeLine = (currentX + 2 * peduncolusSize) < rectTo.left; 

if (!useThreeLine) { 
    // L1 
    if (peduncolusSize > 0) { 
     var l1 = new HLine(peduncolusSize, currentY, currentX - peduncolusSize); 
     currentX = currentX - peduncolusSize; 
     ndo.append(l1); 
    } 

    // L2 
    var l2_4size = ((rectTo.top + rectTo.height/2) - (rectFrom.top + rectFrom.height/2))/2; 
    var l2; 
    if (l2_4size < 0) { 
     l2 = new VLine(-l2_4size, currentY + l2_4size, currentX); 
    } else { 
     l2 = new VLine(l2_4size, currentY, currentX); 
    } 
    currentY = currentY + l2_4size; 

    ndo.append(l2); 

    // L3 
    var l3size = (rectFrom.left - peduncolusSize) - (rectTo.left - peduncolusSize); 
    currentX = currentX - l3size; 
    var l3 = new HLine(l3size, currentY, currentX); 
    ndo.append(l3); 

    // L4 
    var l4; 
    if (l2_4size < 0) { 
     l4 = new VLine(-l2_4size, currentY + l2_4size, currentX); 
    } else { 
     l4 = new VLine(l2_4size, currentY, currentX); 
    } 
    ndo.append(l4); 

    currentY = currentY + l2_4size; 

    // L5 
    if (peduncolusSize > 0) { 
     var l5 = new HLine(peduncolusSize, currentY, currentX); 
     currentX = currentX + peduncolusSize; 
     ndo.append(l5); 
    } 
} else { 
    //L1 

    var l1 = new HLine(peduncolusSize, currentY, currentX - peduncolusSize); 
    currentX = currentX - peduncolusSize; 
    ndo.append(l1); 

    //L2 
    var l2Size = ((rectTo.top + rectTo.height/2) - (rectFrom.top + rectFrom.height/2)); 
    var l2; 
    if (l2Size < 0) { 
     l2 = new VLine(-l2Size, currentY + l2Size, currentX); 
    } else { 
     l2 = new VLine(l2Size, currentY, currentX); 
    } 
    ndo.append(l2); 

    currentY = currentY + l2Size; 

    //L3 

    var l3 = new HLine((rectTo.left - rectFrom.left), currentY, currentX); 
    currentX = currentX + peduncolusSize + (rectTo.left - rectFrom.left); 
    ndo.append(l3); 
} 

//arrow 
var arr = $("<img src='custom/modules/Project/linkArrow.png'>").css({ 
    position: 'absolute', 
    top: rectTo.top + rectTo.height/2 - 6,//changed to -6 
    left: rectTo.left - 5 
}); 

ndo.append(arr); 

return ndo; 

}

相關問題