From e8b6e858046b222afbcd660f50f253bc8c19deaf Mon Sep 17 00:00:00 2001 From: ChenX Date: Thu, 19 Jul 2018 18:09:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E7=A6=BB=20arc=20join=20=E7=9A=84?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Add-on/Join.ts | 32 ++++++++++++++++++++++++++++++-- src/Add-on/Trim.ts | 3 ++- src/Common/Status.ts | 11 +++++++++++ src/DatabaseServices/Arc.ts | 31 +++++++++++++++++++------------ src/DatabaseServices/Curve.ts | 3 ++- src/DatabaseServices/Line.ts | 9 +++++---- src/DatabaseServices/Polyline.ts | 21 +++++++++++---------- 7 files changed, 80 insertions(+), 30 deletions(-) create mode 100644 src/Common/Status.ts diff --git a/src/Add-on/Join.ts b/src/Add-on/Join.ts index 1f2b4ffa3..d3dc5855f 100644 --- a/src/Add-on/Join.ts +++ b/src/Add-on/Join.ts @@ -1,4 +1,7 @@ import { app } from "../ApplicationServices/Application"; +import { Status } from "../Common/Status"; +import { Arc } from "../DatabaseServices/Arc"; +import { Circle } from "../DatabaseServices/Circle"; import { Curve } from '../DatabaseServices/Curve'; import { Command } from "../Editor/CommandMachine"; import { PromptStatus } from "../Editor/PromptResult"; @@ -17,11 +20,36 @@ export class Command_Join implements Command { if (cu2Res.Entity instanceof Curve) { - let bIsOK = cu1Res.Entity.Join(cu2Res.Entity); - if (bIsOK) + let status = cu1Res.Entity.Join(cu2Res.Entity); + if (status === Status.True) { cu2Res.Entity.Erase(); } + else if (status === Status.ConverToCircle) + { + let keyRes = await app.m_Editor.GetKeyWords({ + Msg: "合并的圆弧段组成了一个圆。要转换为圆吗?", + KeyWordList: [ + { msg: "是", key: "Y" }, + { msg: "否", key: "N" } + ] + }); + + if (keyRes.StringResult === "Y") + { + cu1Res.Entity.Erase(); + cu2Res.Entity.Erase(); + + let arc = cu1Res.Entity as Arc; + + let c = new Circle(arc.Center, arc.Radius); + app.m_Database.ModelSpace.Append(c); + } + } + else + { + app.m_Editor.Prompt("合并失败!"); + } } } } diff --git a/src/Add-on/Trim.ts b/src/Add-on/Trim.ts index ea5c88ae4..186daee5f 100644 --- a/src/Add-on/Trim.ts +++ b/src/Add-on/Trim.ts @@ -9,6 +9,7 @@ import { SelectBox } from '../Editor/SelectBox'; import { SelectSet } from '../Editor/SelectSet'; import { RenderType } from '../GraphicsSystem/Enum'; import { IntersectOption } from '../GraphicsSystem/IntersectWith'; +import { Status } from '../Common/Status'; /** * trim命令. @@ -68,7 +69,7 @@ export class Command_Trim implements Command //正向遍历 for (; i < splitCus.length; i++) { - if (cuStart.Join(splitCus[i]) != true) + if (cuStart.Join(splitCus[i]) != Status.True) break; } splitCus.splice(0, i);//移除0->(i-1)的元素 diff --git a/src/Common/Status.ts b/src/Common/Status.ts new file mode 100644 index 000000000..5cf0e71b3 --- /dev/null +++ b/src/Common/Status.ts @@ -0,0 +1,11 @@ + + + +export enum Status +{ + False = 0, + True = 1, + Canel = -1, + + ConverToCircle = 101, +} diff --git a/src/DatabaseServices/Arc.ts b/src/DatabaseServices/Arc.ts index f5177f21d..e16d72b04 100644 --- a/src/DatabaseServices/Arc.ts +++ b/src/DatabaseServices/Arc.ts @@ -12,6 +12,7 @@ import { Circle } from './Circle'; import { Curve } from './Curve'; import { Line } from './Line'; import { Polyline } from './Polyline'; +import { Status } from '../Common/Status'; /** * 圆弧实体类 * 与ACAD不同,这个类加入了时针变量,并且默认构造的圆弧为顺时针圆弧. @@ -292,7 +293,7 @@ export class Arc extends Curve this.Update(); } - Join(cu: Curve): boolean + Join(cu: Curve): Status { if (cu instanceof Arc) { @@ -312,43 +313,49 @@ export class Arc extends Curve if (eaAllan > allAn) this.EndAngle = ea; - return true; + return Status.True; } else if (equaln(sa, this.m_EndAngle))//this终点对起点 { if (eaAllan < allAn || equaln(ea, this.m_StartAngle)) - this.ConverToCircle();//圆 + { + return Status.ConverToCircle; + } else this.EndAngle = ea; - return true; + return Status.True; } else if (equaln(ea, this.StartAngle))//this起点对终点 { if (saAllan < allAn) - this.ConverToCircle();//圆 + { + return Status.ConverToCircle; + } else this.StartAngle = sa; - return true; + return Status.True; } else if (equaln(ea, this.m_EndAngle))//this终点对终点 { if (saAllan > allAn) this.StartAngle = sa; - return true; + return Status.True; } else if (this.ParamOnCurve(this.GetParamAtAngle(sa))) { if (eaAllan < saAllan) - this.ConverToCircle(); + { + return Status.ConverToCircle; + } else if (eaAllan > allAn) this.EndAngle = ea; - return true; + return Status.True; } else if (this.ParamOnCurve(this.GetParamAtAngle(ea))) { this.StartAngle = sa; - return true; + return Status.True; } //使用按负方向去计算它的参数 @@ -373,11 +380,11 @@ export class Arc extends Curve this.StartAngle = sa; if (eaParam > 1) this.EndAngle = ea; - return true; + return Status.True; } } } - return false; + return Status.False; } private ConverToCircle() diff --git a/src/DatabaseServices/Curve.ts b/src/DatabaseServices/Curve.ts index 501647716..6472fa92f 100644 --- a/src/DatabaseServices/Curve.ts +++ b/src/DatabaseServices/Curve.ts @@ -6,6 +6,7 @@ import { RenderType } from '../GraphicsSystem/Enum'; import { IntersectOption } from '../GraphicsSystem/IntersectWith'; import { Factory } from './CADFactory'; import { Entity } from './Entity'; +import { Status } from '../Common/Status'; export enum ExtendType { @@ -115,7 +116,7 @@ export abstract class Curve extends Entity * @returns {boolean} 连接成功 * @memberof Curve */ - Join(cu: Curve): boolean { return false }; + Join(cu: Curve): Status { return Status.False }; //翻转曲线.首尾调换. Reverse(): this { return this; }; diff --git a/src/DatabaseServices/Line.ts b/src/DatabaseServices/Line.ts index 961087797..afcbe3344 100644 --- a/src/DatabaseServices/Line.ts +++ b/src/DatabaseServices/Line.ts @@ -12,6 +12,7 @@ import { Circle } from './Circle'; import { Curve } from './Curve'; import { Polyline } from './Polyline'; import { Vec3DTo2D } from '../Common/CurveUtils'; +import { Status } from '../Common/Status'; @Factory export class Line extends Curve @@ -223,13 +224,13 @@ export class Line extends Curve } } - Join(cu: Curve): boolean + Join(cu: Curve): Status { if (cu instanceof Line) { //如果不平行 if (!isParallelTo(this.GetFistDeriv(0), cu.GetFistDeriv(0))) - return false; + return Status.False; let [param1, param2] = arraySortByNumber([this.GetParamAtPoint(cu.StartPoint), this.GetParamAtPoint(cu.EndPoint)]); @@ -241,10 +242,10 @@ export class Line extends Curve this.Extend(param1); if (param2 > 1) this.Extend(param2); - return true; + return Status.False; } } - return false; + return Status.False; }; Reverse(): this diff --git a/src/DatabaseServices/Polyline.ts b/src/DatabaseServices/Polyline.ts index 400dafcc1..98021adf3 100644 --- a/src/DatabaseServices/Polyline.ts +++ b/src/DatabaseServices/Polyline.ts @@ -5,8 +5,9 @@ import { arrayLast, arrayRemoveDuplicateBySort } from '../Common/ArrayExt'; import { ColorMaterial } from '../Common/ColorPalette'; import { getDeterminantFor2V, Vec2DTo3D, Vec3DTo2D } from '../Common/CurveUtils'; import { matrixAlignCoordSys } from '../Common/Matrix4Utils'; +import { Status } from '../Common/Status'; import { FixIndex } from '../Common/Utils'; -import { equalv3, equaln, updateGeometry } from '../Geometry/GeUtils'; +import { equaln, equalv3, updateGeometry } from '../Geometry/GeUtils'; import { RenderType } from '../GraphicsSystem/Enum'; import { IntersectOption, IntersectPolylineAndCurve } from '../GraphicsSystem/IntersectWith'; import { PolyOffsetUtil } from '../GraphicsSystem/OffsetPolyline'; @@ -540,10 +541,10 @@ export class Polyline extends Curve this.Update(); } - Join(cu: Curve, fuzz = 1e-5): boolean + Join(cu: Curve, fuzz = 1e-5) { if (this.m_ClosedMark) - return false; + return Status.False; let [sp, ep, cuSp, cuEp] = [this.StartPoint, this.EndPoint, cu.StartPoint, cu.EndPoint]; @@ -569,7 +570,7 @@ export class Polyline extends Curve this.ReadFile(f); } else - return false; + return Status.False; } else { @@ -592,7 +593,7 @@ export class Polyline extends Curve this.m_LineData.push({ pt: cuSp2, bul: 0 }); } else - return false; + return Status.False; } else if (cu instanceof Arc) { @@ -616,11 +617,11 @@ export class Polyline extends Curve this.m_LineData.push({ pt: cuSp2, bul: 0 }); } else - return false; + return Status.False; } else if (cu instanceof Polyline) { - if (cu.CloseMark) return false; + if (cu.CloseMark) return Status.False; let { pts, buls } = this.PtsBuls; @@ -667,7 +668,7 @@ export class Polyline extends Curve buls = buls.concat(cuPtsBul.buls); } else - return false; + return Status.False; this.m_LineData.length = 0; for (let i = 0; i < pts.length; i++) @@ -676,12 +677,12 @@ export class Polyline extends Curve } } else - return false; + return Status.False; } //在上面的其他分支已经返回了假 所以这里直接返回真. this.Update(); - return true; + return Status.True; }; PtOnCurve(pt: Vector3): boolean