功能:添加优化算法的测试绘制功能

pull/1407/MERGE
ChenX 4 years ago
parent 9486eff18e
commit 7b49dec24c

@ -29,7 +29,7 @@ export class Entsel implements Command
if (res.Entity.Template)
dyn.UpdatePrompt(`模版:${res.Entity.Template.Index}`);
else
dyn.UpdatePrompt(`null`);
dyn.UpdatePrompt(res.Entity.ColorIndex.toString());
if (res.Entity instanceof VisualSpaceBox)
{

@ -52,6 +52,8 @@ import { DrawTopBottomBoard } from "../Add-on/DrawBoard/DrawTopBottomBoard";
import { DrawVerticalBoard } from "../Add-on/DrawBoard/DrawVerticalBoard";
import { EditorBoardTemplate } from '../Add-on/DrawBoard/EditorBoardTempate';
import { FindMaxOrMinSizeBoard } from "../Add-on/DrawBoard/FindMaxSizeBoard";
import { FixIntersectSelfContour } from "../Add-on/DrawBoard/FixIntersectSelfContour";
import { ParseHinge } from "../Add-on/DrawBoard/ParseHinge";
import { SetHoleNoneType } from "../Add-on/DrawBoard/SetHoleType";
import { DrawCircle } from "../Add-on/DrawCircle";
import { DrawCylineder } from "../Add-on/DrawCylinder";
@ -188,17 +190,21 @@ import { Command_Trim } from "../Add-on/Trim";
import { Command_Curve2Polyline } from "../Add-on/twoD2threeD/Command_Curve2Polyline";
import { Command_Curve2VSBox } from "../Add-on/twoD2threeD/Command_Curve2VSBox";
import { Polyline2Board } from "../Add-on/twoD2threeD/Polyline2Board";
import { Rect2Board } from "../Add-on/twoD2threeD/Rect2Board";
import { Redo, Undo } from "../Add-on/Undo";
import { ViewChange } from "../Add-on/ViewChange";
import { OneKeyLayout } from "../Add-on/Viewport/OneKeyLayout";
import { OneKeyPrint } from "../Add-on/Viewport/OneKeyPrint";
import { Command_Wblock } from "../Add-on/Wblock";
import { ZoomE } from "../Add-on/ZoomE";
import { CommandNames } from "../Common/CommandNames";
import { CommandServer, UpgradeData } from '../DatabaseServices/CommandServer';
import { Command_ExportObj2 } from "../Geometry/ExportObj2";
import { RenderType } from "../GraphicsSystem/RenderType";
import { Command_TestDrawYHData } from "../Nest/Test/TestDrawYHData";
import { Command_TestNFP } from "../Nest/Test/TestNFP";
import { Command_TestPlace } from "../Nest/Test/TestPlace";
import { Command_TestSaveYHData } from "../Nest/Test/TestSaveYHData";
import { Command_TestSimply } from "../Nest/Test/TestSimply";
import { Command_TestYH2 } from "../Nest/Test/TestYH2";
import { Command_TestYHSingle } from "../Nest/Test/TestYHSingle";
@ -209,10 +215,6 @@ import { BuyMaterial } from './../Add-on/BuyMaterial';
import { Interfere } from './../Add-on/interfere';
import { ShowKinfeManageModal } from './../Add-on/showModal/ShowKnifeManageModal';
import { commandMachine } from './CommandMachine';
import { Rect2Board } from "../Add-on/twoD2threeD/Rect2Board";
import { FixIntersectSelfContour } from "../Add-on/DrawBoard/FixIntersectSelfContour";
import { OneKeyPrint } from "../Add-on/Viewport/OneKeyPrint";
import { ParseHinge } from "../Add-on/DrawBoard/ParseHinge";
export function registerCommand()
{
@ -500,6 +502,9 @@ export function registerCommand()
commandMachine.RegisterCommand("testYH", new Command_TestYHWorker());
commandMachine.RegisterCommand("testYH2", new Command_TestYH2());
commandMachine.RegisterCommand("testYHSingle", new Command_TestYHSingle());
commandMachine.RegisterCommand("testYHDraw", new Command_TestDrawYHData());
commandMachine.RegisterCommand("testYHSave", new Command_TestSaveYHData());
commandMachine.RegisterCommand("editorlattice", new EditorLattice());
commandMachine.RegisterCommand(CommandNames.Print, new Print());

@ -140,6 +140,9 @@ export function ConverBoard2Part(board: Board, knifRadius = 3.5): Part
part.Init2(path, DefaultBin, Rotations[board.BoardProcessOption.lines]);
}
}
//如果要强制设置旋转状态,来测试代码,需要在这里添加代码,从而保证零件的内部网洞也是正确的!
for (let m of board.BoardModeling)
{
if (equaln(m.thickness, board.Thickness))

@ -36,6 +36,7 @@ export class NestDatabase
part.ReadFile(file);
this.Parts.push(part);
}
return this;
}
//对象将自身数据写入到文件.
WriteFile(file: NestFiler)

@ -0,0 +1,112 @@
import { Matrix4, Vector3 } from "three";
import { TestDraw } from "../../Add-on/test/TestUtil";
import { app } from "../../ApplicationServices/Application";
import { Log } from "../../Common/Log";
import { FixIndex } from "../../Common/Utils";
import { Curve } from "../../DatabaseServices/Entity/Curve";
import { Command } from "../../Editor/CommandMachine";
import { PromptStatus } from "../../Editor/PromptResult";
import { HotCMD } from "../../Hot/HotCommand";
import { NestFiler } from "../Common/Filer";
import { Path2Polyline } from "../Converter/Path2Polyline";
import { Individual } from "../Core/Individual";
import { NestDatabase } from "../Core/NestDatabase";
import { Place } from "./PlaceUtil";
import { NestVariant } from "./TestVariant";
import { CacheYHData, CacheYHDatabase } from "./TestYHWorker";
/**
* 线
* localStore(线)
*/
@HotCMD
export class Command_TestDrawYHData implements Command
{
async exec()
{
let nestDb = CacheYHDatabase.Db as NestDatabase;
let dstr = localStorage.getItem("yhdata");
let d: typeof CacheYHData = JSON.parse(dstr);
// d = require("./test.json");
if (!nestDb && true)
{
NestVariant.curveMap.clear();
let origin = new NestFiler(d.OriginalData);
nestDb = new NestDatabase().ReadFile(origin);
//初始化零件
for (let part of nestDb.Parts)
{
let cus: Curve[] = [];
part.UserData = cus;
let state = part.RotatedStates[0];
let pts = state.Contour.Points.map(p => new Vector3(p.x * 1, p.y * 1));
let pl = Path2Polyline(pts);
cus.push(pl);
let ocs = new Matrix4;
if (state.Rotation !== 0)
ocs.makeRotationZ(-state.Rotation);
ocs.setPosition(state.OrigionMinPoint.x, state.OrigionMinPoint.y, 0);
TestDraw(pl);
NestVariant.curveMap.set(pl, ocs);
for (let h of part.Holes)
{
let pl = Path2Polyline(h.Contour.Points);
TestDraw(pl);
cus.push(pl);
NestVariant.curveMap.set(pl, new Matrix4().setPosition(h.OrigionMinPoint.x, h.OrigionMinPoint.y, 0));
}
}
}
let placeType = 1;//1 正常的 2弃用的
let placeIndex = -1;//当前绘制的索引
//绘制零件放置状态
while (true)
{
let keyRes = await app.Editor.GetKeyWords({
KeyWordList: [
{ key: "1", msg: "正常的" },
{ key: "2", msg: "弃用的" },
{ key: "3", msg: "上一个" },
{ key: "4", msg: "下一个" },
],
});
if (keyRes.Status === PromptStatus.Cancel)
return;
if (keyRes.StringResult === "1")
placeType = 1;
else if (keyRes.StringResult === "2")
placeType = 2;
else if (keyRes.StringResult === "3")
placeIndex--;
else if (keyRes.StringResult === "4")
placeIndex++;
let datas: any[];
if (placeType === 1)
{
datas = d.PlaceData;
placeIndex = FixIndex(placeIndex, d.PlaceData);
}
else
{
datas = d.DiscardPlaceData;
placeIndex = FixIndex(placeIndex, d.DiscardPlaceData);
}
Log(`当前:${placeType === 1 ? "正常" : "弃用"},索引:${placeIndex}`);
let f = new NestFiler(datas[placeIndex]);
let inv = new Individual(nestDb.Parts);
inv.ReadFile(f);
Place(inv, nestDb.Parts, nestDb.Bin);
}
}
}

@ -8,6 +8,7 @@ import { Curves2Points } from "../Converter/ConverBoard2Part";
import { Path2Polyline } from "../Converter/Path2Polyline";
import { Path, PathScale } from "../Core/Path";
import { InitClipperCpp } from "../Common/ClipperCpp";
import { Log } from "../../Common/Log";
const TesetPerformance = false;
@ -17,6 +18,7 @@ export class Command_TestNFP implements Command
{
let w = InitClipperCpp();
let plsRes = await app.Editor.GetSelection({
Msg: "先选择不动的,在选择动的。",
Filter: {
filterTypes: [Polyline, Circle]
}
@ -28,6 +30,8 @@ export class Command_TestNFP implements Command
let pls = plsRes.SelectSet.SelectEntityList as (Polyline | Circle)[];
if (pls.length < 2) return;
Log("黄色代表外部,红色代表内部。");
let binpl = pls.shift();
let binPath = new Path(Curves2Points(binpl, false, 0)[1]);

@ -0,0 +1,14 @@
import { FileSystem } from "../../Common/FileSystem";
import { Command } from "../../Editor/CommandMachine";
/**
*
*/
export class Command_TestSaveYHData implements Command
{
async exec()
{
let now = new Date;
FileSystem.WriteFile(`${now.getMonth()}-${now.getDay()}--${now.getTime()}-${now.getMinutes()}.json`, localStorage.getItem("yhdata"));
}
}

@ -4,5 +4,5 @@ import { Matrix4 } from "three";
export let NestVariant: {
best?: Individual;
curveMap?: Map<Curve, Matrix4>;
curveMap: Map<Curve, Matrix4>;
} = { curveMap: new Map() };

@ -4,9 +4,14 @@ import { HotCMD } from "../../Hot/HotCommand";
import { AppToaster } from "../../UI/Components/Toaster";
import { NestFiler } from "../Common/Filer";
import { Individual } from "../Core/Individual";
import { NestDatabase } from "../Core/NestDatabase";
import Worker from "../Core/OptimizeWorker.worker";
import { InitParts, Place } from "./PlaceUtil";
//用于缓存优化结果的数据
export const CacheYHData = { OriginalData: undefined, PlaceData: [], DiscardPlaceData: [] };
export const CacheYHDatabase: { Db: NestDatabase; } = { Db: null };
@HotCMD
export class Command_TestYHWorker implements Command
{
@ -24,6 +29,8 @@ export class Command_TestYHWorker implements Command
for (let w of workers)
w.terminate();
AppToaster.dismiss(key);
localStorage.setItem("yhdata", JSON.stringify(CacheYHData));
}}></button>
</>,
timeout: 0,
@ -36,12 +43,22 @@ export class Command_TestYHWorker implements Command
let inv = new Individual(db.Parts);
inv.ReadFile(f);
if (best <= inv.Fitness)
{
// CacheYHData.DiscardPlaceData.push(e.data);//保存弃用的放置数据
return;
}
best = inv.Fitness;
CacheYHData.PlaceData.push(e.data);//保存显示出来的放置数据
CommandWrap(() => Place(inv, db.Parts, db.Bin), `应用优化${inv.Fitness}`);
};
let f = db.File;
//原始的轮廓数据(传递给优化算法的)
CacheYHData.OriginalData = f._datas;
CacheYHData.PlaceData = [];
CacheYHDatabase.Db = db;
for (let i = 0; i < navigator.hardwareConcurrency / 2; i++)// ||
{
let w = new Worker;

Loading…
Cancel
Save