From dc89bd7383a0fe2311778757c3dafeb64b7bf14a Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Fri, 10 Jun 2022 15:53:41 +0200 Subject: [PATCH] - Primo rilascio su git --- .gitignore | 330 +++++++ 3dPrintApp.sln | 25 + 3dPrintApp/3dPrintApp.sln | 25 + 3dPrintApp/3dPrintApp.vbproj | 336 +++++++ 3dPrintApp/AboutBoxWindow/AboutBoxV.xaml | 52 ++ 3dPrintApp/AboutBoxWindow/AboutBoxV.xaml.vb | 37 + 3dPrintApp/AirspacePopup.vb | 275 ++++++ 3dPrintApp/App.config | 6 + 3dPrintApp/Application.xaml | 9 + 3dPrintApp/Application.xaml.vb | 19 + 3dPrintApp/Constants/ConstBeam.vb | 302 +++++++ 3dPrintApp/Constants/ConstColumns.vb | 16 + .../Constants/ConstDataGridColumnsIni.vb | 34 + 3dPrintApp/Constants/ConstDims.vb | 13 + 3dPrintApp/Constants/ConstGen.vb | 74 ++ 3dPrintApp/Constants/ConstIni.vb | 105 +++ 3dPrintApp/Constants/ConstMachComm.vb | 60 ++ 3dPrintApp/Constants/ConstMachIni.vb | 27 + 3dPrintApp/Constants/ConstMsg.vb | 54 ++ .../CurrLayerSlider/CurrLayerSliderV.xaml | 10 + .../CurrLayerSlider/CurrLayerSliderV.xaml.vb | 3 + .../CurrLayerSlider/CurrLayerSliderVM.vb | 16 + .../InstrumentPanel/InstrumentPanelV.xaml | 14 + .../InstrumentPanel/InstrumentPanelV.xaml.vb | 3 + .../InstrumentPanel/MyInstrumentPanelVM.vb | 47 + 3dPrintApp/LeftPanel/LeftPanelV.xaml | 42 + 3dPrintApp/LeftPanel/LeftPanelV.xaml.vb | 3 + 3dPrintApp/LeftPanel/LeftPanelVM.vb | 25 + 3dPrintApp/MachinePanel/MachinePanelV.xaml | 49 + 3dPrintApp/MachinePanel/MachinePanelV.xaml.vb | 3 + 3dPrintApp/MachinePanel/MachinePanelVM.vb | 168 ++++ 3dPrintApp/MainWindow.xaml | 12 + 3dPrintApp/MainWindow.xaml.vb | 3 + 3dPrintApp/MainWindow/MainWindowM.vb | 347 ++++++++ 3dPrintApp/MainWindow/MainWindowV.xaml | 33 + 3dPrintApp/MainWindow/MainWindowV.xaml.vb | 63 ++ 3dPrintApp/MainWindow/MainWindowVM.vb | 280 ++++++ 3dPrintApp/My Project/AssemblyInfo.vb | 59 ++ .../My Project/MyExtensions/MyWpfExtension.vb | 121 +++ 3dPrintApp/My Project/Resources.Designer.vb | 62 ++ 3dPrintApp/My Project/Resources.resx | 117 +++ 3dPrintApp/My Project/Settings.Designer.vb | 73 ++ 3dPrintApp/My Project/Settings.settings | 7 + 3dPrintApp/ProjManager/ProjManagerV.xaml | 67 ++ 3dPrintApp/ProjManager/ProjManagerV.xaml.vb | 3 + 3dPrintApp/ProjManager/ProjManagerVM.vb | 438 +++++++++ 3dPrintApp/Project/ProjectV.xaml | 185 ++++ 3dPrintApp/Project/ProjectV.xaml.vb | 3 + 3dPrintApp/Project/ProjectVM.vb | 478 ++++++++++ 3dPrintApp/Resources/AboutBoxImage.png | Bin 0 -> 4169 bytes .../Resources/CALCPanel/ChooseMachine.png | Bin 0 -> 947 bytes 3dPrintApp/Resources/CALCPanel/Edit.png | Bin 0 -> 477 bytes 3dPrintApp/Resources/CALCPanel/ResetCalc.png | Bin 0 -> 691 bytes 3dPrintApp/Resources/CALCPanel/Simulate.png | Bin 0 -> 812 bytes 3dPrintApp/Resources/CALCPanel/Verify.png | Bin 0 -> 757 bytes 3dPrintApp/Resources/CALCPanel/VerifyAll.png | Bin 0 -> 792 bytes .../Configuration/MachiningsTable.png | Bin 0 -> 434 bytes .../Resources/DrawPanel/AddPointCurve.png | Bin 0 -> 901 bytes .../Resources/DrawPanel/ApproxCurve.png | Bin 0 -> 1424 bytes 3dPrintApp/Resources/DrawPanel/Arc3P.png | Bin 0 -> 790 bytes 3dPrintApp/Resources/DrawPanel/ArcCSE.png | Bin 0 -> 708 bytes 3dPrintApp/Resources/DrawPanel/ArcFlip.png | Bin 0 -> 1665 bytes 3dPrintApp/Resources/DrawPanel/ArcPDP.png | Bin 0 -> 780 bytes 3dPrintApp/Resources/DrawPanel/BreakCurve.png | Bin 0 -> 707 bytes 3dPrintApp/Resources/DrawPanel/Chamfer.png | Bin 0 -> 422 bytes .../Resources/DrawPanel/ChangeColor.png | Bin 0 -> 994 bytes .../Resources/DrawPanel/ChangeColorAlpha.png | Bin 0 -> 1277 bytes .../Resources/DrawPanel/ChangeLayer.png | Bin 0 -> 1350 bytes .../Resources/DrawPanel/ChangeStart.png | Bin 0 -> 764 bytes 3dPrintApp/Resources/DrawPanel/Circle3P.png | Bin 0 -> 1300 bytes 3dPrintApp/Resources/DrawPanel/CircleCD.png | Bin 0 -> 713 bytes 3dPrintApp/Resources/DrawPanel/CircleCP.png | Bin 0 -> 662 bytes 3dPrintApp/Resources/DrawPanel/Delete.png | Bin 0 -> 658 bytes .../Resources/DrawPanel/ExplodeCurve.png | Bin 0 -> 932 bytes .../Resources/DrawPanel/ExplodeSurf.png | Bin 0 -> 1069 bytes .../Resources/DrawPanel/ExtendCurve.png | Bin 0 -> 555 bytes .../Resources/DrawPanel/ExtractFacetLoops.png | Bin 0 -> 1034 bytes .../Resources/DrawPanel/ExtractLoops.png | Bin 0 -> 1432 bytes .../Resources/DrawPanel/ExtractSurfFacet.png | Bin 0 -> 1117 bytes 3dPrintApp/Resources/DrawPanel/Extrude.png | Bin 0 -> 1243 bytes 3dPrintApp/Resources/DrawPanel/Fillet.png | Bin 0 -> 594 bytes .../Resources/DrawPanel/IntersectSurfSurf.png | Bin 0 -> 1894 bytes .../Resources/DrawPanel/InvertCurve.png | Bin 0 -> 509 bytes 3dPrintApp/Resources/DrawPanel/InvertSurf.png | Bin 0 -> 714 bytes 3dPrintApp/Resources/DrawPanel/JoinCurve.png | Bin 0 -> 1079 bytes 3dPrintApp/Resources/DrawPanel/Line2P.png | Bin 0 -> 595 bytes 3dPrintApp/Resources/DrawPanel/LinePDL.png | Bin 0 -> 735 bytes .../Resources/DrawPanel/LinearDimension.png | Bin 0 -> 921 bytes 3dPrintApp/Resources/DrawPanel/MergeSurf.png | Bin 0 -> 749 bytes 3dPrintApp/Resources/DrawPanel/Mirror.png | Bin 0 -> 437 bytes 3dPrintApp/Resources/DrawPanel/Mirror3D.png | Bin 0 -> 538 bytes .../Resources/DrawPanel/ModifyCurve.png | Bin 0 -> 707 bytes 3dPrintApp/Resources/DrawPanel/ModifyText.png | Bin 0 -> 749 bytes 3dPrintApp/Resources/DrawPanel/Move.png | Bin 0 -> 1115 bytes 3dPrintApp/Resources/DrawPanel/Offset.png | Bin 0 -> 658 bytes 3dPrintApp/Resources/DrawPanel/Plane.png | Bin 0 -> 686 bytes 3dPrintApp/Resources/DrawPanel/Point.png | Bin 0 -> 308 bytes 3dPrintApp/Resources/DrawPanel/Polygon.png | Bin 0 -> 682 bytes .../Resources/DrawPanel/PolygonSide.png | Bin 0 -> 620 bytes .../Resources/DrawPanel/Rectangle2P.png | Bin 0 -> 549 bytes .../Resources/DrawPanel/RemoveColor.png | Bin 0 -> 1048 bytes .../Resources/DrawPanel/RemovePointCurve.png | Bin 0 -> 1166 bytes 3dPrintApp/Resources/DrawPanel/Revolve.png | Bin 0 -> 2519 bytes 3dPrintApp/Resources/DrawPanel/Rotate.png | Bin 0 -> 511 bytes 3dPrintApp/Resources/DrawPanel/Rotate3D.png | Bin 0 -> 667 bytes 3dPrintApp/Resources/DrawPanel/Ruled.png | Bin 0 -> 1096 bytes 3dPrintApp/Resources/DrawPanel/Scale.png | Bin 0 -> 567 bytes 3dPrintApp/Resources/DrawPanel/Scale3D.png | Bin 0 -> 687 bytes 3dPrintApp/Resources/DrawPanel/Screw.png | Bin 0 -> 1582 bytes .../Resources/DrawPanel/SolidAddSurf.png | Bin 0 -> 1567 bytes .../DrawPanel/SolidIntersectSurf.png | Bin 0 -> 1126 bytes .../Resources/DrawPanel/SolidSubtractSurf.png | Bin 0 -> 1408 bytes 3dPrintApp/Resources/DrawPanel/SplitCurve.png | Bin 0 -> 675 bytes 3dPrintApp/Resources/DrawPanel/Swept.png | Bin 0 -> 2088 bytes 3dPrintApp/Resources/DrawPanel/Text.png | Bin 0 -> 705 bytes 3dPrintApp/Resources/DrawPanel/ThickCurve.png | Bin 0 -> 758 bytes 3dPrintApp/Resources/EgtBEAMWALL.ico | Bin 0 -> 9158 bytes .../Resources/InstrumentPanel/Analyze.png | Bin 0 -> 962 bytes .../Resources/InstrumentPanel/ChangeParam.png | Bin 0 -> 351 bytes .../Resources/InstrumentPanel/GetDist.png | Bin 0 -> 331 bytes .../Resources/InstrumentPanel/Statistics.png | Bin 0 -> 417 bytes 3dPrintApp/Resources/LeftPanel/AddFeature.png | Bin 0 -> 468 bytes 3dPrintApp/Resources/LeftPanel/AddPart.png | Bin 0 -> 525 bytes .../Resources/LeftPanel/AddToRawPart.png | Bin 0 -> 315 bytes .../Resources/LeftPanel/CopyFeature.png | Bin 0 -> 434 bytes 3dPrintApp/Resources/LeftPanel/CopyPart.png | Bin 0 -> 474 bytes .../Resources/LeftPanel/MacroFeature.png | Bin 0 -> 290 bytes 3dPrintApp/Resources/LeftPanel/NewRawPart.png | Bin 0 -> 397 bytes .../Resources/LeftPanel/RemoveFeature.png | Bin 0 -> 478 bytes 3dPrintApp/Resources/LeftPanel/RemovePart.png | Bin 0 -> 503 bytes 3dPrintApp/Resources/MainMenu/Send.png | Bin 0 -> 1036 bytes .../MovePartInRawPart/MoveLeftParts.png | Bin 0 -> 449 bytes .../MovePartInRawPart/MoveRightParts.png | Bin 0 -> 427 bytes .../Resources/OptimizePanel/FlipRot.png | Bin 0 -> 681 bytes .../Resources/OptimizePanel/UnlockFlip.png | Bin 0 -> 599 bytes .../OptimizePanel/UnlockRotation.png | Bin 0 -> 561 bytes .../Resources/OptimizePanel/Warehouse.png | Bin 0 -> 286 bytes .../Resources/PartManager/LeftInvert.png | Bin 0 -> 449 bytes .../Resources/PartManager/LeftRotate.png | Bin 0 -> 472 bytes .../Resources/PartManager/Locked.old.png | Bin 0 -> 8609 bytes 3dPrintApp/Resources/PartManager/Locked.png | Bin 0 -> 299 bytes .../Resources/PartManager/RightInvert.png | Bin 0 -> 427 bytes .../Resources/PartManager/RightRotate.png | Bin 0 -> 479 bytes .../Resources/PartManager/Unlocked.old.png | Bin 0 -> 9362 bytes 3dPrintApp/Resources/PartManager/Unlocked.png | Bin 0 -> 318 bytes .../ProjectManager/ExportProject.png | Bin 0 -> 535 bytes .../Resources/ProjectManager/GoToProd.png | Bin 0 -> 652 bytes .../Resources/ProjectManager/GoToProj.png | Bin 0 -> 622 bytes .../Resources/ProjectManager/Import.png | Bin 0 -> 671 bytes .../Resources/ProjectManager/ImportBTL.png | Bin 0 -> 610 bytes .../ProjectManager/ImportProject.png | Bin 0 -> 534 bytes 3dPrintApp/Resources/ProjectManager/New.png | Bin 0 -> 538 bytes 3dPrintApp/Resources/ProjectManager/Open.png | Bin 0 -> 647 bytes .../Resources/ProjectManager/Options.png | Bin 0 -> 2381 bytes 3dPrintApp/Resources/ProjectManager/Save.png | Bin 0 -> 610 bytes .../Resources/ProjectManager/SaveAs.png | Bin 0 -> 951 bytes 3dPrintApp/Resources/ProjectManager/Send.png | Bin 0 -> 1036 bytes .../Resources/ProjectManager/UpdateBTL.png | Bin 0 -> 797 bytes .../Resources/ShowBeamPanel/ShowAll.png | Bin 0 -> 604 bytes .../Resources/ShowBeamPanel/ShowBuilding.png | Bin 0 -> 785 bytes .../Resources/ShowBeamPanel/ShowSolid.png | Bin 0 -> 1172 bytes 3dPrintApp/Resources/ShowPanel/CurveDir.png | Bin 0 -> 883 bytes .../Resources/ShowPanel/RenderingHL.png | Bin 0 -> 413 bytes .../Resources/ShowPanel/RenderingSH.png | Bin 0 -> 418 bytes .../Resources/ShowPanel/RenderingWF.png | Bin 0 -> 510 bytes .../Resources/Statistics/CopyToClipboard.png | Bin 0 -> 367 bytes 3dPrintApp/Resources/Statistics/PrintPDF.png | Bin 0 -> 541 bytes 3dPrintApp/Resources/TopPanel/CopyRawPart.png | Bin 0 -> 340 bytes .../Resources/TopPanel/MoveDownPart.png | Bin 0 -> 449 bytes .../Resources/TopPanel/MovePartInRawPart.png | Bin 0 -> 379 bytes 3dPrintApp/Resources/TopPanel/MoveUpPart.png | Bin 0 -> 427 bytes .../Resources/TopPanel/ProduceAllRawPart.png | Bin 0 -> 435 bytes .../Resources/TopPanel/ProduceRawPart.png | Bin 0 -> 475 bytes .../Resources/TopPanel/RemovePart.old.png | Bin 0 -> 492 bytes 3dPrintApp/Resources/TopPanel/RemovePart.png | Bin 0 -> 319 bytes .../Resources/TopPanel/RemoveRawPart.png | Bin 0 -> 387 bytes 3dPrintApp/Resources/TopPanel/ReorderPart.png | Bin 0 -> 480 bytes 3dPrintApp/Resources/TreeView/Folder.png | Bin 0 -> 1292 bytes .../Resources/ViewPanel/LookFromBACK.png | Bin 0 -> 547 bytes .../Resources/ViewPanel/LookFromBOTTOM.png | Bin 0 -> 570 bytes .../Resources/ViewPanel/LookFromFRONT.png | Bin 0 -> 528 bytes .../Resources/ViewPanel/LookFromISO_NE.png | Bin 0 -> 619 bytes .../Resources/ViewPanel/LookFromISO_NW.png | Bin 0 -> 694 bytes .../Resources/ViewPanel/LookFromISO_SE.png | Bin 0 -> 684 bytes .../Resources/ViewPanel/LookFromISO_SW.png | Bin 0 -> 677 bytes .../Resources/ViewPanel/LookFromLEFT.png | Bin 0 -> 563 bytes .../Resources/ViewPanel/LookFromRIGHT.png | Bin 0 -> 564 bytes .../Resources/ViewPanel/LookFromTOP.png | Bin 0 -> 552 bytes 3dPrintApp/Resources/ViewPanel/ZoomAll.png | Bin 0 -> 1106 bytes 3dPrintApp/Resources/ViewPanel/ZoomIn.png | Bin 0 -> 689 bytes 3dPrintApp/Resources/ViewPanel/ZoomOut.png | Bin 0 -> 648 bytes 3dPrintApp/SceneHost/MySceneHostVM.vb | 717 +++++++++++++++ 3dPrintApp/SceneHost/MySceneHostVM.vb.bak | 655 ++++++++++++++ 3dPrintApp/SceneHost/SceneHostV.xaml | 10 + 3dPrintApp/SceneHost/SceneHostV.xaml.vb | 33 + .../SecondaryWindow/SecondaryWindowV.xaml | 32 + .../SecondaryWindow/SecondaryWindowV.xaml.vb | 65 ++ .../SecondaryWindow/SecondaryWindowVM.vb | 71 ++ 3dPrintApp/ShowPanel/ShowPanelV.xaml | 29 + 3dPrintApp/ShowPanel/ShowPanelV.xaml.vb | 3 + .../Special-3dPrinting/Printing3DPanelV.xaml | 22 + .../Printing3DPanelV.xaml.vb | 3 + .../Special-3dPrinting/Printing3DPanelVM.vb | 108 +++ .../Special-3dPrinting/Printing3DUtility.vb | 26 + 3dPrintApp/StatusBar/MyStatusBarVM.vb | 142 +++ 3dPrintApp/StatusBar/StatusBarV.xaml | 73 ++ 3dPrintApp/StatusBar/StatusBarV.xaml.vb | 3 + 3dPrintApp/Themes/Generic.xaml | 19 + 3dPrintApp/TopPanel/TopPanelV.xaml | 67 ++ 3dPrintApp/TopPanel/TopPanelV.xaml.vb | 3 + 3dPrintApp/TopPanel/TopPanelVM.vb | 6 + 3dPrintApp/Utility/BTLIniFile.vb | 173 ++++ 3dPrintApp/Utility/Converters.vb | 18 + 3dPrintApp/Utility/CurrentMachine.vb | 96 ++ 3dPrintApp/Utility/DbControllers.vb | 67 ++ 3dPrintApp/Utility/Dictionary.xaml | 841 ++++++++++++++++++ 3dPrintApp/Utility/Dictionary.xaml.vb | 30 + 3dPrintApp/Utility/DisableModifiedMgr.vb | 16 + 3dPrintApp/Utility/LuaExec.vb | 209 +++++ 3dPrintApp/Utility/MachParamIniFile.vb | 70 ++ 3dPrintApp/Utility/Map.vb | 537 +++++++++++ 3dPrintApp/Utility/MyMachine.vb | 34 + 3dPrintApp/Utility/RawPartConfiguration.vb | 17 + .../Utility/SectionXMaterialToBeAdded.vb | 81 ++ 3dPrintApp/Utility/TextBlockUtils.vb | 69 ++ 3dPrintApp/Utility/TreeViewItemBase.vb | 258 ++++++ 3dPrintApp/ViewModel/MaterialVM.vb | 60 ++ 3dPrintApp/ViewModel/Print3dLayerVM.vb | 3 + 3dPrintApp/ViewModel/Print3dPartVM.vb | 50 ++ 3dPrintApp/ViewPanel/ViewPanelV.xaml | 44 + 3dPrintApp/ViewPanel/ViewPanelV.xaml.vb | 3 + 3dPrintApp/ViewPanel/ViewPanelVM.vb | 231 +++++ 3dPrintApp/packages.config | 4 + 233 files changed, 9531 insertions(+) create mode 100644 .gitignore create mode 100644 3dPrintApp.sln create mode 100644 3dPrintApp/3dPrintApp.sln create mode 100644 3dPrintApp/3dPrintApp.vbproj create mode 100644 3dPrintApp/AboutBoxWindow/AboutBoxV.xaml create mode 100644 3dPrintApp/AboutBoxWindow/AboutBoxV.xaml.vb create mode 100644 3dPrintApp/AirspacePopup.vb create mode 100644 3dPrintApp/App.config create mode 100644 3dPrintApp/Application.xaml create mode 100644 3dPrintApp/Application.xaml.vb create mode 100644 3dPrintApp/Constants/ConstBeam.vb create mode 100644 3dPrintApp/Constants/ConstColumns.vb create mode 100644 3dPrintApp/Constants/ConstDataGridColumnsIni.vb create mode 100644 3dPrintApp/Constants/ConstDims.vb create mode 100644 3dPrintApp/Constants/ConstGen.vb create mode 100644 3dPrintApp/Constants/ConstIni.vb create mode 100644 3dPrintApp/Constants/ConstMachComm.vb create mode 100644 3dPrintApp/Constants/ConstMachIni.vb create mode 100644 3dPrintApp/Constants/ConstMsg.vb create mode 100644 3dPrintApp/CurrLayerSlider/CurrLayerSliderV.xaml create mode 100644 3dPrintApp/CurrLayerSlider/CurrLayerSliderV.xaml.vb create mode 100644 3dPrintApp/CurrLayerSlider/CurrLayerSliderVM.vb create mode 100644 3dPrintApp/InstrumentPanel/InstrumentPanelV.xaml create mode 100644 3dPrintApp/InstrumentPanel/InstrumentPanelV.xaml.vb create mode 100644 3dPrintApp/InstrumentPanel/MyInstrumentPanelVM.vb create mode 100644 3dPrintApp/LeftPanel/LeftPanelV.xaml create mode 100644 3dPrintApp/LeftPanel/LeftPanelV.xaml.vb create mode 100644 3dPrintApp/LeftPanel/LeftPanelVM.vb create mode 100644 3dPrintApp/MachinePanel/MachinePanelV.xaml create mode 100644 3dPrintApp/MachinePanel/MachinePanelV.xaml.vb create mode 100644 3dPrintApp/MachinePanel/MachinePanelVM.vb create mode 100644 3dPrintApp/MainWindow.xaml create mode 100644 3dPrintApp/MainWindow.xaml.vb create mode 100644 3dPrintApp/MainWindow/MainWindowM.vb create mode 100644 3dPrintApp/MainWindow/MainWindowV.xaml create mode 100644 3dPrintApp/MainWindow/MainWindowV.xaml.vb create mode 100644 3dPrintApp/MainWindow/MainWindowVM.vb create mode 100644 3dPrintApp/My Project/AssemblyInfo.vb create mode 100644 3dPrintApp/My Project/MyExtensions/MyWpfExtension.vb create mode 100644 3dPrintApp/My Project/Resources.Designer.vb create mode 100644 3dPrintApp/My Project/Resources.resx create mode 100644 3dPrintApp/My Project/Settings.Designer.vb create mode 100644 3dPrintApp/My Project/Settings.settings create mode 100644 3dPrintApp/ProjManager/ProjManagerV.xaml create mode 100644 3dPrintApp/ProjManager/ProjManagerV.xaml.vb create mode 100644 3dPrintApp/ProjManager/ProjManagerVM.vb create mode 100644 3dPrintApp/Project/ProjectV.xaml create mode 100644 3dPrintApp/Project/ProjectV.xaml.vb create mode 100644 3dPrintApp/Project/ProjectVM.vb create mode 100644 3dPrintApp/Resources/AboutBoxImage.png create mode 100644 3dPrintApp/Resources/CALCPanel/ChooseMachine.png create mode 100644 3dPrintApp/Resources/CALCPanel/Edit.png create mode 100644 3dPrintApp/Resources/CALCPanel/ResetCalc.png create mode 100644 3dPrintApp/Resources/CALCPanel/Simulate.png create mode 100644 3dPrintApp/Resources/CALCPanel/Verify.png create mode 100644 3dPrintApp/Resources/CALCPanel/VerifyAll.png create mode 100644 3dPrintApp/Resources/Configuration/MachiningsTable.png create mode 100644 3dPrintApp/Resources/DrawPanel/AddPointCurve.png create mode 100644 3dPrintApp/Resources/DrawPanel/ApproxCurve.png create mode 100644 3dPrintApp/Resources/DrawPanel/Arc3P.png create mode 100644 3dPrintApp/Resources/DrawPanel/ArcCSE.png create mode 100644 3dPrintApp/Resources/DrawPanel/ArcFlip.png create mode 100644 3dPrintApp/Resources/DrawPanel/ArcPDP.png create mode 100644 3dPrintApp/Resources/DrawPanel/BreakCurve.png create mode 100644 3dPrintApp/Resources/DrawPanel/Chamfer.png create mode 100644 3dPrintApp/Resources/DrawPanel/ChangeColor.png create mode 100644 3dPrintApp/Resources/DrawPanel/ChangeColorAlpha.png create mode 100644 3dPrintApp/Resources/DrawPanel/ChangeLayer.png create mode 100644 3dPrintApp/Resources/DrawPanel/ChangeStart.png create mode 100644 3dPrintApp/Resources/DrawPanel/Circle3P.png create mode 100644 3dPrintApp/Resources/DrawPanel/CircleCD.png create mode 100644 3dPrintApp/Resources/DrawPanel/CircleCP.png create mode 100644 3dPrintApp/Resources/DrawPanel/Delete.png create mode 100644 3dPrintApp/Resources/DrawPanel/ExplodeCurve.png create mode 100644 3dPrintApp/Resources/DrawPanel/ExplodeSurf.png create mode 100644 3dPrintApp/Resources/DrawPanel/ExtendCurve.png create mode 100644 3dPrintApp/Resources/DrawPanel/ExtractFacetLoops.png create mode 100644 3dPrintApp/Resources/DrawPanel/ExtractLoops.png create mode 100644 3dPrintApp/Resources/DrawPanel/ExtractSurfFacet.png create mode 100644 3dPrintApp/Resources/DrawPanel/Extrude.png create mode 100644 3dPrintApp/Resources/DrawPanel/Fillet.png create mode 100644 3dPrintApp/Resources/DrawPanel/IntersectSurfSurf.png create mode 100644 3dPrintApp/Resources/DrawPanel/InvertCurve.png create mode 100644 3dPrintApp/Resources/DrawPanel/InvertSurf.png create mode 100644 3dPrintApp/Resources/DrawPanel/JoinCurve.png create mode 100644 3dPrintApp/Resources/DrawPanel/Line2P.png create mode 100644 3dPrintApp/Resources/DrawPanel/LinePDL.png create mode 100644 3dPrintApp/Resources/DrawPanel/LinearDimension.png create mode 100644 3dPrintApp/Resources/DrawPanel/MergeSurf.png create mode 100644 3dPrintApp/Resources/DrawPanel/Mirror.png create mode 100644 3dPrintApp/Resources/DrawPanel/Mirror3D.png create mode 100644 3dPrintApp/Resources/DrawPanel/ModifyCurve.png create mode 100644 3dPrintApp/Resources/DrawPanel/ModifyText.png create mode 100644 3dPrintApp/Resources/DrawPanel/Move.png create mode 100644 3dPrintApp/Resources/DrawPanel/Offset.png create mode 100644 3dPrintApp/Resources/DrawPanel/Plane.png create mode 100644 3dPrintApp/Resources/DrawPanel/Point.png create mode 100644 3dPrintApp/Resources/DrawPanel/Polygon.png create mode 100644 3dPrintApp/Resources/DrawPanel/PolygonSide.png create mode 100644 3dPrintApp/Resources/DrawPanel/Rectangle2P.png create mode 100644 3dPrintApp/Resources/DrawPanel/RemoveColor.png create mode 100644 3dPrintApp/Resources/DrawPanel/RemovePointCurve.png create mode 100644 3dPrintApp/Resources/DrawPanel/Revolve.png create mode 100644 3dPrintApp/Resources/DrawPanel/Rotate.png create mode 100644 3dPrintApp/Resources/DrawPanel/Rotate3D.png create mode 100644 3dPrintApp/Resources/DrawPanel/Ruled.png create mode 100644 3dPrintApp/Resources/DrawPanel/Scale.png create mode 100644 3dPrintApp/Resources/DrawPanel/Scale3D.png create mode 100644 3dPrintApp/Resources/DrawPanel/Screw.png create mode 100644 3dPrintApp/Resources/DrawPanel/SolidAddSurf.png create mode 100644 3dPrintApp/Resources/DrawPanel/SolidIntersectSurf.png create mode 100644 3dPrintApp/Resources/DrawPanel/SolidSubtractSurf.png create mode 100644 3dPrintApp/Resources/DrawPanel/SplitCurve.png create mode 100644 3dPrintApp/Resources/DrawPanel/Swept.png create mode 100644 3dPrintApp/Resources/DrawPanel/Text.png create mode 100644 3dPrintApp/Resources/DrawPanel/ThickCurve.png create mode 100644 3dPrintApp/Resources/EgtBEAMWALL.ico create mode 100644 3dPrintApp/Resources/InstrumentPanel/Analyze.png create mode 100644 3dPrintApp/Resources/InstrumentPanel/ChangeParam.png create mode 100644 3dPrintApp/Resources/InstrumentPanel/GetDist.png create mode 100644 3dPrintApp/Resources/InstrumentPanel/Statistics.png create mode 100644 3dPrintApp/Resources/LeftPanel/AddFeature.png create mode 100644 3dPrintApp/Resources/LeftPanel/AddPart.png create mode 100644 3dPrintApp/Resources/LeftPanel/AddToRawPart.png create mode 100644 3dPrintApp/Resources/LeftPanel/CopyFeature.png create mode 100644 3dPrintApp/Resources/LeftPanel/CopyPart.png create mode 100644 3dPrintApp/Resources/LeftPanel/MacroFeature.png create mode 100644 3dPrintApp/Resources/LeftPanel/NewRawPart.png create mode 100644 3dPrintApp/Resources/LeftPanel/RemoveFeature.png create mode 100644 3dPrintApp/Resources/LeftPanel/RemovePart.png create mode 100644 3dPrintApp/Resources/MainMenu/Send.png create mode 100644 3dPrintApp/Resources/MovePartInRawPart/MoveLeftParts.png create mode 100644 3dPrintApp/Resources/MovePartInRawPart/MoveRightParts.png create mode 100644 3dPrintApp/Resources/OptimizePanel/FlipRot.png create mode 100644 3dPrintApp/Resources/OptimizePanel/UnlockFlip.png create mode 100644 3dPrintApp/Resources/OptimizePanel/UnlockRotation.png create mode 100644 3dPrintApp/Resources/OptimizePanel/Warehouse.png create mode 100644 3dPrintApp/Resources/PartManager/LeftInvert.png create mode 100644 3dPrintApp/Resources/PartManager/LeftRotate.png create mode 100644 3dPrintApp/Resources/PartManager/Locked.old.png create mode 100644 3dPrintApp/Resources/PartManager/Locked.png create mode 100644 3dPrintApp/Resources/PartManager/RightInvert.png create mode 100644 3dPrintApp/Resources/PartManager/RightRotate.png create mode 100644 3dPrintApp/Resources/PartManager/Unlocked.old.png create mode 100644 3dPrintApp/Resources/PartManager/Unlocked.png create mode 100644 3dPrintApp/Resources/ProjectManager/ExportProject.png create mode 100644 3dPrintApp/Resources/ProjectManager/GoToProd.png create mode 100644 3dPrintApp/Resources/ProjectManager/GoToProj.png create mode 100644 3dPrintApp/Resources/ProjectManager/Import.png create mode 100644 3dPrintApp/Resources/ProjectManager/ImportBTL.png create mode 100644 3dPrintApp/Resources/ProjectManager/ImportProject.png create mode 100644 3dPrintApp/Resources/ProjectManager/New.png create mode 100644 3dPrintApp/Resources/ProjectManager/Open.png create mode 100644 3dPrintApp/Resources/ProjectManager/Options.png create mode 100644 3dPrintApp/Resources/ProjectManager/Save.png create mode 100644 3dPrintApp/Resources/ProjectManager/SaveAs.png create mode 100644 3dPrintApp/Resources/ProjectManager/Send.png create mode 100644 3dPrintApp/Resources/ProjectManager/UpdateBTL.png create mode 100644 3dPrintApp/Resources/ShowBeamPanel/ShowAll.png create mode 100644 3dPrintApp/Resources/ShowBeamPanel/ShowBuilding.png create mode 100644 3dPrintApp/Resources/ShowBeamPanel/ShowSolid.png create mode 100644 3dPrintApp/Resources/ShowPanel/CurveDir.png create mode 100644 3dPrintApp/Resources/ShowPanel/RenderingHL.png create mode 100644 3dPrintApp/Resources/ShowPanel/RenderingSH.png create mode 100644 3dPrintApp/Resources/ShowPanel/RenderingWF.png create mode 100644 3dPrintApp/Resources/Statistics/CopyToClipboard.png create mode 100644 3dPrintApp/Resources/Statistics/PrintPDF.png create mode 100644 3dPrintApp/Resources/TopPanel/CopyRawPart.png create mode 100644 3dPrintApp/Resources/TopPanel/MoveDownPart.png create mode 100644 3dPrintApp/Resources/TopPanel/MovePartInRawPart.png create mode 100644 3dPrintApp/Resources/TopPanel/MoveUpPart.png create mode 100644 3dPrintApp/Resources/TopPanel/ProduceAllRawPart.png create mode 100644 3dPrintApp/Resources/TopPanel/ProduceRawPart.png create mode 100644 3dPrintApp/Resources/TopPanel/RemovePart.old.png create mode 100644 3dPrintApp/Resources/TopPanel/RemovePart.png create mode 100644 3dPrintApp/Resources/TopPanel/RemoveRawPart.png create mode 100644 3dPrintApp/Resources/TopPanel/ReorderPart.png create mode 100644 3dPrintApp/Resources/TreeView/Folder.png create mode 100644 3dPrintApp/Resources/ViewPanel/LookFromBACK.png create mode 100644 3dPrintApp/Resources/ViewPanel/LookFromBOTTOM.png create mode 100644 3dPrintApp/Resources/ViewPanel/LookFromFRONT.png create mode 100644 3dPrintApp/Resources/ViewPanel/LookFromISO_NE.png create mode 100644 3dPrintApp/Resources/ViewPanel/LookFromISO_NW.png create mode 100644 3dPrintApp/Resources/ViewPanel/LookFromISO_SE.png create mode 100644 3dPrintApp/Resources/ViewPanel/LookFromISO_SW.png create mode 100644 3dPrintApp/Resources/ViewPanel/LookFromLEFT.png create mode 100644 3dPrintApp/Resources/ViewPanel/LookFromRIGHT.png create mode 100644 3dPrintApp/Resources/ViewPanel/LookFromTOP.png create mode 100644 3dPrintApp/Resources/ViewPanel/ZoomAll.png create mode 100644 3dPrintApp/Resources/ViewPanel/ZoomIn.png create mode 100644 3dPrintApp/Resources/ViewPanel/ZoomOut.png create mode 100644 3dPrintApp/SceneHost/MySceneHostVM.vb create mode 100644 3dPrintApp/SceneHost/MySceneHostVM.vb.bak create mode 100644 3dPrintApp/SceneHost/SceneHostV.xaml create mode 100644 3dPrintApp/SceneHost/SceneHostV.xaml.vb create mode 100644 3dPrintApp/SecondaryWindow/SecondaryWindowV.xaml create mode 100644 3dPrintApp/SecondaryWindow/SecondaryWindowV.xaml.vb create mode 100644 3dPrintApp/SecondaryWindow/SecondaryWindowVM.vb create mode 100644 3dPrintApp/ShowPanel/ShowPanelV.xaml create mode 100644 3dPrintApp/ShowPanel/ShowPanelV.xaml.vb create mode 100644 3dPrintApp/Special-3dPrinting/Printing3DPanelV.xaml create mode 100644 3dPrintApp/Special-3dPrinting/Printing3DPanelV.xaml.vb create mode 100644 3dPrintApp/Special-3dPrinting/Printing3DPanelVM.vb create mode 100644 3dPrintApp/Special-3dPrinting/Printing3DUtility.vb create mode 100644 3dPrintApp/StatusBar/MyStatusBarVM.vb create mode 100644 3dPrintApp/StatusBar/StatusBarV.xaml create mode 100644 3dPrintApp/StatusBar/StatusBarV.xaml.vb create mode 100644 3dPrintApp/Themes/Generic.xaml create mode 100644 3dPrintApp/TopPanel/TopPanelV.xaml create mode 100644 3dPrintApp/TopPanel/TopPanelV.xaml.vb create mode 100644 3dPrintApp/TopPanel/TopPanelVM.vb create mode 100644 3dPrintApp/Utility/BTLIniFile.vb create mode 100644 3dPrintApp/Utility/Converters.vb create mode 100644 3dPrintApp/Utility/CurrentMachine.vb create mode 100644 3dPrintApp/Utility/DbControllers.vb create mode 100644 3dPrintApp/Utility/Dictionary.xaml create mode 100644 3dPrintApp/Utility/Dictionary.xaml.vb create mode 100644 3dPrintApp/Utility/DisableModifiedMgr.vb create mode 100644 3dPrintApp/Utility/LuaExec.vb create mode 100644 3dPrintApp/Utility/MachParamIniFile.vb create mode 100644 3dPrintApp/Utility/Map.vb create mode 100644 3dPrintApp/Utility/MyMachine.vb create mode 100644 3dPrintApp/Utility/RawPartConfiguration.vb create mode 100644 3dPrintApp/Utility/SectionXMaterialToBeAdded.vb create mode 100644 3dPrintApp/Utility/TextBlockUtils.vb create mode 100644 3dPrintApp/Utility/TreeViewItemBase.vb create mode 100644 3dPrintApp/ViewModel/MaterialVM.vb create mode 100644 3dPrintApp/ViewModel/Print3dLayerVM.vb create mode 100644 3dPrintApp/ViewModel/Print3dPartVM.vb create mode 100644 3dPrintApp/ViewPanel/ViewPanelV.xaml create mode 100644 3dPrintApp/ViewPanel/ViewPanelV.xaml.vb create mode 100644 3dPrintApp/ViewPanel/ViewPanelVM.vb create mode 100644 3dPrintApp/packages.config diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ab848d9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,330 @@ +# ---> VisualStudio +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# ---> C Sharp +# Build Folders (you can keep bin if you'd like, to store dlls and pdbs) +[Bb]in/ +[Oo]bj/ + +# mstest test results +TestResults + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +x64/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.log +*.vspscc +*.vssscc +.builds + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper* + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Publish Web Output +*.Publish.xml + +# NuGet Packages Directory +packages + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +[Bb]in +[Oo]bj +sql +TestResults +[Tt]est[Rr]esult* +*.Cache +ClientBin +[Ss]tyle[Cc]op.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + +.ionide/symbolCache.db diff --git a/3dPrintApp.sln b/3dPrintApp.sln new file mode 100644 index 0000000..da87235 --- /dev/null +++ b/3dPrintApp.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32002.261 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "3dPrintApp", "3dPrintApp/3dPrintApp.vbproj", "{BCDE0368-2C69-4948-8723-D0FE71417986}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BCDE0368-2C69-4948-8723-D0FE71417986}.Debug|x64.ActiveCfg = Debug|x64 + {BCDE0368-2C69-4948-8723-D0FE71417986}.Debug|x64.Build.0 = Debug|x64 + {BCDE0368-2C69-4948-8723-D0FE71417986}.Release|x64.ActiveCfg = Release|x64 + {BCDE0368-2C69-4948-8723-D0FE71417986}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {81E51533-B864-460A-ABD4-ADD1566CCDE0} + EndGlobalSection +EndGlobal diff --git a/3dPrintApp/3dPrintApp.sln b/3dPrintApp/3dPrintApp.sln new file mode 100644 index 0000000..7844821 --- /dev/null +++ b/3dPrintApp/3dPrintApp.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32002.261 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "3dPrintApp", "3dPrintApp.vbproj", "{BCDE0368-2C69-4948-8723-D0FE71417986}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BCDE0368-2C69-4948-8723-D0FE71417986}.Debug|x64.ActiveCfg = Debug|x64 + {BCDE0368-2C69-4948-8723-D0FE71417986}.Debug|x64.Build.0 = Debug|x64 + {BCDE0368-2C69-4948-8723-D0FE71417986}.Release|x64.ActiveCfg = Release|x64 + {BCDE0368-2C69-4948-8723-D0FE71417986}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {81E51533-B864-460A-ABD4-ADD1566CCDE0} + EndGlobalSection +EndGlobal diff --git a/3dPrintApp/3dPrintApp.vbproj b/3dPrintApp/3dPrintApp.vbproj new file mode 100644 index 0000000..d7c80ad --- /dev/null +++ b/3dPrintApp/3dPrintApp.vbproj @@ -0,0 +1,336 @@ + + + + Debug + AnyCPU + {BCDE0368-2C69-4948-8723-D0FE71417986} + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{F184B08F-C81C-45F6-A57F-5ABD9991F28F} + WinExe + _3dPrintApp + 3dPrintApp + v4.7.2 + Custom + true + true + + + On + + + Binary + + + Off + + + On + + + true + true + true + bin\x64\Debug\ + 3dPrintApp.xml + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314 + full + x64 + true + + + true + bin\x64\Release\ + 3dPrintApp.xml + true + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314 + pdbonly + x64 + true + + + + ..\..\EgtProg\DllD32\EgtUILib.dll + + + ..\..\EgtProg\DllD32\EgtWPFLib5.dll + + + packages\Ionic.Zip.1.9.1.8\lib\Ionic.Zip.dll + + + + + + + + + + + 4.0 + + + + + + + + + + MSBuild:Compile + Designer + + + + + + + + + + + + CurrLayerSliderV.xaml + + + + InstrumentPanelV.xaml + + + + LeftPanelV.xaml + + + + MachinePanelV.xaml + + + + ProjectV.xaml + + + + ProjManagerV.xaml + + + + + SceneHostV.xaml + + + SecondaryWindowV.xaml + + + + ShowPanelV.xaml + + + Printing3DPanelV.xaml + + + + + + StatusBarV.xaml + + + TopPanelV.xaml + + + + + Dictionary.xaml + + + + + + + + + ViewPanelV.xaml + + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + Application.xaml + Code + + + MainWindow.xaml + Code + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + + + + + + + + + + + + + + + + + + + + + + + MainWindowV.xaml + + + + Code + + + Microsoft.VisualBasic.WPF.MyExtension + 1.0.0.0 + + + True + True + Resources.resx + + + True + Settings.settings + True + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + + + SettingsSingleFileGenerator + Settings.Designer.vb + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IF "$(PlatformName)"=="x64" IF "$(ConfigurationName)" == "Release" copy $(TargetPath) c:\EgtProg\3dPrintApp\3dPrintAppR64.exe +IF "$(PlatformName)"=="x64" IF "$(ConfigurationName)" == "Debug" copy $(TargetPath) c:\EgtProg\3dPrintApp\3dPrintAppD64.exe + + \ No newline at end of file diff --git a/3dPrintApp/AboutBoxWindow/AboutBoxV.xaml b/3dPrintApp/AboutBoxWindow/AboutBoxV.xaml new file mode 100644 index 0000000..1e807e4 --- /dev/null +++ b/3dPrintApp/AboutBoxWindow/AboutBoxV.xaml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3dPrintApp/LeftPanel/LeftPanelV.xaml.vb b/3dPrintApp/LeftPanel/LeftPanelV.xaml.vb new file mode 100644 index 0000000..919aa0c --- /dev/null +++ b/3dPrintApp/LeftPanel/LeftPanelV.xaml.vb @@ -0,0 +1,3 @@ +Public Class LeftPanelV + +End Class diff --git a/3dPrintApp/LeftPanel/LeftPanelVM.vb b/3dPrintApp/LeftPanel/LeftPanelVM.vb new file mode 100644 index 0000000..ccd634e --- /dev/null +++ b/3dPrintApp/LeftPanel/LeftPanelVM.vb @@ -0,0 +1,25 @@ +Imports System.Globalization + +Public Class LeftPanelVM + +End Class + +Public Class CenterToolTipConverter + Implements IMultiValueConverter + + Public Function Convert(ByVal values As Object(), ByVal targetType As Type, ByVal parameter As Object, ByVal culture As CultureInfo) As Object Implements IMultiValueConverter.Convert + For Each value In values + If TypeOf (value) IsNot Double Then + Return Double.NaN + End If + Next + Dim placementTargetHeight As Double = CDbl(values(0)) + Dim toolTipHeight As Double = CDbl(values(1)) + Return (placementTargetHeight / 2.0) - (toolTipHeight / 2.0) + End Function + + Public Function ConvertBack(ByVal value As Object, ByVal targetTypes As Type(), ByVal parameter As Object, ByVal culture As CultureInfo) As Object() Implements IMultiValueConverter.ConvertBack + Throw New NotSupportedException() + End Function + +End Class diff --git a/3dPrintApp/MachinePanel/MachinePanelV.xaml b/3dPrintApp/MachinePanel/MachinePanelV.xaml new file mode 100644 index 0000000..a963f60 --- /dev/null +++ b/3dPrintApp/MachinePanel/MachinePanelV.xaml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + diff --git a/3dPrintApp/MachinePanel/MachinePanelV.xaml.vb b/3dPrintApp/MachinePanel/MachinePanelV.xaml.vb new file mode 100644 index 0000000..83a5832 --- /dev/null +++ b/3dPrintApp/MachinePanel/MachinePanelV.xaml.vb @@ -0,0 +1,3 @@ +Public Class MachinePanelV + +End Class diff --git a/3dPrintApp/MachinePanel/MachinePanelVM.vb b/3dPrintApp/MachinePanel/MachinePanelVM.vb new file mode 100644 index 0000000..5aba00d --- /dev/null +++ b/3dPrintApp/MachinePanel/MachinePanelVM.vb @@ -0,0 +1,168 @@ +Imports System.Collections.ObjectModel +Imports System.IO +Imports EgtUILib +Imports EgtWPFLib5 + +Public Class MachinePanelVM + Inherits EgtWPFLib5.MachinePanelVM + +#Region "FIELDS & PROPERTIES" + + ' Radice del direttorio delle macchine + Private m_sMachinesRoot As String + + ' Macchina correntemente selezionata e quindi attiva + Private m_SelectedMachine As Machine = Nothing + Public Overrides Property SelectedMachine As Machine + Get + Return m_SelectedMachine + End Get + Set(value As Machine) + If value IsNot m_SelectedMachine Then + ' imposto macchina in DbGeometrico + If EgtSetCurrMachine(value.Name) Then + m_SelectedMachine = value + End If + ' Salvo impostazione macchina corrente + SaveCurrentMachine() + NotifyPropertyChanged(NameOf(SelectedMachine)) + ' inizializzo la macchina selezionata come macchina corrente + InitCurrentMachine(Map.refMainWindowVM.MainWindowM.sMachinesRoot, value.Name) + ' aggiorno nome macchina in statusbar + Map.refMyStatusBarVM.RefreshMachName() + End If + End Set + End Property + + Private m_MachPanel_IsEnabled As Boolean = True + Public Property MachPanel_IsEnabled As Boolean + Get + Return m_MachPanel_IsEnabled + End Get + Set(value As Boolean) + m_MachPanel_IsEnabled = value + NotifyPropertyChanged("MachPanel_IsEnabled") + End Set + End Property + + Private m_BeamTable_Visibility As Visibility + Public ReadOnly Property BeamTable_Visibility As Visibility + Get + Return m_BeamTable_Visibility + End Get + End Property + + Private m_WallTable_Visibility As Visibility + Public ReadOnly Property WallTable_Visibility As Visibility + Get + Return m_WallTable_Visibility + End Get + End Property + +#Region "Messages" + + Public ReadOnly Property ToolDBMsg As String + Get + Return EgtMsg(MSG_MACHINEPAGEUC + 6) + End Get + End Property + Public ReadOnly Property MachiningDbMsg As String + Get + Return EgtMsg(MSG_MACHINEPAGEUC + 7) + End Get + End Property + Public ReadOnly Property SetUpMsg As String + Get + Return EgtMsg(MSG_ALARMSPAGEUC + 33) + End Get + End Property + +#End Region ' Messages + +#Region "ToolTip" + + Public ReadOnly Property ToolDBToolTip As String + Get + Return EgtMsg(5003) + End Get + End Property + Public ReadOnly Property MachiningDbToolTip As String + Get + Return EgtMsg(5004) + End Get + End Property + Public ReadOnly Property SetUpToolTip As String + Get + Return EgtMsg(31501) + End Get + End Property + +#End Region ' ToolTip + + ' Definizione comandi + Private m_cmdBeamTable As ICommand + Private m_cmdWallTable As ICommand + +#End Region 'FIELDS & PROPERTIES + +#Region "CONSTRUCTOR" + + Sub New() + ' Creo riferimento a questa classe in Map + Map.SetRefMachinePanelVM(Me) + ' recupero cartella radice delle macchine + m_sMachinesRoot = Map.refMainWindowVM.MainWindowM.sMachinesRoot + ' Carica macchine da cartella delle macchine + MyMachine.MachineListInit(m_sMachinesRoot, MachineList) + End Sub + +#End Region ' CONSTRUCTOR + +#Region "METHODS" + + Friend Sub LoadCurrentMachine() + If MachineList.Count = 0 Then Return + Dim CurrMachine As Machine = Nothing + Dim CurrMachineName As String = String.Empty + GetMainPrivateProfileString(S_MACH, K_CURRMACH, String.Empty, CurrMachineName) + Dim bFound As Boolean = False + If Not String.IsNullOrEmpty(CurrMachineName) Then + For Each Mach In MachineList + If Mach.Name = CurrMachineName Then + bFound = True + CurrMachine = Mach + Exit For + End If + Next + End If + If Not bFound And MachineList.Count > 0 Then + CurrMachine = MachineList(0) + End If + If Not IsNothing(CurrMachine) Then + If EgtSetCurrMachine(CurrMachine.Name) Then + SelectedMachine = CurrMachine + End If + End If + End Sub + + Friend Sub SaveCurrentMachine() + If IsNothing(m_SelectedMachine) Then Return + WriteMainPrivateProfileString(S_MACH, K_CURRMACH, SelectedMachine.Name) + End Sub + + Friend Sub UpdateCurrentMachine() + 'EgtSetCurrentContext(IniFile.m_ProjectSceneContext) + Dim sMachName As String = String.Empty + If EgtGetCurrMachineName(sMachName) Then + For Each Mach In MachineList + If Mach.Name = sMachName Then + SelectedMachine = Mach + Exit For + End If + Next + End If + End Sub + +#End Region + +End Class diff --git a/3dPrintApp/MainWindow.xaml b/3dPrintApp/MainWindow.xaml new file mode 100644 index 0000000..6d76522 --- /dev/null +++ b/3dPrintApp/MainWindow.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/3dPrintApp/MainWindow.xaml.vb b/3dPrintApp/MainWindow.xaml.vb new file mode 100644 index 0000000..922a5de --- /dev/null +++ b/3dPrintApp/MainWindow.xaml.vb @@ -0,0 +1,3 @@ +Class MainWindow + +End Class diff --git a/3dPrintApp/MainWindow/MainWindowM.vb b/3dPrintApp/MainWindow/MainWindowM.vb new file mode 100644 index 0000000..b8daf65 --- /dev/null +++ b/3dPrintApp/MainWindow/MainWindowM.vb @@ -0,0 +1,347 @@ +Imports System.Threading +Imports System.Math +Imports EgtUILib +Imports EgtWPFLib5 + +Public Class MainWindowM + +#Region "FIELDS" + + ' massimo numero di istanze del programma ammesse + Const MAX_INST As Integer = 32 + + Private m_sDataRoot As String = String.Empty + Friend ReadOnly Property sDataRoot As String + Get + Return m_sDataRoot + End Get + End Property + + Private m_sDataDir As String = String.Empty + Friend ReadOnly Property sDataDir As String + Get + Return m_sDataDir + End Get + End Property + + Private m_sConfigDir As String = String.Empty + Public ReadOnly Property sConfigDir As String + Get + Return m_sConfigDir + End Get + End Property + + Private m_nDebug As Integer = 0 + + Private m_objMutex As Mutex + + Private m_bFirstInstance As Boolean = False + Friend ReadOnly Property bFirstInstance As Boolean + Get + Return m_bFirstInstance + End Get + End Property + + Private m_nInstance As Integer = 0 + Friend ReadOnly Property nInstance As Integer + Get + Return m_nInstance + End Get + End Property + + Private m_nUserLevel As Integer = 1 + Friend ReadOnly Property nUserLevel As Integer + Get + Return m_nUserLevel + End Get + End Property + + Private m_nKeyLevel As Integer = 0 + Friend ReadOnly Property nKeyLevel As Integer + Get + Return m_nKeyLevel + End Get + End Property + + Private m_nKeyOptions As UInteger = 0 + Friend ReadOnly Property nKeyOptions As Integer + Get + Return m_nKeyOptions + End Get + End Property + + Private m_bAutoNestOption As Boolean = False + Friend ReadOnly Property AutoNestOption As Boolean + Get + Return m_bAutoNestOption + End Get + End Property + + Friend ReadOnly Property sVersion As String + Get + Return My.Application.Info.Version.Major.ToString() & "." & + My.Application.Info.Version.Minor.ToString() & + (ChrW(97 - 1 + My.Application.Info.Version.Build)).ToString() & + My.Application.Info.Version.Revision.ToString() + End Get + End Property + + Private m_s3dPrintingDir As String + Friend ReadOnly Property s3dPrintingDir As String + Get + Return m_s3dPrintingDir + End Get + End Property + Private m_sMachiningsDir As String + Friend ReadOnly Property sMachiningsDir As String + Get + Return m_sMachiningsDir + End Get + End Property + Private m_sMaterialsDir As String + Friend ReadOnly Property sMaterialsDir As String + Get + Return m_sMaterialsDir + End Get + End Property + + Private m_sTempDir As String + Friend ReadOnly Property sTempDir As String + Get + Return m_sTempDir + End Get + End Property + Private m_sMachinesRoot As String + Friend ReadOnly Property sMachinesRoot As String + Get + Return m_sMachinesRoot + End Get + End Property + Private m_sToolMakersDir As String + Friend ReadOnly Property sToolMakersDir As String + Get + Return m_sToolMakersDir + End Get + End Property + Private m_sResourcesRoot As String + Friend ReadOnly Property sResourcesRoot As String + Get + Return m_sResourcesRoot + End Get + End Property + Private m_sLogFile As String + Friend ReadOnly Property sLogFile As String + Get + Return m_sLogFile + End Get + End Property + +#End Region ' FIELDS + +#Region "CONSTRUCTOR" + + Sub New() + InitializeEgtEnvironment() + End Sub + +#End Region ' CONSTRUCTOR + +#Region "METHODS" + + Private Sub InitializeEgtEnvironment() + '' Abilito drag and drop + 'Me.AllowDrop = True + ' Impostazione path radice per i dati + m_sDataRoot = System.AppDomain.CurrentDomain.BaseDirectory + If EgtUILib.GetPrivateProfileString(S_DATA, K_DATAROOT, "", m_sDataRoot, m_sDataRoot & "\" & DAT_FILE_NAME) = 0 Then + m_sDataRoot = System.AppDomain.CurrentDomain.BaseDirectory + End If + ' Impostazione direttorio di configurazione + m_sConfigDir = m_sDataRoot & "\" & CONF_DIR + ' Impostazione direttorio per file temporanei + m_sTempDir = m_sDataRoot & "\" & TEMP_DIR + ' Impostazione path Ini file + IniFile.m_sIniFile = m_sConfigDir & "\" & INI_FILE_NAME + ' Impostazione path resources dir + m_sResourcesRoot = m_sDataRoot & "\" & RES_DIR + ' Impostazione path machinings e materials dir + m_sMachiningsDir = m_sDataRoot & "\" & MACHININGS_DIR + m_sMaterialsDir = m_sDataRoot & "\" & MATERIALS_DIR + ' Impostazione direttorio per le macchine + If GetMainPrivateProfileString(S_MACH, K_MACHINESDIR, "", m_sMachinesRoot) = 0 Then + m_sMachinesRoot = m_sDataRoot & "\" & MACHINES_DFL_DIR + End If + ' Impostazione direttorio per toolmakers + If GetMainPrivateProfileString(S_MACH, K_TOOLMAKERSDIR, "", m_sToolMakersDir) = 0 Then + m_sToolMakersDir = m_sDataRoot & "\" & TOOLMAKERS_DFL_DIR + End If + ' Impostazione direttorio 3dPrinting + If GetMainPrivateProfileString(S_PRINTING3D, K_3PRNBASEDIR, "", m_s3dPrintingDir) = 0 Then + m_s3dPrintingDir = m_sDataRoot & "\" & _3DPRINTING_DIR + End If + ' Verifico indice di istanza + ManageInstance() + ' Imposto tipo di chiave + EgtSetLockType(KEY_TYPE.HW) + ' Leggo e imposto chiave di protezione + Dim sLicFileName As String = String.Empty + GetMainPrivateProfileString(S_GENERAL, K_LICENCE, LIC_FILE_NAME, sLicFileName) + Dim sLicFile As String = m_sConfigDir & "\" & sLicFileName + Dim sKey As String = String.Empty + EgtUILib.GetPrivateProfileString(S_LICENCE, K_KEY, "", sKey, sLicFile) + EgtSetKey(sKey) + Dim sNestKey As String = "" + EgtUILib.GetPrivateProfileString(S_LICENCE, K_NESTKEY, "", sNestKey, sLicFile) + 'EgtSetNestKey(sNestKey) + ' Verifico abilitazione nesting automatico + m_bAutoNestOption = Not String.IsNullOrWhiteSpace(sNestKey) + ' Recupero livello e opzioni della chiave + Dim bKey As Boolean = EgtGetKeyLevel(3279, 2405, 1, m_nKeyLevel) And + EgtGetKeyOptions(3279, 2405, 1, m_nKeyOptions) + ' Inizializzazione generale di EgtInterface + m_nDebug = GetMainPrivateProfileInt(S_GENERAL, K_DEBUG, 0) + m_sLogFile = m_sTempDir & "\" & GENLOG_FILE_NAME.Replace("#", m_nInstance.ToString()) + Dim sLogMsg As String = "User " & Environment.MachineName & "\" & Environment.UserName & " (" & m_nInstance.ToString() & ")" & vbLf & + My.Application.Info.Title.ToString() & " ver. " & + My.Application.Info.Version.Major.ToString() & + "." & My.Application.Info.Version.Minor.ToString() & + (ChrW(97 - 1 + My.Application.Info.Version.Build)).ToString() & + My.Application.Info.Version.Revision.ToString() + EgtInit(m_nDebug, m_sLogFile, sLogMsg) + EgtSetTempDir(m_sTempDir) + EgtSetIniFile(IniFile.m_sIniFile) + ' Leggo direttorio dei messaggi (se manca uso direttorio di configurazione) + Dim sMsgDir As String = String.Empty + If GetMainPrivateProfileString(S_GENERAL, K_MESSAGESDIR, "", sMsgDir) = 0 Then + sMsgDir = m_sConfigDir + End If + ' Leggo lingua corrente + Dim sLanguage As String = String.Empty + GetMainPrivateProfileString(S_GENERAL, K_MESSAGES, "", sLanguage) + ' Recupero nome file dei messaggi della lingua corrente + Dim sMsgName As String = "EgalTechIta.txt" + Dim nIndex As Integer = 1 + While True + Dim ReadLanguage As Language = GetMainPrivateProfileLanguage(S_LANGUAGES, K_LANGUAGE & nIndex) + If IsNothing(ReadLanguage) Then Exit While + If String.Compare(ReadLanguage.Name, sLanguage, True) = 0 Then + sMsgName = ReadLanguage.FilePath + Exit While + End If + nIndex += 1 + End While + ' Leggo file messaggi + Dim sMsgFilePath As String = sMsgDir & "\" & sMsgName + If Not EgtLoadMessages(sMsgFilePath) Then + EgtOutLog("Error in EgtLoadMessages") + End If + ' Leggo e imposto unità di misura per interfaccia utente + EgtSetUiUnits(GetMainPrivateProfileInt(S_SCENE, K_MMUNITS, 1) <> 0) + ' Leggo e imposto livello utilizzatore + m_nUserLevel = Math.Min(m_nKeyLevel, GetMainPrivateProfileInt(S_GENERAL, K_USERLEVEL, 1)) + ' Imposto dir font Nfe e font default + Dim sNfeDir As String = String.Empty + GetMainPrivateProfileString(S_GEOMDB, K_NFEFONTDIR, "", sNfeDir) + Dim sDefFont As String = String.Empty + GetMainPrivateProfileString(S_GEOMDB, K_DEFAULTFONT, "", sDefFont) + EgtSetFont(sNfeDir, sDefFont) + ' imposto dir di default per libreria Lua e lancio libreria di base + Dim sLuaLibsDir As String = String.Empty + GetMainPrivateProfileString(S_LUA, K_LIBSDIR, "", sLuaLibsDir) + EgtSetLuaLibs(sLuaLibsDir) + Dim sLuaBaseLib As String = String.Empty + GetMainPrivateProfileString(S_LUA, K_BASELIB, "EgtBase", sLuaBaseLib) + EgtLuaRequire(sLuaBaseLib) + ' Info su opzioni chiave + EgtOutLog("KeyOptions : " & bKey.ToString() & " " & m_nKeyOptions.ToString()) + End Sub + + Private Sub ManageInstance() + Dim bCreated As Boolean + Try + m_objMutex = New Mutex(False, "Global\3dPrintApp", bCreated) + Catch + bCreated = False + End Try + m_bFirstInstance = bCreated + If bCreated Then + ' Prima istanza + m_nInstance = 1 + ' Aggiorno stato istanze attive + WriteMainPrivateProfileString(S_GENERAL, K_VIEWOPTIM_INSTANCES, m_nInstance.ToString()) + Else + ' Leggo il massimo numero di istanze ammesse + Dim nMaxInst As Integer = GetMaxInstances() + ' Cerco il primo indice di istanza libero + Dim nTmp As Integer = GetMainPrivateProfileInt(S_GENERAL, K_VIEWOPTIM_INSTANCES, 0) + m_nInstance = 1 + Dim nMask As Integer = 1 + While (nTmp And nMask) <> 0 And m_nInstance <= MAX_INST + m_nInstance += 1 + nMask *= 2 + End While + ' Se l'indice supera il massimo + If m_nInstance > nMaxInst Then + ' porto in primo piano la prima istanza + Dim bFound As Boolean = False + ' processi del programma a 32 bit + Dim localProc As Process() = Process.GetProcessesByName("3dPrintAppR32") + For Each p As Process In localProc + If p.Id <> Process.GetCurrentProcess().Id Then + bFound = True + ShowWindow(p.MainWindowHandle, 1) + Exit For + End If + Next + ' se non trovati processi a 32 bit provo a 64 bit + If Not bFound Then + localProc = Process.GetProcessesByName("3dPrintAppR64") + For Each p As Process In localProc + If p.Id <> Process.GetCurrentProcess().Id Then + bFound = True + ShowWindow(p.MainWindowHandle, SW.RESTORE) + Exit For + End If + Next + End If + ' esco dal programma + End + End If + ' Aggiorno stato istanze attive + nTmp += (1 << (m_nInstance - 1)) + WriteMainPrivateProfileString(S_GENERAL, K_VIEWOPTIM_INSTANCES, nTmp.ToString()) + End If + End Sub + + Friend Function GetKeyOption(nKeyOpt As KEY_OPT) As Boolean + Return ((m_nKeyOptions And nKeyOpt) <> 0) + End Function + + Friend Function GetMaxInstances() As Integer + ' Leggo il massimo numero di istanze ammesse + Dim nMaxInst As Integer = GetMainPrivateProfileInt(S_GENERAL, K_MAXINST, 1) + Return 1 ' Max(1, Min(nMaxInst, MAX_INST)) + End Function + + Friend Function GetMaxCamInstances() As Integer + ' Leggo il massimo numero di istanze ammesse + Dim nMaxInst As Integer = GetMainPrivateProfileInt(S_GENERAL, K_MAXCAMINST, 1) + Return Max(1, Min(nMaxInst, MAX_INST)) + End Function + + Friend Sub Close() + ' Terminazione generale di EgtInterface + EgtExit() + ' Aggiorno istanze usate + m_objMutex.WaitOne(1000) + Dim nTmp As Integer = GetMainPrivateProfileInt(S_GENERAL, K_VIEWOPTIM_INSTANCES, 0) + nTmp -= (1 << (m_nInstance - 1)) + WriteMainPrivateProfileString(S_GENERAL, K_VIEWOPTIM_INSTANCES, nTmp.ToString()) + m_objMutex.ReleaseMutex() + ' Rilascio mutex + If Not IsNothing(m_objMutex) Then m_objMutex.Close() + End Sub + +#End Region ' METHODS + +End Class diff --git a/3dPrintApp/MainWindow/MainWindowV.xaml b/3dPrintApp/MainWindow/MainWindowV.xaml new file mode 100644 index 0000000..a782b35 --- /dev/null +++ b/3dPrintApp/MainWindow/MainWindowV.xaml @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/3dPrintApp/MainWindow/MainWindowV.xaml.vb b/3dPrintApp/MainWindow/MainWindowV.xaml.vb new file mode 100644 index 0000000..053ef6f --- /dev/null +++ b/3dPrintApp/MainWindow/MainWindowV.xaml.vb @@ -0,0 +1,63 @@ +Imports EgtWPFLib5 +Imports EgtUILib +Imports System.Windows.Interop + +Class MainWindowV + + Private m_MainWindowVM As MainWindowVM + Private m_SceneHostWnd As SecondaryWindowV + +#Region "CONSTRUCTOR" + + Sub New() + m_MainWindowVM = New MainWindowVM + ' Funzione che interpreta l'xaml + InitializeComponent() + Me.DataContext = m_MainWindowVM + ' creo finestra della scena + AddHandler Me.Loaded, AddressOf MainWindowV_Loaded + AddHandler Me.Closing, AddressOf MainWindowV_Closing + AddHandler Me.KeyDown, AddressOf MainWindowV_KeyDown + End Sub + +#End Region ' CONSTRUCTOR + +#Region "EVENTS" + + Private Sub MainWindowV_Loaded(sender As Object, e As RoutedEventArgs) + ' Carico e imposto posizione finestra + WinPosFromIniToWindow(S_GENERAL, K_WINPLACE, Me) + ' Recupero e imposto handle finestra principale + Dim hMainWnd As IntPtr = New WindowInteropHelper(Application.Current.MainWindow).Handle + EgtSetMainWindowHandle(hMainWnd) + End Sub + + Private Sub MainWindowV_Closing(sender As Object, e As System.ComponentModel.CancelEventArgs) + If (Keyboard.Modifiers And ModifierKeys.Alt) = ModifierKeys.Alt OrElse Keyboard.IsKeyDown(Key.F4) Then + e.Cancel = True + Return + End If + ' Salvo posizione finestra (se non minimizzata) + If WindowState <> WindowState.Minimized Then + WinPosFromWindowToIni(Me, S_GENERAL, K_WINPLACE) + End If + End Sub + + Private Sub MainWindowV_KeyDown(sender As Object, e As KeyEventArgs) + 'm_MainWindowVM.KeyDown(e.Key) + End Sub + + Private Sub MainWindowV_Drop(sender As Object, e As DragEventArgs) + ' Se drag di file + If e.Data.GetDataPresent(DataFormats.FileDrop) Then + ' Attivo il programma + Me.Activate() + ' Recupero l'array di stringhe con i nomi del file + Dim sFiles() As String = DirectCast(e.Data.GetData(DataFormats.FileDrop), String()) + + End If + End Sub + +#End Region ' EVENTS + +End Class diff --git a/3dPrintApp/MainWindow/MainWindowVM.vb b/3dPrintApp/MainWindow/MainWindowVM.vb new file mode 100644 index 0000000..c78cfd4 --- /dev/null +++ b/3dPrintApp/MainWindow/MainWindowVM.vb @@ -0,0 +1,280 @@ +Imports EgtUILib +Imports EgtWPFLib5 +Imports System.IO +Imports System.Threading +Imports System.Windows.Threading + +Public Class MainWindowVM + Inherits VMBase + + Private m_SupervisorCommThread As Thread + Private m_Supervisor_Timer As New DispatcherTimer + + ' Riferimento al Model della MainWindow + Private m_MainWindowM As MainWindowM + Friend ReadOnly Property MainWindowM As MainWindowM + Get + Return m_MainWindowM + End Get + End Property + + ' Variabile che indica che il programma è stato avviato correttamente (sia la mappa che l'ambiente Egt) + Private m_bInitStatus As Boolean + Friend ReadOnly Property bInitStatus As Boolean + Get + Return m_bInitStatus + End Get + End Property + + ' Titolo + Private m_Title As String = "" + Public ReadOnly Property Title As String + Get + Return m_Title + End Get + End Property + + ' proprietà che seleziona la giusta pagina del TabControl + Public Property nSelTabPage As Integer + Get + ' Return If(IsNothing(Map.refMainMenuVM.SelPage) OrElse Map.refMainMenuVM.SelPage = -1 OrElse Map.refMainMenuVM.SelPage = Pages.VIEW OrElse Map.refMainMenuVM.SelPage = Pages.MACHINING, 0, 1) + End Get + Set(value As Integer) + End Set + End Property + + Private m_MachinePanelVM As MachinePanelVM + Public ReadOnly Property MachinePanelVM As MachinePanelVM + Get + Return m_MachinePanelVM + End Get + End Property + + 'Friend m_SupervisorStop As Boolean = False + 'Private BlockedWnd As BlockedWndV + + ' definizione comandi + Private m_cmdAboutBox As ICommand + Private m_cmdCloseApplication As ICommand + +#Region "CONSTRUCTOR" + + Sub New() + ' Avvio l'inizializzazione della mappa passandogli il riferimento al MainWindowVM + Map.BeginInit(Me) + ' Creo Model della MainWindow + m_MainWindowM = New MainWindowM + ' inizializzo machine panel + m_MachinePanelVM = New MachinePanelVM + ' inizializzo contatore per blocco da supervisore + m_Supervisor_Timer.Interval = TimeSpan.FromMilliseconds(500) + ' AddHandler m_Supervisor_Timer.Tick, AddressOf SupervisorTimer_Tick + m_Supervisor_Timer.Start() + End Sub + +#End Region ' CONSTRUCTOR + + '#Region "METHODS" + + ' Friend Sub SetTitle(sTitle As String) + ' m_Title = sTitle + ' NotifyPropertyChanged(NameOf(Title)) + ' End Sub + ' Public Sub UpdateTitle() + ' m_Title = "" + ' Select Case Map.refMainMenuVM.SelPage + ' Case Pages.VIEW + ' If Not IsNothing(Map.refProjManagerVM.CurrProj) Then + ' If Map.refProjManagerVM.CurrProj.bIsNew Then m_Title = "New - " + ' m_Title &= Map.refProjManagerVM.CurrProj.nProjId.ToString("0000") & " - " & Map.refProjManagerVM.CurrProj.sBTLFileName + ' End If + ' Case Pages.MACHINING + ' If Not IsNothing(Map.refProdManagerVM.CurrProd) Then + ' If Map.refProdManagerVM.CurrProd.bIsNew Then m_Title = "New - " + ' m_Title &= Map.refProdManagerVM.CurrProd.nProdId.ToString("0000") & " - " & Map.refProdManagerVM.CurrProd.sBTLFileName + ' End If + ' Case Pages.CONFIG + ' m_Title = "Configuration Page" + ' End Select + ' m_Title &= " - EgtBEAMWALL" + ' NotifyPropertyChanged(NameOf(Title)) + ' End Sub + + ' Friend Sub ContentRendered() + ' DbControllers.Init() + ' '' chiamata a caso su Db per inizializzarlo + ' DbControllers.m_ProjController.FindByProjDbId(0) + ' ' Verifico che l'inizializzazione di tutte le parti del programma sia andata a buon fine + ' If Map.EndInit() Then + ' m_bInitStatus = True + ' ' altrimenti chiudo il programma + ' Else + ' m_bInitStatus = False + ' End If + ' ' Aggiorno visualizzazione unità di misura + ' 'Map.refStatusBarVM.SetMeasureUnit(If(EgtUiUnitsAreMM(), MeasureUnitOpt.MM, MeasureUnitOpt.INCH)) + ' ' imposto MainWindow per finestra di Loading + ' LoadingWndHelper.SetMainWindow(Application.Current.MainWindow) + ' ' leggo riga di comando + ' Dim nCommandType As Integer = 0 + ' Dim nPage As Pages = Pages.VIEW + ' Dim nProdId As Integer = 0 + ' If ProcessCommandLine(nCommandType, nPage, nProdId) Then + ' Select Case nCommandType + ' Case 1 + ' Map.refProdManagerVM.SetCurrProd(nProdId) + ' Case 2 + ' ' pagina gia' impostata nella variabile + ' End Select + ' Else + ' ' setto il primo file dalla lista degli MRU come progetto corrente da aprire + ' Dim sLastProjectPath As String = String.Empty + ' GetMainPrivateProfileString(S_MRUPROJFILES, K_FILE & "1", String.Empty, sLastProjectPath) + ' If Not String.IsNullOrWhiteSpace(sLastProjectPath) AndAlso File.Exists(sLastProjectPath) Then + ' ' ricavo l'Id e il progetto associato per l'apertura di quest'ultimo + ' Dim PjId As Integer = 0 + ' Dim sPjId As String = Path.GetFileNameWithoutExtension(sLastProjectPath) + ' Integer.TryParse(sPjId, PjId) + ' Map.refProjManagerVM.SetCurrProj(PjId) + ' End If + ' End If + ' ' seleziono pagina da aprire + ' Map.refMainMenuVM.SelPage = nPage + + ' ' inizializzo thread di aggiornamento e comunicazione con DB + ' ' creo thread gestione macchina + ' m_SupervisorCommThread = New Thread(Sub() + ' SupervisorCommThread.SupervisorCommThreadFunction() + ' End Sub) + ' m_SupervisorCommThread.SetApartmentState(ApartmentState.STA) + ' ' avvio thread di gestione della macchina che avvia la connessione + ' m_SupervisorCommThread.Start() + + ' End Sub + + ' Friend Function ProcessCommandLine(ByRef nCommandType As Integer, ByRef nPage As Pages, ByRef nProdId As Integer) As Boolean + ' ' Se non ci sono veri parametri su linea di comando, esco (il primo è sempre il nome del programma) + ' If Environment.GetCommandLineArgs.Count() <= 1 Then Return False + ' ' Recupero primo parametro che dovrebbe essere il tipo di modalita' riga di comando + ' Dim sFile As String = Environment.GetCommandLineArgs(1) + ' If String.IsNullOrWhiteSpace(sFile) OrElse Not Integer.TryParse(sFile, nCommandType) OrElse nCommandType <= 0 Then Return False + ' Select Case nCommandType + ' Case 1 ' apri progetto in ottimizzatore + ' ' recupero secondo parametro + ' Dim sProdId As String = Environment.GetCommandLineArgs(2) + ' If Not Integer.TryParse(sProdId, nProdId) OrElse nProdId <= 0 Then Return False + ' nPage = Pages.MACHINING + ' Return True + ' Case 2 ' apri pagina specifica senza progetto specifico + ' ' recupero secondo parametro + ' Dim sPage As String = Environment.GetCommandLineArgs(2) + ' If Not Integer.TryParse(sPage, nPage) OrElse (nPage <> Pages.VIEW AndAlso nPage <> Pages.MACHINING) Then Return False + ' Return True + ' End Select + ' Return False + ' End Function + + ' Friend Sub KeyDown(PressedKey As Key) + ' ' Con ESC esco dall'azione corrente + ' If PressedKey = Key.Escape Then + ' ' se in modifica L250 + ' If Map.refFreeContourManagerVM.bIsActive Then + ' ' se in modifica testo angolo di inclinazione + ' If Map.refFreeContourManagerVM.bIsModifyingTextAngle Then + ' Map.refFreeContourManagerVM.CloseIsModifyingTextAngle(False) + ' End If + ' ' reset Azione corrente + ' Map.refSceneHostVM.MainController.ResetStatus() + ' Map.refFreeContourInputVM.ResetInputBox() + ' End If + ' ' se misura attiva, la disattivo + ' If Map.refInstrumentPanelVM.GetDistIsChecked Then + ' Map.refInstrumentPanelVM.SetGetDistance_IsChecked(False) + ' End If + ' ' se Reset Macchina è aperto + ' If (nSelTabPage = Pages.VIEW Or nSelTabPage = Pages.MACHINING) AndAlso Map.refCALCPanelVM.ChooseMachine_Visibility = Visibility.Visible Then + ' Map.refCALCPanelVM.CloseResetMachine() + ' End If + ' ' pulisco output + ' Map.refMyStatusBarVM.ClearOutputMessage() + ' End If + ' End Sub + + ' Friend m_ManagingSupervisorStop As Boolean = False + + ' Private Sub SupervisorTimer_Tick() + ' If SupervisorCommThread.bViewerOptimizerBlocked And Not m_ManagingSupervisorStop Then + ' m_ManagingSupervisorStop = True + ' BlockedWnd = New BlockedWndV(Application.Current.MainWindow, New BlockedWndVM) + ' BlockedWnd.ShowDialog() + ' ElseIf Not SupervisorCommThread.bViewerOptimizerBlocked And m_ManagingSupervisorStop Then + ' m_ManagingSupervisorStop = False + ' BlockedWnd.Close() + ' End If + ' End Sub + + '#End Region ' METHODS + + '#Region "COMMANDS" + + '#Region "AboutBoxCommand" + + ' ' Returns a command that manage the MainWindow_Unloaded command + ' Public ReadOnly Property AboutBoxCommand() As ICommand + ' Get + ' If m_cmdAboutBox Is Nothing Then + ' m_cmdAboutBox = New Command(AddressOf AboutBox) + ' End If + ' Return m_cmdAboutBox + ' End Get + ' End Property + + ' ' Manage the MainWindow_Unloaded event. This method is invoked by the cmdMainWindow_Unloaded. + ' Public Sub AboutBox(ByVal param As Object) + ' Dim AboutBoxWindow As New AboutBoxV + ' AboutBoxWindow.Owner = Application.Current.MainWindow + ' AboutBoxWindow.ShowDialog() + ' End Sub + + '#End Region ' AboutBoxCommand + + '#Region "CloseApplicationCommand" + + ' ' Returns a command that manage the MainWindow_Unloaded command + ' Public ReadOnly Property CloseApplicationCommand() As ICommand + ' Get + ' If m_cmdCloseApplication Is Nothing Then + ' m_cmdCloseApplication = New Command(AddressOf CloseApplication) + ' End If + ' Return m_cmdCloseApplication + ' End Get + ' End Property + + ' Manage the MainWindow_Unloaded event. This method is invoked by the cmdMainWindow_Unloaded. + Friend Sub CloseApplication() + If (Keyboard.Modifiers And ModifierKeys.Alt) = ModifierKeys.Alt OrElse Keyboard.IsKeyDown(Key.F4) Then + Return + End If + ' Gestisco eventuale file corrente modificato + Dim bOk As Boolean = True + 'bOk = ProjFileVM.VerifyProjectModification(Map.refProjManagerVM.CurrProj, ProjectType.PROJ) + ' se salvataggio annullato, rimango + If Not bOk Then Return + Dim bAllowClose As Boolean = Map.refSceneHostVM.MainController.ManageModified() + ' Salvo impostazione macchina corrente + 'Map.refMachinePanelVM.SaveCurrentMachine() + ' Se non confermata chiusura, esco + If Not bAllowClose Then Return + ' salvo modo di visualizzazione + WriteMainPrivateProfileString(S_SCENE, K_SHOWMODE, EgtGetShowMode().ToString) + ' Termino il Model + m_MainWindowM.Close() + ' Termino il programma + Application.Current.Shutdown() + End Sub + + '#End Region ' CloseApplicationCommand + + '#End Region ' COMMANDS + +End Class diff --git a/3dPrintApp/My Project/AssemblyInfo.vb b/3dPrintApp/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..f61215d --- /dev/null +++ b/3dPrintApp/My Project/AssemblyInfo.vb @@ -0,0 +1,59 @@ +Imports System +Imports System.Globalization +Imports System.Reflection +Imports System.Resources +Imports System.Runtime.InteropServices +Imports System.Windows + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + +'In order to begin building localizable applications, set +'CultureYouAreCodingWith in your .vbproj file +'inside a . For example, if you are using US english +'in your source files, set the to "en-US". Then uncomment the +'NeutralResourceLanguage attribute below. Update the "en-US" in the line +'below to match the UICulture setting in the project file. + +' + + +'The ThemeInfo attribute describes where any theme specific and generic resource dictionaries can be found. +'1st parameter: where theme specific resource dictionaries are located +'(used if a resource is not found in the page, +' or application resource dictionaries) + +'2nd parameter: where the generic resource dictionary is located +'(used if a resource is not found in the page, +'app, and any theme specific resource dictionaries) + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/3dPrintApp/My Project/MyExtensions/MyWpfExtension.vb b/3dPrintApp/My Project/MyExtensions/MyWpfExtension.vb new file mode 100644 index 0000000..22f84b7 --- /dev/null +++ b/3dPrintApp/My Project/MyExtensions/MyWpfExtension.vb @@ -0,0 +1,121 @@ +#If _MyType <> "Empty" Then + +Namespace My + ''' + ''' Module used to define the properties that are available in the My Namespace for WPF + ''' + ''' + _ + Module MyWpfExtension + Private s_Computer As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Devices.Computer) + Private s_User As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.ApplicationServices.User) + Private s_Windows As New ThreadSafeObjectProvider(Of MyWindows) + Private s_Log As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Logging.Log) + ''' + ''' Returns the application object for the running application + ''' + _ + Friend ReadOnly Property Application() As Application + Get + Return CType(Global.System.Windows.Application.Current, Application) + End Get + End Property + ''' + ''' Returns information about the host computer. + ''' + _ + Friend ReadOnly Property Computer() As Global.Microsoft.VisualBasic.Devices.Computer + Get + Return s_Computer.GetInstance() + End Get + End Property + ''' + ''' Returns information for the current user. If you wish to run the application with the current + ''' Windows user credentials, call My.User.InitializeWithWindowsUser(). + ''' + _ + Friend ReadOnly Property User() As Global.Microsoft.VisualBasic.ApplicationServices.User + Get + Return s_User.GetInstance() + End Get + End Property + ''' + ''' Returns the application log. The listeners can be configured by the application's configuration file. + ''' + _ + Friend ReadOnly Property Log() As Global.Microsoft.VisualBasic.Logging.Log + Get + Return s_Log.GetInstance() + End Get + End Property + + ''' + ''' Returns the collection of Windows defined in the project. + ''' + _ + Friend ReadOnly Property Windows() As MyWindows + _ + Get + Return s_Windows.GetInstance() + End Get + End Property + _ + _ + Friend NotInheritable Class MyWindows + _ + Private Shared Function Create__Instance__(Of T As {New, Global.System.Windows.Window})(ByVal Instance As T) As T + If Instance Is Nothing Then + If s_WindowBeingCreated IsNot Nothing Then + If s_WindowBeingCreated.ContainsKey(GetType(T)) = True Then + Throw New Global.System.InvalidOperationException("The window cannot be accessed via My.Windows from the Window constructor.") + End If + Else + s_WindowBeingCreated = New Global.System.Collections.Hashtable() + End If + s_WindowBeingCreated.Add(GetType(T), Nothing) + Return New T() + s_WindowBeingCreated.Remove(GetType(T)) + Else + Return Instance + End If + End Function + _ + _ + Private Sub Dispose__Instance__(Of T As Global.System.Windows.Window)(ByRef instance As T) + instance = Nothing + End Sub + _ + _ + Public Sub New() + MyBase.New() + End Sub + Private Shared s_WindowBeingCreated As Global.System.Collections.Hashtable + Public Overrides Function Equals(ByVal o As Object) As Boolean + Return MyBase.Equals(o) + End Function + Public Overrides Function GetHashCode() As Integer + Return MyBase.GetHashCode + End Function + _ + _ + Friend Overloads Function [GetType]() As Global.System.Type + Return GetType(MyWindows) + End Function + Public Overrides Function ToString() As String + Return MyBase.ToString + End Function + End Class + End Module +End Namespace +Partial Class Application + Inherits Global.System.Windows.Application + _ + _ + Friend ReadOnly Property Info() As Global.Microsoft.VisualBasic.ApplicationServices.AssemblyInfo + _ + Get + Return New Global.Microsoft.VisualBasic.ApplicationServices.AssemblyInfo(Global.System.Reflection.Assembly.GetExecutingAssembly()) + End Get + End Property +End Class +#End If \ No newline at end of file diff --git a/3dPrintApp/My Project/Resources.Designer.vb b/3dPrintApp/My Project/Resources.Designer.vb new file mode 100644 index 0000000..b22e10f --- /dev/null +++ b/3dPrintApp/My Project/Resources.Designer.vb @@ -0,0 +1,62 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:$clrversion$ +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("$safeprojectname$.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set(ByVal value As Global.System.Globalization.CultureInfo) + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/3dPrintApp/My Project/Resources.resx b/3dPrintApp/My Project/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/3dPrintApp/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/3dPrintApp/My Project/Settings.Designer.vb b/3dPrintApp/My Project/Settings.Designer.vb new file mode 100644 index 0000000..6e8e27f --- /dev/null +++ b/3dPrintApp/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global._3dPrintApp.My.MySettings + Get + Return Global._3dPrintApp.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/3dPrintApp/My Project/Settings.settings b/3dPrintApp/My Project/Settings.settings new file mode 100644 index 0000000..40ed9fd --- /dev/null +++ b/3dPrintApp/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/3dPrintApp/ProjManager/ProjManagerV.xaml b/3dPrintApp/ProjManager/ProjManagerV.xaml new file mode 100644 index 0000000..5a85478 --- /dev/null +++ b/3dPrintApp/ProjManager/ProjManagerV.xaml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + diff --git a/3dPrintApp/ProjManager/ProjManagerV.xaml.vb b/3dPrintApp/ProjManager/ProjManagerV.xaml.vb new file mode 100644 index 0000000..74e0c1c --- /dev/null +++ b/3dPrintApp/ProjManager/ProjManagerV.xaml.vb @@ -0,0 +1,3 @@ +Public Class ProjManagerV + +End Class diff --git a/3dPrintApp/ProjManager/ProjManagerVM.vb b/3dPrintApp/ProjManager/ProjManagerVM.vb new file mode 100644 index 0000000..aceb184 --- /dev/null +++ b/3dPrintApp/ProjManager/ProjManagerVM.vb @@ -0,0 +1,438 @@ +Imports System.Collections.ObjectModel +Imports System.IO +Imports EgtWPFLib5 +Imports EgtUILib + +Public Class ProjManagerVM + Inherits VMBase + +#Region "FIELDS & PROPERTIES" + + Private m_ProjManager_IsEnabled As Boolean = True + Public ReadOnly Property ProjManager_IsEnabled As Boolean + Get + Return m_ProjManager_IsEnabled + End Get + End Property + + Private m_MruFiles As New MruList + Public ReadOnly Property MruFiles As MruList + Get + Return m_MruFiles + End Get + End Property + Public ReadOnly Property MruFileNames As ObservableCollection(Of String) + Get + For Each FileName In m_MruFiles.FileNames.ToList() + If Not File.Exists(FileName) Then + m_MruFiles.Remove(FileName) + End If + Next + Return m_MruFiles.FileNames + End Get + End Property + + ' Definizione comandi + Private m_cmdNew As ICommand + Private m_cmdOpen As ICommand + Private m_cmdOpenMruFile As ICommand + Private m_cmdSave As ICommand + Private m_cmdSaveAs As ICommand + Private m_cmdImport As ICommand + Private m_cmdOptions As ICommand + Private m_cmdSendFeedback As ICommand + + +#Region "ToolTip" + + 'Proprietà ToolTip + Public ReadOnly Property NewToolTip As String + Get + Return EgtMsg(MSG_TOPCOMMANDBAR + 1) + End Get + End Property + Public ReadOnly Property OpenToolTip As String + Get + Return EgtMsg(MSG_TOPCOMMANDBAR + 2) + End Get + End Property + Public ReadOnly Property SaveToolTip As String + Get + Return EgtMsg(MSG_TOPCOMMANDBAR + 3) + End Get + End Property + Public ReadOnly Property SaveAsToolTip As String + Get + Return EgtMsg(MSG_TOPCOMMANDBAR + 4) + End Get + End Property + Public ReadOnly Property InsertToolTip As String + Get + Return EgtMsg(MSG_TOPCOMMANDBAR + 5) + End Get + End Property + Public ReadOnly Property ImportBTL_ToolTip As String + Get + Return EgtMsg(61840) + End Get + End Property + Public ReadOnly Property UpdateBTL_ToolTip As String + Get + Return EgtMsg(61834) + End Get + End Property + Public ReadOnly Property ExportProject_ToolTip As String + Get + Return EgtMsg(61838) + End Get + End Property + Public ReadOnly Property ImportProject_ToolTip As String + Get + Return EgtMsg(61839) + End Get + End Property + Public ReadOnly Property GoToProd_ToolTip As String + Get + Return EgtMsg(61835) + End Get + End Property + +#End Region ' ToolTip + +#End Region ' Fields & Properties + +#Region "CONSTRUCTOR" + + Sub New() + ' Creo riferimento a questa classe in Map + Map.SetRefProjManagerVM(Me) + ' Impostazioni MruLists + m_MruFiles.Init(S_MRUFILES, 8) + End Sub + +#End Region ' CONSTRUCTOR + +#Region "METHODS" + +#End Region ' METHODS + +#Region "COMMANDS" + +#Region "New" + + ''' + ''' Returns a command that do Save. + ''' + Public ReadOnly Property New_Command As ICommand + Get + If m_cmdNew Is Nothing Then + m_cmdNew = New Command(AddressOf NewProject) + End If + Return m_cmdNew + End Get + End Property + + ''' + ''' Execute the Save. This method is invoked by the SaveCommand. + ''' + Public Sub NewProject() + Map.refSceneHostVM.MainController.NewProject(True) + NotifyPropertyChanged(NameOf(MruFileNames)) + End Sub + +#End Region ' New + +#Region "OpenCommand" + + ''' + ''' Returns a command that do Open. + ''' + Public ReadOnly Property OpenCommand As ICommand + Get + If m_cmdOpen Is Nothing Then + m_cmdOpen = New Command(AddressOf Open) + End If + Return m_cmdOpen + End Get + End Property + + ''' + ''' Execute the Open. This method is invoked by the OpenCommand. + ''' + Friend Sub Open() + OpenProject(Nothing) + End Sub + + Friend Sub OpenProject(sFilePath As String) + If String.IsNullOrEmpty(sFilePath) Then + Dim sDir As String = String.Empty + GetMainPrivateProfileString(S_GENERAL, K_LASTNGEDIR, "", sDir) + Map.refSceneHostVM.MainController.OpenProject(sDir) + Else + Map.refSceneHostVM.MainController.OpenProject(sFilePath, False) + End If + End Sub + +#End Region ' OpenCommand + +#Region "OpenMruFileCommand" + + ''' + ''' Returns a command that do Open. + ''' + Public ReadOnly Property OpenMruFileCommand As ICommand + Get + If m_cmdOpenMruFile Is Nothing Then + m_cmdOpenMruFile = New Command(AddressOf OpenMruFile) + End If + Return m_cmdOpenMruFile + End Get + End Property + + ''' + ''' Execute the Open. This method is invoked by the OpenCommand. + ''' + Public Sub OpenMruFile(ByVal param As Object) + OpenProject(DirectCast(param, String).Replace("__", "_")) + End Sub + +#End Region ' OpenMruFileCommand + +#Region "SaveCommand" + + ''' + ''' Returns a command that do Save. + ''' + Public ReadOnly Property SaveCommand As ICommand + Get + If m_cmdSave Is Nothing Then + m_cmdSave = New Command(AddressOf SaveCmd) + End If + Return m_cmdSave + End Get + End Property + + Public Sub SaveCmd() + Save(True) + End Sub + + ''' + ''' Execute the Save. This method is invoked by the SaveCommand. + ''' + Public Sub Save(Optional bShowLoading As Boolean = False) + Map.refSceneHostVM.SaveProject() + End Sub + +#End Region ' SaveCommand + +#Region "SaveAsCommand" + + ''' + ''' Returns a command that do SaveAs. + ''' + Public ReadOnly Property SaveAsCommand As ICommand + Get + If m_cmdSaveAs Is Nothing Then + m_cmdSaveAs = New Command(AddressOf SaveAs) + End If + Return m_cmdSaveAs + End Get + End Property + + ''' + ''' Execute the SaveAs. This method is invoked by the SaveAsCommand. + ''' + Public Sub SaveAs(ByVal param As Object) + Map.refSceneHostVM.SaveAsProject() + End Sub + +#End Region ' SaveAsCommand + +#Region "Import" + + ''' + ''' Returns a command that do Import. + ''' + Public ReadOnly Property ImportCommand As ICommand + Get + If m_cmdImport Is Nothing Then + m_cmdImport = New Command(AddressOf Import) + End If + Return m_cmdImport + End Get + End Property + + ''' + ''' Execute the Import. This method is invoked by the ImportCommand. + ''' + Public Sub Import(ByVal param As Object) + Map.refSceneHostVM.InsertProject() + End Sub + +#End Region ' Import + +#Region "Options" + + ''' + ''' Returns a command that do Export. + ''' + Public ReadOnly Property OptionsCommand As ICommand + Get + If m_cmdOptions Is Nothing Then + m_cmdOptions = New Command(AddressOf Options) + End If + Return m_cmdOptions + End Get + End Property + + ''' + ''' Execute the Export. This method is invoked by the ExportCommand. + ''' + Public Sub Options(ByVal param As Object) + 'Dim OptionsWindow As New OptionWindowV + 'OptionsWindow.DataContext = New OptionWindowVM + 'OptionsWindow.Owner = Application.Current.MainWindow + 'OptionsWindow.ShowDialog() + End Sub + +#End Region ' Options + +#Region "SendFeedback" + + ''' + ''' Returns a command that do SendFeedback. + ''' + Public ReadOnly Property SendFeedbackCommand As ICommand + Get + If m_cmdSendFeedback Is Nothing Then + m_cmdSendFeedback = New Command(AddressOf SendFeedback) + End If + Return m_cmdSendFeedback + End Get + End Property + + ''' + ''' Execute the SendFeedback. This method is invoked by the SendFeedbackCommand. + ''' + Public Sub SendFeedback(ByVal param As Object) + ' Recupero indirizzo a cui spedire la mail + Dim sSupportAddress As String = String.Empty + GetMainPrivateProfileString(S_GENERAL, K_SUPPORT, "support@egaltech.com", sSupportAddress) + ' se vuoto do messaggio di errore ed esco + If String.IsNullOrWhiteSpace(sSupportAddress) Then + MessageBox.Show(EgtMsg(MSG_TOPCOMMANDBAR + 10), EgtMsg(MSG_MESSAGEBOX + 1), MessageBoxButton.OK, MessageBoxImage.Error) + Return + End If + ' Recupero numero chiave + Dim sKey As String = String.Empty + EgtGetKeyInfo(sKey) + ' Recupero file del progetto corrente + Dim sCurrProject As String = String.Empty + EgtGetCurrFilePath(sCurrProject) + ' se nome file vuoto, chiedo se si vuole salvare + If String.IsNullOrWhiteSpace(sCurrProject) Then + If MessageBox.Show(EgtMsg(MSG_TOPCOMMANDBAR + 11), "", MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then + Map.refSceneHostVM.SaveProject() + End If + EgtGetCurrFilePath(sCurrProject) + ' se modificato, chiedo se si vuole salvare + Else + If EgtGetModified() Then + If MessageBox.Show(EgtMsg(MSG_TOPCOMMANDBAR + 11), "", MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then + Map.refSceneHostVM.SaveProject() + End If + End If + End If + ' Verifico se il progetto corrente è una porta + Dim nPartId As Integer = EgtGetFirstPart() + If nPartId = GDB_ID.NULL Then + nPartId = EgtGetFirstPartInRawPart(EgtGetFirstRawPart()) + End If + Dim sPartName As String = String.Empty + EgtGetName(nPartId, sPartName) + Dim bPrjIsDoor As Boolean = (String.Compare(sPartName, "DOOR") = 0) + ' Recupero macchine dei gruppi di lavoro del progetto + Dim Machines As New List(Of String) + Dim nMchGrpId As Integer = EgtGetFirstMachGroup() + While nMchGrpId <> GDB_ID.NULL + Dim sMachineName As String = String.Empty + EgtGetMachGroupMachineName(nMchGrpId, sMachineName) + If Not String.IsNullOrWhiteSpace(sMachineName) Then + Machines.Add(sMachineName) + End If + nMchGrpId = EgtGetNextMachGroup(nMchGrpId) + End While + ' Recupero altri file con lo stesso nome del progetto + Dim OtherFiles As New List(Of String) + If Not String.IsNullOrWhiteSpace(sCurrProject) Then + Dim sCurrProjectDir As String = Path.GetDirectoryName(sCurrProject) + If Not String.IsNullOrWhiteSpace(sCurrProjectDir) Then + Dim TempFiles() As String = Directory.GetFiles(sCurrProjectDir) + For FileIndex = 0 To TempFiles.Count - 1 + If Path.GetFileNameWithoutExtension(TempFiles(FileIndex)).Contains(Path.GetFileNameWithoutExtension(sCurrProject)) AndAlso TempFiles(FileIndex) <> sCurrProject Then + OtherFiles.Add(TempFiles(FileIndex)) + End If + Next + End If + End If + ' Creo zip file da allegare + Dim sZipToCreate As String = Map.refMainWindowVM.MainWindowM.sTempDir & "\Feedback.zip" + If File.Exists(sZipToCreate) Then + File.Delete(sZipToCreate) + End If + Try + Using zip As New Ionic.Zip.ZipFile(sZipToCreate, Console.Out) + ' aggiungo file macchine + For Each sMachineName As String In Machines + Dim sMachineDir As String = Map.refMainWindowVM.MainWindowM.sMachinesRoot & "\" & sMachineName + If Directory.Exists(sMachineDir) Then + zip.AddItem(sMachineDir, sMachineName) + End If + Next + ' aggiungo progetto corrente + If File.Exists(sCurrProject) Then + zip.AddItem(sCurrProject, "") + End If + ' aggiungo file log + If File.Exists(Map.refMainWindowVM.MainWindowM.sLogFile) Then + zip.AddItem(Map.refMainWindowVM.MainWindowM.sLogFile, "") + End If + ' aggiungo file ausiliari + For Each sOther As String In OtherFiles + zip.AddItem(sOther, "") + Next + ' salvo lo zip + zip.Save() + End Using + Catch ex1 As Exception + EgtOutLog("Exception in zip: " & ex1.ToString()) + End Try + ' preparo la mail per il supporto + Dim bEx As Boolean = False + Try + Dim sAddressArray As String() = sSupportAddress.Split(CType(",", Char())) + Dim SendFeedbackWindow As New EgtWPFLib5.MapiMailMessage("EgtCAM5 Feedback - " & sKey) + SendFeedbackWindow.Recipients.Add(sAddressArray(0)) + For index As Integer = 1 To sAddressArray.Length() - 1 + SendFeedbackWindow.Recipients.Add(sAddressArray(index), EgtWPFLib5.MapiMailMessage.RecipientType.CC) + Next + If Not String.IsNullOrWhiteSpace(sZipToCreate) AndAlso File.Exists(sZipToCreate) Then + SendFeedbackWindow.Files.Add(Map.refMainWindowVM.MainWindowM.sTempDir & "\Feedback.zip") + End If + SendFeedbackWindow.ShowDialog() + Catch ex As Exception + EgtOutLog("Feedback exception: " & ex.ToString) + bEx = True + End Try + If bEx OrElse EgtWPFLib5.MapiMailMessage.m_ErrorCode <> 0 Then + MessageBox.Show(String.Format(EgtMsg(MSG_TOPCOMMANDBAR + 12), sSupportAddress, sZipToCreate), EgtMsg(MSG_MESSAGEBOX + 3), MessageBoxButton.OK, MessageBoxImage.Information) + Else + Map.refMyStatusBarVM.SetOutputMessage(EgtMsg(MSG_TOPCOMMANDBAR + 14), 5) + End If + End Sub + +#End Region ' SendFeedback + +#End Region ' Commands + +End Class diff --git a/3dPrintApp/Project/ProjectV.xaml b/3dPrintApp/Project/ProjectV.xaml new file mode 100644 index 0000000..723a05c --- /dev/null +++ b/3dPrintApp/Project/ProjectV.xaml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3dPrintApp/Project/ProjectV.xaml.vb b/3dPrintApp/Project/ProjectV.xaml.vb new file mode 100644 index 0000000..32a2c3b --- /dev/null +++ b/3dPrintApp/Project/ProjectV.xaml.vb @@ -0,0 +1,3 @@ +Public Class ProjectV + +End Class diff --git a/3dPrintApp/Project/ProjectVM.vb b/3dPrintApp/Project/ProjectVM.vb new file mode 100644 index 0000000..2afdde7 --- /dev/null +++ b/3dPrintApp/Project/ProjectVM.vb @@ -0,0 +1,478 @@ +Imports System.Windows.Threading +Imports EgtWPFLib5 +Imports EgtUILib +Imports System.Collections.ObjectModel +Imports System.IO + +Public Class ProjectVM + Inherits VMBase + +#Region "FIELDS & PROPERTIES" + + Private m_MaterialList As New List(Of String) + Public ReadOnly Property MaterialList As List(Of String) + Get + Return m_MaterialList + End Get + End Property + + Private m_SelMaterial As String + Public Property SelMaterial As String + Get + Return m_SelMaterial + End Get + Set(value As String) + m_SelMaterial = value + WriteMainPrivateProfileString(S_PRINTING3D, K_CURRMATERIAL, value) + End Set + End Property + + Private m_PartList As New ObservableCollection(Of Print3dPartVM) + Public ReadOnly Property PartList As ObservableCollection(Of Print3dPartVM) + Get + Return m_PartList + End Get + End Property + + Private m_SelPart As Print3dPartVM + Public Property SelPart As Print3dPartVM + Get + Return m_SelPart + End Get + Set(value As Print3dPartVM) + m_SelPart = value + ' Eseguo la selezione + EgtDeselectAll() + EgtSelectPartObjs(m_SelPart.nPartId) + EgtDraw() + End Set + End Property + + Private m_MachiningLib As New List(Of String) + Public ReadOnly Property MachiningLib As List(Of String) + Get + Return m_MachiningLib + End Get + End Property + + 'Private m_Calc_Timer As New DispatcherTimer + + 'Private Property m_GridDims As New ObservableCollection(Of GridDimension) + 'Public Property GridDims As ObservableCollection(Of GridDimension) + ' Get + ' Return m_GridDims + ' End Get + ' Set + ' m_GridDims = Value + ' NotifyPropertyChanged(NameOf(GridDims)) + ' End Set + 'End Property + + 'Private m_BTLStructureVM As BTLStructureVM + 'Public Property BTLStructureVM As BTLStructureVM + ' Get + ' Return m_BTLStructureVM + ' End Get + ' Set(value As BTLStructureVM) + ' m_BTLStructureVM = value + ' NotifyPropertyChanged(NameOf(BTLStructureVM)) + ' End Set + 'End Property + + 'Private m_MachGroupPanelVM As MyMachGroupPanelVM + 'Public Property MachGroupPanelVM As MyMachGroupPanelVM + ' Get + ' Return m_MachGroupPanelVM + ' End Get + ' Set(value As MyMachGroupPanelVM) + ' m_MachGroupPanelVM = value + ' NotifyPropertyChanged(NameOf(MachGroupPanelVM)) + ' End Set + 'End Property + + 'Private m_bCalcRunning As Boolean = False + 'Public ReadOnly Property bCalcRunning As Boolean + ' Get + ' Return m_bCalcRunning + ' End Get + 'End Property + 'Private m_bLockUX As Boolean = False + + 'Private m_LeftPanel_Visibility As Boolean = True + 'Public Property LeftPanel_Visibility As Visibility + ' Get + ' Return If(m_LeftPanel_Visibility, Visibility.Visible, Visibility.Collapsed) + ' End Get + ' Set(value As Visibility) + ' m_LeftPanel_Visibility = (value = Visibility.Visible) + ' End Set + 'End Property + 'Friend Sub SetLeftPanel_Visibility(IsVisible As Boolean) + ' m_LeftPanel_Visibility = IsVisible + 'End Sub + + 'Private m_TopPanel_Visibility As Boolean = False + 'Public Property TopPanel_Visibility As Visibility + ' Get + ' Return If(m_TopPanel_Visibility, Visibility.Visible, Visibility.Collapsed) + ' End Get + ' Set(value As Visibility) + ' m_TopPanel_Visibility = (value = Visibility.Visible) + ' End Set + 'End Property + 'Friend Sub SetTopPanel_Visibility(IsVisible As Boolean) + ' m_TopPanel_Visibility = IsVisible + 'End Sub + + 'Private m_BottomPanel_Visibility As Boolean = True + 'Public Property BottomPanel_Visibility As Visibility + ' Get + ' Return If(m_BottomPanel_Visibility, Visibility.Visible, Visibility.Collapsed) + ' End Get + ' Set(value As Visibility) + ' m_BottomPanel_Visibility = (value = Visibility.Visible) + ' End Set + 'End Property + 'Friend Sub SetBottomPanel_Visibility(IsVisible As Boolean) + ' m_BottomPanel_Visibility = IsVisible + 'End Sub + + 'Private m_PartManager_Visibility As Boolean = True + 'Public ReadOnly Property PartManager_Visibility As Visibility + ' Get + ' Return If(Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refProjectVM.BTLStructureVM.SelBTLPartsCnt = 1, Visibility.Visible, Visibility.Collapsed) + ' End Get + 'End Property + + 'Private m_FeatureManager_Visibility As Boolean = True + 'Public Property FeatureManager_Visibility As Visibility + ' Get + ' Return If(m_FeatureManager_Visibility, Visibility.Visible, Visibility.Collapsed) + ' End Get + ' Set(value As Visibility) + ' m_FeatureManager_Visibility = (value = Visibility.Visible) + ' End Set + 'End Property + 'Friend Sub SetFeatureManager_Visibility(IsVisible As Boolean) + ' m_FeatureManager_Visibility = IsVisible + 'End Sub + + 'Private m_ShowBeamPanel_Visibility As Boolean = True + 'Public Property ShowBeamPanel_Visibility As Visibility + ' Get + ' Return If(m_ShowBeamPanel_Visibility, Visibility.Visible, Visibility.Collapsed) + ' End Get + ' Set(value As Visibility) + ' m_ShowBeamPanel_Visibility = (value = Visibility.Visible) + ' End Set + 'End Property + 'Friend Sub SetShowBeamPanel_Visibility(IsVisible As Boolean) + ' m_ShowBeamPanel_Visibility = IsVisible + 'End Sub + + 'Private m_ProjManager_Visibility As Boolean = True + 'Public Property ProjManager_Visibility As Visibility + ' Get + ' Return If(m_ProjManager_Visibility, Visibility.Visible, Visibility.Collapsed) + ' End Get + ' Set(value As Visibility) + ' m_ProjManager_Visibility = (value = Visibility.Visible) + ' End Set + 'End Property + 'Friend Sub SetProjManager_Visibility(IsVisible As Boolean) + ' m_ProjManager_Visibility = IsVisible + 'End Sub + + 'Private m_ProdManager_Visibility As Boolean = True + 'Public Property ProdManager_Visibility As Visibility + ' Get + ' Return If(m_ProdManager_Visibility, Visibility.Visible, Visibility.Collapsed) + ' End Get + ' Set(value As Visibility) + ' m_ProdManager_Visibility = (value = Visibility.Visible) + ' End Set + 'End Property + 'Friend Sub SetProdManager_Visibility(IsVisible As Boolean) + ' m_ProdManager_Visibility = IsVisible + 'End Sub + + 'Private m_OptimizePanel_Visibility As Boolean = True + 'Public Property OptimizePanel_Visibility As Visibility + ' Get + ' Return If(m_OptimizePanel_Visibility, Visibility.Visible, Visibility.Collapsed) + ' End Get + ' Set(value As Visibility) + ' m_OptimizePanel_Visibility = (value = Visibility.Visible) + ' End Set + 'End Property + 'Friend Sub SetOptimizePanel_Visibility(IsVisible As Boolean) + ' m_OptimizePanel_Visibility = IsVisible + ' NotifyPropertyChanged(NameOf(OptimizePanel_Visibility)) + ' Map.refOptimizePanelVM.NotifyPropertyChanged(NameOf(Map.refOptimizePanelVM.CalcRotFlip_Visibility)) + ' Map.refOptimizePanelVM.NotifyPropertyChanged(NameOf(Map.refOptimizePanelVM.Optimize_Visibility)) + ' Map.refOptimizePanelVM.NotifyPropertyChanged(NameOf(Map.refOptimizePanelVM.OriginType_Visibility)) + ' Map.refOptimizePanelVM.NotifyPropertyChanged(NameOf(Map.refOptimizePanelVM.ViewPage_Visibility)) + ' Map.refOptimizePanelVM.NotifyPropertyChanged(NameOf(Map.refOptimizePanelVM.MachiningPage_Visibility)) + ' Map.refOptimizePanelVM.NotifyPropertyChanged(NameOf(Map.refOptimizePanelVM.NestingOption_Visibility)) + 'End Sub + + 'Friend Sub NotifyCalcPanel_Visibility() + ' Map.refCALCPanelVM.NotifyPropertyChanged(NameOf(Map.refCALCPanelVM.ViewPage_Visibility)) + 'End Sub + + 'Private m_FreeContourManager_Visibility As Boolean = False + 'Public Property FreeContourManager_Visibility As Visibility + ' Get + ' Return If(m_FreeContourManager_Visibility, Visibility.Visible, Visibility.Collapsed) + ' End Get + ' Set(value As Visibility) + ' m_FreeContourManager_Visibility = (value = Visibility.Visible) + ' End Set + 'End Property + 'Friend Sub SetFreeContourManager_Visibility(IsVisible As Boolean) + ' m_FreeContourManager_Visibility = IsVisible + ' NotifyPropertyChanged("FreeContourManager_Visibility") + 'End Sub + + 'Friend Sub NotifyAllPanelVisibility() + ' NotifyPropertyChanged("LeftPanel_Visibility") + ' NotifyPropertyChanged("TopPanel_Visibility") + ' NotifyPropertyChanged("BottomPanel_Visibility") + ' NotifyPropertyChanged("PartManager_Visibility") + ' NotifyPropertyChanged("FeatureManager_Visibility") + ' NotifyPropertyChanged("ShowBeamPanel_Visibility") + ' NotifyPropertyChanged("ProjManager_Visibility") + ' NotifyPropertyChanged("ProdManager_Visibility") + ' NotifyCalcPanel_Visibility() + 'End Sub + +#End Region ' FIELDS & PROPERTIES + +#Region "CONSTRUCTOR" + + Sub New() + ' Creo riferimento a questa classe in Map + Map.SetRefProjectVM(Me) + ' imposto timer per aggiornamenti Calc + 'm_Calc_Timer.Interval = TimeSpan.FromMilliseconds(500) + 'AddHandler m_Calc_Timer.Tick, AddressOf Calc_Timer_Tick + '' imposto dimensioni colonne/righe della Grid + 'DimensionsIniFile.ReadGridDimensions(ConstDims.PROJECT_VIEW, GridDims) + ' carico lista materiali + InitMaterialList() + ' carico lista parametri di stampa + InitMachiningsList() + End Sub + +#End Region ' CONSTRUCTOR + + '#Region "METHODS" + + Friend Sub AddNewPart(sFile As String) + ' rinomino pezzo e layer + Dim nPartId As Integer = EgtGetLastPart() + EgtSetName(nPartId, "PART") + Dim nLayerId As Integer = EgtGetFirstInGroup(nPartId) + EgtSetName(nLayerId, "OriginalSolid") + ' posiziono il pezzo al centro + Dim b3Part As New BBox3d + EgtGetBBoxGlob(nPartId, GDB_BB.EXACT, b3Part) + Dim dPosX As Double = (CurrentMachine.b3Tab.DimX() / 2) - (b3Part.DimX() / 2) + Dim dPosY As Double = (CurrentMachine.b3Tab.DimY() / 2) - (b3Part.DimY() / 2) + + ' Posiziono il pezzo e aggiorno il suo box + Dim vtMove As Vector3d = New Point3d(dPosX, dPosY, 0) - b3Part.Min() + EgtMove(nPartId, vtMove) + b3Part.Move(vtMove) + + ' Creo il frame del pezzo + Dim frPart = New Frame3d(b3Part.Center() - 0.5 * b3Part.DimZ() * Vector3d.Z_AX(), Frame3d.TYPE.TOP) + Dim nFrameId = EgtCreateGeoFrame(nPartId, frPart, GDB_RT.GLOB) + If nFrameId <> GDB_ID.NULL Then + EgtSetName(nFrameId, "FramePart") + EgtSetMode(nFrameId, GDB_MD.LOCKED) + End If + + EgtAddMachGroup("3dPrint") + EgtSetTable("Tab") + + Dim nRawId As Integer = EgtAddRawPart(b3Part.Min, b3Part.DimX, b3Part.DimY, b3Part.DimZ, New Color3d(128, 128, 128, 30)) + EgtAddPartToRawPart(nPartId, b3Part.Min, nRawId) + EgtMoveToCornerRawPart(nRawId, New Point3d(dPosX, dPosY, 0), MCH_CR.BL) + + EgtResetCurrMachGroup() + + ' creo lo start point + Dim ptStart As Point3d = b3Part.Center() - 0.6 * b3Part.DimY() * Vector3d.Y_AX() - 0.5 * b3Part.DimZ() * Vector3d.Z_AX() + Dim nPtStartId As Integer = EgtCreateGeoPoint(nPartId, ptStart, GDB_RT.GLOB) + If nPtStartId <> GDB_ID.NULL Then + EgtSetName(nPtStartId, "StartPoint") + EgtSetColor(nPtStartId, New Color3d(255, 0, 0)) + End If + + ' aggiungo a lista pezzi e seleziono + Dim NewPart As New Print3dPartVM(nPartId, sFile) + PartList.Add(NewPart) + SelPart = NewPart + NotifyPropertyChanged(NameOf(SelPart)) + + End Sub + + Friend Sub SelPartFromId(nPartId As Integer) + Dim PartToSel As Print3dPartVM = m_PartList.First(Function(x) x.nPartId = nPartId) + If Not IsNothing(PartToSel) Then + SelPart = PartToSel + NotifyPropertyChanged(NameOf(SelPart)) + End If + End Sub + + Friend Sub InitMaterialList() + Dim MaterialFiles As String() = Directory.GetFiles(Map.refMainWindowVM.MainWindowM.sMaterialsDir) + For Each Material In MaterialFiles + If String.Compare(Path.GetExtension(Material), "csv", True) Then + MaterialList.Add(Path.GetFileNameWithoutExtension(Material)) + End If + Next + Dim sCurrMaterial As String = "" + GetMainPrivateProfileString(S_PRINTING3D, K_CURRMATERIAL, "", sCurrMaterial) + If MaterialList.Contains(sCurrMaterial) Then + m_SelMaterial = sCurrMaterial + End If + End Sub + + Friend Sub InitMachiningsList() + Dim MachiningFiles As String() = Directory.GetFiles(Map.refMainWindowVM.MainWindowM.sMachiningsDir) + For Each Machining In MachiningFiles + If String.Compare(Path.GetExtension(Machining), "ini", True) Then + m_MachiningLib.Add(Path.GetFileNameWithoutExtension(Machining)) + End If + Next + End Sub + + ' Friend Sub SetCalcRunning(value As Boolean) + ' If value Then m_Calc_Timer.Start() + ' m_bCalcRunning = value + ' End Sub + + ' Friend Sub ManageIsEnabled(bIsEnabled As Boolean) + ' Map.refInstrumentPanelVM.SetInstrumentPanelIsEnabled(bIsEnabled) + ' Map.refCALCPanelVM.SetCalcPanelIsEnabled(bIsEnabled) + ' Map.refMainMenuVM.SetMainMenuIsEnabled(bIsEnabled) + ' Map.refPartManagerVM.SetPartManagerIsEnabled(bIsEnabled) + ' Map.refLeftPanelVM.SetLeftPanelIsEnabled(bIsEnabled) + ' Map.refProjManagerVM.SetProjManagerIsEnabled(bIsEnabled) + ' Map.refProdManagerVM.SetProdManagerIsEnabled(bIsEnabled) + ' Map.refTopPanelVM.SetTopPanelIsEnabled(bIsEnabled) + ' Map.refOptimizePanelVM.SetOptimizePanelIsEnabled(bIsEnabled) + ' Map.refFeatureManagerVM.SetFeatureManagerIsEnabled(bIsEnabled) + ' End Sub + + ' 'Private Sub Calc_Timer_Tick() + ' ' If m_bCalcRunning <> m_bLockUX Then + ' ' ' se calcolo iniziato + ' ' If m_bCalcRunning Then + ' ' ManageIsEnabled(False) + ' ' ' aggiungere gestione colonne editabili delle tabelle + ' ' If Not IsNothing(Map.refPartListVM.colPart_Do) Then + ' ' Map.refPartListVM.colPart_Do.IsReadOnly = True + ' ' End If + ' ' If Not IsNothing(Map.refFeatureListVM.colFeature_Do) Then + ' ' Map.refFeatureListVM.colFeature_Do.IsReadOnly = True + ' ' End If + ' ' If Not IsNothing(Map.refPParameterListVM.colPParam_Value) Then + ' ' Map.refPParameterListVM.colPParam_Value.IsReadOnly = True + ' ' End If + ' ' If Not IsNothing(Map.refQParameterListVM.colQParam_Value) Then + ' ' Map.refQParameterListVM.colQParam_Value.IsReadOnly = True + ' ' End If + ' ' If Not IsNothing(Map.refQParameterListVM.colQParam_Custom) Then + ' ' Map.refQParameterListVM.colQParam_Custom.IsReadOnly = True + ' ' End If + ' ' If Not IsNothing(Map.refRawPartListVM.colRawPart_StartCut) Then + ' ' Map.refRawPartListVM.colRawPart_StartCut.IsReadOnly = True + ' ' End If + ' ' If m_BTLStructureVM.nPROJTYPE <> BWType.BEAM AndAlso Not IsNothing(Map.refRawPartListVM.colRawPart_W) Then + ' ' Map.refRawPartListVM.colRawPart_W.IsReadOnly = True + ' ' End If + ' ' If Not IsNothing(Map.refRawPartListVM.colRawPart_L) Then + ' ' Map.refRawPartListVM.colRawPart_L.IsReadOnly = True + ' ' End If + ' ' If Not IsNothing(Map.refPartInRawPartListVM.colPartInRawPart_Offset) Then + ' ' Map.refPartInRawPartListVM.colPartInRawPart_Offset.IsReadOnly = True + ' ' End If + ' ' If Not IsNothing(Map.refPartInRawPartListVM.colPartInRawPart_Rot) Then + ' ' Map.refPartInRawPartListVM.colPartInRawPart_Rot.IsReadOnly = True + ' ' End If + ' ' If Not IsNothing(Map.refPartInRawPartListVM.colPartInRawPart_Flip) Then + ' ' Map.refPartInRawPartListVM.colPartInRawPart_Flip.IsReadOnly = True + ' ' End If + ' ' If Not IsNothing(Map.refPartInRawPartListVM.colPartInRawPart_PosX) Then + ' ' Map.refPartInRawPartListVM.colPartInRawPart_PosX.IsReadOnly = True + ' ' End If + ' ' If Not IsNothing(Map.refPartInRawPartListVM.colPartInRawPart_PosY) Then + ' ' Map.refPartInRawPartListVM.colPartInRawPart_PosY.IsReadOnly = True + ' ' End If + ' ' If Not IsNothing(Map.refFeatureInPartInRawPartListVM.colFeatureInPartInRawPart_Do) Then + ' ' Map.refFeatureInPartInRawPartListVM.colFeatureInPartInRawPart_Do.IsReadOnly = True + ' ' End If + ' ' m_bLockUX = True + ' ' ' se calcolo finito + ' ' Else + ' ' ManageIsEnabled(True) + ' ' ' aggiungere gestione colonne editabili delle tabelle + ' ' If Not IsNothing(Map.refPartListVM.colPart_Do) Then + ' ' Map.refPartListVM.colPart_Do.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refFeatureListVM.colFeature_Do) Then + ' ' Map.refFeatureListVM.colFeature_Do.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refPParameterListVM.colPParam_Value) Then + ' ' Map.refPParameterListVM.colPParam_Value.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refQParameterListVM.colQParam_Value) Then + ' ' Map.refQParameterListVM.colQParam_Value.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refQParameterListVM.colQParam_Custom) Then + ' ' Map.refQParameterListVM.colQParam_Custom.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refRawPartListVM.colRawPart_StartCut) Then + ' ' Map.refRawPartListVM.colRawPart_StartCut.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refRawPartListVM.colRawPart_W) Then + ' ' Map.refRawPartListVM.colRawPart_W.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refRawPartListVM.colRawPart_L) Then + ' ' Map.refRawPartListVM.colRawPart_L.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refPartInRawPartListVM.colPartInRawPart_Offset) Then + ' ' Map.refPartInRawPartListVM.colPartInRawPart_Offset.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refPartInRawPartListVM.colPartInRawPart_Rot) Then + ' ' Map.refPartInRawPartListVM.colPartInRawPart_Rot.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refPartInRawPartListVM.colPartInRawPart_Flip) Then + ' ' Map.refPartInRawPartListVM.colPartInRawPart_Flip.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refPartInRawPartListVM.colPartInRawPart_PosX) Then + ' ' Map.refPartInRawPartListVM.colPartInRawPart_PosX.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refPartInRawPartListVM.colPartInRawPart_PosY) Then + ' ' Map.refPartInRawPartListVM.colPartInRawPart_PosY.IsReadOnly = False + ' ' End If + ' ' If Not IsNothing(Map.refFeatureInPartInRawPartListVM.colFeatureInPartInRawPart_Do) Then + ' ' Map.refFeatureInPartInRawPartListVM.colFeatureInPartInRawPart_Do.IsReadOnly = False + ' ' End If + ' ' ' fermo il timer + ' ' If Not m_bCalcRunning Then + ' ' m_Calc_Timer.Stop() + ' ' m_bLockUX = False + ' ' End If + ' ' End If + ' ' End If + + ' 'End Sub + + '#End Region ' METHODS + +End Class + diff --git a/3dPrintApp/Resources/AboutBoxImage.png b/3dPrintApp/Resources/AboutBoxImage.png new file mode 100644 index 0000000000000000000000000000000000000000..a11230b23350efcbcdcc6b04c18d23d73ee78359 GIT binary patch literal 4169 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 T;3P>A00000NkvXXu0mjfDVn*3 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/CALCPanel/ChooseMachine.png b/3dPrintApp/Resources/CALCPanel/ChooseMachine.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec67a8f27a6fb6ffa65c3c977bf102d1a6ce990 GIT binary patch literal 947 zcmV;k15EshP)jNP=rz-LbNVTh%ESufc;@~PDGF4Q8G^~1OdU{6tX20LdYqPhn4v~nw z>vKrTHWrbUh>S&KBqEC@i?%Nb%A3BVY;zI0H78&p!Z zLp(@C3K97lxX!xCqNM{60H;3Srr9_JK=Ts-!LF0CO$|UP0S!bXPs(;0y4X>qxU>5c zz$p6x&Z!hx(%#W0CeYlMPBT)e!>`XSM5N}Xgj~B5kw>-pCX2=_7J%^<$~h(Bf;<%P zr^zBj1N>Y71gf~nB7g<=VqZEB>EkZp_}SrmgJ^Kkxd+@OAMUiIYyrM&vS?-V(RB)r z6URcRu7coerf1;r9rM1=DsIkddisKNgaq~Zjy?B+o~1{s_M`*zw~f(yI!2sYEINcA;E^r_YhV-|t_yI>Vg&Bz6h!xYUCegB)vC z)U{Yoy>;?beaRr^(sE51fYg|&z@?CZj?b8wTog}3UXh>&W0Q4NPpUQJ(9VFhKH$IX zg}tC8wC(iyqtPQOR(F>~cwE@HCB>9m) z$$!mZFIKYQSmS78E>K$?IYJMmx21rF7lVy)O>wd!&uWvW@`v!be$59eX3K$fY&}Q; z#@?j{@PWKIGNuL6am&)bVwy~w@^fh9R#4noN|nZUaN{R$kJz*okgaE6!y0RTzi~{O z72gXF(drdXMkHm3m3V$s=^}S(rYZL>W?w(05QkSE(!f!;V6U6${9#nFAWFY-^)rv9 z=D^o`mY`YXX&>sG;Vw|khZ>K-wM+f}*^YwH^$9NT>w6^rgpn^yuATLKiZc{O>Mu-* z8u0Yyt-wG1w(;=nhh|JossXy!lDv9rOWIxE)OC$()9uv}O;9~FK}mHNo2RWW z0IUF%Ew&EMsMm`?Y3paSAh#`mugLSU{-Ct=I{-@n-vAcQs6%L8@Sf7vzXLcqqgH(u zZGkD+x#h2J0-HIb8jdyI6dQQ%_-uWF$jPUFL-zpYJoZPSjZPCkLLOuUA{}{qG&I`j z>j3)XJr#6(6sQg$+Dm2Im>!0E(WvQJ``FWrgYhBCRAq*`NeKFV3h+YA+c|2(;^C zGYLunwC)R(48@@%2DEoZZHE|5g<3@V_bG96FqF2Q!qLM}AZ`7IT2`pYTRP^*EK;D( zSp)^vHGoHF)I1dkZJDP)6<>&_93WYshMp{mrfNp25ESJ(vkR??Nq&y?N~}Y{hyL*f|Ba`paA>;$W)SY Tqo@1t00000NkvXXu0mjf2!Y0@ literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/CALCPanel/ResetCalc.png b/3dPrintApp/Resources/CALCPanel/ResetCalc.png new file mode 100644 index 0000000000000000000000000000000000000000..ad0f3495240553e57f742f52ff5970385e1a72f6 GIT binary patch literal 691 zcmV;k0!;mhP)s-Tzti;fKUOXfpS((OJc^?v+lP&`q zXXPn?8vrSQ9)LV#p5ws9hXknW3BZ&kx8y}0;J8AV-tOUDCUKHBzZfPin`6mnj$4p zx^*Sx9ulw{ridGg)gn83-gjlGTCou(ekCUQD}Buk1>mygH=#hvOou8zYkC22?F%*L zF7^dVwMUQjG2&s^*hi(EyH8x37O;~`Jb&5wXOn>%fW((%C}6B>gxk)n$nr) zT-X<=DK|^)uCzk+IM5^=Hm!pN0D<@8xeLlF9)WJ86<8pUf^tU61@>$JTLl84o=-L? z8E_%}lJYALFujdw1Elojf;uJr%H$ypV4*-##aqAG>Js9tT(J6-q<3oUvl-2&Kp>;) zks7t_s|j+}6_8cDufA!de=cj2$JS-(+iA8DUpi#|+|+@3_vjtLq`d6aOT?LJ(|-n~ z6-1>XiHz%eo2TVH&s!{nTW!3xpuC{i9V}P?JDsBE98>mGGa9rtSG}Ov#ti6T3;s{w z1;??x*A2TA4ZG0>^(Y3NZH@w0N$cL@u5Bk3X Z@B?Q-7eA@@p>1} zu=6=&6elDvn0AR=Yf@2eHgqH>U$op4@DLLc+qU)B#`r4A%@0QEn*Eb5`~Qekl$)3* z(~van0W8WaTvs^-a1Y?QDjISyrgP}=A-0e2NHNrV3iYTq$oQqq!o=ffL`NevT*yJn zEG#_h57eVZ%tA@5KJV1zoC{JbN;(yyeaE=giVN8@igL4M1T={S?G0^Yln>EtDr27= zgN0Ki_v|@mMMzq~se+J(%%8aa7Z|-W?dq|D8G(5N*s%)dc0d|wnT1nNJLoz4`VtMNqgy+*hpN?-s=_5NYdu%+K1|sxHzX-{SgLOU z{C*rtMzv@C`A! zn~6MTPs9`aXJ-?jQ}dGr2S8N zLt)8YtXFSfBQ4Z&83|QOrxReg1FRUiWKkDX339JEz!oEYC_%rAPziS05U?O1EPEt3 zmxOW#vmRhUy9|{nxnkIvC~b~>^&M4dvx3HhMQQU#X>*YMT)Xdy{R)+0r*Mu8$pA{5 z2Q1x_Y;%<^5h~6IWkqM99{@CKs@f`zuVs77Qh>+-RZPs&DBTp1x$7He@WdgKgXN7c zrHlaDAq;p=HC?Bfrrz0Lkl>{hKrh(6PPv$7(2*_1A>yF4=?oPfpbW)hf^(x6hz6XH z7dZb#C^cTIG?u|r_K6VhmR5et`}|+%{V&0)r+!#zW$!6<=2qrEL5YXHa|Qi%!E(&8 n9In7w;@XZmRe#9)6C(Nxw0JW%L~eU-00000NkvXXu0mjfl}u3R literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/CALCPanel/VerifyAll.png b/3dPrintApp/Resources/CALCPanel/VerifyAll.png new file mode 100644 index 0000000000000000000000000000000000000000..886a130521dbae335e58aa2aab7e06fb1f78fd66 GIT binary patch literal 792 zcmV+z1LypSP)IM7dgXGVJXeosUr zGnT=nZJ4_V3hd-6;DLx1mr|or{6s_p1$OgdkYD6G{1s~67awCzP+;OW92@~5ZMj1$ zZH$?lB8`Red*_nCM~}mmdLsc;bOc10SK!6Qc-Ax0@PmS|WtA;Jaqg){A;$A__*-D! z1L8Gw(lr3nR2C7et1p=y7VRpqm2Ze$r1D`pCf z>sS^`iXL1vv{Qi6reju{bDuqhyzaTr1h{lU*7mX|WCQO1`7gl%?nVD~dAGM~MD!Oh WB1#ruBb#3U0000!lvI6;>1s;*b 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 UgFQ)T5C8xG07*qoM6N<$g5JSqpa1{> literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/ArcCSE.png b/3dPrintApp/Resources/DrawPanel/ArcCSE.png new file mode 100644 index 0000000000000000000000000000000000000000..64e2aee675cc8b30cbccd0734e1ecece927cd5b3 GIT binary patch literal 708 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 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Chamfer.png b/3dPrintApp/Resources/DrawPanel/Chamfer.png new file mode 100644 index 0000000000000000000000000000000000000000..a10190dc374bfc2121bf9c9b382d4bdb3692d699 GIT binary patch literal 422 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 KMNUMnLSTYA#AojS literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/CircleCD.png b/3dPrintApp/Resources/DrawPanel/CircleCD.png new file mode 100644 index 0000000000000000000000000000000000000000..5480d8f9583c593ef01b339a2f2a0693d47638a9 GIT binary patch literal 713 zcmV;)0yh1LP)x zK~#9!>{u~N!%z@TO80hAHx0Tu*taV*b+%9tv13NTLBY|Xjm{1Z?sahyCwCj6?y0*F z-4vAM7sR`APadI3-b+&3LJy9l;k~=-cX!{rL=VGIn>8tEGboFoWTl*Ev##qVTo`Co zcXfqsLApg!5< zsdVD@l@j=ecUdbd-88=55a~zI9|3i4uTFmCkP^BkR~-R5rhu3sYdpn(T>43KGKe}+~fZEr`4FhUPrc+&FeMU`{ zI3-k7f}(&%|JHsuJ36`Pdy@afjrc2cbm{O;?d)Hz(C?|wQ#K&y+_2P=@I zmmzh?Pc`gRuxqMPf-~z(S5DMn*;lAmxBX>H!cR0H)Ii6uAnN(22oNM=Sto zAp&0j;sPKRAl7_j%t$Er0YgOq>KK0{;fJ6Qfrbn+06E+qiT@FZ6M%MXpjt>lE%|^H z0wBj35YPkiL;}>oaDAkN6h6Zf(4xbD)Mx;L1~fAS$aWOS0cfE^R@%T4+6%~X6g2o@ zLBD}q$Kdf~0XdGE0M-0}k`TgTZUNNX4}{D`*QkKxBL`|Z2+8~dP_rkH;wV_cJV0#+ zA*C;HXp!Qm3s6l7v~Uy%tEebHs;q7Jzi8El9)g7@w2*ucExrVS;vcA8r(JsTdBe+3 zzkQCp{LReE!pPvM$ob~iKZZ6#Io^Jh0vpLuprG9k#0P<54#ZfZxB3w%y6ZuDE``eB z)pP#Q=Z=$4f0R#q@*PFISBLMX5GRwFu>#*EY^?+VQhW_`&;)1!3(oRD{sAC1z@sG! z-9aGGf8z@~D+^;2uBM9tQcX_`0I8RUviYHP9!`(F`TF-CHt{Ea{sGewg9I)|9e~mb zL^=vo(jP>spd0adNQ9diYuinRg$bB+7+z4Nkq1me3y?hW0LX6uVtk>zEK7zHL$FYT z=jZP~|LbribeiYBYtO!{c=z>B$nGaU@#elkSxya!5`FO1eS@-k*V7(f|Me07*qoM6N<$f<$o?O8@`> literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Delete.png b/3dPrintApp/Resources/DrawPanel/Delete.png new file mode 100644 index 0000000000000000000000000000000000000000..b90063f2f6a2cfe1e1bd4a5da4adf232fec8d036 GIT binary patch literal 658 zcmV;D0&V??P)$Tdq(NlXkI;ak+?)c~*9g>~8^9Ln2 z@=f-}`N`^Q-XcUyFC#L39gCPL98!^i7?In&NcAlHD6IvKWbL&&bZqcO6})%@7;|7-#VnS>L(!j$pD-|GIAPt0<{0S4KeN zo$3@$PD=J!a`_Eq{1fryOdOZYU$A^&)9((77Br4jypp|$&jUcKo$M(B;q=w`my%aqE=6)$+*`G(w4d zMAo2j^BDT?%s%hvm6|%Z439ddAbSd(6x}hZ*0oY2W68ne}@(AL91JD@C zsd!snL%JWO*WjtOq4JebX!{;U{jIsTe1&m7iMhlUGTDZ~4Zm#R2VF s)NV6eK3}11Yv}I(sSfHtKz$1^04xjNcntC5R{#J207*qoM6N<$f*@`o^Z)<= literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/ExplodeCurve.png b/3dPrintApp/Resources/DrawPanel/ExplodeCurve.png new file mode 100644 index 0000000000000000000000000000000000000000..be9e1c7ab01a126263325c09c65144af7059e4bc GIT binary patch literal 932 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 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/ExtractFacetLoops.png b/3dPrintApp/Resources/DrawPanel/ExtractFacetLoops.png new file mode 100644 index 0000000000000000000000000000000000000000..2fd459194a866c1edc432fe9d93294632b1fed10 GIT binary patch literal 1034 zcmV+l1oiugP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf4*&oQ4*`<-1El}}1D{DmK~z{r?U!F@ zTU8u@zne5klm2gLZEIQ9DqCl5la*;Fsk5m#Qd*%nAAFIqfowR%H${CGMSW0M*^9_v zK4=9MbWE7gIXk*PuvLPKNxIpRwrdx3ZEw?LO>?j3X6YQ5v^PtYJ>-L5&f(s3Pd?7? z@VnCw<=PEuY3TW!!R$(Vv? z`R&r^T|tMdlaUig%k&6lluD&Vl4O&m7)$-5RJoqvblFZ?>g?QFm53%K;tH&)5~5*k z21$grNi7DIiXxSVEh<}Cq;mW$k@Kes&rI<_&$GDRd0QKrmGxFio$|a+?fB0W-3YSW z*pA%%l!#6gvkgTOe=nw1Q!3(Dn?}r45?f?j_;;MwF4GeB(>ZgIZBrqN78AsbM&v_> z3H0~zbZ>7~v2~?^u^RZQ z3f>YGqfeBtM&q3^I?1beDkf{XC(u@9ml=xJT?AchT1DSX3Q~G0Na>{@rI&(~Uj8>J z^ISaL+n9_}+5xY)tdfC?A5(eLk4d~aa(;O%iIdhzA#!M5oc!jf|8gpIS-O2Y)viZI zDRDZC$L0C@N2;wf{P+>hp(8kh-_xMV*o-R1Y?2eJFc>A#yMR&`fq`4_c?_l%_Z8-`zuW_Y)-A+mOU}#jcKy4Htbwse3tgE~JiMID>EGCk$pQRh?cAULN7O zF9uWhlU6J9?k=KkH_ILm>O-}}<8gMnTsdVwC#ic8`_Aid?LIXf@bOt&D~YBiW}2JX zvv+UK+wWg!Qu#!8cXw%~>-ofeuhf4@p`z=hAf*rZ8%R^eA`o?AUH||907*qoM6N<$ Eg16%1ivR!s literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/ExtractLoops.png b/3dPrintApp/Resources/DrawPanel/ExtractLoops.png new file mode 100644 index 0000000000000000000000000000000000000000..6c71a4c14b6ad328d43b4dae59b8b0cd141a98a1 GIT binary patch literal 1432 zcmV;J1!ww+P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00jt1L_t(oN6nUdOqFFE$DhN^LhK5&oY@++ zxkb%suGZXIn=?0C%eC0b*&nuCtF@eNwbpH-5GE?%HKmX;Kq4**${j&K?#TUqQ8bXt z;c$Qhbn)BodEe(fyze>hfdf>h@Alz6@9(_ldA@v~A3qKQ@V`U1=xTI}u12@$YIKXP zMz`o{>BCr?XTpwBGlFX; z5ZyY7#EwavZZIRHVhDS#_TioEUc8#tjde+FSQ+1RMSOOG=pi};?L-9;M+C9ZJYV)r zE;nYcSq-HQ;?XQ4wib=z)2eYCYqTJ#YZ@`l<2X_?f-g(%;QhSYc=PfNyp-C3r+#U{ zgFiQbovj6nss=k%4tDGsSVS?{k*m_0D*9MR4o}ct4h?<3@u7cmNJ^Lm$U+luOzqVpUd=uP%tONU@2JCbt*ojiGqa|SB^fz+2 z5bPj@_-#H|Xs%*vov@*m+LYB$LO9UI@Llm%z|3maOgQd%P! zit7VQ9>CHJBQ_S8@L~BF4%J%_-!X;QHVcl{ny{Br`iN3`JM$(sUg$(XVk`V&8)4un zeNV^s9kmWmDN-0ZM22`u+z_QCOr^8^*#W|aR(2^R-T_M+!qYSYwwIW(w`KxSEtAws zQ#eD-eV}p}pA_|DM@}zZOYg?|q;{;LWAoOeR7NS$u|n_Edq92=SXgZ7FbQ_IMZo5Q5I=;bp6FZFXnd;}bC zvLIQEfWy^Bd`=@^CpGsQmwT`wg+@R^3+|If03BNt9h=PvkW&)JCa3flt{x#uOAo@8;ez@)7Vtayy;G z68gwW!fKGG#F5OX(T;$-loIcqKM8)VV8J=hks)`&KxR1Zgol)pZ0cTlTau%=RO06N zvHB1X5mtjv@G%{mAN7(a4N8L(d&%MtDmW?iw@w~8{|%R_;P>jUFjBvW^%Y}ET|(5f zN$If&akCuBj1Yf)55YH{^~<5Ox2+jl{!3Z+R2!I!#b~azH1DZz=7TfR`i@7 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/ExtractSurfFacet.png b/3dPrintApp/Resources/DrawPanel/ExtractSurfFacet.png new file mode 100644 index 0000000000000000000000000000000000000000..766017176206fc7cd46e4dff7276321a885fc00e GIT binary patch literal 1117 zcmV-j1fu(iP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA1M*2kK~z{r?U!w6 zTU8jx|0ikQ%v-xAYw3h;!q}IltOz=xu_fyI!Ggn%iTk?Fi5F4CD)`YaV-uM#RKah; zlp!b%!6AulC}pzFVJ8enw|22H+e(wzymeho?)5qMo?FwkHFrxgC-eu;eV+5ubN)Q% z&tGs)+Wpl``Vsr>(nk&5)*+c=oGmL zvggQp^7(vIDwQ^${Nl9D-5NW<=Loo{UM(zxXR2y@1$OR7{Eu|MdT`*P+wD>g4-P7W zhYl&hV7Fp2nG~zl%8!KGRsHV@BTe0l-#eAX&sik*5qkB0D#bSS)b4++v{>`p8a@#Y_%dBHtw6!WllmshlYibi>+)ORf$?w(P}7 z^D~G$+95N#j&zME*))l-q1~zZ{ciO4KZ`&|0Hsn1Gcz+dH!*>DJg$xl&e6VmM7#z= zqP9PI1EEwHp>%|N1O>Abk>)-`n?ktY>cWn~6~=c>fez3;LL!mC>}(ve zEUV*!)3onC5wF3JC|@Wq8X7zEm(iCxgQt=|Aeb2!y&6wn?k)W|5-m{ZB3tj*eVgnt z+V@wjxt4npwSrtiGU^3}74__>6sX-^ujjK&Cdq(`{r-9K!&E-Hw62Y*sVG^(a%qSyP|DK7Urs*%XUu8NjoCqFo%uTFr?$lB z=^5RKnu=lyGU?+UFBz}Wj$(TQmV&kw<833<`uMg8Ulp|$#n)T)+rJlTEs9h1n)MJ> z31_7;RBuswNzhp&b7htM>7*J%SAEr z54=K)DqZ14YK)4aT9&T6f9sO4vmt}y({E#HyuD21c|L`I5$I%vuL|Rz!#Wak9qaif z*OnMZV15j{Ge4JZJFOx6d&^_=vi&YO?Clpb*TpAgR=z4W;_gM=iNx&e6D;wNL?ua7 zv)X?Lsu-Pmiz4Apl00000NkvXXu0mjf#B3g! literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Extrude.png b/3dPrintApp/Resources/DrawPanel/Extrude.png new file mode 100644 index 0000000000000000000000000000000000000000..1b245f2db1a3de1b983dfbf2ddb393d4673c8c0d GIT binary patch literal 1243 zcmV<11SI>3P){v}~8$}eJot<58*MDno>?DqjOxmcFfJgrE);xh{PqF5J;%v5a7nC z9N+**fXW4N;D9(qfl-O%;TlJ8U zMziyF-h1D^{r1h94G})APjei3@9eVqi5 zQ$0b6l6YZcR7E%_cXjyq)=l)Zwu~klrJhk69tw&ck9fW-t}`JRztrrDD~%sg)r-H1JqxXdUM><`=Z-Ulh6GWyuW_s#XqfEQtp(CVFShSi&`u9s_OrBdU4zC&7MB)m+<)KrV;g{pd6H)K0%QRqx>$gHTT zR)dE0O3hDACaAn66-;i6@R%NwCCwiRWAxKZ`-*~YDI>Gyx;B|JM!&ycNA1R0^81eaiX(s zz{p`IU^)@#yLI&X1c$o<8WhYP;H+lzhV zzG`HP$9<}=u%F^zLNJ4r;6N7HnrUT?fR zFev*V3ANAc%~bBe#!BYspkTPBDKxI9C&A7!k0j23-I6P!!y)o(Am)jDzU*1Qe0|1# zTHA?ZFl*WI^p)jj3KhK$c1~vAJN?@pOMlr@-^s6_p}8Mlh3f2WIGW!td!<6aFBhO} z(UIiQ!65;zP-N6)C|%@=rmK3*P(^`UW0v(v{)020_Z{JW{!iKGHgI+l6aHC~u}7dB z2q6wp7zqH#34~uXw(39FCA`yDt%|EU8|4%)v03;^c5_XS8Fp|}75002ovPDHLk FV1ilsRTlsN literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Fillet.png b/3dPrintApp/Resources/DrawPanel/Fillet.png new file mode 100644 index 0000000000000000000000000000000000000000..b40c3779c35e81463ddf3d6c07ebd2341ba72c47 GIT binary patch literal 594 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 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/InvertSurf.png b/3dPrintApp/Resources/DrawPanel/InvertSurf.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3bf7f9e4552bbbf1a6bf9447bda4764dd39bc1 GIT binary patch literal 714 zcmV;*0yX`KP)N2bZe?^J zG%heMGBNQWX_Wu~0!K+iK~z{r&6PPw13?sqrx3x)vz5fgPUBUG2Wq7jo+#o01`$LB z4-mAlScs^F2euZbk~9{Af+7kYAc%#fB0?m=11v->Oe5pGB@<@H7iKZ5lj4Kjf7#uS znYaHEN@>!8hPpvR-JqdUEY5isuv`TiI>GQz=Urz<<12Pe1sWy_2od(^q>6enX%rFeS zQXnADkStYv{P4e0(^I|2o`aA@LX-kokp2@XLh~}nTcwYju8)d2NEIK2Q7JCe-d6uZ zDx8|#%5aMrMx2nzyfkc(kMehROvzKro_HOT%Jc=yfd?UIbI1g#6h;;k8e~w$Hlvn5 zPsVx@>hXX8i4=U9GMu;SFnMgh;stT4dr-c2W@(rC`g_YMQBMFGvrI>O>j4fLv@_V^ZeHFII}r5HHWF&1>4X zyerEYQ5G5YSIQcyXKE&}YR(W}Av@(66#yCgGbLln#rgW+>w*<>9ekJ)a!M*u8c@Llu~mSe}Up0cfZKlj7x> zs1SgLDr6}qwoC*KRftkf3jt`T0;G6(IxPgCp$d?i9Pg%Xx65%M01Z`ulv6{EfrctT w>aT{x9`Q(+Xon{(5lZsJFwlT4S?k94Jds7dC6B8;R!s2?W%GU&&mKY^hj*bhPc z06~dDB{1|y6DcBCYGEdQO_3;3TWK)Oi7TCoSJye~+<3ie&Rm;8FMD|RzW2WGeeQG4 zJ?GpjaXOvcR%=pj3pUwi7Pm*nE1}Z}<74AP1D+ry`4jU2nKbD1EFq@N0-gi9f#k?v zCk12@pvwn@G1G!NsG644pQbq*zyvS@L7T@(0in~-Wix8Dks1!sc{=C>1Tu$483i4i zCIuHlby8{A4QO6(WAZnFT$1Q;FRDihIyOv7q)-EF@_fCUXnZwsYHy^Xc5%rm?--dY zN;3~tA%Y;sgw)GQ)|cWMOeps7y0Ao|Glt5+=V#up~~?Y!TcS)Mzt3E*y& zRENW{3IwcerL{&NIO4XWlf*Y^Sk4AT*c8>PL^Aiu@kdzotBI0rZb%1N^JhV()LcopGtF2!P&|-<4h1mx&MM~@N zytQ&)7WHkbn9Sw$us8=WwUI~-=UV`k03^2$P(^B^>KEx@;Z{>g2e=2Q5Z$Gj?#jFo zb=*`ilaz{GOQ|%ncXwjTXLZl8y~Av=&D1nKNYZNKztILBZRnE#^i9i((uKl+;Ebk1 zZBXsAFY`z9Ud|{T(J5Smv3+8rCi6r+r4#ZLCeWxLzax#-xt~!QdX-8Y;)^0rAms{_ zazAb`Z+n1i0{i~23ns6UqSz#u4xO4i9IvhowwfK~yST-SXhmn~;B4=akm4HfSU%bueh2o1Tx&)Of zef5g9?5QKuouN6S*GZA-TvZ^bWEQE^D@0kZHYVrAtdi#pp3ZabU`0Izro#;Wk%pn( zNGt2Uw(Ip-=jm^&F9&pwIiP-jxx8gtv4ZD1AGHqq>RZAu^WE>8ygg*+FJa=< z$fR6xQt;HFI8~@mzq;%RmnRDq0ltaAPwDedK_hm)zDB3w_6N#b6@kUhKlZu#uvK@B xCniS7%as1o$%8vXE^G->|G(t@YovY%FaSBphnT?Pdy@bF002ovPDHLkV1h%4_Wb|= literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Line2P.png b/3dPrintApp/Resources/DrawPanel/Line2P.png new file mode 100644 index 0000000000000000000000000000000000000000..2690838f33eba344abe8abbf50d146853d95a1b9 GIT binary patch literal 595 zcmV-Z0<8UsP)wdz4+Ewbkd*|Q}eu$?JKj01D?_oj+YPaD~8%_t+=*jM?88 zPv`xo$&U&MCM}my@FFL4@p#9yd+Is=<$NlXYpwxICdg_U>R@YaX1o{IT${C9P*Elc zQ|>8@aaef??Cl?+zR^h(eIsa~i$ilG-HAbg^V)2-Y|Q~c8M(>;h^V{h^Ie}rQtPpl z=>PQ$OOUcrWgY*XYd4T#C_NxUP$(8!)dL}as9#8$_ACLaG&ENg1~mv;hsV`($O@%du_6zm2bwDsMd)Q?PRq)V8pIma hc@)$^>6mW;1^`Ra!STDMx{3e*002ovPDHLkV1fwr{>%UX literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/LinePDL.png b/3dPrintApp/Resources/DrawPanel/LinePDL.png new file mode 100644 index 0000000000000000000000000000000000000000..043fe986f44c340f2e8dec87928ceb822856f484 GIT binary patch literal 735 zcmV<50wDc~P)S3XgLll5i0T3quF+Wr|VL%)O zbW8x$a(^_bjWR#qJfN$ifQ~T$QX7C+9*2?z$Q(vS#sp|cIsl8L59o>+sZ~w^9VUPj zWyp?u2n;0!GzZOxaxY?a7|2o7#*f*Aj{xz1C~km>Lmm7d310wW0d)P;3@K0)IRJ43 z5FY^I`%o!CU`TyH3nAR0M9q)_hR6eG$Si>J55U;Oh7b%>Gxvc)$N?BC2}p_i0ZAc5 zjgSI{L;^H~7GRSnHH2W8(h}VPN*}<;*5rf`DIo<62?bI@klYZ0>nFlN0-z|Ob(E1B zeW0pC9#pXsQbMuZ{M5`zxy6^;s4k#h-M-qAu#7dyTkR~BSWP1ud z$^=0U1C`!T2UFcacpU|;VB<+mLr2{8YAA6K-ZTYFKLtpY>VIgCYXId&YNsKhiv*;) zYy%Jnkdmlz6&Dma3TUVSG*lGG&1IB0jDemdHPszOj)Q=q+Oef#!J;Ns&?8}{6I zf8+4gCl8BC%4i-!1RZtz`Io!-JD&a5UG)%*58izHAL=lo9Yk)r!djw#|Nh-z&DC$` zyYGKR5$}`#^3&B^I|Ru5LQHWpGv3Q1ec`qpIEtbJq;|0cUVi_JA^4Ml{U4AjA+`(z zItWBr5NL}L?WhaZQtV$Az4*Zc6L8{VWssE;+y(Su0Ij?FI4k7yk3JXv`2DZx=(C?Z zJS>b1E{a_Dr1_bQIXO8$449*!X$w^UfqK6mfR4F9uTdAq(UH8N>?nW$0|14ycA(8I R|C;~+002ovPDHLkV1h&LCXfIC literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/LinearDimension.png b/3dPrintApp/Resources/DrawPanel/LinearDimension.png new file mode 100644 index 0000000000000000000000000000000000000000..706c9e82268aadb295158850eb3f64af654fc02d GIT binary patch literal 921 zcmV;K17`e*P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA11?EKK~z{r?UzkR zltCEBXEk)!4=63QGPDnqE=8qu)LTM_Fb`!1p^y&Np-vG*ZI`-ssY92-gA`#~LZlR= zK_9m$Du^-(J?NICw)XC-uiN}*pIP6Tef6DXm-4Vbc$|6WA_YmaC9gueJX-9uT{xVfM!5C}|>D^Ns@gd;o0 zXYGN|uvI%WJ;z!r{PxlM;`duCiuX|yfzRiooHzOhjf7{%?|h6@hJMCa>-s|0R#!B< zySj7-RST5m8=bL(Tu@E_uQ_HdG8PI)^B;Vg+U5K*fPqZS3F7pAo)v-s(%vtBwhPCB zB5G!Sv6c%;P6LGX{;>SyW`*wYDCH7Jfld@rWrcY!ThFhR2gJ)>$2xYux02wr5M}A!;JXWKX>t{r%?kSoFZnF^hFn z`B__i@dV$qRa7ldL}9S|eFJ5-ZTH#pv4)r(51nj3(yj;2l-qYh{r)w12crv%11FBP zwovgB7*ID(u(`PznV?&JrsfqtWbDEA@xm&w*X6h2RbBS!)ba6v}BaB4xy9Afr6`n0gl&Ii2B8`f4%F!Qj$X^jp zQ6%Uxx%rePFG2{xbL8;QWF=DgvJTMlh<=EJc*w7WrznRY34#i{_wdPc2$9bbr0`KL z+vp-(;-%pF&nN9+JZ3`v~Q-4W9*N`Md-HlhYUEfn;Et(&U|k z2O5MtYAT;Vx~;NAeXu1qyoEm$M-l0^eH2j$KtUEn0b}!&VhJwt)b+?im^3L?8*GI4 zKhIM+OEP|p##2anc@mx68o0gU_1&T*i|}#I@MJ%?r`&q94_H=|Cwd?^OylXXl;uOE v$zT8jrt=Z$;CfH}Z%j_#KPM;3495Nf7H1i_Q1#x_00000NkvXXu0mjf^7F0a literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/MergeSurf.png b/3dPrintApp/Resources/DrawPanel/MergeSurf.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f6ed3eacb236e29b6cc88725ab3a1f16681aeb GIT binary patch literal 749 zcmVkZFXH${tWPGAIFv+hOS9)yOPC1ahrG zOEI!+q?X_V$f9vZV+jHfhON=iek7J4X=quoKBLl5*p`qKfYJo>I5N0ilxhYG)Np67 zONZT~OY4gPIdE5h`n9*<$m7EGXVzsipk@si5{4 zOW1`>m6JV_#@xpsK7>|d20dm}mViJ5kY^} zN-aYPmhc<09}@M2Z=d2ai`H10+KYjnvxIKQYsjzE4KdIvDs*V8YDQ2Xoh1xGUTVft z(bQT3;w<400Zl}up{8khAI;#VxI;D|`_LMgotV?qM#2D+J9P{>Lpll)6#%M)@sgK# f|Gelk{tGYwt0{TLU$DzK00000NkvXXu0mjfApb_$ literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Mirror.png b/3dPrintApp/Resources/DrawPanel/Mirror.png new file mode 100644 index 0000000000000000000000000000000000000000..c8edab75fca9e5b046f23608c0a5a13b65cc759b GIT binary patch literal 437 zcmV;m0ZRUfP)*sEdUn6jC!jd z835T6pkfOyg~~0UcStD!u{{(EKtoCZNlanDqYo5P!#YhdQIMVr2!vDtFpVY9#ZgcP z%?DzB0wD#GpHGg%n8BsGf}DH-4ZI?@4$)B~VH9*~`BMn_#n9X0Bx fQAZ&FK!5=NJcWdHZ|On+00000NkvXXu0mjf2Kt_I literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Mirror3D.png b/3dPrintApp/Resources/DrawPanel/Mirror3D.png new file mode 100644 index 0000000000000000000000000000000000000000..a169939c381afb47c80f4f6c4161b2323e605e2e GIT binary patch literal 538 zcmV+#0_FXQP)IxAeA_VmlM8Q*z0akRneOT~`6hX`kRj3_tJL%k0P%2@i zdS~=&+CBh2*7Ac=WvfQl+r^#=wU+=G8fyBehTP5JQALfz*;lMx@R95jbxbtne9tm&y;L{=BflLWHlsoG#(Ll_^CZUU-t`ZU;uq*A2N z`IZ@-z+S5qYYOGtCNxL~erK0FiFcnklte~%N;#$eg;J{N2afq(G(t6|+ri2Aa@Fv; z2SkeJ#-dQX0R1VwDpFn~-*lhC+<>n)6OIh?GjS+m!I&4Mh4VF2^tcs749b1ra8Q2* c>PLV90O~Hdo=U~?!T literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/ModifyCurve.png b/3dPrintApp/Resources/DrawPanel/ModifyCurve.png new file mode 100644 index 0000000000000000000000000000000000000000..f84dfcff225ca86eaa20a81182e438a9a0d36295 GIT binary patch literal 707 zcmV;!0zCbRP)N2bZe?^J zG%heMGBNQWX_Wu~0zgSbK~z{r&6v$gR8bg*XBFb6g@%g=A_${!VTIPJLKn6e#DX@~ zA|i&wRZyG20mDc{(1ip|A_x|ki(CtdMvM9vTFEqDcNo9-ujhB;Uhc#Nqr=R0$-RHIFy8>Y2f*#sKT7-e=n%X=2=4I>0FTbu+^;^V;JOLCL3MpnU~;o) zJV^cEm-_SHj37KpXZ8{j4qw*R)rGG$iW3CV>9kUk`26*oePvLIgWenHz=CQ)rKzYW zL4ZmVQBi{cmAX+nL4Zn~DBU1HWz;AWL4e9AQKo_bm5oN33<6X(5@k9FP+4zOGlBq> z^+Yu*2vAuos+mE6%G08n9R#SX7S)O%KqZT6RS=*u7}d%kK&3aT)j@#DOeQ0#R7xx8 z;O(@!@U>b{3Gnam=Fi`efud{T<< ps|J;ELuK4h88=kM4VCdCi4*Q4Cb8Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00Lb}L_t(oN9~tSOB+!X#p6l@p;Ay{7j5Xi z;2%T~i?JU-+>2o8t}A!C%trkJf+&s@)I$6h(4DyPqa-LKp>&}!2GorAjPJ^uH#bf) z;yf35@PnCi&wKaG%nQ6ET-SYfh@x#o(Ke!J8&R~4D1vW$`FSFvF-@djiMeKv)H@)6 zAKCKxXQx_EZPi@nqjU9Y{A=F2W7*=R)IT5qERa~Gi#G;+%-$d%04Y@0+JpCmcv^mP zXr_<7?D^zWym^urb^3&9v%l{K;5)<26F;oi+@y1JmD(w-s(pZcf&K9Z&GaS=bkvp4 z+eet+zghj?y-|JkwGt|=he|q?n(0x#Oh~AVG!GBRzDS|)mQvfLCDWsPkwSghE-&!g ziWI8PxxS}+@n;(~6zFxX@8D}CRL?}VRK$egzvWG{&X8}e->KBiKp-p>_7~PiAM`Wp zz8eNcVnC`fRQK&Y9sEM6J}=E5i)B4+J56p)lBortMG|2%-W-4VBW@ZH1tq27;(S zflz4pb*GrqkG49{)$#eolSU(gf*Q2oFBJ&s4g^HeHlk=7QM8RH f+C~)Z;wBye?On3|S1d>Y00000NkvXXu0mjfk1$W! literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Move.png b/3dPrintApp/Resources/DrawPanel/Move.png new file mode 100644 index 0000000000000000000000000000000000000000..78ab3a246420db4311c9761e3e09bf8fa45b57f6 GIT binary patch literal 1115 zcmV-h1f=_kP){Q8IC^S9p;LcDAbxHy(AVHC%yd4Gxn38zGJ8fmltC2&=dPCA;h`Q z(m*_brjELN>y7Q}_dhojtiK`j=;v>O>OI8y7@ER0Udl>vY9NOiRnyeFkH1$3t+-5- zgFs-%%TEk-D{qKjxcPAhO%nQ!qfb({o_#KkO|I8LiQ#goB{qyhQ?RC zSoN(8(fRf5$KNuV6`lr~qHdMWLi^)hZvDsq{25&Qm8=SeT5~>5h8+opA9*-gDuBhp z3YwNvu(FC}Le8#V*Y1n_fAW#}c4QL6Sw&X{ehwA}Eot7Ls?xl#e*XS@#8OWv3tIt7 zlM?-}myOY11_llwQ-qO~>57M)L`kfd?hB9{&=Cg+8UP9@YT|vON(Mmu0f-%-dm4m=g zx-j64JZL)F0K|pVa1gc96et~C06J*GplEplLkX0iLA9*IplA*Q9RzX+C~-RgL+JzE z9rgYDcjSp2o_|X!G#nAF(?hezSl61IeX&LaYoD zmdd}Fh56sJ*5PQ2P}@=GAAK%lVPdGCcJ&MYx$l^bHuW{l3?D!LWLq88DDMCH?4j`;TLUq|Nok8Ic!$2{K0Aij4$!-~o|3}=~m7|!1K%YB;G zu#1`wLn#tCSQxu-IVhL&HG|R2ZicgIr3@#zq~YTGKK*96{^qyc*$1EWXyT}AuYZeS zQ?%Slh{1GY2ZLCI3&U4KPYn6 zOuR&CmH}qdIVJ+{SXmf@sG0k)wi1B3aKoFgf1M6K`^mfh%})$@BTg2E0C~=zI-+b( zKmPa|Xsp0@iRO-i6`=Ru|IPdT_rKSV-~WDm`uSf0m~LM1urmRhtPEHG{`)_X+K!=V hZ)S8Pk6r*EzyJv#?tKlu;Ozha002ovPDHLkV1jLe8x;Tm literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Offset.png b/3dPrintApp/Resources/DrawPanel/Offset.png new file mode 100644 index 0000000000000000000000000000000000000000..81c0be2532baed4776cb29a55f1b2ecb4d826343 GIT binary patch literal 658 zcmV;D0&V??P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0w+mCK~z{r?Uyl2 z96=a{cViNW2`U-{L6S6rAVNqHEClTo5lM5liGM&&Y%MJ9)ck_fR+1tK*l1%R2#0}S zrzV<8#T-O1YR>1?{qVq>yE!?B1Mh{0Z`|YD=f0htosDz3TvTm&kkqP5P0BYlDc=;l z`K}dWZVbJ zn6FsDiGJH8KS*M;&~CHR{~u!6E&Gr&V-VB3c6&6aGZ>t z2_>b+&OgY4=2g)Lb|@)Zz*MgnGe<&6sXLnB_P8pV(4ErxY-iz2C@D+HOQ(dE@=7Qv zZF9VHucgXLC@I@MdnJ^VR&(w5wMJ<_Uo@elY?Gz)Rn3a77Y=nvlssn;DR!V;l;5xg s^Po3rXDa&QP^pBvd}XC3<(DYB0J-m|RZQ5PfB*mh07*qoM6N<$f}%4Y*Z=?k literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Plane.png b/3dPrintApp/Resources/DrawPanel/Plane.png new file mode 100644 index 0000000000000000000000000000000000000000..bb85fcb63af58406b0149a98e9c444265b5b0523 GIT binary patch literal 686 zcmV;f0#W^mP)Z`~?dz?I5K{fI8?vU2QFYMP(&bf{BZZ>mbk#4rGNC%t46>32+C!_|Cxa<1cxR zQQ)C4O#vMw0E@D&o*uB+`L_%VrFVXj9YTA|*~rg*PzN0VI!J%!?AZ+5TwDw{K2qi& zii!km4gy74>z&^NT24(scTnlI-we3zvnZfk>_3IcW zOq@uTgQ)5#P$+>CHYnPvtE*wc38XrRs*Z9LfrQfWqemGYJOCvjhDM-+E(~aIMv{vG z8g=k&zhJ<-SfCt-)DZx+yC2Y`izNxPXpS};Ip!Xq#DjPp#mbtQ0dpH%6U6^q?uO)tqDby~^zT)y^QLRu0><D~SI^Kblpu>0pCar*~Jg+eks>$v8qe@(5_eIZx7K)|V7fTQ7uLg56PyRxiZ zMkVZu);ucym2`NxAY&j^5Kq8DbZ!FV9V7|s zd7)SeMvm>4nqSB6n9bGMJo=JD%|R$NWRAe+=#4O-9Hz{Z0pj#{Opg-?3Wmw;FdYyo z&FM0wpkQd6FE~Mf+E|_H)nuS}KS+iImBjd`U&IiRh!FtGak_O8r~<~!l2E)`6i`rq zQa~2F*u_JARsbyPmm>T^7o7s~SLMCT#S1yOdE1dl5&zbSv?(VE_FBN!k){&axcm50 zNb_@5p!~G-C)m23%M8X5d3hQdH@)cza+yDAmX41m1xioHK$3Dq4oCxOfDn+Zz|r{z zQlMG|AQl7i1c18MQj8M;?_4#q(wCF(zFp!PIJo{~-+AQpD*EhE-Yv&cRTPTycR7$4Ba601yJ9Df?t7HA4Byj zK=pw*3y9J~grN@PL;;?tcc6x&4nPfiK#qfu%y|Gc=Kw{H0)hl29|ln9r~o9h63B8C z5C|Zpg#(m02urAg%oQNVQON1QfJ%-sASQj{%Q62+$uT52Yypzl3Zyt{12Mr&rlXLP z#Rj4rg;oR$1Y%-eZh2{ZDS_#Ox zWCDebnm}x>rmA7o@*Guzom$C&*p36JuIf)r&1Crd=Xc4X`E$;a(s3xMZkXTG3Myq7 z3W4@bAZQ=4102}}CHEMdvJ}<-y=5@iP{Z)|-CLsceTZ#fn9X9qVDog(i>jOiNvd{6 z&3s}{to+QTXu<}ptZqDHU_Sqbpq{^mA`JVu#2FZVF)&DL815&!<4ej=(5fSMsti`w z+~u0F=OwXvzGb+GUkGhc4zp2dqlu$NM_oo8HB=o15MTfmDvP+;`#bOe0000^@`=MzB69OSS#2@Zx}b?%pnV%$vwS|sSp@>;Mz zJhHQr@jQd@)1y0q4wAsB7?k^PVITm74v5i!PaUzCSo20p^ifBRI%?EWqmCMN)My(W z3Cvr*&Vqx53EUnU6d?s_Q@@qAc5nZ0$naC%#vR%o8n}?U_UudD%9~%|ZE9$X(fr)e zJv)*jgD7#F1KE!H{Nt|^%t0^!a#$q`lRJ>X!lA(Duj<12tip-?1Nnw$~{I zc-#9}`+eWPe;2s@_RpEMx4$XF`e_N;JTLJ!VW|jkc1A%CyZQQ0@6SK~ltH}?Eh(NR ndL?wm(ebHKM~wtW0R$KTY=;97e_hp=00000NkvXXu0mjfe6H+E literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/RemoveColor.png b/3dPrintApp/Resources/DrawPanel/RemoveColor.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b2850b79faa5e67c6ee2a86a96ed581c458d6f GIT binary patch literal 1048 zcmV+z1n2vSP)-4W#^l*dK_ws2x&_=;hS8GiUF9{`@)D-qB$j4hJa#DNtyLfeqji5@O;OlxAf6 zF9h@=ACsLo1Jm2TmBkN_A4|&NVZc@W+UOtE9 zgwD>+{_D@5KcDYEe7NG^{sUfUAp~&{w}=>%xUeMy+Y1y2;RC-Pt`Yxnv2XV8efew1 z%6-z3l6;@PeCB=e^2MA}Cr-*k(@+)6LCiwT#tcmFxJgYb|9`$>_<40w@bBH3J4kkv zxP$~JBO~MYS8v`(-hcRD*LNZBBv2XxN0}g}{(r_V6y@5VH)gp1K2W-VMC2=o ze)amb+6m^M=3iU}T%a@r3?U9`%M+3u#mvmiz|Y5DFDob4|8qlKEZ>t&a5;G@C3Z#*p*uvUDX@bC1i%ggYi8rS zNRw73uPpJ75)u-gs-U3I1Xn1ewS(FYVwDU0imge5)lou%f;(m9WOGo0nU#Awibu~OLlGpI*3g*svchpl#$%A1W*g|*PRu?poSZ< zAq9#uRt3*OLQP^uN(MOop6pEd`}RuCpVt@kK}``{jsiJ`S=@9jC=G$qCdnNKvTFMy zwV<}V*S{~%3>g0X;sIA3|NpUq3PxZKy8x71OpIfw>ZsANgi%M0I*JSc5MThH8%D(z SmHwCj0000N2bZe?^J zG%heMGBNQWX_Wu~1Pe(-K~z{r#g|)XR7V)cPd3?v)FN#onwFM|#8~l$Hce`w_9D@= zO^wD2LI^%+6mJhoO$!A#iA@`oVp=rC7++LuE5V1>CoR=h6j6Lq5X1+=CcAsqY?HWa z^rbufe`n6@IcMhVCH3h3;Wy`-Z@!uNGqY#2(HLVBg5;L>64zwDaZTnM-ekEFS-I4t zliOSw-blrJ|BSGCX9gHO#kiM}*OyUr@NYdy69hC7>673a&;j)(^t&uR*VLEtckv}a(wTlTeytfojP91#=DlllXk2gg9K`8;lN6!d^2pc@6!pbiK|HFpHDbcNau0*$fG2YaBbqMQU2gQmh(@ZK62n77-w(+&J zwn)v#H^bE*C1Gll{^^>UaMgz~ec8$zFh|o2iMe)!5Eaog(Xe7#bX)6Xz@l4r-|s(l z24(6zf;Xxz0UEfZf6_QDTEBMlNPAb+KVP*)2dB?vkwx#bSaZuSMkS;yY6?*y@FnU$ zD^D5P)_Mm9=gV{KSb`srdsQ}MjN9hOSbl8=#_v1 z$CcR(k;J}kSbJROCE|o!KSO4TWAk)afm4bpQv67-_VDo0 zx{*NVyvX9E7lxZ#l4A$D@6s5GU&>~PWZyg;R^XJYDWT!!&01_{t3Td%;`ew@-#cC! zB6y=Jqba*kG$|KDBzg06@J3Zmrcl7&vNW%~UGm16;EgK7l+Wj*UjwefEczZQ^74cP zyip}iihgb=!T_C+fBb_bZ+LBp;Ek%Z*N0>gD1Nl8_O)z=Nb-icUwO%g@uKyF-qS< zC0@Vwnc$5odh6KP$&+_tH0x(bUi4|a6_}#9 z<6?x>^bfG#&fgq&Gei>eo&{E5ZnWn@IQ6g3*9ZE^O#FEoB9w$MBxwKkR8kmvu&U{G zx&B$8BwB4JRgEj`{%Z(nJ{H@!BR{4Hxk07*qoM6N<$f(q0r1ONa4 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Revolve.png b/3dPrintApp/Resources/DrawPanel/Revolve.png new file mode 100644 index 0000000000000000000000000000000000000000..821795ffa4fed85a2253629053c6c9b64ab734c0 GIT binary patch literal 2519 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 FV1hDZ0vG@Q literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Scale3D.png b/3dPrintApp/Resources/DrawPanel/Scale3D.png new file mode 100644 index 0000000000000000000000000000000000000000..08bf3a113edaff1de529a58072675b947b50c1e2 GIT binary patch literal 687 zcmV;g0#N;lP)-~z=F&XDBPh0q+FofJy06PKl`EI<1F1B1q8-GTn@y7 zKwJS8>j2{SATgk$U9maLqjRy`Pi8hHavdS{_8HsK_QG9Q9R;*-HPB)~sKZtRaVW?^ zKyhWD_)H)>4T#gx9kf$O-Ceh_Cl_m_jL!V@QuS65(rEiOw|;mCF748!_297L-ht&m3@HS*e1_`s99kDVD` ze8efw%E9%XQC;aA-5g~&VdIVqBA)KJ9-&2X>HvFnr`tj4BzZ?FFu~6GVcpW9Grow=)u48(3{x2;YME7!v7zfeSQN%ikq{0&&{Qrk2 zTjZI6G5O`~5w<-Wj$>2%^A8idzz>ES#5jl|M=>%o{DV2jnCVIV%=WydK~eX?95k;h zy@{GpO}3+${{Cd7g@f=$->*maRtmp+^#hmuTgLZ4r*@S!(IQhYj*jFFWk&%77yv_t VF99PtC&K^$002ovPDHLkV1jN=Hv0eo literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Screw.png b/3dPrintApp/Resources/DrawPanel/Screw.png new file mode 100644 index 0000000000000000000000000000000000000000..f9d52270d13b5a988d895a0b5b99e08190b34dd4 GIT binary patch literal 1582 zcmV+}2GRM6P)jV)_cQnLlAieN(zUOZ%l9(vOBWI-hkez>haO zGy8s@`ToA|&#p+4gf`pZ&?Y=KC6wH#M8zW?lv5d;`qZaKXE%jXiR+FU&pVg&=6@@` z_SMOio)sHm^zFw!?-NSZ9jOL{l;kKyQmezizW!w8KT&GOtCdli%Qs{$Hz4zQ^0pw* z_T=&>H&m$|FMm;jBEzKAaS3&-G61MBAqH%Ee1Kq8STB0I_e#vm~(6Dz*2Elh6; zg1|Gb+q|&9IJ;&jz_7eyh^G?Av66G=Jc6JOIoU{ZHG3ruhVZRlw1ssu2v*1A&q8#% zU%Sz{JZNf|UkbNi_^mS_v=XhffT>?h<`-uHCI!kNmKOu@VbF zYLQ<;mBR2dJ(`W3sUw%|{w)Blee&FX;&cfU-Bm7+xXmjTMx`YRta_RfsKe!4;+Lge z&LOH?G5|HYTKh2Bl^BRel7*5f7>}S9gD{}f3y{nB#U9f$lQCTzKOYtQpBaDl(dNHe zkYzqsw|+snIC+@Ckdll1(hF!$F80gx#q;$0 z$+w@LT@C7QjsCzV-`7Ir4ViT2%_hOLJPf1U^nE59mnm#sp)gTtq;qcJ0L88Q@ILZ(mMoNMx5)ARgHxxDRl8o0ANzKybYp7j4cGS{ zY5i2c&$R#CB^DsiGNj2Man9E%PD|$$`pA0_Q=XS2l#W%R#BVcH6Hujf+a(lFoGBrB zS;PpmfEZY$8b+Zg?xg&^yU5wrN6Gv=1yDK!kij|4w@8E`ceNW}jXSb+x&QQqL(c5X zAxe@1$(F5N0-zYlU6jg0_=vDQ52af6x`WSx%S`kHpla)~OL*v;@iInX8Ixogstgqe zN)+|?QxJsI4t$D&fZUKHgn)=JvI8NBjV&v2n;wm>cL{qwIydNhy~DBAWzu?xw>v5EhKnKqWvemh`T@L({wC!?^_{qZ#~$U9y+Q*yMf z3n2=SgA5XDBz7^xqX=7CtZxP?xma0Zytu%11r-!0MRK3jfm$)j$uJx)-%CAwcsVbv zu2kTk#QPT_-Z7w~#42I%rV(iX2?REL7ED7y$KH=^8QDJ(`-xQw(;$S1B3_t}1E|u~ zk5TwynC+Nw{WB<+%f=f!l+J;lM799O9q?>!iXyZOWfcNU7|fwR-Ykv*Xtt{bIo(ht zvmyuzthNCVCp0m(GL8!<4(vqP-Dp}hDmHhz!P@; zf{zUEuh>ff6EHd5zE!dGNfS^t47KXa`_EUqo%dFPV!21`49klxzd67X3+3>C0$e`! zNX>4Wjj7%od!a$=aI83^W1l{ZhD}+>E;TcVI;5&ieRi~dCw^7`qh+S^kI72Ic*CLo g|I=)k literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/SolidAddSurf.png b/3dPrintApp/Resources/DrawPanel/SolidAddSurf.png new file mode 100644 index 0000000000000000000000000000000000000000..cd687b1e32d07cdb09c5bf6ceb8020bfc74ae451 GIT binary patch literal 1567 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 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/SolidSubtractSurf.png b/3dPrintApp/Resources/DrawPanel/SolidSubtractSurf.png new file mode 100644 index 0000000000000000000000000000000000000000..0672f49421b0fb2c23c2c62e86b37c3a8bc1de0d GIT binary patch literal 1408 zcmV-`1%LX9P)N2bZe?^J zG%heMGBNQWX_Wu~1pP@wK~z{r%~pL()MXt1-9ah|gmao3!Sa?ir$!X5a${==#0e+H zg_UCCO(ifLaBv(DLX)?S7olVZ4ki`7kd|p|pk&S?JmKEJCE40?%eB@&nXMTL-@f0+ z-`$Si?*Wfv?D}q>J@{ z$C=m@i2Vx?(`Ig(xHlj{%ZTNKGm$qC$GeQllFSt-M*ozXY>p^!YRZz#1t=6|vpas5 zhLL_z`4htCd{~lD0;=Rv@Y`9>3@wzYa~CgV&uA)4 z|HQ`NBvnA@t~!??pO{*mS)YQ2?g}wF5HxRt@VXI#celbS-A52neFnC) z^exDq>gpd-&1gyyU(m$9G@2#tA@ECUf#nA}K~>fRPuKQBYKMs~);ZmE_XB=?x0na1 zsp#ywAVNTV(bsJ05=udM?Ok|q?@V_u{orV|R`wn)W9Onwp2j&s$4X&xEoTin8 zz(m6!GqtrG6se66l6wqRm-fK3#(qd_8v@-|V^DYD7q0j`!0tbpsZH6&hY7)nh9PDO zH@M#$hhh2tPFPcZ0-_twL2}11n<+Ad`(TPAJ`MOp;qvZ4otf`GnJGLdnJL^)YY(1; z=%xYCb`HayFMovM^EcqUZT`#XaIklk>%k{8^+-{70Krdf`261T9mK=336{Op0gsh^ z0h=1m!q#JENbC6l^7^hrz3Dm(JFak(c?z4|-r(+GnjuDru_UqBh^D55#4>gq1ije? zVfs%YvZfc}j$DLSyR49fOPG7+XDIpRs#nHvh9+zd_R^UB<>`#bj4Cafy34MXlxkR% zc?4GGb-@~3!sl_e)JF#)<+ufQbURp?(KQ5pLso8b9&n#s!_u=ix_g8q>BrawjGLXl zK$@-4!fsesc?zC0_TkZR0peRttfYEuV=ov!9)RxtL059zz!UhX|An||w%C5PI~*qD zW$$u#$O*TI$~_zzsMg&S)CLeN1e@Dv`TR8pOIYJc=Vo9ili zJhk!`>4=iDd_2erN%(6F>G*89!}iwpYCPGS*^I5oJI)T%aKmS;q&o3*@>4(7AIGur zZXwObgPf3rW`A9P|I6jZ#V_gp5fU&F&X{6n11!pTAC_i+0Kqx!tfV^e)K2}VKaQ)X z@uCz9X+9q01Sjytuqa$xygg83xQ0tPMSF}kzhZ|G_gVuhsV*c{0<|yI7=EJuG)|Oo zg)|=za$=UiB*9VX@3blsivLg~l-yP(l}{?SRZLMyb>gX=`iVniA O0000{zi%13?ho3-%t`D#kA`SP7y=ZLCZXtVBG~%EqLyu+emag+ve(RC4(OW1;m~ z*l2TtSVt5)A$~wu-5YI9f{| zU<9}$!6T9m3*Q3B`AK6YS8E=T&xd9St$c_#B;QKa{p6KW&Q-m zb(HFKBe-G51CeT=p|WOOm5w&4um~x4_%s`( ztKIw9Ph6cU3mZL0s1Yf<+k~1$%IPK{f)V`{6p@NZb!mJHFaX>*mLYP1L7D&n002ov JPDHLkV1gVDGuHqB literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/Swept.png b/3dPrintApp/Resources/DrawPanel/Swept.png new file mode 100644 index 0000000000000000000000000000000000000000..88f86ee1018b303d21ffbdafd29c95011af0d9dc GIT binary patch literal 2088 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 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/DrawPanel/ThickCurve.png b/3dPrintApp/Resources/DrawPanel/ThickCurve.png new file mode 100644 index 0000000000000000000000000000000000000000..03ac50ca188cd6fa3b2d34ea6c6299239b70b9ca GIT binary patch literal 758 zcmV(cLAijf54Liesrk@Oq|8Ur81jL+F3n{3B;(_=k5U&9GwgFwuelcZPASLYh z>h1+Jy#he$01!U|Vr8nNDI^Ca0`UtxO4Wf_7U(!GEDi#J0;(i*WCsC5X8|sC&`^R! zjT#mQIRNn&iXBC)gP;HuI^Ut}-{=kk>ivXb1g|9_n%)j@c3AJ9P{AKC+PC#Wm}@*U8X0I>qPxNmS3pY)GcE}Qsu z!v8QZz9ZE^go*@HC|wT4C_wYycZTasochp^goDi-(hLkh3^e#p_Pdh?jSK5PkXr2E zbJS@dZUFl705-`59uZHzbMTzW+%P8qUCtwKRo{C?Hann$p3|+GnG%#CuYT*Y^lwg1 zX<+nWwx^l-U`c?iwl>KXGAN6){QZ5B<;xES&e!i5rk|ezN^_2Acp(s9#3JqpO{1`w zpgg2tWscChryLASjE@=q{r@L%?K;PY1E^69P5cVzQ4bVPfTqudK)D2Jl<4q6FwLYu z0qCH6pj-(omkNl~4|2qOLJlIOL`Nx=*DuX3fEEb?z;da8nhqkiM8{T5C;+iO6n~(m zgNShy4~}XA)?E1r#2cvTAVQ7;Wr7LVstI5^dH~H~6M$@7AtgbMgFt{0SGOJL%O5}r z)N(ur#DCD`Bfj3@xy>o@<17=;A1vBcfLNLw2N5a~wnH0oFR@9k;8wwBE+`~L$#D?g okQ(h`jXG-7QKOC;Bmf}50IvZDt|=^@wEzGB07*qoM6N<$g3ER}-~a#s literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/EgtBEAMWALL.ico b/3dPrintApp/Resources/EgtBEAMWALL.ico new file mode 100644 index 0000000000000000000000000000000000000000..90d629658ffc7eb566f1f908b9955e8d9fc0ee46 GIT binary patch literal 9158 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 ZOAxV2BH81GAFW93*7EXfd;PO(`d1%ca>f7v literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/InstrumentPanel/Analyze.png b/3dPrintApp/Resources/InstrumentPanel/Analyze.png new file mode 100644 index 0000000000000000000000000000000000000000..e322f1d500f3c1055e55a45c85f4e88bbaaa9dc0 GIT binary patch literal 962 zcmV;z13mnSP)roB^W5c>8RK5zD=KX z>U|xR-34;gLn!+oFsc%O7!;Kokkkm^bkx(+x4s{H{iAWo`43*yauF!K0I>p)X$VbM zFn}Co4{+wbzn{MSI(O^YV`c`a6+mu8jG@3bDmv~0Qj~%mCy$oqa3}QNM=#2r{`Q-9 z|FiEas2O5N4g!TxJ(AEw^r8X7QOviWF);l2{ho#nLk<;C8Y>{GME`i^I#`_A4uggg zaHyTuPrLQci>y4Zu)(K(wR&efq}0@Z|Ml7=O=)pFBsN zf8T}6VT_E72|#Q>grfv-2cWnQG6jA}eDExrU z9AKsI08Qu{;qT4nXk- zBpP3Na{)~)vVOt<)Nz2}^u(nXwDp?*7i6y5fh-Qg&}twy(TcM|9yX&c)CwtZLI;}l kVbC~gbR=(}06>5N0FHCa%GDtL2LJ#707*qoM6N<$f>k)3;s5{u literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/InstrumentPanel/ChangeParam.png b/3dPrintApp/Resources/InstrumentPanel/ChangeParam.png new file mode 100644 index 0000000000000000000000000000000000000000..d8c892aa2ef96a4454985f581012e7e002e83857 GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^svyk41|*NpQ(y*CoCO|{#S9GGLLkg|>2BR01_nk! zPZ!6K2+p@N4)PvSkZ7HMZ1>#;3kFa34c-OUIInPS5sonba7L(%nO`Ts>;=a&|BOXb znZK#GsnslZx_te*yqBDUak^OY`=Hz04WH%ruQc@vc`tj~GQ4Eoj>LYaDG#NeExb}T zyG3(lF5`m-v%>c+wV0};+`3zD={DaM9COsyi#vf)}PBA(hN7=~#_zQ|3kY20k(gogS@uzgyG&s!ZTC zP4VD&i{H%>{%~U%oA5d-m-HzaJDPHW-8%UWoHhL(W1A%E+@faIP}*~4rp`WQzEigX p&89Y9=>NEJ_c?Z%nJXA77$bP0l+XkKVdsQ8 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/InstrumentPanel/Statistics.png b/3dPrintApp/Resources/InstrumentPanel/Statistics.png new file mode 100644 index 0000000000000000000000000000000000000000..7b449f4d540f26c469399f1ed5f98d9e8d064136 GIT binary patch literal 417 zcmV;S0bc%zP)IuLGz?QG+e7~f!XzO3J z_1}^blWTS!PR<#1*Y~+pN)YGQk%~Tututyp^dv4>zB0&R^f3%BbsNi6GGXfs!im<&0VkHEMO0Nx-Ypp>)ZT!QLEwJW52QkB}htNxtt&WDAC3v&}AphB4(z!pG8TP=Wt zmT5I+A5@f3W(D9Kz~&E=8o<4lY3pv@h7<*$WP+Xm6wbPf;3szqCW?-1$F>_S)0*w& zLYbaj$VhD`*xtE|#MetGv**rdSkuqlku~()KHVccIt6fIN~B8ed_h+3UwKE0_|P(a z@i7$2bT6@|m$4L7aYts}xQmcEb(m`#OcYfaZ;orKN|%~9(V%@w%k+T>D@Ts*i~EIc zo>o{v;%fR-tO9#XP4v0Kte74`nNj=Tk($H*6(y9h-T6DLoL_t+^+?Y_UWDMRDCf4X zv`nubDWS}U=AD)<)+i)QL`IixMx#egc{G>~Ly|axb~L(LIuUOGUSkRZiYX*-c$`0?(ku@|PHVX^$0q_I4248!)x754<0000< KMNUMnLSTZ+ddFq} literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/LeftPanel/AddPart.png b/3dPrintApp/Resources/LeftPanel/AddPart.png new file mode 100644 index 0000000000000000000000000000000000000000..1668e531fd5771dfb15dc764de5caff46364819a GIT binary patch literal 525 zcmV+o0`mQdP)Fc3U4DS!^-20TLt2_3*k-;fTV0!RhWft{~E z&;g`^ct#DN4xA1$$E-7lVhfpoKhb_{*(YglZ%?9#i2r~=-#Mm*9TCwp5eX@`viNcOU6zo?%=gn@-Bjuax$Ja z-RvTECj7(4!X}hV4X;u#D3|ME#$7t`YEmL&-prdZ%C)UK5#|^u%^2g>q&7@J0lkJrNNR5fKp)Eg+(AwAsAOd6z=L P00000NkvXXu0mjfUhm=Q literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/LeftPanel/AddToRawPart.png b/3dPrintApp/Resources/LeftPanel/AddToRawPart.png new file mode 100644 index 0000000000000000000000000000000000000000..f45b5b1f7c3ee30c638163c0781184724455279a GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^svyk41|*NpQ(y*CoCO|{#S9GGLLkg|>2BR0px|3i z7srqY&bQMp@-`U=wAJ@8?{JJ=&?&vZ`-`ZVpjrWI&0CQjjhx&Uc<(qkGcA+LSl#IL zW#95?+SB#RbAt_d4jY^)aVbk%>3fY&pW&S1>p0E8vd5~OZ=JgY-mxwU;%F$-md?9$A&571>5+F= znf3|Q{Crvcit+lqLdW~T*ELl*&-MCgPi3F*sjk+5=kxb7!VKmsnlx`qc11q|dYr-2 L)z4*}Q$iB}>t%V* literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/LeftPanel/CopyFeature.png b/3dPrintApp/Resources/LeftPanel/CopyFeature.png new file mode 100644 index 0000000000000000000000000000000000000000..1c75bbffd0b8c9c3f0e1e9ac4b93f466368c2abd GIT binary patch literal 434 zcmV;j0ZsmiP)(7=xA0PR3u@+x)!6@V3J2jc5K zNd;gB%%lL_4(LEjpKkmQy>5BGb@Ws=Kxd*8P?L?V$BapCbOze%e*}Hs+22HR9$v@%2K5!-bepvqAcbiscJ=? z^ey(Kida4Xe0qrr_7t&90Q9u^`A7=rQ^e8*Fa|KRYEDlgideKFF95pMg_Sn|4_<;A zi?VG}<1Ya`1DNGmvhWntMpVJ*5Mm0p8r?jTdZsE^lo?os&5o$&hsy0EmZ2p}Q>8|B zqqGBM^xkSsl%;9_ATcBN%*=ON#LS7sxjy(?d{L=^RYp+*KUVb}H8-)0Y-M#A+kEdE z&sK$Gxi-?SOe|kv3;mDIX&t{2@jO+R^FQQm9^gx)4b1H(O8;Y5J3g#&ZQBD}`&=Xv cIT!%G0l42)UYCHvZvX%Q07*qoM6N<$f`%Qoz5oCK literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/LeftPanel/CopyPart.png b/3dPrintApp/Resources/LeftPanel/CopyPart.png new file mode 100644 index 0000000000000000000000000000000000000000..4134ad8e0dd0eefb693b79e75463c41439c229e4 GIT binary patch literal 474 zcmV<00VV#4P)vnKW{ zPxX*yRV2Y)*|!6*1aM?dZN^8-XGkLl##|S?ET!_VQNBQFQq%uiSSgt0oWP;N^6hL zB4%y=(s0%2Ja}yylcC1oGFw*4zKDc;P0lWKdWr{&ccde6kpwAay0H3r3!x=*N{)lx zgwWL~OBx|m8r~3y6kp2LCw6dKB*A6~nO0KP?D>&~gkG5D)9m2$w~f2ChvjHemJed> zU_R{wb5e5>{}nvrvPK%II#sHNF^hUV?XmEzXL}9xRNZlKaBy&NxCH=w1Ha?2G(Mj2 Qw*UYD07*qoM6N<$f|Ux)Q~&?~ literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/LeftPanel/MacroFeature.png b/3dPrintApp/Resources/LeftPanel/MacroFeature.png new file mode 100644 index 0000000000000000000000000000000000000000..27354f1e10e64230fb4e97ceda5f29f6f6353c96 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^svyk41|*NpQ(y*CoCO|{#S9GGLLkg|>2BR0px_lx z7srr@*0<9yaxxk6wACMFyyGCwaffZW^p7W2yBd{$%u_94Imo%GQJJGiYq{8^Nymae z*-o`vBA@9g#nNcF_)fu*OAIrjGUr_1{P^{~B?{;G4jgiOc`Q2VSlhv~9Gbd{OP}U1 zIg=IACA2avAn3@ZRm(rAms(~{9t}h#7ZCCxwchHme|bR j@XL4W*Vv{5oDAV>)<}euIPq8j{m0gTe~DWM4fCUA10 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/LeftPanel/NewRawPart.png b/3dPrintApp/Resources/LeftPanel/NewRawPart.png new file mode 100644 index 0000000000000000000000000000000000000000..b7cb987c1eee7621f822939b7a7a1e321c2d1b36 GIT binary patch literal 397 zcmV;80doF{P)ne>_&0s&UPy*oFS}%oEi(pa!7R?G(X;jeB*=&SVu^kwg2YNB< zP-@yDcMKrAkfJ7Bb|_^?8tc-EO{ow=J7IuJ5-RgU2&oRJkL*m9MtcCKn2_qrwTDZp zEA(}bjT{N~NF@Jj51)|O z1PhYU7i#YM&S#?=u{|ASc0>9J?^1>~!#S8#o8cT%%JA=S_S)$8!cw>Ll2Wcl&xKS^ rP^qz{^t4?E*wgv5z%UH+HUKyR!Vph**T^Mf00000NkvXXu0mjfJ?5h_ literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/LeftPanel/RemoveFeature.png b/3dPrintApp/Resources/LeftPanel/RemoveFeature.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2f756514009306a7a2228bd5e693d9d24ed86f GIT binary patch literal 478 zcmV<40U`d0P)iA!v#9SQPDRomzqf4ZE{S4>Qtn6nrOl}cX#xCSr>K%XlB z?`0-(TYPXSsq_lKj%B(O0M=zDs%TPD=>>q-fiMzVmYJxV3+ExFI736s0Nj`{!K9?p zv{>pGer0}1JQktac=EP8K#%9ma?cHbyRN*m6sMWEcZ?Uj|&Rc3;ARqv4<;W3I7a|@t$h-=9QmEvqIzY(i!7rkrB7ZQ_7UjkV1 zF_Ut`eBoR5nrm<=9Kd?*q_Xx3?D)NLPVDu|V#1~XI53{B@% z9$Uo3R#U~8Lih_EJsOjgE4I;PE0vB_=(c~&txVD2_3Svlo{E~+EF!Ks@!tUO31o_8 UM>=`zng9R*07*qoM6N<$f>P1Ry#N3J literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/LeftPanel/RemovePart.png b/3dPrintApp/Resources/LeftPanel/RemovePart.png new file mode 100644 index 0000000000000000000000000000000000000000..3f9973d2cfdf54e64ae695f5e6527f29cf36f6b4 GIT binary patch literal 503 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 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/OptimizePanel/UnlockRotation.png b/3dPrintApp/Resources/OptimizePanel/UnlockRotation.png new file mode 100644 index 0000000000000000000000000000000000000000..ef225a84f1102bc050c18b537b66a734bdac46b5 GIT binary patch literal 561 zcmV-10?z%3P)MKRbV&i~W9&bBoKfBMMM0B0y;) zKxyMFp|1KSh>g7iFmQ&-JdHm3*g;!e^f1En~LyoNc_WF2=@AC_UKTYfp~GVE!@RcU&pfdja4b zz@y_am3yz~;9{67j z&d|_N;~T&m+c}~1sty$xTFn=?omw+KW}b<&O=Of?Ag(>P-}^RUPA1_YOW~DnUU+ge zL)AcTc)H`7y5;!;4Y6|Q0k3U2k;=hUs&@T!@qL2BR0px^~h z7srr@*0<9x@*YwUXshq7e!%o*f%k^KvdMOvUG6rro?`1un61GY@ay{q^I%Qk#P_Z_ZwRX6EfOEBUmbr{veAGL2ha!QVwQ_gz@7vC>2Q#cFR=MbGaS z=jY#k87=&hNx7jobfw8}m!xa%US7w0`exo*^KxHY#EV7mUKfe8r5`K#cs@dY{$(-k eoz6GS8R9y6wchxc{<#J88-u5-pUXO@geCwf4|bdY literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/PartManager/LeftInvert.png b/3dPrintApp/Resources/PartManager/LeftInvert.png new file mode 100644 index 0000000000000000000000000000000000000000..25b6de3870328d103a1c53f7956aedf370e7f51a GIT binary patch literal 449 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 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/PartManager/RightInvert.png b/3dPrintApp/Resources/PartManager/RightInvert.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d8c5c94d2c972e8c7aef0ede6c546474b3f993 GIT binary patch literal 427 zcmV;c0aX5pP)uTHL_y# zE1H^5%0X#0N}FjJr7$Uigql)yhDzb3&Yhr7PmGjfqqMmwZN@T6X;K8$Nn#6TpPp1H z*gB6&n_otso*XI1kJ6^$eA#kH5iF2`OS>r!(mm zkdh+CR%{cyP*TdVi@nr`;z|$Pow*MAbBUygeOFgOLMV{b4Zyamt3%8pNvW3V>guYE zT_{!G3BWu>2tr9wUHhC3IHlL#7eD1~3JX zTFW(n9sOREV7p^|b3$>c4Zt0M`5y1A0IZZ?&nJiCQr{EMp)zm_CD`^PP+aP=m7?Y& z1%Ou*E5RzdHvy1PYP%d=?CV+|R1V<5g7HcR)n4A=@LCDBJPL|F@I>KK30C{Q5MSd#HG%D1<0sTqyD4-yaR5X VbZe(X?BM_a002ovPDHLkV1oCd(9Zw> literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/PartManager/Unlocked.old.png b/3dPrintApp/Resources/PartManager/Unlocked.old.png new file mode 100644 index 0000000000000000000000000000000000000000..92665677b1c7f3940ffd6334c9765c733b7405ac GIT binary patch literal 9362 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 UO-T{?eh2`M+nBvP<`(mR0HU;s7ytkO literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/PartManager/Unlocked.png b/3dPrintApp/Resources/PartManager/Unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..f0500eb9078632397f88ae6ad4501ed5f1385c45 GIT binary patch literal 318 zcmV-E0m1%>P)1GCNn0<%oumQwv7nnU8KgRJMu~6}rF@&D z5zeS}YA=;UPC9>MUMp5xzYQg}A$LZtUQD$0i%{HANN-H!kU6jnJ=HoH0T*Xf))qrs zp9g-0=T3@ONfI?)s@Sjbzb4hRet;S;z8x8|v9@0R-nJ_q12R(;ejhgA4q<0e?Ji_C Qpa1{>07*qoM6N<$g6h9{DgXcg literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ProjectManager/ExportProject.png b/3dPrintApp/Resources/ProjectManager/ExportProject.png new file mode 100644 index 0000000000000000000000000000000000000000..1c8d93a4266ef47232134fbdee8225241d0190ed GIT binary patch literal 535 zcmV+y0_gpTP)(R9J=Wmd$a(Fc5`bG88}uN&}j4DhQO2i_TC%CY6L#V9vUP z4sZuBqXJ@eKna;;){GFAE%}FV@Vj`%me!wlwQr3{lLpq)5aFb@F93c3d>bXUedG0p zlGSQwc!e zHI%W{Xiyxy4(OZ_0LQ@ATxz=*9EvlP2Y{AFi5*=Vz@l|^rZ^LMVDpl*n zW6qxCXQpm{rM2sC7bs5eo?rAC*z5*9a)xT#UTRAp=boiyAm$fE27} zKH9wTM+i5-FP9+aviV>e-XEn|>_R@wSDh8`tQ8OFOE!%Xp)*>mha5AVpdwv8W3Xt` z>3MPsHB zs4rM5)XkV_lQU+bl`>`uE?cthHfF}uLqhrG%cQoUU)C{|x!&eN^>*SOy7?`dG-)sa Z_yf8+(YXxiY2E+;002ovPDHLkV1jFD>)HSS literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ProjectManager/GoToProd.png b/3dPrintApp/Resources/ProjectManager/GoToProd.png new file mode 100644 index 0000000000000000000000000000000000000000..ca0eb96b08d8b7df6b35458239e487e5764764f8 GIT binary patch literal 652 zcmV;70(1R|P)Gk+S&>}_qlAM~HR9cuv3vX}r^bH#B1pc%@nQr}zvoB}@X=C6jLlMaAH zts2U#@z~Bf0%|k=1?-1otYVbvyd7;v#&*#*Iw#Ny>aS?dT8z zb8XV8Mf!~LcH9B@Fb;<@yDFQUuXmoYIn5lGZ*~Eni(_HSmA-EcW%if57rhhG*qjmL z_>qO;Q#4}UNEzkrxMx(ZjM$`XI%3D6%zBO&9QU;fgd!G&q7&I!9RT~}-#N|fdtGE{ zng7Qg^rlaXJE|Cwi)EXvG#4E2`AtZjE~HgZbRu94%e%I0R}YxXe+?}Ar01`O!mS_m z1Up$a17;lUIR3(Kf?)p)#U1TgU5m3oo2X~?>Tg22gHDE06$QI*;dZbuytFH%SD~zP zcgZI~B>)wy&bha-D!T~KWLI+%lv>;er0vqHCe^<}o!to}dQ1Q^iyv(u>dtO8)R4}e z_56`?+;58tVrwYqpkD#>8oK|SP`(S-nseeCs!?yNIsvF*oAAmPsV)NKspS| z=F$R+i%Va5^8mRjE%x$6=wRFOz0u)mj!@}2@LW2%I%nA728y0F03={98E~ mBljDa<|Lp^n>KCI0`LXwd_6p;28$^G0000U#@GUeSCiaWPFWnAlBnA0I@O+5VS{;Op7$xxts+f)!UR^ z1rR%5(=`gF2x>sRO_>8IGxxaUjT9ExMu1ipkc`5?0W?9oSb07ApsWRaTARM&0J@1n zZ&S_$&@==@uIf_)?TR!RD}g3>q}&__F(9%dr3B(UnJR%s28eS^15|^8gAmXO30ztB zwZuh{?f!)TVv!@t_Ab;smw9aU0^SCjR@N>k=*i6R!DL+m=j7k ziY4b3V})RU!ooMj;s6`D-Tf%IOHj_e%P6dcI7>D;vgI`=9Dg8dX# zx_9`iM8DeG5miBvz9J1+S5cA27+8}{o*Aei9ZjPY_6t z{lQ}^_vn|duYPgBB12_&?wA6Iykwkku;z;VZPlvPKNAss1KcG$UY@^dQUCw|07*qo IM6N<$f|a2MZ~y=R literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ProjectManager/Import.png b/3dPrintApp/Resources/ProjectManager/Import.png new file mode 100644 index 0000000000000000000000000000000000000000..1e19eab77d33beeb81c84ab451ba99edfb7a50df GIT binary patch literal 671 zcmeAS@N?(olHy`uVBq!ia0vp^svyk41|*NpQ(y*CEa{HEjtmSN`?>!lvI6;>1s;*b z3=G@?Ak4T{d2cCDP_o1|q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&&cqjLgrKk1|}I# z7srqY_p?_|drJq3uzk?nq2u(w`Iq?>cYP%%@mS8Fl8a6Ug9IE|e+%61ozk@amc!9k zt3(2){P0jb>m(F1A?U-!_FWfxUwB%ixRlvB(_ji48gck@QJl!+vvvM@247}Xt+|$b{_3LZ?PXhKGQ-O+{^s3&!ZR>T z(YtrsidkD3UH2!O*DN|8!WEmmW9bT&)f1L3o4;b=;Q~pWt>#gFzx4bTz5bW2xjA%& zfN}Z9;O+NYr`)<3vna)A=5}t)t^0R7zC0}AYrnRo{8*dU$L!>_2hS@tD?Sc-cDcTv zZ`XOj{8+seQ%;`!ymJ4}_ZM~aC5(b!J$DjbdO33z|J~2L{6ZmFFQ;17{a*0MYSvR$ z=QOXScKge==k0qvEq}*Z-NS2w&dh5(Fk$D?eZ9M*w|`#8B=+&s)QzI6uJnJEob`5H zvue&&L-idq&aE$vyL$T7<=_JoW(J*ndv(vYzJp26_B`&2GumCIXOOb&%5@L^T;BUF ztWAGHedMJN@xA|0elf olhy4Re-$v}1QJD&PyR4I4o{f%^(Na3U}9qMboFyt=akR{0QvtD;4BgbWgj7QzRWHUY=JtKZ-v!tn z646&En2>73^N8poP^^@QeuPx1C(wk5-U8PMhGO;Lv9n-8Du!7`*pGs$1q0A1(sneI z6^!FeNVRDK#OgMg46u!mYD`3*2xy!4Rz;qyeT{~AiWl8Ep7C~V96-||PsRc3P)BcI zE1oRlc1517kPckluxZTmH2ZVQn6k)|SG}XFP3Yl`IiGBeiTC_fg44=ldQ36(+BYC!;F;YY3j{lrhYppZ zNlIXY9Q+v$Kp6_;QX?pUar_PV(*_W=kf-*-0Wh~QTD4HPa_AMF)5Fg3OxG5v<1pS= zKAz%}F*88d2=bF>nlj|H1rgculT#rv#i^o$Mfh$tD)MBGz6@g)+(uutVglVvtgR~~ z(3e805^=&{t(-KQLOjJF-zdxsHn|j3h^OAGY>&eI5*on13XUlN_1nx#rb0Z$x6JDI zzNC20n+d7(v{75|eV{m?kBnH1ZnYX{_L-_Zy|qxt#%D7!%8Utq(&wwj1^E&(J;nb< whJOtzMZLPJbf~F*`@4dIZW1@$^uI+!zaq!K?Z%%CfB*mh07*qoM6N<$f}kQ382|tP literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ProjectManager/ImportProject.png b/3dPrintApp/Resources/ProjectManager/ImportProject.png new file mode 100644 index 0000000000000000000000000000000000000000..2c32c088f85a87fb46f64bfbf6cfefecf9a358cf GIT binary patch literal 534 zcmV+x0_pvUP)giyH(&$MNtfa}w(CDBK~=t&N|od9m$UD_z@$lIiA#OYrC#LN<8%0Y?D~tu z{hw06xYSo%>UVrD#pE&(ssqE{xf1Lv1OxzU0H{(8QY*CwLqjrl0bS<;l|TU*_Q1H* z`2Qvss1&LPMnG60yMlPkyHh~oE4I1KOte96*t& zv*ndwGYB7%tsW4U`rEU%QGzXdP&C}o3^$oOpgxSX$J*UlAh)RECXco%m{uo@f}edhzRV+PkL!5RQ~vw&O`^2QAL9W+64%qYRI z!U(q_p#4ix%q;#aW~fRX7+%t)xoDJ_;Zkn`F_R5c0tH86=5vaf0N7wL6AeXe-gw|D znpw88V#b8JivYt8s{>Utl?7x&MTtyqXiyFglm!L9Q@FNg6UjN%Q`GZ+y_hLcaivb7e+gwDU&W>6Y_3I>3dG<2oq5Xjz;X5c~pguZ^y&2O(> ze+7pa&@rHBya062Ltuz)_|Wh1U_f%8wvuRm-^TNwkR8?^tf&Bt&IbclB`4MfKj<%pv$QQVCV#t1{*Jb`0V3Ps2Ip$6DTUDC~une?4)EOLUT5)b9Z*5G`;N7Y)Fms~@e9M;$fls8L6aI%?EWqmCL5 z{XQfB>J~LnVo|P}t^>6lWe>$<11(h%>V(woH=mC$+j51fQ4{5(Q$R=!@dhA10Cmg;pu-3{iV7R{3}Hc0!1Aw3&Sa@R5SmX z*%@A3J;;EoydoCdd(6V{{~tpKbsWVl&%pNoJvE~4v47{WOH^^xvx|Eeqy)cF9CiQx zGn}JZE8*>fYYfV=zbTG7U?tv56-Tl0OK>p#ctvs4y?n>;ETaF|VX8RlABTvNwBRR- z9Q5-SBg5zK49}?6p8Eai)$_;f(gKgKk>{ZQ42%q4-#q>K>o>!6QuHy7cH2iCHR`BQ hM~ymam^ca`zyNsEzydiX(p>-m002ovPDHLkV1iLQBOU+% literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ProjectManager/Options.png b/3dPrintApp/Resources/ProjectManager/Options.png new file mode 100644 index 0000000000000000000000000000000000000000..6fb84bbce86dc5c047a597e9952657f3c421f940 GIT binary patch literal 2381 zcmV-T39|NyP)&q+D$gs9HtAs6hl&;z7WQ1yqQNQK@Hyh(w|h1L7GaDu;+7U=%|{Eq{2R6{FC2 zQ=nQEY)k2}yY=_TmJGwp?96nhTar%lGCQ4l-+S+S-|_pt?=>T%@9MkyuHJNw9#!n~ z`vV0Pb1E~FeVgU;4`W#FX^N&_rWs}m`Z&(og=6wAm)l)N(aa`?)7gR6>2gy$c|pk2 z>Jtcta-A;s5%O(U1C8GqmR-j4Lg87(0A3I;b-G+X%NNtt+!XbRRzJ6!TC3KFG|+2= zloXyV65zmuk83T4G>#X>D*F`|k7KawNA>&hPg$8$W=}H#`aGupgpUYOL>_}|X6LM0&9 zhxNqTN(0S5*-|XMiAj##@;j7WOBQWVw+sh7TVNUNDQ$r`fz0p}yJp)+T$Q0SwbC z7Tntx{(zKYb}S&oiC{#F+3_HilWb!^c1~WTD;P4`D2jfyJ3AAU!g-)mXOijf*(n7R zO{&0gh&J8baS=FOAhSV98-lcrwlN_uFaLT|Qb03RsTvy#TW4_Gm>`N1ZDRtgdWi`s z_{}QJ)d{zPD>+I}2ss}65!i0D%7S&5K*&%#7?>f?=4iL}#b!uk>m-oE@-z@man=5WDh-o~y+BJ*gZs5Re9&K#bM422oht zZBT=wMkd1x!n72s-ZC?2RTMp=Y+(R=u^W>)W&$<-iXG|pxH&m_IiU5g872TZ7TU#x zklC;n(lEbU$;$IaxnT=-nT#T9Y*PiIX9$h=n9T{oSgpWfOve#`!u_zIYO{<7nw?{- zQN#dKtkn&uPvA`?FSRj|o1#a;Xnn58-7k>k_xxDYKMEIAJGgL&SI4jW@XbmKMU`YWr6ClG z2zE%ob7~b}NW^RSy$$VC4KUI_N#bRw9g@KD{31It$g?ff5%wCOyW9>YxZTvxMh<|P z$|pp^+1qeyH$xO&zy+1LNY9AI3zKKVjKo)vyJ(ha=fy3W_Jp2RhjPGb4!zc#S1`jJ)RRYa{aS=T^)o_Twr@27$Qs z2*7p&+7>4p2cEeI^eRK)NNGwvfsUTWJsz*2oM55|Qmr8gwUu)hxH5Y4gAmtrKnf~M#u3E&H_B<~<{)T# z2~^<_bp50;6h%(~o=*_u$#VSIv@imb-h5g<&f~q@bR;Q?wMLkLMamPTe-IQZ&l-b4 zi)~-8sxNjrTTlDQ;qaKuFlDs0wRuj@1_%3VRH^>Pcz-1x`=MP4AXOx*DhWkJW8Cv@ zyTjjOQV)k=z4R;dMn; zsM>ZWfctOg9DQ43kdYUX)Rq<} zu;{PgEvAw}OP4#uB8J0mJgdS0Qu|w<*!6bUf$0jEe$pPmXwKAu@=qoTxI6Om2Y7mf z5zv29M%zt}#6o`;EC1(6)>;tc{D%AAS|}3>n01o56E5caSdxVTid+eGDoGm?Frnv@6*|<;0vLeT!a3&* z^5NUvIyr*R;V#o3bg3Pbg!oRDbuf*{V%`(lP6-w9p*)b00000NkvXXu0mjfsKS2a literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ProjectManager/Save.png b/3dPrintApp/Resources/ProjectManager/Save.png new file mode 100644 index 0000000000000000000000000000000000000000..0eca26039c38c97a380275d355f192ef802a4768 GIT binary patch literal 610 zcmV-o0-gPdP)~pMU@Vf!LzljGU~@j2=Md0a6{s0CG^^p|=7s{z)HEvV-OP z!>=4q9=v1FR|Xl!{XvS4ad4!m;sf^>F5dk>ewv~-U}j=unCPL-peN5ecyiz2H-8v< zKQS}JU;Z{)PK`PW4u1Y2znSy#*FV}gYQ>eWWI5=}lV1$`KK-V=n!yI9J^9XXN%pVX=QaDiLj{xa~t`%RN*Bg;`eI(!Va3hWH`-u)$7k2D_>L+Yo0 z45g<&Fg*G5kGhV^lHp{~5ocq_-20y4-1k33J4%LyiJ{4mkD*eBmm&MYN9rbYTRBdK zO*g-S9puISAB^>x2;M1& literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ProjectManager/SaveAs.png b/3dPrintApp/Resources/ProjectManager/SaveAs.png new file mode 100644 index 0000000000000000000000000000000000000000..1d5cfaef973eac427f942bac7f5405d3b6bda223 GIT binary patch literal 951 zcmV;o14#UdP)wbvkOC0|6hWiW6ET=5XuN2G7{C}b5km~>!RW!0 z9)uVVC=opvL5v=h7^6t!L^OgxO8Ah16m3BHC@rO>blsK@575%q7C7{uOm{l-Hv8Mz zH*e+*!Eqcmnn-Lw`JjAIo|a&xMuWi+!(U>&^-z{&n_PzCRWN0=lusEkV>2QNk`;n> z7h=lD%`Da<14$`=A>4sN^Po|5vqvYg*7G(qxRMp<_Q-*%_e-38JCV&Z4ZT9~B}Y5~4i}pUt!~Jomws)z|Xy&{F z)yPljFKUzBeu|<{SCodz5B)g4PiAXd1bf!0_nuFkZ<|D(nn6mi(2fOx+yk*FeB6QR z)5$2W?ZVOOZfL@Sz3b?M`Z>o2gb+!IGUPmH#ixrII9uHgGeJQRD)Bs2lz_zT-BQQ` zNepWp`xoNH*b^i`X-y}p3R7_5Q3v|04{`y_DX6R417Mi7;N<%WsLd89?x0|n1lmUG z)-eT6JZXo&m|sT4jOQGER}_tVojMS67UVFTt;mU0-j*Mk0RfHbk3)D}oQBz6HJ~?o zHcovtn2}6#2%py5inYF)=(q^f@p597s|6pShdpcofn}k%0Bd|4rVi^hniP0!;RN4NQWo`+h zNwRs}69mgziHfHB+#JYmX;NFv{mMZH`n*4J6ss-9dL|H=u1RG^6se4qPJ!s zKeZOOPC{sYYekU+XPD)*i`fjHVi9gZE#!X(7pkfM=~C7h(&ud6NBE9{d{929b<$q} Z1^|F<2Cx;T9FG71002ovPDHLkV1oXKwPXMQ literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ProjectManager/Send.png b/3dPrintApp/Resources/ProjectManager/Send.png new file mode 100644 index 0000000000000000000000000000000000000000..a9bcbe4cd51b66bd5c3b882382f499af988adabe GIT binary patch literal 1036 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 m{KIJeZz??}gU)eq literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ShowPanel/CurveDir.png b/3dPrintApp/Resources/ShowPanel/CurveDir.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e12b5f37ec656f96f2116a615b5226e307f9dd GIT binary patch literal 883 zcmV-(1C0EMP)jiHq!S*9$ZX)C7g>bhUE>&(u+J8x%J)D0`>q8%^xz!`>@8Rj?7dCr`7 zm!Xuxb_*7^VU(asP$j5h#PhMmmUlCe54Q(q&abcWX2HA+gfCb*rfYOLwd>iqEZjZh zWlV#5F%i1smiUYJ0!#k>uOR^Zcwaf-gOd%8VN;-<|LLd%T5fHTVZdjz zW+X`pn&PQTZQedv%T0h_$-}HigF}oIURN}w6h(2qnoe{-np!ywX$_(BGGS7PX9)Qx zsIdjPg#mg?%h5V~%c_*76FEa_nmnQ)@hsFkE&1!BN=}We5|w9}jD-cYaLkV^r1{yT zT6r@N7C=_O<#odGase(kdcqYV&m~k6D|{yNr(ME)OgW|y{oz!c>>i0IFqz82K060T zs>Fy#;sOZqy4@=cp%(^zqsob3T(b|&$&D_Nw>LP2#`WhI$Em3L?Oc1d`CE8X)c4ptUV zuvF0IW@HBsXZ>#5U@`o+#ZwlBKJE{LRlvR!kZNxQ4-PB6?{|uW#cGOQpuR`dt}k&~ znZjPkA{5~O{5A;ftPro8Hv5zuoEwbkkRTLNm>k+t)1lAQfh=p(7b7}EvzQ2ll>>>R zJ;jFN3);9onAR(!S&ATFCoszY!VfH+tTW)o&LbxM`r3d(7BHX|kz^HNR#{_>nh#}k9iY(@s8ot$Aey0drf!FQ zHYSublp$-GL&_C&yU_rqLA83AP?@olK&A4DrF;|D;r$XlWg3(*?Tf)ph{3BsLl8(zyJZTUtL}OeGLEr002ov JPDHLkV1mcOhyVZp literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ShowPanel/RenderingHL.png b/3dPrintApp/Resources/ShowPanel/RenderingHL.png new file mode 100644 index 0000000000000000000000000000000000000000..8aa5a3ac2023dc9ca2b2e6eed75e7890647a5036 GIT binary patch literal 413 zcmV;O0b>4%P)sz8{>C!th>exh`MzM^!2KB9DjxG3GA zw?2hQ0+bDMLn35`dsNc|>B@q5&9lX78(Egnr7yA|9_o}`Fp*nSgB6ZZV!L&*D2uWv z@wVX^g<_yrA8Tqy7FZ0k!3dBS0^E=Rjqk}wTLD_KaN!~xBo&pR2|8A!)V@wUj00000NkvXX Hu0mjfktw3M literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ShowPanel/RenderingSH.png b/3dPrintApp/Resources/ShowPanel/RenderingSH.png new file mode 100644 index 0000000000000000000000000000000000000000..0c6690d1a619a5ab82962186d102e9d47e190b8a GIT binary patch literal 418 zcmV;T0bTxyP)Znmi5diYce;F8=n4b?CM}Zt< z%=Dyw-lV#fgThg82X&=44T|W)=b!;`6d?!E-BH9ih^~$z)_F!K(A1GN=YQ375hd%0O~{E zK7df^5ew=N2nTJ?31ox{0i=Zr1@tRaNFXItXrLpXBBx%E53Qkle5cyir~J9*>>KFX z6-Z^C4T>#jX0bmuTz_)~QbFx|naQcCLa{CnIT=D$jV={b1@-U8VXRwv>`kviJ>{ z5d4^Bvm!;R=-;R2ZL%p+e`AnRvxK%cLYq%40L)W5kau4fq_%|*=FPWZj1slW+e-Ou zUor&s)hMx*+FoK}AElViA;(H;>+XAsR2b+SLNAs^i94lXJ`$*8DJoftN|vIMrKoU8 zt^L)Cl>aF*MhTY;z<-338OrNBHw&?qIvOPo3<6b9z5+N=rC2aZ{EW4j)J|%dglND N002ovPDHLkV1l4^mI(j= literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/Statistics/PrintPDF.png b/3dPrintApp/Resources/Statistics/PrintPDF.png new file mode 100644 index 0000000000000000000000000000000000000000..1a973e81d300401503b74cb6bd9fc4770a4cd2be GIT binary patch literal 541 zcmV+&0^I9{) zet`{YCMZ${DBd6&w6gjia$GwJG!P#ANtVEuoPVFscR-0mq9bmqmX*p3h{%q%De_G0 zVm_myq%uPy`XHkInc_9eGqGwc3K9Cm*KyUZjzucd$7bys4|yi`zKh$4&jBJdYg3RV z&qQH23je{>h>2o~HU)XYqST4%ge0mdcXiK6Wxl;Bds`NHCN@%;5pEJ=b7cd25wJ7k zsx_NNY6nM8Sa^*(#;jm}C8DXdd+)QIN9B#KjTEpISkrIh3he%oh&1d5b}g0Z5z*We z&GrLQnSYCN;l=(GJ+QT+yiOo+lvLMZjuAETa!cD5;Vk45szFl>LUb#0sw4_6U>)dp zHY)FqAWdlWnXk1Vx>ipl#uc^4rNJIg|}o)Z&bPr*o){+9S*OHBP zu*-b0*OHw|ns8-oqBdb+7qNu~0YQn`)37_N+M=+=wVgfZ8sR5L9tPG+3` zy3sxGtW+d}5PN?pD0k74^|2d%rNRtWBi2*V45k(RBjh%^C?NNCCUT^f^po&nyfpS~ zDJ|J$u92&5>c06uizip6^`;ED%So+Di9l+|k*c}P40F$3bV^7iHhmperbO)MzLtV7 mbq8=OVdKRk2!i-M06YNcRyrcL!~%E#0000im?deLm(HfX@~n zXhQjzU#UXX9IC0=KHBaDX41OWRZW%hF&B`NCJcC4!=K zF8wpI0)oUoAM=W~yD1PjmAW}hyNFY%u0Y^GrQntTHhplu#pH+l+g z2Ve@|Xp1Ba&lKE|!1i`X0}?$2cTU000jzD18jhJ1+=i;A-e*k*atf{t0neOaK%(aR z6xlh|j19F*9>vC-VP|#ss$PdvaC=5QK$!8;-MT+O4FaAnjv*25Z>K%vZF1mgJ;-^(LFT{_!2-_f z0qOy20qPg->n)T{c*K(TfbG}4NS>VwM0mx0f2ry(bzfI&$)sx3qbK=JpWW+{!h-vg zCSAEWIbu?$(9Nz$vF|8eDBIL!Mn%irzOxhq`L zO|FVs_HH#&wd|kUua~Mt(twzS}HPU@+_p?%v~uTHL_y# zE1H^5%0X#0N}FjJr7$Uigql)yhDzb3&Yhr7PmGjfqqMmwZN@T6X;K8$Nn#6TpPp1H z*gB6&n_otso*XI1kJ6^$eA#kH5iF2`OS>r!(mm zkdh+CR%{cyP*TdVi@nr`;z|$Pow*MAbBUygeOFgOLMV{b4Zyamt3%8pNvW3V>guYE zT_{!G3BWu>2tr9wUHhC3IHlL#7eDXPuheDxH_~%@O^0f68fV&Q5Z=6y4 z`o@tc7PJM>?@-hMz^E?lIxy&35ZK?gz7dMb5wrv_1n|^SSX7jhi8E@(pqD1OX0y^M#foKcHJ+nbF0v(mRtHKf!6m`NS9 zt*J(wQA^1~azzco4Q>59)uXolHF9PpaUiX!Vc30{iq~J0KwICJwi;=qVwZ1t{VPpX z*c_XXM(Tmv!4b}=``7_z)J|J3aw3h?n0rq$oW8S)BIerqXMw%=izBCb5^qfgEc^q& zV^^YHI4wT~PQ|=;Mjcqt6u>m|?yT7tW5jcjA~TjAZae#8i2nAcIQy8%A&gX;54A#} dP`C^Ld;y^CT3|`>Y2E+;002ovPDHLkV1o8aylMad literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/TopPanel/ProduceRawPart.png b/3dPrintApp/Resources/TopPanel/ProduceRawPart.png new file mode 100644 index 0000000000000000000000000000000000000000..49630355d56b82848a66881d5c7bfe1e9fdf63ea GIT binary patch literal 475 zcmV<10VMv3P)H{xccCqX zm`FXb!w~A2+LSfbi?J?O2qFq&-HKB^j3`-*&S1 zj%C_q4=k(;xhZ}w>YEe(mdC4(^~;_p#*5-z)Fo`nQJi+HkNBYcT~W*p-;0A1Q|J>- zDj1c$Hc~BlfK40Gxh8c{qBvSF0j3nuyQa)$S|3ptGC4BVRbDf=_S&AUcM+>E<7iPh z?8Z3`9YcF~*4lJQWaqi#ZGVievxVw2Z^~@1MMkRcL>`K_Kk%7IBogre_yE$2e+iNO RK@|W1002ovPDHLkV1f$S&AtEt literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/TopPanel/RemovePart.old.png b/3dPrintApp/Resources/TopPanel/RemovePart.old.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4257e0e2ad9e583e9cfbb4b07ba3bdb43fba64 GIT binary patch literal 492 zcmV_rx%RzgPxflM4+C;$EUruJsrJWC|;L}*S!cbGl80km+`2Zf6H%kMRW z!wX_oA&D)&-@RA>4MmJ1fF6z#c+im;i7fE@-3uS20`kD+FnLFO2GAn+tp`ONh#}&Y zbevUG`Ylv^{`Y&A4Tv#-7LF`=#8ldO9ef6Keo1(iFqZ9NTtE^rN?@{^M3kH9#<-qlZ)@9UMh;>ths* if>AKy!Qcc83=9BU@^$fkF3e{D00002BR0px{SO z7srr@)?^9R#R(!kO@R(p2`<+c?tYcX#LV2xG^M)XTw>M3q8WeK#dL%|^6>ER1(ey& zm3_*=#gWs;#4hh9a7o}#dy>R~R~khO+|tI(+|t6HR`s?24}W<7zP^Cr!jZr`O)@-x z9>u7+wAD@k&2rY}W9+xwA$i%WmJFwnP6v zzn0IHW%ZI?@v>REd+|P@RI#fvu3SI-9dz%?w#KO?GBXPWDHK@x$ff_ZiBb{ZZY#HJ z<#V_>|Atb7hP&Wo=M2sbmRX9-%!dy$mR#0=dhQ{kgoFfxm9PbS37`6BpywGpUHx3v IIVCg!0J;)y+5i9m literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/TopPanel/RemoveRawPart.png b/3dPrintApp/Resources/TopPanel/RemoveRawPart.png new file mode 100644 index 0000000000000000000000000000000000000000..cb298d1f415d59296c64dbc8267b1a276115bcf6 GIT binary patch literal 387 zcmV-}0et?6P)F2*Qb8sa$C5-vCU5p)G)SXVf;1 z%`T;_uK=t7R2?A;XVhmgDQ*1#z#o9&h0vKZ>Z|GWb4mf2CkPQAVdpGU{M}O)No9J) zdSho)O^ugmf)*LwQL3SKMvdb^Z9To~hr85nl|t77x1g=x^J4=Rh-uyYZBqB7<_uIp zMmn?EG;(kB?^_ zZUbPG5?f3Pr@9oE1{KE@m13dgrJ&MMN1Rdr{s@#feODt=sXV1r+eRM+xBEkgrRW0v heWZ{e2*T3?-~imOLM;os2}l3{002ovPDHLkV1h^lnr#38 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/TopPanel/ReorderPart.png b/3dPrintApp/Resources/TopPanel/ReorderPart.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7ffef0f487b0f41588385fa7b1a22e5185eaa6 GIT binary patch literal 480 zcmV<60U!Q}P)bOB3bgEB$G3(x5W$pnQ7(hb^Y zzmyGN10u0Ny+KB(F8zq8G1!Krl_LM%z&_u{{ozc3Kp=3-2&tZgRGa=M@-x3*^4WKD z4TV&DBC3e!QCs5Y3hT4DpCKkDqIV*SEnByU*h`y52Ol3^kwU5}2SFV%qPB6{{)1Db zgj5fR&f4d2aIzIrJtJyIn}Ib_NI^4GP#?B$T$*4~l#nVPDdxF!O^{F78`CGGV&hMb z+VSNT=}g-!`qFI&kwQ^6R}|C{Bb|dLI7ez>G0(-=1pV~+wECr4quy4er7t0(`kzGA z@PFbgibL0C5ib;fET~|={r}gX(AzA^5ynARTo^uo1%JOV{--djSXg-_K_vtkXX5CX zK{!*i>>i!66h3p;X3@vgIo2_Q1Gv`4CcXZCYF}a#M6Lt5ODFC~TWwh%u%?0g)@ISp z#TWTrU2t$Z;@HFyqr_Q|wH7$(J1j1ltl0mh9(YV}ujem zuqFUiOlCOXF?a-UBv>qtKn_C=$kEBh!a>S=0%Zab7K6v41ZpUTm;|AY>-&TkfIbna zt7?5!0BCvx;;bqhLX2RE@Hheyo)&~0hKM?yI3fa;fJZQZ4Gs-4t{MXgR=Ozzt-#`% z9;kW*Pnzoi!P5m)33!U+&YvP=N)`o-r2Z1I7y`yxB&70U9fBgZPV2q`48P0U0E0)R zZQj!+F)f{W@=tuc>mAjRYMKLegn-3hQ8o~0DNWHif18eIn5&N;W`T(6dX(LzOZ1*S z!!zyeqn$tofD}F8Fu0_QSzI7Lbp_e?JT*Ms#B5m)0B3%n_uLF$sbWRMn5+r}MNuq@ zo1P+Hnna#_gmIKAfu8j+J~T!&Jju;3uJWt3)PY>u2RuTQm0t}vHBB@INWFv(T|kb! z&M1NHl{y8dsF$XlY zPRK4NOCwBER085bO}009nL=@%{=p*CKpCj7`bG5Fn{srt#6AG6riv5AdV}lfKy4xI z5iBBgLlP-2ZiK=^WFSg2C2Z`*Bnj^4LHheHak^Ba1kA5Cjzv`wkqGDj+ThNlyGsf{ zH7mQis)n@yNEQyq`jKYMCRytPR__0r-3M^50sIXfKPV$j2v|t~0000`7rJ;%N?oVxcJ#@$L*nnH5WMIc^4Nsz!CWTwPRenLlc zkOL6^poW87tT@SY6uN_e3GxFi9YoMk1K}XNjv6Qj;dInMItZ(y2HHUwgLGeJm5Lmz_5Ks%MiVgtP zHDHkwfI1fBphTdW1>`n|iFObHb6^hA$L1hXn!|K+5V6f+x;luM<}lqIM5sADAP&OU z9HxqcpxK@z2jMFcsNo;0RX)Y?kdTzl!^cV002ovPDHLkV1ipm-1Pte literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ViewPanel/LookFromBOTTOM.png b/3dPrintApp/Resources/ViewPanel/LookFromBOTTOM.png new file mode 100644 index 0000000000000000000000000000000000000000..6a48b64597e32c2bcf63437faff24aff57e67723 GIT binary patch literal 570 zcmV-A0>%A_P)BPBUDmDL#Q5~I-r^Z zKQl zf}O)skBuK)?&mKChQ-_7zk@m`5m*Q>Ah$V;>>xIB(+kW&ufF^i!sZ}Sn!|K+5V6f+ zx;luM<}lqIM5sADAP&OU9HxqcfZ3j82jMFcD0UENgz41H&tHE0`A3q2usO;b#yETb zGaC?7T4V5#>L6^6nu4uwPbN?S#UQB;0s+R+k-VYoD1ZP10POG=3RlN1U;qFB07*qo IM6N<$f=l}CSO5S3 literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ViewPanel/LookFromFRONT.png b/3dPrintApp/Resources/ViewPanel/LookFromFRONT.png new file mode 100644 index 0000000000000000000000000000000000000000..08abc9959ec0c0e3ec32b66b604ac9e2b9a0412e GIT binary patch literal 528 zcmV+r0`L8aP)#2>tcAB;I`e!|>|M@4KWr2%DoW z03E~-;L1yJopJHz?}uAYzh5%ibQyKjsH28`bC?+L?dN}aP&o!HVC#ucZUDpwXznN$ zW`>W@Hv9n`N;rTRRIq{y>W_2@DK-{HP@Q=ISfV#zsS^dDjs-a=5vXRtfTk%V2kB#T z5ZxU`jDzUvC}JH%H%F1;Ai6k;R0q++Q5>W?2wRcBLoL_*{}1+X09R+N8%0ihWIS8Ah=6?D0_uaLZ->EU0q5{N!Np%niFpiGo4P{3G1Q-B_+s2-g SHzc|M0000WGEv1*z~W#5ILCkgDgFHWPn_zcB?Jh!K3{xdqu5bU z2gL*NLSR{zfJdDJsDQ<1)~&nm-mN`(2UL|MlAWfAbr3NC2*+J;h_Y~UDqr^cV@CS&$k?SCokQ!|z5C8xH1_0A{Fra?fsR#f7002ovPDHLk FV1grV3wQtk literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ViewPanel/LookFromISO_NW.png b/3dPrintApp/Resources/ViewPanel/LookFromISO_NW.png new file mode 100644 index 0000000000000000000000000000000000000000..203e290367ad1d7c31ca02f13340aeeb437856e7 GIT binary patch literal 694 zcmV;n0!jUeP)ko2W0StYn<7XeTo__e6 z5y<^QR!G4dq$a|r8s)3Y#KOV^66PS+QP*z0VL1Eb9gKS!S&oTR2gL^Ha{?X2L`htM z9JJ!dEe07K1(MU$10ZfRFf@F1AIU+Cj0}uaa}YN>X^sNM`2%1GO`x}f@J1hcl+nvU zI75os4%&C(A;W=dPl<96R!1Q@NCW5~c1A|Z3ZNYa?=l>_`;uq}VMO0xa1geTDgt8t zk3W7htl4szA_sl`^@riX`>zZ#dP*cY2%Do$frtP*b-bF+U3v2I^rJW8GTI6_)x3M~ zfC^mzCzltLfGQ4si9t#LtCO4I2wH&~#?9LYawS5Q0%hjXG+;Tb>~B z>C<;k5dHi9%ZIqseEt4Q{LkNiKY9QB{XoDtc_5ac$WgD~d}BEO^qmNZ{rve`d3#o~496DqV3qs#@Be>3QDrutu&j5yyzD|` zC3I391Ooqmd}Ua+a6V2qhegNz!Q~)=jv~iF;4~qwz%Y6HDHO54fB*fteeyiZ)aFbE z78Yg}vWf(99R!Xdb}j}6IW3Gd6kwqH8OY@&tMH`6LHH6iCl?zpQ6Wt)2jNRYc%u(m zQqMC}5c?o5%=Pud#~+`uY5Mi+AOEl4e+78BSs&su_{WdGBKuF?<0jQX*wPd~7aI%1 z&mX@8b{)P=Opz^*ueA2DR{ctK0U-|}C+{+1_FxdB}q#lp<=k&Tu413oo3Zom0{ z@da4PN4hwQjfMFG8ynL{T=KW>zI(Uiz;#dyHWAoqm_OiY3gnqN>9kgJ;6FMOW z(cMwRIEb!}BGy54a}+5KqPe3O|1&U=>L8jnUHnKJ>#`8c*0f=9M^uol=%q=CHFcsm;-Ei& z{{33C@gf_PyOo&e135?liq&C)r%oPcU;tvLq&%uP=-#_83xV8tV$;-JAT|bKkfsI6 zMZF%MSS8B!bi{rOi14#Ai7PPtqk@Bg=_mo19Ef(*7byLJzhJwL3OhI|#3%;?l|(*8J7*r?-P}Mqgr1qr^HEGloo8 z)xY$15LQQl%OMss^&A&v1_=cTW_mja!%@(ZdY+4l@NXG$MpmY8&#`KH_k-ilhaW5~ zJlw1gaT)yM$6t|cM{aSG>L6?(#m~jY!tnabU)JS&-w>luo0@&c-5o`Y zgXrogVjV;`N0H(nx;Tnd2hqb(9HcskrbWX4|Nohg$|0g1gw0Xjx8HqXSiSi&HO2{K zVf_$N9E8nLQ@;KB!*KD%hpkiyEEORBOR9swV;Q3(c|+Mz009O75r7kzql@9Y00000 LNkvXXu0mjfwb3W< literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ViewPanel/LookFromLEFT.png b/3dPrintApp/Resources/ViewPanel/LookFromLEFT.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a4e85d9a8c2b8b6e1480c9761169ba1b00f031 GIT binary patch literal 563 zcmeAS@N?(olHy`uVBq!ia0vp^svyk41|*NpQ(y*CoCO|{#S9GG!XV7ZFl&wkP*AeO zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|Vm$PZ!6Kid#v4{{Oc>oWShE z(=5Q_<-T#kV$THy?n)CLu|MJtDQGqq@c((?{l^J8?u@ci7?wP{sL|Nn}LKhM-FYgDZaMEDt2GB5U>9_Zd{m370sJ>Tw^ z8q?WtExVk)IhcNRk;rU_shRL*MQ;1PebwLp_6w{?V0olkF{O#?EPKT%Exr{}g$n;X z$~+onN*-PeS4>*Pm%w4!Aj1-Jy}{Lw;Z?+hW}(I`u?bU`c@zpT9zP_rr2nj=i*?sL zKBZHEU&>HDdZkFf?3gHuct00izA~&Cjt<-#i*21E-j+2@bP0l+XkK$y?vQ literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ViewPanel/LookFromRIGHT.png b/3dPrintApp/Resources/ViewPanel/LookFromRIGHT.png new file mode 100644 index 0000000000000000000000000000000000000000..f182c1a25c7e84804355ae46b286858264be1b44 GIT binary patch literal 564 zcmV-40?Yl0P)fMVG6IY8An;4wQG=pY?Z9fYm$>ZoDe90r0IXtu}O75e(^KZ5`-QSCqj zAU;4za~RaXQwHL@K)eKx(gapkMo?iafJ?#c`+vS)d-p9S4piDF0?k@LZgZGu2N41w2dzBx7OR6uX%5rPLBuwP>FOY2 zn!|K=5TWMqfH(+WbC_BVVj|T+_=*H-IEdx=`R}~vAAJ!Z#X%szh&(<8454lyRYK)j zgCqxG3#lnkdMgziqXNW#Np%oLNR74OwQ0`W;(iF@=;da9B zsO2DFC@myAp(8s;S&mtVS`GrHqXe=XMQ;ZYbksmN2(P0C%0W0CHINR%>ZpNs5Jou# zEve^OsPKLg7G(PR;q(8`*fjn6&A|Wr_kRIyF2;vA9rWd&;QGTKNOlmm!V^?=Fr2va znGb}C&@WFw{w}Ew!saM&T?RCWkwC6&08;h%)B)8T08$4=n=Ye{8g=N3^dyl z>I&Hd)zlMVo&j?4K~8gc0gzG#6^uZ<1dmcsq4@w$S;YZWBM!tL$qp%~gW`dhVATOs z>i}{PP+bESIRU6+K@Lg;s#!p8bC_rc5ikelAbo5OBBeP@HwO{h9Hy&-h-nVf-9dz! z!vo?Ve9d91I0%~UNpcXrB7qtXVnHg0h;|SNFd~mn0Yj)8NR?2z)*#72*g|Rww!S@? qKm~~ZlIkFgkQ!|z3^hjq1Q-C!SRx-j01M;*0000Q&AMa?|qy55Uqt$Nh`&&MoP{SqEu9(lAtDP5k)vDNW$`?&_bvn$g)KH zfD9tkpbwFn6{Y>roL`_R8UzZ7*;Fzk+wx;m-`nfl?JZRNXq#I`9ymLD_dd>k_ug~P zJ8zg}S+vlELJLq9q5f$oKKYQOSIEH>Ofz4k%a19t#Uc12e&kcf!B3P;P{bFfX;bFA z>{w_K=WC*EXpgxZ?h=`e(c+wEdYE&j5q1yR3pJyJ=aog) ztyM%LO7!QRhk8(wws8=?HO_mWn}L?eZ3f!W-A9j8lHqyJK1YC>#zcI3vk%Yom~jNC zh8B4Q@n1Ke*P}1{EL`ep|8Hroe31evptOqmbJZ0yIRiYalYdB4qLe8w4Oa zt}rKp#&QMLu{t%E{9q|_1;@y;Ll&Ulk^ou;S_rBE^_!RC`KQ7lMg~TNScof(NCpYH z=OD4+)=KY^E9)e+Op;l=-_7NPzJs9ypM Y09(8FLyu|_iU0rr07*qoM6N<$f=H+VPXGV_ literal 0 HcmV?d00001 diff --git a/3dPrintApp/Resources/ViewPanel/ZoomIn.png b/3dPrintApp/Resources/ViewPanel/ZoomIn.png new file mode 100644 index 0000000000000000000000000000000000000000..b370a3e06b5fbc81e5b82a68f9c21bd34e76cf9c GIT binary patch literal 689 zcmV;i0#5yjP)n@aLqF0b_W?u00h)dcq0s~q z110o&AfFLQ9ms(nfMNkOPgBr@{1BSh@ufR^P?<%yatbN5Hi8m7D19Nx6)-R|bTKe9 zF}9c~s8k2*Jfvsg830YtpqzLRDZ$G}s){o-`>Hb(tiSen%l$WcloXE0SXCMp69pTGTKu$*z~<-K=bHOO`t$Whe5!PAbv`1bAFe-J)*>(zgy zmOU@XHH&JkgwMbK7W8eq`xC_0kl|ri6Q(B~H0}8L0Sze-w(C1|@b=^P|B*vXy=~u- z0ShS*IP~Pbf5zIY@WK-mV)d5t)*9{mj|^Byfw0fyqlL@%--U-32!r_9^Uus7)(omU z3WRO@4qbcs<`as;TGm|tVc5ApjqcG010w7!5oPPHe}VDm?tk=S)BSgc&XqaL8j$FN zVe8&QQ?{IV_&^!nYz_hes6!5dLX0j69h$KDLD2_fCqSbR9UOq- zgn`I?22hL+9?-Q&07lIPU^D(TAHehgDaQ5ZBcV9Jd zZ2#T=X59yOk!lWA9mPh!5kJp>*S;Xi9To{`$33}xn|+P$A}8k zT#~_ASvbYI_fXw{L>~;B_Z++cOY|TNV#~Me`3Ve31-ge644i!S!J%y3^)Ddy)3-kv zvQ}MvDZt9?LTu}lkyhPyo4&(SY$f@!_dol15#&gc3R7A{9}F9I?oT5}ALHl%$Ec%5 i9X0BxLGCDk00RJRvdCsdkZ8960000 0) + Dim nColorBits As Integer = GetMainPrivateProfileInt(S_OPENGL, K_COLORBITS, 32) + Dim nDepthBits As Integer = GetMainPrivateProfileInt(S_OPENGL, K_DEPTHBITS, 32) + MainScene.SetViewAttributes(nDriver, b2Buff, nColorBits, nDepthBits) + End Sub + + Private Sub PostInitializeScene() + ' Impostazioni Controller + MainController.SetScene(MainScene) + MainController.SetSurfTmTolerance(0.05) + MainController.SetUseCustomColors(True, S_SCENE, K_CUSTOMCOLORS) + ' imposto unità di misura per interfaccia utente + Dim nMeasureUnit As Integer = GetMainPrivateProfileInt(S_SCENE, K_MMUNITS, 1) + EgtSetUiUnits(nMeasureUnit <> 0) + 'Map.refMyStatusBarVM.SetMeasureUnit(nMeasureUnit <> 0) + ' imposto visualizzazione riferimento globale + EgtSetGlobFrameShow(True) + ' imposto i dati della griglia + 'LoadGridData() + EgtSetGridFrame(Frame3d.GLOB) + EgtSetGridGeo(10, 10, 100, 484) + EgtSetGridColor(New Color3d(160, 160, 160), New Color3d(160, 160, 160)) + EgtSetGridShow(True, False) + ' imposto tipo coordinate + MainScene.SetGridCursorPos(True) + ' modo di visualizzazione + Dim nShowMode As Integer = GetMainPrivateProfileInt(S_SCENE, K_SHOWMODE, SM.SHADING) + '''Map.refShowPanelVM.SetShowMode(DirectCast(nShowMode, SM)) + ' visualizzazione avanzata dei triangoli costituenti le superfici + Dim bShowTriaAdv As Boolean = (GetMainPrivateProfileInt(S_SCENE, K_SHOWTRIAADV, 1) <> 0) + EgtSetShowTriaAdv(bShowTriaAdv) + ' tipo visualizzazione per Zmap + Dim nShowZmap As Integer = GetMainPrivateProfileInt(S_SCENE, K_SHOWZMAP, 1) + EgtSetShowZmap(DirectCast(nShowZmap, ZSM), False) + ' dimensione lineare max in pixel delle textures + Dim nTxrMaxLinPix As Integer = GetMainPrivateProfileInt(S_SCENE, K_TEXMAXLINPIX, 4096) + EgtSetTextureMaxLinPixels(nTxrMaxLinPix) + ' tipo snap point + MainScene.SetSnapPointType(SP.PT_SKETCH) + ' visualizzazione assemblato + Dim nShowBuilding As Boolean = GetMainPrivateProfileInt(S_SCENE, K_SHOWBUILDING, 0) <> 0 + '''Map.refShowBeamPanelVM.SetShowBuilding(nShowBuilding) + ' nascondo input box + '''Map.refFreeContourInputVM.ResetInputBox() + End Sub + +#End Region ' METHODS + +#Region "ProjectManager" + + Public Overrides Sub NewProject() + EgtSetCurrentContext(MainScene.GetCtx()) + Dim bOk As Boolean = MainController.NewProject() + MainScene.SetStatusNull() + End Sub + + Public Overrides Sub OpenProject(sFilePath As String) + EgtSetCurrentContext(MainScene.GetCtx()) + Dim bOk As Boolean = False + If String.IsNullOrEmpty(sFilePath) Then + ' Recupero cartella dell'ultimo progetto aperto + Dim sDir As String = MainController.GetCurrFile() + If String.IsNullOrWhiteSpace(sDir) Then + GetMainPrivateProfileString(S_MRUFILES, K_FILE, "", sDir) + End If + If Not String.IsNullOrWhiteSpace(sDir) Then + sDir = Path.GetDirectoryName(sDir) + End If + bOk = MainController.OpenProject(sDir) + Else + bOk = MainController.OpenProject(sFilePath, False) + End If + MainScene.SetStatusNull() + End Sub + + Public Overrides Sub SaveProject() + MyBase.SaveProject() + ' Imposto stato gestione mouse diretto della scena a nessuno + MainScene.SetStatusNull() + End Sub + + Public Overrides Sub SaveAsProject() + MyBase.SaveAsProject() + ' Imposto stato gestione mouse diretto della scena a nessuno + MainScene.SetStatusNull() + End Sub + + Public Overrides Sub InsertProject() + ' eseguo + Dim sDir As String = String.Empty + GetMainPrivateProfileString(S_MRUIMPORT, K_FILE & "1", "", sDir) + Dim OpenFileDialog As New OpenFileDialog With {.Title = "Insert", + .Filter = "Stereolithography (*.stl)|*.stl" & + "|New geometry EgalTech(*.nge)|*.nge" & + "|All Files (*.*)|*.*", + .FilterIndex = 1, + .InitialDirectory = sDir} + If Not OpenFileDialog.ShowDialog Then + Return + End If + Dim sFile As String = String.Empty + sFile = OpenFileDialog.FileName + MainController.InsertProject(sFile, False) + End Sub + + Public Overrides Sub ImportProject() + Dim sDir As String = String.Empty + GetMainPrivateProfileString(S_MRUIMPORT, K_FILE & "1", "", sDir) + If Not String.IsNullOrWhiteSpace(sDir) Then + sDir = Path.GetDirectoryName(sDir) + End If + sDir.TrimEnd("\"c) + MainController.ImportProject(sDir) + ' Imposto stato gestione mouse diretto della scena a nessuno + MainScene.SetStatusNull() + End Sub + + Friend Sub PreExecScript(bScriptInMru As Boolean) + 'm_bScriptInMru = bScriptInMru + End Sub + + Friend Sub ExecScript(sFilePath As String) + If String.IsNullOrEmpty(sFilePath) Then + Dim sDir As String = String.Empty + 'GetMainPrivateProfileString(S_GENERAL, K_LASTLUADIR, "", sDir) + MainController.Exec(sDir) + Else + MainController.Exec(sFilePath, False) + End If + Dim bMachiningMode As Boolean = EgtGetCurrMachGroup() <> GDB_ID.NULL + If Not bMachiningMode And EgtGetCurrLayer() = GDB_ID.NULL Then + Dim nCurrPart As Integer = EgtGetCurrPart() + If nCurrPart = GDB_ID.NULL Or Not EgtSetCurrPartLayer(nCurrPart, EgtGetFirstLayer(nCurrPart, True)) Then + EgtResetCurrPartLayer() + End If + End If + End Sub + +#End Region ' ProjectManager + +#Region "SCENE EVENTS" + + Private Sub OnCursorPos(ByVal sender As Object, ByVal sCursorPos As String) + Map.refMyStatusBarVM.SetCurrPos(sCursorPos) + End Sub + + Private Sub OnMouseSetObjFilterForSelect(sender As Object, bZeroDim As Boolean, bCurve As Boolean, + bSurf As Boolean, bVolume As Boolean, bExtra As Boolean) + End Sub + + Private Sub OnMouseSelectedAll(ByVal sender As Object, bOnlyVisble As Boolean) + End Sub + + Private Sub OnMouseDeselectedAll(ByVal sender As Object) + End Sub + + Private Sub OnMouseDownScene(sender As Object, e As Forms.MouseEventArgs) + If e.Button = Forms.MouseButtons.Middle Then Return + If Map.refInstrumentPanelVM.GetDistIsChecked Then Return + Basic_OnMouseDownScene(sender, e) + 'Select Case Map.refMainMenuVM.SelPage + ' Case Pages.VIEW + ' If Not IsNothing(Map.refProjectVM.BTLStructureVM) Then + ' If Map.refFreeContourManagerVM.bIsActive Then Return + ' If Map.refShowBeamPanelVM.bShowAll Then + ' View_Part_OnMouseDownScene(sender, e) + ' Else + ' View_Feature_OnMouseDownScene(sender, e) + ' End If + ' End If + ' Case Pages.MACHINING + ' If Not IsNothing(Map.refMachGroupPanelVM) AndAlso Not IsNothing(Map.refMachGroupPanelVM.SelectedMachGroup) Then + ' Dim SelectedMachGroup As MyMachGroupVM = Map.refMachGroupPanelVM.SelectedMachGroup + ' If EgtGetCurrMachGroup() = GDB_ID.NULL Then Return + ' If SelectedMachGroup.nType = BWType.BEAM Then + ' Beam_OnMouseDownScene(sender, e) + ' ElseIf SelectedMachGroup.nType = BWType.WALL Then + ' Wall_OnMouseDownScene(sender, e) + ' End If + ' End If + 'End Select + End Sub + + Private Sub OnMouseMoveScene(sender As Object, e As Forms.MouseEventArgs) + If e.Button = Forms.MouseButtons.Middle Then Return + If Map.refInstrumentPanelVM.GetDistIsChecked Then Return + Basic_OnMouseMoveScene(sender, e) + 'Select Case Map.refMainMenuVM.SelPage + ' Case Pages.VIEW + ' If Not IsNothing(Map.refProjectVM.BTLStructureVM) Then + ' If Map.refFreeContourManagerVM.bIsActive Then Return + ' If Map.refShowBeamPanelVM.bShowAll Then + ' View_Part_OnMouseMoveScene(sender, e) + ' Else + ' View_Feature_OnMouseMoveScene(sender, e) + ' End If + ' End If + ' Case Pages.MACHINING + ' If Not IsNothing(Map.refMachGroupPanelVM) AndAlso Not IsNothing(Map.refMachGroupPanelVM.SelectedMachGroup) Then + ' Dim SelectedMachGroup As MyMachGroupVM = Map.refMachGroupPanelVM.SelectedMachGroup + ' If EgtGetCurrMachGroup() = GDB_ID.NULL Then Return + ' If SelectedMachGroup.nType = BWType.BEAM Then + ' Beam_OnMouseMoveScene(sender, e) + ' ElseIf SelectedMachGroup.nType = BWType.WALL Then + ' Wall_OnMouseMoveScene(sender, e) + ' End If + ' End If + 'End Select + End Sub + + Private Sub OnMouseUpScene(sender As Object, e As Forms.MouseEventArgs) + If e.Button = Forms.MouseButtons.Middle Then Return + If Map.refInstrumentPanelVM.GetDistIsChecked Then Return + Basic_OnMouseUpScene(sender, e) + 'Select Case Map.refMainMenuVM.SelPage + ' Case Pages.VIEW + ' If Not IsNothing(Map.refProjectVM.BTLStructureVM) Then + ' If Map.refFreeContourManagerVM.bIsActive Then Return + ' If Map.refShowBeamPanelVM.bShowAll Then + ' View_Part_OnMouseUpScene(sender, e) + ' Else + ' View_Feature_OnMouseUpScene(sender, e) + ' End If + ' End If + ' Case Pages.MACHINING + ' If Not IsNothing(Map.refMachGroupPanelVM) AndAlso Not IsNothing(Map.refMachGroupPanelVM.SelectedMachGroup) Then + ' Dim SelectedMachGroup As MyMachGroupVM = Map.refMachGroupPanelVM.SelectedMachGroup + ' If EgtGetCurrMachGroup() = GDB_ID.NULL Then Return + ' If SelectedMachGroup.nType = BWType.BEAM Then + ' Beam_OnMouseUpScene(sender, e) + ' ElseIf SelectedMachGroup.nType = BWType.WALL Then + ' Wall_OnMouseUpScene(sender, e) + ' End If + ' End If + 'End Select + End Sub + + Private Sub OnMouseSelectedObj(ByVal sender As Object, ByVal nId As Integer, ByVal bLast As Boolean) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' ' se sto editando testo angoli + ' If Map.refFreeContourManagerVM.bIsModifyingTextAngle Then + ' ' passo testo selezionato + ' Map.refFreeContourManagerVM.TextAngleSelected(nId) + ' End If + ' MainController.MouseSelectedObj(nId, bLast) + 'End If + End Sub + + Private Sub OnMouseSelectedPart(ByVal sender As Object, ByVal nId As Integer) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.MouseSelectedPart(nId) + 'End If + End Sub + + Private Sub OnMouseSelectedLayer(ByVal sender As Object, ByVal nId As Integer) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.MouseSelectedLayer(nId) + 'End If + End Sub + + Private Sub OnMouseSelectedPath(ByVal sender As Object, ByVal nId As Integer, ByVal bHaltOnFork As Boolean) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.MouseSelectedPath(nId, bHaltOnFork) + 'End If + End Sub + + Private Sub OnMousePointFromSelection(ByVal sender As Object, ByVal nId As Integer, ByVal PtP As Point3d, ByVal nAux As Integer) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.SetPointFromSelection(nId, PtP, nAux) + 'End If + End Sub + + Private Sub OnMouseDone(ByVal sender As Object) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.Done(Map.refFreeContourInputVM.Text) + 'End If + End Sub + + Private Sub OnMouseSelectedPoint(ByVal sender As Object, ByVal PtP As Point3d, ByVal nSep As SEP, ByVal nId As Integer) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' Dim bDone As Boolean = (Keyboard.Modifiers And ModifierKeys.Control) <> ModifierKeys.Control + ' MainController.MouseSelectedPoint(PtP, nSep, nId, bDone) + 'End If + End Sub + + Private Sub OnMouseSelectedDir(ByVal sender As Object, ByVal VtDir As Vector3d) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.SetLastVector3d(VtDir) + 'End If + End Sub + + Private Sub OnMouseMoveSelPoint(ByVal sender As Object, ByVal PtP As Point3d) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.MouseMoveInSelectionPoint(PtP) + 'End If + End Sub + + Private Sub OnShowDistance(ByVal sender As Object, ByVal sDistance As String) + Map.refMyStatusBarVM.SetOutputMessage(sDistance) + End Sub + + Private Sub OnKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' ' Con DEL eseguo cancellazione delle entità selezionate + ' If e.KeyData = System.Windows.Forms.Keys.Delete Then + ' MainController.SetLastInteger(GDB_ID.SEL) + ' MainController.ExecuteCommand(Controller.CMD.DELETE) + ' ' Con SPAZIO ripeto l'ultimo comando + ' ElseIf e.KeyData = System.Windows.Forms.Keys.Space Then + ' MainController.RepeatLastCommand() + ' ' Con 'A' e in modalità continuazione, forzo il passaggio ad arco + ' ElseIf e.KeyData = System.Windows.Forms.Keys.A And MainController.GetContinue() Then + ' MainController.ContinueArcPDP() + ' ' Con 'L' e in modalità continuazione, forzo il passaggio a retta + ' ElseIf e.KeyData = System.Windows.Forms.Keys.L And MainController.GetContinue() Then + ' MainController.ContinueLine2P() + ' ' Con 'V' cambio lo stato del check + ' ElseIf e.KeyData = System.Windows.Forms.Keys.V Then + ' Map.refFreeContourInputVM.ChangeInputBoxCheck() + ' End If + 'End If + End Sub + + Private Sub OnCloseGetDist(sender As System.Object) + Map.refInstrumentPanelVM.SetGetDistance_IsChecked(False) + End Sub + + Friend Sub OnChangedSnapPointType(ByVal sender As Object, ByVal nSpType As SP, ByVal bUser As Boolean) + m_SnapType = nSpType + If Not IsNothing(Map.refMyStatusBarVM) Then Map.refMyStatusBarVM.SetSnapPointType(nSpType) + End Sub + +#End Region ' SCENE EVENTS + +#Region "CONTROLLER EVENTS" + + Private Sub OnNewProject(sender As Object, bOk As Boolean) + CurrentMachine.CreateMachineTable() + If Not bOk Then + MessageBox.Show(Application.Current.MainWindow, EgtMsg(10002), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error on new file - Error + End If + EgtZoom(ZM.ALL) + MainScene.SetStatusNull() + End Sub + + Private Sub OnOpenProject(sender As Object, sFile As String, bOk As Boolean) + EgtZoom(ZM.ALL) + WriteMainPrivateProfileString(S_GENERAL, K_LASTNGEDIR, Path.GetDirectoryName(sFile)) + If bOk Then + Map.refProjManagerVM.MruFiles.Add(sFile) + Else + Map.refProjManagerVM.MruFiles.Remove(sFile) + Dim sMsg As String + If My.Computer.FileSystem.FileExists(sFile) Then + sMsg = EgtMsg(10003) & " '" & sFile & "'" 'Error opening file + Else + sMsg = EgtMsg(10009) & " '" & sFile & "'" 'Missing file + End If + MessageBox.Show(Application.Current.MainWindow, sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error + End If + MainScene.SetStatusNull() + End Sub + + Private Sub OnSavingProject(ByVal sender As Object, sFile As String) + End Sub + + Private Sub OnSavedProject(ByVal sender As Object, ByVal sFile As String, ByVal bOk As Boolean) + WriteMainPrivateProfileString(S_GENERAL, K_LASTNGEDIR, Path.GetDirectoryName(sFile)) + If bOk Then + Map.refProjManagerVM.MruFiles.Add(sFile) + Else + Map.refProjManagerVM.MruFiles.Remove(sFile) + Dim sMsg As String = EgtMsg(10004) & " '" & sFile & "'" 'Error saving file + MessageBox.Show(Application.Current.MainWindow, sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error + End If + End Sub + + Private Sub OnInsertedProject(ByVal sender As Object, ByVal sFile As String, ByVal bOk As Boolean) + ' Segnalo eventuale errore + If Not bOk Then + Dim sMsg As String = EgtMsg(10006) & " '" & sFile & "'" 'Error importing file + MessageBox.Show(Application.Current.MainWindow, sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error + Else + ' lo aggiungo alla lista pezzi + Map.refProjectVM.AddNewPart(sFile) + End If + EgtDraw() + MainScene.SetStatusNull() + End Sub + + Private Sub OnImportingProject(sender As Object, nType As Integer, ByRef nFlag As Integer) + If nType <> FT.NULL Then + If nType = FT.CNC Then + nFlag = GetMainPrivateProfileInt(S_IMPORT, K_CNCFLAG, EIC_FL.NONE) + Else + nFlag = 0 + End If + ' Abilito progress e bottone stop + Map.refMyStatusBarVM.StartLoading("", True) + Else + MessageBox.Show(Application.Current.MainWindow, EgtMsg(10005), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' File type unknown - Error + End If + End Sub + + Private Sub OnImportedProject(ByVal sender As Object, ByVal sFile As String, ByVal bOk As Boolean) + EgtZoom(ZM.ALL) + ' Disabilito progress e bottone stop + Map.refMyStatusBarVM.EndLoading("") + ' Salvo path + WriteMainPrivateProfileString(S_GENERAL, K_LASTIMPDIR, Path.GetDirectoryName(sFile)) + ' Segnalo eventuale errore + If Not bOk Then + Dim sMsg As String = EgtMsg(10006) & " '" & sFile & "'" 'Error importing file + MessageBox.Show(Application.Current.MainWindow, sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error + ElseIf Path.GetExtension(sFile) <> ".cnc" Then + ' creo oggetto pezzo in lista + 'Map.refProjectVM. + End If + MainScene.SetStatusNull() + End Sub + + Private Sub PrepareInputBox(ByVal sTitle As String, ByVal sLabel As String, ByVal sCheckLabel As String, + ByVal bShowCombo As Boolean, ByVal bShowBtn As Boolean) + 'Map.refFreeContourInputVM.PrepareInputBox(sTitle, sLabel, sCheckLabel, bShowCombo, bShowBtn) + End Sub + + Private Sub SetInputBoxText(ByVal sText As String) + 'Map.refFreeContourInputVM.SetInputBoxText(sText) + End Sub + + Private Sub SetInputBoxCheck(ByVal bCheck As Boolean) + 'Map.refFreeContourInputVM.SetInputBoxCheck(bCheck) + End Sub + + Private Sub AddInputBoxCombo(ByVal sText As String, ByVal bSelected As Boolean) + 'Map.refFreeContourInputVM.AddInputBoxCombo(sText, bSelected) + End Sub + + Private Sub UpdateUI(ByVal sender As Object, ByVal bReloadUI As Boolean) + '' pulisco input e relativi messaggi + 'Map.refFreeContourInputVM.ResetInputBox() + If MainController.GetContinue() Then + Map.refMyStatusBarVM.SetOutputMessage(EgtMsg(399)) ' Continue : 'L' with line, 'A' with arc + Else + Map.refMyStatusBarVM.ClearOutputMessage() + End If + End Sub + +#End Region ' CONTROLLER EVENTS + +#Region "Part" + + Friend Sub Basic_OnMouseDownScene(sender As Object, e As Forms.MouseEventArgs) + ' Verifico se selezionato indicativo di pezzo + EgtSetObjFilterForSelWin(True, True, True, True, True) + Dim nSel As Integer + EgtSelect(e.Location, Scene.DIM_SEL, Scene.DIM_SEL, nSel) + Dim nId As Integer = EgtGetFirstObjInSelWin() + While nId <> GDB_ID.NULL + ' Recupero l'identificativo del pezzo cui appartiene + Dim nPartId As Integer = EgtGetParent(EgtGetParent(nId)) + Dim bFound As Boolean = False + If EgtIsPart(nPartId) Then bFound = True + If Not bFound Then + nId = EgtGetNextObjInSelWin() + Continue While + End If + Dim nStat As Integer = GDB_ST.ON_ + EgtGetStatus(nPartId, nStat) + ' Se già selezionato + If nStat = GDB_ST.SEL Then + ' Memorizzo Id da deselezionare + m_nIdToDesel = nPartId + Else + ' Memorizzo Id da selezionare + m_nIdToSel = nPartId + End If + Exit While + nId = EgtGetNextObjInSelWin() + End While + ' Dati per drag + m_bDragToStart = True + End Sub + + Friend Sub Basic_OnMouseMoveScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) + ' Se drag non abilitato o già in esecuzione, esco + If Not m_bDragToStart Then Return + ' Se primo movimento di drag, verifico di aver superato la soglia di movimento in pixel + If m_bDragToStart Then + If Math.Abs(e.Location.X - m_locPrev.X) < m_nRestRadius And + Math.Abs(e.Location.Y - m_locPrev.Y) < m_nRestRadius Then + Return + End If + m_bDragToStart = False + End If + End Sub + + Friend Sub Basic_OnMouseUpScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) + ' Se eseguito drag + If Not m_bDragToStart Then + ' Se selezione da eseguire + ElseIf m_nIdToSel <> GDB_ID.NULL Then + ' Se pezzo da selezionare non è già selezionato + 'If EgtIsSelectedObj(m_nIdToSel) Then + ' Eseguo la selezione + Map.refProjectVM.SelPartFromId(m_nIdToSel) + 'EgtDeselectAll() + 'EgtSelectPartObjs(m_nIdToSel) + 'EgtSelectObj(m_nIdToSel) + 'EgtSetMark(m_nIdToSel) + 'End If + 'If IsNothing(Map.refProjectVM.BTLStructureVM.SelBTLPart) OrElse Map.refProjectVM.BTLStructureVM.SelBTLPart.nPartId <> m_nIdToSel Then + ' ' Eseguo la selezione + ' For Each BTLPart In Map.refProjectVM.BTLStructureVM.BTLPartVMList + ' If BTLPart.nPartId = m_nIdToSel Then + ' BTLPart.SetIsSelected(True) + ' ElseIf BTLPart.IsSelected Then + ' BTLPart.SetIsSelected(False) + ' End If + ' Next + ' End If + End If + ' Reset + m_bDrag = False + m_nIdToSel = GDB_ID.NULL + m_nIdToDesel = GDB_ID.NULL + EgtDraw() + End Sub + +#End Region ' Part + +End Class diff --git a/3dPrintApp/SceneHost/MySceneHostVM.vb.bak b/3dPrintApp/SceneHost/MySceneHostVM.vb.bak new file mode 100644 index 0000000..b07847b --- /dev/null +++ b/3dPrintApp/SceneHost/MySceneHostVM.vb.bak @@ -0,0 +1,655 @@ +Imports System.IO +Imports EgtUILib +Imports EgtWPFLib5 + +Public Class MySceneHostVM + Inherits EgtWPFLib5.SceneHostVM + + Friend m_bIsFocused As Boolean + Friend Sub SetIsFocused(bValue As Boolean) + m_bIsFocused = bValue + End Sub + + ' Identificativi per pezzo da selezionare/deselezionare + Private m_nIdToSel As Integer = GDB_ID.NULL + Private m_nIdToDesel As Integer = GDB_ID.NULL + ' Dati movimento + Private m_dMaxStep As Double = 0 + ' Dati per Drag + Private m_nRestRadius As Integer = 5 + Private m_bDrag As Boolean = False + Private m_bDragToStart As Boolean = False + Private m_bVerify As Boolean = False + Private m_bFromParking As Boolean = False + Private m_bDragging As Boolean = False + Private m_locPrev As System.Drawing.Point + Private m_ptPrev As Point3d + Private m_vtTotMove As Vector3d + Private m_dSnapDist As Double = 0 + + + Private bReducedCut As Boolean = False + Private m_bMagnetic As Boolean + +#Region "CONSTRUCTOR" + + Sub New() + MyBase.New() + AddHandler MainController.OnNewProject, AddressOf OnNewProject + AddHandler MainController.OnOpenProject, AddressOf OnOpenProject + AddHandler MainController.OnSavingProject, AddressOf OnSavingProject + AddHandler MainController.OnSavedProject, AddressOf OnSavedProject + AddHandler MainController.OnImportingProject, AddressOf OnImportingProject + AddHandler MainController.OnImportedProject, AddressOf OnImportedProject + AddHandler MainController.PrepareInputBox, AddressOf PrepareInputBox + AddHandler MainController.SetInputBoxText, AddressOf SetInputBoxText + AddHandler MainController.SetInputBoxCheck, AddressOf SetInputBoxCheck + AddHandler MainController.AddInputBoxCombo, AddressOf AddInputBoxCombo + AddHandler MainController.UpdateUI, AddressOf UpdateUI + End Sub + +#End Region ' CONSTRUCTOR + +#Region "METHODS" + + Overrides Sub InitScene() + InitSceneEvents() + ' Inizializzazione Scena + PreInitializeScene() + ' Se tutto bene + If MainScene.Init() And Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT._3DPRINT) Then + PostInitializeScene() + ' Imposto stato gestione mouse diretto della scena a nessuno + MainScene.SetStatusNull() + EgtSetCurrentContext(MainScene.GetCtx()) + ' inizializzo gestore travi e pareti + EgtInitBeamMgr(EIB_FL.TS3_POS + EIB_FL.USEUATTR) + ' inizializzo gestore lavorazioni + EgtInitMachMgr(Map.refMainWindowVM.MainWindowM.sMachinesRoot, Map.refMainWindowVM.MainWindowM.sToolMakersDir) + Return + End If + ' Problemi + ' Se manca la chiave + If Map.refMainWindowVM.MainWindowM.nKeyLevel = -1 Or Map.refMainWindowVM.MainWindowM.nKeyLevel = -2 Then + EgtOutLog("Missing Dongle") + ' Box di avviso chiave mancante : "Chiave non presente. \n Inserirla e riavviare il programma." "Errore" + Dim sText As String = EgtMsg(MSG_MISSINGKEYWD + 2) & vbCrLf & EgtMsg(MSG_MISSINGKEYWD + 3) + Dim sTitle As String = EgtMsg(MSG_MISSINGKEYWD + 1) + MessageBox.Show(sText, sTitle, MessageBoxButton.OK, MessageBoxImage.Error) + ' Altrimenti manca la licenza + Else + EgtOutLog("Problems with Licence") + ' Box di avviso licenza con problemi : "Programma senza licenza. \n Caricala e riavvia il programma." "Errore" + Dim sText As String = EgtMsg(MSG_MISSINGKEYWD + 5) & vbCrLf & EgtMsg(MSG_MISSINGKEYWD + 6) + Dim sTitle As String = EgtMsg(MSG_MISSINGKEYWD + 1) + If MessageBox.Show(sText, sTitle, MessageBoxButton.OKCancel, MessageBoxImage.Error) = MessageBoxResult.OK Then + ' Apro dialogo per richiesta file licenza + Dim LicDlg As New Microsoft.Win32.OpenFileDialog() With { + .DefaultExt = ".lic", + .Filter = "Licences (.lic)|*.lic", + .CheckFileExists = True, + .ValidateNames = True + } + If LicDlg.ShowDialog() = True Then + ' Recupero il direttorio del file + Dim sDir As String = Path.GetDirectoryName(LicDlg.FileName) + ' Se il file non è già nel direttorio di configurazione lo copio + If Not String.Equals(Path.GetFullPath(sDir), Path.GetFullPath(Map.refMainWindowVM.MainWindowM.sConfigDir), StringComparison.OrdinalIgnoreCase) Then + Try + File.Copy(LicDlg.FileName, Path.Combine(Map.refMainWindowVM.MainWindowM.sConfigDir, LicDlg.SafeFileName), True) + Catch ex As Exception + End Try + End If + ' Imposto il nuovo file di licenza nell'Ini + WriteMainPrivateProfileString(S_GENERAL, K_LICENCE, LicDlg.SafeFileName) + End If + End If + End If + ' Chiudo il programma + End + End Sub + + Public Overrides Sub InitSceneEvents() + AddHandler MainScene.OnCursorPos, AddressOf OnCursorPos + AddHandler MainScene.OnMouseSetObjFilterForSelect, AddressOf OnMouseSetObjFilterForSelect + AddHandler MainScene.OnMouseSelectedAll, AddressOf OnMouseSelectedAll + AddHandler MainScene.OnMouseDeselectedAll, AddressOf OnMouseDeselectedAll + AddHandler MainScene.OnMouseDownScene, AddressOf OnMouseDownScene + AddHandler MainScene.OnMouseMoveScene, AddressOf OnMouseMoveScene + AddHandler MainScene.OnMouseUpScene, AddressOf OnMouseUpScene + AddHandler MainScene.OnMouseSelectedObj, AddressOf OnMouseSelectedObj + AddHandler MainScene.OnMouseSelectedPart, AddressOf OnMouseSelectedPart + AddHandler MainScene.OnMouseSelectedLayer, AddressOf OnMouseSelectedLayer + AddHandler MainScene.OnMouseSelectedPath, AddressOf OnMouseSelectedPath + AddHandler MainScene.OnMousePointFromSelection, AddressOf OnMousePointFromSelection + AddHandler MainScene.OnMouseDone, AddressOf OnMouseDone + AddHandler MainScene.OnMouseSelectedPoint, AddressOf OnMouseSelectedPoint + AddHandler MainScene.OnMouseSelectedDir, AddressOf OnMouseSelectedDir + AddHandler MainScene.OnMouseMoveSelPoint, AddressOf OnMouseMoveSelPoint + AddHandler MainScene.OnShowDistance, AddressOf OnShowDistance + AddHandler MainScene.KeyDown, AddressOf OnKeyDown + AddHandler MainScene.OnCloseGetDist, AddressOf OnCloseGetDist + AddHandler MainScene.OnChangedSnapPointType, AddressOf OnChangedSnapPointType + End Sub + + Private Sub PreInitializeScene() + ' imposto colore di default + Dim DefColor As New Color3d(0, 0, 0) + GetMainPrivateProfileColor(S_GEOMDB, K_DEFAULTCOLOR, DefColor) + MainScene.SetDefaultMaterial(DefColor) + ' imposto colori sfondo + Dim BackTopColor As New Color3d(192, 192, 192) + GetMainPrivateProfileColor(S_SCENE, K_BACKTOP, BackTopColor) + Dim BackBotColor As New Color3d(BackTopColor) + GetMainPrivateProfileColor(S_SCENE, K_BACKBOTTOM, BackBotColor) + MainScene.SetViewBackground(BackTopColor, BackBotColor) + ' imposto colore di evidenziazione + Dim MarkColor As New Color3d(255, 255, 0) + GetMainPrivateProfileColor(S_SCENE, K_MARK, MarkColor) + MainScene.SetMarkMaterial(MarkColor) + ' imposto colore per superfici selezionate + Dim SelSurfColor As New Color3d(255, 255, 192) + GetMainPrivateProfileColor(S_SCENE, K_SELSURF, SelSurfColor) + MainScene.SetSelSurfMaterial(SelSurfColor) + ' imposto tipo e colore del rettangolo di zoom + Dim bOutline As Boolean = True + Dim ZwColor As New Color3d(0, 0, 0) + GetMainPrivateProfileZoomWin(S_SCENE, K_ZOOMWIN, bOutline, ZwColor) + MainScene.SetZoomWinAttribs(bOutline, ZwColor) + ' imposto colore della linea di distanza + Dim DstLnColor As New Color3d(255, 0, 0) + GetMainPrivateProfileColor(S_SCENE, K_DISTLINE, DstLnColor) + MainScene.SetDistLineMaterial(DstLnColor) + ' imposto parametri OpenGL + Dim nDriver As Integer = GetMainPrivateProfileInt(S_OPENGL, K_DRIVER, 3) + Dim b2Buff As Boolean = (GetMainPrivateProfileInt(S_OPENGL, K_DOUBLEBUFFER, 1) <> 0) + Dim nColorBits As Integer = GetMainPrivateProfileInt(S_OPENGL, K_COLORBITS, 32) + Dim nDepthBits As Integer = GetMainPrivateProfileInt(S_OPENGL, K_DEPTHBITS, 32) + MainScene.SetViewAttributes(nDriver, b2Buff, nColorBits, nDepthBits) + End Sub + + Private Sub PostInitializeScene() + ' Impostazioni Controller + MainController.SetScene(MainScene) + ' imposto tipo coordinate + MainScene.SetGridCursorPos(True) + ' modo di visualizzazione + Dim nShowMode As Integer = GetMainPrivateProfileInt(S_SCENE, K_SHOWMODE, SM.SHADING) + '''Map.refShowPanelVM.SetShowMode(DirectCast(nShowMode, SM)) + ' visualizzazione avanzata dei triangoli costituenti le superfici + Dim bShowTriaAdv As Boolean = (GetMainPrivateProfileInt(S_SCENE, K_SHOWTRIAADV, 1) <> 0) + EgtSetShowTriaAdv(bShowTriaAdv) + ' tipo visualizzazione per Zmap + Dim nShowZmap As Integer = GetMainPrivateProfileInt(S_SCENE, K_SHOWZMAP, 1) + EgtSetShowZmap(DirectCast(nShowZmap, ZSM), False) + ' dimensione lineare max in pixel delle textures + Dim nTxrMaxLinPix As Integer = GetMainPrivateProfileInt(S_SCENE, K_TEXMAXLINPIX, 4096) + EgtSetTextureMaxLinPixels(nTxrMaxLinPix) + ' tipo snap point + MainScene.SetSnapPointType(SP.PT_SKETCH) + ' visualizzazione assemblato + Dim nShowBuilding As Boolean = GetMainPrivateProfileInt(S_SCENE, K_SHOWBUILDING, 0) <> 0 + '''Map.refShowBeamPanelVM.SetShowBuilding(nShowBuilding) + ' nascondo input box + '''Map.refFreeContourInputVM.ResetInputBox() + End Sub + +#End Region ' METHODS + +#Region "ProjectManager" + + Public Overrides Sub NewProject() + EgtSetCurrentContext(MainScene.GetCtx()) + Dim bOk As Boolean = MainController.NewProject() + MainScene.SetStatusNull() + End Sub + + Public Overrides Sub OpenProject(sFilePath As String) + EgtSetCurrentContext(MainScene.GetCtx()) + Dim bOk As Boolean = False + If String.IsNullOrEmpty(sFilePath) Then + ' Recupero cartella dell'ultimo progetto aperto + Dim sDir As String = MainController.GetCurrFile() + If String.IsNullOrWhiteSpace(sDir) Then + GetMainPrivateProfileString(S_MRUFILES, K_FILE, "", sDir) + End If + If Not String.IsNullOrWhiteSpace(sDir) Then + sDir = Path.GetDirectoryName(sDir) + End If + bOk = MainController.OpenProject(sDir) + Else + bOk = MainController.OpenProject(sFilePath, False) + End If + MainScene.SetStatusNull() + End Sub + + Public Overrides Sub SaveProject() + MyBase.SaveProject() + ' Imposto stato gestione mouse diretto della scena a nessuno + MainScene.SetStatusNull() + End Sub + + Public Overrides Sub SaveAsProject() + MyBase.SaveAsProject() + ' Imposto stato gestione mouse diretto della scena a nessuno + MainScene.SetStatusNull() + End Sub + + Public Overrides Sub ImportProject() + Dim sDir As String = String.Empty + GetMainPrivateProfileString(S_MRUIMPORT, K_FILE & "1", "", sDir) + If Not String.IsNullOrWhiteSpace(sDir) Then + sDir = Path.GetDirectoryName(sDir) + End If + sDir.TrimEnd("\"c) + MainController.ImportProject(sDir) + ' Imposto stato gestione mouse diretto della scena a nessuno + MainScene.SetStatusNull() + End Sub + + Friend Sub PreExecScript(bScriptInMru As Boolean) + 'm_bScriptInMru = bScriptInMru + End Sub + + Friend Sub ExecScript(sFilePath As String) + If String.IsNullOrEmpty(sFilePath) Then + Dim sDir As String = String.Empty + 'GetMainPrivateProfileString(S_GENERAL, K_LASTLUADIR, "", sDir) + MainController.Exec(sDir) + Else + MainController.Exec(sFilePath, False) + End If + Dim bMachiningMode As Boolean = EgtGetCurrMachGroup() <> GDB_ID.NULL + If Not bMachiningMode And EgtGetCurrLayer() = GDB_ID.NULL Then + Dim nCurrPart As Integer = EgtGetCurrPart() + If nCurrPart = GDB_ID.NULL Or Not EgtSetCurrPartLayer(nCurrPart, EgtGetFirstLayer(nCurrPart, True)) Then + EgtResetCurrPartLayer() + End If + End If + End Sub + +#End Region ' ProjectManager + +#Region "SCENE EVENTS" + + Private Sub OnCursorPos(ByVal sender As Object, ByVal sCursorPos As String) + Map.refMyStatusBarVM.SetCurrPos(sCursorPos) + End Sub + + Private Sub OnMouseSetObjFilterForSelect(sender As Object, bZeroDim As Boolean, bCurve As Boolean, + bSurf As Boolean, bVolume As Boolean, bExtra As Boolean) + End Sub + + Private Sub OnMouseSelectedAll(ByVal sender As Object, bOnlyVisble As Boolean) + End Sub + + Private Sub OnMouseDeselectedAll(ByVal sender As Object) + End Sub + + Private Sub OnMouseDownScene(sender As Object, e As Forms.MouseEventArgs) + If e.Button = Forms.MouseButtons.Middle Then Return + If Map.refInstrumentPanelVM.GetDistIsChecked Then Return + Basic_OnMouseDownScene(sender, e) + 'Select Case Map.refMainMenuVM.SelPage + ' Case Pages.VIEW + ' If Not IsNothing(Map.refProjectVM.BTLStructureVM) Then + ' If Map.refFreeContourManagerVM.bIsActive Then Return + ' If Map.refShowBeamPanelVM.bShowAll Then + ' View_Part_OnMouseDownScene(sender, e) + ' Else + ' View_Feature_OnMouseDownScene(sender, e) + ' End If + ' End If + ' Case Pages.MACHINING + ' If Not IsNothing(Map.refMachGroupPanelVM) AndAlso Not IsNothing(Map.refMachGroupPanelVM.SelectedMachGroup) Then + ' Dim SelectedMachGroup As MyMachGroupVM = Map.refMachGroupPanelVM.SelectedMachGroup + ' If EgtGetCurrMachGroup() = GDB_ID.NULL Then Return + ' If SelectedMachGroup.nType = BWType.BEAM Then + ' Beam_OnMouseDownScene(sender, e) + ' ElseIf SelectedMachGroup.nType = BWType.WALL Then + ' Wall_OnMouseDownScene(sender, e) + ' End If + ' End If + 'End Select + End Sub + + Private Sub OnMouseMoveScene(sender As Object, e As Forms.MouseEventArgs) + If e.Button = Forms.MouseButtons.Middle Then Return + If Map.refInstrumentPanelVM.GetDistIsChecked Then Return + Basic_OnMouseMoveScene(sender, e) + 'Select Case Map.refMainMenuVM.SelPage + ' Case Pages.VIEW + ' If Not IsNothing(Map.refProjectVM.BTLStructureVM) Then + ' If Map.refFreeContourManagerVM.bIsActive Then Return + ' If Map.refShowBeamPanelVM.bShowAll Then + ' View_Part_OnMouseMoveScene(sender, e) + ' Else + ' View_Feature_OnMouseMoveScene(sender, e) + ' End If + ' End If + ' Case Pages.MACHINING + ' If Not IsNothing(Map.refMachGroupPanelVM) AndAlso Not IsNothing(Map.refMachGroupPanelVM.SelectedMachGroup) Then + ' Dim SelectedMachGroup As MyMachGroupVM = Map.refMachGroupPanelVM.SelectedMachGroup + ' If EgtGetCurrMachGroup() = GDB_ID.NULL Then Return + ' If SelectedMachGroup.nType = BWType.BEAM Then + ' Beam_OnMouseMoveScene(sender, e) + ' ElseIf SelectedMachGroup.nType = BWType.WALL Then + ' Wall_OnMouseMoveScene(sender, e) + ' End If + ' End If + 'End Select + End Sub + + Private Sub OnMouseUpScene(sender As Object, e As Forms.MouseEventArgs) + If e.Button = Forms.MouseButtons.Middle Then Return + If Map.refInstrumentPanelVM.GetDistIsChecked Then Return + Basic_OnMouseUpScene(sender, e) + 'Select Case Map.refMainMenuVM.SelPage + ' Case Pages.VIEW + ' If Not IsNothing(Map.refProjectVM.BTLStructureVM) Then + ' If Map.refFreeContourManagerVM.bIsActive Then Return + ' If Map.refShowBeamPanelVM.bShowAll Then + ' View_Part_OnMouseUpScene(sender, e) + ' Else + ' View_Feature_OnMouseUpScene(sender, e) + ' End If + ' End If + ' Case Pages.MACHINING + ' If Not IsNothing(Map.refMachGroupPanelVM) AndAlso Not IsNothing(Map.refMachGroupPanelVM.SelectedMachGroup) Then + ' Dim SelectedMachGroup As MyMachGroupVM = Map.refMachGroupPanelVM.SelectedMachGroup + ' If EgtGetCurrMachGroup() = GDB_ID.NULL Then Return + ' If SelectedMachGroup.nType = BWType.BEAM Then + ' Beam_OnMouseUpScene(sender, e) + ' ElseIf SelectedMachGroup.nType = BWType.WALL Then + ' Wall_OnMouseUpScene(sender, e) + ' End If + ' End If + 'End Select + End Sub + + Private Sub OnMouseSelectedObj(ByVal sender As Object, ByVal nId As Integer, ByVal bLast As Boolean) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' ' se sto editando testo angoli + ' If Map.refFreeContourManagerVM.bIsModifyingTextAngle Then + ' ' passo testo selezionato + ' Map.refFreeContourManagerVM.TextAngleSelected(nId) + ' End If + ' MainController.MouseSelectedObj(nId, bLast) + 'End If + End Sub + + Private Sub OnMouseSelectedPart(ByVal sender As Object, ByVal nId As Integer) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.MouseSelectedPart(nId) + 'End If + End Sub + + Private Sub OnMouseSelectedLayer(ByVal sender As Object, ByVal nId As Integer) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.MouseSelectedLayer(nId) + 'End If + End Sub + + Private Sub OnMouseSelectedPath(ByVal sender As Object, ByVal nId As Integer, ByVal bHaltOnFork As Boolean) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.MouseSelectedPath(nId, bHaltOnFork) + 'End If + End Sub + + Private Sub OnMousePointFromSelection(ByVal sender As Object, ByVal nId As Integer, ByVal PtP As Point3d, ByVal nAux As Integer) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.SetPointFromSelection(nId, PtP, nAux) + 'End If + End Sub + + Private Sub OnMouseDone(ByVal sender As Object) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.Done(Map.refFreeContourInputVM.Text) + 'End If + End Sub + + Private Sub OnMouseSelectedPoint(ByVal sender As Object, ByVal PtP As Point3d, ByVal nSep As SEP, ByVal nId As Integer) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' Dim bDone As Boolean = (Keyboard.Modifiers And ModifierKeys.Control) <> ModifierKeys.Control + ' MainController.MouseSelectedPoint(PtP, nSep, nId, bDone) + 'End If + End Sub + + Private Sub OnMouseSelectedDir(ByVal sender As Object, ByVal VtDir As Vector3d) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.SetLastVector3d(VtDir) + 'End If + End Sub + + Private Sub OnMouseMoveSelPoint(ByVal sender As Object, ByVal PtP As Point3d) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' MainController.MouseMoveInSelectionPoint(PtP) + 'End If + End Sub + + Private Sub OnShowDistance(ByVal sender As Object, ByVal sDistance As String) + Map.refMyStatusBarVM.SetOutputMessage(sDistance) + End Sub + + Private Sub OnKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) + '' Se in modalità edit L250 + 'If Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refFreeContourManagerVM.bIsActive Then + ' ' Con DEL eseguo cancellazione delle entità selezionate + ' If e.KeyData = System.Windows.Forms.Keys.Delete Then + ' MainController.SetLastInteger(GDB_ID.SEL) + ' MainController.ExecuteCommand(Controller.CMD.DELETE) + ' ' Con SPAZIO ripeto l'ultimo comando + ' ElseIf e.KeyData = System.Windows.Forms.Keys.Space Then + ' MainController.RepeatLastCommand() + ' ' Con 'A' e in modalità continuazione, forzo il passaggio ad arco + ' ElseIf e.KeyData = System.Windows.Forms.Keys.A And MainController.GetContinue() Then + ' MainController.ContinueArcPDP() + ' ' Con 'L' e in modalità continuazione, forzo il passaggio a retta + ' ElseIf e.KeyData = System.Windows.Forms.Keys.L And MainController.GetContinue() Then + ' MainController.ContinueLine2P() + ' ' Con 'V' cambio lo stato del check + ' ElseIf e.KeyData = System.Windows.Forms.Keys.V Then + ' Map.refFreeContourInputVM.ChangeInputBoxCheck() + ' End If + 'End If + End Sub + + Private Sub OnCloseGetDist(sender As System.Object) + Map.refInstrumentPanelVM.SetGetDistance_IsChecked(False) + End Sub + + Friend Sub OnChangedSnapPointType(ByVal sender As Object, ByVal nSpType As SP, ByVal bUser As Boolean) + If Not IsNothing(Map.refMyStatusBarVM) Then Map.refMyStatusBarVM.SetSnapPointType(nSpType) + End Sub + +#End Region ' SCENE EVENTS + +#Region "CONTROLLER EVENTS" + + Private Sub OnNewProject(sender As Object, bOk As Boolean) + EgtZoom(ZM.ALL) + If Not bOk Then + MessageBox.Show(Application.Current.MainWindow, EgtMsg(10002), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error on new file - Error + End If + MainScene.SetStatusNull() + End Sub + + Private Sub OnOpenProject(sender As Object, sFile As String, bOk As Boolean) + EgtZoom(ZM.ALL) + WriteMainPrivateProfileString(S_GENERAL, K_LASTNGEDIR, Path.GetDirectoryName(sFile)) + If bOk Then + Map.refProjManagerVM.MruFiles.Add(sFile) + Else + Map.refProjManagerVM.MruFiles.Remove(sFile) + Dim sMsg As String + If My.Computer.FileSystem.FileExists(sFile) Then + sMsg = EgtMsg(10003) & " '" & sFile & "'" 'Error opening file + Else + sMsg = EgtMsg(10009) & " '" & sFile & "'" 'Missing file + End If + MessageBox.Show(Application.Current.MainWindow, sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error + End If + MainScene.SetStatusNull() + End Sub + + Private Sub OnSavingProject(ByVal sender As Object, sFile As String) + End Sub + + Private Sub OnSavedProject(ByVal sender As Object, ByVal sFile As String, ByVal bOk As Boolean) + WriteMainPrivateProfileString(S_GENERAL, K_LASTNGEDIR, Path.GetDirectoryName(sFile)) + If bOk Then + Map.refProjManagerVM.MruFiles.Add(sFile) + Else + Map.refProjManagerVM.MruFiles.Remove(sFile) + Dim sMsg As String = EgtMsg(10004) & " '" & sFile & "'" 'Error saving file + MessageBox.Show(Application.Current.MainWindow, sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error + End If + End Sub + + Private Sub OnImportingProject(sender As Object, nType As Integer, ByRef nFlag As Integer) + If nType <> FT.NULL Then + If nType = FT.CNC Then + nFlag = GetMainPrivateProfileInt(S_IMPORT, K_CNCFLAG, EIC_FL.NONE) + Else + nFlag = 0 + End If + ' Abilito progress e bottone stop + Map.refMyStatusBarVM.StartLoading("", True) + Else + MessageBox.Show(Application.Current.MainWindow, EgtMsg(10005), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' File type unknown - Error + End If + End Sub + + Private Sub OnImportedProject(ByVal sender As Object, ByVal sFile As String, ByVal bOk As Boolean) + EgtZoom(ZM.ALL) + ' Disabilito progress e bottone stop + Map.refMyStatusBarVM.EndLoading("") + ' Salvo path + WriteMainPrivateProfileString(S_GENERAL, K_LASTIMPDIR, Path.GetDirectoryName(sFile)) + ' Segnalo eventuale errore + If Not bOk Then + Dim sMsg As String = EgtMsg(10006) & " '" & sFile & "'" 'Error importing file + MessageBox.Show(Application.Current.MainWindow, sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error + End If + MainScene.SetStatusNull() + End Sub + + Private Sub PrepareInputBox(ByVal sTitle As String, ByVal sLabel As String, ByVal sCheckLabel As String, + ByVal bShowCombo As Boolean, ByVal bShowBtn As Boolean) + 'Map.refFreeContourInputVM.PrepareInputBox(sTitle, sLabel, sCheckLabel, bShowCombo, bShowBtn) + End Sub + + Private Sub SetInputBoxText(ByVal sText As String) + 'Map.refFreeContourInputVM.SetInputBoxText(sText) + End Sub + + Private Sub SetInputBoxCheck(ByVal bCheck As Boolean) + 'Map.refFreeContourInputVM.SetInputBoxCheck(bCheck) + End Sub + + Private Sub AddInputBoxCombo(ByVal sText As String, ByVal bSelected As Boolean) + 'Map.refFreeContourInputVM.AddInputBoxCombo(sText, bSelected) + End Sub + + Private Sub UpdateUI(ByVal sender As Object, ByVal bReloadUI As Boolean) + '' pulisco input e relativi messaggi + 'Map.refFreeContourInputVM.ResetInputBox() + If MainController.GetContinue() Then + Map.refMyStatusBarVM.SetOutputMessage(EgtMsg(399)) ' Continue : 'L' with line, 'A' with arc + Else + Map.refMyStatusBarVM.ClearOutputMessage() + End If + End Sub + +#End Region ' CONTROLLER EVENTS + +#Region "Part" + + Friend Sub Basic_OnMouseDownScene(sender As Object, e As Forms.MouseEventArgs) + ' Verifico se selezionato indicativo di pezzo + EgtSetObjFilterForSelWin(True, True, True, True, True) + Dim nSel As Integer + EgtSelect(e.Location, Scene.DIM_SEL, Scene.DIM_SEL, nSel) + Dim nId As Integer = EgtGetFirstObjInSelWin() + While nId <> GDB_ID.NULL + ' Recupero l'identificativo del pezzo cui appartiene + Dim nPartId As Integer = EgtGetParent(EgtGetParent(nId)) + Dim bFound As Boolean = False + If EgtIsPart(nPartId) Then bFound = True + If Not bFound Then + nId = EgtGetNextObjInSelWin() + Continue While + End If + Dim nStat As Integer = GDB_ST.ON_ + EgtGetStatus(nPartId, nStat) + ' Se già selezionato + If nStat = GDB_ST.SEL Then + ' Memorizzo Id da deselezionare + m_nIdToDesel = nPartId + Else + ' Memorizzo Id da selezionare + m_nIdToSel = nPartId + End If + Exit While + nId = EgtGetNextObjInSelWin() + End While + ' Dati per drag + m_bDragToStart = True + End Sub + + Friend Sub Basic_OnMouseMoveScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) + ' Se drag non abilitato o già in esecuzione, esco + If Not m_bDragToStart Then Return + ' Se primo movimento di drag, verifico di aver superato la soglia di movimento in pixel + If m_bDragToStart Then + If Math.Abs(e.Location.X - m_locPrev.X) < m_nRestRadius And + Math.Abs(e.Location.Y - m_locPrev.Y) < m_nRestRadius Then + Return + End If + m_bDragToStart = False + End If + End Sub + + Friend Sub Basic_OnMouseUpScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) + ' Se eseguito drag + If Not m_bDragToStart Then + ' Se selezione da eseguire + ElseIf m_nIdToSel <> GDB_ID.NULL Then + ' Se pezzo da selezionare non è già selezionato + 'If EgtIsSelectedObj(m_nIdToSel) Then + ' Eseguo la selezione + EgtDeselectAll() + EgtSelectPartObjs(m_nIdToSel) + 'EgtSelectObj(m_nIdToSel) + 'EgtSetMark(m_nIdToSel) + 'End If + 'If IsNothing(Map.refProjectVM.BTLStructureVM.SelBTLPart) OrElse Map.refProjectVM.BTLStructureVM.SelBTLPart.nPartId <> m_nIdToSel Then + ' ' Eseguo la selezione + ' For Each BTLPart In Map.refProjectVM.BTLStructureVM.BTLPartVMList + ' If BTLPart.nPartId = m_nIdToSel Then + ' BTLPart.SetIsSelected(True) + ' ElseIf BTLPart.IsSelected Then + ' BTLPart.SetIsSelected(False) + ' End If + ' Next + ' End If + End If + ' Reset + m_bDrag = False + m_nIdToSel = GDB_ID.NULL + m_nIdToDesel = GDB_ID.NULL + EgtDraw() + End Sub + +#End Region ' Part + +End Class diff --git a/3dPrintApp/SceneHost/SceneHostV.xaml b/3dPrintApp/SceneHost/SceneHostV.xaml new file mode 100644 index 0000000..22e5547 --- /dev/null +++ b/3dPrintApp/SceneHost/SceneHostV.xaml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/3dPrintApp/SceneHost/SceneHostV.xaml.vb b/3dPrintApp/SceneHost/SceneHostV.xaml.vb new file mode 100644 index 0000000..259a9a2 --- /dev/null +++ b/3dPrintApp/SceneHost/SceneHostV.xaml.vb @@ -0,0 +1,33 @@ +Imports System.Windows.Interop +Imports System.IO +Imports EgtUILib +Imports EgtWPFLib5 + +Public Class SceneHostV + + Private m_MySceneHostVM As MySceneHostVM + + Sub New() + ' This call is required by the designer. + InitializeComponent() + ' Assegno al riferimento locale al VM il VM preso dal DataContext + Me.DataContext = New MySceneHostVM + m_MySceneHostVM = DirectCast(Me.DataContext, MySceneHostVM) + m_MySceneHostVM.SetMainScene(MainScene) + End Sub + + Private Sub MainScene_GotFocus() Handles MainScene.GotFocus + m_MySceneHostVM.SetIsFocused(True) + EgtOutLog("MainScene_GotFocus") + ' Map.refSecondaryWindowV.Topmost = True + 'Map.refSecondaryWindowVM.SetVisibility(True) + End Sub + + Private Sub MainScene_LostFocus() Handles MainScene.LostFocus + m_MySceneHostVM.SetIsFocused(False) + EgtOutLog("MainScene_LostFocus") + ' Map.refSecondaryWindowV.Topmost = False + 'Map.refSecondaryWindowVM.SetVisibility(False) + End Sub + +End Class diff --git a/3dPrintApp/SecondaryWindow/SecondaryWindowV.xaml b/3dPrintApp/SecondaryWindow/SecondaryWindowV.xaml new file mode 100644 index 0000000..d9c5d4b --- /dev/null +++ b/3dPrintApp/SecondaryWindow/SecondaryWindowV.xaml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + diff --git a/3dPrintApp/SecondaryWindow/SecondaryWindowV.xaml.vb b/3dPrintApp/SecondaryWindow/SecondaryWindowV.xaml.vb new file mode 100644 index 0000000..47bec95 --- /dev/null +++ b/3dPrintApp/SecondaryWindow/SecondaryWindowV.xaml.vb @@ -0,0 +1,65 @@ +Imports EgtWPFLib5 +Imports EgtUILib + +Public Class SecondaryWindowV + + Private m_SecondaryWindowVM As SecondaryWindowVM + +#Region "CONSTRUCTOR" + + Sub New(Owner As Window) + ' Funzione che interpreta l'xaml + InitializeComponent() + m_SecondaryWindowVM = New SecondaryWindowVM + Me.DataContext = m_SecondaryWindowVM + Map.SetRefSecondaryWindowV(Me) + AddHandler Me.ContentRendered, AddressOf SecondaryWindowV_ContentRendered + AddHandler Me.Loaded, AddressOf SecondaryWindowV_Loaded + AddHandler Me.Closing, AddressOf SecondaryWindowV_Closing + AddHandler Me.LocationChanged, AddressOf SecondaryWindowV_LocationChanged + AddHandler Me.SizeChanged, AddressOf SecondaryWindowV_SizeChanged + AddHandler Me.StateChanged, AddressOf SecondaryWindowV_StateChanged + End Sub + + Private Sub SecondaryWindowV_ContentRendered(sender As Object, e As EventArgs) + m_SecondaryWindowVM.ContentRendered() + End Sub + + Private Sub SecondaryWindowV_Loaded(sender As Object, e As RoutedEventArgs) + ' Carico e imposto posizione finestra + WinPosFromIniToWindow(S_GENERAL, K_WINPLACE, Me) + End Sub + + Private Sub SecondaryWindowV_Closing(sender As Object, e As System.ComponentModel.CancelEventArgs) + If (Keyboard.Modifiers And ModifierKeys.Alt) = ModifierKeys.Alt OrElse Keyboard.IsKeyDown(Key.F4) Then + e.Cancel = True + Return + End If + ' Salvo posizione finestra (se non minimizzata) + If WindowState <> WindowState.Minimized Then + WinPosFromWindowToIni(Me, S_GENERAL, K_WINPLACE) + End If + End Sub + + Private Sub SecondaryWindowV_LocationChanged(sender As Object, e As EventArgs) + Application.Current.MainWindow.Top = Me.Top + Application.Current.MainWindow.Left = Me.Left + End Sub + + Private Sub SecondaryWindowV_SizeChanged(sender As Object, e As SizeChangedEventArgs) + If Not IsNothing(Application.Current.MainWindow) Then + If e.WidthChanged Then Application.Current.MainWindow.Width = e.NewSize.Width + If e.HeightChanged Then Application.Current.MainWindow.Height = e.NewSize.Height + Application.Current.MainWindow.InvalidateVisual() + End If + End Sub + + Private Sub SecondaryWindowV_StateChanged(sender As Object, e As EventArgs) + Application.Current.MainWindow.WindowState = Me.WindowState + Application.Current.MainWindow.Topmost = True + Application.Current.MainWindow.Topmost = False + End Sub + +#End Region ' CONSTRUCTOR + +End Class diff --git a/3dPrintApp/SecondaryWindow/SecondaryWindowVM.vb b/3dPrintApp/SecondaryWindow/SecondaryWindowVM.vb new file mode 100644 index 0000000..a3eda04 --- /dev/null +++ b/3dPrintApp/SecondaryWindow/SecondaryWindowVM.vb @@ -0,0 +1,71 @@ +Imports EgtWPFLib5 +Imports EgtUILib + +Public Class SecondaryWindowVM + Inherits VMBase + + Private m_Visibility As Boolean + Public Property Visibility As Visibility + Get + Return If(m_Visibility, Visibility.Visible, Visibility.Collapsed) + End Get + Set(value As Visibility) + m_Visibility = (value = Visibility.Visible) + End Set + End Property + + Friend Sub SetVisibility(bValue As Boolean) + If bValue <> m_Visibility Then + m_Visibility = bValue + NotifyPropertyChanged(NameOf(Visibility)) + End If + End Sub + + ' definizione comandi + Private m_cmdAboutBox As ICommand + Private m_cmdCloseApplication As ICommand + +#Region "CONSTRUCTOR" + + Sub New() + ' Creo riferimento a questa classe in Map + Map.SetRefSecondaryWindowVM(Me) + End Sub + +#End Region ' CONSTRUCTOR + + Friend Sub ContentRendered() + ' Seleziono la macchina impostata nel file ini + Map.refMachinePanelVM.LoadCurrentMachine() + ' imposto SnapPoint + Map.refMyStatusBarVM.SetSnapPointType(Map.refSceneHostVM.SnapType) + Map.refMyStatusBarVM.SetMeasureUnit(EgtUiUnitsAreMM) + EgtSetView(VT.ISO_SW, False) + ' creo nuovo progetto di partenza + Map.refProjManagerVM.NewProject() + End Sub + +#Region "COMMANDS" + +#Region "CloseApplicationCommand" + + ' Returns a command that manage the MainWindow_Unloaded command + Public ReadOnly Property CloseApplicationCommand() As ICommand + Get + If m_cmdCloseApplication Is Nothing Then + m_cmdCloseApplication = New Command(AddressOf CloseApplication) + End If + Return m_cmdCloseApplication + End Get + End Property + + ' Manage the MainWindow_Unloaded event. This method is invoked by the cmdMainWindow_Unloaded. + Public Sub CloseApplication(ByVal param As Object) + Map.refMainWindowVM.CloseApplication() + End Sub + +#End Region ' CloseApplicationCommand + +#End Region ' COMMANDS + +End Class diff --git a/3dPrintApp/ShowPanel/ShowPanelV.xaml b/3dPrintApp/ShowPanel/ShowPanelV.xaml new file mode 100644 index 0000000..73a49e0 --- /dev/null +++ b/3dPrintApp/ShowPanel/ShowPanelV.xaml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + diff --git a/3dPrintApp/ShowPanel/ShowPanelV.xaml.vb b/3dPrintApp/ShowPanel/ShowPanelV.xaml.vb new file mode 100644 index 0000000..9840677 --- /dev/null +++ b/3dPrintApp/ShowPanel/ShowPanelV.xaml.vb @@ -0,0 +1,3 @@ +Public Class ShowPanelV + +End Class diff --git a/3dPrintApp/Special-3dPrinting/Printing3DPanelV.xaml b/3dPrintApp/Special-3dPrinting/Printing3DPanelV.xaml new file mode 100644 index 0000000..7cffe68 --- /dev/null +++ b/3dPrintApp/Special-3dPrinting/Printing3DPanelV.xaml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/3dPrintApp/Special-3dPrinting/Printing3DPanelV.xaml.vb b/3dPrintApp/Special-3dPrinting/Printing3DPanelV.xaml.vb new file mode 100644 index 0000000..f216a8c --- /dev/null +++ b/3dPrintApp/Special-3dPrinting/Printing3DPanelV.xaml.vb @@ -0,0 +1,3 @@ +Public Class Printing3DPanelV + +End Class diff --git a/3dPrintApp/Special-3dPrinting/Printing3DPanelVM.vb b/3dPrintApp/Special-3dPrinting/Printing3DPanelVM.vb new file mode 100644 index 0000000..08b72d6 --- /dev/null +++ b/3dPrintApp/Special-3dPrinting/Printing3DPanelVM.vb @@ -0,0 +1,108 @@ +Imports System.IO +Imports EgtUILib +Imports EgtWPFLib5 + +Public Class Printing3DPanelVM + + Private m_ButtonList As New List(Of ButtonItem) + Public ReadOnly Property ButtonList As List(Of ButtonItem) + Get + Return m_ButtonList + End Get + End Property + + Sub New() + ' Inizializzo i bottoni leggendoli da file ini + Dim BtnIndex As Integer = 1 + Dim CurrBtn As ButtonItem = Nothing + While GetPrivateProfileButton(S_PRINTING3D, K_BUTTON & BtnIndex, Map.refMainWindowVM.MainWindowM.s3dPrintingDir, CurrBtn) + m_ButtonList.Add(CurrBtn) + BtnIndex += 1 + End While + End Sub + +End Class + +Public Class ButtonItem + Inherits VMBase + + Private m_sImagePath As String + Public ReadOnly Property ImagePath As String + Get + Return m_sImagePath + End Get + End Property + Private m_sLuaCmdPath As String + Private m_sToolTip As String + Public ReadOnly Property ToolTip As String + Get + Return m_sToolTip + End Get + End Property + Private m_nDrawMachOrBoth As Integer + Public ReadOnly Property nDrawMachOrBoth As Integer + Get + Return m_nDrawMachOrBoth + End Get + End Property + Friend m_Btn_Visibility As Visibility + Public ReadOnly Property Btn_Visibility As Visibility + Get + Return m_Btn_Visibility + End Get + End Property + + Friend m_Btn_IsEnabled As Boolean = True + Public ReadOnly Property Btn_IsEnabled As Boolean + Get + Return m_Btn_IsEnabled + End Get + End Property + + ' Definizione comandi + Private m_cmdLuaExec As ICommand + + Sub New(sLuaCmdPath As String, sImagePath As String, sToolTip As String, sDrawMachOrBoth As String) + If File.Exists(sImagePath) Then + m_sImagePath = sImagePath + Else + m_sImagePath = Map.refMainWindowVM.MainWindowM.sResourcesRoot & "\" & sImagePath + End If + m_sLuaCmdPath = sLuaCmdPath + m_sToolTip = sToolTip + If Not Integer.TryParse(sDrawMachOrBoth, m_nDrawMachOrBoth) Then m_nDrawMachOrBoth = 0 + End Sub + +#Region "COMMANDS" + +#Region "LuaExecCommand" + + ''' + ''' Returns a command that do New. + ''' + Public ReadOnly Property LuaExecCommand As ICommand + Get + If m_cmdLuaExec Is Nothing Then + m_cmdLuaExec = New Command(AddressOf LuaExec) + End If + Return m_cmdLuaExec + End Get + End Property + + ''' + ''' Execute the New. This method is invoked by the NewCommand. + ''' + Public Sub LuaExec(ByVal param As Object) + If String.IsNullOrWhiteSpace(m_sLuaCmdPath) Then Return + If Not File.Exists(m_sLuaCmdPath) Then Return + If Not Path.GetExtension(m_sLuaCmdPath).ToLower = ".lua" Then Return + ' eseguo file Lua + Map.refSceneHostVM.PreExecScript(False) + Map.refSceneHostVM.ExecScript(m_sLuaCmdPath) + End Sub + +#End Region ' LuaExecCommand + +#End Region ' Commands + +End Class \ No newline at end of file diff --git a/3dPrintApp/Special-3dPrinting/Printing3DUtility.vb b/3dPrintApp/Special-3dPrinting/Printing3DUtility.vb new file mode 100644 index 0000000..bb3bd08 --- /dev/null +++ b/3dPrintApp/Special-3dPrinting/Printing3DUtility.vb @@ -0,0 +1,26 @@ +Imports EgtWPFLib5 + +Module Printing3DUtility + + Public Function GetPrivateProfileButton(sSection As String, sKey As String, sBaseDir As String, ByRef ReadedButtonItem As ButtonItem) As Boolean + ReadedButtonItem = Nothing + Dim sVal As String = String.Empty + GetmainPrivateProfileString(sSection, sKey, "", sVal) + If String.IsNullOrWhiteSpace(sVal) Then Return False + Dim sItems() As String = sVal.Split(",".ToCharArray) + If sItems.Count() >= 1 Then + Dim sLuaPath As String = sItems(0) + Dim sImagePath As String = If(sItems.Count() >= 2, sItems(1), "") + Dim sToolTip As String = If(sItems.Count() >= 3, sItems(2), "") + Dim sDrawMachOrBoth As String = If(sItems.Count() >= 4 AndAlso Not String.IsNullOrWhiteSpace(sItems(3)), sItems(3), "1") + If Not String.IsNullOrWhiteSpace(sBaseDir) And Not String.IsNullOrWhiteSpace(sLuaPath) Then + If sLuaPath.Contains(".lua") Then sLuaPath = sBaseDir & "\" & sLuaPath + If Not String.IsNullOrWhiteSpace(sImagePath) Then sImagePath = sBaseDir & "\" & sImagePath + End If + ReadedButtonItem = New ButtonItem(sLuaPath, sImagePath, sToolTip, sDrawMachOrBoth) + Return True + End If + Return False + End Function + +End Module diff --git a/3dPrintApp/StatusBar/MyStatusBarVM.vb b/3dPrintApp/StatusBar/MyStatusBarVM.vb new file mode 100644 index 0000000..4524b04 --- /dev/null +++ b/3dPrintApp/StatusBar/MyStatusBarVM.vb @@ -0,0 +1,142 @@ +Imports System.Runtime.InteropServices +Imports System.Threading +Imports EgtUILib +Imports EgtWPFLib5 + +Public Class MyStatusBarVM + Inherits EgtWPFLib5.StatusBarVM + + ' Funzioni di callback per output in interfaccia da LUA + Private m_ProcEventsCallback As New ProcessEventsCallback(AddressOf ProcessEvents) + Private m_OutTextCallback As New OutTextCallback(AddressOf OutText) + + Private m_bStopProgress As Boolean + Friend ReadOnly Property bStopProgress As Boolean + Get + Return m_bStopProgress + End Get + End Property + + 'Public ReadOnly Property CurrMachine As String + ' Get + ' Return If(Not IsNothing(Map.refMachinePanelVM.SelectedMachine), Map.refMachinePanelVM.SelectedMachine.Name, "") + ' End Get + 'End Property + + ' Definizione comandi + Private m_cmdStopProgress As ICommand + + Sub New() + ' Creo riferimento a questa classe in Map + Map.SetRefMyStatusBarVM(Me) + ' Installo funzione gestione eventi per lua + EgtSetProcessEvents(m_ProcEventsCallback) + ' Installo funzione output testo su status per lua + EgtSetOutText(m_OutTextCallback) + End Sub + + Friend Overloads Sub SetSnapPointType(sSnapPntType As SP) + Dim BtnColor As Brush + BtnColor = New SolidColorBrush(SystemColors.ControlColor) + Select Case sSnapPntType + Case SP.PT_SKETCH + Map.refMyStatusBarVM.SetSnapPointType(EgtMsg(1102), BtnColor) 'Sketch Point + Case SP.PT_GRID + Map.refMyStatusBarVM.SetSnapPointType(EgtMsg(1104), BtnColor) 'Grid Point + Case SP.PT_END + Map.refMyStatusBarVM.SetSnapPointType(EgtMsg(1106), BtnColor) 'End Point + Case SP.PT_MID + Map.refMyStatusBarVM.SetSnapPointType(EgtMsg(1108), BtnColor) 'Mid Point + Case SP.CENTER + Map.refMyStatusBarVM.SetSnapPointType(EgtMsg(1110), BtnColor) 'Center + Case SP.CENTROID + Map.refMyStatusBarVM.SetSnapPointType(EgtMsg(1112), BtnColor) 'Centroid + Case SP.PT_NEAR + Map.refMyStatusBarVM.SetSnapPointType(EgtMsg(1114), BtnColor) 'Near Point + Case SP.PT_INTERS + Map.refMyStatusBarVM.SetSnapPointType(EgtMsg(1116), BtnColor) 'Inters Point + Case SP.PT_TANGENT + Map.refMyStatusBarVM.SetSnapPointType(EgtMsg(1118), BtnColor) 'Tang Point + Case SP.PT_PERPENDICULAR + Map.refMyStatusBarVM.SetSnapPointType(EgtMsg(1120), BtnColor) 'Perp Point + Case SP.PT_MINDIST + Map.refMyStatusBarVM.SetSnapPointType(EgtMsg(1122), BtnColor) 'MinDist Point + Case Else + Map.refMyStatusBarVM.SetSnapPointType("---", BtnColor) + End Select + End Sub + + Friend Sub ResetStopProgress() + m_bStopProgress = False + End Sub + + Public Function OutText(ByRef psText As IntPtr) As Boolean + ' Assegno stringa + OutputMessage = (Marshal.PtrToStringUni(psText)) + ' Costringo ad aggiornare + UpdateUI() + Return True + End Function + + Private Function ProcessEvents(ByVal nProg As Integer, ByVal nPause As Integer) As Integer + ' Se previsto, imposto progress + If nProg > 0 Then SetLoadingProgress(Math.Min(nProg, 100)) + ' Costringo ad aggiornare + UpdateUI() + ' Eventuale attesa + Thread.Sleep(nPause) + ' Ritorno eventuale stop + If m_bStopProgress Then + m_bStopProgress = False + Return 1 + Else + Return 0 + End If + End Function + + Friend Sub StartLoading(sMessage As String, bIsStop As Boolean) + Map.refMyStatusBarVM.SetLoadingProgress_Visibility(True) + Map.refMyStatusBarVM.SetStopProgress_IsActive(bIsStop) + Map.refMyStatusBarVM.SetStopProgress_IsEnabled(bIsStop) + Map.refMyStatusBarVM.SetOutputMessage(sMessage) + End Sub + + Friend Sub EndLoading(sMessage As String, Optional nMessageTime As Integer = 3) + Map.refMyStatusBarVM.SetLoadingProgress_Visibility(False) + Map.refMyStatusBarVM.SetStopProgress_IsActive(False) + Map.refMyStatusBarVM.SetStopProgress_IsEnabled(False) + Map.refMyStatusBarVM.SetOutputMessage(sMessage, nMessageTime) + End Sub + + Friend Sub RefreshMachName() + ' NotifyPropertyChanged(NameOf(CurrMachine)) + End Sub + +#Region "COMMANDS" + +#Region "StopProgress" + + ''' + ''' Returns a command that do Exec. + ''' + Public ReadOnly Property StopProgress_Command As ICommand + Get + If m_cmdStopProgress Is Nothing Then + m_cmdStopProgress = New Command(AddressOf StopProgress) + End If + Return m_cmdStopProgress + End Get + End Property + + ''' + ''' Execute the Exec. This method is invoked by the ExecCommand. + ''' + Public Sub StopProgress() + m_bStopProgress = True + End Sub + +#End Region ' StopProgress + +#End Region ' COMMANDS + +End Class diff --git a/3dPrintApp/StatusBar/StatusBarV.xaml b/3dPrintApp/StatusBar/StatusBarV.xaml new file mode 100644 index 0000000..a6a1bf3 --- /dev/null +++ b/3dPrintApp/StatusBar/StatusBarV.xaml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3dPrintApp/ViewPanel/ViewPanelV.xaml.vb b/3dPrintApp/ViewPanel/ViewPanelV.xaml.vb new file mode 100644 index 0000000..d9dd0b2 --- /dev/null +++ b/3dPrintApp/ViewPanel/ViewPanelV.xaml.vb @@ -0,0 +1,3 @@ +Public Class ViewPanelV + +End Class diff --git a/3dPrintApp/ViewPanel/ViewPanelVM.vb b/3dPrintApp/ViewPanel/ViewPanelVM.vb new file mode 100644 index 0000000..7f7c3d1 --- /dev/null +++ b/3dPrintApp/ViewPanel/ViewPanelVM.vb @@ -0,0 +1,231 @@ +Imports EgtUILib +Imports EgtWPFLib5 + +Public Class ViewPanelVM + Inherits vmbase + +#Region "FIELDS & PROPERTIES" + + ' Definizione comandi + Private m_cmdZoomAll As ICommand + Private m_cmdTopView As ICommand + Private m_cmdFrontView As ICommand + Private m_cmdLeftView As ICommand + Private m_cmdBackView As ICommand + Private m_cmdRightView As ICommand + Private m_cmdIsoViewSW As ICommand + +#Region "ToolTip" + + Public ReadOnly Property ZoomAllToolTip As String + Get + Return EgtMsg(MSG_GRIDVIEWPANEL + 4) + End Get + End Property + + Public ReadOnly Property LookFromTopToolTip As String + Get + Return EgtMsg(MSG_GRIDVIEWPANEL + 7) + End Get + End Property + + Public ReadOnly Property LookFromFrontToolTip As String + Get + Return EgtMsg(MSG_GRIDVIEWPANEL + 8) + End Get + End Property + + Public ReadOnly Property LookFromLeftToolTip As String + Get + Return EgtMsg(MSG_GRIDVIEWPANEL + 9) + End Get + End Property + + Public ReadOnly Property LookFromBackToolTip As String + Get + Return EgtMsg(MSG_GRIDVIEWPANEL + 10) + End Get + End Property + + Public ReadOnly Property LookFromRightToolTip As String + Get + Return EgtMsg(MSG_GRIDVIEWPANEL + 11) + End Get + End Property + + Public ReadOnly Property LookFromIso_SWToolTip As String + Get + Return EgtMsg(MSG_GRIDVIEWPANEL + 12) + End Get + End Property + +#End Region ' ToolTip + +#End Region ' FIELDS & PROPERTIES + +#Region "COMMANDS" + +#Region "ZoomAllCommand" + + ''' + ''' Returns a command that do ZoomAll. + ''' + Public ReadOnly Property ZoomAllCommand As ICommand + Get + If m_cmdZoomAll Is Nothing Then + m_cmdZoomAll = New Command(AddressOf ZoomAll) + End If + Return m_cmdZoomAll + End Get + End Property + + ''' + ''' Execute the ZoomAll. This method is invoked by the ZoomAllCommand. + ''' + Public Sub ZoomAll(ByVal param As Object) + Map.refSceneHostVM.MainScene.ZoomAll() + End Sub + +#End Region ' ZoomAllCommand + +#Region "TopViewCommand" + + ''' + ''' Returns a command that do TopView. + ''' + Public ReadOnly Property TopViewCommand As ICommand + Get + If m_cmdTopView Is Nothing Then + m_cmdTopView = New Command(AddressOf TopView) + End If + Return m_cmdTopView + End Get + End Property + + ''' + ''' Execute the TopView. This method is invoked by the TopViewCommand. + ''' + Public Sub TopView(ByVal param As Object) + Map.refSceneHostVM.MainScene.TopView() + End Sub + +#End Region ' TopViewCommand + +#Region "FrontViewCommand" + + ''' + ''' Returns a command that do FrontView. + ''' + Public ReadOnly Property FrontViewCommand As ICommand + Get + If m_cmdFrontView Is Nothing Then + m_cmdFrontView = New Command(AddressOf FrontView) + End If + Return m_cmdFrontView + End Get + End Property + + ''' + ''' Execute the FrontView. This method is invoked by the FrontViewCommand. + ''' + Public Sub FrontView(ByVal param As Object) + Map.refSceneHostVM.MainScene.FrontView() + End Sub + +#End Region ' FrontViewCommand + +#Region "LeftViewCommand" + + ''' + ''' Returns a command that do LeftView. + ''' + Public ReadOnly Property LeftViewCommand As ICommand + Get + If m_cmdLeftView Is Nothing Then + m_cmdLeftView = New Command(AddressOf LeftView) + End If + Return m_cmdLeftView + End Get + End Property + + ''' + ''' Execute the LeftView. This method is invoked by the LeftViewCommand. + ''' + Public Sub LeftView(ByVal param As Object) + Map.refSceneHostVM.MainScene.LeftView() + End Sub + +#End Region ' LeftViewCommand + +#Region "BackViewCommand" + + ''' + ''' Returns a command that do BackView. + ''' + Public ReadOnly Property BackViewCommand As ICommand + Get + If m_cmdBackView Is Nothing Then + m_cmdBackView = New Command(AddressOf BackView) + End If + Return m_cmdBackView + End Get + End Property + + ''' + ''' Execute the BackView. This method is invoked by the BackViewCommand. + ''' + Public Sub BackView(ByVal param As Object) + Map.refSceneHostVM.MainScene.BackView() + End Sub + +#End Region ' BackViewCommand + +#Region "RightViewCommand" + + ''' + ''' Returns a command that do RightView. + ''' + Public ReadOnly Property RightViewCommand As ICommand + Get + If m_cmdRightView Is Nothing Then + m_cmdRightView = New Command(AddressOf RightView) + End If + Return m_cmdRightView + End Get + End Property + + ''' + ''' Execute the RightView. This method is invoked by the RightViewCommand. + ''' + Public Sub RightView(ByVal param As Object) + Map.refSceneHostVM.MainScene.RightView() + End Sub + +#End Region ' RightViewCommand + +#Region "IsoViewSWCommand" + + ''' + ''' Returns a command that do IsoViewSW. + ''' + Public ReadOnly Property IsoViewSWCommand As ICommand + Get + If m_cmdIsoViewSW Is Nothing Then + m_cmdIsoViewSW = New Command(AddressOf IsoViewSW) + End If + Return m_cmdIsoViewSW + End Get + End Property + + ''' + ''' Execute the IsoViewSW. This method is invoked by the IsoViewSWCommand. + ''' + Public Sub IsoViewSW(ByVal param As Object) + Map.refSceneHostVM.MainScene.IsoViewSW() + End Sub + +#End Region ' IsoViewSWCommand + +#End Region ' COMMANDS + +End Class \ No newline at end of file diff --git a/3dPrintApp/packages.config b/3dPrintApp/packages.config new file mode 100644 index 0000000..fdc9817 --- /dev/null +++ b/3dPrintApp/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file