From 04c54d18f59febcb99c89c86218b1b0b7c4304d8 Mon Sep 17 00:00:00 2001 From: ChenX Date: Fri, 22 Feb 2019 15:27:13 +0800 Subject: [PATCH] =?UTF-8?q?!259=20=E5=90=88=E5=B9=B6=E6=9D=BF=E4=BB=B6?= =?UTF-8?q?=E5=80=92=E8=A7=92=E5=88=B0F=E5=91=BD=E4=BB=A4=20Merge=20pull?= =?UTF-8?q?=20request=20!259=20from=20=E8=82=96=E8=AF=97=E9=9B=85/mergeFFt?= =?UTF-8?q?oF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Add-on/Fillet.ts | 36 ++++++++- src/Add-on/FilletBoard.ts | 135 ---------------------------------- src/Add-on/FilletUtils.ts | 33 ++++++++- src/Editor/CommandRegister.ts | 2 - 4 files changed, 65 insertions(+), 141 deletions(-) delete mode 100644 src/Add-on/FilletBoard.ts diff --git a/src/Add-on/Fillet.ts b/src/Add-on/Fillet.ts index e91c24a95..898fd365f 100644 --- a/src/Add-on/Fillet.ts +++ b/src/Add-on/Fillet.ts @@ -9,6 +9,7 @@ import { Command } from '../Editor/CommandMachine'; import { JigUtils } from '../Editor/JigUtils'; import { PromptEntityResult, PromptStatus } from '../Editor/PromptResult'; import { FilletUtils } from './FilletUtils'; +import { Board } from '../DatabaseServices/Board'; const RADKEY = 'filletRadius'; @@ -148,6 +149,29 @@ export class CommandFillet implements Command this.m_FilletUtils.m_FilletRadius = this.m_FilletRadius; } + async FilletBoard(enRes: PromptEntityResult) + { + //------1.画辅助线 + let ptRes = await app.m_Editor.GetPoint({ + BasePoint: enRes.Point, + AllowDrawRubberBand: true, + AllowNone: true, + Msg: "选择下一个点:" + }); + if (ptRes.Status === PromptStatus.Cancel) + return; + + //------2.倒角 + let fres = this.m_FilletUtils.FilletBoard(enRes, ptRes); + if (fres instanceof Polyline) + { + let br = enRes.Entity as Board; + br.ContourCurve = fres; + } + else + app.m_Editor.Prompt(fres); + } + async SelectCurve(keyword: KeyWord[]): Promise { while (true) @@ -155,7 +179,7 @@ export class CommandFillet implements Command let enRes = await app.m_Editor.GetEntity({ Msg: `选择第一个对象:`, KeyWordList: keyword, - Filter: { filterTypes: [Curve] }, + Filter: { filterTypes: [Curve, Board] }, Callback: (res) => { //将用户坐标系转换到实体坐标系 @@ -166,7 +190,15 @@ export class CommandFillet implements Command switch (enRes.Status) { case PromptStatus.OK: - return enRes; + { + if (enRes.Entity instanceof Board) + { + await this.FilletBoard(enRes); + return; + } + else + return enRes; + } case PromptStatus.Cancel: return; case PromptStatus.Keyword: diff --git a/src/Add-on/FilletBoard.ts b/src/Add-on/FilletBoard.ts deleted file mode 100644 index f743126ed..000000000 --- a/src/Add-on/FilletBoard.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { Command } from "../Editor/CommandMachine"; -import { FilletUtils } from "./FilletUtils"; -import { app } from "../ApplicationServices/Application"; -import { KeyWord } from "../Common/InputState"; -import { PromptEntityResult, PromptStatus } from "../Editor/PromptResult"; -import { FixedNotZero } from "../Common/Utils"; -import { Board } from "../DatabaseServices/Board"; -import { Polyline } from "../DatabaseServices/Polyline"; -import { Contour } from "../DatabaseServices/Contour"; -import { Line } from "../DatabaseServices/Line"; -import { IntersectOption } from "../GraphicsSystem/IntersectWith"; - -const RADKEY = 'filletBoardRadius'; -export class CommandFilletBoard implements Command -{ - m_FilletBoardRadius: number = 0; - private m_FilletUtils = new FilletUtils(); - constructor() - { - let radStr = window.localStorage.getItem(RADKEY); - if (radStr) - this.m_FilletBoardRadius = parseFloat(radStr); - - this.UpdateFilletRadius(this.m_FilletBoardRadius); - } - async exec() - { - //-----1.拾取板件 - app.m_Editor.Prompt(`倒角半径:${FixedNotZero(this.m_FilletBoardRadius, 3)}`); - - let brRes = await this.SelectBoard([ - { msg: "半径", key: "R" } - ]); - - if (!brRes) return; - - let br = brRes.Entity as Board; - let brOCS = br.OCS; - let brOCSInv = br.OCSInv; - - let brContour = br.Shape.Outline.Curve.Clone() as Polyline;//提取轮廓 - - //------2.画辅助线 - let ptRes = await app.m_Editor.GetPoint({ - BasePoint: brRes.Point, - AllowDrawRubberBand: true, - AllowNone: true, - Msg: "选择第二个点:" - }); - if (ptRes.Status === PromptStatus.Cancel) - return; - - //------3.求交 - let l = new Line(brRes.Point, ptRes.Point); - l.ApplyMatrix(brOCSInv); - - let ipts = l.IntersectWith(brContour, IntersectOption.ExtendThis); - - if (ipts.length !== 2) - { - app.m_Editor.Prompt("倒角失败!交点个数异常."); - return; - } - - //------4.倒角 - let es1 = new PromptEntityResult(brContour, ipts[0]); - let es2 = new PromptEntityResult(brContour, ipts[1]); - - let res = this.m_FilletUtils.FilletPolyLineSelf(es1, es2); - if (!res) - { - app.m_Editor.Prompt("倒角失败!"); - return; - } - - if (res.cu1) - { - let cu1OcsInv = res.cu1.OCSInv; - brContour.CopyFrom(res.cu1.ApplyMatrix(cu1OcsInv).ApplyMatrix(brOCS)); - } - if (res.cu2) - { - let cu2OcsInv = res.cu2.OCSInv; - brContour.CopyFrom(res.cu2.ApplyMatrix(cu2OcsInv).ApplyMatrix(brOCS)); - } - - //-----5.应用轮廓 - brContour.ApplyMatrix(brOCSInv); - br.ContourCurve = brContour; - brContour.Erase(); - } - UpdateFilletRadius(newRadius: number) - { - if (newRadius < 0 || isNaN(newRadius)) - app.m_Editor.Prompt("半径不能为负!"); - this.m_FilletBoardRadius = Math.abs(newRadius); - window.localStorage.setItem(RADKEY, this.m_FilletBoardRadius.toString()); - - this.m_FilletUtils.m_FilletRadius = this.m_FilletBoardRadius; - } - - async SelectBoard(keyword: KeyWord[]): Promise - { - while (true) - { - let enRes = await app.m_Editor.GetEntity({ - Msg: `选择板件或:`, - KeyWordList: keyword, - Filter: { filterTypes: [Board] }, - Callback: (res) => - { - //将用户坐标系转到实体坐标系 - if (res.Entity) - app.m_Editor.UCSMatrix = res.Entity.OCS; - }, - }); - switch (enRes.Status) - { - case PromptStatus.OK: - return enRes; - case PromptStatus.Cancel: - return; - case PromptStatus.Keyword: - if (enRes.StringResult === "R") - { - let ret = await app.m_Editor.GetDistance({ Msg: "指定圆角半径:", Default: this.m_FilletBoardRadius }); - if (ret.Status === PromptStatus.OK) - this.UpdateFilletRadius(ret.Distance); - else if (ret.Status === PromptStatus.Cancel) - return; - } - } - } - } -} diff --git a/src/Add-on/FilletUtils.ts b/src/Add-on/FilletUtils.ts index ce7cf6e50..c97cc9084 100644 --- a/src/Add-on/FilletUtils.ts +++ b/src/Add-on/FilletUtils.ts @@ -5,10 +5,10 @@ import { Circle } from "../DatabaseServices/Circle"; import { Curve } from "../DatabaseServices/Curve"; import { Line } from "../DatabaseServices/Line"; import { Polyline } from "../DatabaseServices/Polyline"; -// import { JigUtils } from "../Editor/JigUtils"; -import { PromptEntityResult } from "../Editor/PromptResult"; +import { PromptEntityResult, PromptPointResult } from "../Editor/PromptResult"; import { angle, equalv3, isParallelTo, midPoint } from "../Geometry/GeUtils"; import { IntersectOption } from "../GraphicsSystem/IntersectWith"; +import { Board } from "../DatabaseServices/Board"; function Encode(res: PromptEntityResult, enMap: (PromptEntityResult[])[]) { @@ -443,6 +443,35 @@ export class FilletUtils }; } + FilletBoard(brRes: PromptEntityResult, ptRes: PromptPointResult): Polyline | string + { + let br = brRes.Entity as Board; + let brContour = br.ContourCurve.Clone() as Polyline; + + //------1.求交 + let l = new Line(brRes.Point, ptRes.Point); + l.ApplyMatrix(br.OCSInv); + + let ipts = l.IntersectWith(brContour, IntersectOption.ExtendThis); + + if (ipts.length !== 2) + return "倒角失败!交点个数异常."; + + //------2.倒角 + let es1 = new PromptEntityResult(brContour, ipts[0]); + let es2 = new PromptEntityResult(brContour, ipts[1]); + + let res = this.FilletPolyLineSelf(es1, es2); + if (res && res.cu1) + { + let cu1OcsInv = res.cu1.OCSInv; + brContour.CopyFrom(res.cu1.ApplyMatrix(cu1OcsInv)); + return brContour; + } + else + return "倒角失败" + } + /** * 平行线倒角 * @param enRes1 diff --git a/src/Editor/CommandRegister.ts b/src/Editor/CommandRegister.ts index ce666ebe0..8860f6435 100644 --- a/src/Editor/CommandRegister.ts +++ b/src/Editor/CommandRegister.ts @@ -99,7 +99,6 @@ import { CommandServer } from '../DatabaseServices/CommandServer'; import { ICommand } from '../UI/Components/CommandPanel/CommandList'; import { commandMachine } from './CommandMachine'; import { DrawDrawrer } from '../Add-on/DrawBoard/DrawDrawer'; -import { CommandFilletBoard } from '../Add-on/FilletBoard'; import { ReferenceCutting } from '../Add-on/BoardCutting/ReferenceCutting'; import { RotateLayerBoard } from '../Add-on/RotateLayerBoard'; import { Command_Options } from '../Add-on/Command_Option'; @@ -193,7 +192,6 @@ export function registerCommand() commandMachine.RegisterCommand("ss", new Command_Ssget()); commandMachine.RegisterCommand("f", new CommandFillet()); - commandMachine.RegisterCommand("ff", new CommandFilletBoard()); commandMachine.RegisterCommand("O", new Command_Offset()); commandMachine.RegisterCommand("Length", new Command_Length());