mirror of https://gitee.com/cf-fz/WebCAD.git
parent
c750fd18c1
commit
04c54d18f5
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue