mirror of https://gitee.com/cf-fz/WebCAD.git
parent
be45726618
commit
ece622b3eb
@ -0,0 +1,113 @@
|
|||||||
|
import { Vector2 } from "three";
|
||||||
|
import { arrayLast } from "../Common/ArrayExt";
|
||||||
|
import { Vector2ApplyMatrix4 } from "../Common/Matrix4Utils";
|
||||||
|
import { Arc } from "../DatabaseServices/Entity/Arc";
|
||||||
|
import { Circle } from "../DatabaseServices/Entity/Circle";
|
||||||
|
import { Polyline } from "../DatabaseServices/Entity/Polyline";
|
||||||
|
import { IContourData } from "../Production/Convert2PtsBul";
|
||||||
|
import { AsVector2, equaln, equalv2 } from "./GeUtils";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换成多段线点表,并且将圆弧打断(大于1/4的话) API仅用于开料生产
|
||||||
|
* @param cu 多段线或者圆弧
|
||||||
|
* @param [isOutline=true] 如果为外部轮廓,则将其转换为逆时针
|
||||||
|
* @param [isSplite=true] 如果为true,则对大圆弧进行切割
|
||||||
|
* @returns 点表+凸度表
|
||||||
|
*/
|
||||||
|
export function ConverToPolylineAndSplitArc(cu: Polyline | Circle, isOutline = true, isSplite = true): IContourData
|
||||||
|
{
|
||||||
|
let ptsBuls: { pts: Vector2[]; buls: number[]; };
|
||||||
|
if (cu instanceof Circle)
|
||||||
|
{
|
||||||
|
let pl = ConverCircleToPolyline(cu);
|
||||||
|
ptsBuls = pl.PtsBuls;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (isOutline && cu.IsClose && cu.Normal.z * cu.Area2 < 0)
|
||||||
|
cu.Reverse();
|
||||||
|
if (isSplite)
|
||||||
|
ptsBuls = SplitePolylineAtArc(cu);
|
||||||
|
else
|
||||||
|
ptsBuls = cu.PtsBuls;
|
||||||
|
}
|
||||||
|
let ocs = cu.OCSNoClone;
|
||||||
|
if (!equaln(ocs.elements[0], 1)
|
||||||
|
|| !equaln(ocs.elements[9], 0)
|
||||||
|
|| !equaln(ocs.elements[10], 0)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (let i = 0; i < ptsBuls.pts.length; i++)
|
||||||
|
{
|
||||||
|
Vector2ApplyMatrix4(ocs, ptsBuls.pts[i]);
|
||||||
|
ptsBuls.buls[i] *= cu.Normal.z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ptsBuls;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ConverCircleToPolyline(cir: Circle): Polyline
|
||||||
|
{
|
||||||
|
let arcs = cir.GetSplitCurves([0, 0.25, 0.5, 0.75]);
|
||||||
|
let pl = new Polyline();
|
||||||
|
pl.OCS = cir.OCSNoClone;
|
||||||
|
for (let arc of arcs)
|
||||||
|
pl.Join(arc);
|
||||||
|
return pl;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SPLITBUL = Math.tan(Math.PI / 8);
|
||||||
|
function GetSpliteCount(allAngle: number)
|
||||||
|
{
|
||||||
|
return Math.ceil(Math.abs(allAngle) / Math.PI * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 打断多段线超过1/4圆的圆弧*/
|
||||||
|
function SplitePolylineAtArc(cu: Polyline): IContourData
|
||||||
|
{
|
||||||
|
let ptsBuls = cu.PtsBuls;
|
||||||
|
let ocsInv = cu.OCSInv;
|
||||||
|
|
||||||
|
let result: IContourData = { pts: [], buls: [] };
|
||||||
|
|
||||||
|
if (ptsBuls.pts.length === 0)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
for (let i = 0; i < ptsBuls.buls.length - 1; i++)
|
||||||
|
{
|
||||||
|
let bul = ptsBuls.buls[i];
|
||||||
|
if (Math.abs(bul) > SPLITBUL + 1e-8)
|
||||||
|
{
|
||||||
|
let allAngle = Math.atan(bul) * 4;
|
||||||
|
let splitCount = GetSpliteCount(allAngle);
|
||||||
|
let arc = cu.GetCurveAtIndex(i) as Arc;
|
||||||
|
let paramDiv = 1 / splitCount;
|
||||||
|
let newBul = Math.tan((allAngle / splitCount) / 4);
|
||||||
|
for (let i = 0; i < splitCount; i++)
|
||||||
|
{
|
||||||
|
let param = i * paramDiv;
|
||||||
|
let p = arc.GetPointAtParam(param).applyMatrix4(ocsInv);
|
||||||
|
let p2 = AsVector2(p);
|
||||||
|
//暂时不处理0长度段
|
||||||
|
if (true || result.pts.length === 0 || !equalv2(p2, arrayLast(result.pts), 1e-2))
|
||||||
|
{
|
||||||
|
result.pts.push(p2);
|
||||||
|
result.buls.push(newBul);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//暂时不处理0长度段
|
||||||
|
if (true || result.pts.length === 0 || !equalv2(ptsBuls.pts[i], arrayLast(result.pts), 1e-2))
|
||||||
|
{
|
||||||
|
result.pts.push(ptsBuls.pts[i]);
|
||||||
|
result.buls.push(ptsBuls.buls[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result.pts.push(arrayLast(ptsBuls.pts));
|
||||||
|
result.buls.push(arrayLast(ptsBuls.buls));
|
||||||
|
return result;
|
||||||
|
}
|
Loading…
Reference in new issue