mirror of https://gitee.com/cf-fz/WebCAD.git
!514 重构偏移算法,优化走刀结果
parent
9a4b8205b2
commit
60f2491d04
File diff suppressed because one or more lines are too long
@ -1,25 +1,25 @@
|
|||||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
exports[`补充bug测试#IKWGF 1`] = `1.1376403544773552`;
|
exports[`补充bug测试#IKWGF 1`] = `0.44573953230750973`;
|
||||||
|
|
||||||
exports[`补充bug测试#IKWGF 2`] = `0.44573953236152686`;
|
exports[`补充bug测试#IKWGF 2`] = `10.732981364094256`;
|
||||||
|
|
||||||
exports[`补充bug测试#IKWGF 3`] = `10.732981364094256`;
|
exports[`补充bug测试#IKWGF 3`] = `1.137640354477355`;
|
||||||
|
|
||||||
exports[`补充bug测试#IKWGF 4`] = `12.78691181488093`;
|
exports[`补充bug测试#IKWGF 4`] = `12.786911814880934`;
|
||||||
|
|
||||||
exports[`补充bug测试#IKWGF 5`] = `0.6246933440840137`;
|
exports[`补充bug测试#IKWGF 5`] = `10.586693841137812`;
|
||||||
|
|
||||||
exports[`补充bug测试#IKWGF 6`] = `10.586693752451833`;
|
exports[`补充bug测试#IKWGF 6`] = `0.624693344084014`;
|
||||||
|
|
||||||
exports[`补充bug测试#IKWGF 7`] = `14.067113755971711`;
|
exports[`补充bug测试#IKWGF 7`] = `14.067113755971715`;
|
||||||
|
|
||||||
exports[`补充bug测试#IKWGF 8`] = `2.168984971098264`;
|
exports[`补充bug测试#IKWGF 8`] = `11.891017922899252`;
|
||||||
|
|
||||||
exports[`补充bug测试#IKWGF 9`] = `11.89101792289927`;
|
exports[`补充bug测试#IKWGF 9`] = `2.168984971098264`;
|
||||||
|
|
||||||
exports[`补充bug测试#IKWGF 10`] = `1.0803374679586235`;
|
exports[`补充bug测试#IKWGF 10`] = `0.39474593983901435`;
|
||||||
|
|
||||||
exports[`补充bug测试#IKWGF 11`] = `0.39474593983890793`;
|
exports[`补充bug测试#IKWGF 11`] = `10.69886845125427`;
|
||||||
|
|
||||||
exports[`补充bug测试#IKWGF 12`] = `10.69886845125427`;
|
exports[`补充bug测试#IKWGF 12`] = `1.0803374679586233`;
|
||||||
|
File diff suppressed because one or more lines are too long
@ -1,82 +1,47 @@
|
|||||||
import { app } from "../ApplicationServices/Application";
|
import { app } from "../ApplicationServices/Application";
|
||||||
|
import { Curve } from "../DatabaseServices/Entity/Curve";
|
||||||
import { Polyline } from "../DatabaseServices/Entity/Polyline";
|
import { Polyline } from "../DatabaseServices/Entity/Polyline";
|
||||||
import { Command } from "../Editor/CommandMachine";
|
import { Command } from "../Editor/CommandMachine";
|
||||||
import { PromptStatus } from "../Editor/PromptResult";
|
import { PromptStatus } from "../Editor/PromptResult";
|
||||||
import { Vector3 } from "three";
|
import { HotCMD } from "../Hot/HotCommand";
|
||||||
|
import { TestDraw } from "./test/TestUtil";
|
||||||
|
|
||||||
//无限内偏移
|
//无限内偏移
|
||||||
|
@HotCMD
|
||||||
export class OffsetX implements Command
|
export class OffsetX implements Command
|
||||||
{
|
{
|
||||||
offsetDis: number = 1;
|
offsetDis: number = 1;
|
||||||
async exec()
|
async exec()
|
||||||
{
|
{
|
||||||
let ssRes = await app.Editor.GetEntity();
|
let ssRes = await app.Editor.GetEntity({ Msg: "选择多段线进行偏移测试:", Filter: { filterTypes: [Polyline] } });
|
||||||
if (ssRes.Status != PromptStatus.OK) return;
|
if (ssRes.Status != PromptStatus.OK) return;
|
||||||
let pl = ssRes.Entity as Polyline;
|
let pl = ssRes.Entity as Polyline;
|
||||||
if (!pl) return;
|
|
||||||
|
|
||||||
let dis: number, step: number;
|
|
||||||
|
|
||||||
if (window["autoDis"])
|
|
||||||
{
|
|
||||||
this.offsetDis = 1.2 * Math.max(...pl.BoundingBox.getSize(new Vector3()).toArray());
|
|
||||||
dis = -this.offsetDis;
|
|
||||||
step = this.offsetDis / 20;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
let disRes = await app.Editor.GetDistance({
|
let disRes = await app.Editor.GetDistance({
|
||||||
Msg: "指定偏移距离:",
|
Msg: "指定偏移距离:",
|
||||||
KeyWordList: [{ msg: "通过", key: "T" }],
|
KeyWordList: [{ msg: "通过", key: "T" }],
|
||||||
Default: this.offsetDis
|
Default: this.offsetDis
|
||||||
});
|
});
|
||||||
|
|
||||||
if (disRes.Status != PromptStatus.OK) return;
|
let offsetDis = Math.abs(disRes.Distance);
|
||||||
this.offsetDis = disRes.Distance;
|
TestDraw(pl.GetFeedingToolPath(offsetDis * Math.sign(pl.Area2)), 3);//外偏移
|
||||||
dis = -this.offsetDis;
|
|
||||||
if (pl.IsClockWise) dis = -dis;
|
|
||||||
|
|
||||||
let disRes1 = await app.Editor.GetDistance({
|
|
||||||
Msg: "步长:",
|
|
||||||
KeyWordList: [{ msg: "通过", key: "T" }],
|
|
||||||
Default: 1
|
|
||||||
});
|
|
||||||
|
|
||||||
if (disRes1.Status != PromptStatus.OK) return;
|
|
||||||
step = disRes1.Distance;
|
|
||||||
}
|
|
||||||
|
|
||||||
// let step = 0.5;
|
|
||||||
let offRes: Polyline[] = [];
|
|
||||||
// offRes.push(...pl.GetOffsetCurves(dis) as Polyline[]);
|
|
||||||
|
|
||||||
// for (let i = 0; i < offRes.length; i++)
|
let offsetQueue: Curve[] = [pl];
|
||||||
// {
|
|
||||||
// let offpl = offRes[i];
|
|
||||||
// if (offpl.IsClose)
|
|
||||||
// {
|
|
||||||
// offRes.push(...offpl.GetOffsetCurves(dis) as Polyline[]);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (step === 0)
|
while (offsetQueue.length > 0)
|
||||||
{
|
{
|
||||||
app.Editor.Prompt("步长不能为0,已经帮你转换成" + dis / 10);
|
let pl = offsetQueue.pop() as Polyline;
|
||||||
step = dis / 10;
|
let offsets = pl.GetFeedingToolPath(offsetDis * -Math.sign(pl.Area2));
|
||||||
}
|
for (let c of offsets)
|
||||||
let count = dis / step;
|
|
||||||
for (let i = 0; i < count; i++)
|
|
||||||
{
|
{
|
||||||
offRes.push(...pl.GetOffsetCurves(i * step) as Polyline[]);
|
if (c.IsClose)
|
||||||
offRes.push(...pl.GetOffsetCurves(-i * step) as Polyline[]);
|
|
||||||
|
|
||||||
if (i > 50)
|
|
||||||
{
|
{
|
||||||
alert("执行次数太多,怕你卡死,帮你停止了!");
|
TestDraw(c, 4);
|
||||||
break;
|
offsetQueue.push(c);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
TestDraw(c, 5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
offRes.forEach(c => app.Database.ModelSpace.Append(c));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,115 @@
|
|||||||
|
import { app } from "../../../ApplicationServices/Application";
|
||||||
|
import { Arc } from "../../../DatabaseServices/Entity/Arc";
|
||||||
|
import { Entity } from "../../../DatabaseServices/Entity/Entity";
|
||||||
|
import { Point } from "../../../DatabaseServices/Entity/Point";
|
||||||
|
import { Polyline } from "../../../DatabaseServices/Entity/Polyline";
|
||||||
|
import { Region } from "../../../DatabaseServices/Entity/Region";
|
||||||
|
import { OffsetPolyline } from "../../../GraphicsSystem/OffsetPolyline";
|
||||||
|
import { TestDraw } from "../TestUtil";
|
||||||
|
|
||||||
|
export class OffsetTestUtil extends OffsetPolyline
|
||||||
|
{
|
||||||
|
constructor(_Polyline: Polyline, _OffsetDist: number, _ToolPath = false)
|
||||||
|
{
|
||||||
|
super(_Polyline, _OffsetDist, _ToolPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
//----TEST
|
||||||
|
TestDrawPolyline()
|
||||||
|
{
|
||||||
|
this.OffsetSubCurves();
|
||||||
|
app.Editor.Prompt("开始绘制多段线")
|
||||||
|
for (let i = 0; i < this._SubCurves.length; i++)
|
||||||
|
{
|
||||||
|
let c = this._SubCurves[i].Clone().ApplyMatrix(this._CacheOCS);
|
||||||
|
c.ColorIndex = i + 1;
|
||||||
|
|
||||||
|
TestDraw(c);
|
||||||
|
for (let d of this._SubOffsetedCurves)
|
||||||
|
{
|
||||||
|
if (d.index === i)
|
||||||
|
{
|
||||||
|
let c2 = d.curve.Clone().ApplyMatrix(this._CacheOCS);
|
||||||
|
c2.ColorIndex = i + 1;
|
||||||
|
TestDraw(c2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TestDrawLinkSubCurve()
|
||||||
|
{
|
||||||
|
app.Editor.Prompt("开始显示曲线连接");
|
||||||
|
for (let i = 0; i < this._SubOffsetedCurves.length; i++)
|
||||||
|
{
|
||||||
|
let d = this._SubOffsetedCurves[i];
|
||||||
|
let c = d.curve.Clone();
|
||||||
|
if (d.sp || d.ep)
|
||||||
|
{
|
||||||
|
if (d.sp) c.StartPoint = d.sp;
|
||||||
|
if (d.ep) c.EndPoint = d.ep;
|
||||||
|
}
|
||||||
|
c.ColorIndex = d.index + 1;
|
||||||
|
c.ApplyMatrix(this._CacheOCS);
|
||||||
|
TestDraw(c);
|
||||||
|
|
||||||
|
if (d.paddingCurve)
|
||||||
|
{
|
||||||
|
for (let c of d.paddingCurve)
|
||||||
|
{
|
||||||
|
let arc = c.Clone().ApplyMatrix(this._CacheOCS) as Arc;
|
||||||
|
|
||||||
|
let p = new Point(arc.Center);
|
||||||
|
TestDraw(p);
|
||||||
|
p.Erase();
|
||||||
|
|
||||||
|
arc.ColorIndex = d.index + 1;
|
||||||
|
TestDraw(arc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TestDrawTrimCircle()
|
||||||
|
{
|
||||||
|
app.Editor.Prompt("开始显示裁剪圆弧");
|
||||||
|
for (let i = 0; i < this._TrimCircleContours.length; i++)
|
||||||
|
{
|
||||||
|
let c = this._TrimCircleContours[i].Clone().ApplyMatrix(this._CacheOCS);
|
||||||
|
let region = Region.CreateFromCurves([c]);
|
||||||
|
region.ColorIndex = i + 1;
|
||||||
|
TestDraw(region);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TestDrawTriContours()
|
||||||
|
{
|
||||||
|
app.Editor.Prompt("开始显示裁剪轮廓");
|
||||||
|
for (let i = 0; i < this._TrimPolylineContours.length; i++)
|
||||||
|
{
|
||||||
|
let c = this._TrimPolylineContours[i].Curve.Clone().ApplyMatrix(this._CacheOCS);
|
||||||
|
let region = Region.CreateFromCurves([c]);
|
||||||
|
region.ColorIndex = i + 1;
|
||||||
|
TestDraw(region);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TestDrawRetCurves()
|
||||||
|
{
|
||||||
|
app.Editor.Prompt("开始绘制最终结果");
|
||||||
|
for (let i = 0; i < this._RetCurves.length; i++)
|
||||||
|
{
|
||||||
|
let c = this._RetCurves[i];
|
||||||
|
TestDraw(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TestTrimedCurve()
|
||||||
|
{
|
||||||
|
let i = 1;
|
||||||
|
for (let c of this._CurveTrimedTreeNodes)
|
||||||
|
{
|
||||||
|
TestDraw(c.curve.ApplyMatrix(this._CacheOCS), i);
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,85 @@
|
|||||||
|
import { Box3 } from "three";
|
||||||
|
import { begin } from "xaop";
|
||||||
|
import { app } from "../../../ApplicationServices/Application";
|
||||||
|
import { JigMoveEntity } from "../../../Common/JigMove";
|
||||||
|
import { CADFiler } from "../../../DatabaseServices/CADFiler";
|
||||||
|
import { Entity } from "../../../DatabaseServices/Entity/Entity";
|
||||||
|
import { Polyline } from "../../../DatabaseServices/Entity/Polyline";
|
||||||
|
import { ObjectSnapMode } from "../../../Editor/ObjectSnapMode";
|
||||||
|
import { TestDraw } from "../TestUtil";
|
||||||
|
import { OffsetTestUtil } from "./OffsetTestUtil";
|
||||||
|
|
||||||
|
export function LoadEntityFromFileData(data)
|
||||||
|
{
|
||||||
|
if (!Array.isArray(data))
|
||||||
|
data = data.file;
|
||||||
|
|
||||||
|
let file = new CADFiler();
|
||||||
|
file.Data = data;
|
||||||
|
let ens: Entity[] = [];
|
||||||
|
let count = file.Read();
|
||||||
|
if (typeof count !== "number")
|
||||||
|
{
|
||||||
|
count = file.Data.length;
|
||||||
|
file.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
ens.push(file.ReadObject() as Entity);
|
||||||
|
}
|
||||||
|
return ens;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function TestOffset(cud: Object, offsetDist: number | number[], count?: number)
|
||||||
|
{
|
||||||
|
let ds = (typeof offsetDist === "number") ? [offsetDist] : offsetDist;
|
||||||
|
let ents: Entity[] = [];
|
||||||
|
let rm = begin(app.Database.ModelSpace, app.Database.ModelSpace.AppendEvent, (e: Entity) =>
|
||||||
|
{
|
||||||
|
ents.push(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
app.Editor.GetPointServices.snapServices.SnapModeEnable = ObjectSnapMode.Node;
|
||||||
|
|
||||||
|
for (let d of ds)
|
||||||
|
{
|
||||||
|
let pl = LoadEntityFromFileData(cud)[0] as Polyline;
|
||||||
|
app.Editor.UpdateScreen();
|
||||||
|
let u = new OffsetTestUtil(pl, d, true);
|
||||||
|
u.Do();
|
||||||
|
|
||||||
|
for (let step = 1; step < 6; step++)
|
||||||
|
{
|
||||||
|
u.Do();
|
||||||
|
ents.length = 0;
|
||||||
|
TestDraw(pl.Clone());
|
||||||
|
if (step === 1)
|
||||||
|
{
|
||||||
|
u.TestDrawPolyline();
|
||||||
|
}
|
||||||
|
else if (step === 2)
|
||||||
|
{
|
||||||
|
u.TestDrawLinkSubCurve();
|
||||||
|
}
|
||||||
|
else if (step === 3)
|
||||||
|
u.TestDrawTriContours();
|
||||||
|
else if (step === 4)
|
||||||
|
u.TestTrimedCurve();
|
||||||
|
else if (step === 5)
|
||||||
|
{
|
||||||
|
let i = 1;
|
||||||
|
for (let c of u._RetCurves)
|
||||||
|
{
|
||||||
|
TestDraw(c, i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let b = new Box3();
|
||||||
|
for (let e of ents)
|
||||||
|
b.union(e.BoundingBox);
|
||||||
|
await JigMoveEntity(ents, b.min)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rm();
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
import { Object3D } from "three";
|
||||||
|
import { app } from "../../ApplicationServices/Application";
|
||||||
|
import { Entity } from "../../DatabaseServices/Entity/Entity";
|
||||||
|
|
||||||
|
export function TestDraw(en: Entity | Entity[] | Object3D, colorIndex = 0)
|
||||||
|
{
|
||||||
|
if (en instanceof Object3D)
|
||||||
|
app.Viewer.Scene.add(en);
|
||||||
|
else if (en instanceof Entity)
|
||||||
|
{
|
||||||
|
if (colorIndex > 0)
|
||||||
|
en.ColorIndex = colorIndex;
|
||||||
|
app.Database.ModelSpace.Append(en);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
for (let e of en)
|
||||||
|
{
|
||||||
|
if (colorIndex > 0)
|
||||||
|
e.ColorIndex = colorIndex;
|
||||||
|
app.Database.ModelSpace.Append(e);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
/**
|
||||||
|
* Decimal adjustment of a number.
|
||||||
|
*
|
||||||
|
* @param {String} type The type of adjustment.
|
||||||
|
* @param {Number} value The number.
|
||||||
|
* @param {Integer} exp The exponent (the 10 logarithm of the adjustment base).
|
||||||
|
* @returns {Number} The adjusted value.
|
||||||
|
*/
|
||||||
|
function decimalAdjust(type: string, value: number | (string | number)[], exp: number): number
|
||||||
|
{
|
||||||
|
// If the exp is undefined or zero...
|
||||||
|
if (typeof exp === 'undefined' || +exp === 0)
|
||||||
|
{
|
||||||
|
return Math[type](value);
|
||||||
|
}
|
||||||
|
value = +value;
|
||||||
|
exp = +exp;
|
||||||
|
// If the value is not a number or the exp is not an integer...
|
||||||
|
if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
|
||||||
|
{
|
||||||
|
return NaN;
|
||||||
|
}
|
||||||
|
// Shift
|
||||||
|
value = value.toString().split('e');
|
||||||
|
value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));
|
||||||
|
// Shift back
|
||||||
|
value = value.toString().split('e');
|
||||||
|
return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decimal round
|
||||||
|
export function round10(value: number, exp: number): number
|
||||||
|
{
|
||||||
|
return decimalAdjust('round', value, exp);
|
||||||
|
};
|
||||||
|
// Decimal floor
|
||||||
|
function floor10(value: number, exp: number): number
|
||||||
|
{
|
||||||
|
return decimalAdjust('floor', value, exp);
|
||||||
|
};
|
||||||
|
// Decimal ceil
|
||||||
|
function ceil10(value: number, exp: number): number
|
||||||
|
{
|
||||||
|
return decimalAdjust('ceil', value, exp);
|
||||||
|
};
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue