diff --git a/src/Add-on/Entsel.ts b/src/Add-on/Entsel.ts index e369ffb37..bc655341b 100644 --- a/src/Add-on/Entsel.ts +++ b/src/Add-on/Entsel.ts @@ -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) { diff --git a/src/Editor/CommandRegister.ts b/src/Editor/CommandRegister.ts index a47f30ced..a8087682c 100644 --- a/src/Editor/CommandRegister.ts +++ b/src/Editor/CommandRegister.ts @@ -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()); diff --git a/src/Nest/Converter/ConverBoard2Part.ts b/src/Nest/Converter/ConverBoard2Part.ts index ee9ac0663..c7a93d400 100644 --- a/src/Nest/Converter/ConverBoard2Part.ts +++ b/src/Nest/Converter/ConverBoard2Part.ts @@ -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)) diff --git a/src/Nest/Core/NestDatabase.ts b/src/Nest/Core/NestDatabase.ts index 4e237f6ac..4c571953b 100644 --- a/src/Nest/Core/NestDatabase.ts +++ b/src/Nest/Core/NestDatabase.ts @@ -36,6 +36,7 @@ export class NestDatabase part.ReadFile(file); this.Parts.push(part); } + return this; } //对象将自身数据写入到文件. WriteFile(file: NestFiler) diff --git a/src/Nest/Test/TestDrawYHData.ts b/src/Nest/Test/TestDrawYHData.ts new file mode 100644 index 000000000..bdd5d4b30 --- /dev/null +++ b/src/Nest/Test/TestDrawYHData.ts @@ -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); + } + } +} diff --git a/src/Nest/Test/TestNFP.ts b/src/Nest/Test/TestNFP.ts index f3a197b71..d7226a6b8 100644 --- a/src/Nest/Test/TestNFP.ts +++ b/src/Nest/Test/TestNFP.ts @@ -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]); diff --git a/src/Nest/Test/TestSaveYHData.ts b/src/Nest/Test/TestSaveYHData.ts new file mode 100644 index 000000000..4e28d46c8 --- /dev/null +++ b/src/Nest/Test/TestSaveYHData.ts @@ -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")); + } +} diff --git a/src/Nest/Test/TestVariant.ts b/src/Nest/Test/TestVariant.ts index b170c9a30..04b854b54 100644 --- a/src/Nest/Test/TestVariant.ts +++ b/src/Nest/Test/TestVariant.ts @@ -4,5 +4,5 @@ import { Matrix4 } from "three"; export let NestVariant: { best?: Individual; - curveMap?: Map; + curveMap: Map; } = { curveMap: new Map() }; diff --git a/src/Nest/Test/TestYHWorker.tsx b/src/Nest/Test/TestYHWorker.tsx index 9403b86f5..d6b3e21ff 100644 --- a/src/Nest/Test/TestYHWorker.tsx +++ b/src/Nest/Test/TestYHWorker.tsx @@ -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)); }}>停止 , 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;