行为
功能 #256
打开压缩多边形
状态:
新建
优先级:
普通
指派给:
-
开始日期:
2025-04-01
计划完成日期:
% 完成:
0%
预期时间:
#2:
描述
需要调整精度
XPushPrec vPrec(_distSnap, _angSnap*2);
M:\issues\becs\wang_bo_wen\DOE2
由 李立奎 更新于 10 个月 之前
int MergeCurve(XCurveSegment &curve, XCurveSegment &seg, int bMinusCurve, int bMinusSeg)
{
int bMerged=0;
int bLine1=curve.Is(CURVE_LINE),
bLine2=seg.Is(CURVE_LINE);
if(bLine1==bLine2 && bMinusCurve==bMinusSeg) {
//曲线类型相同, 走向相同
if(bLine1) {
if(CT_IsSameDrt(curve.XLine::Direction(), seg.XLine::Direction(), _angSnap)) {
curve.endPoint=seg.endPoint;
bMerged=1;
}
} else {
XArc arc1=curve.GetArc(),
arc2=seg.GetArc();
if(fabs(arc1.radius-arc2.radius)<_distSnap && arc1.center==arc2.center) {
if(bMinusSeg) arc1.startAngle=arc2.startAngle;
else arc1.endAngle=arc2.endAngle;
if(fabs(arc1.Bulge())<_angSnap || fabs(arc1.Bulge()-2*PI)<_angSnap) {
; //Circle never merge
} else {
curve = arc1;
bMerged=1;
}
}
}
}
return bMerged;
}
void cmdTest()
{
PickSet ss(SS_FREE);
SelectEntities(_T("\n 选择PL线") ,ss, RBList());
XPushPrec vPrec(_distSnap, _angSnap*2);
for (long i=0;i<ss.Length();++i)
{
XPoly2D ply(ss[i]);
//ply.Compress();
{
XPoly2D dest(ply.flag);
int nTotalSeg = ply.TotalSegments();
XCurveSegment curve;
int bMinusCurve = 0;
for (int n = 0; n < nTotalSeg; n++)
{
XCurveSegment seg;
ply.Nth(n, seg);
if (!seg)
continue;
int bMinusSeg = (*ply.bulges[n] < -1.0E-8);
int bMerged = 0;
if (!curve) {
curve = seg;
bMinusCurve = bMinusSeg;
continue;
} else {
bMerged = MergeCurve(curve, seg, bMinusCurve, bMinusSeg);
}
if (!bMerged) { //当前段没有合并进curve, 更新curve
dest.AppendSegment(curve, bMinusCurve);
curve = seg;
bMinusCurve = bMinusSeg;
}
}
if (!curve)
return /*RTERROR*/;
else {
dest.AppendSegment(curve, bMinusCurve, 1);
}
if ((dest.flag & 0x01) && dest.TotalSegments() >= 2)
{
int nTotalDest = dest.TotalSegments();
int bMinusFirst = (*dest.bulges[0] < -1.0E-8);
int bMinusFinal = (*dest.bulges[nTotalDest - 1] < -1.0E-8);
XCurveSegment curveFirst, curveFinal;
dest.Nth(0, curveFirst),
dest.Nth(nTotalDest - 1, curveFinal);
if (MergeCurve(
curveFinal, curveFirst, bMinusFinal, bMinusFirst)) {
if (bMinusFinal) {
*dest.bulges[0] = -curveFinal.bulge;
*dest[0] = curveFinal.endPoint;
} else {
*dest.bulges[0] = curveFinal.bulge;
*dest[0] = curveFinal.startPoint;
}
dest.bulges.Remove(nTotalDest - 1);
dest.Remove(nTotalDest - 1);
}
}
ply = dest;
}
XWcsStream dc;
dc << ply;
}
//ss.Erase();
}
行为