连接曲线时保留全部曲线

pull/68/head
Zoe 6 years ago
parent 2ab33cbb58
commit 2ce265c2ac

@ -124,9 +124,9 @@ export class Command_TestOffset implements Command
} }
lastpls = cu.GetOffsetCurves(p.distanceTo(cu.GetClosestPointTo(p, !cu.IsClose)) * dir); lastpls = cu.GetOffsetCurves(p.distanceTo(cu.GetClosestPointTo(p, !cu.IsClose)) * dir);
// let a = cu.GetOffsetCurves(p.distanceTo(cu.GetClosestPointTo(p, !cu.IsClose)) * -dir); let a = cu.GetOffsetCurves(p.distanceTo(cu.GetClosestPointTo(p, !cu.IsClose)) * -dir);
// a.forEach(c => c.ColorIndex = 2); a.forEach(c => c.ColorIndex = 2);
// lastpls.push(...a); lastpls.push(...a);
lastpls.forEach((offCur) => lastpls.forEach((offCur) =>
{ {

@ -35,7 +35,9 @@ export class OffsetX implements Command
{ {
let offpl = offRes[i]; let offpl = offRes[i];
if (offpl.IsClose) if (offpl.IsClose)
{
offRes.push(...offpl.GetOffsetCurves(dis) as Polyline[]); offRes.push(...offpl.GetOffsetCurves(dis) as Polyline[]);
}
} }
offRes.forEach(c => app.m_Database.ModelSpace.Append(c)); offRes.forEach(c => app.m_Database.ModelSpace.Append(c));

@ -8,7 +8,7 @@ import { Contour } from "../DatabaseServices/Contour";
import { Curve } from "../DatabaseServices/Curve"; import { Curve } from "../DatabaseServices/Curve";
import { Line } from "../DatabaseServices/Line"; import { Line } from "../DatabaseServices/Line";
import { Polyline } from '../DatabaseServices/Polyline'; import { Polyline } from '../DatabaseServices/Polyline';
import { equal, equaln } from "../Geometry/GeUtils"; import { equal, equaln, midPoint } from "../Geometry/GeUtils";
import { isTargetCurInSourceCur, isTargetCurOutOrOnSourceCur } from "./BoolOperateUtils"; import { isTargetCurInSourceCur, isTargetCurOutOrOnSourceCur } from "./BoolOperateUtils";
import { IntersectOption } from "./IntersectWith"; import { IntersectOption } from "./IntersectWith";
import { app } from "../ApplicationServices/Application"; import { app } from "../ApplicationServices/Application";
@ -40,17 +40,17 @@ export class PolyOffestUtil
let contours: Contour[] = []; let contours: Contour[] = [];
for (let i = 0; i < plList1.length; i++) for (let i = 0; i < plList1.length; i++)
{ {
let con = this.buildContourByTwoSideOfest(plList1[i].curve, plList2[i].curve); let con = this.buildContourByTwoSideOfest(plList1[i].curve, plList2[i].curve, i);
con && contours.push(con); con && contours.push(con);
} }
// contours.forEach(c => // contours.forEach(c =>
// { // {
// c.Outline.ColorIndex = 2; // c.Outline.ColorIndex = 2;
// app.m_Database.ModelSpace.Append(c.Outline); // app.m_Database.ModelSpace.Append(c.Outline);
// }) // })
let newPls = this.trimAndJointOffestPolyline(plList1, this.m_Polyline); let newPls = this.trimAndJointOffestPolyline1(plList1, this.m_Polyline);
let cus = this.trimByContours(newPls, contours); let cus = this.trimByContours(newPls, contours);
if (this.m_Polyline.IsClose && this.m_OffDir < 0) if (this.m_Polyline.IsClose && this.m_OffDir < 0)
{ {
@ -79,7 +79,7 @@ export class PolyOffestUtil
}); });
} }
//通过2侧偏移曲线构建封闭轮廓,由于是双向偏移,所以不可能出现2个曲线都为空的情况 //通过2侧偏移曲线构建封闭轮廓,由于是双向偏移,所以不可能出现2个曲线都为空的情况
private buildContourByTwoSideOfest(pl1: Curve, pl2: Curve) private buildContourByTwoSideOfest(pl1: Curve, pl2: Curve, index: number)
{ {
if (pl1 && pl2) if (pl1 && pl2)
{ {
@ -93,7 +93,25 @@ export class PolyOffestUtil
let arc = pl1 ? pl1.Clone() as Arc : pl2.Clone() as Arc; let arc = pl1 ? pl1.Clone() as Arc : pl2.Clone() as Arc;
let l1 = new Line(arc.Center, arc.StartPoint); let l1 = new Line(arc.Center, arc.StartPoint);
let l2 = new Line(arc.Center, arc.EndPoint); let l2 = new Line(arc.Center, arc.EndPoint);
return Contour.CreateContour([arc, l1, l2]); let con = Contour.CreateContour([arc, l1, l2]);
if (!this.m_Polyline.IsClose)
{
//加入首尾原点源进行合并轮廓
let offDist = Math.abs(this.m_OffestDist);
let cir: Contour;
if (index === 0)
{
cir = Contour.CreateContour([new Circle(this.m_Polyline.StartPoint, Math.abs(this.m_OffestDist))]);
} else if (index === this.m_Polyline.EndParam - 1)
{
cir = Contour.CreateContour([new Circle(this.m_Polyline.EndPoint, Math.abs(this.m_OffestDist))]);
} else
{
return con;
}
return con.UnionBoolOperation(cir)[0]
}
else return con;
} }
else else
{ {
@ -102,7 +120,73 @@ export class PolyOffestUtil
} }
} }
// 修剪连接相邻曲线 // 修剪连接相邻曲线
private trimAndJointOffestPolyline(offResList: offestRes[], originLine: Polyline) // private trimAndJointOffestPolyline(offResList: offestRes[], originLine: Polyline)
// {
// offResList = offResList.filter(r => r.curve);
// if (offResList.length <= 1)
// return offResList.map(r => r.curve);
// let retPlList: Array<Curve> = [];
// let nextPt: Vector3 = offResList[0].curve.StartPoint;
// for (let i = 0; i < offResList.length; i++)
// {
// //前面线
// let frontLine = offResList[i].curve;
// //后面线
// let laterLine: Curve;
// //如果是闭合的,继续循环,否则直接添加到新数组列表
// if (i === offResList.length - 1)
// {
// if (retPlList.length === 0)
// break;
// if (this.m_Polyline.IsClose)
// laterLine = retPlList[0];
// else
// {
// this.appendNewPllist(frontLine, nextPt, frontLine.EndPoint, retPlList);
// break;
// }
// }
// else
// laterLine = offResList[i + 1].curve;
// //默认交点
// let interPt = frontLine.EndPoint;
// // 如果两线结合点不相等,调整交点位置
// if (!equal(frontLine.EndPoint, laterLine.StartPoint))
// {
// // 多段线交点数组
// let interPts = frontLine.IntersectWith(laterLine, IntersectOption.ExtendBoth);
// //如果没有交点,则用圆弧连接
// if (interPts.length === 0)
// {
// //偏移线段对应的源线段,取其起始点作为圆心
// let srcOffestRes = offResList[FixIndex(i + 1, offResList)];
// this.fillArc(offResList[i].index, srcOffestRes.index, nextPt, frontLine, laterLine, retPlList);
// continue;
// }
// else
// {
// let pts = interPts.filter(p => frontLine.PtOnCurve(p) && laterLine.PtOnCurve(p));
// interPt = this.selectFitInterPt(pts.length > 0 ? pts : interPts, frontLine.EndPoint);
// }
// }
// this.appendNewPllist(frontLine, nextPt, interPt, retPlList, laterLine);
// if (i === offResList.length - 1)//曲线闭合时,修改第一条线的起点
// {
// laterLine.StartPoint = nextPt;
// }
// }
// return retPlList;
// }
private trimAndJointOffestPolyline1(offResList: offestRes[], originLine: Polyline)
{ {
offResList = offResList.filter(r => r.curve); offResList = offResList.filter(r => r.curve);
if (offResList.length <= 1) if (offResList.length <= 1)
@ -129,7 +213,7 @@ export class PolyOffestUtil
laterLine = retPlList[0]; laterLine = retPlList[0];
else else
{ {
this.appendNewPllist(frontLine, nextPt, frontLine.EndPoint, retPlList); this.appendNewPllist1(frontLine, nextPt, frontLine.EndPoint, retPlList);
break; break;
} }
} }
@ -155,10 +239,20 @@ export class PolyOffestUtil
else else
{ {
let pts = interPts.filter(p => frontLine.PtOnCurve(p) && laterLine.PtOnCurve(p)); let pts = interPts.filter(p => frontLine.PtOnCurve(p) && laterLine.PtOnCurve(p));
interPt = this.selectFitInterPt(pts.length > 0 ? pts : interPts, frontLine.EndPoint); if (pts.length > 0)
{
interPt = this.selectFitInterPt(pts, frontLine.EndPoint);
this.appendNewPllist1(frontLine, nextPt, interPt, retPlList);
} else
{
interPt = this.selectFitInterPt(interPts, frontLine.EndPoint);
this.checkCuAndAppendList(frontLine, laterLine, interPt, nextPt, retPlList, offResList[FixIndex(i + 1, offResList)].index);
}
} }
} }
this.appendNewPllist(frontLine, nextPt, interPt, retPlList, laterLine); else
this.appendNewPllist1(frontLine, nextPt, frontLine.EndPoint, retPlList);
if (i === offResList.length - 1)//曲线闭合时,修改第一条线的起点 if (i === offResList.length - 1)//曲线闭合时,修改第一条线的起点
{ {
@ -169,31 +263,46 @@ export class PolyOffestUtil
} }
//将线段拷贝并修改,加入到结果数组里面. //将线段拷贝并修改,加入到结果数组里面.
appendNewPllist(frontLine: Curve, nextPt: Vector3, interPt: Vector3, newPlList: Curve[], laterLine?: Curve, ) // appendNewPllist(frontLine: Curve, nextPt: Vector3, interPt: Vector3, newPlList: Curve[], laterLine?: Curve)
// {
// let newCu = frontLine.Clone() as Curve;
// newCu.StartPoint = nextPt;
// newCu.EndPoint = interPt;
// if (this.isVail(frontLine, newCu))
// {
// nextPt.copy(interPt);
// newPlList.push(newCu);
// }
// else if (laterLine)
// {
// // if (newPlList.length > 0 && laterLine)
// // {
// // //曲线校验补通过,尝试和前一条线段求交点.
// // let lastCu = arrayLast(newPlList);
// // let pts = lastCu.IntersectWith(laterLine, IntersectOption.ExtendBoth);
// // if (pts.length > 0)
// // {
// // let intPt = this.selectFitInterPt(pts, lastCu.EndPoint);
// // lastCu.EndPoint = intPt;
// // nextPt.copy(intPt)
// // }
// // }
// newCu.EndPoint = frontLine.EndPoint;
// newPlList.push(newCu);
// newPlList.push(new Line(frontLine.EndPoint, laterLine.StartPoint));
// nextPt.copy(laterLine.StartPoint);
// }
// }
appendNewPllist1(frontLine: Curve, nextPt: Vector3, interPt: Vector3, newPlList: Curve[], laterLine?: Curve)
{ {
let newCu = frontLine.Clone() as Curve; let newCu = frontLine.Clone() as Curve;
newCu.StartPoint = nextPt; newCu.StartPoint = nextPt;
newCu.EndPoint = interPt; newCu.EndPoint = interPt;
nextPt.copy(interPt); nextPt.copy(interPt);
newPlList.push(newCu);
if (this.isVail(frontLine, newCu))
{
newPlList.push(newCu);
}
else if (newPlList.length > 0 && laterLine)
{
//曲线校验补通过,尝试和前一条线段求交点.
let lastCu = arrayLast(newPlList);
let pts = lastCu.IntersectWith(laterLine, IntersectOption.ExtendBoth);
if (pts.length > 0)
{
let intPt = this.selectFitInterPt(pts, lastCu.EndPoint);
lastCu.EndPoint = intPt;
nextPt.copy(intPt)
}
}
} }
isVail(oldCu: Curve, newCu: Curve): boolean isVail(oldCu: Curve, newCu: Curve): boolean
{ {
@ -203,7 +312,55 @@ export class PolyOffestUtil
} else } else
return oldCu.IsClockWise === newCu.IsClockWise return oldCu.IsClockWise === newCu.IsClockWise
} }
checkCuAndAppendList(frontLine, laterLine, intPt, nextPt, newPlList, endIndex)
{
let par1 = frontLine.GetParamAtPoint(intPt);
if (frontLine instanceof Line)
{
if (par1 > 1)
{
this.appendNewPllist1(frontLine, nextPt, intPt, newPlList);
}
else
{
this.appendNewPllist1(frontLine, nextPt, frontLine.EndPoint, newPlList);
newPlList.push(new Line(frontLine.EndPoint, laterLine.StartPoint));
nextPt.copy(laterLine.StartPoint);
}
}
else if (frontLine instanceof Arc && laterLine instanceof Line)
{
let par2 = laterLine.GetParamAtPoint(intPt);
if (par1 > 1)
{
this.appendNewPllist1(frontLine, nextPt, intPt, newPlList);
}
else if (par1 < 0 && par2 < 0)
{
this.fillArc(endIndex - 1, endIndex, nextPt, frontLine, laterLine, newPlList);
}
else
{
this.appendNewPllist1(frontLine, nextPt, frontLine.EndPoint, newPlList);
newPlList.push(new Line(frontLine.EndPoint, laterLine.StartPoint));
nextPt.copy(laterLine.StartPoint);
}
}
else
{
let isOnFline = frontLine.PtOnCurve(intPt);
let isOnLline = laterLine.PtOnCurve(intPt);
if ((!isOnFline && !isOnLline))
{
this.appendNewPllist1(frontLine, nextPt, intPt, newPlList);
}
else
{
this.fillArc(endIndex - 1, endIndex, nextPt, frontLine, laterLine, newPlList);
}
}
}
/** /**
* *
* *
@ -269,7 +426,7 @@ export class PolyOffestUtil
let pts = frontLine.IntersectWith(cirs[0], IntersectOption.OnBothOperands); let pts = frontLine.IntersectWith(cirs[0], IntersectOption.OnBothOperands);
let inPt = this.selectFitInterPt(pts, frontLine.EndPoint); let inPt = this.selectFitInterPt(pts, frontLine.EndPoint);
this.appendNewPllist(frontLine, nextPt, inPt, retPlList); this.appendNewPllist1(frontLine, nextPt, inPt, retPlList);
for (let i = 0; i < cirs.length - 1; i++) for (let i = 0; i < cirs.length - 1; i++)
{ {
@ -293,7 +450,7 @@ export class PolyOffestUtil
let tangent = laterLine.GetFistDeriv(0).negate().normalize(); let tangent = laterLine.GetFistDeriv(0).negate().normalize();
let circleAngle = -getCirAngleByChordAndTangent(chord, tangent); let circleAngle = -getCirAngleByChordAndTangent(chord, tangent);
this.appendNewPllist(frontLine, nextPt, intPt, retPlList, laterLine); this.appendNewPllist1(frontLine, nextPt, intPt, retPlList, laterLine);
nextPt.copy(laterLine.StartPoint); nextPt.copy(laterLine.StartPoint);
@ -322,8 +479,8 @@ export class PolyOffestUtil
if (pts.length > 0) if (pts.length > 0)
{ {
let par = pts.map(p => l.GetParamAtPoint(p)); let par = pts.map(p => l.GetParamAtPoint(p));
let cus = l.GetSplitCurves(par); let cus = l.GetSplitCurves(par).filter(cu => !isTargetCurInSourceCur(outline, cu));
tmpCus.push(...cus.filter(cu => !isTargetCurInSourceCur(outline, cu))); tmpCus.push(...cus);
} }
} }
}) })

Loading…
Cancel
Save