!259 合并板件倒角到F命令

Merge pull request !259 from 肖诗雅/mergeFFtoF
pull/259/MERGE
ChenX 6 years ago
parent c750fd18c1
commit 04c54d18f5

@ -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<PromptEntityResult>
{
while (true)
@ -155,7 +179,7 @@ export class CommandFillet implements Command
let enRes = await app.m_Editor.GetEntity({
Msg: `选择第一个对象<R:${FixedNotZero(this.m_FilletRadius, 3)}>:`,
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:
{
if (enRes.Entity instanceof Board)
{
await this.FilletBoard(enRes);
return;
}
else
return enRes;
}
case PromptStatus.Cancel:
return;
case PromptStatus.Keyword:

@ -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<PromptEntityResult>
{
while (true)
{
let enRes = await app.m_Editor.GetEntity({
Msg: `选择板件或<R:${FixedNotZero(this.m_FilletBoardRadius, 3)}>:`,
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;
}
}
}
}
}

@ -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

@ -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());

Loading…
Cancel
Save