求點擊 兩條cline, 使他們的延長線相交, 生成一條線
主要用於快捷修改十度走線的時候,如圖所示 貌似很厉害!! 主要是如何判断两条线段的交点位置。。。。 楼主是否需要该功能。http://www.allegro-skill.com/data/attachment/forum/201402/27/130454eh48ppqp3wi8t8tc.gif
代码存在一些不足,由于是浮点运算,计算的结果存在一定的误差。
下面贴出源代码。代码没经过优化,如果需要的话,你自己可以修改修改。axlCmdRegister( "cline_intsec" 'cline_intsec ?cmdType "interactive")
defun(cline_intsec ()
cline1 = nil
axlClearSelSet()
axlSetFindFilter( ?enabled list("noall" "CLINESEGS") ?onButtons list("noall" "CLINESEGS"))
axlSingleSelectPoint()
cline1 = car(axlGetSelSet())
axlClearSelSet()
axlHighlightObject(cline1)
when(cline1
axlSetFindFilter( ?enabled list("noall" "CLINESEGS") ?onButtons list("noall" "CLINESEGS"))
axlSingleSelectPoint()
cline2 = car(axlGetSelSet())
axlClearSelSet()
axlDehighlightObject(cline1)
)
when(cline1 && cline2 && cline1->layer == cline2->layer
point = axl_ol_ol2(cline1->startEnd cline2->startEnd)
a = car(cline1->startEnd)
b = cadr(cline1->startEnd)
c = car(cline2->startEnd)
d = cadr(cline2->startEnd)
crossP = cross(a b c d)
newLineOne = list(crossP car(point))
newLineTwo = list(crossP cadr(point))
axlDBCreateLine(newLineOne cline1->width cline1->layer )
axlDBCreateLine(newLineTwo cline2->width cline2->layer )
)
);end defun
defun(cross (a b c d)
p = nil
denominator = (yCoord(b) - yCoord(a))*(xCoord(d) - xCoord(c)) - (xCoord(a) - xCoord(b))*(yCoord(c) - yCoord(d));
when(denominator != 0
p = t
)
when(p
x =( (xCoord(b) - xCoord(a)) * (xCoord(d) - xCoord(c)) * (yCoord(c) - yCoord(a)) + (yCoord(b) - yCoord(a)) * (xCoord(d) - xCoord(c)) * xCoord(a) - (yCoord(d) - yCoord(c)) * (xCoord(b) - xCoord(a)) * xCoord(c) ) / denominator ;
y = -( (yCoord(b) - yCoord(a)) * (yCoord(d) - yCoord(c)) * (xCoord(c) - xCoord(a)) + (xCoord(b) - xCoord(a)) * (yCoord(d) - yCoord(c)) * yCoord(a) - (xCoord(d) - xCoord(c)) * (yCoord(b) - yCoord(a)) * yCoord(c) ) / denominator;
p = list(x y)
);end when
p
);end defun :) 謝謝 非常感謝版主 這樣很好了我下來 好好學習一下 vivi斑斑 好生厉害 感谢分享。。。。 704624688@qq.com 感谢分享。。。。 好生厉害···········
页:
[1]