diff --git a/PamhagenSysCtrl/Helpers/PamhagenGraph.cs b/PamhagenSysCtrl/Helpers/PamhagenGraph.cs index 616333d..2994bac 100644 --- a/PamhagenSysCtrl/Helpers/PamhagenGraph.cs +++ b/PamhagenSysCtrl/Helpers/PamhagenGraph.cs @@ -31,66 +31,73 @@ namespace PamhagenSysCtrl.Helpers { public readonly Tank Tank9; public PamhagenGraph() { - double mw2X = 180; - double mw1X = 300; - double mpY = 380; - double ltg1Y = 510; - double ltg2Y = ltg1Y + 30; - double ltg1X = 600; - double ltg2X = ltg1X + 30; - double ltg6Y = 160; - double ltg7Y = ltg6Y - 30; - double tanksY = 280; - double tValveY = ((tanksY - 50) + ltg6Y) / 2 + 5; - double wtX = ltg1X - 180; - double wt2Y = 225; - double wt1Y = wt2Y + 135; - double x1X = wtX + 40; - double t1X = 735; - double t2X = t1X + 80; - double t3X = t2X + 80; - double t4X = t3X + 80 + 30; - double t5X = t4X + 80; - double t6X = t5X + 80 + 30; - double t7X = t6X + 80; - double t8X = t7X + 80; - double t9X = t8X + 80; - var prY = 720; - var pr1X = 730; - var pr2X = 920; + double mw2X = -118; + double mw1X = -94; + double rebX = (mw1X + mw2X) / 2; + double rebY = -46; + double mpY = -10; + double tanksY = -30; + double ltg1Y = 16; + double ltg2Y = ltg1Y + 6; + double ltg1X = -34; + double ltg2X = ltg1X + 6; + double ltg3Y = 30; + double ltg4Y = ltg3Y + 6; + double ltg5Y = tanksY + 36; + double ltg6Y = -54; + double ltg7Y = ltg6Y - 6; + double ltg8Y = ltg3Y - 6; + double ltg9Y = ltg4Y + 6; + double tValveY = ((tanksY - 10) + ltg6Y) / 2 + 1; + double wtX = ltg1X - 36; + double wt2Y = -41; + double wt1Y = wt2Y + 27; + double x1X = wtX + 8; + double t1X = -7; + double t2X = t1X + 16; + double t3X = t2X + 16; + double t4X = t3X + 16 + 6; + double t5X = t4X + 16; + double t6X = t5X + 16 + 6; + double t7X = t6X + 16; + double t8X = t7X + 16; + double t9X = t8X + 16; + var prY = 58; + var pr1X = -9; + var pr2X = 29; - var trough = new EntryTrough("Auffangwanne", mw1X + 70, 100, () => App.Plant?.IsTroughAugerActive ?? false); + var trough = new EntryTrough("Auffangwanne", mw1X + 14, rebY - 20, () => App.Plant?.IsTroughAugerActive ?? false); Nodes.Add(trough); - Auger1 = new EncasedAuger("", (mw1X + mw2X) / 2 - 100, 200, () => App.Plant?.IsAuger1Active ?? false); - var auger0 = new EncasedAuger("Pressen-\nQuerschnecke", 40, 200, () => App.Plant?.IsPresseQuerSchneckeActive ?? false, 180, clickable: false); - Auger3 = new EncasedAuger("", 120, 80, () => App.Plant?.IsAuger3Active ?? false, 135); - var belt = new ConveyorBelt("", 90, 160, () => App.Plant?.IsAuger2Active ?? false); + Auger1 = new EncasedAuger("", rebX - 19, rebY, () => App.Plant?.IsAuger1Active ?? false); + var auger0 = new EncasedAuger("Pressen-\nQuerschnecke", rebX - 39, rebY, () => App.Plant?.IsPresseQuerSchneckeActive ?? false, 180, clickable: false); + Auger3 = new EncasedAuger("", rebX - 23, rebY - 24, () => App.Plant?.IsAuger3Active ?? false, 135); + var belt = new ConveyorBelt("", rebX - 29, rebY - 8, () => App.Plant?.IsAuger2Active ?? false); Nodes.Add(belt); Nodes.Add(Auger1); Nodes.Add(auger0); Nodes.Add(Auger3); - var rebler = new Rebler("Rebler", (mw1X + mw2X) / 2, 200, () => App.Plant?.IsReblerActive ?? false); + var rebler = new Rebler("Rebler", rebX, rebY, () => App.Plant?.IsReblerActive ?? false); Nodes.Add(rebler); - var switcher = new Switcher("", (mw1X + mw2X) / 2, 260, () => App.Plant?.TroughSelector ?? 0, () => App.Plant == null ? 0 : App.Plant.WantMW1Selected ? 1 : 2); + var switcher = new Switcher("", rebX, rebY + 12, () => App.Plant?.TroughSelector ?? 0, () => App.Plant == null ? 0 : App.Plant.WantMW1Selected ? 1 : 2); Nodes.Add(switcher); - MW1 = new Trough("MW1", mw1X, mpY - 70, () => App.Plant?.FillLevelMW1 ?? FillState.Unknown); - MW2 = new Trough("MW2", mw2X, mpY - 70, () => App.Plant?.FillLevelMW2 ?? FillState.Unknown); + MW1 = new Trough("MW1", mw1X, mpY - 14, () => App.Plant?.FillLevelMW1 ?? FillState.Unknown); + MW2 = new Trough("MW2", mw2X, mpY - 14, () => App.Plant?.FillLevelMW2 ?? FillState.Unknown); MP1 = new Pump("MP1", mw1X, mpY, () => App.Plant?.MP1 ?? default, () => App.Plant?.MP1HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); MP2 = new Pump("MP2", mw2X, mpY, () => App.Plant?.MP2 ?? default, () => App.Plant?.MP2HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); - var x1 = new PipeJoin(mw1X, mpY + 40); - var x2 = new PipeJoin(mw2X, mpY + 40); + var x1 = new PipeJoin(mw1X, mpY + 8); + var x2 = new PipeJoin(mw2X, mpY + 8); CreateOutlet(MW1, MP1); CreateOutlet(MW2, MP2); CreatePipe(MP1, x1); CreatePipe(MP2, x2); - var v1 = CreateValve(1, mw1X, mpY + 80); - var v2 = CreateValve(2, mw2X, mpY + 80); - var v3 = CreateValve(3, mw2X + 30, mpY + 80); - var v4 = CreateValve(4, mw1X - 30, mpY + 80); + var v1 = CreateValve(1, mw1X, mpY + 16); + var v2 = CreateValve(2, mw2X, mpY + 16); + var v3 = CreateValve(3, mw2X + 6, mpY + 16); + var v4 = CreateValve(4, mw1X - 6, mpY + 16); CreatePipe(x1, v1); CreatePipe(x1, v4); @@ -99,8 +106,8 @@ namespace PamhagenSysCtrl.Helpers { var x3 = new PipeJoin(mw1X, ltg1Y); var x4 = new PipeJoin(x1X, ltg1Y); - var x5 = new PipeJoin(mw1X - 30, ltg2Y); - var x6 = new PipeJoin(x1X - 30, ltg2Y); + var x5 = new PipeJoin(mw1X - 6, ltg2Y); + var x6 = new PipeJoin(x1X - 6, ltg2Y); CreatePipe(v1, x3, true); CreatePipe(v3, x3, true); @@ -109,50 +116,50 @@ namespace PamhagenSysCtrl.Helpers { CreatePipe(v4, x5, true); CreatePipe(x5, x6, true); - var v5 = CreateValve(5, x1X + 30, ltg1Y); - var v6 = CreateValve(6, x1X + 30, ltg2Y + 40); - var v7 = CreateValve(7, x1X + 30, ltg2Y); - var v8 = CreateValve(8, x1X - 30, ltg2Y + 40); - var v9 = CreateValve(9, ltg2X, 500); + var v5 = CreateValve(5, x1X + 6, ltg1Y); + var v6 = CreateValve(6, x1X + 6, ltg2Y + 8); + var v7 = CreateValve(7, x1X + 6, ltg2Y); + var v8 = CreateValve(8, x1X - 6, ltg2Y + 8); + var v9 = CreateValve(9, ltg2X, ltg5Y + 8); CreatePipe(x4, v5); CreatePipe(x4, v6, true); CreatePipe(x6, v7); CreatePipe(x6, v8); - CreatePipe(v7, v9, label: "Ltg. 2", labelOffsetX: 30); + CreatePipe(v7, v9, label: "Ltg. 2", labelOffsetX: 6); - var xv15 = new PipeJoin(ltg1X, wt1Y + 40); - var xv11 = new PipeJoin(ltg2X, wt1Y + 70); - var x7 = new PipeJoin(ltg2X, 460); + var xv15 = new PipeJoin(ltg1X, wt1Y + 8); + var xv11 = new PipeJoin(ltg2X, wt1Y + 14); + var x7 = new PipeJoin(ltg2X, ltg5Y); - CreatePipe(v5, xv15, label: "Ltg. 1", labelOffsetX: 30); + CreatePipe(v5, xv15, label: "Ltg. 1", labelOffsetX: 6); CreatePipe(v9, x7); CreatePipe(x7, xv11); - var v10 = CreateValve(10, ltg2X + 40, 460); - var v11 = CreateValve(11, ltg1X - 30, wt1Y + 70); + var v10 = CreateValve(10, ltg2X + 8, ltg5Y); + var v11 = CreateValve(11, ltg1X - 6, wt1Y + 14); var v12 = CreateValve(12, ltg1X, wt1Y); var v13 = CreateValve(13, ltg2X, wt1Y); - var v14 = CreateValve(14, ltg1X - 30, wt1Y - 40); - var v15 = CreateValve(15, ltg1X - 30, wt1Y + 40); - var v16 = CreateValve(16, ltg1X - 30, wt1Y - 70); + var v14 = CreateValve(14, ltg1X - 6, wt1Y - 8); + var v15 = CreateValve(15, ltg1X - 6, wt1Y + 8); + var v16 = CreateValve(16, ltg1X - 6, wt1Y - 14); CreatePipe(v10, x7); CreatePipe(xv11, v11); CreatePipe(xv15, v15); CreatePipe(xv15, v12); CreatePipe(xv11, v13); - var xv16 = new PipeJoin(ltg1X, wt1Y - 70); - var xv14 = new PipeJoin(ltg2X, wt1Y - 40); + var xv16 = new PipeJoin(ltg1X, wt1Y - 14); + var xv14 = new PipeJoin(ltg2X, wt1Y - 8); CreatePipe(v12, xv16); CreatePipe(v13, xv14); CreatePipe(v16, xv16); CreatePipe(v14, xv14); - var v20 = CreateValve(20, ltg1X - 30, wt2Y - 70); - var v21 = CreateValve(21, ltg1X - 30, wt2Y - 40); - var xv20 = new PipeJoin(ltg1X, wt2Y - 70); - var xv21 = new PipeJoin(ltg2X, wt2Y - 40); + var v20 = CreateValve(20, ltg1X - 6, wt2Y - 14); + var v21 = CreateValve(21, ltg1X - 6, wt2Y - 8); + var xv20 = new PipeJoin(ltg1X, wt2Y - 14); + var xv21 = new PipeJoin(ltg2X, wt2Y - 8); CreatePipe(xv16, xv20); CreatePipe(xv14, xv21); CreatePipe(v20, xv20); @@ -160,15 +167,15 @@ namespace PamhagenSysCtrl.Helpers { var wt1 = new HeatExchanger("WT Most", wtX, wt1Y); var wt2 = new HeatExchanger("WT Warmwasser", wtX, wt2Y); - var v17 = CreateValve(17, wtX + 70, wt1Y); - var v18 = CreateValve(18, wtX + 40, wt1Y + 40); - var v19 = CreateValve(19, wtX + 40, (wt1Y + wt2Y) / 2); - var xwt1 = new PipeJoin(wtX + 120, wt1Y + 40); - var xwt2 = new PipeJoin(wtX + 70, wt1Y + 40); - var xwt3 = new PipeJoin(wtX + 40, wt1Y - 40); - var xwt4 = new PipeJoin(wtX + 120, wt1Y - 40); - var xwt5 = new PipeJoin(wtX + 40, wt2Y + 40); - var xwt6 = new PipeJoin(wtX + 120, wt2Y - 40); + var v17 = CreateValve(17, wtX + 14, wt1Y); + var v18 = CreateValve(18, wtX + 8, wt1Y + 8); + var v19 = CreateValve(19, wtX + 8, (wt1Y + wt2Y) / 2); + var xwt1 = new PipeJoin(wtX + 24, wt1Y + 8); + var xwt2 = new PipeJoin(wtX + 14, wt1Y + 8); + var xwt3 = new PipeJoin(wtX + 8, wt1Y - 8); + var xwt4 = new PipeJoin(wtX + 24, wt1Y - 8); + var xwt5 = new PipeJoin(wtX + 8, wt2Y + 8); + var xwt6 = new PipeJoin(wtX + 24, wt2Y - 8); CreatePipe(v11, xwt1); CreatePipe(v15, xwt1); CreatePipe(xwt1, xwt2); @@ -187,22 +194,22 @@ namespace PamhagenSysCtrl.Helpers { CreatePipe(v19, xwt5); CreatePipe(xwt5, wt2); - var xv22 = new PipeJoin(t1X - 15, ltg7Y); - var xv23 = new PipeJoin(t1X + 15, ltg6Y); - var v22 = CreateValve(22, t1X - 15, tValveY); - var v23 = CreateValve(23, t1X + 15, tValveY); + var xv22 = new PipeJoin(t1X - 3, ltg7Y); + var xv23 = new PipeJoin(t1X + 3, ltg6Y); + var v22 = CreateValve(22, t1X - 3, tValveY); + var v23 = CreateValve(23, t1X + 3, tValveY); Tank1 = CreateTank(1, t1X, tanksY, 35000); - CreatePipe(xv20, xv22, true, label: "Ltg. 7", labelOffsetX: 50); - CreatePipe(xv21, xv23, true, label: "Ltg. 6", labelOffsetX: 20); + CreatePipe(xv20, xv22, true, label: "Ltg. 7", labelOffsetX: 10); + CreatePipe(xv21, xv23, true, label: "Ltg. 6", labelOffsetX: 4); CreatePipe(xv22, v22); CreatePipe(xv23, v23); CreateInlet(v22, Tank1); CreateInlet(v23, Tank1); - var xv24 = new PipeJoin(t2X - 15, ltg7Y); - var xv25 = new PipeJoin(t2X + 15, ltg6Y); - var v24 = CreateValve(24, t2X - 15, tValveY); - var v25 = CreateValve(25, t2X + 15, tValveY); + var xv24 = new PipeJoin(t2X - 3, ltg7Y); + var xv25 = new PipeJoin(t2X + 3, ltg6Y); + var v24 = CreateValve(24, t2X - 3, tValveY); + var v25 = CreateValve(25, t2X + 3, tValveY); Tank2 = CreateTank(2, t2X, tanksY, 35000); CreatePipe(xv22, xv24); CreatePipe(xv23, xv25); @@ -211,10 +218,10 @@ namespace PamhagenSysCtrl.Helpers { CreateInlet(v24, Tank2); CreateInlet(v25, Tank2); - var xv26 = new PipeJoin(t3X - 15, ltg7Y); - var xv27 = new PipeJoin(t3X + 15, ltg6Y); - var v26 = CreateValve(26, t3X - 15, tValveY); - var v27 = CreateValve(27, t3X + 15, tValveY); + var xv26 = new PipeJoin(t3X - 3, ltg7Y); + var xv27 = new PipeJoin(t3X + 3, ltg6Y); + var v26 = CreateValve(26, t3X - 3, tValveY); + var v27 = CreateValve(27, t3X + 3, tValveY); Tank3 = CreateTank(3, t3X, tanksY, 35000); CreatePipe(xv24, xv26); CreatePipe(xv25, xv27); @@ -228,10 +235,10 @@ namespace PamhagenSysCtrl.Helpers { CreatePipe(xv26, v28); CreatePipe(xv27, v29); - var xv30 = new PipeJoin(t4X - 15, ltg7Y); - var xv31 = new PipeJoin(t4X + 15, ltg6Y); - var v30 = CreateValve(30, t4X - 15, tValveY); - var v31 = CreateValve(31, t4X + 15, tValveY); + var xv30 = new PipeJoin(t4X - 3, ltg7Y); + var xv31 = new PipeJoin(t4X + 3, ltg6Y); + var v30 = CreateValve(30, t4X - 3, tValveY); + var v31 = CreateValve(31, t4X + 3, tValveY); Tank4 = CreateTank(4, t4X, tanksY, 35000); CreatePipe(v28, xv30); CreatePipe(v29, xv31); @@ -240,12 +247,12 @@ namespace PamhagenSysCtrl.Helpers { CreateInlet(v30, Tank4); CreateInlet(v31, Tank4); - var xv32 = new PipeJoin(t5X - 15, ltg7Y); - var xv33 = new PipeJoin(t5X + 15, ltg6Y); - var v32 = CreateValve(32, t5X - 15, tValveY); - var v33 = CreateValve(33, t5X + 15, tValveY); + var xv32 = new PipeJoin(t5X - 3, ltg7Y); + var xv33 = new PipeJoin(t5X + 3, ltg6Y); + var v32 = CreateValve(32, t5X - 3, tValveY); + var v33 = CreateValve(33, t5X + 3, tValveY); Tank5 = CreateTank(5, t5X, tanksY, 35000); - CreatePipe(xv30, xv32, label: "Ltg. 7", labelOffsetX: 30); + CreatePipe(xv30, xv32, label: "Ltg. 7", labelOffsetX: 6); CreatePipe(xv31, xv33, label: "Ltg. 6", labelOffsetX: 0); CreatePipe(xv32, v32); CreatePipe(xv33, v33); @@ -257,10 +264,10 @@ namespace PamhagenSysCtrl.Helpers { CreatePipe(xv32, v34); CreatePipe(xv33, v35); - var xv36 = new PipeJoin(t6X + 15, ltg6Y); - var xv37 = new PipeJoin(t6X - 15, ltg7Y); - var v36 = CreateValve(36, t6X + 15, tValveY); - var v37 = CreateValve(37, t6X - 15, tValveY); + var xv36 = new PipeJoin(t6X + 3, ltg6Y); + var xv37 = new PipeJoin(t6X - 3, ltg7Y); + var v36 = CreateValve(36, t6X + 3, tValveY); + var v37 = CreateValve(37, t6X - 3, tValveY); Tank6 = CreateTank(6, t6X, tanksY, 35000); CreatePipe(v34, xv37); CreatePipe(v35, xv36); @@ -269,10 +276,10 @@ namespace PamhagenSysCtrl.Helpers { CreateInlet(v36, Tank6); CreateInlet(v37, Tank6); - var xv38 = new PipeJoin(t7X + 15, ltg6Y); - var xv39 = new PipeJoin(t7X - 15, ltg7Y); - var v38 = CreateValve(38, t7X + 15, tValveY); - var v39 = CreateValve(39, t7X - 15, tValveY); + var xv38 = new PipeJoin(t7X + 3, ltg6Y); + var xv39 = new PipeJoin(t7X - 3, ltg7Y); + var v38 = CreateValve(38, t7X + 3, tValveY); + var v39 = CreateValve(39, t7X - 3, tValveY); Tank7 = CreateTank(7, t7X, tanksY, 35000); CreatePipe(xv37, xv39); CreatePipe(xv36, xv38); @@ -281,47 +288,47 @@ namespace PamhagenSysCtrl.Helpers { CreateInlet(v38, Tank7); CreateInlet(v39, Tank7); - var xv40 = new PipeJoin(t8X + 15, ltg6Y); - var xv41 = new PipeJoin(t8X - 15, ltg7Y); - var v40 = CreateValve(40, t8X + 15, tValveY); - var v41 = CreateValve(41, t8X - 15, tValveY); + var xv40 = new PipeJoin(t8X + 3, ltg6Y); + var xv41 = new PipeJoin(t8X - 3, ltg7Y); + var v40 = CreateValve(40, t8X + 3, tValveY); + var v41 = CreateValve(41, t8X - 3, tValveY); Tank8 = CreateTank(8, t8X, tanksY, 35000); CreatePipe(xv38, xv40, label: "Ltg. 6", labelOffsetX: 0); - CreatePipe(xv39, xv41, label: "Ltg. 7", labelOffsetX: 30); + CreatePipe(xv39, xv41, label: "Ltg. 7", labelOffsetX: 6); CreatePipe(xv40, v40); CreatePipe(xv41, v41); CreateInlet(v40, Tank8); CreateInlet(v41, Tank8); - var v42 = CreateValve(42, t9X + 15, tValveY); - var v43 = CreateValve(43, t9X - 15, tValveY); + var v42 = CreateValve(42, t9X + 3, tValveY); + var v43 = CreateValve(43, t9X - 3, tValveY); Tank9 = CreateTank(9, t9X, tanksY, 35000); CreatePipe(xv40, v42); CreatePipe(xv41, v43); CreateInlet(v42, Tank9); CreateInlet(v43, Tank9); - var xp12 = new PipeJoin((t1X + t2X) / 2, tanksY + 80); - P12 = new Pump("P1/2", (t1X + t2X) / 2, tanksY + 110, () => App.Plant?.P12 ?? default, () => App.Plant?.P12HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); + var xp12 = new PipeJoin((t1X + t2X) / 2, tanksY + 16); + P12 = new Pump("P1/2", (t1X + t2X) / 2, tanksY + 22, () => App.Plant?.P12 ?? default, () => App.Plant?.P12HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); CreateOutlet(Tank1, xp12); CreateOutlet(Tank2, xp12); CreatePipe(xp12, P12); - P3 = new Pump("P3", t3X, tanksY + 110, () => App.Plant?.P3 ?? default, () => App.Plant?.P3HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); - P4 = new Pump("P4", t4X, tanksY + 110, () => App.Plant?.P4 ?? default, () => App.Plant?.P4HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); - P5 = new Pump("P5", t5X, tanksY + 110, () => App.Plant?.P5 ?? default, () => App.Plant?.P5HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); + P3 = new Pump("P3", t3X, tanksY + 22, () => App.Plant?.P3 ?? default, () => App.Plant?.P3HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); + P4 = new Pump("P4", t4X, tanksY + 22, () => App.Plant?.P4 ?? default, () => App.Plant?.P4HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); + P5 = new Pump("P5", t5X, tanksY + 22, () => App.Plant?.P5 ?? default, () => App.Plant?.P5HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); CreateOutlet(Tank3, P3); CreateOutlet(Tank4, P4); CreateOutlet(Tank5, P5); - var v44 = CreateValve(44, (t1X + t2X) / 2, tanksY + 150); - var v45 = CreateValve(45, t3X, tanksY + 150); - var v46 = CreateValve(46, (t3X + t4X) / 2, tanksY + 180); - var v47 = CreateValve(47, t4X, tanksY + 150); - var v48 = CreateValve(48, t5X, tanksY + 150); - var xv44 = new PipeJoin((t1X + t2X) / 2, tanksY + 180); - var xv45 = new PipeJoin(t3X, tanksY + 180); - var xv47 = new PipeJoin(t4X, tanksY + 180); + var v44 = CreateValve(44, (t1X + t2X) / 2, tanksY + 30); + var v45 = CreateValve(45, t3X, tanksY + 30); + var v46 = CreateValve(46, (t3X + t4X) / 2, ltg5Y); + var v47 = CreateValve(47, t4X, tanksY + 30); + var v48 = CreateValve(48, t5X, tanksY + 30); + var xv44 = new PipeJoin((t1X + t2X) / 2, tanksY + 36); + var xv45 = new PipeJoin(t3X, tanksY + 36); + var xv47 = new PipeJoin(t4X, tanksY + 36); CreatePipe(P12, v44); CreatePipe(P3, v45); CreatePipe(P4, v47); @@ -336,10 +343,10 @@ namespace PamhagenSysCtrl.Helpers { CreateTwoWayPipe(v46, xv45); CreateTwoWayPipe(xv45, xv44); - var xt6 = new PipeJoin(t6X, tanksY + 110); - var xt7 = new PipeJoin(t7X, tanksY + 110); - var xt8 = new PipeJoin(t8X, tanksY + 110); - P6 = new Pump("P6", t6X, tanksY + 150, () => App.Plant?.P6 ?? default, () => App.Plant?.P6HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); + var xt6 = new PipeJoin(t6X, tanksY + 22); + var xt7 = new PipeJoin(t7X, tanksY + 22); + var xt8 = new PipeJoin(t8X, tanksY + 22); + P6 = new Pump("P6", t6X, tanksY + 30, () => App.Plant?.P6 ?? default, () => App.Plant?.P6HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x))); CreateOutlet(Tank6, xt6); CreateOutlet(Tank7, xt7); CreateOutlet(Tank8, xt8); @@ -348,33 +355,33 @@ namespace PamhagenSysCtrl.Helpers { CreatePipe(xt7, xt6); CreatePipe(xt6, P6); - var v49 = CreateValve(49, t4X, tanksY + 220); + var v49 = CreateValve(49, t4X, tanksY + 44); CreatePipe(xv47, v49); var prX = (pr1X + pr2X) / 2; - var pr1cX = prX - 15; - var pr2cX = prX + 15; + var pr1cX = prX - 3; + var pr2cX = prX + 3; Press1 = new Press("Presse 1", pr1X, prY, 20000, () => FillState.Unknown); Press2 = new Press("Presse 2", pr2X, prY, 15000, () => FillState.Unknown); - var v50 = CreateValve(50, pr2cX + 30, 580); - var v51 = CreateValve(51, pr1cX - 30, 580); - var v52 = CreateValve(52, pr1cX - 30, 610); - var v53 = CreateValve(53, pr2cX + 30, 610); - var v54 = CreateValve(54, pr2cX + 30, 550); - var v55 = CreateValve(55, pr1cX - 30, 550); - var v56 = CreateValve(56, pr1cX - 30, 640); - var v57 = CreateValve(57, pr2cX + 30, 640); - var xp1 = new PipeJoin(pr1cX - 70, 580); - var xp2 = new PipeJoin(pr1cX - 70, 610); - var xp3 = new PipeJoin(pr2cX + 70, 550); - var xp4 = new PipeJoin(pr2cX + 70, 640); - var xp5 = new PipeJoin(pr1cX, 580); - var xp6 = new PipeJoin(pr1cX, 610); - var xp7 = new PipeJoin(pr2cX, 550); - var xp8 = new PipeJoin(pr2cX, 640); + var v50 = CreateValve(50, pr2cX + 6, ltg3Y); + var v51 = CreateValve(51, pr1cX - 6, ltg3Y); + var v52 = CreateValve(52, pr1cX - 6, ltg4Y); + var v53 = CreateValve(53, pr2cX + 6, ltg4Y); + var v54 = CreateValve(54, pr2cX + 6, ltg8Y); + var v55 = CreateValve(55, pr1cX - 6, ltg8Y); + var v56 = CreateValve(56, pr1cX - 6, ltg9Y); + var v57 = CreateValve(57, pr2cX + 6, ltg9Y); + var xp1 = new PipeJoin(pr1cX - 14, ltg3Y); + var xp2 = new PipeJoin(pr1cX - 14, ltg4Y); + var xp3 = new PipeJoin(pr2cX + 14, ltg8Y); + var xp4 = new PipeJoin(pr2cX + 14, ltg9Y); + var xp5 = new PipeJoin(pr1cX, ltg3Y); + var xp6 = new PipeJoin(pr1cX, ltg4Y); + var xp7 = new PipeJoin(pr2cX, ltg8Y); + var xp8 = new PipeJoin(pr2cX, ltg9Y); - CreatePipe(v6, xp1, true, label: "Ltg. 3", labelOffsetX: 30); - CreatePipe(v8, xp2, true, label: "Ltg. 4", labelOffsetX: 90); + CreatePipe(v6, xp1, true, label: "Ltg. 3", labelOffsetX: 6); + CreatePipe(v8, xp2, true, label: "Ltg. 4", labelOffsetX: 18); CreatePipe(v49, xp3, true, label: "Ltg. 8"); CreatePipe(P6, xp4, true, label: "Ltg. 9"); CreatePipe(xp1, v51, true); @@ -397,8 +404,8 @@ namespace PamhagenSysCtrl.Helpers { CreatePipe(xp5, xp6); CreatePipe(xp7, xp8); - var zv1 = new CenterValve("ZV1", pr1cX, prY - 40, () => App.Plant?.Press1HasClearance ?? false); - var zv2 = new CenterValve("ZV2", pr2cX, prY - 40, () => App.Plant?.Press2HasClearance ?? false); + var zv1 = new CenterValve("ZV1", pr1cX, prY - 8, () => App.Plant?.Press1HasClearance ?? false); + var zv2 = new CenterValve("ZV2", pr2cX, prY - 8, () => App.Plant?.Press2HasClearance ?? false); CreatePipe(xp6, zv1, true); CreatePipe(xp8, zv2, true); CreateInlet(zv1, Press1, true); diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Auger.cs b/PamhagenSysCtrl/Helpers/Pipeline/Auger.cs index 2af7223..6f5f6cb 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Auger.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Auger.cs @@ -14,17 +14,21 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public double Angle { get; set; } public bool IsAnimationActive { + get => !(_storyboard?.GetIsPaused() ?? true); set { - if (value) { - _storyboard?.Resume(); - } else { - _storyboard?.Pause(); + if (_storyboard == null) return; + if (value && _storyboard.GetIsPaused()) { + _storyboard.Resume(); + } else if (!value && !_storyboard.GetIsPaused()) { + _storyboard.Pause(); } } } private Polyline? _polyline; private Storyboard? _storyboard; + private DoubleAnimation? _leftSlide; + private Canvas? _clipCanvas; public Auger(double x, double y, double width, double height, double angle = 0) { CenterX = x; @@ -35,41 +39,45 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { } public void Draw(Canvas canvas) { - var d = Height / 4; - int n = (int)(Width / d / 4) + 2; _polyline = new Polyline() { - Points = [.. Enumerable.Range(0, n).SelectMany(i => new List() { - new(i * 4 * d, Height / 2), new((i * 4 + 1) * d, 0), - new((i * 4 + 2) * d, Height / 2), new((i * 4 + 3) * d, Height) - }), new(n * 4 * d, Height / 2), new(0, Height / 2)], Fill = Brushes.Transparent, Stroke = Brushes.Black, - StrokeThickness = 2, }; _polyline.SetValue(Canvas.LeftProperty, 0.0); - var slideLeft = new DoubleAnimation { + _leftSlide = new DoubleAnimation { From = 0, - To = -d * 4, Duration = new Duration(TimeSpan.FromSeconds(1)), RepeatBehavior = RepeatBehavior.Forever, }; _storyboard = new Storyboard(); - _storyboard.Children.Add(slideLeft); - Storyboard.SetTarget(slideLeft, _polyline); - Storyboard.SetTargetProperty(slideLeft, new PropertyPath(Canvas.LeftProperty)); - var clipCanvas = new Canvas() { - Width = Width, - Height = Height, + _storyboard.Children.Add(_leftSlide); + Storyboard.SetTarget(_leftSlide, _polyline); + Storyboard.SetTargetProperty(_leftSlide, new PropertyPath(Canvas.LeftProperty)); + _clipCanvas = new Canvas() { ClipToBounds = true, - RenderTransform = new RotateTransform(Angle, Width / 2, Height / 2), }; - clipCanvas.SetValue(Canvas.TopProperty, CenterY - Height / 2); - clipCanvas.SetValue(Canvas.LeftProperty, CenterX - Width / 2); - clipCanvas.Children.Add(_polyline); - canvas.Children.Add(clipCanvas); + _clipCanvas.Children.Add(_polyline); + canvas.Children.Add(_clipCanvas); _storyboard.Begin(); _storyboard.Pause(); } + + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + var d = Height / 4 * scale; + int n = (int)(Width * scale / d / 4) + 2; + _polyline?.Points = [.. Enumerable.Range(0, n).SelectMany(i => new List() { + new(i * 4 * d, Height / 2 * scale), new((i * 4 + 1) * d, 0), + new((i * 4 + 2) * d, Height / 2 * scale), new((i * 4 + 3) * d, Height * scale) + }), new(n * 4 * d, Height / 2 * scale), new(0, Height / 2 * scale)]; + _polyline?.StrokeThickness = border; + _leftSlide?.To = -d / 4; + _clipCanvas?.Width = Width * scale; + _clipCanvas?.Height = Height * scale; + _clipCanvas?.RenderTransform = new RotateTransform(Angle, Width / 2 * scale, Height / 2 * scale); + _clipCanvas?.SetValue(Canvas.TopProperty, (CenterY - Height / 2) * scale); + _clipCanvas?.SetValue(Canvas.LeftProperty,( CenterX - Width / 2) * scale); + } } } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/CenterValve.cs b/PamhagenSysCtrl/Helpers/Pipeline/CenterValve.cs index 9f7f360..579ba56 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/CenterValve.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/CenterValve.cs @@ -6,7 +6,7 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class CenterValve : INode { - public const double DIAMETER = 24; + public const double DIAMETER = 4.8; public double CenterX { get; set; } public double CenterY { get; set; } @@ -33,29 +33,30 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public void Draw(Canvas canvas) { _circle = new Ellipse() { - Height = DIAMETER, - Width = DIAMETER, Fill = Brushes.DarkGray, Stroke = Brushes.Black, - StrokeThickness = 2, }; - _circle.SetValue(Canvas.LeftProperty, CenterX - DIAMETER / 2); - _circle.SetValue(Canvas.TopProperty, CenterY - DIAMETER / 2); _text = new() { Text = Label, - FontSize = 10, - Width = DIAMETER, - Height = DIAMETER, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, SnapsToDevicePixels = true, }; - _text.SetValue(Canvas.LeftProperty, CenterX - DIAMETER / 2 + 0.5); - _text.SetValue(Canvas.TopProperty, CenterY - DIAMETER / 2 + 5.5); canvas.Children.Add(_circle); canvas.Children.Add(_text); } + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + Graph.SetCenter(_circle, CenterX, CenterY, DIAMETER, DIAMETER, scale); + _circle?.StrokeThickness = border; + _text?.Width = DIAMETER * scale; + _text?.Height = DIAMETER * scale; + _text?.FontSize = 2 * scale; + _text?.SetValue(Canvas.LeftProperty, (CenterX - DIAMETER / 2 + 0.1) * scale); + _text?.SetValue(Canvas.TopProperty, (CenterY - DIAMETER / 2 + 1.1) * scale); + } + public bool IsInside(double x, double y) { return Math.Sqrt(Math.Pow(CenterX - x, 2) + Math.Pow(CenterY - y, 2)) <= DIAMETER / 2; } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/ConveyorBelt.cs b/PamhagenSysCtrl/Helpers/Pipeline/ConveyorBelt.cs index a52cd9d..5573508 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/ConveyorBelt.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/ConveyorBelt.cs @@ -7,8 +7,8 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class ConveyorBelt : INode { - public const double WIDTH = 30; - public const double HEIGHT = 120; + public const double WIDTH = 6; + public const double HEIGHT = 24; public double CenterX { get; set; } public double CenterY { get; set; } @@ -18,22 +18,23 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public bool IsActive => CallbackActive(); public bool IsAnimationActive { - get => _animationActive; + get => !(_storyboard?.GetIsPaused() ?? true); set { - _animationActive = value; - if (value) { - _storyboard?.Resume(); - } else { - _storyboard?.Pause(); + if (_storyboard == null) return; + if (value && _storyboard.GetIsPaused()) { + _storyboard.Resume(); + } else if (!value && !_storyboard.GetIsPaused()) { + _storyboard.Pause(); } } } protected Func CallbackActive; - private bool _animationActive; - private Shape? _rect; + private Rectangle? _rect; private Polyline? _polyline; + private DoubleAnimation? _slideUp; + private Canvas? _clipCanvas; private Storyboard? _storyboard; public ConveyorBelt(string label, double x, double y, Func cbActive) { @@ -47,52 +48,58 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public void Draw(Canvas canvas) { _rect = new Rectangle() { - Width = WIDTH, - Height = HEIGHT, Stroke = Brushes.Black, - StrokeThickness = 2, Fill = Brushes.WhiteSmoke, StrokeLineJoin = PenLineJoin.Round, }; - _rect.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); - _rect.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 2); - var d = 15; - int n = (int)(HEIGHT / d) + 2; _polyline = new Polyline() { - Points = [.. Enumerable.Range(0, n).SelectMany(i => new List() { - new(-WIDTH, i * d), new(WIDTH, i * d), new(-WIDTH, i * d) - })], Fill = Brushes.Transparent, Stroke = Brushes.Black, StrokeThickness = 2, }; _polyline.SetValue(Canvas.TopProperty, 0.0); - var slideUp = new DoubleAnimation { + _slideUp = new DoubleAnimation { From = 0, - To = -d, Duration = new Duration(TimeSpan.FromSeconds(1)), RepeatBehavior = RepeatBehavior.Forever, }; _storyboard = new Storyboard(); - _storyboard.Children.Add(slideUp); - Storyboard.SetTarget(slideUp, _polyline); - Storyboard.SetTargetProperty(slideUp, new PropertyPath(Canvas.TopProperty)); - var clipCanvas = new Canvas() { - Width = WIDTH - 15, - Height = HEIGHT - 8, + _storyboard.Children.Add(_slideUp); + Storyboard.SetTarget(_slideUp, _polyline); + Storyboard.SetTargetProperty(_slideUp, new PropertyPath(Canvas.TopProperty)); + _clipCanvas = new Canvas() { ClipToBounds = true, }; - clipCanvas.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 2 + 4); - clipCanvas.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2 + 7.5); - clipCanvas.Children.Add(_polyline); + _clipCanvas.Children.Add(_polyline); canvas.Children.Add(_rect); - canvas.Children.Add(clipCanvas); + canvas.Children.Add(_clipCanvas); _storyboard.Begin(); _storyboard.Pause(); + } + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + _rect?.Width = WIDTH * scale; + _rect?.Height = HEIGHT * scale; + _rect?.StrokeThickness = border; + _rect?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); + _rect?.SetValue(Canvas.TopProperty, (CenterY - HEIGHT / 2) * scale); + + var d = 3 * scale; + int n = (int)(HEIGHT * scale / d) + 2; + _polyline?.Points = [.. Enumerable.Range(0, n).SelectMany(i => new List() { + new(-WIDTH * scale, i * d), new(WIDTH * scale, i * d), new(-WIDTH * scale, i * d) + })]; + _polyline?.StrokeThickness = border; + _slideUp?.To = -d; + + _clipCanvas?.Width = (WIDTH - 2.2) * scale - border * 2; + _clipCanvas?.Height = (HEIGHT - 0.8) * scale - border * 2; + _clipCanvas?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2 + 1.1) * scale + border); + _clipCanvas?.SetValue(Canvas.TopProperty, (CenterY - HEIGHT / 2 + 0.4) * scale + border); } public bool IsInside(double x, double y) { diff --git a/PamhagenSysCtrl/Helpers/Pipeline/EncasedAuger.cs b/PamhagenSysCtrl/Helpers/Pipeline/EncasedAuger.cs index 1e78020..f9b8a02 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/EncasedAuger.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/EncasedAuger.cs @@ -6,8 +6,8 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class EncasedAuger : INode { - public const double WIDTH = 80; - public const double HEIGHT = 20; + public const double WIDTH = 16; + public const double HEIGHT = 4; public double CenterX { get; set; } public double CenterY { get; set; } @@ -29,8 +29,9 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { protected Func CallbackActive; private bool _animationActive; - private Shape? _inner; - private Shape? _outer; + private Canvas? _canvas; + private Rectangle? _inner; + private Rectangle? _outer; private Auger? _auger; private TextBlock? _text; @@ -46,41 +47,49 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { } public void Draw(Canvas canvas) { - var c = new Canvas() { - RenderTransform = new RotateTransform(Angle, WIDTH / 2, HEIGHT / 2), + _canvas = new Canvas() { + RenderTransform = new RotateTransform(Angle), }; _outer = new Rectangle() { - Width = WIDTH, - Height = HEIGHT, Fill = Brushes.Black, }; _inner = new Rectangle() { - Width = WIDTH, - Height = HEIGHT - 4, Fill = Brushes.WhiteSmoke, }; - c.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); - c.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 2); - _inner.SetValue(Canvas.TopProperty, 2.0); - c.Children.Add(_outer); - c.Children.Add(_inner); - canvas.Children.Add(c); + + _canvas.Children.Add(_outer); + _canvas.Children.Add(_inner); + canvas.Children.Add(_canvas); _text = new() { Text = Label, - Width = WIDTH, - FontSize = 12, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, }; - _text.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); - _text.SetValue(Canvas.TopProperty, CenterY + HEIGHT / 2); canvas.Children.Add(_text); - _auger = new Auger(CenterX, CenterY, WIDTH, 12, Angle); + _auger = new Auger(CenterX, CenterY, WIDTH, 2.4, Angle); _auger.Draw(canvas); } + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + _canvas?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); + _canvas?.SetValue(Canvas.TopProperty, (CenterY - HEIGHT / 2) * scale); + _canvas?.RenderTransform = new RotateTransform(Angle, WIDTH / 2 * scale, HEIGHT / 2 * scale); + _outer?.Width = WIDTH * scale; + _outer?.Height = HEIGHT * scale; + _inner?.Width = WIDTH * scale; + _inner?.Height = HEIGHT * scale - border * 2; + _inner?.SetValue(Canvas.TopProperty, border); + + _text?.FontSize = 12; + _text?.Width = WIDTH * scale; + _text?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); + _text?.SetValue(Canvas.TopProperty, (CenterY + HEIGHT / 2) * scale); + _auger?.Scale(scale); + } + public bool IsInside(double x, double y) { return Math.Sqrt(Math.Pow(CenterX - x, 2) + Math.Pow(CenterY - y, 2)) <= WIDTH / 2; } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/EntryTrough.cs b/PamhagenSysCtrl/Helpers/Pipeline/EntryTrough.cs index 8c332e5..d45c4af 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/EntryTrough.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/EntryTrough.cs @@ -7,8 +7,8 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { class EntryTrough : INode { - public const double WIDTH = 150; - public const double HEIGHT = 60; + public const double WIDTH = 30; + public const double HEIGHT = 12; public double CenterX { get; set; } public double CenterY { get; set; } @@ -20,9 +20,8 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public bool IsAnimationActive { get => _animationActive; set { - _animationActive = value; _auger?.IsAnimationActive = value; - if (value) { + if (value && !_animationActive) { _doorTransform?.BeginAnimation( RotateTransform.AngleProperty, new DoubleAnimation { @@ -30,7 +29,7 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { To = 60, Duration = TimeSpan.FromSeconds(Math.Abs(_doorTransform.Angle - 60) / 60.0) }); - } else { + } else if (!value && _animationActive) { _doorTransform?.BeginAnimation( RotateTransform.AngleProperty, new DoubleAnimation { @@ -39,17 +38,23 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { Duration = TimeSpan.FromSeconds(Math.Abs(_doorTransform.Angle - 0) / 60.0) }); } + _animationActive = value; } } + public double Top => CenterY - HEIGHT / 2; + public double Right => CenterX + WIDTH / 2; + public double Bottom => CenterY + HEIGHT / 2; + public double Left => CenterX - WIDTH / 2; + protected Func CallbackActive; private bool _animationActive; - private Shape? _inner; - private Shape? _outer; + private Polygon? _inner; + private Polygon? _outer; private TextBlock? _text; private Auger? _auger; - private Shape? _door; + private Line? _door; private RotateTransform? _doorTransform; public EntryTrough(string label, double x, double y, Func cbActive) { @@ -62,42 +67,62 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { } public void Draw(Canvas canvas) { - var top = CenterY - HEIGHT / 2; - var right = CenterX + WIDTH / 2; - var bottom = CenterY + HEIGHT / 2; - var left = CenterX - WIDTH / 2; _outer = new Polygon() { - Points = [new(left, top), new(right, top), new(right - 20, bottom), new(left, bottom), new(left, bottom - 20), new(left + 12.5, bottom - 20)], Fill = Brushes.Black, }; _inner = new Polygon() { - Points = [new(left + 2, top), new(right - 2, top), new(right - 20 - 2, bottom - 2), new(left, bottom - 2), new(left, bottom - 18), new(left + 15.5, bottom - 18)], Fill = Brushes.WhiteSmoke, }; - _doorTransform = new RotateTransform(0, left, bottom - 24); + _doorTransform = new RotateTransform(0); _door = new Line() { - X1 = left, Y1 = bottom - 24, X2 = left, Y2 = bottom + 4, Stroke = Brushes.Black, - StrokeThickness = 4, RenderTransform = _doorTransform, }; _text = new() { Text = Label, - FontSize = 12, - Width = WIDTH, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, }; - _text.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); - _text.SetValue(Canvas.TopProperty, CenterY - 7.5 - 8); canvas.Children.Add(_outer); canvas.Children.Add(_inner); canvas.Children.Add(_text); canvas.Children.Add(_door); - _auger = new(CenterX - 11, CenterY + HEIGHT / 2 - 9, WIDTH - 25, 12); + _auger = new(CenterX - 2.2, CenterY + HEIGHT / 2 - 1.8, WIDTH - 5, 2.4); _auger.Draw(canvas); } + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + _outer?.Points = [ + new(Left * scale, Top * scale), + new(Right * scale, Top * scale), + new((Right - 4) * scale, Bottom * scale), + new(Left * scale, Bottom * scale), + new(Left * scale, (Bottom - 4) * scale), + new((Left + 2.5) * scale, (Bottom - 4) * scale), + ]; + _inner?.Points = [ + new(Left * scale + border, Top * scale), + new(Right * scale - border, Top * scale), + new((Right - 4) * scale - border, Bottom * scale - border), + new(Left * scale, Bottom * scale - border), + new(Left * scale, (Bottom - 3.6) * scale), + new((Left + 3.1) * scale, (Bottom - 3.6) * scale), + ]; + _door?.X1 = Left * scale; + _door?.Y1 = (Bottom - 4.8) * scale; + _door?.X2 = Left * scale; + _door?.Y2 = (Bottom + 0.8) * scale; + _door?.StrokeThickness = border * 2; + _doorTransform?.CenterX = Left * scale; + _doorTransform?.CenterY = (Bottom - 4.8) * scale; + _text?.FontSize = 12; + _text?.Width = WIDTH * scale; + _text?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); + _text?.SetValue(Canvas.TopProperty, (CenterY - 1.5) * scale - 8); + _auger?.Scale(scale); + } + public bool IsInside(double x, double y) { return Math.Abs(x - CenterX) <= WIDTH / 2 && Math.Abs(y - CenterY) <= HEIGHT / 2; } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/FlowArrows.cs b/PamhagenSysCtrl/Helpers/Pipeline/FlowArrows.cs index fe15225..2ad93fb 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/FlowArrows.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/FlowArrows.cs @@ -33,14 +33,6 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { canvas.Children.Add(_layer); } - public static FlowArrows Create(Canvas canvas, Line first, Line second) { - return new FlowArrows(canvas, [ - new Point(first.X1, first.Y1), - new Point(first.X2, first.Y2), - new Point(second.X2, second.Y2), - ]); - } - public static FlowArrows Create(Canvas canvas, Polyline path) { return new FlowArrows(canvas, [.. path.Points]); } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Graph.cs b/PamhagenSysCtrl/Helpers/Pipeline/Graph.cs index b3aa60c..136b275 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Graph.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Graph.cs @@ -1,5 +1,7 @@ +using System.Windows; using System.Windows.Controls; using System.Windows.Media; +using System.Windows.Media.Media3D; using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { @@ -102,22 +104,67 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { } } - public void Draw(Canvas canvas) { - canvas.Children.Add(new Rectangle() { + public void Draw(Canvas canvas, double scale) { + var bg = new Rectangle() { Fill = Brushes.White, - Width = 5000, - Height = 5000, - }); + Width = 8000, + Height = 8000, + }; + SetPos(bg, -4000, -4000, 1); + canvas.Children.Add(bg); foreach (var e in Edges) { e.Draw(canvas); + e.Scale(scale); } foreach (var n in Nodes) { n.Draw(canvas); + n.Scale(scale); } } - public ISet GetHover(double x, double y) { - return Nodes.Where(n => n.IsInside(x, y)).ToHashSet(); + public void Scale(double scale) { + foreach (var e in Edges) { + e.Scale(scale); + } + foreach (var n in Nodes) { + n.Scale(scale); + } + } + + public static double ToPx(double v, double scale) { + return Math.Round(v * scale); + } + + public static Point ToPx(double x, double y, double scale, double dxpx = 0, double dypx = 0, bool round = true) { + var p = new Point(x * scale + dxpx, y * scale + dypx); + return round ? new(Math.Round(p.X), Math.Round(p.Y)) : p; + } + + public static Point ToPx(Point p, double scale) { + return ToPx(p.X, p.Y, scale); + } + + public static double ToBorder(double scale) { + return scale > 10 ? 4 : scale > 7.5 ? 3 : scale > 4 ? 2 : 1; + } + + public static void SetPos(FrameworkElement? s, double x, double y, double scale, double dxpx = 0, double dypx = 0) { + s?.SetValue(Canvas.LeftProperty, ToPx(x, scale) + dxpx); + s?.SetValue(Canvas.TopProperty, ToPx(y, scale) + dypx); + } + + public static void SetWH(Shape? s, double w, double h, double scale) { + s?.Width = ToPx(w, scale); + s?.Height = ToPx(h, scale); + } + + public static void SetCenter(Shape? s, double cx, double cy, double w, double h, double scale) { + Graph.SetWH(s, w, h, scale); + Graph.SetPos(s, cx - w / 2, cy - h / 2, scale); + } + + public ISet GetHover(double x, double y, double scale) { + return Nodes.Where(n => n.IsInside(x / scale, y / scale)).ToHashSet(); } public void Update(ISet hovering, bool isPressed) { diff --git a/PamhagenSysCtrl/Helpers/Pipeline/HeatExchanger.cs b/PamhagenSysCtrl/Helpers/Pipeline/HeatExchanger.cs index fd210fe..1494a13 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/HeatExchanger.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/HeatExchanger.cs @@ -6,8 +6,8 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class HeatExchanger : INode { - public const double WIDTH = 30; - public const double HEIGHT = 120; + public const double WIDTH = 6; + public const double HEIGHT = 24; public double CenterX { get; set; } public double CenterY { get; set; } @@ -28,29 +28,30 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public void Draw(Canvas canvas) { _rect = new Rectangle() { - Width = WIDTH, - Height = HEIGHT, Stroke = Brushes.Black, - StrokeThickness = 2, Fill = Brushes.WhiteSmoke, }; _text = new() { Text = Label, - FontSize = 12, - Width = HEIGHT, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, RenderTransform = new RotateTransform(270), SnapsToDevicePixels = true, }; - _rect.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); - _rect.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 2); - _text.SetValue(Canvas.LeftProperty, CenterX - 9); - _text.SetValue(Canvas.TopProperty, CenterY + HEIGHT / 2); canvas.Children.Add(_rect); canvas.Children.Add(_text); } + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + Graph.SetWH(_rect, WIDTH, HEIGHT, scale); + Graph.SetPos(_rect, CenterX - WIDTH / 2, CenterY - HEIGHT / 2, scale); + _rect?.StrokeThickness = border; + _text?.FontSize = 12; + _text?.Width = Math.Round(HEIGHT * scale); + Graph.SetPos(_text, CenterX, CenterY + HEIGHT / 2, scale, dxpx: -9); + } + public bool IsInside(double x, double y) { return Math.Abs(x - CenterX) <= WIDTH / 2 && Math.Abs(y - CenterY) <= HEIGHT / 2; } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/IEdge.cs b/PamhagenSysCtrl/Helpers/Pipeline/IEdge.cs index 2bdf37d..000b7b1 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/IEdge.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/IEdge.cs @@ -14,6 +14,7 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public double FlowLength { get; } public void Draw(Canvas canvas); + public void Scale(double scale); public void Update(); } } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/INode.cs b/PamhagenSysCtrl/Helpers/Pipeline/INode.cs index db8861c..12fe6ab 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/INode.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/INode.cs @@ -10,8 +10,8 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public ISet Outputs { get; } public void Draw(Canvas canvas); + public void Scale(double scale); public void Update(bool isHovering, bool isPressed); public bool IsInside(double x, double y); - } } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Inlet.cs b/PamhagenSysCtrl/Helpers/Pipeline/Inlet.cs index bfadb42..b1c9b41 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Inlet.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Inlet.cs @@ -15,10 +15,15 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public (bool TowardEnd, double PathOffset)? Flow { get; set; } public double FlowLength => _flowArrows?.Length ?? 0; - private Line? _outer1; - private Line? _outer2; - private Line? _inner1; - private Line? _inner2; + public double X1 => Start.CenterX; + public double Y1 => Start.CenterY; + public double X2 => Start.CenterX; + public double Y2 => Orientation ? Sink.CenterY - 2 : Sink.TopY - 2; + public double X3 => Orientation ? Sink.CenterX : Start.CenterX + (Start.CenterX == End.CenterX ? 0 : Start.CenterX > End.CenterX ? -4 : 4); + public double Y3 => Orientation ? Sink.CenterY - 2 : Sink.TopY + 4; + + private Polyline? _outer; + private Polyline? _inner; private FlowArrows? _flowArrows; public Inlet(INode start, ISink end, bool orientation = false) { @@ -28,62 +33,33 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { } public void Draw(Canvas canvas) { - var x1 = Start.CenterX; - var y1 = Start.CenterY; - var x2 = Start.CenterX; - var y2 = Orientation ? Sink.CenterY - 10 : Sink.TopY - 10; - var x3 = Orientation ? Sink.CenterX : Start.CenterX + (Start.CenterX == End.CenterX ? 0 : Start.CenterX > End.CenterX ? -20 : 20); - var y3 = Orientation ? Sink.CenterY - 10 : Sink.TopY + 20; - _outer1 = new Line() { - X1 = x1, - Y1 = y1, - X2 = x2, - Y2 = y2, - StrokeThickness = 10, - Stroke = Brushes.Black, - StrokeStartLineCap = PenLineCap.Round, - StrokeEndLineCap = PenLineCap.Round, - }; - _inner1 = new Line() { - X1 = x1, - Y1 = y1, - X2 = x2, - Y2 = y2, - StrokeThickness = 6, - Stroke = Brushes.DarkGray, - StrokeStartLineCap = PenLineCap.Round, - StrokeEndLineCap = PenLineCap.Round, - }; - _outer2 = new Line() { - X1 = x2, - Y1 = y2, - X2 = x3, - Y2 = y3, - StrokeThickness = 10, + _outer = new Polyline() { Stroke = Brushes.Black, StrokeStartLineCap = PenLineCap.Round, + StrokeLineJoin = PenLineJoin.Round, StrokeEndLineCap = PenLineCap.Flat, }; - _inner2 = new Line() { - X1 = x2, - Y1 = y2, - X2 = x3, - Y2 = y3, - StrokeThickness = 6, + _inner = new Polyline() { Stroke = Brushes.DarkGray, StrokeStartLineCap = PenLineCap.Round, + StrokeLineJoin = PenLineJoin.Round, StrokeEndLineCap = PenLineCap.Flat, }; - canvas.Children.Add(_outer1); - canvas.Children.Add(_outer2); - canvas.Children.Add(_inner1); - canvas.Children.Add(_inner2); - _flowArrows = FlowArrows.Create(canvas, _inner1!, _inner2!); + canvas.Children.Add(_outer); + canvas.Children.Add(_inner); + _flowArrows = FlowArrows.Create(canvas, _inner); + } + + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + _outer?.Points = [Graph.ToPx(X1, Y1, scale), Graph.ToPx(X2, Y2, scale), Graph.ToPx(X3, Y3, scale)]; + _inner?.Points = [Graph.ToPx(X1, Y1, scale), Graph.ToPx(X2, Y2, scale), Graph.ToPx(X3, Y3, scale)]; + _inner?.StrokeThickness = Math.Round(1.2 * scale / 2) * 2; + _outer?.StrokeThickness = Math.Round(1.2 * scale / 2) * 2 + border * 2; } public void Update() { - _inner1?.Stroke = Highlight ?? Brushes.DarkGray; - _inner2?.Stroke = Highlight ?? Brushes.DarkGray; + _inner?.Stroke = Highlight ?? Brushes.DarkGray; _flowArrows?.Update(Flow); } } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Outlet.cs b/PamhagenSysCtrl/Helpers/Pipeline/Outlet.cs index 24d2817..a29e3d6 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Outlet.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Outlet.cs @@ -5,7 +5,7 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class Outlet : IEdge { - public const double POINT = 16; + public const double POINT = 3.2; public INode Start => Source; public INode End { get; set; } @@ -17,12 +17,17 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public (bool TowardEnd, double PathOffset)? Flow { get; set; } public double FlowLength => _flowArrows?.Length ?? 0; + public double X1 => Start.CenterX; + public double Y1 => Source.BottomY; + public double X2 => Orientation ? Start.CenterX : End.CenterX; + public double Y2 => Orientation ? End.CenterY : Start.CenterY; + public double X3 => End.CenterX; + public double Y3 => End.CenterY; + private Polygon? _hopper; private FlowArrows? _flowArrows; - private Line? _outer1; - private Line? _outer2; - private Line? _inner1; - private Line? _inner2; + private Polyline? _outer; + private Polyline? _inner; public Outlet(ISource start, INode end) { Source = start; @@ -31,69 +36,40 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { } public void Draw(Canvas canvas) { - var x1 = Start.CenterX ; - var y1 = Source.BottomY; - var x2 = Orientation ? Start.CenterX : End.CenterX; - var y2 = Orientation ? End.CenterY : Start.CenterY; - var x3 = End.CenterX; - var y3 = End.CenterY; _hopper = new Polygon() { - Points = [new(x1 - POINT, y1 - 2), new(x1 + POINT, y1 - 2), new(x1, y1 + POINT)], Fill = Brushes.DarkGray, Stroke = Brushes.Black, - StrokeThickness = 2, }; - _outer1 = new Line() { - X1 = x1, - Y1 = y1, - X2 = x2, - Y2 = y2, - StrokeThickness = 10, + _outer = new Polyline() { Stroke = Brushes.Black, StrokeStartLineCap = PenLineCap.Round, + StrokeLineJoin = PenLineJoin.Round, StrokeEndLineCap = PenLineCap.Round, }; - _inner1 = new Line() { - X1 = x1, - Y1 = y1, - X2 = x2, - Y2 = y2, - StrokeThickness = 6, + _inner = new Polyline() { Stroke = Brushes.DarkGray, StrokeStartLineCap = PenLineCap.Round, + StrokeLineJoin = PenLineJoin.Round, StrokeEndLineCap = PenLineCap.Round, }; - _outer2 = new Line() { - X1 = x2, - Y1 = y2, - X2 = x3, - Y2 = y3, - StrokeThickness = 10, - Stroke = Brushes.Black, - StrokeStartLineCap = PenLineCap.Round, - StrokeEndLineCap = PenLineCap.Round, - }; - _inner2 = new Line() { - X1 = x2, - Y1 = y2, - X2 = x3, - Y2 = y3, - StrokeThickness = 6, - Stroke = Brushes.DarkGray, - StrokeStartLineCap = PenLineCap.Round, - StrokeEndLineCap = PenLineCap.Round, - }; - canvas.Children.Add(_outer1); - canvas.Children.Add(_outer2); + canvas.Children.Add(_outer); canvas.Children.Add(_hopper); - canvas.Children.Add(_inner1); - canvas.Children.Add(_inner2); - _flowArrows = FlowArrows.Create(canvas, _inner1!, _inner2!); + canvas.Children.Add(_inner); + _flowArrows = FlowArrows.Create(canvas, _inner); + } + + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + _hopper?.Points = [Graph.ToPx(X1 - POINT, Y1, scale, dypx: -border * 2), Graph.ToPx(X1 + POINT, Y1, scale, dypx: -border * 2), Graph.ToPx(X1, Y1 + POINT, scale)]; + _hopper?.StrokeThickness = border; + _outer?.Points = [Graph.ToPx(X1, Y1, scale), Graph.ToPx(X2, Y2, scale), Graph.ToPx(X3, Y3, scale)]; + _inner?.Points = [Graph.ToPx(X1, Y1, scale), Graph.ToPx(X2, Y2, scale), Graph.ToPx(X3, Y3, scale)]; + _inner?.StrokeThickness = Math.Round(1.2 * scale / 2) * 2; + _outer?.StrokeThickness = Math.Round(1.2 * scale / 2) * 2 + border * 2; } public void Update() { - _inner1?.Stroke = Highlight ?? Brushes.DarkGray; - _inner2?.Stroke = Highlight ?? Brushes.DarkGray; + _inner?.Stroke = Highlight ?? Brushes.DarkGray; _hopper?.Fill = Highlight ?? Brushes.DarkGray; _flowArrows?.Update(Flow); } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Pipe.cs b/PamhagenSysCtrl/Helpers/Pipeline/Pipe.cs index 24bdcb6..982f689 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Pipe.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Pipe.cs @@ -15,6 +15,13 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public (bool TowardEnd, double PathOffset)? Flow { get; set; } public double FlowLength => _flowArrows?.Length ?? 0; + public double X1 => Start.CenterX; + public double Y1 => Start.CenterY; + public double X2 => Orientation ? Start.CenterX : End.CenterX; + public double Y2 => Orientation ? End.CenterY : Start.CenterY; + public double X3 => End.CenterX; + public double Y3 => End.CenterY; + private Polyline? _outer; private Polyline? _inner; private TextBlock? _text; @@ -31,23 +38,13 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { } public void Draw(Canvas canvas) { - var x1 = Start.CenterX; - var y1 = Start.CenterY; - var x2 = Orientation ? Start.CenterX : End.CenterX; - var y2 = Orientation ? End.CenterY : Start.CenterY; - var x3 = End.CenterX; - var y3 = End.CenterY; _outer = new Polyline() { - Points = [new(x1, y1), new(x2, y2), new(x3, y3)], - StrokeThickness = 10, Stroke = Brushes.Black, StrokeStartLineCap = PenLineCap.Round, StrokeEndLineCap = PenLineCap.Round, StrokeLineJoin = PenLineJoin.Round, }; _inner = new Polyline() { - Points = [new(x1, y1), new(x2, y2), new(x3, y3)], - StrokeThickness = 6, Stroke = Brushes.DarkGray, StrokeStartLineCap = PenLineCap.Round, StrokeEndLineCap = PenLineCap.Round, @@ -58,20 +55,28 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { if (Label != null) { _text = new() { Text = Label, - FontSize = 12, - Width = 50, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Bottom, HorizontalAlignment = HorizontalAlignment.Center, SnapsToDevicePixels = true, }; - _text.SetValue(Canvas.LeftProperty, _textOffsetX != null ? (Orientation ? x2 : x1) + _textOffsetX : (Orientation ? (x2 + x3) / 2 : (x1 + x2) / 2) - 25); - _text.SetValue(Canvas.TopProperty, y2 - 22); canvas.Children.Add(_text); } _flowArrows = FlowArrows.Create(canvas, _inner); } + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + _outer?.Points = [Graph.ToPx(X1, Y1, scale), Graph.ToPx(X2, Y2, scale), Graph.ToPx(X3, Y3, scale)]; + _inner?.Points = [Graph.ToPx(X1, Y1, scale), Graph.ToPx(X2, Y2, scale), Graph.ToPx(X3, Y3, scale)]; + _inner?.StrokeThickness = Math.Round(1.2 * scale / 2) * 2; + _outer?.StrokeThickness = Math.Round(1.2 * scale / 2) * 2 + border * 2; + _text?.FontSize = 12; + _text?.Width = 10 * scale; + _text?.SetValue(Canvas.LeftProperty, (_textOffsetX != null ? (Orientation ? X2 : X1) + _textOffsetX : (Orientation ? (X2 + X3) / 2 : (X1 + X2) / 2) - 5) * scale); + _text?.SetValue(Canvas.TopProperty, Y2 * scale - 22); + } + public void Update() { _inner?.Stroke = Highlight ?? Brushes.DarkGray; _flowArrows?.Update(Flow); diff --git a/PamhagenSysCtrl/Helpers/Pipeline/PipeJoin.cs b/PamhagenSysCtrl/Helpers/Pipeline/PipeJoin.cs index b6dc1eb..0ad6998 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/PipeJoin.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/PipeJoin.cs @@ -6,8 +6,8 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class PipeJoin : INode { - public const double SIZE = 18; - public const double POINT = 4; + public const double SIZE = 3.6; + public const double POINT = 0.8; public double CenterX { get; set; } public double CenterY { get; set; } @@ -16,7 +16,7 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public ISet Inputs { get; init; } public ISet Outputs { get; init; } - private Shape? _rect; + private Polygon? _rect; public PipeJoin(double x, double y) { CenterX = x; @@ -26,14 +26,22 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { } public void Draw(Canvas canvas) { - var it = Inputs.Any(e => (e.Start.CenterY < CenterY && (!e.Orientation || e.Start.CenterX == CenterX)) || (e.IsTwoWay && e.End.CenterY < CenterY && (!e.Orientation || e.End.CenterX == CenterX))); - var ot = Outputs.Any(e => (e.End.CenterY < CenterY && ( e.Orientation || e.End.CenterX == CenterX)) || (e.IsTwoWay && e.Start.CenterY < CenterY && ( e.Orientation || e.Start.CenterX == CenterX))); - var ir = Inputs.Any(e => (e.Start.CenterX > CenterX && ( e.Orientation || e.Start.CenterY == CenterY)) || (e.IsTwoWay && e.End.CenterX > CenterX && ( e.Orientation || e.End.CenterY == CenterY))); - var or = Outputs.Any(e => (e.End.CenterX > CenterX && (!e.Orientation || e.End.CenterY == CenterY)) || (e.IsTwoWay && e.Start.CenterX > CenterX && (!e.Orientation || e.Start.CenterY == CenterY))); - var ib = Inputs.Any(e => (e.Start.CenterY > CenterY && (!e.Orientation || e.Start.CenterX == CenterX)) || (e.IsTwoWay && e.End.CenterY > CenterY && (!e.Orientation || e.End.CenterX == CenterX))); - var ob = Outputs.Any(e => (e.End.CenterY > CenterY && ( e.Orientation || e.End.CenterX == CenterX)) || (e.IsTwoWay && e.Start.CenterY > CenterY && ( e.Orientation || e.Start.CenterX == CenterX))); - var il = Inputs.Any(e => (e.Start.CenterX < CenterX && ( e.Orientation || e.Start.CenterY == CenterY)) || (e.IsTwoWay && e.End.CenterX < CenterX && ( e.Orientation || e.End.CenterY == CenterY))); - var ol = Outputs.Any(e => (e.End.CenterX < CenterX && (!e.Orientation || e.End.CenterY == CenterY)) || (e.IsTwoWay && e.Start.CenterX < CenterX && (!e.Orientation || e.Start.CenterY == CenterY))); + _rect = new Polygon() { + Fill = Brushes.Black, + Stroke = Brushes.Black, + }; + canvas.Children.Add(_rect); + } + + public void Scale(double scale) { + var it = Inputs.Any(e => (e.Start.CenterY < CenterY && (!e.Orientation || e.Start.CenterX == CenterX)) || (e.IsTwoWay && e.End.CenterY < CenterY && (!e.Orientation || e.End.CenterX == CenterX))); + var ot = Outputs.Any(e => (e.End.CenterY < CenterY && (e.Orientation || e.End.CenterX == CenterX)) || (e.IsTwoWay && e.Start.CenterY < CenterY && (e.Orientation || e.Start.CenterX == CenterX))); + var ir = Inputs.Any(e => (e.Start.CenterX > CenterX && (e.Orientation || e.Start.CenterY == CenterY)) || (e.IsTwoWay && e.End.CenterX > CenterX && (e.Orientation || e.End.CenterY == CenterY))); + var or = Outputs.Any(e => (e.End.CenterX > CenterX && (!e.Orientation || e.End.CenterY == CenterY)) || (e.IsTwoWay && e.Start.CenterX > CenterX && (!e.Orientation || e.Start.CenterY == CenterY))); + var ib = Inputs.Any(e => (e.Start.CenterY > CenterY && (!e.Orientation || e.Start.CenterX == CenterX)) || (e.IsTwoWay && e.End.CenterY > CenterY && (!e.Orientation || e.End.CenterX == CenterX))); + var ob = Outputs.Any(e => (e.End.CenterY > CenterY && (e.Orientation || e.End.CenterX == CenterX)) || (e.IsTwoWay && e.Start.CenterY > CenterY && (e.Orientation || e.Start.CenterX == CenterX))); + var il = Inputs.Any(e => (e.Start.CenterX < CenterX && (e.Orientation || e.Start.CenterY == CenterY)) || (e.IsTwoWay && e.End.CenterX < CenterX && (e.Orientation || e.End.CenterY == CenterY))); + var ol = Outputs.Any(e => (e.End.CenterX < CenterX && (!e.Orientation || e.End.CenterY == CenterY)) || (e.IsTwoWay && e.Start.CenterX < CenterX && (!e.Orientation || e.Start.CenterY == CenterY))); var points = new List { new(0, 0) @@ -70,15 +78,10 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { points.AddRange([new(0, SIZE / 2 + POINT), new(POINT, SIZE / 2), new(0, SIZE / 2 - POINT)]); } - _rect = new Polygon() { - Points = [..points], - Fill = Brushes.Black, - Stroke = Brushes.Black, - StrokeThickness = 2, - }; - _rect.SetValue(Canvas.LeftProperty, CenterX - SIZE / 2); - _rect.SetValue(Canvas.TopProperty, CenterY - SIZE / 2); - canvas.Children.Add(_rect); + _rect?.Points = [.. points.Select(p => new Point(p.X * scale, p.Y * scale))]; + _rect?.StrokeThickness = 2; + _rect?.SetValue(Canvas.LeftProperty, (CenterX - SIZE / 2) * scale); + _rect?.SetValue(Canvas.TopProperty, (CenterY - SIZE / 2) * scale); } public bool IsInside(double x, double y) { diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Press.cs b/PamhagenSysCtrl/Helpers/Pipeline/Press.cs index 25c8096..106206d 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Press.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Press.cs @@ -1,13 +1,12 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Media; -using System.Windows.Media.Media3D; using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class Press : INode, ISink { - public const double DIAMETER = 120; + public const double DIAMETER = 24; public double CenterX { get; set; } public double CenterY { get; set; } @@ -24,8 +23,8 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { protected Func CallbackFillState; - private Shape? _frame; - private Shape? _circle; + private Polygon? _frame; + private Ellipse? _circle; private TextBlock? _text; public Press(string label, double x, double y, int capacityLiters, Func cbFillState) { @@ -40,39 +39,40 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public void Draw(Canvas canvas) { _circle = new Ellipse() { - Width = DIAMETER, - Height = DIAMETER, Stroke = Brushes.Black, - StrokeThickness = 2, Fill = Brushes.WhiteSmoke, }; _frame = new Polygon() { - Points = [ - new(CenterX - DIAMETER / 2 - 10, CenterY), new(CenterX + DIAMETER / 2 + 10, CenterY), - new(CenterX + DIAMETER / 2 + 10, CenterY + DIAMETER / 2 + 30), new(CenterX + DIAMETER / 2 - 20, CenterY + DIAMETER / 2 + 30), - new(CenterX + DIAMETER / 2 - 20, CenterY + DIAMETER / 2 + 10), new(CenterX - DIAMETER / 2 + 20, CenterY + DIAMETER / 2 + 10), - new(CenterX - DIAMETER / 2 + 20, CenterY + DIAMETER / 2 + 30), new(CenterX - DIAMETER / 2 - 10, CenterY + DIAMETER / 2 + 30) - ], Stroke = Brushes.Black, - StrokeThickness = 2, Fill = Brushes.WhiteSmoke, }; _text = new() { Text = CapacityLiters.HasValue ? $"{Label}\n{CapacityLiters:N0}" : Label, - FontSize = 14, - Width = DIAMETER, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, }; - _circle.SetValue(Canvas.LeftProperty, CenterX - DIAMETER / 2); - _circle.SetValue(Canvas.TopProperty, CenterY - DIAMETER / 2); - _text.SetValue(Canvas.LeftProperty, CenterX - DIAMETER / 2); - _text.SetValue(Canvas.TopProperty, CenterY - (CapacityLiters.HasValue ? 20 : 10)); canvas.Children.Add(_frame); canvas.Children.Add(_circle); canvas.Children.Add(_text); } + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + _circle?.StrokeThickness = border; + Graph.SetCenter(_circle, CenterX, CenterY, DIAMETER, DIAMETER, scale); + _frame?.Points = [ + Graph.ToPx(CenterX - DIAMETER / 2 - 2, CenterY, scale), Graph.ToPx(CenterX + DIAMETER / 2 + 2, CenterY, scale), + Graph.ToPx(CenterX + DIAMETER / 2 + 2, CenterY + DIAMETER / 2 + 6, scale), Graph.ToPx(CenterX + DIAMETER / 2 - 4, CenterY + DIAMETER / 2 + 6, scale), + Graph.ToPx(CenterX + DIAMETER / 2 - 4, CenterY + DIAMETER / 2 + 2, scale), Graph.ToPx(CenterX - DIAMETER / 2 + 4, CenterY + DIAMETER / 2 + 2, scale), + Graph.ToPx(CenterX - DIAMETER / 2 + 4, CenterY + DIAMETER / 2 + 6, scale), Graph.ToPx(CenterX - DIAMETER / 2 - 2, CenterY + DIAMETER / 2 + 6, scale), + ]; + _frame?.StrokeThickness = border; + _text?.FontSize = 14; + _text?.Width = DIAMETER * scale; + _text?.SetValue(Canvas.LeftProperty, (CenterX - DIAMETER / 2) * scale); + _text?.SetValue(Canvas.TopProperty, (CenterY * scale) - (CapacityLiters.HasValue ? 20 : 10)); + } + public bool IsInside(double x, double y) { return Math.Sqrt(Math.Pow(CenterX - x, 2) + Math.Pow(CenterY - y, 2)) <= DIAMETER / 2 || (Math.Abs(x - CenterX) <= DIAMETER / 2 + 10 && y >= CenterY && y <= CenterY + DIAMETER / 2 + 30); } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Pump.cs b/PamhagenSysCtrl/Helpers/Pipeline/Pump.cs index 28316df..ffbc96a 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Pump.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Pump.cs @@ -6,7 +6,7 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class Pump : INode { - public const double DIAMETER = 24; + public const double DIAMETER = 4.8; public double CenterX { get; set; } public double CenterY { get; set; } @@ -25,8 +25,8 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { protected Func CallbackClearance; protected Func CallbackSelected; - private Shape? _circle; - private Shape? _triangle; + private Ellipse? _circle; + private Polygon? _triangle; private TextBlock? _text; public Pump(string label, double x, double y, Func cbState, Func cbClearance, Func cbSelected) { @@ -42,35 +42,43 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public void Draw(Canvas canvas) { _circle = new Ellipse() { - Height = DIAMETER, - Width = DIAMETER, Fill = Brushes.WhiteSmoke, Stroke = Brushes.Black, - StrokeThickness = 2, }; - var dx = Math.Cos(Math.PI / 6) * (DIAMETER / 2 - 2); - var dy = Math.Sin(Math.PI / 6) * (DIAMETER / 2 - 2); _triangle = new Polygon() { - Points = [new(CenterX - dx, CenterY - dy), new(CenterX + dx, CenterY - dy), new(CenterX, CenterY + DIAMETER / 2 - 2)], Fill = Brushes.Transparent, Stroke = Brushes.Black, - StrokeThickness = 2, }; _text = new() { Text = Label, - FontSize = 14, TextAlignment = TextAlignment.Left, VerticalAlignment = VerticalAlignment.Center, }; - _circle.SetValue(Canvas.LeftProperty, CenterX - DIAMETER / 2); - _circle.SetValue(Canvas.TopProperty, CenterY - DIAMETER / 2); - _text.SetValue(Canvas.LeftProperty, CenterX + DIAMETER / 2 + 2); - _text.SetValue(Canvas.TopProperty, CenterY - 10); canvas.Children.Add(_circle); canvas.Children.Add(_triangle); canvas.Children.Add(_text); } + public void Scale(double scale) { + var border = Graph.ToBorder(scale);; + _circle?.Width = DIAMETER * scale; + _circle?.Height = DIAMETER * scale; + _circle?.StrokeThickness = border; + _circle?.SetValue(Canvas.LeftProperty, (CenterX - DIAMETER / 2) * scale); + _circle?.SetValue(Canvas.TopProperty, (CenterY - DIAMETER / 2) * scale); + var dx = Math.Cos(Math.PI / 6) * (DIAMETER / 2); + var dy = Math.Sin(Math.PI / 6) * (DIAMETER / 2); + _triangle?.Points = [ + Graph.ToPx(CenterX - dx, CenterY - dy, scale, dxpx: border, dypx: border / 2, round: false), + Graph.ToPx(CenterX + dx, CenterY - dy, scale, dxpx: -border, dypx: border / 2, round: false), + Graph.ToPx(CenterX, CenterY + DIAMETER / 2, scale, dypx: -border, round: false), + ]; + _triangle?.StrokeThickness = border; + _text?.FontSize = 14; + _text?.SetValue(Canvas.LeftProperty, (CenterX + DIAMETER / 2) * scale + 2); + _text?.SetValue(Canvas.TopProperty, CenterY * scale - 10); + } + public bool IsInside(double x, double y) { return Math.Sqrt(Math.Pow(CenterX - x, 2) + Math.Pow(CenterY - y, 2)) <= DIAMETER / 2; } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Rebler.cs b/PamhagenSysCtrl/Helpers/Pipeline/Rebler.cs index 26d14c7..8a69e47 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Rebler.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Rebler.cs @@ -6,8 +6,8 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class Rebler : INode { - public const double WIDTH = 120; - public const double HEIGHT = 60; + public const double WIDTH = 24; + public const double HEIGHT = 12; public double CenterX { get; set; } public double CenterY { get; set; } @@ -20,11 +20,11 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { protected Func CallbackActive; private TextBlock? _text; - private Shape? _rect; - private Shape? _hopperOuter; - private Shape? _hopperInner; - private Shape? _bottomInner; - private Shape? _bottomOuter; + private Rectangle? _rect; + private Polygon? _hopperOuter; + private Polygon? _hopperInner; + private Polygon? _bottomInner; + private Polygon? _bottomOuter; public Rebler(string label, double x, double y, Func cbActive) { CenterX = x; @@ -37,54 +37,58 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public void Draw(Canvas canvas) { _rect = new Rectangle() { - Width = WIDTH, - Height = HEIGHT, Fill = Brushes.WhiteSmoke, Stroke = Brushes.Black, StrokeThickness = 2, }; - var left = CenterX - WIDTH / 2; - var right = CenterX + WIDTH / 2; - var top = CenterY - HEIGHT / 2; - var bottom = CenterY + HEIGHT / 2; - var hx = right - 20; - var h = 15; - var w = 25; _hopperOuter = new Polygon() { - Points = [new(hx - w, top - h), new(hx - w + 5, top + 2), new(hx + w - 5, top + 2), new(hx + w, top - h)], Fill = Brushes.Black, }; _hopperInner = new Polygon() { - Points = [new(hx - w + 2, top - h), new(hx - w + 5 + 2, top + 2), new(hx + w - 5 - 2, top + 2), new(hx + w - 2, top - h)], Fill = Brushes.WhiteSmoke, }; _bottomOuter = new Polygon() { - Points = [new(left + 20, bottom), new(right - 20, bottom), new(right - 15, bottom + 10), new(left + 15, bottom + 10)], Fill = Brushes.Black, }; _bottomInner = new Polygon() { - Points = [new(left + 20 + 2, bottom), new(right - 20 - 2, bottom), new(right - 15 - 2, bottom + 10), new(left + 15 + 2, bottom + 10)], Fill = Brushes.WhiteSmoke, }; _text = new() { Text = Label, - FontSize = 12, - Width = WIDTH, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, }; - _rect.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); - _rect.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 2); - _text.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); - _text.SetValue(Canvas.TopProperty, CenterY - 8); canvas.Children.Add(_hopperOuter); canvas.Children.Add(_bottomOuter); + canvas.Children.Add(_bottomInner); canvas.Children.Add(_rect); canvas.Children.Add(_hopperInner); - canvas.Children.Add(_bottomInner); canvas.Children.Add(_text); } + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + Graph.SetCenter(_rect, CenterX, CenterY, WIDTH, HEIGHT, scale); + _rect?.StrokeThickness = border; + + var left = CenterX - WIDTH / 2; + var right = CenterX + WIDTH / 2; + var top = CenterY - HEIGHT / 2; + var bottom = CenterY + HEIGHT / 2; + var hx = right - 4; + var h = 3; + var w = 5; + _hopperOuter?.Points = [Graph.ToPx(hx - w, top - h, scale), Graph.ToPx(hx - w + 1, top, scale, dypx: border), Graph.ToPx(hx + w - 1, top, scale, dypx: border), Graph.ToPx(hx + w, top - h, scale)]; + _hopperInner?.Points = [Graph.ToPx(hx - w, top - h, scale, dxpx: border), Graph.ToPx(hx - w + 1, top, scale, dxpx: border, dypx: border), Graph.ToPx(hx + w - 1, top, scale, dxpx: -border, dypx: border), Graph.ToPx(hx + w, top - h, scale, dxpx: -border)]; + _bottomOuter?.Points = [Graph.ToPx(left + 4, bottom, scale), Graph.ToPx(right - 4, bottom, scale), Graph.ToPx(right - 3, bottom + 2, scale), Graph.ToPx(left + 3, bottom + 2, scale)]; + _bottomInner?.Points = [Graph.ToPx(left + 4, bottom, scale, dxpx: border), Graph.ToPx(right - 4, bottom, scale, dxpx: -border), Graph.ToPx(right - 3, bottom + 2, scale, dxpx: -border), Graph.ToPx(left + 3, bottom + 2, scale, dxpx: border)]; + + _text?.FontSize = 12; + _text?.Width = WIDTH * scale; + _text?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); + _text?.SetValue(Canvas.TopProperty, (CenterY * scale) - 8); + } + public bool IsInside(double x, double y) { return Math.Abs(x - CenterX) <= WIDTH / 2 && Math.Abs(y - CenterY) <= HEIGHT / 2; } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Switcher.cs b/PamhagenSysCtrl/Helpers/Pipeline/Switcher.cs index 1210d70..f18ad5f 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Switcher.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Switcher.cs @@ -6,8 +6,8 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class Switcher : INode { - public const double WIDTH = 100; - public const double HEIGHT = 50; + public const double WIDTH = 20; + public const double HEIGHT = 10; public double CenterX { get; set; } public double CenterY { get; set; } @@ -34,21 +34,15 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { } public void Draw(Canvas canvas) { - _mainTransform = new RotateTransform(0, CenterX, CenterY); - _shadowTransform = new RotateTransform(0, CenterX, CenterY); + _mainTransform = new RotateTransform(0); + _shadowTransform = new RotateTransform(0); _main = new Line() { - X1 = CenterX - WIDTH / 2, Y1 = CenterY, - X2 = CenterX + WIDTH / 2, Y2 = CenterY, - StrokeThickness = 5, Stroke = Brushes.Black, StrokeStartLineCap = PenLineCap.Square, StrokeEndLineCap = PenLineCap.Square, RenderTransform = _mainTransform, }; _shadow = new Line() { - X1 = CenterX - WIDTH / 2, Y1 = CenterY, - X2 = CenterX + WIDTH / 2, Y2 = CenterY, - StrokeThickness = 5, Stroke = Brushes.DarkGray, StrokeStartLineCap = PenLineCap.Square, StrokeEndLineCap = PenLineCap.Square, @@ -58,6 +52,25 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { canvas.Children.Add(_main); } + public void Scale(double scale) { + _mainTransform?.CenterX = CenterX * scale; + _mainTransform?.CenterY = CenterY * scale; + _shadowTransform?.CenterX = CenterX * scale; + _shadowTransform?.CenterY = CenterY * scale; + + _main?.X1 = (CenterX - WIDTH / 2) * scale; + _main?.Y1 = CenterY * scale; + _main?.X2 = (CenterX + WIDTH / 2) * scale; + _main?.Y2 = CenterY * scale; + _main?.StrokeThickness = 1 * scale; + + _shadow?.X1 = (CenterX - WIDTH / 2) * scale; + _shadow?.Y1 = CenterY * scale; + _shadow?.X2 = (CenterX + WIDTH / 2) * scale; + _shadow?.Y2 = CenterY * scale; + _shadow?.StrokeThickness = 1 * scale; + } + public bool IsInside(double x, double y) { return Math.Abs(x - CenterX) <= WIDTH / 2 && Math.Abs(y - CenterY) <= HEIGHT / 2; } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Tank.cs b/PamhagenSysCtrl/Helpers/Pipeline/Tank.cs index f720b38..addf4d2 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Tank.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Tank.cs @@ -6,8 +6,8 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class Tank : INode, ISink, ISource { - public const double WIDTH = 60; - public const double HEIGHT = 100; + public const double WIDTH = 12; + public const double HEIGHT = 20; public double CenterX { get; set; } public double CenterY { get; set; } @@ -40,27 +40,31 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public void Draw(Canvas canvas) { _rect = new Rectangle() { - Width = WIDTH, - Height = HEIGHT, Stroke = Brushes.Black, - StrokeThickness = 2, Fill = Brushes.WhiteSmoke, }; _text = new() { Text = CapacityLiters.HasValue ? $"{Label}\n{CapacityLiters:N0}" : Label, - FontSize = 12, - Width = WIDTH, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, }; - _rect.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); - _rect.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 2); - _text.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); - _text.SetValue(Canvas.TopProperty, CenterY - (CapacityLiters.HasValue ? 16 : 8)); canvas.Children.Add(_rect); canvas.Children.Add(_text); } + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + _rect?.Height = Graph.ToPx(HEIGHT, scale); + _rect?.Width = Graph.ToPx(WIDTH, scale); + _rect?.StrokeThickness = border; + _rect?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); + _rect?.SetValue(Canvas.TopProperty, (CenterY - HEIGHT / 2) * scale); + _text?.Width = Graph.ToPx(WIDTH, scale); + _text?.FontSize = 12; + _text?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); + _text?.SetValue(Canvas.TopProperty, (CenterY * scale) - (CapacityLiters.HasValue ? 16 : 8)); + } + public bool IsInside(double x, double y) { return Math.Abs(x - CenterX) <= WIDTH / 2 && Math.Abs(y - CenterY) <= HEIGHT / 2; } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Trough.cs b/PamhagenSysCtrl/Helpers/Pipeline/Trough.cs index 32653bc..bfe8f28 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Trough.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Trough.cs @@ -6,8 +6,8 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class Trough : INode, ISource { - public const double WIDTH = 100; - public const double HEIGHT = 60; + public const double WIDTH = 20; + public const double HEIGHT = 12; public double CenterX { get; set; } public double CenterY { get; set; } @@ -35,33 +35,37 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public void Draw(Canvas canvas) { _outer = new Rectangle() { - Width = WIDTH, - Height = HEIGHT, Fill = Brushes.Black, }; _inner = new Rectangle() { - Width = WIDTH - 4, - Height = HEIGHT - 2, Fill = Brushes.WhiteSmoke, }; _text = new() { Text = Label, - FontSize = 14, - Width = WIDTH, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, }; - _outer.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); - _outer.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 2); - _inner.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2 + 2); - _inner.SetValue(Canvas.TopProperty, CenterY - HEIGHT / 2); - _text.SetValue(Canvas.LeftProperty, CenterX - WIDTH / 2); - _text.SetValue(Canvas.TopProperty, CenterY - 10); canvas.Children.Add(_outer); canvas.Children.Add(_inner); canvas.Children.Add(_text); } + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + _outer?.Width = WIDTH * scale; + _outer?.Height = HEIGHT * scale; + _inner?.Width = WIDTH * scale - border * 2; + _inner?.Height = HEIGHT * scale - border; + _text?.Width = WIDTH * scale; + _text?.FontSize = 14; + _outer?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); + _outer?.SetValue(Canvas.TopProperty, (CenterY - HEIGHT / 2) * scale); + _inner?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale + border); + _inner?.SetValue(Canvas.TopProperty, (CenterY - HEIGHT / 2) * scale); + _text?.SetValue(Canvas.LeftProperty, (CenterX - WIDTH / 2) * scale); + _text?.SetValue(Canvas.TopProperty, (CenterY * scale) - 10); + } + public bool IsInside(double x, double y) { return Math.Abs(x - CenterX) <= WIDTH / 2 && Math.Abs(y - CenterY) <= HEIGHT / 2; } diff --git a/PamhagenSysCtrl/Helpers/Pipeline/Valve.cs b/PamhagenSysCtrl/Helpers/Pipeline/Valve.cs index 3768ec0..c2439d4 100644 --- a/PamhagenSysCtrl/Helpers/Pipeline/Valve.cs +++ b/PamhagenSysCtrl/Helpers/Pipeline/Valve.cs @@ -6,7 +6,7 @@ using System.Windows.Shapes; namespace PamhagenSysCtrl.Helpers.Pipeline { public class Valve : INode { - public const double DIAMETER = 24; + public const double DIAMETER = 4.8; public double CenterX { get; set; } public double CenterY { get; set; } @@ -40,29 +40,30 @@ namespace PamhagenSysCtrl.Helpers.Pipeline { public void Draw(Canvas canvas) { _circle = new Ellipse() { - Height = DIAMETER, - Width = DIAMETER, Fill = Brushes.DarkGray, Stroke = Brushes.Black, - StrokeThickness = 2, }; - _circle.SetValue(Canvas.LeftProperty, CenterX - DIAMETER / 2); - _circle.SetValue(Canvas.TopProperty, CenterY - DIAMETER / 2); _text = new() { Text = Label, - FontSize = 10, - Width = DIAMETER, - Height = DIAMETER, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center, SnapsToDevicePixels = true, }; - _text.SetValue(Canvas.LeftProperty, CenterX - DIAMETER / 2 + 0.5); - _text.SetValue(Canvas.TopProperty, CenterY - DIAMETER / 2 + 5.5); canvas.Children.Add(_circle); canvas.Children.Add(_text); } + public void Scale(double scale) { + var border = Graph.ToBorder(scale); + Graph.SetCenter(_circle, CenterX, CenterY, DIAMETER, DIAMETER, scale); + _circle?.StrokeThickness = border; + _text?.Width = DIAMETER * scale; + _text?.Height = DIAMETER * scale; + _text?.FontSize = 2 * scale; + _text?.SetValue(Canvas.LeftProperty, (CenterX - DIAMETER / 2 + 0.1) * scale); + _text?.SetValue(Canvas.TopProperty, (CenterY - DIAMETER / 2 + 1.1) * scale); + } + public bool IsInside(double x, double y) { return Math.Sqrt(Math.Pow(CenterX - x, 2) + Math.Pow(CenterY - y, 2)) <= DIAMETER / 2; } diff --git a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml index 31d4eb4..416e4de 100644 --- a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml +++ b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml @@ -5,7 +5,9 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:PamhagenSysCtrl.Windows" Closed="OnClosed" - Title="Anlagensteuerung Pamhagen" Height="950" Width="1600" MinWidth="1500" MinHeight="950"> + SizeChanged="OnSizeChanged" + Title="Anlagensteuerung Pamhagen" + Height="800" Width="1400" MinWidth="1000" MinHeight="500"> @@ -59,8 +61,9 @@ - + ? _lastSelected; private ISet? _hover; + public double Scale { get; set; } = 5; + public Path? HoveringPath { get { foreach (var b in FastSelectPaths.Where(b => b.Key.IsMouseOver)) { @@ -44,7 +46,7 @@ namespace PamhagenSysCtrl.Windows { InitializeComponent(); Menu_Help_CheckForUpdates.IsEnabled = App.Config.UpdateUrl != null; Graph = new(); - Graph.Draw(SchemeCanvas); + Graph.Draw(SchemeCanvas, Scale); FastSelectPaths = new Dictionary { [FastSelectButton_MW1_Press1] = (Graph.MW1, Graph.MP1, Graph.Press1), [FastSelectButton_MW2_Press1] = (Graph.MW2, Graph.MP2, Graph.Press1), @@ -216,6 +218,21 @@ namespace PamhagenSysCtrl.Windows { } } + private void OnSizeChanged(object sender, SizeChangedEventArgs evt) { + var rx = evt.NewSize.Width / 1550.0; + var ry = evt.NewSize.Height / 900.0; + var r = Math.Min(rx, ry); + Scale = r * 5; + Graph.Scale(Scale); + UpdateScheme(Mouse.GetPosition(SchemeCanvas), Mouse.LeftButton == MouseButtonState.Pressed); + } + + private void SchemeCanvas_MouseWheel(object sender, MouseWheelEventArgs evt) { + Scale = Math.Max(1, Math.Min(20, Scale + evt.Delta / 500.0)); + Graph.Scale(Scale); + UpdateScheme(evt.GetPosition(SchemeCanvas), evt.LeftButton == MouseButtonState.Pressed); + } + private void SchemeCanvas_MouseMove(object sender, MouseEventArgs evt) { UpdateScheme(evt.GetPosition(SchemeCanvas), evt.LeftButton == MouseButtonState.Pressed); } @@ -401,7 +418,7 @@ namespace PamhagenSysCtrl.Windows { SetFastSelectButton(b.Key, 0, false); } - _hover = Graph.GetHover(pos.X, pos.Y); + _hover = Graph.GetHover(pos.X, pos.Y, Scale); var hoverButtons = FastSelectPaths.Where(b => b.Key.IsMouseOver).ToDictionary(); Path? hoverPathDeactivate = null; if (App.Plant?.ManualControlMode ?? false) {